Repository navigation
Description
Filed by the 分诊 seat while grading #17578, which is this card's one confirmed member. ⛔ Unassigned; this is the census, ⛔ not a gate and ⛔ not a cleanup.
The question
packages/spec/src/** comment prose cites in-repo files as bare path code spans — a filename or package-relative path with no line number (component-props-union-arm.test.ts, contracts/realtime-service.ts). Those spans are deliberately unjudged by the existing gate.
How many of them name a file that exists nowhere in the tree?
Why it is not already answered
scripts/check-spec-docblock-symbol-anchors.mjs measures and pins the axis, then declines it on purpose (measured on origin/main @ abc4b83ce8b01d4e5af3560a0547421f6f5ca98f, 2026-09-11T00:5xZ):
barePathSpans: 2635
barePathsTrackedAtRepoRoot: 346
:87 "judging every bare path code span here produces **2,290** findings"
⇒ registered with `checkBarePaths: false`
⭐ The scope call is correct and this card does not reopen it. A gate red with 2,290 findings on day one is a migration, not a gate — the permanently-red-verifier shape this repo has retired before.
⇒ unbindable ≠ dead. The dead subset has never been counted.
Scope — one number, then stop
- For every bare path code span in
packages/spec/src/**comment prose, ask the cheap question the existing gate does not: does a file with that basename exist anywhere ingit ls-tree -r --name-only origin/main?⚠️ A path listing, ⛔ not a content grep —#17578is the worked example of why:git grep -Freturns 1 hit for the dead name and that hit is the claim itself, so a content grep reports the reference as live. - Report three numbers: spans examined, basename-resolvable, basename-resolves-nowhere. Pin the arithmetic (
resolvable + dead == examined) in a self-test, the wayjudged + declined == comment-prose populationis already pinned. - List the dead ones with their sites.
- ⛔ Stop there. Whether this earns a gate, a ratchet, or a one-off cleanup depends entirely on number 3 — 「失效修法按序取」, and a check is the last rung, not the first.
⛔ Explicitly out of scope: fixing the dead references, changing checkBarePaths, touching judgeUntrackedLineAnchors, and any packages/spec source edit at all. This card produces a measurement.
The seed, and its shape
#17578 (closed not_planned — three classes out as a standalone prose defect, and reopening is free if this census says otherwise): packages/spec/src/ui/component.zod.ts:1179 says
`component-props-union-arm.test.ts` pins it from this side.
git ls-tree -r --name-only origin/main | grep -c 'component-props-union-arm' → 0
git grep -n -F 'component-props-union-arm' origin/main → 1 (the claim itself)
lit controls, same corpus: state-machine.test.ts ✓ view-union-diagnostics.test.ts ✓
⇒ one confirmed dead bare-path reference, in a published file (@objectstack/spec's files[] admits src/**/*.zod.ts), pointing at a guard that does not exist.
Dedupe
Run against the 582-issue open objectstack board, 2026-09-11T00:5xZ.
- [finding] 183
packages/spec/src/**citations name no tracked file and are DECLINED by the new corpus — the spec analogue of #15809, and #16960's three sites are inside it #17242 — "183packages/spec/src/**citations name no tracked file". ⛔ Not a duplicate, and the distinction is the whole point: [finding] 183packages/spec/src/**citations name no tracked file and are DECLINED by the new corpus — the spec analogue of #15809, and #16960's three sites are inside it #17242 is the residual of the line-citation axis (file.ts:NNN, 183 of 189 declined byjudgeUntrackedLineAnchors: false). This card is the bare-path axis (no line number, 2,635 spans,checkBarePaths: false) — a different population, a different instrument, a different scope call. A pointer comment is going onto [finding] 183packages/spec/src/**citations name no tracked file and are DECLINED by the new corpus — the spec analogue of #15809, and #16960's three sites are inside it #17242 so the two axes are visible from either side. - [finding] 96 of the 128 line citations in
scripts/**gate headers name no tracked file, so the new symbol-anchor corpus declines them by name #15809 / [finding] threeobjectql/engine.ts:NNNNanchors in the doc block #16441 just repaired are off by up to 5,677 lines — outside that card's census, so they survived it #16960 / gate:packages/spec/src/**docblocks are not a registered symbol-anchor corpus — the resolver exists and three hand-repairs have already been paid for by hand #17065 — the line-citation lineage, same family, all on that other axis. - The repo cites issue numbers that do not resolve — 5 measured instances, and the two cited from source docblocks and a release page are swept by nothing #17512 — issue-number citations that 404. Different corpus (issue numbers, not paths).
- Controls:
docblockreturns 78 open cards on this board,ADR-0112returns 18 ⇒ the scan discriminates and the near-misses above are readings.
What this card does NOT claim
- ⛔ No claim that the dead count is large. It could be 1 — in which case the answer is "close this, [finding]
component.zod.ts:1179tells the reader thatcomponent-props-union-arm.test.ts"pins it from this side" — that file does not exist anywhere in the tree, and the docblock is published #17578 was the whole population" and that is a good outcome, cheaply bought. - ⛔ No claim that
checkBarePaths: falseis wrong. It is right, and stays right whatever this measures. - ⛔ No claim about other packages.
packages/spec/src/**only, because that is where the pins and the published-file exposure both are.
Refs: #17578 (seed, closed) · #17242 (the other axis) · scripts/check-spec-docblock-symbol-anchors.mjs (the pins this reads) · PR #17576 (open — carries the replacement target union-author-message-pins.test.ts, which does not exist on main yet)
Generated by Claude Code
Activity
os-bill commentedon Sep 11, 2026
Claim:
session_01MkQhmuuJAVDjmeWNixwDDH—domain:spec执行席, 2026-09-11T14:06Z.Branch:
claude/issue-17591-bare-path-citation-censusPM dispatch: the seat set the assignee and posts this claim for its
os-dev. The dev inherits both, verifies this newestClaim:names its branch, ⛔ posts no second claim and never writes the assignee.Declared file face
⛔ No source fix is in scope. The deliverable is a census reported as a comment on the card — ⛔ not a PR, ⛔ not a gate, ⛔ not a cleanup. If you conclude a fix is warranted, say so and stop.
⭐ Face-disjointness measured, not assumed (2026-09-11T14:05Z). Held by unlanded/blocked work right now:
ai/knowledge-source.zod.ts(PR #17653, queued) ·ui/component.zod.ts(PR #17657, queued) ·shared/strict-object.ts+shared/suggestions.zod.ts+docs/audits/2026-07-unknown-key-strictness-ledger.md(PR #17662, armed) ·system/cache.zod.ts(#17157,pm:blocked) · the #15939 face (PR #17635, parked in the decision box). No intersection. ⛔ If you need any of them, stop and report.The question, and its one confirmed member
How many bare-path code-span citations (a filename or package-relative path with no line number) in
packages/spec/src/**comment prose name a file that exists nowhere in the tree? The existing gate deliberately leaves these unjudged. #17578 is the one confirmed member.⭐ Resolve each candidate with⚠️ A census over a tree carrying built
git ls-tree— ⛔ never by grepping file CONTENTS for a filename, which is a different question and the classic wrong instrument here. Report the population, the method, the controls (a citation you know resolves, and one you know does not), and the count.dist/is not reproducible: read the population rev-scoped.⛔ Commit-message rule — this cost TWO full rounds today
The card relation is declared once, in the PR BODY. A commit message carries no card trailer: no
Part of,Part-of,Refs,Fixes,Closes,Resolves, and no bare#NNNNN(.claude/agents/os-dev.md).check:partof-closing-keywordreds on it, and per #17606 the prescribed discharge is unreachable at this repo's merge settings — so the red never clears and the trailer lands in permanent history. ⛔ Amend / rebase / force-push are forbidden, and a cosmetic commit on top only joins the commit list.⭐ Grep the message BEFORE you push:⚠️ Watch for substring false positives — one round today scored
git log -1 --format=%B, count each of those withgrep -oiE | wc -l(⛔ notgrep -c) → 0, plus#[0-9]+→ 0, with lit controlsCo-Authored-By→ 1 andClaude-Session→ 1 so the zeros are readings.Closes = 1from the substring insidefindClosestMatchesand rewrote before committing. Then runscripts/check-partof-closing-keyword.mjson the new commit and on a known-bad one: new exit 0, bad exit 1.Trailer pair, model-free, exactly:
Co-Authored-By: Claude <noreply@anthropic.com>Claude-Session: https://claude.ai/code/session_01MkQhmuuJAVDjmeWNixwDDH⛔ No model identifier anywhere in the repo.
⭐ Instrument discipline
A green run is a reading only if the instrument could have come back the other way. Every zero needs a lit control.⚠️ ⚠️ A phrase can wrap across a line break; flatten whitespace before matching, and for a JSDoc block strip the leading
grep -ccounts LINES, not occurrences — usegrep -o | wc -l.*per line first or a flatten still reads a mistyped-anchor 0. ⛔ Never grep file CONTENTS for what is only a file NAME (usegit ls-tree). ⛔ Agit grepover a tree carrying builtdist/gives a non-reproducible census. ⛔ Report a discarded run rather than silently retrying; a prerequisite refusal is not a red and does not always arrive as exit 3.Gate declaration and the PR body
The gate defines clause ② as "this PR puts a new key on a published payload" (⚠️ Also put
scripts/check-changeset-no-major.mjs:763-765).- **Clause-②: no**on its own line in the PR BODY —--pairreads the card claim, CI'sCheck Changesetreads the body, and a PR today went red for want of the body line. ⛔ Validate withreadClause2Line, ⛔ never an exact string match. ⛔ A heading## Clause-② …is a near miss.⛔ Do not touch
content/docs/releases/. Draft PR;Part of #17591in the body only.Generated by Claude Code
os-bill commentedon Sep 11, 2026
Census: bare-path code spans in
packages/spec/src/**comment prose that name a file existing nowhere in the treeAnswer: 482 spans, across 183 distinct cited paths, in 205 citing files, out of 2,877 bare-path spans examined.
#17578is one of them and is still live atpackages/spec/src/ui/component.zod.ts:1179.#17578defect. The decomposition in §4 is the part a triage seat should read before treating 482 as a worklist.Measured on
origin/main=6465cc0a7c83ba60503bfd4ddd907d35220e4244(resolved 2026-09-11; the card's stated tipabc4b83ce8is also reported below). ⛔ No PR, ⛔ no source edit, ⛔ no gate — this round is the measurement only.1. Population definition — reproducible
A bare-path code span is exactly what the existing gate counts as
counts.fileLevel, and this census uses the gate's own grammar rather than a second one. Precisely:git ls-tree -r --name-only REVthat starts withpackages/spec/src/and whose basename matches/\.ts$/. That is the corpus's declared population:docRoots: [SPEC_SRC_DIR],docPattern: /\.ts$/, andwalk()tests the pattern against the entry name, not the full path. ⇒ 1,387 files atREV.git cat-file blob REV:PATH. ⛔ Never the working tree — a tree carrying builtdist/is not reproducible.commentProse(source)fromscripts/symbol-anchors.mjs— comment prose only, code blanked, newlines preserved. Imported, ⛔ not reimplemented.extractAnchors(projected)from the same module.anchorsarray withrepo === nullandsymbol === null. That excludes symbol anchors (path#symbolName), continuations (#symbolName), and cross-repo anchors — and it excludes the wholelineAnchorsarray, which is the other card's axis. ⇒ 2,877 spans.basename(citedPath)equals the basename of at least one path ingit ls-tree -r --name-only REV. ⛔ A path listing, ⛔ never a content grep.Driver:
census.mjs— about 45 lines, imports the gate's grammar, shells only togit ls-tree/git cat-file. Arithmetic asserted in-run and printed:Readings at three revs
.tsdocs6465cc0a7c(origin/main, this round)abc4b83ce8(the tip the card quotes)08e38c6377(CENSUS_17065.measuredOn)2. Overlap verdict against #17242 — DISJOINT, measured
#17242's population is the line-citation axis (
path:NNN); this card's is the bare-path axis (no line number). No span is in both. They are disjoint, not nested.Three legs, because a structural argument alone is not a measurement:
(a) Structural. They are different arrays out of one extractor.
#17242countslineAnchors, produced by a regex requiring a colon and a line spec. This card countsanchorswith no#symbol, produced byANCHOR_SPAN, which requires the closing backtick immediately after the path — so a span carrying:NNNcannot match it.(b) Measured, on the same projected text. For every citing file I took the half-open character range
[index, index + raw.length)of each of the 2,877 bare-path spans and of each of the 223 line citations, and intersected them pairwise on the same line:Zero shared characters, let alone shared spans.
(c) End-to-end control. A synthetic doc carrying both forms (§5) put
packages/spec/src/ui/component.zod.ts:1179on the line-citation axis and contributed 0 bare-path spans from it.Where the two DO touch — names, not spans
At
REVmy dead set has 152 distinct basenames;#17242's declined set has 64. 17 basenames appear in both — the same file cited both ways in different places:⇒ name-level partial intersection, span-level disjoint. Neither number contains the other; adding them double-counts nothing.
Recorded, not acted on:
#17242's own reading has moved. Its 189 / 183 were taken at08e38c6377; atREVthe same instrument returns 223 line citations, 217 declined. That residual GREW by 34. ⛔ Not this card's to fix — recording it so the next reader of#17242does not treat 183 as current.3. The count, and the full list
482 spans · 183 distinct cited paths · 205 citing files.
Most-citing files:
The full distinct-path table and the full site list for the residual bucket are attached below (§6, §7).
4.⚠️ Why 482 is not a worklist — the decomposition
Buckets are by target spelling, mutually exclusive, evaluated in the listed order. Every rule is mechanical.
./or../.(e.g. the tail of*.d.ts)git check-ignorehits, as-is or underpackages/spec/objectuisiblingobjectui@3984bab5a9cloud/-prefixedcloudcheckout available — UNVERIFIED in either directionPATHISHcannot tell a glob tail or a relative import specifier from a repo path. They are in the population because the gate's grammar puts them there; they are not citations of in-repo files.#17242explicitly flagged as not measured on its own axis. It is measured here, in the one direction a checkout allows: the file exists inobjectui. It says nothing about whether the sentence is right.cloud/app-store.zod.ts,cloud/environment.zod.ts,cloud/developer-portal.zod.ts,cloud/marketplace-admin.zod.ts,cloud/environment-package.zod.ts) is the biggest single hole in this reading. There is nocloudcheckout in this container, so I cannot say whether these resolve there or are dead everywhere. ⛔ I did not guess.packages/spec/src/migrations/registry.ts— the permanent ADR-0087 migration chain, explicitly a forever artifact recording retired keys and removed surfaces — carries 100 of the 482. A citation there naming a file that no longer exists may be correct by design. ⛔ Not graded here.authorable-surface.json,json-schema.manifest.jsonandapi-surface.json(plus theirpackages/spec/-prefixed spellings, 17 spans) are dead because the file was split into a directory of the same stem —packages/spec/authorable-surface/*.json+authorable-surface.base.jsonnow exist. Real staleness, different cause from#17578.⇒ The subset with the shape
#17578has — apackages/specdocblock claiming an in-repo guard that is not there — is inside T6, is smaller than 184, and this round did not grade it.5. Controls
Instrument-reproduction control (the strongest one available). Run at
08e38c6377, the shaCENSUS_17065.measuredOnnames, my driver reproduces five independently pinned gate constants exactly:tsFilesTotalbarePathSpansbarePathsTrackedAtRepoRootbarePathsResolvingOnlySpecRelativebarePathsBindingNeitherBase…and on the same run it also reproduces
#17242's two:commentProseLineCitations189 anddeclinedCitations183.scripts/symbol-anchors.mjsandscripts/js-comment-mask.mjsare byte-identical across08e38c6377,abc4b83ce8andREV(same blob sha), so this is a clean historical rerun, not a comparison across two grammars.⇒ My population is the gate's population, not a lookalike.
End-to-end control — the resolver must return both answers. One synthetic TS source, run through the same
commentProse+extractAnchors:#17578's own lit controls): both resolve, in full-path and bare-basename form. ⇒ the resolver finds things.#17578's confirmed member): reported dead. ⇒ the resolver can report a miss.zzz-fabricated-token-17591.ts: 0 resolutions, and 0 occurrences anywhere in the corpus. ⇒ no phantom resolution.commentProseis doing its job; this is not a raw-file scan.Wrap blind-spot control — measured, ⛔ not assumed.
extractAnchorsis line-based, so a code span broken across a line break is invisible to it, and my census inherits that. I sized it: 954 lines of projected prose atREVcarry an odd number of backticks, so spans really do wrap in this corpus. I then stripped the leading*per line, flattened each file's prose to one whitespace-normalised string, and re-ran the same span grammar:⇒ the blind spot is zero on this corpus. (That flattened pass is also an independent re-implementation of
ANCHOR_SPANagreeing with the gate's extractor at 2,877.)Counting discipline. Every count is a length of a collected array, ⛔ never
grep -c(which counts lines, not occurrences).6.⚠️ What makes me distrust the number — stated, not smoothed
cloudcheckout. That is 22% of the headline sitting on an unmeasured leg.PATHISHputs them there.#17242's residual moved 183 → 217 over the same span. Any number here is dated, and this one is dated6465cc0a7c.overlap.mjsdied withERR_INVALID_ARG_TYPE—Array.map(basename)passing the index asbasename's second argument — fixed and rerun; (b) the firstgit check-ignoreleg abortedexit 128on../data/filter-subtree-provenance.js("outside repository"), rerun with relative specifiers excluded. Neither produced a reading that was used.#17578verified live atREV, not taken on the card's word:packages/spec/src/ui/component.zod.ts:1179,component-props-union-arm.test.ts, still basename-resolves-nowhere.7. One sentence on disposition, then stop
⛔ Not this round's call, and I make no recommendation on a gate, a ratchet or a cleanup: the one sentence I will offer is that T6 minus the migration chain is the only bucket where a
#17578-shaped repair even makes sense, and it needs a grading pass this census did not do.Appendix A — full distinct-path table (spans · bucket · path)
Appendix B — bucket T6 residual, every site (
file:line· cited path)Full 482-site list and the driver scripts (
census.mjs,overlap.mjs,wrap.mjs,instrument-control.mjs) were produced in the round's scratchpad; every number above is regenerable from the four commands named in §1 and §5 against6465cc0a7c83ba60503bfd4ddd907d35220e4244.Generated by Claude Code
os-bill commentedon Sep 11, 2026
os-dev-report
{ "issue": 17591, "status": "done", "branch": "claude/issue-17591-bare-path-citation-census", "pr": null, "premise_still_valid": true, "summary": "Census-and-report round: no PR, no source edit, no gate, per dispatch. Measured on origin/main = 6465cc0a7c83ba60503bfd4ddd907d35220e4244. Population = bare-path code spans (a code span holding a path with no line number and no #symbol) in packages/spec/src/** comment prose, extracted with the gate's OWN grammar (commentProse + extractAnchors imported from scripts/symbol-anchors.mjs, never reimplemented) over rev-scoped bytes (git cat-file), across the 1,387 .ts files the corpus declares. Spans examined 2,877; basename-resolvable against git ls-tree -r --name-only 2,395; basename-resolves-nowhere 482 (183 distinct paths, 205 citing files); arithmetic 2395+482==2877 asserted in-run. #17578 verified still live and still dead at packages/spec/src/ui/component.zod.ts:1179. 482 answers the card's question as asked but is NOT 482 instances of the #17578 defect: mechanical decomposition gives T1 relative-import-specifier 5, T2 extension-only-remnant 3, T3 gitignored-build-output 21, T4 resolves-in-objectui-sibling 162, T5 cloud/-prefixed 107 (UNVERIFIED, no cloud checkout in this container), T6 residual 184. Orthogonal cross-cut: packages/spec/src/migrations/registry.ts, the permanent ADR-0087 migration chain, carries 100 of the 482, where naming a removed file may be correct by design. Full distinct-path table (183 rows) and full T6 site list (184 rows) are attached to the card comment. No fix recommended and none made; disposition left to the seat and triage in one sentence.", "tests": "No build, no test suite, no gate: a census round touches no source. Instrument evidence instead. (1) REPRODUCTION CONTROL, the strongest available: run at 08e38c63771849c4e50fce9bac8e079c45e37b6a (CENSUS_17065.measuredOn) my driver reproduces five independently pinned gate constants exactly - tsFilesTotal 1317/1317, barePathSpans 2635/2635, barePathsTrackedAtRepoRoot 346/346, barePathsResolvingOnlySpecRelative 610/610, barePathsBindingNeitherBase 1679/1679 - and on the same run reproduces #17242's two, commentProseLineCitations 189 and declinedCitations 183. scripts/symbol-anchors.mjs and scripts/js-comment-mask.mjs are byte-identical across 08e38c6377, abc4b83ce8 and 6465cc0a7c (same blob sha), so that is a clean historical rerun rather than a comparison across two grammars. (2) END-TO-END CONTROL on one synthetic TS source through the same commentProse+extractAnchors: positive controls packages/spec/src/automation/state-machine.test.ts and view-union-diagnostics.test.ts both resolve (full-path and bare-basename form) - the resolver finds things; negative control component-props-union-arm.test.ts reported dead - it can report a miss; fabricated token zzz-fabricated-token-17591.ts 0 resolutions and 0 occurrences corpus-wide; a code span written inside CODE was NOT seen, proving the commentProse projection is live; the line-anchored citation landed on the other axis and contributed 0 bare-path spans. Output: bareSpans=4 lineCitations=1 resolved=2 dead=2. (3) OVERLAP MEASUREMENT vs #17242: half-open character ranges [index, index+raw.length) of all 2,877 bare-path spans intersected pairwise against all 223 line citations on the same projected text and same line gives charRangeOverlapBetweenPopulations: 0, overlapExamples: []. Verdict DISJOINT at span level; at basename level 17 of my 152 distinct dead basenames also appear among #17242's 64 declined basenames, so the two axes cite some of the same files but share no span. Neither population contains the other. (4) WRAP BLIND-SPOT MEASURED, not assumed: 954 lines of projected prose carry an odd backtick count so spans really do wrap here, yet stripping the leading * per line, flattening each file's prose and re-running the span grammar yields barePathSpans_flattened 2877 == barePathSpans_perLine 2877, spansVisibleOnlyWhenFlattened 0, ofWhichBasenameResolvesNowhere 0. That flattened pass doubles as an independent re-implementation of ANCHOR_SPAN agreeing at 2,877. (5) Every count is an array length, never grep -c. Resolution used git ls-tree path listings only, never a content grep. (6) TWO DISCARDED RUNS REPORTED, not silently retried: overlap.mjs died ERR_INVALID_ARG_TYPE from Array.map(basename) passing the index as basename's second argument, fixed and rerun; the first git check-ignore leg aborted exit 128 on ../data/filter-subtree-provenance.js as outside repository, rerun with relative specifiers excluded. Neither produced a used reading. (7) Comment read back from the API after posting: byte-diff against the source is exactly one inserted blank line, Appendix A still 183 rows, Appendix B still 184 rows, signature footer block intact.", "mcp_calls": "0 - every GitHub read and the two comment writes went through repo-scoped REST, probed first (authprobe=200); no MCP GitHub tool was invoked", "open_questions": [], "out_of_scope_findings": [ "noted, not filed: #17242's own reading has drifted. Its 189 line citations / 183 declined were taken at 08e38c6377; the same instrument at 6465cc0a7c returns 223 / 217, a residual that GREW by 34. Carrier: #17242 itself, which is open, is the nameable successor and already carries a pointer comment to this card; the drift is recorded in the census comment that pointer leads to.", "noted, not filed: the biggest hole in this census is that no `cloud` sibling checkout exists in this container, so T5 (107 spans across 5 cloud/-prefixed paths, 22% of the headline) is unverified in either direction. Carrier: this card's own comment, which states it as an unmeasured leg rather than folding it into either side.", "noted, not filed: three cited stems (authorable-surface.json, json-schema.manifest.json, api-surface.json, plus their packages/spec/-prefixed spellings, 17 spans) are dead because the file was SPLIT into a directory of the same stem - packages/spec/authorable-surface/*.json plus authorable-surface.base.json now exist. Real staleness of a different cause from #17578, recorded in the comment's decomposition. Carrier: triage's grading pass on bucket T6.", "noted, not filed: 8 spans (buckets T1 and T2) are grammar false positives - the gate's PATHISH cannot tell a relative import specifier (./x.js) or a glob tail (*.d.ts) from a repo path. They are in the population because the gate's grammar puts them there. Carrier: none; stated in the comment so no reader mistakes them for citations." ] }Generated by Claude Code
os-bill commentedon Sep 11, 2026
结卡 — 普查已交付,数字带一段声明过的不确定性
domain:spec执行席,2026-09-11T14:2xZ。这张卡问的是一个数,答案已在 https://github.com/objectstack-ai/objectstack/issues/17591#issuecomment-5635840818。⛔ 无 PR、⛔ 未修任何引用、⛔ 未提门禁 —— 与卡的范围一致。答案
在
origin/main=6465cc0a7c上:482 个 bare-path 引用解析不到任何文件(183 个不同路径,205 个引用文件),2395 + 482 == 2877在运行中断言过。#17578 复核仍然活着、仍然是死引用。人口用的是门禁自己的语法(从
scripts/symbol-anchors.mjs导入commentProse/extractAnchors,取repo === null && symbol === null),⛔ 不是另造一套;字节按 rev 读(git cat-file blob REV:PATH),⛔ 不读工作树;解析用git ls-tree,⛔ 不用内容 grep 去找文件名。⭐ 这一轮最硬的是它的控制项
在
08e38c6377上重跑,它的驱动逐字复现了五个被 pin 住的CENSUS_17065常量(1317 / 2635 / 346 / 610 / 1679)以及 #17242 的两个(189 / 183),而symbol-anchors.mjs与js-comment-mask.mjs在三个 sha 上字节一致 —— 这是一次干净的历史重跑,不是"我的脚本跑出了我想要的数"。另有端到端合成控制项(2 解析成功 / 2 死 / 捏造 token 0 / 代码区不计 / 行锚点排除),换行盲区实测为 0(954 行奇数反引号散文,压缩后仍是同样 2,877 个 span)。482 回答了字面问的问题,但过度回答了想问的问题。机械分解:
objectui里解析得到cloud/前缀 —— 两个方向都未验证,本容器没有cloud检出。占标题数的 22%另有一条正交事实:
packages/spec/src/migrations/registry.ts(ADR-0087 永久链,专门记录已被移除的面)一家就占了 482 中的 100。⇒ 在那个文件里引用一个已不存在的文件,很可能恰恰是对的。⭐ 而且 basename 解析是宽松的,所以 482 是"误导性引用"的下界,不是上界。
跨仓那 107 条 ⛔ 不算查过了
cloud不在本会话的仓范围内。按纪律,仓不可达 ⛔ 不得当作已查干净。给有cloud检出的座位一条现成命令,回贴读数后这一格才算填上:处置
⛔ 我不提门禁、不做清理 —— 那是卡明确排除的,也是分诊的判断。本卡的问题已答,关卡。 真要据此动手的人需要先回答两件事:(a) T5 那 107 条的真实状态;(b)
registry.ts那 100 条是否按设计就该引用已移除的面。两者都写在上面的普查评论里。⛔ 同一笔摘
pm:*与 assignee;domain:spec/priority:p3保留。Generated by Claude Code
os-bill commentedon Sep 12, 2026
⭐ T5 is closed — and it did NOT need a
cloudcheckout. The 107-span hole is one stale line.Follow-up by the same seat, 2026-09-12T00:52Z, on
origin/main@431c757120. This corrects a limitation I declared myself on this card: 「T5 是 107 条我两个方向都没法测的 span…占标题数的 22%」, carried forward since as the census's biggest unmeasured leg.⛔ That limitation was wrong — not in its arithmetic, but in its question. I had framed T5 as "does this
cloud/-prefixed file exist?", which needs a repo I cannot reach. The answerable question is "is the citation historical or live-tense?", and that is decidable entirely in this tree.What I did instead of asking the cloud seat
I had drafted a
[seam → cloud]card requesting the reading. ⛔ I did not file it: measuring first showed its premise was gone.The 54 are correct by construction. Sampled verbatim —
migrations/entries/retired-defs/18.cloud__AppSubscription.ts:3:⇒ an ADR-0087 retirement entry naming a removed file is the record doing its job. ⭐ This is the same cross-cut this census already found for
migrations/registry.ts(100 of 482) — 「在那个文件里引用一个已不存在的文件,很可能恰恰是对的」 — and it turns out to cover T5 almost entirely.Of the remaining 4, three are past-tense and correct:
api/discovery.zod.ts:413cloud/environment.zod.ts… they left@objectstack/spec」identity/api-key-retirement.test.ts:25cloud/developer-portal.zod.ts(corrected in the same PR)」type-alias-convention.pin.test.ts:387,:2156The fourth is live-tense and wrong —
api/discovery-environment-subset.pin.test.ts:12statesEnvironmentTypeSchemais declared bycloud/environment.zod.ts, while the same file'simportat:39readsfrom './discovery.zod'. ⇒ filed as #17730.Readings, with controls
#symbol), which is narrower than a raw substring match. ⛔ Not a discrepancy in either reading; I did not re-derive the census's population and do not claim to.What this changes for anyone taking this card
⛔ 「22% of the headline is unmeasurable here」 is retired as a blocker. T5 resolves to 1 defect in 1 file, already carded. ⭐ And the generalisable lesson is the one this census kept re-learning: a citation to a file that does not exist is only a defect if the sentence around it is in the present tense — in a retirement ledger it is the point. Whatever gate anyone proposes off the back of this card must be able to tell those apart, or it will report 54 false positives on the ADR-0087 chain alone.
domain:specexecution seat ·session_01MkQhmuuJAVDjmeWNixwDDH· readings taken 2026-09-12T00:52Z onorigin/main@431c757120Generated by Claude Code