Uh oh!
There was an error while loading. Please reload this page.
docs(spec): strip the internal issue-ids projected into the published skill catalog, and drop the gate exemption that hid them - #12097
Conversation
… skill catalog Fourteen `#NNNN` references survived the 2026-08-23 strip of the published skill corpus because they were never authored in `skills/**`: they are projected there from `.describe()` / TSDoc text in `packages/spec/src/**` by `gen:skill-refs` and `gen:react-blocks`. Six source sites are rewritten to keep the teaching without the citation, and the artifacts are regenerated. The doc-authoring gate's path exemption for the generated artifacts is dropped in the same change — it existed only because those files still carried projected ids, and an exemption over a clean surface is where the next regeneration would smuggle one back in. Its self-test now pins the generated artifacts as IN scope and reds on an id planted in one. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NDGG54XF5gbTLdQzCtnaVV
📓 Docs Drift Check
What this run could not see
Coarse fallback — 126 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
os-zhuang
commented
Aug 25, 2026
Merging on the maintainer's explicit instruction, 2026-08-25: 「你帮我合并」 (covering the reviewed governed-draft group: #11829, #11934, this PR). The maintainer reviewed the per-PR verdict summary before instructing; this merge is the acceptance act executed on their behalf. Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#11930
Fourteen internal
#NNNNreferences survived the 2026-08-23 strip of the published skill corpus. None of them was authored inskills/**: they are projected there from.describe()/ TSDoc text inpackages/spec/src/**bygen:skill-refsandgen:react-blocks, so the corpus-side cleanup could not reach them and a regeneration would have put them straight back. This is the source-layer half of that ruling, and the gate change that stops the round trip.Premise, re-verified on
origin/mainMeasured at
f7b25c5before any edit: exactly 14 hits for#[0-9]{3,5}not followed by a word character, matching the filing's per-file counts exactly. Three further hits of a naive#[0-9]{3,5}scan are the CSS hex colours#6366f1,#4169E1and#3498db— the same false-positive family the id rule's lookahead was written to exclude.The filing's guess at which source files these came from was partly wrong, and the artifacts were used as the acceptance set instead. The real sources, reverse-looked-up from each of the 14 sites:
objectstack-{data,platform}/references/_index.md—#4410×4data/driver/common.zod.ts,data/driver/config-registry.zod.tsobjectstack-{data,platform}/references/_index.md—#6345×2data/driver/turso.zod.tsobjectstack-automation/references/_index.md—#4661shared/retry-policy.zod.tsobjectstack-i18n/references/_index.md—#4001system/translation.zod.tsobjectstack-ui/references/react-blocks.md+contracts/react-blocks.contract.json—#11284×4,#4413×2ui/react-blocks.ts(theListView.objectName/ListView.viewTypedeprecation notes and theBlocktag summary)The
_index.mdsummary is the first line of a file's first JSDoc block (extractDescriptioninbuild-skill-references.ts), which is why stripping one id fromshared/retry-policy.zod.tsmeant rewriting its opening sentence rather than deleting three characters: the citation ran across the line break and left a dangling)behind.What changed
Six source sites rewritten to say the same thing without the citation, keeping the teaching per the standing ruling of 2026-08-12, verbatim and untranslated: 「处理 issue 时犯的错应该总结成经验,保留 issue id没有意义」. Then
gen:skill-refs,gen:react-blocksandgen:docsregenerated. Result: 0 internal issue-id references anywhere underskills/**.Deeper TSDoc in the same files still carries internal ids — those lines project nowhere customer-facing, and widening to them is a different decision than the one this card inherits.
The gate exemption is removed, not narrowed
GENERATED_SKILL_ARTIFACTSinscripts/check-doc-authoring.mjsexemptedreferences/_index.mdandreferences/react-blocks.mdby path, for a stated reason that no longer holds: it existed because those files still carried projected ids, and reding a file whose own header says "do not edit" pointed the remedy at the wrong repo layer. With the sources clean the exemption guarded a clean surface — and that is precisely where the next regeneration would smuggle one back in, past the gate that exists to stop it.So the exemption is deleted rather than narrowed, and the "wrong repo layer" objection is answered where it actually bites — in the failure text, which now tells an author who hits a red on an auto-generated file to strip the id at the spec source and regenerate, never to hand-edit the artifact.
Its self-test is rewritten rather than patched: the two cases that pinned "the generated artifact is exempt" asserted the behaviour being removed, so they now pin the artifacts as in scope, and a new case plants an id in a generated
_index.mdand asserts the scan reds on it and names that file. Listing a file only proves collection; the plant proves it is read.This aligns with the gate PR #11931 landed. No second gate was added, and the spec-source-side ban the filing floats as step 3 is deliberately not implemented here — it would be a second gate over a different population, which is a decision this card does not carry.
Line budgets (governed surface)
skills/**is loaded whole into customer context windows, so both readings are reported. Lines are the budget; tokens areceil(utf8 bytes / 4), the sibling ratchet's unit.Every changed artifact, whole file:
objectstack-automation/references/_index.mdobjectstack-data/references/_index.mdobjectstack-i18n/references/_index.mdobjectstack-platform/references/_index.mdobjectstack-ui/contracts/react-blocks.contract.jsonobjectstack-ui/references/react-blocks.mdWhole package — every
SKILL.mdin the published catalog: 10505 → 10505 lines (net 0), 117716 → 117716 tokens (net 0); noSKILL.mdis touched. Wholeskills/tree, every file: 17849 → 17849 lines (net 0), 187951 → 187922 tokens (net −29).Against the dispatched budgets:
skills/**net 0 lines (budget ≤ +0) ·packages/spec/srcnet +1 (budget ≤ +30) ·scripts/net +10 (budget ≤ +10). Thescripts/figure needed a deliberate trim — the first draft of the comment and self-test came to +16, and it was compressed to fit rather than the budget being raised.Declared deviation — two source files outside the dispatched surface
The dispatched file surface named
packages/spec/src/{conversions,data,ui,automation,ai,api}. Two of the six real sources are not in those directories:packages/spec/src/shared/retry-policy.zod.tspackages/spec/src/system/translation.zod.tsThe directory list was derived from the filing's source attribution, which the reverse look-up above disproves. The acceptance set is the 14 artifact sites, and leaving 2 of the 14 standing because a guess named the wrong directory would deliver a card that does not close. Both edits are the same defect class, the same mechanical rewrite, the same gate families, and no other in-flight claim holds either file (checked against the open-PR list). Recorded here rather than taken silently.
content/docs/references/data/driver-common.mdxanddriver-turso.mdxalso change — that is the same source edit reaching the docs site throughbuild-docs.ts, and the full regen set was called for at dispatch.One consequence left deliberately untouched
scripts/check-ratchet-remedy-authority.mjscarries awhystring forcheck-doc-authoring.mjsthat namesGENERATED_SKILL_ARTIFACTSamong that file's declarations. This PR removes that constant. The gate stays green — it was run, and its verdict rests on the other declarations named there — but the prose will name a symbol that no longer exists once this lands. PR #12061 is in flight on exactly that file and is marked blocked pending a recorded verdict, so racing a one-clause edit into it here would be worse than leaving it. Tracked separately; the repair should ride whichever of the two PRs lands second.Verification
Full gate list re-derived from the real change set with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(the script reads its own merge-base diff), which returned 44 families once the changeset existed — more than the 14 the dispatch named. All 44 run green atd1a56ba, together with the regeneration-freshness set (check:skill-refs,check:react-blocks,check:docs,check:generated,check:skill-docs,check:authorable-surface,check:api-surface),check-doc-authoring --self-test,check-ratchet-remedy-authority,check-skills-token-ratchet,check:nul-bytes, and@objectstack/spectypecheck.packages/spec's own suite:pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2→Test Files 425 passed (425)/Tests 11321 passed (11321).Two gates first refused with
PREREQUISITE NOT MET — the workspace package is not builtand were re-run green afterpnpm --filter '@objectstack/lint...' build; their own text says "Nothing was measured", so the first result was not a finding.check:react-declaration-parityrefuses withMANIFEST is not set— it needs an objectui manifest dump and a browser, is not in the derived family list for this card, and exits before reading the diff.check-dev-prereqs.mjsreports 66 of 67 workspace packages unbuilt: it measures the container's build state, and this diff adds no package, edits nopackage.jsonand produces no build output, so it cannot move that verdict either way.Repo-wide
pnpm lintwas not run; CI owns that farm run.Filed out of scope
build-skill-references.tsstill picks the first JSDoc block anywhere in the file — the defectbuild-docs.tsfixed, publishing a private constant's comment to customers #12094 —build-skill-references.tsstill selects the first JSDoc block anywhere in the file as a file's published description, the ordering defectbuild-docs.tsalready fixed by moving tofindModuleDocBlock(). Live victim:system/translation.zod.ts, whose skill-reference entry describes a privateTRANSLATION_HISTORYconstant rather than the Translation protocol. Found here because that entry is one of the 14 sites; stripping its id does not make the sentence correct, only id-free.check-ratchet-remedy-authority's entry forcheck-doc-authoring.mjsnamesGENERATED_SKILL_ARTIFACTS, a constant that is being removed #12095 — the staleGENERATED_SKILL_ARTIFACTSmention described above.Generated by Claude Code