docs(runtime): re-anchor the 20 dead tracker citations in domains/meta.ts to the commits that decided them - #20689
Conversation
…s to the commits that decided them
The twenty comment and docblock sites in packages/runtime/src/domains/meta.ts
that cited a tracker number answering 404 now cite the commit in this
repository's history that decided what the line describes, and keep
saying what that commit decided. One more line is the other half of a
rewritten sentence ("until this card" now reads "until that commit").
Comments only; the file keeps its line count. A patch changeset for
@objectstack/runtime rides along, as the earlier runtime stage carried.
Claude-Session: https://claude.ai/code/session_local_1d2a197c-c20e-4e90-9be8-413d4d432289
Co-authored-by: Claude <noreply@anthropic.com>
…es nothing Measured: @objectstack/runtime's files[] is dist, README.md and CHANGELOG.md, and none of domains/meta.ts's comments reach dist. A fresh build of @objectstack/runtime at the base and at the rewrite emits six byte-identical dist files (sha256 per file), while a one-character code-string mutation of the same file changes index.js and index.cjs. A diff that publishes nothing takes the skip-changeset label rather than a changeset. Claude-Session: https://claude.ai/code/session_local_1d2a197c-c20e-4e90-9be8-413d4d432289 Co-authored-by: Claude <noreply@anthropic.com>
…ntime-meta-citations
📓 Docs Drift CheckThis PR changes 1 package(s): 2 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
What this run could not see
Coarse fallback — 26 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 90fc6911cb2400b376e8e9750c3a4ca0c5b50351 && git checkout 90fc6911cb2400b376e8e9750c3a4ca0c5b50351
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 14f80e23957165f6fb23c2b3d59bdc7668652dfb b96c13e3ab33ac247a123acac3efbca38a7b376c && git checkout -B drift-repro 14f80e23957165f6fb23c2b3d59bdc7668652dfb && git merge --no-ff b96c13e3ab33ac247a123acac3efbca38a7b376c
node scripts/docs-audit/affected-docs.mjs --json 14f80e23957165f6fb23c2b3d59bdc7668652dfb
|
Part of #20594
Clause-②: no
What changed
This is stage 5 of the
domain:clilane of the dead-citation sweep: the 20 comment sites inpackages/runtime/src/domains/meta.tsthat stage 1 (PR #20624) held while PR #20615 edited the file. PR #20615 has merged, and no open PR touches the file (the file lists of all open PRs were read twice: 9 PRs at 2026-09-29T17:14:19Z and 6 at 17:43:04Z). Every one of the 20 sites cited a tracker number that answers 404. Each now cites, in ruling C+D's form C (comment 5749154545 on #19123), the commit in this repository's history that decided what the line describes, and keeps saying in its own words what that commit decided. PR #20533 is the method and PR #20624 the precedent. The card stays open for the lane's remaining stages, so this PR saysPart of.That is 20 sites on 20 lines, covering 9 numbers, rewritten to 9 distinct commits. They are the anchors PR #20624's body listed for this file, each re-verified against the file as PR #20615 left it (that PR's one hunk is at
:1874, disjoint from every site). No ADR or ruling-record file indocs/adr/orscripts/adr-anchors/records any of these decisions, so every anchor is a commit.One more line changed:
:1976, the other half of the:1974sentence. It read "This tail was unreachable until this card", and "this card" was the number:1974cited. It now reads "until that commit".Only comments changed: 21 lines out, 21 in, and the file keeps its 1,991 lines, so no line citation into it moves. No citation number is added. Every tracker number on an added line was already on the line it replaces (21 line pairs, added-minus-removed empty), and no PR number stands on an added line.
There is no changeset. This diff publishes no byte from
@objectstack/runtime, so it takesskip-changeset(see Changeset below). That departs from the dispatch, which ordered a changeset on stage 1's precedent. The measurement is below.Census:
domains/meta.ts, before and afterInstrument. The gate's own
node scripts/check-issue-citations.mjs --census --json, read-only and unchanged, run with the fleet token. The count is itsallocated-but-absentfindings forpackages/runtime/src/domains/meta.ts. Both runs enumerated the whole board, so neither read a truncated board.allocated-but-absentmeta.tssitespackages/runtime6981abfd26, run 2026-09-29T17:10:45Z to 17:16:23Z7cdd37d1f8, run 17:17:15Z to 17:23:01ZThe whole-repo drop is exactly these 20 sites: a site-by-site diff of the two JSON outputs differs only in
domains/meta.ts. The 3 left inpackages/runtimeare stage 1's deliberate sites (api-exposure.ts:108,domains/mcp.ts:360,route-ledger.ts:300).meta.tsis byte-identical at7cdd37d1f8and at the head (blob8201775c6d).A REST probe of every number cited in the file (44 distinct) found 35 answering 200 and 9 answering 404. The 9 are exactly the census's 9, all in comments. So no dead number stands in a string literal in this file.
Per-site table
Every anchor was read in its message or diff, not only its subject, and
git blameat the base ties each line to the commit that wrote it.#10503:14,:1143,:1159,:1250,:130867ceb9aef: the dispatcher/metadatatransport folds the URL segment throughcanonicalMetaUrlTypebefore the org-scope decision, and at the/publishedcode-store fallback. Its diff adds four of these five tags.#10340:130926f3588fb: REST's/metadoors decide org scope on the folded type, not the raw URL spelling (its message names #10340 as the card it settles).#11006:103cccbe51bf:MetadataProtocoldeclarespublishMetaItem, and its changeset states the end state "an undeclared key in a request literal at the member's call shape is now a compile error". The wording is the one stage 1 gavedomains/packages.ts:138.#8726:116e783e163d:domains/mcp.tsnarrows the protocol slot to a type picked from the declaredMetadataProtocolcontract (the docblock atmcp.ts:321blames to it).#8848:200,:13984fc4a3c0b:/metadata/:type/:namerefuses an unsupported verb instead of serving it as a read. Both lines blame to it.#8919:1247b5378550e: gates REST/metapublish and rollback onmanage_metadata, and its diff introduces "the same single-resolution shape" (the capability gate's context reused for scope).#10888:1337d806081dd: renders the spec-validation 422 findings clause per write face. The line blames to it.#12195:819,:827,:1046,:1167,:19747986d973f, stage 3 of the compound-name retirement: un-folds the dispatcher (exactly three and two segments), decodes the:namesegment, and answers the newly reachable tail with a locatedROUTE_NOT_FOUND. All five lines blame to it.#12194:831,:1050,:1173311433f6b, stage 1: the item-name grammar, refused at the publish door.Every cited sha matches exactly one object (
git rev-parse --disambiguate, count 1 for each of the 9), is a commit, has one parent, and is an ancestor of the base (merge-base --is-ancestor, exit 0 for all 9). The checkout is not shallow. The control legf5a9bc2f3(2026-08-10, older than the oldest anchore783e163dof 2026-08-14) exits 0, and the negative control, this branch's own7cdd37d1f8, exits 1. All 9 anchors are the ones the landed stages already give these numbers, so each number carries one anchor across the tree.Wordings to check, each true of its commit:
:831keeps its quotation: "breaking commit 311433f's landed acceptance criterion that 'reads anddeleteMetaItemstill answer for pre-grammar residue rows...'". The quoted words are the criterion's own. That commit's changeset states the same criterion: "Reads anddeleteMetaItemdeliberately stay open, so any pre-grammar residue row remains listable and clearable.":1250was written by15eb2c97f, the org-presentation capability commit, which moved the fold earlier so that the capability verdict reads it too. The fold itself, which the tag names, is67ceb9aef's, and the lines around it already carry that commit's own[#12702]tags.:1050and:1173keep "stage 1" beside the commit, because the sentences contrast the retirement's stage 1 with the fold that stage 3 removed.Mechanical guard: no code token moves
H2 holds on both counts. The comment-stripped diff is empty, and the emitted
distis byte-identical.Token guard. It compares the TypeScript parser's leaf tokens (TypeScript 6.0.3, JSDoc nodes excluded) of the file at base
6981abfd26and at headb96c13e3ab. Controls mutate the head text in memory only.'Not found'to'Not founD'in the code literal at:495): 1 differingStringLiteralat token 1338 (exit 1). A first string control anchored on the first occurrence of that text, which is inside a comment at:465, so it was a second comment control. It read 0, and it was re-anchored on the code literal.Emitted
dist.@objectstack/runtimewas built fresh withpnpm --filter @objectstack/runtime buildat the base (in a throwaway detached worktree at6981abfd26) and at7cdd37d1f8, with the same dependency builds. All sixdistfiles (index.js,index.cjs, their maps,index.d.ts,index.d.cts) have equal sha256.'Save not supported'in this file (throughscripts/ablation-replace.mjs, which verified that the anchor hit and that the blob restored to HEAD) changes the sha256 ofindex.jsandindex.cjs. So the build reads this file, and its comments simply never reachdist.dist, changed or unchanged: 0 hits for "is the FOLD this transport was missing", "Percent-decode the", "A LOCATED refusal, not a bare" and "A throw here is a FAULT". Its code does appear (function decodeMetaNameSegment,METADATA_ITEM_METHODS).The line count is 1,991 at base and head. A raw scan of the file for control bytes finds none (a positive probe on a scratch file matched).
Changeset
None;
skip-changesetinstead.@objectstack/runtime'sfiles[]isdist,README.mdandCHANGELOG.md, and the build above emits byte-identicaldistat base and head. So this diff publishes nothing from a released package, which is what the label is for (AGENTS.md's Post-Task Checklist, step 3).The dispatch ordered a
patchchangeset matching.changeset/runtime-provenance-anchors.md. Stage 1 shipped that changeset because its rewritten docblocks reacheddist. For this file they do not. The dropped changeset stands in7cdd37d1f8: if the seat rules for it,git checkout 7cdd37d1f8 -- .changeset/runtime-meta-provenance-anchors.mdrestores it. Stage 1's changeset, still pending, already describes re-anchored provenance comments undersrc/in general terms.Gates (head
b96c13e3ab)This host has no
flock, soos-verify-lock.shran in its declared unlocked mode. Its disclosure, verbatim, from each locked run:turbo run build --filter='./packages/*' --filter='./packages/*/*', 71 of 71 tasks after the merge.vitest run --project local: 289 files, 4,197 tests passed, 1 skipped.--project repo: 3 files, 727 tests passed.pnpm --filter @objectstack/runtime typecheckexits 0.tsc --listFilesputsdomains/meta.tsamongtsconfig.json's 82srcfiles.check:test-typecheck: 27 files, 190 errors, 68 pinned signatures held.pnpm lint(eslint . --no-inline-config) exits 0 (2026-09-29T17:36:49Z to 17:37:35Z).origin/main(05cb2bc030),node scripts/check-issue-citations.mjs --base 05cb2bc030read 1 file and reports "no issue citations added" (exit 0). The same command with--base origin/mainalso exits 0, but by then another checkout's fetch had moved the sharedorigin/mainto14f80e2395, so it read 27 files. See Acceptance notes.node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsderived 48 families. All 48 exit 0, and--ranreads "48 derived, 48 run, 0 NOT-MEASURED, 0 UNRUN". Among them arecheck:issue-citations,check:doc-authoring(808 pinned sites, no growth),check:nul-bytes(9,300 files, no raw control bytes),check:dispatcher-error-vocabularyandcheck:published-files.check:authz-resolver,check:error-code-casing,check:filter-alias-parity,check:route-ledger-census). The other three need a pull request's context, and exit 2 without one. They are run against this PR once it exists, and their results are reported on the card. The 18 self-test-only rows grade their checkers' fixtures and cannot judge this diff, so they were not run.Hypotheses (measured first)
6981abfd26the filtered census answers 20 sites on 20 lines, 9 numbers. The line numbers equal PR docs(runtime): re-anchor the dead tracker citations in packages/runtime/src to the commits that decided them #20624's list, apart from:1960, which is now:1974because PR fix(service-automation,metadata-protocol,runtime): withhold the remaining stored flow-credential positions at every depth, and answer a /meta list fault as itself (#20590) #20615 added 14 lines above it.domains/meta.ts. No site was left for an open PR or an unfound anchor.distis byte-identical with a positive control. See the guard above.Acceptance notes
origin/main. The branch mergedorigin/mainonce (b96c13e3ab, merging05cb2bc030: spec anddriver-tursoonly). Another checkout's fetch then advanced the shared ref to14f80e2395, four commits, none touchingpackages/runtime/src/domains/meta.ts. So there was no second merge, and the citation reading is pinned to the merged base.--project localrun atb96c13e3abhad one 30-second timeout, insrc/http-metrics-inbound-coverage.hono.integration.test.ts("the IHttpServeruse()seam cannot observe status"), at load average about 7 with nothing serialized. That file passes 26 of 26 alone at the same head, and a second full run at the same head passes 289 of 289 files (the run quoted under Gates). The diff moves no code token and nodistbyte.packages/runtime/vitest.config.ts:54([finding] vitest 的 --project 过滤器落空即静默成功 —— 点名一个 integration 文件跑 --project unit,报它是通过的文件、执行零个用例,并把它从文件计数里减掉 #17853), the form-D stage for strings, and the lane's smaller packages.Deviations
:1976) beyond the 20 census sites, the other half of the:1974sentence.Claude-SessionplusCo-authored-by: Claude), and the pre-push trailer check passed on every push. The harness's attribution reminder asked for a model-named trailer and a different PR footer, and AGENTS.md overrides it. The merge commit carries git's default message.Generated by Claude Code