docs(cli): re-anchor the dead tracker citations in lane files outside stage 14's list to the commits that decided them - #20947
Conversation
… stage 14's list to the commits that decided them Comment prose only, in ruling C+D's form C: 27 comment sites on 27 lines in bin/run.js, bin/run-dev.js, scripts/check-app-nav-i18n.mjs, vitest-tiers.ts, vitest-tiers.fixtures.ts and plugin-hono-server's objectstack.config.ts now cite the commit that decided what each line describes. One site with no deciding commit stays as it was. Claude-Session: https://claude.ai/code/session_01VvcEokUG1tvVxkceYfR5XB Co-authored-by: Claude <noreply@anthropic.com>
…js comments bin/run.js is a bin target, which npm packs regardless of files, so its comment change reaches the published tarball. Claude-Session: https://claude.ai/code/session_01VvcEokUG1tvVxkceYfR5XB Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 2 package(s): 2 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 1 release-owned page(s) also name something this change touched. These are read-only:
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 242f01a2d4373a769fa3d2ca4e0a9d6f426b6ccf && git checkout 242f01a2d4373a769fa3d2ca4e0a9d6f426b6ccf
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin f80e2a6dad85950d9ebde910f5123eae49c2781f 89264b0c1ec63f52485b1c6c3b5b957f898e560d && git checkout -B drift-repro f80e2a6dad85950d9ebde910f5123eae49c2781f && git merge --no-ff 89264b0c1ec63f52485b1c6c3b5b957f898e560d
node scripts/docs-audit/affected-docs.mjs --json f80e2a6dad85950d9ebde910f5123eae49c2781f
|
Contract reviewServed-tier: ① Derived judgments(a) Comment-only — holds. Net diff (b) The eight anchors — hold; every one is the deciding commit, not a restatement. Site count 6 + 3 + 13 + 2 + 1 + 2 = 27 matches the body's table. Each anchor's message and diff were read, and each rewritten line was blamed at the base:
(c) The changeset — owed, ② Semver level
③ Boundary flagsCheck-runs on Deviations (8), each answered:
Out-of-scope findings (3), each answered:
Open question —
Implemented-by: VERDICT: PASS Generated by Claude Code |
Part of #20594
Clause-②: no
What changed
This is stage 17 of the
domain:clilane's dead-citation sweep: the comment sites in lane files outside stage 14's file list (claim5918748154; the list on stage 16's landing5918606717and stage 14's report5914100460). The claim names six files:packages/cli/bin/run.jsandpackages/cli/bin/run-dev.js;packages/cli/scripts/check-app-nav-i18n.mjs;packages/cli/vitest-tiers.tsandpackages/cli/vitest-tiers.fixtures.ts;packages/plugins/plugin-hono-server/objectstack.config.ts.Every comment site in those files whose tracker number answers 404 now cites the commit that decided what the line describes, in ruling C+D's form C (comment
5749154545on #19123), except one site with no deciding commit. Stages 1 to 16 of this card are the precedents; the latest are PR #20883, PR #20898 and PR #20923.describe/ittitles and messages are untouched. They belong to runtime strings in thedomain:clipackages carry tracker numbers (114 messages in 8 packages, 254 ledgered ids): this lane's share of the #20513 A/A burn-down #20752 (fold5911936313). That includes the 14 dead numbers inside strings incheck-app-nav-i18n.mjs.packages/cli/bin/run.jshas noerrorlistener onprocess.stderr— the #14858 crash class is un-guarded there by inspection, but two probes with the read end destroyed answered exit 2, 3/3 #15564 and Setup → Connect an Agent is admin-only, but POST /api/v1/keys mints per-user keys for anyone — the "acts as you" self-service promise cannot be kept by non-admins #16746 all answer 200.bin/run.js:225(The PUBLISHED CLI puts its own stdout/stderr on the blocking write path every time it spawns a child with inherited stdio #14874). See "Kept" below.patchchangeset for@objectstack/cli, becausebin/run.jsis packed (see "Publish check").Census
Instrument. The card's gate does not read these files (its declared surface is
packages/**/src/**), so the census is taken by hand with the gate's own grammar, as stages 14 to 16 took it:src/**, withCHANGELOG.mdleft out: 538 files. Each is classed as one of the claim's six files, as ON stage 14's file list (README.md,tsconfig*.json,vitest.config.*,tsup.config.*,test/**), or as neither.extractCitationsfromscripts/check-issue-citations.mjs, with its comment-prose projection for code and JSON files and the whole file for prose files. The whole-file extraction minus the comment projection gives the string sites.namesThisRepository).GET /repos/objectstack-ai/objectstack/issues/N; 404 means dead.aaad682dbc89264b0c1ebin/10,check-app-nav-i18n.mjs13 (plus 14 string sites, 27 in all),vitest-tiers*.ts3,objectstack.config.ts2.contributesblock (events/menus/themes/translations/actions/drivers/fieldTypes/functions/commands) — tombstone route,kindssurvives #10724, Three plugin-manifest blocks —capabilities,configuration,extensions— have zero reads of the container itself, so all 8 keys beneath them are inert (configuration.properties.secretpromises encryption/masking) #11332,pnpm i18n:extracton an unbuilt worktree reports an oclif "command not found" instead of naming the missing spec dist #12964, test(cli): make the unread-reader ceiling a load-independent constant at RUN_TIMEOUT_MS #14715) were only on the rewritten lines.Per file, dead comment sites, before to after:
packages/cli/bin/run-dev.jspackages/cli/bin/run.jspackages/cli/scripts/check-app-nav-i18n.mjspackages/cli/vitest-tiers.tspackages/cli/vitest-tiers.fixtures.tspackages/plugins/plugin-hono-server/objectstack.config.tsWhat the lane surface outside
src/**still holds after this stage: 6 dead comment sites, all without a deciding commit (bin/run.js:225and the five stage 14 kept), and 97 dead string sites (#20752's form D).Per-number anchors
Each anchor was checked by blame on the site and in the anchor's own message or diff. "Reused" names the earlier stage that gave the number the same anchor.
#12964run-dev.js:71,:152,:466e6fd1caf7bin/run-dev.jscollects oclif's module-load warnings and names the missing build output instead of "command not found"; its changeset names the number, and it wrote:152and:466itself#14715run-dev.js:362,:400accb9231c#14858run-dev.js:377;run.js:163,:168,:2200c5e97368run-dev.jslistener and docblock that:377heads#17891check-app-nav-i18n.mjs(:112,:221,:237,:261,:289,:302,:502,:552,:706)ca9d9d361check:app-nav-i18nfrom one app to the declared platform-app population (the Account shell in the roster, one build probe per shell, per-app counts in the pass line); its message names the card it lands#17759check-app-nav-i18n.mjs(:148,:238,:259,:537)c744c0af3nav_connect_agentin all four locales, one namespace per app; its message names the card it lands#13504vitest-tiers.ts:5,:67;vitest-tiers.fixtures.ts:19444813ba57unit/integrationtiers and the behavioural predicate that replaced the text-match censusvitest.config.ts)#11332objectstack.config.ts:19dce5cd4f0capabilities/configuration/extensionscontainers (ADR-0049); it wrote this comment#10724objectstack.config.ts:26be21955bacontributesmembers (ADR-0049); its subject names the number, and it wrote this commentADR and ruling records. A grep of
docs/adrandscripts/adr-anchorsfor the 8 numbers (and #14874) finds one hit: ADR-0088 names #10724 in a correction note (history, not the ruling), so that number stays on the commit stage 16 anchored it to. The sentence it sits in already names ADR-0049. The control number7329finds 1 file in the same tree.Anchor checks:
git rev-parse --disambiguategives count 1 for each of the 8.merge-base --is-ancestoragainstaaad682dbcexits 0 for all 8.--is-ancestorproves itself. Negative control: the base as an ancestor of the oldest anchorbe21955ba(2026-08-25) exits 1.Kept: no deciding commit found
bin/run.js:225keeps #14874 ("npm packs abintarget regardless" offiles). The history search this stage ran:git log --grepfor the number finds only this card's re-anchoring commits.git log -Sfinds the earliest mention in95d5cbb316, which cites The PUBLISHED CLI puts its own stdout/stderr on the blocking write path every time it spawns a child with inherited stdio #14874 as the measurement ("The PUBLISHED CLI puts its own stdout/stderr on the blocking write path every time it spawns a child with inherited stdio #14874 measured the other half of the same lesson"). It does not decide it.5023630b1records the same measurement in its changeset, but neither its message nor its diff names the number. Stage 14 named it as a candidate, and the ACCEPT5914299201ruled that a commit which only restates or applies a decision is not the anchor.The five
clisites stage 14 kept (#10149, #11048, #14874 ×2 intest/published-entry-stderr-error-listener.test.tsand 1 intest/published-subpath-hook-body.pin.test.ts) were searched again the same way. For #10149,cc21aad8edis "Part of" it and leaves the decision to the maintainer, andd18bc32770applies its reasoning. For #11048,568de194ecfiles it unassigned as an open support decision. So no deciding commit was found, and they stay as they are.Verification
All at head
89264b0c1e. Heavy runs went throughscripts/pm/os-verify-lock.shwithOS_VERIFY_LOCK_SLOT=issue-20594-offlist.pnpm exec turbo run build --filter='./packages/*' --filter='./packages/*/*' --concurrency=2→ 71 successful, 71 total (7 cached), lock verdict command-exit 0.pnpm --workspace-concurrency=2 --filter @objectstack/cli --filter @objectstack/plugin-hono-server run typecheck→ bothDone, 0error TS, lock verdict command-exit 0.check:test-typecheckholds both ledgers where they were: cli 3 files / 28 errors / 6 pinned signatures, plugin-hono-server 0.--listFilesOnlyshows cli'stsconfig.test.jsonprogram holdsvitest-tiers.tsandvitest-tiers.fixtures.ts, and plugin-hono-server'stsconfig.typecheck.jsonholdsobjectstack.config.ts.unittier:pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2→ 239 files, 3391 tests passed, lock verdict command-exit 0. It holdstest/vitest-tiers-partition.test.ts, which imports bothvitest-tiers*.tsfiles, and every run loadsvitest.config.ts, which importsvitest-tiers.ts.integrationtier, run locally because the diff touchesbin/(the spawn entries):--project integration --maxWorkers=2→ 67 files, 572 passed and 1 skipped (a data-conditionalskipIfintest/migrate-meta-default-range.test.ts), lock verdict command-exit 0. It holdstest/published-entry-stderr-error-listener.test.ts, which spawnsbin/run.js.OS_TEST_TIERS=nightly:test/run-dev-unbuilt-workspace.e2e.test.ts,test/published-entry-stderr-nonblocking.e2e.test.tsandtest/run-dev-stderr-nonblocking.e2e.test.ts→ 3 files, 21 tests passed, lock verdict command-exit 0.pnpm check:app-nav-i18n(--self-test, then the real run;lint.ymlruns this) → exit 0. The self-test passes, and the pass line readsOK (11 contributor(s), 4 locale(s), 2 app(s) — setup: 55 merged nav id(s), account: 12 merged nav id(s) — every id labelled in every locale).node packages/cli/bin/run.js --helpexit 0 (66 lines);node packages/cli/bin/run-dev.js --helpexit 0 (66 lines);node packages/cli/bin/run.js --versionexit 0;node packages/cli/bin/run.js no-such-command-xyzexit 2 with oclif'scommand … not found.aaad682dbcagainst head, 6 files, 6,224 base tokens: 0 files differ. Leaf tokens come from the TypeScript parser (getChildren, JSDoc nodes skipped;.js/.mjsparsed as JS). Controls, in memory only: a comment inserted into each file, 0 of 6 differ; a statement appended, 6 of 6; one character flipped inside each file's firstStringLiteral, 6 of 6. The comment control's first form put its comment above the shebang in the three#!files and moved tokens in 3 of 6. It was corrected to insert below the shebang before it was used as a reading.pnpm check:nul-bytesexits 0.npm pack --dry-runinpackages/clipacksbin/run.js(abintarget, packed regardless offiles) besidedist/**,README.md,CHANGELOG.md,LICENSEandpackage.json. It packs none ofbin/run-dev.js,scripts/orvitest-tiers*.ts, so thepatchchangeset coversbin/run.jsalone.plugin-hono-serverpacks noobjectstack.config.ts, and itssrc/never imports that file. After the build, the first 48 characters of each of the 27 added comment lines occur in 0 files of any package'sdist/. Control: thesrcdocblock phrasedocument" (commit 2b641ddd4). Both device-flowoccurs in 1 file ofpackages/cli/dist. (plugin-hono-server's bundler keeps no comments, so itsdistgives no reading either way: its own control phrase occurs in 0 files.)Gates
All at head
89264b0c1e, exit codes captured before any pipe.node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, no paths, derives 57 commands (7 paths against merge baseaaad682db). Re-derived after fetchingorigin/mainto31c39964fc: the same 57. None of the 5 upstream commits touches a derivation input or a file here.dispatch-gates --ranover the recordedCOMMAND :: exit CODElist → "57 derived, 57 run, 0 NOT-MEASURED, 0 UNRUN", exit 0.node scripts/check-changeset-fixed.mjs,pnpm check:authz-resolver,pnpm check:error-code-casing,pnpm check:filter-alias-parityandnode scripts/release-pending-publish.mjs --self-test→ exit 0 each.pnpm lint(repo-wideeslint . --no-inline-config, the family the derivation does not name) → exit 0, 2026-09-30T21:33:42Z to 21:36:25Z.node scripts/check-issue-citations.mjs(diff mode, in the 57) reads 0 files, because none of these paths is on its declared surface. The hand census above is the measurement for this surface.check-empty-changeset("1 declaring changeset(s) added"),check-changeset-no-major("nomajorbump"),check-adr-0087-registration("no declared-breaking changeset").git merge-tree --write-treeof this head againstorigin/main3fbf3ca617is clean.The 57 derived commands: stage 16's 52, minus
pnpm --filter @objectstack/spec run check:skill-examples,pnpm check:dispatcher-error-vocabulary,pnpm check:engine-double-contract,pnpm check:objectql-double-limit,pnpm check:query-options-erasure,pnpm check:type-check-coverage,pnpm check:type-check-debtandpnpm check:where-matcher, plus the changeset family (check-adr-0087-registration,check-changeset-no-major,check-empty-changeset, each with its--self-test;pnpm check:changeset-gate-self-tests,pnpm check:objectui-changeset,pnpm check:pm-changeset-deadline-census),pnpm check:i18n,pnpm check:i18n-coverage,pnpm check:i18n-walk-parityandnode scripts/pm/release-rehearsal-clone.mjs --self-test.Acceptance notes
check-app-nav-i18n.mjsholds 14 ([finding] 两个机制对贡献式导航条目的缺翻译都结构性失明 —— check-app-nav-i18n 按 APP_NAME=setup 缩窄,parity 测试只走静态声明 #17891 ×13, The contributednav_connect_agententry in the Account app has no translation key in any locale, so the same page renders 「连接智能体」 under Setup and "Connect an Agent" under Account for the same user #17759 ×1: the self-test'sexpecttitles and messages, and the--self-testpass line, which prints(#17891)at runtime). The lane surface holds 97 dead string sites in all. They belong to runtime strings in thedomain:clipackages carry tracker numbers (114 messages in 8 packages, 254 ledgered ids): this lane's share of the #20513 A/A burn-down #20752's form D (fold5911936313).Generated by Claude Code