Our Task Library dashboard carries a changelog panel with one line printed under it: “Every future run appends an entry here. The changelog is the proof of recursion.” On August 1, 2026 the monthly refresh went to append its entry and found the panel held exactly one record, dated June 10. The thing built to prove the library keeps improving itself had never recorded a single run.
What the run was supposed to be
A routine monthly job: read the last month of model releases, update the operating guidance if anything changed, restamp the dates, append a changelog entry, verify.
The model half went fine and was worth doing. July 2026 moved: Opus 5 shipped on July 24 with a per-turn reasoning-effort dial — low, medium, high, xhigh — which is a new rung on the routing ladder. The old escalation was binary: the cheap model struggles, so you jump to the flagship and pay ceiling prices for everything that follows. Now there is a step in between. Raise effort before you raise model, and only reach for the top tier when raised effort has actually failed a named check.
Sonnet 5 (June 30) took over as the default for any step that chains several tool calls, pushing the smaller models back to single-shot extraction and classification where they belong. And Fable came back on July 1 after a two-and-a-half-week export-control suspension — which turned into the more useful lesson of the month. Nothing was wrong with our routing table during that outage. The model was simply gone. Any job that runs unattended at 4am now names a second engine, because a routing table with exactly one path through it is not a routing table.
Then the second half of the job would not run
Step 3 of the monthly task said the dashboard is a base64 data-URI iframe, and to rebuild it from two local files. Page 104693 contains no base64 at all.
It embeds a remote page instead. The dashboard now lives on GitHub Pages, rebuilt from the Asset Tracker, in a repo we hold no write credential for. The two local files the instruction pointed at were last touched June 10 and describe 239 tasks; the live dashboard tracks 253.
Following the documented method would have been destructive. Rebuilding from the local template would have replaced a live dashboard with a two-month-old snapshot and published the regression under the words “kept current.” The instruction was not merely stale — executing it faithfully was the failure mode. We already had this rule for one page and had not generalised it: a page a local template no longer owns must never be republished from that template.
Why nothing ever complained
There are two dates on that page. One of them was right every single day.
The “Kept current — updated <date>” badge is owned by a daily job that does hold the credentials, and it had been stamping the correct day for weeks. It sat directly above a changelog frozen in June. A visitor reading top to bottom saw a page maintained this morning. The signal that worked was louder than the signal that had died, and it was positioned above it.
That is the same failure we wrote up in the skill-pack pages that linked to nothing, in a different costume. A check that cannot fail is not a check — and a green light next to a dead one is worse than no light, because it answers the question you were about to ask.
What the audit turned up next door
Once we stopped trusting printed numbers, the download buttons did not survive either.
On July 28 we made the counts on the Skill Pack directory derive themselves from each zip, after it advertised “18 skills” for a 19-skill download. That fix was applied to the directory. It was never applied to the pages the directory links to. Every surface that prints its own count kept printing a hand-typed number, frozen at whatever the pack held the day someone wrote it.
| Surface | Button said | Zip actually ships | Off by |
|---|---|---|---|
| /dealcon | 10 skills | 19 | 9 |
| Task Library dashboard | 239 skills | 247 | 8 |
| build-agents | 239 skills | 247 | 8 |
Every surface that prints a count was wrong. Not most — all three. The DealCon page had been offering ten skills to people installing a pack that holds nineteen, which means the nine we added since were invisible to anyone deciding whether the download was worth their time.
The fix is the same one, applied one level down. A number about an artifact belongs to the artifact. The daily republish job now reads each pack’s own VERSION.txt and rewrites the button before publishing, so a button cannot drift from its zip again. The unit word is preserved; an unreadable zip leaves the number alone rather than writing a zero.
Both new checks were tested by breaking them first. We neutered the count rewrite and confirmed the suite failed with AssertionError: attribute must be bumped, then restored it and confirmed green. A test you have only ever seen pass is a test you have not yet run.
The rest of the sweep
| Found | Fixed |
|---|---|
Page 104693 embedded the dashboard twice — two elements sharing id="btlframe", so the resize handler only ever found the first and the second stayed stuck at its minimum height | Duplicate block removed; kept the newer one with wheel forwarding |
data-kept-current="2026-07-28" and "2026-07-07" sitting behind badges that both read August 1 — a machine-readable date that nothing in the codebase ever read or wrote | Bumped, and now derived from the same date object as the visible badge, so the two cannot disagree |
Month-only stamps: an eyebrow reading “Pack updates · July 2026”, and "updated": "June 2026" in the dashboard source | Converted to day + year — June 30, 2026 (the date the card’s own text describes) and August 1, 2026 |
The dead attribute deserves its own note. It had drifted for weeks and cost nothing, because no code path consumed it. That is exactly why it was dangerous: a stale machine-readable claim sitting in the markup, waiting for the first script that decides to trust it.
What we are not pretending we fixed
The dashboard’s own date and its changelog are still wrong, and still say “July 2026” where the rule has required a day since July 9. They are in a repo we cannot write. The entry that should have been appended this month is written out and staged, along with the two ways to unblock it — grant the job access to that repo, or move the provenance panel onto the WordPress page we already own, which needs no new credential and ends the dependency for good. The second is the better fix and it is the one we recommend.
Reporting it beats skipping it for a third month without saying so. The whole point of a proof-of-recursion panel is that it is falsifiable; this is what it looks like when it gets falsified.
The library, and how it keeps itself current
239 documented tasks, 247 files in the download, and the operating layer that tells an agent how to run them.
Browse the Task Library Every skill pack Why a skill is not an agent
