=== Schall AI Internal Links ===
Contributors: markusschall
Tags: internal links, artificial intelligence, seo, translatepress, ollama
Requires at least: 6.9
Tested up to: 7.1
Requires PHP: 8.1
Stable tag: 3.9.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Internal links that read naturally: AI suggestions with an editorial quality review, durable decisions and a clear overview of your link graph.

== Description ==

Schall AI Internal Links finds internal links between your posts and pages. It rates which pages fit together, picks a natural phrase from your own text as the link and reviews every suggestion editorially before you see it. You decide: schedule, activate now or reject. Links are added when the page is displayed; your post content is never changed.

= What you get =

* Link suggestions with a second editorial review (semantics, anchor, context, reader value)
* Durable decisions: a rejected pair stays closed until you allow it again
* Only suggestions that can really be activated; a daily link check sorts out the rest
* Searches that vary their targets and remember weak pairs, so new runs find new links
* A link check on the rendered pages: you see which active links visitors really see
* Jobs that always finish: a failed model answer is retried with a remedy and, if needed, with other local models; at the end every job is done or shows its reason, and no progress bar stays stuck
* An overview with history: active links, pages without inbound link, decisions and AI calls per day
* Every list sortable and searchable; views for pages without inbound link and open link searches
* The pages that link to a post, right on its detail view
* A grouped, permanent history of link changes with non-destructive rollback
* TranslatePress: language-specific anchors and localized target URLs
* AI providers of your choice: a local model (Ollama, LM Studio, MLX) or Ollama Cloud, OpenAI, Anthropic and DeepSeek
* Interface in English, German, French, Dutch, Spanish, Italian, Portuguese, Polish, Czech, Russian and Turkish

= Editions =

* **Light** (free): every feature for up to 20 content items you choose. No time limit.
* **Premium**: all content, with updates and support for the licensed period. After the period the installed version keeps working. A license key turns the Light installation into Premium; your data stays.
* Links that are already active always stay on your pages, whatever the license state.

Light and licenses are available at [schall-ai.de](https://schall-ai.de/en/plugins/internal-links/). After the purchase the key is in the license area at [konto.schall-ai.de](https://konto.schall-ai.de/). Enter it under Settings › Schall AI › AI Internal Links › License.

= Requirements =

* WordPress 6.9 or later, PHP 8.1 or later, MySQL 8.0 or MariaDB 10.11 or later
* PHP DOM extension; Sodium or OpenSSL for encrypted credentials
* An AI provider: a local model on your own hardware or an account with a cloud provider
* WordPress Multisite is not supported officially; activate the plugin per site

== Installation ==

1. Upload and activate the ZIP under Plugins › Add New › Upload Plugin.
2. Open AI Internal Links › Setup and follow the four steps.
3. Choose your AI provider under Settings › Schall AI › AI Internal Links › AI provider, test the connection and select a model.
4. In Light, add up to 20 content items under AI Internal Links › Content.
5. Keep automatic approval off at first and review the first suggestions yourself.

== Privacy and external services ==

The plugin stores no data about visitors, sets no cookies and adds nothing to your pages that identifies a person.

* **AI provider**: titles and text passages of published content are sent to the provider you select. With a local model nothing leaves your infrastructure; with a cloud provider (Ollama Cloud, OpenAI, Anthropic, DeepSeek) its own terms and privacy policy apply.
* **License service** (licenses.markus-schall.de): for license checks and updates the website address, an installation ID, the plugin version and, once, the license key are transmitted.
* **Connected websites**: pages of other websites whose address an administrator enters under AI Internal Links › Connected websites are fetched from your server, their readable text is stored in your database and sent to the AI provider like your own content. The request identifies itself only as Schall AI Internal Links with its version.
* **User guide** (schall-ai.de): when an administrator opens the Documentation tab, the web server loads the guide at most once a day. No site address or personal data is sent.
* **Editorial history**: the WordPress user ID of the editor behind a link change is stored. The WordPress privacy tools export and anonymize these entries; a suggested text for your privacy policy is added under Settings › Privacy.

Uninstalling removes scheduled tasks. Tables, settings, history and the stored pages of connected websites are deleted only when "delete all plugin data when uninstalling" is enabled in the settings (Maintenance).

== AI Providers ==

= Local models =

The default endpoint is `http://localhost:11434/api`. In server-side WordPress code, `localhost` means the WordPress server, not your computer. Use a protected network endpoint or a reverse proxy for a model on another machine.

= Cloud providers =

When a cloud provider is selected, the text passages and metadata needed for the analysis are transmitted to that provider. A job uses the selected provider and model. If its answer fails, the automatic recovery may continue with other local models; a cloud model steps in only when you allow cloud replacement and choose that model.

== Upgrade Notice ==

= 3.9.0 =

Install over the existing plugin. The free edition is now called Light, the licensed one Premium; product page, updates and the customer area moved to schall-ai.de. Settings, links and licenses stay as they are.

= 3.8.4 =

Install over the existing plugin. Waiting link searches stay in the list and the counts of the shared queue, however long ago their last step was. Nothing is written on update.

= 3.8.3 =

Install over the existing plugin. A page stays open while a newer link search of it still has work left, instead of counting as complete without it. Nothing is written on update.

= 3.8.2 =

Install over the existing plugin. Jobs wait when the Local Connector is briefly not available instead of stopping at once. Nothing is written on update.

= 3.8.1 =

Install over the existing plugin. Brings the Schall AI Kit 1.38.1; editors find the figures of Internal Links in the editorial Cockpit. Nothing is written on update.

= 3.8.0 =

Install over the existing plugin. Editors can now see the suggestions and the counters of their own jobs; only administrators decide. Nothing is written on update.

= 3.7.1 =

Install over the existing plugin. Brings the Schall AI Kit 1.25.0. Nothing is written on update.

= 3.7.0 =

Install over the existing plugin. The jobs of Internal Links join the shared queue and the cockpit of the Schall AI Kit, and the link engine recognises words in every content language; German and English content keeps its word lists exactly. On the first worker run the jobs that ended before are marked as history; nothing else is written.

= 3.6.0 =

Install over the existing plugin. The new screen Connected websites reads single pages of other websites and understands them as future link targets; no link is suggested to them yet. Nothing is written on update.

= 3.5.2 =

Install over the existing plugin. With an external cron a scheduled run may take 50 seconds, and only one run at a time works on AI jobs. Nothing is written on update.

= 3.5.1 =

Install over the existing plugin. A worker run takes as many AI jobs as fit into its time, so fast models work through the queue faster; with an external cron a scheduled run may take 25 seconds. Nothing is written on update.

= 3.5.0 =

Install over the existing plugin. Links whose words stand only in a heading, an FAQ question or a table head can get new words in the running text; nothing is replaced without your approval. On update the next background run checks the links on every page once.

= 3.4.0 =

Install over the existing plugin. The plugin learns which model suits which task and skips unsuitable ones as replacements; link checks and publishing no longer wait behind AI jobs. Only the task of earlier AI calls is filled in on update.

= 3.3.3 =

Install over the existing plugin. Existing links in questions of expandable blocks and table heads stay where they are; new links are no longer placed there. Nothing else changes.

= 3.3.2 =

Install over the existing plugin. Links in headings and questions become a setting; your site keeps its former placement until you change it, and no link moves on update.

= 3.3.1 =

Install over the existing plugin. Waiting jobs continue once their model works again, and link searches that ran out of budget continue where they stopped; nothing is written on update.

= 3.3.0 =

Install over the existing plugin. Failed and stuck jobs of the last 30 days run again once with the selected model; links, anchors and suggestions are not changed.

= 3.2.1 =

Install over the existing plugin. Corrects the interface translations in eight languages; nothing is written and no work starts.

= 3.2.0 =

Install over the existing plugin. Adds the Documentation tab with the user guide; nothing is written and no work starts.

= 3.1.0 =

Install over the existing plugin. Adds tips to every screen; nothing is written and no work starts.

= 3.0.0 =

Install over the existing plugin. The new name changes nothing for existing installations: settings, decisions, the edition and every active link stay as they are. No crawl, AI request or link change starts.

= 2.4.0 =

Install over the existing plugin without deleting plugin data. The update imports any genuine 1.0.x Ollama settings exactly once, removes only their three obsolete mirrors, and starts no crawl, AI request, queue work, suggestion rebuild, or link change. A downgrade to 1.0.x is no longer lossless; see `docs/migrations/UPGRADE-2.4.0.md`.

= 2.3.3 =

Install over 2.3.2 without deleting plugin data. The render-only fix corrects the SILA/TranslatePress buffer order and starts no crawl, AI request, translation request, queue work, or stored-content change. Existing ready translated anchors are reused immediately after page caches have been refreshed.

= 2.3.2 =

Install over 2.3.1 without deleting plugin data. The render-only fix adds the translated WordPress runtime locale as a safe fallback for partial output-buffer chunks. It starts no crawl, AI request, translation request, queue work, or stored-content change; existing ready translated anchors are reused immediately.

= 2.3.1 =

Install over 2.3.0 without deleting plugin data. The render-only fix starts no crawl, AI request, translation request, queue work, or stored-content change. Existing ready translated anchors are used immediately after page caches have been refreshed.

= 2.3.0 =

Install over the existing plugin without deleting plugin data. The update adds bounded root-run and local impact-assessment tables but starts no crawl, AI call, reverse analysis, or link change. Existing content, provider routes, credentials, queue data, suggestions, links, and language anchors remain in place.

= 2.2.0 =

Install over the existing plugin without deleting plugin data. AI Kit 1.5.0 separates actual provider calls from local waiting, adds route circuits and class-specific retries, and extends content-free usage diagnostics. No provider route, credential, immutable queue context, link, anchor, suggestion, analysis, or content is changed, and no AI work starts during the update.

= 2.1.0 =

Install over the existing plugin without deleting plugin data. AI Kit 1.4.0 adds shared schema 5 and the explicitly allowlisted custom-domain Connector path. SchallConnect Cloud provisioning is unchanged. No provider route, credential, model, queue row, link, anchor, suggestion, analysis, usage record, or content is changed, and no AI work starts during the update.

= 2.0.0 =

Install over the existing plugin without deleting plugin data. AI Kit 1.3.0 adds licensed Local Connector provisioning. Runtime permission remains sufficient when update or support terms have expired. No provider route, credential, model, queue row, link, anchor, suggestion, analysis, usage record, or content is changed, and no AI work starts during the update.

= 1.9.0 =

Install over the existing plugin without deleting plugin data. AI Kit 1.2.0 adds E2E v1 and shared schema 4 for encrypted Local Connector PSKs. No provider route, credential, model, queue row, link, anchor, suggestion, analysis, usage record, or content is changed, and no AI work starts during the update.

= 1.8.0 =

Install over the existing plugin without deleting plugin data. AI Kit 1.1.0 adds the optional Local Connector and shared schema 3. No provider route, credential, model, queue row, link, anchor, suggestion, analysis, usage record, or content is changed, and no AI work starts during the update.

= 1.7.1 =

Install over the existing plugin without deleting plugin data. Schall AI Kit 1.0.2 adds short interactive capacity retries and execution-aware messages while background queue deferrals remain attempt-neutral. No provider setting, key, model, queue row, link, anchor, suggestion, analysis, usage record, or content is changed.

= 1.7.0 =

Install over the existing plugin without deleting plugin data. Provider settings, encrypted keys, model routes, queue rows, links, anchors, suggestions, analyses, and usage history are preserved. The product-local provider implementations are replaced by the bundled shared AI Kit runtime; busy shared capacity defers work without consuming an attempt.

= 1.6.4 =

Install over the existing plugin without deleting plugin data. Model monitoring starts with no automatic replacement enabled. Existing queue rows, links, anchors, suggestions, analyses, content, and provider/model snapshots remain unchanged. Select an explicit replacement under Settings > Schall AI > Schall AI Internal Links > AI provider before enabling automatic replacement.

= 1.6.3 =

Install over the existing plugin without deleting plugin data. The update reconciles only duplicate pending link-scan continuations created by the 1.6.2 recovery across plugin-version AI contexts. It keeps the older unfinished row when recovery is still pending, or the completed recovery when it already advanced the pipeline. No content, links, anchors, suggestions, analyses, provider settings, or unrelated queue jobs are changed.

= 1.6.2 =

Install over the existing plugin without deleting plugin data. Historical link-scan failures caused solely by an unfinished analysis are archived and restarted once. The update does not rebuild all language anchors automatically; use “Rebuild active language anchors” for that explicit, batched operation.

= 1.6.1 =

Install over the existing plugin without deleting plugin data. License management moves to Settings > Schall AI > Schall AI Internal Links > License; existing License bookmarks redirect automatically. No license, crawl, AI request, translation request, queue reset, or database migration starts during the update.

= 1.6.0 =

Install over the existing plugin without deleting plugin data. The update adds small request and priority metadata tables only; it starts no crawl, AI request, translation request, or link activation. Schall SEO Suite remains optional.

= 1.5.9 =

Install over the existing plugin without deleting plugin data. Only failed language-anchor jobs from previous runs are archived as cancelled; pending/running work, active links, ready anchors, suggestions, content, provider settings, and current analyses remain unchanged. A later deliberate language-anchor rebuild starts from a clean terminal state.

= 1.5.8 =

Install over the existing plugin without deleting plugin data. Settings move to Settings > Schall AI > Schall AI Internal Links; old Settings bookmarks redirect automatically. No crawl, AI request, translation request, queue reset, or database migration starts during the update.

= 1.5.7 =

Install over the existing plugin without deleting plugin data. The database upgrade adds only diagnostic queue columns. No crawl, translation, AI request, link rebuild, or language-anchor repair starts automatically. Existing queued jobs finish normally; new full runs cannot overlap. Use **Rebuild active language anchors** only when you deliberately want to retry missing anchors.

= 1.5.6 =

Install over the existing plugin without deleting plugin data. The update starts no crawl or translation. After installation, rebuild active language anchors once; only completed TranslatePress dictionary text is read, and missing translations remain unavailable for linking.

= 1.5.5 =

Install over the existing plugin without deleting plugin data. If the selected provider cannot run, the update cancels only unfinished language-anchor jobs. Re-enter the API key, save, run the connection test, and then use “Rebuild active language anchors” once. Active links, ready anchors, content, suggestions, and unrelated jobs remain unchanged.

= 1.5.1 =

Install over the existing plugin without deleting plugin data. The canonical source build remains offline; a configured Sandbox build is visibly marked and contains public verification values only.

= 1.5.0 =

Install over the existing plugin without deleting plugin data. The dormant signed update path starts no crawl, AI request, link change, queue reset, license request, or database migration. Production service keys remain unset until deployment.

= 1.4.0 =

Install over the existing plugin without deleting plugin data. Grandfathered full access, links, analyses, suggestions, settings, and queued work remain unchanged. The production license endpoint is intentionally not enabled until server deployment is complete.

= 1.3.5 =

Install over the existing plugin without deleting plugin data. Optional strategy presets change nothing until explicitly applied and start no crawl, AI request, link change, or queue reset.

= 1.3.4 =

Install over the existing plugin without deleting plugin data. The update adds sortable content columns and safe settings transfer; it starts no crawl, AI request, link change, or queue reset.

= 1.3.3 =

Install over the existing plugin without deleting plugin data. Existing diagnostic history is evaluated in place; no crawl, AI request, link change, migration, or queue reset starts automatically.

= 1.3.2 =

Install over the existing plugin without deleting plugin data. An empty API-usage table is added and begins recording new provider calls; no crawl, AI request, link change, or queue reset starts automatically.

= 1.3.1 =

Install over the existing plugin without deleting plugin data. The Setup assistant recognizes existing configuration and completed work and starts no crawl, AI request, link change, or automatic publishing by itself.

= 1.3.0 =

Install over the existing plugin without deleting plugin data. The update adds the audit table and records existing active links as a non-revertible baseline. It does not start a crawl, reindex content, rebuild suggestions, or change any existing link.

= 1.2.0 =

Install over the existing plugin without deleting plugin data. Existing sites receive unlimited grandfathered access automatically. The update adds only the workspace columns and commercial state; it does not start a crawl, rebuild suggestions, or remove links.

= 1.1.7 =

Install over the existing plugin without deleting plugin data. This release adds automated quality assurance and repairs only an obsolete queue compatibility path; it starts no crawl, reindex, suggestion rebuild, or link change.

= 1.1.6 =

Install over the existing plugin without deleting plugin data. Queue indexes are added automatically; no crawl, reindex, suggestion rebuild, or link change is started. Only completed or cancelled technical queue history older than 30 days is cleaned up gradually.

= 1.1.5 =

Install over the existing plugin without deleting plugin data. Unfinished AI jobs receive safe run metadata; no crawl, reindex, suggestion rebuild, or link change is started automatically.

= 1.1.4 =

Install over the existing plugin without deleting plugin data. This internationalization update does not rebuild the semantic index or link suggestions and keeps active links, diagnostics, language anchors, credentials, and provider settings intact.

= 1.1.3 =

Install over the existing plugin without deleting plugin data. Unfinished AI jobs are assigned to the provider/model that is active during the update; new runs keep their starting provider/model throughout the queue.

= 1.1.2 =

Install over the existing plugin without deleting plugin data. The model setting now shows the complete discovered list in an explicit dropdown while retaining manual model-ID entry.

= 1.1.1 =

Install over the existing plugin without deleting plugin data. This update does not start a full crawl, reindex existing content, or rebuild existing link suggestions.

== Frequently Asked Questions ==

= Does the plugin write links into post_content? =

No. Link decisions are stored in dedicated tables and approved links are injected into the rendered HTML.

= Can I prefer product or service pages? =

Yes. Targets can be marked Normal, Important, Product / Service, or Excluded. Priority never replaces relevance or the editorial quality review.

= Can I use a local model? =

Yes. Select Ollama Local / Custom and provide an Ollama-compatible endpoint reachable from the WordPress server.

= Are several AI providers queried at the same time? =

No. Exactly one provider and one model are active for a run.

= Are existing links removed when I switch provider? =

No. Switching provider does not remove the index, suggestions, active links, language anchors or another provider's stored configuration.

= What happens when a Premium license expires? =

An eligible installed paid version continues working after a normal cancellation or expiry; updates and regular support end after the paid period. Only a newer signed revocation stops future Premium work. Existing active links always remain rendered.

== Changelog ==

= 3.9.0 =

* The free edition is called Light, the licensed one Premium. A license key turns the same installation into Premium; your data stays.
* Product page, updates and the user guide now come from schall-ai.de; the license page links the customer area on konto.schall-ai.de (key, downloads, invoices).
* Clearer screens: the queue names every job and the page it works on, API usage shows readable figures, and IDs and codes for support are folded under "Technical details". Connected websites and content understanding stay out of the menu until they are in use.
* The content list fits a 1440 px screen in both editions; the target strategy saves as soon as you choose it.
* No space before a full stop after a marked anchor, no language column without TranslatePress, and the license key field comes first while no license is active.
* German interface: plain wording without developer terms, formal address throughout.
* Schall AI Kit 1.50.5.

= 3.8.4 =

* In the shared queue of the Schall AI Kit a link search that waits – behind an earlier search of the same page or for the queue watchdog – is listed and counted however long ago its last step was. Before, it dropped out after a day.
* The search of a page that is no longer a link source is shown as ended instead of waiting, because the queue watchdog does not continue it.

= 3.8.3 =

* When two link searches of one page overlap – for example the re-check after a linked page was edited while an earlier search still waits for its reviews – the page counts as complete only when the newer search is done too. Before, the earlier search could complete the page while the newer one had stopped before its anchor search, and the re-check was lost without a word. Now the page stays open and the queue watchdog continues the search.
* In the shared queue a link search that waits for an earlier search of the same page says so, without promising a time. A newer search whose result the earlier one saved counts as done and says so; one that ended without its work is shown as ended, not as done.

= 3.8.2 =

* When the AI Kit briefly cannot read the Local Connector – for example while a Schall AI plugin is being updated – its jobs wait and try again every 15 minutes without using up an attempt. Only when it stays that way for over an hour do they stop with Check, as before. The Queue page lists when the Local Connector was not available and when it was available again.
* A Local Connector that is offline when a job starts lets the job wait as well, as it already did during a request, instead of reporting it as not configured.

= 3.8.1 =

* Brings the Schall AI Kit 1.38.1. Editors find the editorial Cockpit under Dashboard › Schall AI: the figures of Internal Links – active links, open suggestions, pages without an incoming suggestion – and the jobs of their own posts. The decision row and every action stay with administrators.

= 3.8.0 =

* Editors – everyone who may edit the posts of others – see the suggestions without buttons and, in the Schall AI box of the WordPress dashboard, the counters of the jobs of their own posts. Approving, rejecting, settings, the queue page and the Cockpit stay with administrators; every action is checked on the server.
* The box in the post editor leads editors to the suggestions of the post; other authors see its figures only.
* Translated links: a rebuild that ended with a few open language anchors is no longer reported as a problem; the queue watchdog schedules them again.
* Brings the Schall AI Kit 1.25.1.

= 3.7.1 =

* Brings the Schall AI Kit 1.25.0 with cockpit 1.2 and the image check of the Local Connector.
* While the Local Connector checks open image jobs, waiting jobs of Internal Links name this reason in the shared queue; no attempt is used.
* API usage: a call that a worker run stopped at its budget before it reached the provider shows as open, not as an error.

= 3.7.0 =

* The jobs of Internal Links appear in the shared queue of the Schall AI Kit: one job per link search of a post with its five stages as steps, one job per analysis, scan step, link check or publication. Administrators can try again with the main model, cancel, run now and prioritize.
* Cockpit of the Schall AI Kit: active links and open suggestions with their value of seven days ago, pages without an incoming suggestion and the open suggestions under “Needs you”.
* The link engine recognises function words, generic anchors, question words and auxiliary verbs in all eleven languages; German and English content keeps its word lists exactly.
* The queue page names job states like the shared queue, in every language.

= 3.6.0 =

* New screen “Connected websites”: enter single pages of other websites (up to 200 with a license, one in the Demo). A background job reads each page safely from your server and keeps only its main text; the AI understands it like your own content.
* These pages never receive links and are not yet offered as link targets. The content list shows them in their own view; the SEO Suite and the Abilities do not see them.

= 3.5.2 =

* Only one worker run at a time works on AI jobs; a run that starts meanwhile does the jobs without an AI call. The lock is a database lock that is released when a run ends, even after a crash.
* With an external cron (WordPress cron switched off) a scheduled run may take 50 seconds and up to 24 jobs instead of 25 seconds and 12.

= 3.5.1 =

* A worker run takes another AI job only when one more of the length just measured still fits into its time; short answers allow several per run, a long answer ends it.
* With an external cron (WordPress cron switched off) a scheduled run may take 25 seconds and up to 12 jobs instead of 14 seconds and 4.

= 3.5.0 =

* New “Replacement anchors” under Editorial quality: active links whose words stand only in a heading, an FAQ question or a table head are counted, and “Search replacement anchors” lets the AI look for words in the running text that lead to the same target.
* A replacement waits under Suggestions › Replacement anchors until you approve it; optionally it replaces the old anchor at once when it passes the check for automatic links. The link keeps its ID and target, and the change history keeps the former words for a rollback.
* Translated anchors keep their former words until the new ones are found in that language, so no link disappears in between. Links without fitting words stay where they are and can be removed from the list.

= 3.4.0 =

* New table “Model quality per task” under API usage: valid, cut-off and productive answers per provider, model and task, with a quality index from 10 calls.
* From 20 calls a model can count as unsuitable for a task; the automatic recovery skips it there and orders replacement models by their quality for the task. Your selected model stays binding and gets a warning in the AI provider settings.
* Every worker run first does up to 20 due jobs without an AI call (link checks, publishing, stage steps), so they never wait behind AI jobs.

= 3.3.3 =

* Questions of expandable blocks and table heads have three steps: allow, keep existing links but add no new ones, or do not allow.
* An update chooses “keep existing links”: every link stays where it is, and no new links are placed in questions.

= 3.3.2 =

* New setting “Links in headings and questions”: headings (H1–H6), questions of expandable FAQ blocks and table heads; off on new installations, the former placement on updated ones.
* Switched off, a link in a question moves to the same words in the answer; otherwise it is not shown and stays saved.
* “Check the effect” shows beforehand what a change would do; nothing is saved.
* Form labels, such as the answers of a poll, follow the question switch and never get new suggestions.

= 3.3.1 =

* Jobs waiting for their model continue once it works again.
* A short model error no longer marks a content item as finished with an error.
* A link search that ran out of budget continues where it stopped, with a growing budget.

= 3.3.0 =

* Jobs always finish: a failed model answer gets a remedy on the same model, then up to two other suitable local models; at the end the job is done or shows its reason.
* Retry failed jobs per row, per selection or per filter (job, model, kind of error), with the selected model, the previous one or another model; close jobs for good.
* A queue watchdog ends idle runs and continues link searches and language anchors that stopped without a job.
* Progress counts searches that ended with an error as finished and names them; "waiting" is no longer shown as "running".
* Cloud models replace a failed model only when allowed and chosen explicitly.

= 3.2.1 =

* Interface translations reviewed in full for Spanish, Dutch, Italian, Portuguese, Polish, Czech, Russian and Turkish; the user guides of these languages match the corrected labels.

= 3.2.0 =

* New Documentation tab: the user guide as PDF in eleven languages, to read, open in a new tab or download.
* The guide's chapter "Tips and tricks" prints every tip next to a screenshot of its screen.
* Corrected interface labels in Dutch, Spanish, Italian, Portuguese, Polish, Czech, Russian, Turkish and French.

= 3.1.0 =

* Tips and notes on every screen: the "Tips" button opens the questions of that screen, and "Show" leads to the place on the page.

= 3.0.0 =

* New name: Schall AI Internal Links. Settings, decisions and links stay as they are.
* The Demo shows the way to a license: buy one or enter your key.
* The WordPress privacy tools export and anonymize the editorial history; a suggested privacy policy text is added.
* Uninstalling with "delete all plugin data" leaves nothing behind.
* Network-wide activation on Multisite is refused with a clear message.

= 2.15.0 =

* Link changes, queue, API usage, setup and diagnostics in the style of the SEO Suite: one sentence about the situation, key figures and charts at the top.
* Link changes can be filtered by origin, searched by anchor, source or target, sorted and paged instead of showing only the newest 100 groups.
* The queue shows the stages of the link search as bars; API usage shows requests and failures per day.
* The overview names newly activated links as not yet checked instead of not shown.
* Diagnostics show what the link search remembers: rated pairs, pairs resting until a page or the model changes, weak matches and pairs without a usable anchor.

= 2.14.0 =

* The content list in the style of the SEO Suite: one sentence about the situation, key figures and a bar chart of how many pages have no, few or many inbound links. Views show all content, pages without inbound link, content with an open link search, or pages excluded as target.
* New columns for inbound links and the state of the link search; every column can be sorted, titles can be searched.
* Each content item shows its key figures and, new, the pages that link to it.
* A single recorded day in a chart is now drawn as a dot.

= 2.13.0 =

* The suggestion list in the style of the SEO Suite: one sentence about the situation, key figures with their trend, the open suggestions over time with new suggestions as dots, the status as segments with their counts and a calm search bar. Rare filters and the maintenance actions are folded away.
* The list opens with the open suggestions. Every AI reason shows one short line; the rest opens with a click.
* The overview says "running" only while the link search has work in the queue.

= 2.12.0 =

* A new overview in the style of the Schall AI SEO Suite: one sentence about the situation at the top, a choice of 30 days, 90 days or 12 months, key figures with their trend, a chart of active links and pages without inbound link, and the decisions per day, week or month.
* Every screen now starts with the same calm head as the SEO Suite. The menu is called "AI Internal Links".
* Charts are drawn on your server, without any outside library; a table carries the same values for screen readers.

= 2.11.2 =

* Links whose text contains quotation marks, apostrophes or dashes now appear on the page. WordPress prints typographic characters („…“, ’, –) where the link text was stored with plain ones, so such a link could not be placed. A link that already appears keeps its exact position and text.
* The link check reads your pages with the same typographic characters visitors see, so it no longer reports such a link as shown. It runs once for all pages right after the update.

= 2.11.1 =

* Post lists inside your content, such as Display Post Types grids or the latest-posts and query-loop blocks, no longer count as links to their entries. A randomly drawn entry could hide a link for a single page view, make "Activate now" fail and let the link check report visible links as hidden. The link check runs once for all pages right after the update.

= 2.11.0 =

* Internal Links now keeps a daily history: active and scheduled links, open suggestions, rejected and deleted pairs, pages without inbound links, links shown on pages, new suggestions and finished runs, plus activations, deactivations, rejections and AI calls per day. The history of active links is rebuilt from the link history right after the update. It is the basis for the charts of the coming interface.
* The date of the link check in the overview uses your language.

= 2.10.0 =

* Link searches remember what they found. A target that was rated weak for a page, or for which no usable link passage was found, rests while both pages stay unchanged, so later searches try other targets instead of repeating the same ones.
* Pages without inbound links are preferred, and pages that already receive many links are tried less often. Important and product pages are never held back.
* A quarter of every shortlist goes to targets that were never tried for the page, and equally matching targets rotate between searches.
* New links spread over the page: a paragraph that already carries a link is only used when no other paragraph fits.
* The AI writes its reasons in the language of your site instead of English.
* The overview shows "–" until the first link check has run, and the daily link check works through all pages in a few batches ahead of AI work.

= 2.9.0 =

* Suggestions only offer "Schedule" and "Activate now" when the link can really be placed. Otherwise the list says why — for example that the text already carries a link or that the page already links the target — and the suggestion is sorted out automatically.
* Link searches no longer propose text that already carries a link or another suggestion.
* "Activate now" on a page that another process is changing queues the link instead of failing; it is activated automatically a moment later. Every failed activation explains its actual reason in your language.
* A scheduled link that cannot be published goes back to the suggestions instead of staying scheduled forever.
* The overview shows how many active links are really shown on their pages and why the others are not; a daily check keeps this current and can be started at any time.
* The list of excluded pairs is complete again, with search, a reason filter and pages.

= 2.8.0 =

* A rejected suggestion stays rejected. Rejecting closes the source-target pair for new suggestions until you allow it again under "Excluded source-target pairs"; links that already stand on the pair keep working. Rejections from earlier versions are restored on update, including those that later scans had turned invalid or that cleanups had removed.
* New scans no longer discard the open suggestions of the previous scan. A suggestion is only retired when its target was rated again or its anchor disappeared from the text.
* No second suggestion for a pair that is already linked. New suggestions are limited to one per source-target pair; existing links within your configured limit stay valid.
* Technical cleanups never remove rejected suggestions and are recorded as system changes in the link history.

= 2.7.6 =

* Suggestions › "Remove invalid suggestions" deletes retired suggestions without excluding their source-target pairs, so later runs can still propose links there. Active, scheduled and paused links are left untouched; at most 500 per click.

= 2.7.5 =

* "Activate now" on a page that was edited after the suggestion no longer fails for good. If the anchor still stands in the same words, the suggestion is refreshed and activated; otherwise it is marked invalid and the page is queued for a new analysis.
* Invalid suggestions no longer block their source-target pair, so a new crawl can propose a fresh anchor there. A suggestion found again after a failed manual attempt becomes a suggestion again.
* Failed activations explain what happened in the editor's language instead of showing an English diagnostic.

= 2.7.4 =

* Translations load from `init` again: provider help texts and the task label were translated during boot, which WordPress 6.7+ reported as "translation loading triggered too early" on every request. Settings, routes and link data are unchanged.

= 2.7.3 =

* Bundle canonical AI Kit 1.17.0 with schema 6 and complete shared catalogs. Existing model routes, link engine and default-off paragraph comparison remain unchanged.

= 2.7.1 =

* Evidence sources are limited to supplied keys; exact original quote IDs prevent rewritten citations.
* More literal anchor choices for paragraph comparisons, independent review inputs and bounded field diagnostics.
* Fix a strategy preset PHP warning. Paragraph results remain comparison-only and off by default.

= 2.7.0 =
* Bundles Schall AI Kit 1.16.0: the Activity view lists only circuit breakers that currently protect a route and removes those of unused routes daily; the shared AI provider mask names unreadable stored keys in every product. No settings, content, links or queue data change.

= 2.6.2 =
* License: after new security keys in wp-config.php the stored installation token can no longer be decrypted. The License tab now says so and asks to activate the license again, the Activity row waits with the same advice, and the new activation is no longer rejected against the proofs of the unusable state.

= 2.6.1 =
* Activity view: an activated license whose check is not scheduled no longer shows as ready, and an expired offline proof shows as waiting with a neutral sentence instead of blocked.

= 2.6.0 =
* Reports queue, full scan, analysis and suggestions, translated links, publishing, model availability and license check to the shared Activity view and the admin bar, with a reason for every waiting or blocked state.
* Adds content-free daily counters per worker run for the activity history; the existing worker record stays the source of "last run".
* Bundles Schall AI Kit 1.15.0; no settings, content, links or queue data change and the update starts no work.

= 2.5.0 =
* Bundled Schall AI Kit 1.14.0 and replaced the AI provider forms with the shared "KI-Anbieter" mask: providers with state, one model menu, immediate changes with Undo, and a connection check with timings.
* Fixed the first-setup dead end where the connection test needed a saved model before the model list could load; Local Connector models come from its heartbeat.
* Kept keys, endpoints, model catalogue, and the verified replacement product-owned; a changed route still requires a successful check before new AI work.

= 2.4.1 =
* Bundled AI Kit 1.8.0 and adopted the shared Block 11 settings shell without migrating or resetting product settings.

= 2.4.0 =
* Bundled the canonical Schall AI Kit 1.7.0 with the combined request controls, route circuit, provider-call guard, shared error classes, and content-free telemetry.
* Replaced the repeatedly evaluated 1.0.x provider mirrors with a one-time, marked migration that prevents models and catalogues from leaking between providers.
* Removed the three obsolete provider mirrors after migration while continuing to redact their names in diagnostics.
* Added MT1–MT8 as executable release regressions and preserved all content, links, suggestions, queue data, and uninstall semantics.

= 2.3.3 =
* Started SILA's outer response buffer before TranslatePress starts its translation buffer on `init`.
* Moved query-dependent request checks to the completed response, where WordPress conditional tags are reliable.
* Added a nested-buffer regression that translates the source document first and injects the ready language link afterwards.
* Preserved all provider, queue, content, suggestion, link, and language-anchor data without starting work during the update.

= 2.3.2 =
* Added the TranslatePress-filtered WordPress runtime locale for marked output chunks without an opening HTML tag.
* Added TranslatePress body-class mapping as a second document-level language source.
* Added a production-shaped regression for language selection, anchor lookup, and link injection from an HTML fragment.
* Preserved all provider, queue, content, suggestion, link, and language-anchor data without starting work during the update.

= 2.3.1 =
* Read the effective frontend language from the final translated HTML document during late link injection.
* Mapped standard HTML language tags to the exact configured TranslatePress language code.
* Added a runtime regression for translated language selection and actual frontend link injection.
* Preserved all provider, queue, content, suggestion, link, and language-anchor data without starting work during the update.

= 2.3.0 =
* Replaced the automatic 24-source forced reverse cascade with a local, capped target-impact assessment.
* Added root-run fingerprints, expiries, provider-call and reverse-source budgets, and stale-run supersession.
* Added a seven-day pair cooldown, a three-source per-run cap, and a ten-source daily reverse-analysis cap.
* Added a pre-transport provider guard and terminal `completed_budget_limited` outcome.
* Preserved unrelated suggestions during target-limited impact scans and grouped queue work by root run.

= 2.2.0 =
* Counted only actual provider calls as API requests and reported local waiting separately.
* Added content-free attempt correlation plus separate transport, contract, and domain-yield diagnostics.
* Added Retry-After-aware provider/model circuits with one half-open probe and bounded escalation.
* Applied class-specific retry limits: no automatic 401/403 retry, two retries for transient failures, and one changed malformed-JSON repair.
* Preserved existing routes and data and started no AI work during the update.

= 2.1.0 =
* Bundled Schall AI Kit 1.4.0 with custom-domain Connector support and shared schema 5.
* Required an exact DNS allowlist, E2E transport and a valid local Pro license for custom domains.
* Kept SchallConnect Cloud on the existing Provisioning Service path.
* Preserved all existing routes and data and started no AI work during the update.

= 2.0.0 =
* Bundled Schall AI Kit 1.3.0 with licensed Provisioning Service integration and shared schema 4.
* Made Local Connector eligibility depend on runtime permission without requiring current updates or support.
* Kept installation tokens transient, hidden and absent from logs.
* Kept all existing routes and data unchanged and starts no AI work during the update.

= 1.9.0 =
* Bundled Schall AI Kit 1.2.0 with E2E v1 for Local Connector chat and shared schema 4.
* Added encrypted current and transitional PSKs with coordinated rotation and heartbeat confirmation.
* Kept license and updater dependency injection free of PHP 8.5 nullable-type deprecations.
* Kept all existing routes and data unchanged and starts no AI work during the update.

= 1.8.0 =
* Bundled Schall AI Kit 1.1.0 with the optional Local Connector, protocol v1, and shared schema 3.
* Added shared Local AI setup, connector status, model discovery, and the keyless `ollama_connector` provider.
* Deferred offline connector work without consuming an attempt and blocked never-paired routes as incomplete configuration.
* Kept all existing routes and product data unchanged and started no AI work during the update.

= 1.7.1 =
* Bundled Schall AI Kit 1.0.2 without raising the minimum compatible runtime version.
* Added short interactive shared-capacity retries and execution-aware capacity guidance.
* Bundled and cooperatively loaded complete `schall-ai-kit` catalogs for all supported interface locales.
* Preserved background attempt-neutrality and all existing product data and configuration.

= 1.7.0 =
* Replaced all product-local provider HTTP stacks with the bundled Schall AI Kit 1.0.
* Added one version-selected AI Kit runtime and account-aware provider capacity shared across Schall plugins.
* Kept every package standalone and preserved existing settings, credentials, queue contexts, links, anchors, and usage history.
* Deferred work without consuming a retry when shared background capacity is busy.

= 1.6.4 =

Adds conservative provider model monitoring, exact model-removal detection, and an opt-in verified replacement for future runs. Existing queued runs remain pinned and are paused together if their recorded model is removed.

= 1.6.3 =

Prevents the one-time dependency recovery from duplicating an unfinished link-scan continuation across plugin-version AI contexts, and archives only the redundant pending side of that pair on existing 1.6.2 installations.

= 1.6.2 =

Adds accurate per-language coverage for active links, retry-neutral dependency waits, stale-analysis protection, targeted recovery of historical dependency failures, and a resumable active-language rebuild in source batches of ten.

= 1.6.1 =

Moves license management to the shared Settings > Schall AI mask, including safe redirects for old License bookmarks and shared-tab returns after license actions.

= 1.6.0 =

Adds versioned Schall SEO Suite hooks for target-oriented, review-only link requests, expiring target priorities, and live link events. Requested links are never activated automatically.

= 1.5.7 =

* Moved link injection behind all translation processing and removed frontend queue creation.
* Added content-hash-gated saves, explicit-only language repair, persisted queue provenance, and a guard against overlapping full runs.
* Added stable missing-anchor fingerprints and regression tests that enforce zero translation requests caused by linking.

= 1.5.6 =

* Made TranslatePress language-anchor resolution strictly read-only.
* Removed direct translation calls, translated-page loopback requests, and capture mode.
* Restricted anchor selection to completed dictionary text and added release-blocking regression checks.

= 1.5.0 =

* Added product-scoped private update discovery through WordPress' native update process.
* Required separate service authorization and offline release signatures for every offered update.
* Kept installation tokens out of URLs and update transients and disabled package redirects.
* Verified hash, sizes, file count, root, slug, version, paths, symlinks, secret files, and compression ratio locally before installation.
* Added secure update-channel status while preserving all existing data, links, queued work, and grandfathered runtime access.

= 1.4.0 =

* Added license activation, explicit validation, and server-confirmed site deactivation.
* Added separate runtime, update, and support capabilities plus permanent signed version grants.
* Encrypted installation tokens under a dedicated context and never stored the full customer license key.
* Added strict locally trusted RS256 proof validation with product, installation, activation, nonce, time, and monotonic-state binding.
* Added randomized daily validation and a bounded 14-day offline service-state window without frontend network calls.
* Preserved eligible paid versions after normal expiry and all grandfathered full functionality independently of the license server.

= 1.3.5 =

* Added transparent starting profiles for editorial magazines, corporate websites, and shops/product pages.
* Limited every preset to documented density, quality-review, fallback, and rollout values.
* Showed all affected values before applying a preset and guarded application with confirmation plus a server-side allowlist.
* Kept provider configuration, content types, individual target strategies, existing data, links, and queued-run settings unchanged.
* Forced automatic publishing off after applying any preset and preserved the frozen link engine and AI contract.

= 1.3.4 =

* Made all meaningful Content columns sortable while preserving filters, pagination, and action redirects.
* Added a versioned, provider-aware JSON export for portable editorial and rollout settings.
* Added a size-limited, schema-validated settings import that preserves credentials, endpoints, site data, links, and queued run configurations.
* Forced automatic publishing off after every import and started no background work.
* Recorded the confirmed Paddle annual tiers and optional Lifetime model in the existing reusable license-service architecture.
* Preserved the frozen link engine and AI contract.

= 1.3.3 =

* Added completed, completed-with-notes, and incomplete states based on terminal diagnostic events.
* Added batch overview totals and a seven-stage conversion funnel with step rates.
* Grouped rejection and no-result reasons and exposed stable language-independent support codes.
* Included technical-note totals and support codes in batch Markdown exports.
* Preserved existing data, queued work, active links, and the unchanged link engine and AI contract.

= 1.3.2 =

* Added API usage views for 24 hours, 7 days, 30 days, and the complete recorded history.
* Recorded provider/model, request type, status, response time, and provider-reported input/output/total tokens.
* Normalized usage metadata from Ollama, OpenAI, Anthropic, and OpenAI-compatible responses.
* Stored no prompts, article text, response content, endpoints, or credentials in usage history.
* Preserved all existing data, links, queued work, and the unchanged AI contract.

= 1.3.1 =

* Added a four-step Setup assistant for system, provider/model, content, and diagnostic readiness.
* Recognized existing model discovery and completed work on upgraded installations.
* Stored connection-test status as a non-secret configuration fingerprint and invalidated it after relevant provider changes.
* Kept the assistant read-only until the user explicitly chooses an action.
* Added German/French translations and release checks without changing existing data, links, queued work, or the AI contract.

= 1.3.0 =

* Added a durable, grouped history for plugin link changes.
* Added safe group rollback that only pauses active or scheduled links and preserves content, analyses, suggestions, and language anchors.
* Imported pre-existing active links as a non-revertible baseline without changing them.
* Documented Paddle Billing and the separate license-service boundary for the future Pro module.
* Kept the AI contract unchanged and started no crawl, reindex, or suggestion rebuild.

= 1.2.0 =

* Added a 20-content Demo workspace and an unlimited grandfathered edition for existing installations.
* Added a separate Pro entitlement boundary without changing the calibrated AI link engine.
* Existing active links remain rendered when a Pro entitlement is inactive or expired.
* Added workspace filters, bulk actions, status displays, queue enforcement, and release checks.

= 1.1.7 =

* Added a dependency-free automated release gate for versions, PHP structure, packaging, translations, providers, queue behavior, security and uninstall safety.
* Added reviewed fingerprints for all link-engine files so accidental changes to candidates, anchors, quality decisions or rendering fail before release.
* Added optional PHP runtime smoke tests for settings hashes, quality thresholds, quotas, target weights, markers, extraction, rendering, JSON decoding and encryption.
* Replaced the old test protocol with the current consolidated release and WordPress acceptance procedure.
* Repaired obsolete `find_opportunities` queue rows by restarting them through the supported current pipeline.
* Kept AI prompts, schemas, quality behavior and all existing plugin data unchanged.

= 1.1.6 =

* Made concurrent job claiming retry-safe and moved stale-lock recovery to once per worker request.
* Added conservative adaptive throughput of up to two fast AI stages in normal cron runs and up to three in longer manual runs.
* Added a distinct ten-second continuation event when due work remains, while retaining the regular minute schedule as a fallback.
* Added database indexes and bounded cleanup of completed or cancelled queue records older than 30 days.
* Added due-job, throughput, oldest-job, worker-duration, and next-cron information to the Dashboard and Queue page.
* Kept AI prompts, schemas, link-quality logic, index data, suggestions, active links, diagnostics, and language anchors unchanged.

= 1.1.5 =

* Pinned every non-secret runtime setting across the complete queued AI pipeline, in addition to provider and model.
* Added deterministic configuration hashes plus plugin and AI prompt/schema contract versions to queued jobs and diagnostics.
* Kept jobs with different configurations, plugin versions, or AI contracts separate during queue deduplication.
* Made diagnostic views and exports report the original run configuration instead of later current settings.
* Added a non-destructive migration for unfinished AI jobs; no index, suggestions, links, credentials, or language anchors are removed.

= 1.1.4 =

* Replaced the temporary final-HTML translation bridge with direct WordPress gettext calls at every administration output location.
* Regenerated and recompiled the complete German and French catalogs, including plurals, attributes, notices, queue labels, diagnostics, and editor meta-box text.
* Changed newly extracted context types to language-neutral codes while retaining display compatibility for existing German-coded records.
* Kept internal queue and diagnostic status codes language-neutral and translated them only for presentation.
* Documented the planned additional UI and documentation languages: Dutch, Spanish, Italian, Portuguese, Polish, Czech, Russian, and Turkish.

= 1.1.3 =

* Pinned provider and model to each queued AI run and inherited that context across all follow-up jobs.
* Prevented a settings change from switching an already queued run to another provider or model midway through processing.
* Kept API keys and endpoints out of queue payloads; credentials remain exclusively in provider settings.
* Added provider/model visibility to the queue and made diagnostic reports show the engines actually used by the run.
* Added a non-destructive migration for unfinished AI jobs.

= 1.1.2 =

* Replaced the filtered model datalist with an explicit dropdown showing every discovered provider model.
* Retained a synchronized free-text field for manually entered model IDs.

= 1.1.1 =

* Provider activation is separated from provider configuration, preventing cross-provider overwrites.
* Saving settings no longer performs an implicit remote model request.
* Connection testing now verifies a real structured response from the selected model.
* Manually entered model IDs remain selected when absent from a provider's model listing.
* OpenAI strict JSON Schemas are complete and Responses API requests use `store=false`.
* Existing index data, suggestions, active links, diagnostics and TranslatePress anchors remain unchanged.

= 1.1.0 =

* English canonical UI and model prompts; bundled German and French WordPress gettext catalogs.
* Provider-independent AI adapter layer.
* Ollama Cloud, Ollama Local / Custom, OpenAI, Anthropic and DeepSeek; exactly one provider/model active per run.
* Separate endpoint, credentials, model choice and model cache for every provider.
* Automatic migration of existing 1.0.x Ollama Cloud settings without rebuilding the semantic index or changing links.
* Cloud privacy notice and server-side localhost warning for local Ollama.
* Calibrated 1.0.18 link-quality and strategic-target logic remains unchanged.

= 1.0.18 =

* Zielstrategien pro Inhalt: Normal, Wichtig, Produkt / Leistung oder als Linkziel ausgeschlossen.
* Strategische Ziele erhalten nur bei echter Relevanz einen weichen Prioritätsbonus; Qualitätsprüfung bleibt unverändert.
* Inhaltsliste mit Zielstrategie-Filter, Mehrfachauswahl und Bulk-Aktionen.
* Gemeinsame Diagnoseserien für bis zu 10 markierte Inhalte inklusive Sammelauswertung und Markdown-Export.
* Vorschlagsliste kennzeichnet strategische Zielseiten.

= 1.0.17 =

* Redaktioneller Mittelweg für manuell prüfbare Vorschläge; Automatik bleibt streng.
* Gewichtung S 30 %, A 30 %, K 25 %, N 15 % und weichere Einzeluntergrenzen für Vorschläge.
* Qualitäts-Prompt trennt die Kriterien und vermeidet Mehrfachabzüge.
* Diagnose unterscheidet redaktionell, Automatik-Qualität und abgelehnt.

= 1.0.16 =

* Diagnosegestützte Qualitätsoptimierung: natürlichkeitsgefilterte 2–5-Wort-Anker statt syntaktisch gebrochener n-Gramme.
* Listen/FAQ ohne pauschalen Qualitätsmalus; Tabellen bleiben standardmäßig ausgeschaltet.
* Vorschlagsqualität nutzt gewichteten Gesamtwert plus harte Untergrenzen, Automatik bleibt mit zusätzlichen S/A/K/N-Mindestwerten streng.
* Bereits belegte Anker werden vor Cloud-Aufrufen aus Phrase-Menüs entfernt.
* Whole-article-Zielbewertung erhält eine Recall-Marge, damit gute lokale Absatztreffer nicht zu früh verloren gehen.
* Leere search_terms-Felder werden lokal aus Themen und Keywords repariert, ohne erneute Ollama-Analyse.

= 1.0.15 =
* Diagnoseexport als Markdown-Datei pro Diagnoselauf.
* Export enthält Pipeline-Zahlen, Qualitätsmatrix S/A/K/N, Quellprofil, relevante Einstellungen, Queue-Jobs und vollständige Diagnoseereignisse.
* API-Schlüssel, Authentifizierungsdaten, Cookies und andere Geheimnisse werden aus dem Export entfernt.
* Diagnoseansicht zeigt zusätzlich eine Qualitätsmatrix mit schwächstem Kriterium je Kandidat.

= 1.0.14 =
* Qualitätsprüfung verarbeitet jeden Linkkandidaten in einem eigenen Queue-Job mit kleinem statischem Pflichtschema.
* PHP entscheidet deterministisch anhand der vier S/A/K/N-Werte; keine leere Bulk-Review-Liste mehr.
* Kompakter Retry für unvollständige Einzelbewertungen.
* Strengere Bewertung von syntaktisch unvollständigen oder isoliert unverständlichen Linkankern.
* Bestehende Vorschläge werden ebenfalls einzeln neu bewertet.
* Finalisierung wartet auf alle Einzel-Reviews; Warteschlange und Diagnose zeigen die neue Stufe separat.

= 1.0.13 =
* Ankersuche verarbeitet jedes fachlich ausgewählte Ziel in einem eigenen Queue-Job statt alle Ziele in einem tief verschachtelten Structured-Output-Schema zu bündeln.
* Pro Ziel verwendet das Modell nur noch ein kleines statisches Schema mit `candidate_id`, `anchor_score` und `reason`.
* Ein kompakter Einziel-Retry mit den stärksten zwölf Phrasen fängt ungewöhnliche Modellantworten ab.
* Noch vorhandene 1.0.12-Mehrzieljobs werden beim erneuten Versuch automatisch in unabhängige Zieljobs aufgeteilt.
* Die Qualitätsstufe wartet nun auch auf fehlgeschlagene Ankerjobs und kann einen Lauf nicht mehr vorzeitig als Null-Ergebnis abschließen.
* Neue Diagnosetests räumen veraltete fehlgeschlagene Pipeline-Jobs desselben Inhalts auf.
* Kein neuer Crawl und keine erneute semantische Indexierung beim Update.

= 1.0.12 =
* Ankersuche verwendet keine vom Modell formulierten Textstellen mehr.
* PHP extrahiert wörtlich vorhandene 2–5-Wort-Phrasen aus den echten redaktionellen Quellblöcken.
* Das Modell darf pro Ziel ausschließlich eine vorgegebene Phrase-ID oder `none` auswählen; erfundene oder leicht umformulierte Anker sind strukturell unmöglich.
* Dynamisches Pflichtschema erzwingt eine Entscheidung für jedes fachlich ausgewählte Ziel.
* Lokale breite Phrase-Rangfolge kombiniert Ziel-Titel, Zusammenfassung, Themen, Keywords, Suchphrasen und Zielbegründung, ohne die spätere KI-Qualitätsprüfung zu ersetzen.
* Diagnose zeigt pro Ziel die tatsächlich angebotenen wörtlichen Phrase-Kandidaten und die Modellentscheidung.
* Bestehender KI-Index, Vorschläge, aktive Links und TranslatePress-Anker bleiben unverändert.

= 1.0.11 =
* Zielbewertung nutzt ein dynamisches JSON-Schema mit verpflichtendem Schlüssel für jede vorausgewählte Ziel-ID.
* Eine leere `ratings`-Sammlung ist strukturell nicht mehr zulässig.
* Fehlende Bewertungen werden nicht mehr stillschweigend als 0 behandelt.
* Falls ein Backend trotz Schema einzelne Pflichtziele auslässt, werden nur diese in kleinen Pflicht-Schema-Batches erneut bewertet; bleibt die Antwort unvollständig, wird der Job sichtbar als Fehler behandelt.
* Diagnose protokolliert Schemafehler und vollständige Zielbewertungen getrennt.


= 1.0.10 =
* Zweistufige Linksuche: zuerst fachliche Zielbewertung, danach separate Ankersuche.
* Jedes lokal vorausgewählte Ziel wird vom Modell mit 0–100 bewertet; keine freiwillig leere Trefferliste mehr.
* Neue getrennte Zielscore-Tabelle und erweiterte Diagnoseansicht.
* 2–5-Wort-Anker werden erst für die besten fachlichen Ziele im Originaltext gesucht.
* Bestehende Vorschläge, aktive Links, KI-Index und TranslatePress-Anker bleiben beim Update erhalten.

= 1.0.9 =
* Neuer Diagnosebereich für Einzeltests der Linksuche ohne erneuten Gesamt-Crawl.
* Pro Diagnoselauf sichtbare Modell-Rohkandidaten, PHP-Filter, Qualitätsprüfung und Finalisierung.
* Rohantworten, Quelltextausschnitte und konkrete Verwerfungsgründe werden intern nachvollziehbar.
* Einzeltest schützt vor parallelen Linkjobs desselben Inhalts; aktive Links bleiben unangetastet.

= 1.0.8 =
* Schnellere und transparentere zweistufige Linksuche.
* Großzügigere Kandidatensuche bei weiterhin strenger Qualitätsprüfung.
* Vollständiger Quellabsatz und Zielthemen im Qualitätsreview.
* Sofortige lokale Finalisierung nach erfolgreichem Review.
* Live-Sperre gegen bereits manuell vorhandene Links zum selben Ziel.
* Pipeline-Fortschritt in Warteschlange und Vorschlagsansicht.

= 1.0.7 =
* Lokaler Sicherheits-Fallback ist standardmäßig ausgeschaltet und als Herkunft filterbar.
* Zweiter, strenger KI-Qualitätsdurchgang bewertet Themenpassung, Ankerqualität, Kontext und Lesermehrwert getrennt.
* Neue Vorschläge bestehen nur, wenn jedes Qualitätskriterium die eingestellte Mindestgrenze erreicht.
* Anker werden standardmäßig auf 2 bis 5 Wörter begrenzt; generische Einzelwörter werden technisch verworfen.
* Eindeutige Marken, Eigennamen, Produkte und Abkürzungen dürfen weiterhin als Einzelwort-Anker verwendet werden.
* Tabellen sind standardmäßig als automatische Linkquelle ausgeschaltet; Listen werden strenger bewertet.
* Bestehende Vorschläge lassen sich mit dem aktuell ausgewählten Ollama-Modell neu bewerten, ohne den semantischen KI-Index neu aufzubauen.
* Filter für Herkunft und Qualitätsstatus sowie sichtbare Teilbewertungen S/A/K/N.
* Nicht aktive Fallbacks und nicht bestandene Vorschläge können gezielt bereinigt werden; aktive Links werden nie ungefragt entfernt.

= 1.0.6 =
* Fehlende TranslatePress-Sprachanker lassen sich je aktivem Link gezielt erneut anstoßen.
* Globaler Reparaturlauf bleibt auf aktive Links beschränkt und erzeugt keine Endlosschleifen.
* Vorschlagsliste zeigt einen Textauszug um die tatsächliche Ankerstelle.
* Anker-Kontext kennzeichnet Absatz, Liste, Tabelle, Zitat, Bildunterschrift oder Überschrift.
* Überschriften werden weiterhin nicht als automatische Linkstelle zugelassen; Tabellenzellen werden sichtbar gekennzeichnet.


= 1.0.5 =
* TranslatePress-Sprachanker werden nur noch für aktive Links ermittelt.
* Übersetzte Inhalte werden bevorzugt über die offizielle trp_translate()-Funktion aufgelöst.
* TranslatePress-eigene Anchor-Übersetzung dient als schneller Matching-Hinweis; LLM nur noch als Fallback.
* Alte Sprachjobs für geplante Links werden beim Update bereinigt.
* Vorschläge: Suche und sortierbare Spalten.
* Warteschlange: sortierbare Spalten und schnellerer Sprachjob-Durchsatz.

= 1.0.4 =

* TranslatePress-Sprachanker werden zuerst über den strukturell entsprechenden Quell-/Zielabsatz aufgelöst und erst danach durch das Sprachmodell bestimmt.
* Bereits erfolglos geprüfte Übersetzungsanker werden beim Update erneut verarbeitet.
* Warteschlange mit Gesamtzahl, Statussummen, Filterung und Paginierung.
* Vorschläge mit Gesamtzahl, Paginierung, Mehrfachauswahl und vollständiger Löschfunktion.
* Verbesserte Queue-Deduplizierung verhindert doppelte Sprachjobs.


= 1.0.2 =

* Linksuche auf direkte Quellabschnitt-zu-Zielkatalog-Bewertung umgestellt; der zweite Cloud-Matching-Lauf entfällt.
* Breiter kompakter Zielkatalog verhindert, dass gute Ziele durch eine zu enge Wortüberschneidung vorab verworfen werden.
* Modell-Anker werden konservativ auf den exakten Originaltext zurückgeführt; Großschreibung, typografische Bindestriche und Anführungszeichen dürfen abweichen.
* Lokaler Sicherheits-Fallback erzeugt bei zu konservativen Modellantworten nur wörtlich belegte thematische Treffer.
* Lange Inhalte werden mit größeren Abschnitten verarbeitet, wodurch deutlich weniger Cloud-Aufrufe nötig sind.
* Fortschrittsanzeige zählt jetzt tatsächlich fertig geprüfte Inhalte statt nur angelegte Linkjobs.
* Ein Null-Ergebnis macht vorhandene Vorschläge nicht mehr automatisch ungültig.
* Dieselbe robuste Ankerauflösung wird auch für TranslatePress-Sprachfassungen verwendet.

= 1.0.1 =

* Linkfinder auf zweistufige Linkgelegenheiten- und Zielkatalog-Logik umgestellt.
* Lange Artikel werden vollständig abschnittsweise geprüft statt nur stichprobenartig.
* Neuer Button „Linkvorschläge neu ermitteln“ verwendet den vorhandenen KI-Index ohne erneuten Voll-Crawl.
* Diagnosewerte für Linkgelegenheiten, geprüfte Zielkandidaten und gültige Vorschläge.
* Separate Mindest-Relevanz für redaktionelle Vorschläge.
* Datenbank-Upgrade erhält vorhandene Analysen, Einstellungen und Vorschläge.

= 1.0.0 =

* Erstveröffentlichung.
