Uh oh!
There was an error while loading. Please reload this page.
docs(deployment): spell the tag scheme with metavariables, and teach check:docs-image-tag to see prose - #10256
Merged
Conversation
…he gate can see prose (#10229) The 17.1.0 publish moved all eight anchored image pins and left five prose version claims at 17.0.0, one of which became false: self-hosting.mdx said the rolling 17.0 / 17 / latest tags "move with every stable publish", but 17.0 froze the moment 17.1.0 shipped. check:docs-image-tag was green throughout -- it asserts the anchored pins agree with packages/cli, which is not the same statement as the docs agreeing with it. Prose now uses the X.Y.Z / X.Y / X / latest metavariables that docker/README.md's tag table has always used -- the one tag-scheme surface here that never drifted -- so the claims cannot go stale at a publish. check-docs-image-tag grows a PROSE limb asserting that absence over enumerated, anchored claim sites. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
…not a verdict The same summarise() line prints under a failing run, where "read as version-free" contradicted the PROSE-VERSION findings listed directly above it. Observed during reverse-verification against origin/main's corpus. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
…er argues from The header's "~30 sentences of the form 'removed in @objectstack/spec 17.0.0'" is out of date: the reference pages carry 92 (95 across content/docs/**, in 22 files). The error runs in the reassuring direction — the hazard the enumeration exists to avoid grew — but a gate that argues from a number should not argue from a stale one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
This was referenced Aug 20, 2026
os-zhuang
marked this pull request as ready for review
August 20, 2026 15:14
Uh oh!
There was an error while loading. Please reload this page.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#10229
The 17.1.0 publish moved all eight anchored image pins and left the prose behind.
check:docs-image-tagwas green throughout, because it asserts the anchored pins agree withpackages/cli— which 17.1.0 proved is not the same statement as the docs agree withpackages/cli.The census is five claims in three files, not three in two
The card called its list "a floor, not a census" and it was right. Sweeping the two prose shapes across the repo found two more, both in
content/docs/upgrading.mdx— a file the gate already enumerates as a surface, and reads on every run:SURFACES?self-hosting.mdx:59self-hosting.mdx:60index.mdx:14release train (17.0.0)index.mdx:42upgrading.mdx:11release train (17.0.0)upgrading.mdx:36docker/README.mdwas swept too and is clean — see below, that turns out to be the whole design.The two
upgrading.mdxclaims are repaired in this PR under the bounded in-place-fix exemption: same defect class (verbatim-identical sentences), correct form pinned by the sibling repairs landing here, no competing claim on the file across all 15 open PRs, and the same gate family with no new verification surface. They are also coupled — the new gate limb reddens on them, so the fix could not have been deferred without landing a red gate.The false claim is reworded, not bumped
self-hosting.mdx:60said the rolling17.0/17/latesttags "move with every stable publish".17.0froze on 2026-08-20. Bumping the number reproduces the defect at 17.2.0, because the sentence names which tags roll and that set changes shape at every minor. It now reads:Verified against
.github/workflows/docker-publish.yml'sdocker/metadata-actiontag list ({{version}},{{major}}.{{minor}},{{major}}, andlatestgated on!contains(version, '-')). It names no rolling tag whose identity changes, so it stays true at 17.2.0 and after.Why metavariables, and why that is the gate design too
docker/README.md's tag table has documented this same scheme asX.Y.Z/X.Y,X/latestall along, and it is the one tag-scheme surface in this corpus that has never drifted — it is already this gate'sLIVE_CONTROLfor exactly that metavariable. The three sentences that drifted are the three that spelled the scheme with a concrete example. So the repair is to adopt the spelling that already works, and the new limb asserts that absence.That choice is what makes the limb free: it demands prose carry no concrete version, so a publish cannot redden it — only an author reintroducing a literal can.
Why not the rule the card suggested
The card proposed keying on "a version literal in the same file as an anchored pin, disagreeing with it", on the reasoning that the historical sentences "live in files with no anchored pin". That reasoning has two counterexamples in the corpus today, both in files that do carry anchored pins:
content/docs/upgrading.mdx's upgrade-checklist table — seven rows,v17.0.0…v9.0.0— in the same file as the pin on line 41.self-hosting.mdx'shotcrm-2.2.2.jsonartifact URL andindex.mdx'scom.acme.crm@1.2.0: the reader's own app version, which by construction never tracks ours.The structural objection is worse than the false positives: a rule demanding prose literals track the CLI version turns the gate red on prose at every publish, and
sync-docs-image-tags.mjscannot fix prose — its rewrite is safe only because aPATTERNSmatch ends with its tag, which a sentence does not. That is this same drift rescheduled as a standing hand-fix, not removed. The gate's header now carries this argument.Evidence
Harm reproduced, on the corpus
origin/maincarries today:Red after, reverse-verified by restoring the three files to
origin/mainon top of the new gate — exit 1, fivePROSE-VERSIONfindings at exactlyself-hosting.mdx:59,index.mdx:42,index.mdx:14,upgrading.mdx:36,upgrading.mdx:11, with the pin limb still green. Files restored and confirmed byte-clean afterwards.Anti-vacuity — the leg that matters. Two live ablations, each confirmed on disk before and after:
removed in @objectstack/spec 17.0.0sentence incontent/docs/references/ui/view.mdxmutated to99.98.97;upgrading.mdx's| v17.0.0 |checklist row mutated to| v99.98.97 |— inside an enumerated surface.Gate stayed green, exit 0 on both. It does not track historical facts. The 92
removed in @objectstack/spec …sentences incontent/docs/references/**(95 acrosscontent/docs/**, in 22 files) are untouched.The
--self-testgrows from 44 to 70 assertions: positive controls forPROSE-VERSION(including the wrapped-continuation spelling that a single-line span would miss),PROSE-ANCHOR-LOST,UNKNOWN-ANCHORandMISSING-SURFACE, each paired with a clean fixture carrying all four legitimate literal shapes; plus a live control asserting every enumerated claim still matches its anchor in the real corpus.Two defects found in the gate while testing it and fixed here:
read as version-freeunder a failing run, contradicting the findings listed directly above it — it now states what was scanned, with an assertion pinning that;Gates
node scripts/pm/dispatch-gates.mjs(no path args, derived from the real diff) named 12 families. All 12 run green atb881249c, the final commit:check:cross-package-test-inputs·check:doc-anchors·check:docs-audit-scope·check:docs-image-tag·check:docs-redirects·check:published-readme-links·check:role-word·spec check:empty-state·spec check:liveness·spec check:strictness-ledger·spec check:variant-docs·node scripts/check-cross-package-test-inputs.mjsAlso ran
check:docs-image-tag-sync(35 assertions, green) — the rewriter imports this gate's exports, and the prose limb is deliberately additive so itsPATTERNScontract is untouched.No changeset: docs and a root
scripts/gate only, no published package changes —skip-changeset.content/docs/releases/**is untouched; its 17.1.0 gap is #10232 and is not addressed here.Generated by Claude Code