gate(doc-types): walk packages/NAME/README.md, with its ruled DOC_TYPE_EXEMPTIONS entries - #9996
os-try-charles wants to merge 2 commits into
Conversation
…s ruled exemptions objectui#7896's fourth leg and objectui#8115's ruled `DOC_TYPE_EXEMPTIONS` entries, in one change because the gate admits no other order: an entry whose (file, value) the walk never reaches fails as `stale-exemption`. A package README ships to npm inside that package's `files` list, and its `type` literals were read TWICE — `check-doc-snippet-types` compiles their `ts` fences, `check-doc-fence-languages` labels every fence in them — and judged by NOTHING. objectui#7115's geometry one directory over. - New leg `PACKAGE_READMES` / `packageReadmePages`, non-recursive, in the slot the two sibling walks append it in: BEFORE the root pages. - `check-doc-expression-carriage` takes the SAME leg. Its surface pin rebuilds the expected list from the imported constants and compares it against its own walk, so a leg added to the component gate alone leaves that pin green while the two surfaces diverge. `SURFACE_LABEL` names the leg. - 25 `DOC_TYPE_EXEMPTIONS` entries covering 28 sites, each naming its vocabulary and where that vocabulary is declared. Two sites of the original census are deliberately absent: they were re-classified as defects and fixed on their own cards (objectui#8114, objectui#8483). - The CLI refuses to publish a verdict when the new leg collects nothing — it is collected by walk rather than by name, so it cannot dangle, it just shrinks. - Repairs two claims this branch makes false: the ownership matrix row in `check-doc-snippet-types` and the sentence in `check-doc-fence-languages.test` that said this gate could not join the cross-gate surface pins. Co-authored-by: Claude <noreply@anthropic.com>
…k now reads `markdown-test-inputs.mjs` is the class a markdown-only pull request consults to decide whether the shard that READS that markdown runs at all. The fourth leg put every `packages/NAME/README.md` into `check:doc-types`' walk and into the carriage census that imports its surface, so both tests now read them and the ledger owed two `packages/**` entries. Over-declaring is the safe direction: objectui#8857 was a pull request changing exactly ONE package README, and its shard reported success in ten seconds having run nothing. Same entry shape `check-doc-snippet-types.test.ts` already carries for the same surface; the ledger has no `dir/*/name` form. Also drops an unnecessary regex escape the lint rule flagged. Co-authored-by: Claude <noreply@anthropic.com>
|
changeset-claim-re-read
|
|
⛔ This PR is green and mergeable, and the seat's enqueue route does not work. It needs a hand that can merge it. What is true about this PR
⇒ Nothing about the change is blocking it. What is brokenI enqueued it at 05:24Z via the only route available to this seat. The confirmation said:
⇒ The field is a working reader on this repo and this token. So #9996's
I retried once with ⛔ I have stopped at two attempts and will not make a third. ⛔ I have not approved this PR, ⛔ have not merged it, and ⛔ will not hand-merge my own PR. The likely mechanism, stated as a hypothesis and ⛔ not as a finding
⛔ I cannot confirm this: the read-only What this PR needsA merge by someone whose route works — the change itself is finished and green. Nothing here is waiting on the diff.
|
Fixes #8115
Part of #7896 — ⛔ #7896 is not addressed in full here; its acceptance is a reading the PM takes at landing.
check:doc-typesnow walks everypackages/NAME/README.md, and the ruledDOC_TYPE_EXEMPTIONSentries land with it.Why one PR — the ruling, not the card face
Triage
5582405961ruled option A;5594701696answered the follow-uppm:retriagewith reading A₁: the ruled entries land in the live table together with #7896's fourth leg, in one change. This card's own fence (⛔ do not land the leg) is overridden by that ruling. A₂ is not available: an entry whose(file, value)the walk never reaches fails asstale-exemption, so entries-first collapses into option C, which5582405961excluded as dominated.The census, re-derived — ⛔ no number inherited
Re-derived on
5585ba55a's baseedbcf1e7awith this gate's ownderiveRegistryKeys, its fence walker and itstypematcher over all 39packages/NAME/README.md:The widened gate's own first run agrees to the site: 28 findings, and its counter deltas match the standalone instrument exactly (blocks 1107 → 1503 = +396; type literals 901 → 1144 = +243).
12was corrected to8by5582405961; the gate header's26 … across 8 filesreading was anchored toc30026715and is stale too. Today it is 25 entries covering 28 sites. The 22/25 shape survives — the table is keyed by(file, value),plugin-grid'smultiplecovers 3 sites andplugin-dashboard'slinecovers 2 — only the numbers moved. A reviewer counting 28 rows against 25 correct entries would read correct work as unfinished.Net of the two predecessor cards, now completed: the
activity-timelinesite (objectui#8114) and the flow nodeactionsite (objectui#8483) are both gone from the census, and four sites the earlier reading did not carry are now in it.The falsifiable zone — the absence, proven
The claim is not "the gate is green"; it is that a mutated component
typein a package README cannot pass any more. Before the leg it passed with byte-identical counters, which is the proof the file was outside the scan population rather than judged and forgiven. Every mutation proved on disk by counting the injected and removed text, every restore bygit hash-objectequality against the HEAD blob.packages/app-shell/README.mdobject-view→object-vieeewREADME.mdgrid→griiidREADME.md:84packages/app-shell/README.md:62README.md:84The control fires in both states, so the zero above is a reading about the tree and not about a broken instrument.
The two couplings, both taken
scanDocs— the slot the two sibling walks append it in, which is what keeps the three document lists comparable element by element.check-doc-expression-carriage.mjsimports this gate's surface constants and pins its own walk as an equality against a walk rebuilt from those constants, not against this gate's actual walk — so a leg added here alone leaves that pin GREEN while the two surfaces diverge, finding(docs/gate): the root README's flagship dashboard example teachesstat-card, which nothing registers — and the root README is outside every doc gate's scan surface #7115's shape rebuilt inside the instrument written to prevent it. That census now takes the same leg throughPACKAGE_READMES/packageReadmePages, itsSURFACE_LABELnames it, and both walks read 227 documents.Ablation, on the committed state, each with on-disk and restore proof. Removing the leg from the carriage census alone — leaving this gate's leg in place, which is exactly the silent-divergence shape — turns 2 pins red (
walks exactly the document set that surface names,reaches every leg of the walk). Removing it from this gate turns 7 red. Before this change that divergence was invisible in both directions.The entries are rulings, ⛔ not a green switch
5556586208binds and the gate's own header is explicit that stuffing the table here "would bury the one real defect among 25 entries nobody read". Every entry names its vocabulary and where that vocabulary is declared, cited by symbol rather than by a cross-file line address (AGENTS.md #11).app-shellautolaunchedFlowSchema.type, the flow PROCESS-KIND enum — a different vocabulary from the four below, four lines away in the same blockapp-shellstartdecisionnotifyendFlowNodeAction(@objectstack/spec).start/endare the twoFLOW_STRUCTURAL_NODE_TYPES, which is why they are in the enum and absent fromNODE_PALETTEmobileswipe-leftswipe-rightGestureType—useGesture/useSpecGesturehook pair the census cited; the hooks consume the union, they do not declare itmobilepinchSpecGestureTypeviaSPEC_GESTURE_TYPES— a different union fromGestureType, andpinchis a member of bothplugin-dashboardlinepiebarDashboardWidgetTypeName, whose spec half isChartTypeSchemaby referenceplugin-ganttmilestoneGanttTaskTypeplugin-ganttfsssffsfGanttLinkType— a different vocabulary from the task kind, same fileplugin-gridmultipleSelectionConfigSchema.type(3 sites)plugin-gridcount_uniqueColumnSummarySchema, reused byColumnSummaryConfigSchemaplugin-kanbankanbanRetiredKanbanNodeSchema=retiredNodeType('kanban', …). Re-register the key and this entry reportsstale-exemptionplugin-reportmatrixjoinedSpecReportTypeNameplugin-reportbarchart.type, ⛔ not a report kind —ChartTypeSchema, planned byplanReportChart. The census filed it with its neighbours; recorded here as a correctionplugin-viewsharekanbandate-rangeObjectViewSchema.viewActions[].type,ViewType,FilterUISchema.filters[].type⛔ Two sites are deliberately absent — they were re-classified as defects and repaired on their own cards, objectui#8114 and objectui#8483. ⭐ No new site was reclassified in this pass: all 25 took the treatment, each with a declaration site in source.
Which pin covers the new entries
every package-README exemption names a vocabulary and a declaration siteincheck-doc-component-types.test.ts. It reads all 25 entries (asserted non-vacuously), requires each to cite at least two backticked things and to either name a declaring symbol or defer explicitly to the sibling entry that does, and asserts zerostale-exemptionfindings tree-wide. ⛔ Its first draft used a length floor, which failed a perfectly goodGanttLinkTypesibling at 119 characters while passing any padded stub at 121 — a character count is a proxy for teaching and was replaced with the substance.Two claims this branch made false, repaired
check-doc-snippet-types.mjs's ownership matrix saidpackages/NAME/README.mdis✗for this gate, and gave as the reason that "a package README teaches its own package's API rather than the schema vocabulary" — measured false: they teach 243typeliterals.check-doc-fence-languages.test.tssaid this gate "cannot join that comparison" because its surface does not include the package READMEs. The leg now has its own cross-gate pin instead of a sentence.Surface shrink, guarded
The leg is collected by walk, not by name, so it cannot dangle the way a
ROOT_PAGESentry does — it just returns fewer files while every printed count stays plausible. The CLI therefore refuses to publish a verdict when the leg collects nothing, and a pin drives that refusal.The ledger
markdown-test-inputs.mjsowed twopackages/**entries: it is the class a markdown-only pull request consults to decide whether the shard that READS that markdown runs at all, and #8857 was a pull request changing exactly one package README whose shard reported success in ten seconds having run nothing.Verification
Run through
os-verify-lock.sh; exit codes captured by redirecting to a file before reading$?, never across a pipe.node scripts/check-doc-component-types.mjsnode scripts/check-doc-expression-carriage.mjsnode scripts/check-doc-fence-languages.mjspnpm exec vitest run scripts/pnpm exec tsc -p tsconfig.scripts.json --noEmitcheck-changeset-presencecheck-governed-queue-guard --testcheck-new-cross-file-line-citationsThe
check:doc-snippetsgate is NOT MEASURED here, by its own refusal:PRECONDITION NOT MET (exit 2) — The snippet program was NOT run, the workspace being unbuilt. That is "I could not look", not a verdict. This branch's change to that file is comment-only (verified: every non-comment line in its diff is empty), so its behaviour is unchanged; CI builds and runs it.Lint narrowing, declared. The repo-wide population is 5154 files by eslint's own config; the targeted run covered the 7 changed files, counts read from
--format json. Invariance:eslint.config.jsconfigures no type-aware program (noproject/projectService), so this diff cannot move the verdict on any file it does not touch. Repo-wide there are 95 pre-existing errors across 79 files onmain; none is in this diff. Measured on5585ba55a.The one line-citation hit is
'unregistered-doc-type :: packages/demo/README.md:2 :: stat-card'— an expected-string assertion on the gate's own computed diagnostic over a throwaway fixture tree, which the gate itself resolves asunresolvable (ambiguous-basename). It is not a stored citation into a real file; it is the same shape as the pre-existing root-README.mdpin beside it. Report-only, exit 0.维护者速读(草稿)
改了什么 —
check:doc-types现在走packages/NAME/README.md,并带上 25 条已裁定的豁免条目;姊妹的 carriage 普查同步取这条腿。为什么改 — 这些 README 随 npm 包一起发出去,它们的
type被两个姊妹门禁读过两遍、被谁都没判过。读者照抄一个不存在的type,拿到的是红色 OBJUI-001 面板。这正是 #7115 的老毛病换了个目录重演。风险与代价(含回滚) — 门禁扫描面从 188 个文档扩到 227 个,首跑红了 28 处,全部是别的词汇表、各自有源码声明点,逐条裁定后转绿。⛔ 没有削弱任何既有检查。回滚 = revert 这两个 commit,扫描面回到 188,豁免条目随之消失(它们键控的文件不再在 walk 内,留着会报
stale-exemption)。席位意见 — (留空)
你要做的 — 复核那 25 条裁定的措辞是否站得住(尤其
plugin-kanban的kanban:它是本组里唯一属于本门禁所判词汇表的值,理由是"已退役、故意写出来教人认出拒收");以及 A₁ 这个读法是否仍是你要的。PR 停在 draft,不翻 ready、不入队。⛔ Draft. Not flipped to ready, not enqueued, nothing approved or merged.
🤖 Generated with Claude Code
https://claude.ai/code/session_015h79niBMyoB1xcaQje3uiz
Generated by Claude Code