=== DraftForge ===
Contributors: avakodeforge
Tags: content generation, ai content, blog automation, topic mining, stale content
Requires at least: 6.5
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.6.2
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

AI content automation — auto blog post generation, stale-content refresh, and topic mining from your existing posts.

== Description ==

DraftForge keeps your WordPress site fresh with AI-powered content automation. It mines topic gaps from your existing posts and taxonomies, generates complete blog post drafts, and detects stale content ready for an AI-powered refresh — all from a single, clean admin interface.

Nothing reaches your site unread. Five checks stand in front of publish: four of them measure a draft — its length, its internal links, whether it carries an image direction, how close it is to something you already published — and the fifth reads it, the way a person skims the first two sentences, and objects in words with the sentence quoted. And when the objection should come from a colleague rather than from code, an author can hand a queued draft to the editor who is allowed to say yes.

The AI work is paid for with the credits of your Avakode account: connect the account once on the Credits screen (no licence is needed) and buy credits on avakode.com when you need them.

The optional Pro add-on sells one thing: the autopilot — the same pipeline on a timer, publishing what passes the gate, with a weekly cap and a checkpoint that stop it on its own.

= Free features =

* **Topic Miner** — free heuristic mode scans your post titles, categories, and tags to surface content gaps, no API call needed
* **AI Topic Mining** — richer topic suggestions with fit scores and rationale (~2 credits per run via the Forge API)
* **Draft Generator** — produces a complete, structured blog post draft from any approved topic (~6 credits per post: 1 for the outline, 5 for the body)
* **Stale Content Detector** — finds published posts older than a configurable threshold and lists them as candidates for an AI refresh. A hint, not a queue: age on its own raises no maintenance task
* **Maintained collection** — pick the published posts you want kept current (up to 100), give each an owner and a next-review date. Everything below reads that list and nothing else
* **Allowed sources** — up to five URLs per tracked post that the post is maintained against. Read on a schedule and at most once every 12 hours each, http/https only, no redirect into a private address, a one-megabyte and fifteen-second limit, and the text cached so a change can be quoted. A source that cannot be read says which — unavailable, paywall, removed, or asks not to be read — and since when. Text from a source reaches the model as quoted data inside a fence, never as an instruction
* **Maintenance tasks** — a changed source, an arrived review date, or a decline report you paste in raises a task on the Queue tab with a brief: what changed, where that is known from, which blocks of the post mention something out of it (a word match, offered as possibly affected), and how many blocks it does not touch. Rewrite with AI, or say no change is needed
* **AI Refresh** — rewrites stale posts in place when the quality filter passes; otherwise lands them in the Queue tab for review, with the body it was handed kept alongside so the comparison is against what the model actually saw (~3 credits per post)
* **Queue** — review, approve, or dismiss AI-generated drafts and refreshes before publishing
* **Diff review** — a rewrite replaces a whole live article, so every pending refresh has a Review changes screen: the proposed text beside the original, block by block and word by word, with a Words / Links / Images / Headings / Blocks strip for the changes prose cannot show. Accept publishes exactly the text you read; Reject discards the rewrite and leaves the live post untouched. If the post was edited after the rewrite was proposed, the screen says so before you accept
* **Editorial calendar** — a month grid of everything you have planned, drawn in your own timezone and starting on the day your site starts its week. Drag a draft or a topic onto a day, or type the date into the field on the card; every move works from the keyboard as well as the mouse. Planning writes a date and nothing else
* **Publish on a date you chose** — hand a finished draft to WordPress for a morning next week and WordPress publishes it then, exactly as if you had set the date in the editor. A date that has already passed is refused rather than published on the spot, and taking a post back to a draft is one click
* **Quality Filter** — five checks stand between a generated draft and your live site: minimum word count, at least two internal links, an image direction, a similarity comparison against the posts you already have, and the slop lint on the next line. Anything that fails waits in the Queue tab; every threshold is filterable
* **AI-slop lint** — the fifth check, and the only one that reads rather than counts. A body can clear every threshold above and still open with "In today's fast-paced world", promise to delve into its own title, and repeat one sentence shape forty times. The lint answers with findings instead of a score: a bundled list of 132 stock phrases measured as a density per 1000 words, four kinds of repetition, an introduction that only restates the title, a rhythm too even to have been written by a person, dates and figures that cannot be true, and text laid out as a list where it should be prose. Every finding quotes the sentence and says what is wrong with it, in the Queue tab and on the refresh review screen. Three strictness settings — lenient, standard, strict — decide which findings stop a draft; the checks themselves always run at all three. Free, and it costs no credits: the credits already paid for the draft
* **Review roles** — the author generates, the editor approves. "Request review" moves a queued draft to whoever holds the new `draftforge_review_drafts` capability — Administrator and Editor by default, granted on activation and on every upgrade, and removed from every role when the plugin is deleted. They can approve and publish, approve as a draft, or send it back with a note; who asked and who decided is written on the row with the time, and a reviewer is e-mailed at most once an hour however many drafts arrive in it. The Queue screen and the request itself need `publish_posts`, so an Author reaches their own work and a Contributor never sees the site's drafts, their costs or their reports
* **Credit history** — a Credits tab showing what every AI call actually cost, month to date against your own ceiling, and the price list the plugin is working from. Includes the spend nothing else records: the outline of a draft that failed on its body
* **Monthly credit ceiling** — set a number of credits Draft Forge may spend per calendar month (UTC) and it refuses to go past it, before the request is made. 0 means no ceiling, which is the default. It is the same number with or without the Pro add-on
* **Settings** — configure brand voice, target audience, and target word count for every generated post
* **Brand voice** — the field is a box you fill in from memory, so Analyse my voice reads up to five posts you actually published (yours first, the site's newest if you have written fewer) and answers with the shape of your writing: tone, sentence length, person, the words that are yours and the ones that would read as somebody else. The summary is offered as a one-click replacement for the field and never applied behind your back, and the profile itself is folded into the voice every later outline and draft is written to (~2 credits per run)
* **WP-CLI** — `wp draftforge mine [--ai]`, `generate <topic-id> [--publish]`, `refresh <post-id> [--apply]`, `gate <post-id>`, `queue [--status=]` and `credits`. Every command prints what the run will cost before it spends, the ones that spend refuse to until you pass `--yes`, and a refusal exits non-zero so a script can read it
* **Suite handoffs** — a published post hands its focus keyword to Rank Forge when Rank Forge is installed (free, no API call). Handing published posts to Lang Forge for translation is a separate opt-in checkbox, off by default, because Lang Forge charges its own ~3 credits per extra language on top of the draft

DraftForge is part of the **Forge Suite**. Learn more at https://avakode.com.

== External services ==

Every outbound request this plugin makes is listed below, in full. Nothing is contacted when the plugin is activated, and nothing is contacted by opening its screens.

* **Sources you add yourself — the addresses you enter on the Collection screen.** A source is a web address you enter so that drafts can be written against material you chose — your own documentation, a changelog, a reference page. The plugin reads that address and stores the text. It sends a plain GET to the address you entered, identifying itself as `DraftForge/<version>; <your site address>` so the site you are reading can see who is asking; nothing else is transmitted, and the plugin never discovers or contacts an address on its own. It runs after you add or re-check a source, and thereafter on a daily rota of at most twenty-five sources a day (a source is read at most once every 12 hours); remove a source and it is never fetched again. There is no default address and the list starts empty. The page's own text comes back and is stored on your site. Whoever runs the address you entered receives the request and sees the network address it came from; their terms and privacy policy are theirs.


**The Forge API at https://api.avakode.com, when you press an AI button or connect your Avakode account:**

* **AI actions — `/ai/process`.** Writing an outline, a draft, a refresh, a voice profile or an AI topic list is done by a language model that our Cloudflare Worker at api.avakode.com calls for you; the Worker holds the model provider's key and deducts credits from your Forge Suite wallet, so the key never touches your WordPress install. Only when you click one of the AI buttons — Mine topics with AI, Generate draft, Refresh, Analyse voice — or, with the Draft Forge Pro add-on, on each run of its autopilot (see that add-on's readme). Never on activation and never on a visitor's page view; heuristic topic mining and every scan, lint and queue feature run on your own server and send nothing. Sends the name of the action, the product identifier `draftforge`, your licence key if you have one (a site connected to an Avakode account sends no key; its connection token goes in a request header instead), your site's address (for a connected site, the WordPress address named below, under Connecting your account) and the material the action needs: the topic you typed, the outline it produced, the title and text of the post being refreshed (and, when the refresh answers a maintenance task for a source that changed, the lines added to that source, each with the source's name, web address and the date it was read), the titles and text of the posts a voice profile is read from, or, for Mine topics with AI, the post numbers, titles, categories and tags of up to eighty of your latest published posts; and, where the prompt of the action uses them, the brand voice, the audience and the target length you saved. No visitor data and no customer data beyond that. api.avakode.com does not write the text itself: it passes that material on to OpenAI, through Cloudflare AI Gateway, to produce it; your licence key is not passed on. OpenAI's terms: https://openai.com/policies/terms-of-use/ — OpenAI's privacy policy: https://openai.com/policies/privacy-policy/; Cloudflare's terms: https://www.cloudflare.com/website-terms/ — Cloudflare's privacy policy: https://www.cloudflare.com/privacypolicy/. The generated text and the credit cost of the call come back.
* **Connecting your account — `/auth/connect/init`.** Only when an administrator presses "Connect Avakode account" on the Credits screen. Sends the product identifier `draftforge`, your site's address (the WordPress address of Settings → General), the address of the Credits screen to return to (it carries a one-time security code of your WordPress session) and the word `credits`, which says the connection is for credits and not for a licence. An address on avakode.com comes back and your browser is sent to it; you sign in there and approve this site. Never on activation and never on a page view.
* **Finishing the connection — `/auth/exchange`.** Once, when your browser comes back from avakode.com after you approved the site. Sends the one-time code avakode.com gave your browser and your site's address (the same WordPress address). The connection token, the e-mail address of your Avakode account, the number of the connection and the credits left come back. Four things are kept in your site's database: the token (encrypted), the account's e-mail address (it is shown on the Credits card), the number of the connection and the time it was made. The credits left are not kept. For two minutes after you connect or disconnect, a short note of how it went is kept too; nothing else is stored.
* **Credits left — `/ai/usage`.** When an administrator opens the Credits screen of a site that is connected to an Avakode account, not before. A plain GET that carries the connection token in a request header (never in the address), your site's address (the same WordPress address) and the product identifier `draftforge`; the number of credits left on the account comes back and is shown on the card. If the request fails the card shows a dash.
* **Disconnecting — `/auth/credits-connection/revoke`.** Only when an administrator presses "Disconnect" on the Credits screen. Sends the connection token in a request header and nothing else; the connection stops working. If Avakode cannot be reached, the token is deleted from your site anyway.
* **Credit price list — `/credits/pricing`.** The Worker decides what an action costs; without asking it, every screen would quote the prices that were typed into the plugin on release day, which drift. A plain GET with no body: no site identifier, no licence key, no personal data, and its own User-Agent (`DraftForge/<version>`) instead of WordPress's default one, which would put your site's address in it. A list of credits per action comes back. Only after you have started using the metered features — that is, after you connect this site to an Avakode account, or after a credit has actually been charged here (or when a site sets the option `draftforge_price_sync_optin` to `yes`). Until then this request is not made and not scheduled, and the screens quote the prices shipped with the plugin, labelled as such. Once it applies, it runs from a background job, never while a page is being drawn, and the answer is kept for twelve hours (an hour when the server did not answer).
* **Health check — `/health`.** Only when an administrator presses "Run diagnostics" in Setup & Health on the Forge Suite screen, or a repair button next to it, which runs the diagnostics again. It asks https://api.avakode.com/health whether the service is up: an ordinary GET with no body, no licence key and nothing about your site in the request itself. It sends its own User-Agent (`ForgeSuite/health-check`) instead of WordPress's default one, so neither your WordPress version nor your site's address is in it. As with any HTTP request, our server also sees the network address it came from.
* **Feedback card — `/feedback`.** The card appears in the admin footer of the Forge screens, to administrators only, not before the plugin has been installed for thirty days, at most once every sixty days for each administrator, and not for fourteen days after you dismiss it. Pressing "Send feedback" posts your 0–10 score, whatever you typed in the comment box, which product's screen the card was shown on, and the plugin and WordPress version numbers. No licence key, e-mail address or content of yours is sent, and pressing "Not now" sends nothing at all. The request has no User-Agent of its own, so it carries WordPress's default one, which names your WordPress version and your site's address.

The Draft Forge Pro add-on is a separate plugin and makes requests of its own, listed in its readme.

**Terms and privacy for the Forge API.** Terms of Service: https://avakode.com/terms — Privacy Policy: https://avakode.com/privacy

The plugin contains no analytics and no telemetry.

== Installation ==

1. Upload the `draftforge` folder to `/wp-content/plugins/`, or install through Plugins → Add New.
2. Activate DraftForge through the Plugins menu.
3. Open DraftForge → Topics and run the Topic Miner to find your first content gaps.
4. Click **Generate draft** on any topic to produce your first AI post.
5. Visit DraftForge → Settings to set your brand voice and generation defaults.

== Pro add-on ==

The separate Draft Forge Pro add-on adds the autopilot, and only the autopilot:

* Scheduled generation — up to ten new drafts and ten refreshes per run, at the frequency you choose. The queue it drains is the Topics tab you already have; Pro is what empties it without you.
* Automatic publishing of drafts that pass the quality gate
* A weekly publishing cap — three new posts in any rolling seven days by default, settable from 1 to 14 — that an automatic run never exceeds, however many posts per run you asked for. The extra topics are still drafted and still queued; they simply do not go live that week.
* A publication checkpoint — after every tenth hands-off publication by default — that pauses new posts going live until you confirm on the Schedule tab. Drafting, refreshes to posts already live and topic mining all carry on through the pause, and one e-mail goes out when it engages rather than one a day while it holds.
* Neither brake applies to a draft you generate by hand from the Queue tab. That is your decision, not the autopilot's, so it is neither counted nor refused.
* A draft still waiting on a review is never published by an automatic run.

A Pro licence also includes priority email support while it is active. It ends when the licence expires and comes back on renewal.

The AI work itself stays in this free plugin and is metered by Forge credits. We do not charge a subscription for a model call the credits already paid for.

== Uninstalling ==

Deleting Draft Forge leaves your data alone by default: mined topics, the draft queue and the notes on generated posts all survive, so removing the plugin to try something else does not cost you the pipeline you built. Until 1.1.0 this was the other way round — everything went unless a developer knew about an option the interface never mentioned.

If you do want a clean slate, tick **Delete Draft Forge data when the plugin is deleted** in Draft Forge → Settings before deleting. Either way the scheduled run is unscheduled, so WordPress stops waking the site for a job that no longer exists.

When the last Forge plugin or add-on on a site is deleted, everything Forge stored on the site is removed, on every site of a network: the statistics settings and the install ID, the shared job queue with its scheduled events, and the other settings and caches the Forge plugins share. While another Forge product stays, only this plugin's own share goes. The paragraphs above are about this plugin's own content.

== Frequently Asked Questions ==

= Do I need an account or API key for the free version? =

Free heuristic topic mining requires no account.
AI features (topic mining with AI, draft generation, refresh) are paid for with the credits of an Avakode account, and no licence is needed. Press "Connect Avakode account" on the Credits screen, sign in at avakode.com and approve this site. Credits are bought on avakode.com; none are given away, and until an account is connected the AI buttons answer "Connect your Avakode account to use AI credits" and send nothing.

= What is in the Pro add-on? =

The schedule. Drafting, refreshing and topic mining all work here, on the free plugin, paid for with credits. Pro is for running that pipeline without you — on a timer, in bulk, and optionally publishing what passes the gate. It also carries the two brakes on that: a weekly publishing cap and a checkpoint that pauses hands-off publishing until you confirm. A Pro licence also includes priority email support while it is active.

= Who is allowed to approve a draft? =

Whoever you gave the capability to. `draftforge_review_drafts` goes to Administrator and Editor when the plugin is activated and again on every upgrade, and to nobody else; it is removed from every role if you delete the plugin. An author with `publish_posts` can open the Queue tab and press "Request review" on their own draft, and the holder of the capability answers it — approve and publish, approve as a draft, or send it back with a note. Both ends are written on the row with the name and the time.

A Contributor is deliberately left out. The Queue tab carries every draft on the site with its cost and its quality report, and a Contributor who could reach it could also push somebody else's draft into review and e-mail every editor on the site about it.

= What stops the add-on publishing all day? =

Four separate things, and they fail in different directions. The quality gate holds anything that does not pass. The weekly cap publishes at most three new posts in any rolling seven days by default, whatever you set per run. The checkpoint pauses new posts going live after every tenth hands-off publication until you confirm — drafting and refreshes carry on meanwhile. And the monthly credit ceiling you set yourself refuses the model call before it is made; the add-on can neither raise nor lower it.

= Will it write in my voice? =

If you tell it how you sound, or let it read. The Brand voice field on the Settings screen is yours to fill in. "Analyse my voice" instead reads up to five posts you actually published — yours first, the site's newest if you have written fewer — and answers with your tone, sentence length, person, and the words that would read as somebody else. The summary is offered for the field with one click and never applied behind your back, and once you keep it, it is folded into the voice every later outline and draft is written to (~2 credits per run).

= Can I drive it from a script? =

Yes: `wp draftforge mine`, `generate`, `refresh`, `gate`, `queue` and `credits`. A terminal is the easiest place to spend by accident — no button, no price on it, no second click — so every command prints what the run will cost before it runs, the ones that spend refuse to without `--yes`, and every refusal exits non-zero. `gate` is the one built for that exit code: it spends nothing, prints the checks with their thresholds, and exits non-zero on a body the gate would hold.

= Does publishing a draft cost anything beyond the ~6 credits it took to write? =

Not by itself. The one thing that can add to it is the optional Lang Forge handoff: with Lang Forge installed *and* the "hand published posts to Lang Forge" box ticked in DraftForge → Settings, publishing queues one machine translation per extra language and Lang Forge charges ~3 credits for each. The box is off until you tick it, and it does not appear at all when Lang Forge is not installed.

= Where do I get more credits? =

Credits are purchased from https://avakode.com/dashboard/credits/.
The Credits screen of a connected site has a Buy credits link.
Each Forge Suite plugin shares the same credit balance.

= Will AI-generated posts be published automatically? =

Never without you deciding it, draft by draft. Every draft and every refresh lands in the Queue tab and stays there until you act on it.

There is one thing the free plugin will do while you are away, and only because you asked it to for that one post: on the Calendar tab you can schedule a finished draft for a date, exactly as you would in the WordPress editor, and WordPress publishes it on the day. That is your approval, given in advance — a date that has already passed is refused rather than published on the spot, and one click takes the post back to a draft.

Hands-off publishing — output going live because it passed the quality filter, with nobody choosing that post at all — is the Pro add-on, and it is off until you switch it on. Even then it stops itself: three new posts in any rolling seven days by default, and a pause after every tenth publication until you confirm.

If the person who should decide is not you, hand the draft over: "Request review" moves it to an Editor, and no automatic run will publish a draft that is still waiting for that answer.

= How do I adjust how often the scheduler runs? =

The scheduler ships in the Pro add-on. With Pro active, open DraftForge → Schedule and choose a frequency (daily, twice-daily, weekly) and how many new posts and refreshes to generate per run.

== Changelog ==

= 1.6.2 =
* Requires Draft Forge Pro 1.4.0 or newer, unchanged since 1.4.0.
* WordPress 6.7 and newer no longer log a "translation loading was triggered too early" notice on every admin page: the card that connects your Avakode account is now prepared a moment later in the page load. It looks and works the same.

= 1.6.1 =
* Requires Draft Forge Pro 1.4.0 or newer, unchanged since 1.4.0.
* WP-CLI: when the credits run out, the refusal names the address where credits are bought.

= 1.6.0 =
* Requires Draft Forge Pro 1.4.0 or newer, unchanged since 1.4.0 — an older add-on is switched off whole rather than left running.
* AI now runs on the credits of your Avakode account, with no licence. The Credits screen has an "AI credits" card: press "Connect Avakode account", sign in at avakode.com and approve the site; the card then shows the account, the credits left and a Buy credits link, and "Disconnect" removes the connection (the token is revoked on avakode.com and always deleted from your site, even when avakode.com cannot be reached).
* Until an account is connected, an AI button answers "Connect your Avakode account to use AI credits" with a link to the card, and sends nothing. A connection avakode.com no longer accepts is removed and the same message appears. Sites with a Pro licence are unchanged: the licence pays, and the card says so. A licence key saved on a site without an active Pro licence keeps paying until an account is connected, as long as avakode.com accepts the key (an expired or cancelled licence is refused); the card says so and still offers to connect.
* The connection uses the WordPress address of the site (Settings → General) everywhere, so it works where WordPress sits in its own folder and on a network site that has a path.
* The readme no longer promises a trial allowance; credits are bought, not given. The External services section lists the four new requests of the connection and what is stored (the encrypted token, the account's e-mail address, the number of the connection, the time it was made).
* Deleting the plugin removes the connection and its notes, whatever the "delete data on uninstall" setting says.

= 1.5.0 =
* Requires Draft Forge Pro 1.4.0 or newer, unchanged since 1.4.0 — an older add-on is switched off whole rather than left running.
* A button that spends credits now warns you before the click when the balance the site knows about falls short: “Not enough credits for this: you have N, it costs about M”, with a Get credits link. It shows over Mine topics with AI, the topic list, the rewrite and patch tasks, the stale-post list, the voice profile and the Schedule screen's Run now. The button stays clickable, since the price is an estimate and the balance may be out of date; nothing is said while no balance is known.
* Approve & publish gets the same warning, held against the full price on its label: the Lang Forge translation into every language.
* The Schedule screen's price now includes what Lang Forge charges to translate the new posts hands-off publishing puts live, and says how much of the total that is. The Run now button, the “about N credits” sentence and the warning read the same number.
* When a spend is turned away, the message now says why: an empty balance gets “You're out of credits” with a Get credits link, and the monthly limit you set gets “You've reached the monthly limit you set” with a Change the limit link to the field that holds it. On the Schedule screen, a run that stopped early for either reason links to the same two places.
* Fixed: a “too many requests” answer from your host or a firewall was reported as your own monthly limit; it now gets the general error line.
* Fixed: on PHP 7.4 to 8.1 the page that shows a proposed rewrite beside the article put every heading in a paragraph row, with its tag name stuck to the text (“h2Heading”).
* Fixed: the Forge Suite dashboard counted Form Forge's test submissions in its monthly figure and its recent list; only visitors' submissions are counted now.
* The new lines are translated in all 15 shipped languages.

= 1.4.2 =
* Requires Draft Forge Pro 1.4.0 or newer, unchanged since 1.4.0 — an older add-on is switched off whole rather than left running.
* Deleting the plugin leaves the job queue the Forge plugins share in place while another Forge plugin or add-on is still on the site. The check used to miss add-ons, and Rank Forge installed from wordpress.org, so the queue could be dropped while a neighbour still had jobs in it.
* Deleting the plugin now also removes the site's Avakode account binding and the hourly statistics event when it is the last Forge plugin on the site. With another Forge plugin or add-on left, both stay for it.
* Deleting the plugin always removes the licence record (the key and the site token), whatever the “delete data on uninstall” setting says.
* Fixed: the Forge Suite screen reported Rank Forge as not installed when it came from wordpress.org, which installs it into the rank-forge folder, and its Activate link pointed at a file that is not there.
* The Forge Suite screen looks for installed plugins only where WordPress keeps them, so a site that moved its content or plugin folder is read correctly.
* The Forge Suite licence panel finds Form Forge again: its licence code now ships in Form Forge Pro, so the free plugin is recognised by its own version.
* The Forge Suite menu entry is registered by the shared screen itself, so it appears even on a site where only the newer Forge plugins are active.
* The dashboard's “Run diagnostics” request to api.avakode.com/health no longer carries your site's address: it identifies itself as ForgeSuite/health-check instead of using WordPress's default User-Agent, which includes the address.
* The Forge Suite screen lists Renew Forge, shows Guard Forge and Velocity Forge as available on wordpress.org, and carries the other products' current plans and taglines.
* The readme's External services section lists every request the plugin can make and what goes with it, and says that an AI request is passed on to OpenAI through Cloudflare AI Gateway, with the licence key held back.

= 1.4.1 =
* Requires Draft Forge Pro 1.4.0 or newer, unchanged from 1.4.0 — an older add-on is switched off whole rather than left running.
* Credit prices are fetched from api.avakode.com only once the site is connected to an Avakode account or has spent a credit; opening a screen no longer reaches the network.
* Admin script globals and data attributes carry the full draftforge prefix instead of cnf.
* The Forge Suite dashboard links Guard Forge, Velocity Forge and Flow Forge to their sites: guardforge.app, velocityforge.app and flowforgewp.app.

= 1.4.0 =
* Requires Draft Forge Pro 1.4.0 or newer, unchanged from 1.3.0 — an older add-on is switched off whole rather than left running.
* New: what the queue produced now appears on the Forge Suite dashboard's first screen, beside every other Forge tool's results — published, scheduled, waiting for review, stopped, one line per kind of work with how many and over what period. A post is reported as verified only while it is actually public on the site; anything still waiting on you keeps its next step and stays in "needs attention". No traffic or revenue figures: this tool knows what it wrote, not what the writing earned, and nothing leaves your site.

= 1.3.1 =
* Brand: new product icon and admin logo.
* Requires Draft Forge Pro 1.4.0 or newer, unchanged from 1.3.0.

= 1.3.0 =
* The quality gate has a fifth check, and it is the only one that reads. The other four measure a draft — length, internal links, an image direction, distance from what you already published. This one is the objection a reader would make: stock phrases counted as a density rather than spotted once, sentences and openings repeated, an introduction that only restates the title, a rhythm too even to have been written by a person, dates and figures that cannot be true, and text laid out as a list where it should be prose. It answers with the sentence and the reason beside it instead of a number, at one of three strictness settings, and it runs on a refresh exactly as it runs on a new draft — of the two bodies, the one being rewritten is the one that already has readers. Free, and it costs nothing to run.
* The author generates and the editor approves. A queued draft can be sent for review to whoever holds the new `draftforge_review_drafts` capability — Administrator and Editor by default — who can approve and publish, approve as a draft, or send it back with a note. Both ends are recorded on the row, a reviewer is e-mailed at most once an hour however many drafts arrive in it, and a draft still waiting on that answer is never published by an automatic run.
* The Queue tab now opens for `publish_posts` instead of `manage_options`, so an author can reach their own work — and the administrator-only buttons on it are drawn only for an administrator, rather than rendering for everybody and answering 403 on the click. A Contributor is still kept out: the tab carries every draft on the site with its cost and its report.
* Draft Forge can read how you write. "Analyse my voice" takes up to five posts you actually published, describes your tone, sentence length and person, offers the summary for the Brand voice field rather than applying it, and folds the profile you keep into every later outline and draft (~2 credits per run). Saving the Settings form no longer throws that profile away.
* The whole pipeline is available from the command line: `wp draftforge mine`, `generate`, `refresh`, `gate`, `queue` and `credits`. Every command prints what the run will cost before it runs, the ones that spend refuse to without `--yes`, and every refusal exits non-zero — `gate` spends nothing and exits non-zero on a body the gate would hold, which makes it usable in a build.
* With the Pro add-on, the autopilot now stops itself instead of running until you notice: a weekly publish cap (1–14, 3 by default) that a scheduled run never exceeds no matter how many new posts per run you have configured, and a checkpoint after every 10 hands-off publications (configurable) that pauses further automatic publishing of new drafts until you confirm on the Schedule tab. Drafting and refreshes already live keep going while paused — the pause is on new posts going live on their own, nothing else.
* The Schedule tab shows the pause, the reason, a confirm button, and the calendar's forecast now draws the weekly cap as its own line and marks a week where the plan would cross it.
* An e-mail goes out once when the checkpoint engages, not again while it stays paused.
* Requires Draft Forge Pro 1.4.0 or newer. An older add-on has no checkpoint, cap or "Stop all" to read; this release is the first core to call for them, so a pre-1.4.0 add-on is now reported the same way a too-old one always has been — absent, not fatal.
* A Collection tab: choose which published posts you actually want kept current, up to 100 at a time, with an owner and a next-review date on each. That list is the scope of every maintenance task below — nothing outside it is read, fetched or rewritten. Adding, removing, and assigning an owner or a date are open to Administrator and Editor; the 100-post ceiling keeps the list readable and applies the same way with or without the Pro add-on.
* Allowed sources per tracked post: up to five URLs — a documentation page, a changelog, a feed — that a post is maintained against. Draft Forge reads them on a schedule, at most once every 12 hours each, over plain http/https only, never following a redirect into a private address, with a one-megabyte and fifteen-second limit and the text cached so a change can be described. A source that cannot be read says why — source unavailable, paywall, removed, or asks not to be read — with the date its current state began, beside the post and again in a list of its own. Text read from a source is quoted DATA when it reaches the model, inside a fence, behind an instruction not to obey anything written in it. Free.
* Maintenance tasks, and the end of "old means rewrite". Three things now put work on the Queue tab: a source that changed, a review date that arrived, and a decline report you imported (paste a CSV of URLs with clicks over two periods). Each task says what changed, where that is known from, which blocks of the post mention something out of the change — a word match offered as possibly affected, not a verdict — and how many blocks it did not touch. Two answers: rewrite with AI, or no change needed. The age of an article raises no task at all, and with the Pro add-on the autopilot's refresh half now takes only these tasks instead of scanning for the oldest posts on the site. Free.
* **Behaviour change with the Pro add-on:** scheduled runs used to refresh the oldest published posts on the site. From this release they refresh the maintenance tasks above, oldest task first, and only for posts in your collection. A site with an empty collection gets no refreshes from a scheduled run — add the posts you want kept current, and the "Consider posts stale after" setting on the Schedule tab is gone with the behaviour it configured. The Topics tab's own "Scan stale posts" button is unchanged and still lists old posts as a hint.

= 1.2.0 =
* An editorial calendar. A month grid of the drafts and topics you have planned, drawn in your site's own timezone and week, with a rail beside it for everything still waiting for a date. Drag a card onto a day or type the date into its field — both do the same thing, and both work without a mouse.
* A planned draft can be handed to WordPress for a date of your choosing. It is the same Approve you already had, a few days later; a date in the past is refused, because WordPress would publish it immediately.
* A queue row now follows its post. A draft published from the block editor, or by WordPress on its own date, used to leave the Queue tab offering to publish an article that had been live for a month — and the handoff to Rank Forge and Lang Forge never ran for it. Both now happen exactly once, however the post went live.
* Scheduled runs take the oldest topic first, which is what this plugin has claimed since 1.0.0 and has never done: the list was read newest-first, so a backlog longer than one run's allowance was never reached at all. A topic you dated in the calendar comes ahead of an undated one on its day, and is left alone before it.
* With the Pro add-on installed and licensed, the calendar also draws what the automatic runs are on course to produce, in the order they will take your topics. The grid, the moves and the publication dates are all in this free plugin.
* Draft Forge now records what it spent. A Credits tab shows the month to date, the price list it is working from, and the last hundred charges — including the outline of a draft that died on its body call, which every earlier version charged for and none of them showed.
* Each Queue row carries what that post has cost so far, added up from the ledger in one query.
* A monthly credit ceiling, in credits, set by you. Above 0, an AI call that would cross it is refused before the request leaves your site, and the refusal says to raise the ceiling rather than to buy credits. It defaults to 0, meaning no ceiling, and the Pro add-on cannot lift it.
* Prices are read from the Forge API in the background instead of only from the list this version shipped with, so a repricing reaches the screen without a plugin update. A site that has never reached the API still quotes the shipped list.
* A charge the API did not itemise is marked "estimated" everywhere it is shown. A long draft can cost more than the list price, and a number we cannot stand behind now says so.
* A scheduled run that stops at the ceiling says which wall it hit, instead of reporting an empty wallet.
* Every pending refresh can be read before it is applied. "Review changes" draws the proposed rewrite against the original, per block and per word, and "Apply refresh" becomes an Accept you press after reading rather than instead of it. Rejecting a rewrite writes nothing to the post.
* A refresh now keeps the body it was a rewrite of. Reviewing against the live post meant an edit made in between showed up as a change the model proposed; the screen now compares what the model was handed, and warns when the post has moved on since.
* Accepting part of a rewrite and leaving the rest is not in this release. It needs a way to identify one block across two versions of a post, which the comparison does not carry; accept and reject are whole-document, deliberately.
* Requires Draft Forge Pro 1.2.0 or newer, and an older add-on is now switched off rather than left running. A pre-1.2.0 scheduled run cannot see the dates you set on the Calendar tab: it would draft — and with hands-off publishing on, publish — the article you planned for next month, and never reach the backlog you put at the top of it. Draft Forge says which version you have, which one you need, and that nothing already generated is affected.

= 1.1.0 =
* Automatic publishing left the free download. The free plugin no longer holds a licence check over its own generator: whether a passing draft goes live is a `draftforge/should_auto_publish` filter, and the Pro add-on answers it. Nothing in the free package decides that any more, which is what wp.org Guideline 5 asks for.
* A lapsed licence gets a card instead of a control that lies. With Pro installed but the licence inactive, the Schedule form used to render and save settings no tick would ever read, and "Run now" reported "gen 0 / refresh 0 / err 0" for a tick that had refused to run.
* A scheduled run that stops early says so — on the screen and on the button — instead of reporting a clean zero.
* The refresh cooldown starts when the credits are spent, so a post cannot be refreshed twice in a row for two charges.
* A refresh goes through the same quality gate and the same rewrite a first draft does.
* "Bulk topic queue" and "automatic refresh of stale posts" are no longer sold as separate Pro features. Both are what the scheduled tick already does — up to ten new drafts and ten refreshes per run — and neither name had any code asking about it.
* Deleting the plugin no longer takes your data with it. Draft Forge was the only plugin in the suite that wiped everything on uninstall unless a hidden option said otherwise; it now keeps by default and asks with a checkbox, like the rest.
* Requires Draft Forge Pro 1.1.0 or newer. An older add-on answers neither filter, so automatic publishing stays off; Draft Forge now says so instead of leaving it silently broken.

= 1.0.2 =
* Suite handoffs reach the plugins they were written for: the focus keyword now lands in the key Rank Forge reads, and posts generated before this release are migrated on upgrade.
* Handing published posts to Lang Forge for translation is now an opt-in checkbox with its credit cost on the label — it used to be silent.
* Every screen quotes its credit cost from the API price list, including the Schedule tab's manual tick.
* Auto-publish is marked as a Pro capability on the Settings screen instead of saving a checkbox that did nothing.

= 1.0.1 =
* Fixed a fatal on the Schedule screen for sites without the Pro add-on — it now shows what Pro adds instead of dying.

= 1.0.0 =
* Initial public release. Topic mining, AI draft generation, stale-content refresh, queue, and quality filter.

== Upgrade Notice ==

= 1.6.2 =
If you run Draft Forge Pro, update it to 1.4.0 or newer if it is older, as before. WordPress 6.7 and newer stop logging a translation notice on admin pages.

= 1.6.1 =
If you run Draft Forge Pro, update it to 1.4.0 or newer if it is older, as before. In WP-CLI, the message about empty credits now names where to buy them.

= 1.6.0 =
If you run Draft Forge Pro, update it to 1.4.0 or newer: an older add-on is switched off whole rather than left running.
AI can now run on the credits of your Avakode account, with no licence: connect the account on the Credits screen.

= 1.5.0 =
Warns before a click that spends credits when your balance falls short, and says whether a refused spend hit an empty balance or your own monthly limit. If you run Draft Forge Pro, update it to 1.4.0 or newer: an older add-on is switched off whole rather than left running.

= 1.4.2 =
Deleting the plugin leaves the job queue shared by the Forge plugins alone while another one is still installed. If you run Draft Forge Pro, update it to 1.4.0 or newer: an older add-on is switched off whole rather than left running.

= 1.4.1 =
If you run Draft Forge Pro, update it to 1.4.0 or newer: an older add-on is switched off whole rather than left running, so its features stop until you do. Nothing already written is touched.

= 1.4.0 =
If you run Draft Forge Pro, update it to 1.4.0 or newer: an older add-on is switched off until you do. Nothing already written is touched. Adds your queue to the Forge Suite dashboard: what was published, what waits for you, what stopped.

= 1.3.1 =
If you run Draft Forge Pro, update it to 1.4.0 or newer: an older add-on is switched off until you do. Nothing already written is touched. Also: new product icon and admin logo.

= 1.3.0 =
A fifth gate check reads the draft and names the sentence it objects to; drafts can go to an editor first; voice analysis; WP-CLI with prices; a weekly publish cap and checkpoint. If you use Pro, update it to 1.4.0 or newer at the same time: an older add-on is switched off until you do.

= 1.2.0 =
Adds a Credits tab, per-post costs, an optional monthly credit ceiling and a refresh review screen. Prices unchanged. If you use Pro, update it to 1.2.0 or newer at the same time: an older add-on is switched off until you do. Nothing generated is affected; settings are kept.

= 1.1.0 =
Automatic publishing moves out of the free download into the Pro add-on's own filter: if you use Pro, update it to 1.1.0 or newer at the same time, or hands-off publishing will stay off. A run that stops early now says why, and the refresh cooldown starts when the credits are spent.

= 1.0.2 =
Fixes the Rank Forge keyword handoff (and repairs posts generated before it), makes the Lang Forge translation handoff opt-in, and corrects the credit costs shown before every AI action.

= 1.0.1 =
Fixes a fatal error on the Schedule screen for Free-only sites. Upgrade recommended.

= 1.0.0 =
Initial release.
