3.13.0
A run of releases could stop the read check running at all, silently, which left a college reading its catalog the slow way with nothing on any screen to say so.
- Added **`wp kenii store health` reports a recheck that gave up, one that ran and refused, and a queue that has been waiting too long.** It names each record type and the command that finishes it.
- Added **The Data Health screen says when part of the catalog is reading the slow way**, naming the record types still waiting, the ones the recheck gave up on, and the ones that ran and found a difference, instead of a single green state that hid all three.
- Added **The screen says how long the oldest unresolved problem has been waiting**, and how many problems a later save already put right, so a long list of old history no longer reads as a pile of failures.
- Added `ReadGate::regate_summary()` reports the recheck queue in one shape for a screen or the command line: what is pending, what gave up, what ran and refused, what passed, how old the queue is, and whether it needs a person.
- Added A give up is carried by a flag on the result rather than by the wording of its refusal. Searching the message text broke under translation, and matched an unrelated data refusal that happened to use the same words.
- Added `tests/regate-attempts.php` is a new rail, wired into CI. It proves its own subject on a site that has never recorded a verdict, rather than stopping. Every defect above has a check that goes red on its own when that fix is removed, and eight go red when the attempt count is carried forward again. It runs 31 checks on a site with real data and 30 on a bare one, where only one record type is eligible for a recheck.
- Added `tests/settled-prune.php` is a new rail, 14 checks, wired into CI. Five go red when the trim is removed.
- Added The CI rail step runs every rail even when one fails, and names every failure. One rail that stopped used to end the step and skip every rail behind it.
- Added `tests/store-recheck.php` records the note list before it creates its own test credential, so the rail no longer leaves a note behind about a record it deleted. `tests/read-gate-check.sh` measures its note baseline against the trimmed log.
- Fixed **A new release now gives every record type a fresh chance to prove itself.** When the plugin changes, Kenii re-checks that each kind of record reads correctly from its own tables before it reads from them. That check gives up after two failed background attempts, and the count was carried forward across releases, so several releases in a row pushed every record type past the limit and the check stopped running. The site kept reading from WordPress with nothing to say so. A new build now clears the count and the old refusal, and a site that had already given up is healed by the upgrade itself with nobody typing a command.
- Fixed **A second build of the same version counts as a new build.** The queue used to be keyed on the sentence shown to a person, and two builds of one version produce the same sentence, so a site that shipped twice without a version bump was never healed. It is keyed on the build itself now. A person asking for a recheck also starts over however many times they ask.
- Fixed **A check that ran and refused is reported.** Only the give-up case was counted, so a record type that ran its check, disagreed with the data and dropped back to reading from WordPress appeared in no list at all, and the screen could still say the data was healthy. That case is now named separately from a check that never ran, because it means something different.
- Fixed **A record type someone fixed by hand stops asking for attention.** Nothing cleared the stored refusal except a new build, so the warning and the screen banner carried on forever after the person had done exactly what they were told.
- Fixed **Rechecking one record type no longer silences the warning for the rest.** The queue clock was restarted by any request, so rechecking one thing reported sixteen others as freshly queued. Asking for a full recheck twice also reported the new queue as weeks old.
- Fixed **A plan of study naming a course that does not exist in its catalog year is recorded again**, along with a choice inside one and a requirement group entry. All three used to be refused outright, and when that rule moved the condition stopped writing any note, so the link was dropped and nothing said so. The entry is stored unlinked and reported, because a person has to decide what the course should be.
- Fixed **A cleared note no longer counts toward the refusal total.** A note that was already settled was still counted, so a screen could report a problem that had been fixed.
- Fixed **Settled sync notes are trimmed to a recent window of 25.** A note is settled once a later save proved the record reaches the tables, so it is history rather than a problem. Without a window the settled entries outnumber the open ones many times over and the log reads as a pile of failures. The number removed is kept as a running total, so nothing is lost from the count, and a note that is open or stuck is never trimmed. Measured on a real college's note shape: 197 notes and 46,990 bytes down to 26 notes and 6,140 bytes, with the one open note still there.