docs(spec): nine migration-step rationale passages and two registry comments drop their deleted tracker numbers (stage 11) - #21578
Conversation
… numbers (stage 11) Ruling C+D on the hand-written parts of packages/spec/src/migrations/registry.ts. Form C, two comments: the dead #8495 now cites commit 4bfe1a5 (PR #8666) and says what it refused; the dead #6239 cites commit f549a0d, the sweep that retired the viewId-addressed view CRUD. Form D, nine author-shown rationale units (step 17's mongodb paragraph and eight step-18 fragments) that carried the eleven dead numbers. Each unit now takes no number: the dead ones go, the live ones in the same unit go with them, and the sentence states the cited decision in words. Text only: no step, fragment id, order, entry or code token moves. Claude-Session: https://claude.ai/code/session_01YDt3PzwfrkuFzUBF89WPmM Co-authored-by: Claude <noreply@anthropic.com>
…stage 11) `pnpm --filter @objectstack/spec check:generated --fix`, which proved only docs/protocol-upgrade-guide.md stale and regenerated only it: line 68, the projection of step 17's mongodb paragraph, drops its two numbers. Claude-Session: https://claude.ai/code/session_01YDt3PzwfrkuFzUBF89WPmM Co-authored-by: Claude <noreply@anthropic.com>
The step rationales ship in @objectstack/spec's dist (dist/migrations/index.js and .mjs carry the new phrases, the old ones in 0 files, an unchanged control phrase in the same 2), so the release takes a patch note. Clause-②: no. Claude-Session: https://claude.ai/code/session_01YDt3PzwfrkuFzUBF89WPmM 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:
⛔ 1 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 138 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 7d24d78f7cfbbe3f53afd64fb4eca19a8c32c9bb && git checkout 7d24d78f7cfbbe3f53afd64fb4eca19a8c32c9bb
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 6dd99b82c38cd68b51c86241d53c5b7dda670a08 64bbd3693ef2f926e4f3d61920fbac5f2ee65913 && git checkout -B drift-repro 6dd99b82c38cd68b51c86241d53c5b7dda670a08 && git merge --no-ff 64bbd3693ef2f926e4f3d61920fbac5f2ee65913
node scripts/docs-audit/affected-docs.mjs --json 6dd99b82c38cd68b51c86241d53c5b7dda670a08
|
Contract reviewServed-tier: PR #21578 ( Scope against the claim and the ruling. The claim names 2 form-C comments and 11 form-D rationale sites in the hand-written parts of ① Derived judgmentsText only — right. All 11 hunks in Form C, the 2 comments — right. Both anchors are commits in this repository,
Live numbers in the two edited comment paragraphs stay (#8336, #5295, #6414, #6486, all 200): form C reaches dead citations. #8336 moved onto an added line in the re-wrap and resolves. Form D, the 9 rationale units — each states its cited decision truly. Checked against each commit's subject or body (for c459da6, 9e0ba21 and bc56e18, whose subjects omit the number, against the number inside the commit's own diff: 8, 80 and 30 occurrences) and against the live cards read over REST:
Regenerated artifact — right. Numbers added: one, Check-runs on the head, read at 2026-10-03T10:59Z: 33 runs, 26 success, 3 skipped (Build Docs, Console Pin Gate, Packed-tarball smoke), 4 in progress (Test Core 1/6, 2/6 and 4/6, Type Check · workspace), 0 failure. Check Changeset, Lint & Repo Gates, Spec property liveness, Build Core and the other three Type Check runs are success. The four in-progress runs are read as not concluded, not as passes; landing waits on them under the seat's pre-landing protocol. Nothing the diff touches (text inside strings and comments, one generated guide line) is a plausible cause for any of them to turn. ② Semver level
③ Boundary flagsDev flags (the deviations), each answered:
Open question (one): which card carries the 192 live author-visible numbers left in
Out-of-scope findings (two), both carrier Docs-drift advisory on the PR ( Implemented-by: VERDICT: PASS Generated by Claude Code |
ACCEPT — PR #21578 @
|
Part of #20234
Clause-②: no
Stage 11 of the dead-citation sweep: the hand-written parts of
packages/spec/src/migrations/registry.ts, under ruling C+D (record5749154545on #19123). At base, those parts carried 13 sites citing deleted tracker numbers: 2 in source comments and 11 in step rationale text that authors read. A steprationaleis author-shown:os migrate metaprints it per hop, and step 17's is projected intodocs/protocol-upgrade-guide.md. Text only. No step, fragment id, fragment order, generated entry, conversion or code token moves.mongodbparagraph and 8 step-18 fragments (a fragment is "one retirement's sentences"). Each of those 9 units now carries no number at all. The 11 dead numbers go, and so do the 11 live numbers in the same units, because form D removes every number from author-visible text. Each sentence states the cited decision in words, read from its decision record, not its title.docs/protocol-upgrade-guide.mdline 68.check:generated --fixproved it the only stale artifact of 15.gen:migration-registryhas nothing to do, because no generated region mirrors a rationale.@objectstack/specpatch changeset.What changes
Line numbers are at base
e909aa0a23. "Dead" meansGET issues/Nanswers 404, with no redirect followed.mongo→mongodbbecame the canonical driver id under one shared driver vocabulary (commit e2798fa). #4410:datasource.configis parsed against the declared driver's contract, andmongoandmongodbboth map to the mongo contract (commit cdf4d9a)mongodb. The two spellings have both been accepted sincedatasource.configwas first parsed against its driver's own contract"connector.errorMapping, ADR-0049 (commit 13c48c2)defaultout of the form-view vocabulary only, disposition 甲 (commit c459da6, whose diff added this fragment). objectui#6263: the console's form controls never read the key, and the ruling closed that card. #7246 / #7388: maintainer ruling of 2026-08-10, "enforce" on the object-field face (applyFieldDefaults)lookupsteering params (commit 15d58db). #4509: 17.0.0 retired the keys the lint could never warn about, the mapping trio among them (commit 5966c2a)extractQuery/errorPolicy/batchSize"${…}in memorypersistence.path/persistence.keyat publish (commit 4bfe1a5). #8336: the 2026-08-13 ruling refusing placeholders in datasource connection config at publish (the protocol-17 entrydatasource-config-placeholder-refused)contributesmembers; a controlled three-repo census found one non-test read (commit be21955). #10726:routeslater retired too, ruled Option B (commit bc56e18, whose diff carries the number). #11169: retirekinds[].globs, maintainer ruling 2026-08-24 (commit be21955)routeswas left to a ruling of its own, which retired it as well (theplugin-manifest-contributes-routes-retiredentry)"themesandThemeSchema, ruled B (commit 35ad101)submitLabelcopy key, Option A (commit d173125). #9249:element:formretired whole (theelement-form-retiredfragment, which renders earlier)element:formwas retired"${…}refused at publish inpersistence.path/persistence.key)"ViewProtocolas whole defs (commit f549a0d, whose subject names the number)view-management-protocol-retired)"Where a commit message does not name its number, the anchor was confirmed from the files that commit added: c459da6, 9e0ba21 and bc56e18 each carry their number in their own diff. Both sha anchors added to comments are unambiguous:
rev-parse --disambiguatecount 1, andGET commits/SHAreturns the full sha (a 4-character control returns 422).merge-base --is-ancestoranswers 0 for all 11 anchors. The checkout is shallow, with a boundary of 2026-06-28. Every anchor is later than that, and exit 0 proves ancestry on its own.What stays, and why (counts left on #20234)
domain:specpackages carry tracker numbers (spec175 andlint83 messages): this lane's share of the #20513 A/A burn-down #20749 (the runtime-string burn-down) counts migration-registry text as its share, yet both of its stage claims (5965785560,5966674486) excludemigrations/registry.tsas "packages/spec/src: 1,277 comment lines still cite 170 deleted tracker numbers (1,295 sites) — the staged remainder of ruling C+D on #19123, measured by PR #20226 #20234's stage 11". So no stage currently covers them.migrations.test.tspins one of them, the live filterAppForUser 只走 app 顶层 navigation —— areas[] 里的 nav 项权限过滤仅客户端生效(#4651 移除假闸门后剩下的真缺口) #4722 in step 17, so whichever stage takes them moves that pin. This is reported as the open question.5923089344are outside this stage, as dispatched.Verification
Deadness. A TypeScript 6.0.3 walker runs the citation gate's own
extractCitationsover two projections of the file (comment-only and string-only, line structure kept). It classes each site by kind and by region; the generated regions are the 6os-generatedpairs. At base, the hand-written parts hold 262 sites: 48 in comments (1 cross-repo) and 214 in rationale strings (19 cross-repo), over 177 distinct in-repo numbers. A REST probe of all 177 (issues/N, no redirect followed; lit control #20234 and dead control #8710 at the start, after every 50 and at the end): 165 answer 200, 12 answer 404, and 0 answer 301. Controls behaved 5/5 lit and 5/5 dead. The 12 numbers sit on exactly the 13 sites stage 10 named (5902947213). At head, the 162 distinct numbers all answer 200 (controls 5/5 and 5/5), and 0 dead sites remain. Site-set difference: 24 removed (13 dead and 11 live, all inside the 9 units) and 1 added (#8666, live, the PR link beside commit 4bfe1a5 in a comment, which form C allows). The 911 sites in generated regions do not change.Text only. A second instrument over TypeScript 6.0.3 evaluates the step-17
rationaleand every step-18 fragmenttext(72 owners). It masks each of those initializers to one token that names its owner and cuts every comment, JSDoc included. The base and head leaf-token streams are IDENTICAL: 37,526 tokens, sha256 prefix647bc09580ac619eon both sides. Evaluated values changed for exactly 9 owners, the units listed above, and each word diff is the citation and its replacement words only. Controls mutate the head in memory: a comment insertion stays IDENTICAL, and each of these DIFFERS: a fragmentorderchange, a fragmentidchange, an unmasked string edit, a conversion-id string edit, and an appended declaration (6/6).Regeneration. Before regeneration,
check:migration-registryandcheck:spec-changesexit 0, andcheck:upgrade-guideexits 1.check:generated --fixregenerated only the guide. Its word diff on line 68 showsmongodb(#6345). becomingmongodb. and #4410 becoming the decision in words. After theorigin/mainmerge (6dd99b82c3, throughos-regen-merge.sh, which touched none of these paths), a rebuild pluscheck:generatedreports "All 15 generated artifacts are up to date". No regeneration commit was owed.Pins and quotes. No test asserts a changed phrase.
content/docs/**andskills/**quote none of them. The other hits for the old spellings are independent comments in other files (live numbers), release-owned CHANGELOGs and one test title, all left alone.Tests and gates (at head
64bbd3693e; all builds and tests throughscripts/pm/os-verify-lock.sh, each VERDICT command-exit 0):pnpm --filter @objectstack/spec build, and a fullturbo run build --concurrency=2over./packages/*and./packages/*/*(71/71).scripts/step18-rationale-merge.test.ts.pnpm --filter @objectstack/spec typecheck:check:test-typecheckOK.node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack: 85 families derived, 85 run, all exit 0, reconciled with--ran("0 NOT-MEASURED, 0 UNRUN"). That includescheck:doc-authoring(self-test and run),check:issue-citations,check:nul-bytes,check:generated,check:migration-registry,check:upgrade-guideand the changeset gates. Three of them first exited 3 (prerequisite: unbuilt dist) and were rerun green after the full build.eslint --no-inline-config --format jsonover the one touched.tsfile reports 1 file, 0 errors, 0 warnings, andisPathIgnoredis false.eslint.config.mjs:327-328states that type-aware linting is never enabled, so a text edit cannot move an untouched file's verdict. The repo-widepnpm lintis CI's run.scripts/build-schemas-check-mode.test.ts(it overran the foreground cap on its own in stage 10; it parses this file's source, whose code tokens the text-only proof shows unchanged), plusdef-key-collisionsand the twopublish-smoke-*files (temp-tree rebuild or server boot).Changeset.
packages/specfiles[]shipsdist. In the built dist, the new phrases appear in 2 files (dist/migrations/index.js,.mjs), the old spellings in 0, and an unchanged control phrase in the same 2. Hencepatch.Acceptance notes
domain:specpackages carry tracker numbers (spec175 andlint83 messages): this lane's share of the #20513 A/A burn-down #20749 whose stages currently exclude this file). They are not filed.Generated by Claude Code