docs(metadata-protocol): re-anchor the remaining dead tracker and comment-id citations in test comments (stage 2 of #20595) - #21246
Conversation
…ment-id citations in test comments Stage 2 of the domain:engine lane's dead-citation sweep, packages/metadata-protocol only: the 22 test-comment sites carrying 13 numbers that answer 404 (which the census never reads), the dead comment-id citation on two lines, and the dead convenience PR number beside commit 9632604. Each now cites the commit in this repository's history that made the decision the sentence describes (ruling C+D form C). Comment prose only; every file keeps its line count. Claude-Session: https://claude.ai/code/session_017xfMoEjKUuSh2xYB8sCozp Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 1 package(s): 1 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 2 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 11 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin a2b6694575bdde4cdd6357b0b3bb17686e81feed && git checkout a2b6694575bdde4cdd6357b0b3bb17686e81feed
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin be5a83cfaaf3051eb0182e23b0e62e77f5a12866 16b5bf6c1848573eb8b7efd85b4ffcd91c9ee78f && git checkout -B drift-repro be5a83cfaaf3051eb0182e23b0e62e77f5a12866 && git merge --no-ff 16b5bf6c1848573eb8b7efd85b4ffcd91c9ee78f
node scripts/docs-audit/affected-docs.mjs --json be5a83cfaaf3051eb0182e23b0e62e77f5a12866
|
Part of #20595
Clause-②: no
What changed
Stage 2 of the
domain:enginelane of the dead-citation sweep: thepackages/metadata-protocolremainder that stage 1 (PR #21233, landed asa7d9768ec) left, per the claim (5940298570). Comment and docblock prose only. #20595 stays open for the next stages (objectqlnext).The population is what stage 1's contract review (
5939794396) escalated to this sub-stage:comment 5299845282, on two lines;PR #14767beside its anchor96326040f.Each is rewritten in ruling C+D's form C (record
5749154545on #19123): the commit in this repository's history that made the decision the sentence describes. 23 lines in 16 files (21 lines for the 22 numbered sites, 2 for the comment id). Anchors: 13 numbers and the comment id, all by commit sha; 0 by ADR or ruling record (none exists for any of them); 0 by words alone. Seven numbers reuse the commit another lane already chose for them,#14767and the comment id keep stage 1's commit already on their line, and five were measured here.Every file keeps its line count (+23 / -23). No code token moves (guard below). No citation number is added: the only numbers left on changed lines,
#9612and#13331, stood there before and answer as issues.No changeset, and
skip-changesetis the declaration: 22 of the 23 lines are in test files, which thetsupentry graph never reaches, and the oneprotocol.tsline is a//comment inside a method body that the build drops. Measured, not assumed (see Changeset).Population, before and after
H1, re-enumerated on
origin/main(a7d9768ec). The instrument is the gate's own code, read-only.extractCitationsfromscripts/check-issue-citations.mjsruns over every tracked file in the package (239), in both projections (whole file and comment prose), keeping the citationsnamesThisRepositoryassigns to this board.classifyCitationjudges each one against a board read by the gate's ownenumerateBoard: 191 pages, frontier #21241, 19,062 records, read 20:54:38Z to 20:58:19Z on 2026-10-01. Then one REST read per number: all 13 answer 404, and the lit controls#5286and#12624answer 200.a7d9768ec16b5bf6c15299845282answers 404 and the other four answer 200:5302933802(on [finding] diffMetaItem answers 200 with an empty diff when sys_metadata_history is unreadable — an outage is indistinguishable from "nothing changed" #8833),5528370129([finding] QA observed /api/v1/meta/datasource serving a deleted datasource's entry cluster-wide, but MetadataManager's unregister DOES broadcast — the observed prolongation sits in an unidentified seam #13609),5865708652([finding]GET /meta/:type/:name/diffserves PENDING draft content to a member with no authoring capability: its history versions include draft saves, and it is the one draft-serving door the #20338 gate leaves open #20378) and5875579209(GET /meta/:type/:name/diffwith nofrom: after a draft is published, the default range compares the new version against the draft's own save and answers "no changes", never against the previous published version #20451). The control5940298570(on dead tracker citations in thedomain:enginepackages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595) answers 200. After: 7 sites, 0 dead.Per-number table
Every sha below resolves to exactly one commit (
git rev-parse --disambiguate). Each is an ancestor of the base:git merge-base --is-ancestorexits 0 for all 14, on a full clone (--is-shallow-repositoryis false). Each one's message or diff names the number it replaces.ADR:git grepoverdocs/adrandscripts/adr-anchorsnames none of the 13 numbers or the comment id, so the ADR rung is empty for all of them.#628784c86fb45preview/trialdiscovery folds declared, the fold table exhaustive overEnvironmentType#100586f5a44976#10064def0d3e63#1042005bc692e0SysMetadataRepositorythrough the shared repository contract suite (it adds this file)#109784c9780c7alimitafter the filter and by presence#11017d806081dd#13214cc837dbfeGET /ui/view/:object/:type#13244889ec5b42GET /ui/view/:object/:type#132583d10755f0GET /ui/view/:object/:type(it adds the sibling harness)#1438910220a7bf#14431a98b61b3e#1476796326040f#176217e74af3dfcomment 529984528275e66fc8eSentences that credit a commit with a finding, a ruling or a record were checked against that commit's own message:
a98b61b3ecarries the finding all five#14431sites describe: the bridge heals the registry, a read inside the residue window re-hydrates the deleted row, and the window is bounded only when no read lands in it.7e74af3dfrecords the no-coverage state: the PostgreSQL arm was pinned and run nowhere.6f5a44976records the package-closure ruling.75e66fc8ecarries the Option B ruling.10220a7bfrecords the name-and-code gate.4c9780c7arecords the after-the-filter, by-presence bound.d806081ddrecords the per-face decision (silence keeps the full prose on the duplicate face) but not the ruling itself. So that site keeps the ruling's own date and now reads 「landed as」. This is stage 1's precedent for#9741and2a29caa53.Wordings to check
Most rewrites swap the tag in place, as the landed stages do:
(#N)becomes(commit SHA),[#N]becomes[commit SHA], andPR #Nbecomescommit SHA. These say more than the tag:protocol.invalid-metadata-422-face-inventory.test.ts:22: 「The maintainer ruling on [裁决]duplicatePackage的failed[]是否应在 spec 声明结构化issues通道 —— 它今天在 spec 里没有任何响应 schema #11017 (2026-08-22, option D) resolved it by」 became 「The maintainer ruling of 2026-08-22 (option D, landed as commit d806081) resolved it by」.protocol.ui-view-hidden-columns.test.ts:46: 「([finding]GET /api/v1/ui/view/:object/:typeresolves a UI view with no identity resolution and no anonymous-deny at the REST seam #13214 / PR test(rest): drive the tenancy axis of GET /ui/view/:object/:type — an anonymous caller can name another environment and receive its UI view #13258) drives the same defect」 became 「(commit 3d10755, for the card commit cc837db fixed) drives the same defect」. Line:47says 「It belongs to that card」, and this wording keeps an antecedent for it.protocol.batch-row-http-status.test.ts:546: 「(mapDataErrorhas noDUPLICATE_RECORDarm: the engine's insert conflict envelope reaches the wire through the generic passthrough, dropping thefieldkey and the user-facing conflict sentence #14389 §5)」 became 「(commit 10220a7)」. The§5named a section of the deleted card's body, so it goes with the number.get-meta-item-org-read-gate.test.ts:10: 「Commit 9632604 (PR fix(metadata-protocol): apply the allowOrgOverride read gate inside getMetaItems, so multi-type sweeps are scoped per type #14767) moved」 became 「Commit 9632604 moved」. Ruling C allows a PR number only as a convenience link, and a link that answers 404 is not one.protocol.ts:22793: 「maintainer ruling (comment 5299845282), Option B.」 became 「maintainer ruling (recorded in that commit's message), Option B.」. The line above opens with[commit 75e66fc8e].protocol.diff-credential-redaction.test.ts:19: 「(maintainer ruling, issue comment 5299845282 — Option B)」 became 「(maintainer ruling, recorded in commit 75e66fc's message — Option B)」.migrations/seed-tenancy-backfill.live-postgres.test.ts:55and:256: 「the no-coverage statemetadata-protocol's live-DB CI step supplies onlyOS_TEST_MYSQL_URL, so the new catalog presence probe's PostgreSQL arm is pinned as TEXT and has never been executed #17621 records」 became 「the no-coverage state commit 7e74af3 records」, and 「metadata-protocol's live-DB CI step supplies onlyOS_TEST_MYSQL_URL, so the new catalog presence probe's PostgreSQL arm is pinned as TEXT and has never been executed #17621 exists because it was」 became 「commit 7e74af3 exists because it was」.eslint.config.mjsdeclares no line-length rule, and a reflow would move neighbouring lines and every line citation into the file.Sites left in this package
tsup.config.ts): none. Dead comment ids: none.describe/ittitles and assertion arguments) are not edited. 56 carry census-dead numbers and 7 carry#17621. They are recorded on dead tracker citations in thedomain:enginepackages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595, and the claim excludes string literals.CHANGELOG.md, 56 sites, is release-owned and not edited.Mechanical guard: no code token moves
The guard compares the base blob with the working tree for all 16 touched files, with TypeScript 6.0.3, on two readings:
forEachChildwalk. Comments are trivia there, and JSDoc is never visited.getChildrenwalk, with JSDoc nodes skipped.String, template and numeric literals are compared in full on both readings.
16b5bf6c1: 104,684 base tokens, 0 files with a token change (exit 0).scripts/ablation-replace.mjsin wrap mode, under a shell trap that restores by absolute path fromHEAD:bodies untouchedtobodies UNTOUCHED,protocol.ts): 0 files changed, exit 0;const issuestoconst issuesX,runtime-authoring-gate.dataset-writes.test.ts): DIFFER on both readings, exit 1;'organization probe'to'organization probeX', live-postgres test): DIFFER on both, exit 1;WINDOWS_PROBED = 10to11, prolongation test): DIFFER on both, exit 1.HEADblob (766d14add061,9c4bcfec727d,3457d6e431ed,9931944568bb).git diff HEADis empty and the tree is clean afterwards.Changeset: none, with
skip-changeset(distmeasured)files[]isdist,README.mdandCHANGELOG.md. Thetsupentry issrc/index.ts, and no test file is in its graph. For the one non-test line (H3), the dependency closure was built first (turbo run build --filter='@objectstack/metadata-protocol^...', 12 of 12 tasks). Then the package's ownbuildran four times under the shared verify lock, and each leg hashed all 24distfiles:protocol.tsdistagainst leg 1:22793, blob5be50ab59075(stage 1's recorded head blob for this file)comment 5299845282is in no built filerefusal is beingtorefusal is BEING)index.d.tsandindex.d.ctsdiffer;ablation-dist-preflightfinds the marker in 2 built filesablation-dist-preflight --absentpassesSo a comment change that ships is visible to this instrument, and this one does not ship. Restore proof: the
protocol.tsblob equalsHEAD(766d14add061),git diff HEADis empty and the tree is clean.Gates (head
16b5bf6c1)node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsderives 55 commands for 16 paths against merge basea7d9768ec. All 55 ran, each exit captured before any pipe, and all 55 exit 0.--ran, givenCOMMAND :: exit CODElines, reports 「55 derived, 55 run, 0 NOT-MEASURED, 0 UNRUN」, a derived zero, and exits 0. A fullturbo run buildover./packages/*and./packages/*/*ran first under the verify lock (71 of 71 tasks), so no gate read an unbuilt workspace.node scripts/check-issue-citations.mjsexits 0: 「no issue citations added against a7d9768」.pnpm check:issue-citationsexits 0: self-test, 173 cases, 9 batteries.pnpm check:doc-authoringexits 0, and the sibling-package prose-id baseline holds with no growth.pnpm check:nul-bytesexits 0 (9,902 files). A raw control-byte scan of the 16 changed files finds none (grep exit 1).pnpm --filter @objectstack/metadata-protocol test: 200 test files pass and 3 skip (203); 2,973 tests pass and 19 skip. These are the same totals as stage 1's.pnpm --filter @objectstack/metadata-protocol typecheckexits 0, andtsc --noEmit --listFilesputs all 203 tracked test files and all 16 changed files in the program.--format json) over the 16 touched files plusdist/index.jsas the control. It gives 17 results, 0 errors and 1 warning, the control's ignore notice, and none of the 16 is reported ignored.eslint.config.mjs:327-328states that no type-aware linting is enabled, so a comment edit cannot move the verdict on an untouched file. The repo-widepnpm lintis CI's run.Acceptance notes
mainata7d9768ec, the stage 1 squash.mainhas moved two commits since (1a4c7f826,ef96c9ede). Neither touches this package,scripts/check-issue-citations.mjsorscripts/pm/dispatch-gates.mjs. No merge was taken; the merge queue rebuilds on the merged generation.packages/rest(#14389 §5inerror-response-sandbox-arm-message.test.tsandrest-duplicate-record-arm.test.ts) andpackages/lint((#10064)inruntime-gate.object-writes.test.tsandvalidate-object-field-refs.test.ts). They are independent sites with the same rot, outside this claim's file surface. Their lanes' anchors are10220a7bfanddef0d3e63.protocol.ui-view-hidden-columns.test.ts:46).Generated by Claude Code