docs(service-package): re-anchor the dead tracker citations to the commits that decided them - #20742
Conversation
…mmits that decided them Stage 10 of the domain:services dead-citation sweep (ruling C+D, form C). Every comment or docblock site under packages/services/service-package/src that cited a tracker number answering 404 now cites the commit in this repository's history that decided what the line describes, and says in its own words what that commit decided. Comments only: each touched file keeps its line count, and no code token moves. Claude-Session: https://claude.ai/code/session_01XY5uCwTjZj7884yYtyur4H Co-authored-by: Claude <noreply@anthropic.com>
The rewritten docblock on the exported PACKAGE_SEAM_UNREADABLE_MESSAGE reaches dist/index.d.ts and dist/index.d.cts, so the package ships changed bytes. Claude-Session: https://claude.ai/code/session_01XY5uCwTjZj7884yYtyur4H Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 1 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
Contract reviewServed-tier: ① Derived judgmentsRead against
② Semver level
③ Boundary flagsThe dev report (
Nothing is escalated. One reading for the seat, not a flag on this PR: Implemented-by: VERDICT: PASS Generated by Claude Code |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 36655981069 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Part of #20596
Clause-②: no
What changed
This is the tenth stage of the
domain:serviceslane of the dead-citation sweep. It coverspackages/services/service-package/src/**and nothing else. By the seat's census at the claim (5901757839), it is the largest package in the lane that no in-flight work holds. Later stages cover the other packages, so this PR saysPart ofand the card stays open.Every comment or docblock site in scope that cited a tracker number answering 404 has been rewritten in ruling C+D's form C (comment 5749154545 on #19123), by the method of stages 1 to 9 (PR #20609 as
422db788a, PR #20626 asb80ab579d, PR #20634 as4d04b6be3, PR #20658 as9a4b2bb38, PR #20693 as0e9ad74fb, PR #20708 as9b384f63a, PR #20717 ascbaf04c1f, PR #20729 asd2820876f, PR #20737 as4dfff176b). That is 18 sites on 17 lines in 5 files, covering 5 numbers:Each rewritten line now cites the commit in
origin/mainhistory that decided what the line describes, and says in its own words what was decided: 4 distinct shas. No number in this package has an ADR or ruling record of its own in the repository (a grep ofdocs/adr/andscripts/adr-anchors/for all 5 finds none, and nothing else underdocs/names them), so every anchor is a commit, per ruling C's order. No number was dropped.Only comments changed. Every touched source file keeps its line count (17 lines out, 17 in, over 5 files), so no line citation into these files moves. Every one of the 17 changed lines carried a dead citation; there is no reflow line. No code token moves (see the guard below).
No citation number is added. The one tracker number on an added line,
#10677, was already on the line it replaces (index.ts:234) and resolves. Over the whole diff, added minus removed is 0 for#10677and negative for the five dead numbers, and no number is new to the diff. No PR number is the citation on an added line: the threePR #Nspellings in scope became their pull request's squash commit.4 dead sites are left on purpose, all of them
describetitles (see the list below).One more file: a
patchchangeset for@objectstack/service-package, because one rewritten docblock ships (see Changeset below).Census:
service-package, before and afterInstrument (A1). The gate's own
node scripts/check-issue-citations.mjs --census --json, read-only and unchanged. The count below is itsallocated-but-absentfindings underpackages/services/service-package/. Each run counts as a reading only because its board frontier equals the newest issue number, read by a separate request just before and just after the run.allocated-but-absent4dfff176b, run 2026-09-30T00:41:15Z to 00:44:24Z34ba921e6, run 00:49:33Z to 00:52:49ZThe before count matches the seat's census and A1 (13 sites). The whole-repo drop is 13, exactly this diff's census sites. The
resolvestally is 33,003 in both runs, andresolves-as-pull-request(1,984) andcross-repo-unjudged(995) did not move either. The after run was taken on34ba921e6; the headffd2f1ed2adds only the changeset. No run was truncated or discarded: both enumerations read 186 pages at the newest frontier.Supplementary instrument, the whole scope. The census does not read test files or strings, and this stage's scope includes test comments. So a second reading runs the gate's own exported
extractCitations(whole-file and comment-prose projections) andnamesThisRepositoryover every.tsfile underservice-package/src(6 files). It takes its verdicts from the before census's own board reading rather than from a second enumeration: a number is dead when that census reported itallocated-but-absent, and alive when that census judged it on this board anywhere (its--listextraction, 37,065 rows) and did not report it. The one number the census never saw, because it stands only in test files here, was read on its own:#16650answers 404 on the issues endpoint and on the pulls endpoint.4dfff176b34ba921e6Its src-comment column equals the census's 13, which is the control on the second instrument. The 60 live citations are the same in both readings (no cross-repo citation stands in this package), and the drop of 18 citations is exactly the rewritten sites. A third, raw reading (every
#followed by 2 to 6 digits, whatever surrounds it) finds 82 occurrences and 22 dead before, 64 and 4 after: the same as the gate's grammar, so nothing here sits beyond it, and it has no unjudged token.Per-number table
Sites and files count every dead occurrence in scope at the base (comments and strings, tests included).
rewritten / leftcounts the sites rewritten and the sites left. Each anchor was read in its message and diff, not only its subject, andgit blameat the base puts every rewritten line in its anchor commit or in a later commit that descends from it (merge-base --is-ancestorexit 0 for all 17 line and anchor pairs).#10965ab47f6974(PR #11064):get()andlist()refuse a storage seam that accepted the query and returned no result set, with a declared ADR-0112 envelope (SERVICE_UNAVAILABLE/ 503), and the skipped boot rehydration is logged at warn; a seam that answers with zero rows is unchanged. Its body saysPart of #10965three times, and it is the only commit that wrote the seam guard (git log -S packageSeamUnreadableError). Theruntimestage's anchor for the same number#107883a7ec2d3b:os migrate duplicatesholds a raw-SQL seam that cannot answer to be absent, not empty. The squash commit of the pull request that was#10788(404 on the pulls endpoint too);#10677, the card it answers, stays beside it. New to the sweep#1078938bc74ed1:backfillSeedTenancy's read probes hold a seam that cannot answer to be absent, not empty. Its subject names#10789. Theruntimestage's anchor for the same number#1096438bc74ed1: the same commit, the squash commit of the pull request that was#10964(404 on the pulls endpoint too), so the pair#10789 / PR #10964became one sha#16650001a83b04:SqlDriver.execute()declares a backend refusal asDATABASE_ERROR/ 500. The squash commit of the pull request that was#16650; its review round (「pin the package-door code flip」) wrote the two[#16019]blocks whose closing sentence these lines are. Thereststage's anchor for the same sentence inpackage-door-16019-raw-statement-fault-code.test.tsEvery cited sha matches exactly one commit (
git rev-parse --disambiguate, count 1 for each of the 4), and every one is an ancestor of the base (merge-base --is-ancestor, exit 0 for all 4; control leg: stage 1's landing422db788aexit 0; the history is complete,--is-shallow-repositoryfalse, 15,149 commits). Each of the 5 numbers answers 404 on the issues endpoint and on the pulls endpoint.Wordings to check
[#10965]became[commit ab47f6974]on 9 lines ofindex.ts(:208,:286,:304,:327,:451,:476,:502,:517,:626).index.ts:223, a section heading: 「(service-package answers "no such package" / "no packages installed" over a driver it never queried — its own normalizeRows maps a non-answering seam onto zero rows #10965)」 became 「(commit ab47f69)」, and its trailing rule was shortened from 11 characters to 2 so the line stays near its old width.index.ts:234-235, the two siblings of the seam guard: 「(migrate duplicates: no_sql_seam loud-refusal is dead code for the memory driver (false all-clear) #10677 / PR fix(cli): a raw-SQL seam that cannot answer is absent, not empty (#10677) #10788 for /os migrate duplicates, backfillSeedTenancy reportsno-splitover a driver it never queried — its ownabsentbranch is unreachable on the memory driver #10789 / PR fix(metadata-protocol): a seam that cannot answer is absent, not empty (#10789) #10964 forbackfillSeedTenancy)」 became 「(migrate duplicates: no_sql_seam loud-refusal is dead code for the memory driver (false all-clear) #10677 / commit 3a7ec2d for /os migrate duplicates, commit 38bc74e forbackfillSeedTenancy)」. The live#10677stays beside its fix; the dead issue and its dead pull request became their one squash commit.mysql2-tuple.test.ts:26and:196. 「service-package answers "no such package" / "no packages installed" over a driver it never queried — its own normalizeRows maps a non-answering seam onto zero rows #10965's guard」 and 「(service-package answers "no such package" / "no packages installed" over a driver it never queried — its own normalizeRows maps a non-answering seam onto zero rows #10965's leg」 became 「commit ab47f69's guard」 and 「(commit ab47f69's leg」.null-seam.test.ts:4, the file's title line: 「service-package answers "no such package" / "no packages installed" over a driver it never queried — its own normalizeRows maps a non-answering seam onto zero rows #10965 —get()/list()answered over a driver they never queried.」 became 「The card behind commit ab47f69 — …」, so line 8's 「The card established the conflation by READING」 keeps its referent.delete-driver-fault.test.ts:319andpublish-driver-fault.test.ts:357. 「The reviewer of PR fix(driver-sql, driver-turso): SqlDriver.execute() declares a backend refusal as DATABASE_ERROR/500 instead of leaking the dialect's error object #16650 required the flip」 became 「The reviewer of commit 001a83b required the flip」, thereststage's form for the same sentence.The 4 sites left
#10965, alldescribetitles innull-seam.test.ts(:140,:184,:229,:284), left as stages 1 to 9 left theirs.Mechanical guard: no code token moves
The guard compares the TypeScript parser's leaf nodes (a
forEachChildwalk, so comments are trivia and JSDoc nodes are never visited), base4dfff176bagainst head. String and template literals are therefore read in full. It ran over all 5 touched.tsfiles.index.ts(「Is this the seam refusal above?」 to 「… named above?」): 0 files changed, as expected (exit 0).index.ts(isResultSet(result)givenas anyinget()): DIFFER (exit 1).null-seam.test.ts:140,#10965to#10966): DIFFER (exit 1).Every mutation went through
scripts/ablation-replace.mjs, and each landed (anchor 1 to 0, blob changed). Each restore was proven byte-identical to the HEAD blob (2555410dd0a7,0c5bf5e7e190), withgit diff HEADempty and a clean tree afterwards.Changeset
This change ships bytes, so a
patchchangeset for@objectstack/service-package(.changeset/20596-service-package-provenance-anchors.md) is included. Its body is stage 9's, word for word, with the package name changed.Measured on the built package (A3):
files[]isdist,README.mdandCHANGELOG.md. After the build,ab47f6974appears once in each ofdist/index.d.tsanddist/index.d.cts: the rewritten docblock sits on the exportedPACKAGE_SEAM_UNREADABLE_MESSAGE. The other rewritten comments do not reachdist(0 for3a7ec2d3b,38bc74ed1and001a83b04, and 0 forab47f6974inindex.jsandindex.cjs). Positive control: the unchanged line 「Like {@link PACKAGE_PUBLISH_DRIVER_FAULT_MESSAGE}, a CONSTANT that」, in the same docblock, is found once in each declaration file. A never-written negative phrase appears nowhere indist. None of the 5 dead numbers is left indist.Gates (head
ffd2f1ed2)pnpm check:issue-citations(self-test, 114 cases, 8 batteries) exits 0.node scripts/check-issue-citations.mjsexits 0: the diff-scoped run judged 1 citation in 1 file and found it on the board:#10677, which already stood on its line.pnpm check:doc-authoringexits 0; the sibling-package prose-id baseline holds (808 pinned sites, no growth).node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackatffd2f1ed2derived 62 commands: all 56 derived at dispatch, pluscheck:engine-double-contract,check:objectql-double-limit,check:query-options-erasure,check:type-check-coverage,check:type-check-debtandcheck:where-matcher. Each ran with its exit code captured before any pipe, and all 62 exit 0.--ran, fed each command with its exit code, reports 62 run, 0 NOT MEASURED (a derived zero), 0 unrun, and exits 0. A fullturbo run buildof./packages/*and./packages/*/*ran first under the shared verify lock (71 of 71 tasks, exit 0), so no gate hit an unbuilt workspace.node scripts/check-changeset-fixed.mjs,pnpm check:authz-resolver,pnpm check:error-code-casingandpnpm check:filter-alias-parity, each exit 0.pnpm --filter @objectstack/service-package test: 5 files pass and 79 tests pass.vitest list --filesOnlynames 5 files, all the tracked test files, the 4 touched ones included.pnpm --filter @objectstack/service-package typecheckexits 0.tsc --listFilesholds all 6 files undersrc/, all 5 touched files included.eslint --no-inline-config --format jsonover the 5 touched.tsfiles gives 5 files, 0 errors and 0 warnings. All 5 are in eslint's own population (isPathIgnoredis false for each; adistfile, as the control, is ignored).eslint.config.mjsnever enables type-aware linting (noparserOptions.project, as its own lines 327-328 state), so a comment edit here cannot move the verdict on any untouched file. The repo-widepnpm lintis CI's run.pnpm check:nul-bytesexits 0, and a raw scan of the 6 changed files for control bytes finds none.Acceptance notes
CITATION_RErefuses a hyphen after the digits and a/before the#(check-issue-citations closeout (extractor spellings):CITATION_RErefuses a hyphen after the digits, so a dead#N-wordcitation (#13398-class) is invisible to the diff gate and to the census #20636), andNON_CITATION_HEADSexcuses a number after the word 「option」. In this package:#N-wordnone,#A/#Bnone,option #Nnone, at the base and at the head. The raw scan agrees: nothing sits beyond the gate's grammar here.null-seam.test.ts:4, above); the rest are unchanged, as in stages 8 and 9.#10788→3a7ec2d3b;#10964→38bc74ed1. The other three reuse sibling stages' anchors:#10965→ab47f6974and#10789→38bc74ed1(theruntimestage),#16650→001a83b04(thereststage).mainat4dfff176b.mainhas since moved four commits (03cdb9a5c,b785c3b11,5a23096ca,01e78dcee). Their 40 files touch nothing underservice-package, norscripts/check-issue-citations.mjsor.changeset/config.json; thedoc-authoring-prose-idbaseline they shrink has noservice-packagerow. So no merge was taken; the merge queue rebuilds on the merged generation.Generated by Claude Code