Skip to content

Commit 6bff748

Browse files
objectstack-fleet[bot]hotlongclaude
authored
docs(cli): re-anchor the dead tracker citations in packages/cli/src to the commits that decided them, and the source-hashes header at its producer (#20656)
Part of #20594 Clause-②: no ## What changed This is stage 3 of the `domain:cli` lane of the dead-citation sweep: `packages/cli/src/**`, plus the generated-header producer the `domain:services` pointer on the card hands this lane. Every comment or docblock site in scope that cited a tracker number answering 404 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 says in its own words what that commit decided. PR #20533 is the method; PR #20624 (stage 1, `packages/runtime`) and PR #20632 (stage 2, `packages/rest`) are the precedents this follows. Later stages cover `types` and the rest of the lane, so this PR says `Part of` and the card stays open. That is **313 comment sites on 304 lines in 64 files, covering 63 numbers**: the census's 170 rewritable sites (of its 174), 142 more in test comments (which the census defers), and one site whose dead number is the second half of a slash-joined pair the citation grammar does not read (`serve.ts:1173`, `#10943/#11157`). Each rewritten line cites one of **62 distinct commits**, except the six `#15041` sites, which cite ADR-0104's 2026-09-05 addendum: that ADR records the maintainer ruling the lines describe, and the ruling allows the ADR to be cited instead of a commit. Only comments changed in `packages/cli/src`, apart from the two string literals this stage declares (next section). Every touched file keeps its line count (319 lines out, 319 in, over 65 files), so no line citation into these files moves. Thirteen of the 319 lines held no dead site; each is the other half of a sentence that had to change: `create.ts:326`, `doctor-organizations-message-spelling.test.ts:11`, `environments.test.ts:162`, `generate.ts:153`, `serve-cluster-host-resolution.test.ts:816`, `serve-host-fallback-base.test.ts:5`, `validate.ts:336`, `validate.ts:813`, `validate.ts:815`, `hook-body-lowering.test.ts:10`, `format.ts:1132`, `format.ts:1435` and `i18n-extract.ts:34` (mostly 「that card」 to 「that commit」 once the antecedent became a commit). **No citation number is added.** Every tracker number on an added line was already on the line it replaces. One PR number stands on an added line, and it was there before: `doctor-organizations-message-spelling.test.ts:9` read 「PR #12463 (#12151) single-sourced」 and now reads 「Commit 27b6902 (PR #12463) single-sourced」, keeping the live PR as a convenience link beside the commit, as the ruling allows (#12463 is that commit's own PR). No code token moves (see the guard below). Four dead comment sites are left on purpose, listed under "The sites left". Two more files outside `packages/cli`: a `patch` changeset for `@objectstack/cli`, and the shrink-only `check:doc-authoring` prose-id ledger (see Deviations). ## The source-hashes producer and its 27 generated companions The claim declares these as the only strings this stage moves, and the regeneration of the files they write. - **The producer.** `packages/cli/src/utils/i18n-extract.ts:2294` is the string literal `renderSourceHashModule` writes as line 8 of every `LOCALE.source-hashes.generated.ts`. It read 「bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B).」 and now reads 「bundles (commit 09b4f4e, maintainer ruling #12069 Option A, extending #8765 Option B).」. `09b4f4e4e` is the commit that extended the #8765 Option B source-hash mechanism to the generated bundles per maintainer ruling #12069 Option A; its message says exactly that, and it is the anchor stages 1 and 2 of #20596 gave `#11671`. #12069 and #8765 answer 200 (REST and web) and stay. The comment at `:249` beside `previousSourceHashes` cites the same commit. - **The flag's help text** (`packages/cli/src/commands/i18n/extract.ts:227`, author-shown CLI help), in form D: the lesson in words, no number. It read 「the provenance companion that lets a stale fill be told from a translation (#11671).」 and now reads 「the provenance companion that records which source revision each generated leaf is still a copy of, so a stale fill can be told from a translation.」. The rest of the description is unchanged. - **The regeneration.** `node scripts/check-i18n-bundles.mjs --write`, which runs each package's documented `os i18n extract` command from its `i18n-extract.config.ts` (every one of the nine carries the source-hashes flag), on a CLI built from `47241dd80e`. Before it, the bundle check reported the nine packages DRIFTED, 3 bundles each, against the new producer. After it: - exactly 27 files changed, `+27 −27`: 3 locales in `packages/platform-objects/src/apps/translations`, `plugins/plugin-{approvals,audit,security,sharing,webhooks}` and `services/service-{messaging,realtime,storage}`; - every hunk is `@@ -8 +8 @@`, and the one removed and one added line are the same in all 27 files; - each file with line 8 deleted hashes identically at base and head (27 of 27), so every hash entry is byte-identical; - `git status` shows nothing else in the nine packages, tracked or untracked; - `node scripts/check-i18n-bundles.mjs` then reads all nine packages in sync (7 bundles each), and `check:i18n-stale-fill` serves 27 of 27 companions with 0 stale fills. - **H3 holds.** `git grep -n "#11671" -- '*.source-hashes.generated.ts'` answers 0 hits at head; the same grep at `04b202e5cb` answers 27 (the positive control). - **Not published by the nine.** The header is a comment their bundlers strip: after the build, none of the nine packages' `dist` holds `09b4f4e4e` or the header's own phrase 「Each entry is the digest of the SOURCE REVISION」, while the export name `…GeneratedSourceHashes` (the positive control) is in each `dist`. So the regeneration changes no published byte of those packages, and no changeset is owed for them. The other lanes' stages can keep leaving their generated copies alone, as the pointer asked. ## Held files `packages/cli/src/utils/sdui-manifest.ts` and `sdui-manifest.test.ts` stay at their base blobs (`41c4549ffe` and `3a242b54e0`, equal at base and head), because PR #20589 edits them. They carry four citations (`#4409` once, `#20113` three times), and all four answer 200, so no dead site is held and there is no anchor to list for a follow-up. ## Census: `packages/cli`, before and after **Instrument.** The gate's own `node scripts/check-issue-citations.mjs --census --json`, read-only and unchanged, run with the fleet token. Its surface is comment prose in `packages/**/src/**/*.ts` with string literals blanked, and it defers `*.test.ts`. The count is its `allocated-but-absent` findings under `packages/cli/`. Every run enumerated the whole board (185 pages), so none read a truncated board. | reading | tree | board | whole-repo `allocated-but-absent` | cli sites | lines | files | numbers | |---|---|---|---|---|---|---|---| | before | base `04b202e5cb`, run 2026-09-29T12:35:39Z to 12:43:03Z | enumerated, 185 pages, frontier #20642, 18,469 numbers | 1,707 | **174** | 167 | 30 | 50 | | after | head `6bb4d3b531`, run 13:46:09Z to 13:54:25Z | enumerated, 185 pages, frontier #20652, 18,479 numbers | 1,510 | **4** | 4 | 3 | 2 | The before count equals the card's 174 at `f11b5f20a2`. The 4 left are the deliberate sites below. The whole-repo drop is 197: this diff's 170 cli sites plus the 27 generated headers (3 in each of the nine packages; nothing else moved in any of them). The two merges of `origin/main` moved no count. An earlier after-run at `d1e09a7eed` (13:19:18Z to 13:29:41Z, frontier #20649) read the same 4 and 1,510; `packages/cli` and the 27 companions are byte-identical between the two heads. One more attempt at `6bb4d3b531` (13:35:15Z) exited 3, PREREQUISITE NOT MET, on a malformed board page, and measured nothing; the run in the table is its retry. **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) and `classifyCitation` over every `.ts`/`.tsx` file under `packages/cli/src` (298 files), against a board enumerated through the gate's own `enumerateBoard`. The lit controls #20594, #19123 and #20632 answered 200 and are on both boards; the dead controls #11671, #10514 and #14828 answered 404 and are on neither. | reading | tree | board | citations | dead | src comment | test comment | src string | test string | |---|---|---|---|---|---|---|---|---| | before, 12:43Z | `04b202e5cb` | 185 pages, frontier #20642 | 3,029 | **368** | 174 | 142 | 4 | 48 | | after, 13:39Z | `6bb4d3b531` | 185 pages, frontier #20650 | 2,715 | **54** | 4 | 0 | 2 | 48 | Its src-comment column equals the census's 174 and 4, which is the control on the second instrument. The resolving citations (1,468 and 755 in comments, 50 and 53 as pull requests, 32 cross-repo) are the same in both readings, so no live citation was lost; the drop of 314 is exactly the dead sites removed (312 grammar-read comment sites and the two `#11671` strings). The one slash-joined dead number the grammar never reads (`#11157` in `#10943/#11157`) is gone too: a separate scan for dead `#N` tokens the grammar skips answers 1 before and 0 after. ## Per-number table Sites and files are the dead comment sites in scope at the base, test sites counted in brackets. `left` is a site with no deciding commit (see below). `strings kept` counts string-literal sites, which are tokens and stay as they were. Every anchor was read in its message or its diff, not only in its subject: it is the commit that made the change the line describes, and its own message or diff names the number it replaces or adds the citation the line carries. | number | comment sites / files | rewritten | left | strings kept | anchor | |---|---|---|---|---|---| | `#6217` | 12/8 (1 test) | 12 | 0 | 0 | `2b641ddd4` | | `#6238` | 2/1 (2 test) | 2 | 0 | 2 | `c8d6f6e08` | | `#6265` | 1/1 (1 test) | 1 | 0 | 0 | `cfb549db8` | | `#6268` | 6/2 (2 test) | 6 | 0 | 1 | `68f5eccb1` | | `#6293` | 2/2 (1 test) | 2 | 0 | 0 | `c39a911ae` | | `#6344` | 2/2 (1 test) | 2 | 0 | 0 | `cfb549db8` | | `#6345` | 21/6 (11 test) | 21 | 0 | 4 | `e2798fab7` | | `#6535` | 1/1 | 1 | 0 | 0 | `a92b1793c` | | `#8692` | 5/2 (3 test) | 5 | 0 | 3 | `712e185db` | | `#10326` | 1/1 | 1 | 0 | 0 | `675ab574e` | | `#10359` | 2/2 | 2 | 0 | 0 | `15b63e85a` | | `#10398` | 1/1 (1 test) | 1 | 0 | 0 | `0681a76b8` | | `#10485` | 1/1 | 1 | 0 | 0 | `35ad101bc` | | `#10499` | 1/1 | 1 | 0 | 0 | `6d441e41f` | | `#10504` | 8/1 | 8 | 0 | 0 | `ff5733e03`, `0d4bd93e7` | | `#10514` | 16/2 (16 test) | 16 | 0 | 2 | `5359a9b4c` | | `#10763` | 1/1 (1 test) | 1 | 0 | 0 | `c2b97c2a1` | | `#10769` | 9/2 (6 test) | 9 | 0 | 0 | `3d7deb700` | | `#10908` | 10/3 (6 test) | 10 | 0 | 5 | `9cc6777d3` | | `#10909` | 2/1 | 2 | 0 | 0 | `5a90c56d1` | | `#10917` | 1/1 | 1 | 0 | 0 | `7940de5e0` | | `#10926` | 1/1 | 1 | 0 | 0 | `d173125fb` | | `#10943` | 5/3 (2 test) | 5 | 0 | 0 | `46d34ab7c` | | `#10944` | 9/3 (6 test) | 9 | 0 | 3 | `e598b1cbc` | | `#10952` | 5/1 | 5 | 0 | 0 | `0d4bd93e7`, `ff5733e03` | | `#10953` | 1/1 (1 test) | 1 | 0 | 0 | `be7262e72` | | `#10967` | 6/2 (6 test) | 6 | 0 | 1 | `e4a71d418` | | `#11022` | 1/1 (1 test) | 1 | 0 | 0 | `21756b325` | | `#11025` | 3/2 | 3 | 0 | 0 | `1c3a46f87` | | `#11048` | 1/1 | 0 | 1 | 0 | — | | `#11071` | 3/2 | 3 | 0 | 0 | `50fb191dc` | | `#11157` | 15/4 (10 test) (1 slash-joined) | 15 | 0 | 2 | `a4cb7817f` | | `#11172` | 5/1 | 5 | 0 | 0 | `05181e8cc` | | `#11174` | 2/1 (2 test) | 2 | 0 | 1 | `ab23c67ab` | | `#11221` | 3/1 (3 test) | 3 | 0 | 1 | `e278a2970` | | `#11331` | 3/2 | 0 | 3 | 0 | — | | `#11671` | 1/1 | 1 | 0 | 0 (2 moved) | `09b4f4e4e` | | `#12125` | 11/3 | 11 | 0 | 0 | `79cf692b0` | | `#12151` | 3/2 (3 test) | 3 | 0 | 3 | `27b690272` | | `#12162` | 2/1 (2 test) | 2 | 0 | 0 | `c0f5e8f21` | | `#12181` | 4/2 (3 test) | 4 | 0 | 0 | `cf71d73f8` | | `#12297` | 3/1 | 3 | 0 | 0 | `9fd45a952` | | `#12943` | 2/1 (2 test) | 2 | 0 | 0 | `090f2302e` | | `#12961` | 1/1 | 1 | 0 | 0 | `901355c3b` | | `#13109` | 2/1 | 2 | 0 | 0 | `8b236c826` | | `#13193` | 6/2 (3 test) | 6 | 0 | 0 | `faff497fd` | | `#13218` | 1/1 | 1 | 0 | 0 | `c45d8e6b4` | | `#13347` | 3/3 (2 test) | 3 | 0 | 3 | `098a08ffa` | | `#13651` | 12/7 (4 test) | 12 | 0 | 0 | `ada3834ad` | | `#14192` | 2/2 | 2 | 0 | 0 | `4d0d9445a` | | `#14336` | 4/1 | 4 | 0 | 0 | `79c71d29d` | | `#14397` | 1/1 | 1 | 0 | 1 | `957f7bb45` | | `#14657` | 20/2 (7 test) | 20 | 0 | 1 | `431979e67` | | `#14667` | 1/1 | 1 | 0 | 0 | `dc7c226b9` | | `#14824` | 3/1 | 3 | 0 | 0 | `cf6b67164` | | `#14828` | 22/3 (7 test) | 22 | 0 | 3 | `08706f0e0` | | `#14829` | 9/3 (6 test) | 9 | 0 | 3 | `ee370d318` | | `#14902` | 1/1 | 1 | 0 | 0 | `61821e54c` | | `#15040` | 6/3 (3 test) | 6 | 0 | 2 | `8644d1d33` | | `#15041` | 6/5 (4 test) | 6 | 0 | 2 | ADR-0104 (2026-09-05 addendum, landed as 932acc3) | | `#15045` | 2/2 (1 test) | 2 | 0 | 0 | `288fe9c34` | | `#16887` | 2/1 (2 test) | 2 | 0 | 0 | `9cdffbe36` | | `#17080` | 1/1 (1 test) | 1 | 0 | 0 | `8b4890343` | | `#17081` | 8/3 (4 test) | 8 | 0 | 3 | `f721ef0ff`, `24d622b94` | | `#17883` | 10/3 (5 test) | 10 | 0 | 3 | `b06b2db5c` | | **total** | **317** | **313** | **4** | **49** | **62 distinct commits + ADR-0104** | Every cited sha matches exactly one object (`git rev-parse --disambiguate`, count 1 for each of the 62), is a commit, has one parent, and is an ancestor of the base (`merge-base --is-ancestor`, exit 0 for all 62). The checkout is not shallow (`--is-shallow-repository` false); the control leg `13a6cb4ad` exits 0 and the negative control (this branch's own `47241dd80e`, not on `main`) exits 1. ADR-0104's 2026-09-05 addendum landed as `932acc3df`, which passes the same four checks. Where an earlier stage gave a number an anchor and the cli site describes the same decision, the same anchor is reused (17 numbers, #17081 for its application half only; for example `e2798fab7` for #6345, `68f5eccb1` for #6268, `35ad101bc` for #10485, `09b4f4e4e` for #11671 and `61821e54c` for #14902), so each number carries one anchor across the tree. Several numbers are the PR number of their own anchor commit (#6344, #10398, #14667, #16887), so the sha is the same object the number named. **Numbers with more than one anchor, by site:** - `#10504` / `#10952` (`format.ts`): `ff5733e03` added the opt-in zero row for `UI:` alone and `0d4bd93e7` made it required for every section, so lines naming both now name both commits. `format.ts:1573` read 「(#10504, #10952, #11172)」 and now reads 「(commits ff5733e, 0d4bd93, 05181e8)」. - `#10943` / `#11157` (`serve.ts`): `46d34ab7c` made the host importer's fallback base a caller-supplied parameter, and `a4cb7817f` made `serve` pass its own base and collapsed `importConfigPlugin` from three branches to two. The slash-joined `serve.ts:1173` 「(#10943/#11157)」 now reads 「(commits 46d34ab and a4cb781)」; `serve.ts:1459` 「(#10908 → #11157)」 reads 「(commits 9cc6777 → a4cb781)」. - `#17081` (8 sites): one card with two halves. `f721ef0ff` took the platform's half (the `Dev admin` banner line says what the account sees) for 7 sites; `format.ts:1132` describes the application half and now reads 「[#17556 — commit 24d622b]」, the spelling the spec stage used at `dev-login.zod.ts:10`, with `format.ts:1133` naming #17081 in words (「its parent card」). - `#15041` (6 sites): the decision is a maintainer ruling recorded verbatim in ADR-0104's 2026-09-05 addendum, whose Sequencing section names the three steps the lines cite. So the lines cite the addendum (「The ruling in ADR-0104's 2026-09-05 addendum decided it」, 「sequencing step 2 of ADR-0104's 2026-09-05 addendum」), not a commit. **Wordings to check, each true of its commit:** - A commit does not rule. Where a line said a number ruled, it now says what the commit did with the ruling: 「semantics by the ruling commit 68f5ecc landed」, 「Ruled at triage, landed as commit e598b1c」, 「the triage commit 9cc6777 landed requires this text be CHOSEN」, 「Rulings #5728 and #14412, and the ruling commit d173125 landed,」, and `resync.ts:96` keeps the ruling's date from `712e185db`'s message: 「commit 712e185 (the 2026-08-15 ruling)」. - A line that named a DEFECT by its number now says so: 「the defect commit 79cf692 fixed」, 「the defect commit 9cc6777 fixed」, 「the exact defect commit 08706f0 closed」, 「the hard-failure class of the `22P02` commit 8644d1d fixed」, 「Before commit 5359a9b (raw)」 / 「Since commit 5359a9b (masked)」. - **A stale claim, corrected by its anchor.** `validate.ts:813-815` said 「`ManifestSchema` is not `.strict()` and drops unknown keys with nothing said (#14192)」, but `ManifestSchema` has been `strictObject` since `4d0d9445a`, which landed before the commit that wrote the sentence. Citing that commit in a present-tense sentence would contradict itself, so the three lines move to the past tense: 「was not `.strict()` and dropped unknown keys with nothing said until commit 4d0d944, so acting on that inference produced a manifest that looked fine」. - **Anchors found by diff, not by subject.** `#10326` has no commit message naming it; `675ab574e` took the 1.7.1 measurement the line cites, and its own changeset and test name #10326. `#12162` is named by no message either; `c0f5e8f21` is the only commit that ever added the number, and its message states the point the lines make. `#14397`'s citation was added by `957f7bb45`'s own diff, which is the change the heading describes. `#10763` is added three times by `c2b97c2a1`'s diff. - `#10499` (`init.ts:978`): the line uses the earlier drift between the two scaffold paths as precedent; that drift was about pnpm build approvals, and `6d441e41f` gated the two paths against each other, so the line reads 「already drifted once (closed by commit 6d441e4)」. - `#6293`: `c39a911ae` is the commit that found the 「headless husk」 `JSON.stringify(stack)` leaves where a declaration was; `bf4ebe2f3`, which wrote the cli lines, only cites it. - Quoted text: `generate-field-type-vocabulary.pin.test.ts:92` sits inside a verbatim quotation of the file's former clause, so the commit stands in an editorial bracket (「([commit ee370d3]'s pin argues this in full)」), as PR #20624 did. - Headings with a dash rule (`serve.ts:1125`, `:1459`, `:1521`, `:3276`, `serve-cluster-host-resolution.test.ts:831`, `generate-field-type-vocabulary.pin.test.ts:260`, `files-to-references.ts:274`) trim their trailing dashes to hold the width; `serve-cluster-host-resolution.test.ts:893` is a trailing comment whose code part is byte-identical. ## The sites left **No deciding commit (4 sites, all visible to the census):** - `init.ts:267` (#11048): 「whether to admit that band at all is #11048」 names an open support decision (pnpm 10.0 to 10.4). The only commit naming it, `568de194e`, files it unassigned; no later commit decides it, and the floor is still `>=10.15` at the base. - `plugin/publish.ts:118`, `osplugin.ts:21`, `osplugin.ts:49` (#11331): the parenthetical points at the unpack-time integrity re-verification leg, which was never built (`b60f48b52`: 「The enforce leg points at #11331」). No commit decides it; the ownership clause on the same lines comes from `f89812e4d`, but the number is not about that clause. **String sites kept as tokens (49).** 48 are test titles and test-code strings in 22 files. One is a non-test string: the `os meta resync` skip explanation at `commands/meta/resync.ts:71`, 「on installs from before #8692, the platform's own seeded defaults carry that same stamp」, which an operator reads (see Acceptance notes). ## Mechanical guard: no code token moves, and exactly two string literals do The check compares the TypeScript parser's leaf tokens (TypeScript 6.0.3, JSDoc nodes excluded, comments being trivia) of each touched file at base `04b202e5cb` against the working tree, over all 65 touched files in `packages/cli/src`, and lists EVERY differing token, not only the first. Controls mutate the head text in memory only, so nothing on disk moved for them. - Real run: 156,633 base tokens, token counts equal in every file, **exactly 2 differing tokens**, both `StringLiteral`: `commands/i18n/extract.ts:227` (the help text) and `utils/i18n-extract.ts:2294` (the header line). No other token in any file differs. - Comment-insertion control (`serve.ts`): still exactly those 2 (exit 1, no new difference). - Code-insertion positive control (a declaration in `serve.ts`): the count differs (17,815 to 17,820) and a third difference appears at token 0. - String positive control (one character added inside the first string literal past offset 2000 of `serve.ts`): a third difference appears, a `StringLiteral` at token 145. - The 27 generated companions: 2,940 base tokens, 0 differing tokens (their only change is a JSDoc line). Line balance: every touched file is +N/−N, and every line count is equal at base and head (94 files). A raw scan of the 92 changed source and generated files for control bytes finds none (its positive control, a scratch file holding a U+0001 byte, matches). ## Changeset This change ships bytes, so a `patch` changeset for `@objectstack/cli` is included, in PR #20632's form and level. Unlike stage 2's, it names the two strings, because 「Comments only」 would not be true here. Measured on the built package: `files[]` is `dist`, `README.md` and `CHANGELOG.md`. After the build, the rewritten docblocks reach `dist`: 142 `commit SHA` citations in 39 of its `.js` / `.d.ts` files. For example `storage-driver.ts:91`'s rewritten line 「(commit 68f5ecc). These are the」 is in both `dist/utils/storage-driver.d.ts` and `.js`, beside the unchanged next line of the same docblock 「runtime's declarations, not copies of them — in particular」 (the positive control); a negative control phrase appears nowhere. The new help text is in `dist/commands/i18n/extract.js`, the header literal with `09b4f4e4e` is in `dist/utils/i18n-extract.js`, and `#11671` appears nowhere in the package's `dist`. ## Gates (head `6bb4d3b531`) This host has no `flock`, so `os-verify-lock.sh` ran in its declared unlocked mode. Its disclosure, verbatim, from each locked run at this head: ```text os-verify-lock: VERDICT command-exit 0 · UNLOCKED (declared) · no usable `flock` on this host, so the shared verify lock was NEVER taken and NOTHING was serialized · ran 110s (1m50s) · declare it in the PR body · pnpm exec turbo run build --filter='./packages/*' --filter='./packages/*/*' --concurrency=4 os-verify-lock: VERDICT command-exit 0 · UNLOCKED (declared) · no usable `flock` on this host, so the shared verify lock was NEVER taken and NOTHING was serialized · ran 12s · declare it in the PR body · pnpm --filter @objectstack/cli typecheck os-verify-lock: VERDICT command-exit 1 · UNLOCKED (declared) · no usable `flock` on this host, so the shared verify lock was NEVER taken and NOTHING was serialized · ran 150s (2m30s) · declare it in the PR body · pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2 os-verify-lock: VERDICT command-exit 0 · UNLOCKED (declared) · no usable `flock` on this host, so the shared verify lock was NEVER taken and NOTHING was serialized · ran 5s · declare it in the PR body · pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2 test/published-subpath-console.pin.test.ts test/published-subpath-hook-body.pin.test.ts os-verify-lock: VERDICT command-exit 0 · UNLOCKED (declared) · no usable `flock` on this host, so the shared verify lock was NEVER taken and NOTHING was serialized · ran 9s · declare it in the PR body · pnpm --filter @objectstack/cli exec vitest run --project integration --maxWorkers=2 src/commands/generate-declared-column-default.pin.test.ts src/commands/generate-string-family-width.pin.test.ts src/commands/meta/delete-reset-carriers.test.ts os-verify-lock: VERDICT command-exit 0 · UNLOCKED (declared) · no usable `flock` on this host, so the shared verify lock was NEVER taken and NOTHING was serialized · ran 30s · declare it in the PR body · pnpm --filter @objectstack/cli exec vitest run --maxWorkers=2 src/commands/validate-json-strict-exit.e2e.test.ts ``` The regeneration ran earlier against the same unlocked lock, on a closure build at `47241dd80e`: ```text os-verify-lock: VERDICT command-exit 0 · UNLOCKED (declared) · no usable `flock` on this host, so the shared verify lock was NEVER taken and NOTHING was serialized · ran 102s (1m42s) · declare it in the PR body · pnpm --workspace-concurrency=2 --filter '@objectstack/cli...' --filter '@objectstack/platform-objects...' --filter '@objectstack/plugin-approvals...' --filter '@objectstack/plugin-audit...' --filter '@objectstack/plugin-security...' --filter '@objectstack/plugin-sharing...' --filter '@objectstack/plugin-webhooks...' --filter '@objectstack/service-messaging...' --filter '@objectstack/service-realtime...' --filter '@objectstack/service-storage...' build ``` The branch merged `origin/main` twice, as the dispatch orders (`d1e09a7eed` merging `cd901d7a5f`, and `6bb4d3b531` merging `0cb72cfc72`); neither touched `packages/cli`, a translations directory or the prose-id ledger. After each merge: `pnpm install --frozen-lockfile`, then the whole workspace (`turbo run build --filter='./packages/*' --filter='./packages/*/*'`, 71 tasks, 71 successful). - **Tests** (unit tier, then every touched file outside it): - `vitest run --project unit`: 234 files, 3,342 tests; **232 files and 3,337 tests pass, 5 tests in 2 untouched files fail on this host**: `test/published-subpath-console.pin.test.ts` and `test/published-subpath-hook-body.pin.test.ts` compare a path under `os.tmpdir()` with the realpath the resolver answers, and on macOS `/var` is a symlink to `/private/var`. With `TMPDIR` set to its realpath the same two files pass, 29 of 29 (the fourth line above). Neither file is in this diff; the cli change is comments and two strings. - The unit tier holds 32 of the 36 touched test files. The other four ran by name: the three integration-tier files (`--project integration`: 3 files, 60 tests pass) and the nightly-tier `validate-json-strict-exit.e2e.test.ts` (`OS_TEST_TIERS=nightly`: 1 file, 7 tests pass). So every touched test file ran. - The producer's own tests and the companions' readers: `test/i18n-extract-source-hashes.test.ts`, `test/i18n-extract-companion-orphan.test.ts` and `test/i18n-extract-generated-apps-leaf-provenance.test.ts` (3 files, 25 tests); `@objectstack/platform-objects`'s `src/apps/translations` (24 files, 430 tests); `@objectstack/plugin-sharing`'s `src/translations` (3 files, 13 tests). All pass, at `d71ab0e27e`, whose `packages/cli` and companions are byte-identical to this head. - **Typecheck:** `pnpm --filter @objectstack/cli typecheck` exits 0. `tsc --listFiles` counts 298 `src` files under `tsconfig.json`, all 158 `src` test files among them, so every touched test file is type-checked; `check:test-typecheck` holds its ledger (3 files, 28 errors, 6 pinned signatures). - **Lint:** the repo-wide `pnpm lint` (`eslint . --no-inline-config`) exits 0 at `6bb4d3b531` (2026-09-29T13:44:40Z to 13:45:11Z). Not narrowed. - **Citation judging:** `node scripts/check-issue-citations.mjs --base origin/main` exits 0 after the second merge: 67 citations judged across 56 files (66 resolve, 1 cross-repo). These are the live numbers that stay on rewritten lines, 54 of them the #12069 and #8765 pair in the 27 headers. It defers `*.test.ts`, so the added-minus-removed count over the whole diff covers the rest: 0 numbers added. - **Derived gates:** `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` at `6bb4d3b531` derived 76 families (68 before the prose-id ledger commit put a `scripts/` path in the change set). All 76 ran, and `--ran` over a record carrying each exit code reads 「76 derived, 76 run, 0 NOT-MEASURED, 0 UNRUN」 (a derived zero). - 75 exit 0. One exits 1 for this host, not for this diff: `pnpm check:bash32-floor` runs its self-test first, and 7 of its 179 cases assert that each bash-4 probe is shell THIS host can parse; the only bash here is `/bin/bash` 3.2.57, which cannot. The gate's real-tree half, run alone (`node scripts/check-bash32-floor.mjs`), exits 0: 32 tracked shell files, 0 findings. The self-test half is NOT MEASURED here, reason: no bash 4+ on this host; CI's bash measures it. This diff touches no shell file. - Among them: `check:doc-authoring` (809 pinned sibling prose-id sites, no growth, no unrecorded burn-down), `check:i18n` (9 packages in sync), `check:i18n-coverage` (13 configs, none new), `check:i18n-stale-fill` (27 of 27 companions served, 0 stale), `check:i18n-walk-parity`, `check:nul-bytes` (9,283 files, no raw control bytes), `check:published-files`, `check:cli-command-ids` and `check:issue-citations` (self-test). - **Artifact rosters:** 35 of the 38 non-self-test roster rows exit 0 at `6bb4d3b531`, `check-changeset-fixed` (its roster sits under `.changeset/`), `check:error-code-casing`, `check:filter-alias-parity` and `check:authz-resolver` (the four whose rosters share a directory with this diff) among them. The other three, `check-closing-target-claim`, `check-partof-closing-keyword` and `check-single-claim-paths`, need a pull request's context; they are run against this PR once it exists and reported on the card. The 17 checker-health-only rows were not run. ## Hypotheses (measured first) - **H0 holds.** The filtered census answers 174 dead sites at `04b202e5cb` (167 lines, 30 files, 50 numbers), equal to the card's count at `f11b5f20a2`: no drift. - **H1 holds, with the listed exceptions.** After the rewrite the filtered census answers 4, all for an unfound anchor: `#11048` (an open support decision) and `#11331` three times (an enforce leg never built). No site is held for an open PR: the two held files carry no dead citation. The claim's read and this stage's two reads of the open PRs' file lists (12:38:15Z, 7 open PRs; 13:58:56Z, 9 open PRs) found only PR #20589 in `packages/cli/src` and none touching a companion or the prose-id ledger. PR #20652, opened after the claim, edits `packages/platform-objects`'s three `LOCALE.objects.generated.ts` bundles beside the companions: no file overlap. - **H2 holds, by the token guard.** A comment-stripped comparison of every touched file (the parser's leaf tokens, JSDoc excluded, every difference listed) finds exactly the two declared `StringLiteral` tokens and nothing else, and its code and string controls each add a difference. The emitted `dist` is not byte-identical, because docblocks and the two strings ship, which is why the changeset is `patch`. - **H3 holds.** `git grep -n "#11671" -- '*.source-hashes.generated.ts'`: 0 hits at head, 27 at `04b202e5cb`. ## Acceptance notes - **Form D, not touched here.** 49 dead numbers stand inside string literals: 48 in test titles and test-code strings (22 files, 21 numbers), and one an operator reads: the `os meta resync` skip explanation at `commands/meta/resync.ts:71`, 「on installs from before #8692, the platform's own seeded defaults carry that same stamp」. The comments beside it (`resync.ts:55` and `:96`) now cite `712e185db`. Ruling D (no number, the lesson in words) is a string change outside this stage's two declared strings; the card already carries a form-D stage for the lane (ACCEPT 5888034755), and this string is its author-shown first. - **`#11671` outside this stage's surface.** The number still stands in other lanes' files: the nine `scripts/i18n-extract.config.ts` docstrings (outside the census surface), six `src/translations/index.ts` files (`plugin-approvals`, `plugin-audit`, `plugin-security`, `plugin-webhooks`, `service-realtime`, `service-storage`), six sites in `packages/platform-objects/src` (`source-hash.ts` three times, `setup.translation.ts`, `metadata-translations/index.ts`, `source-hash.test.ts`), `packages/cli/test/i18n-extract-source-hashes.test.ts:3`, and 13 in `scripts/**` and `.github/workflows/lint.yml`. The anchor for all of them is `09b4f4e4e`. Noted for those lanes' stages, not touched. - **Outside the scope and the census surface.** `packages/cli` outside `src/**` holds 242 dead citations: `test/` 185, `scripts/` 27, `bin/` 10, `vitest.config.ts` 15, `vitest-tiers.ts` 2, `vitest-tiers.fixtures.ts`, `tsconfig.test.json` and `test-typecheck-debt.json` 1 each (whole-file projection, the before board). They stay for a later stage of this card. - **A host-dependent pin.** `test/published-subpath-console.pin.test.ts` and `test/published-subpath-hook-body.pin.test.ts` fail 5 tests on macOS, where `os.tmpdir()` is a symlink, and pass with a realpath `TMPDIR`. CI's Linux runners do not see it. Noted, not filed. - **A hex colour in the whole-file reading.** `serve.ts:5621` holds the CSS colour `#141417` in a string. The census blanks strings, so it never sees it; the supplementary whole-file projection reads it as a citation beyond the frontier (`never-issued`). It is not a citation; it is the second of the two `src string` sites left in the supplementary table, beside `#8692`. - **The slash-joined grammar gap, again.** `CITATION_RE` refuses a `#` preceded by `/`, so the second number of `#A/#B` is never judged. In `packages/cli/src` one such dead number stood (`serve.ts:1173`, rewritten here). The same shape PR #20624 and PR #20632 reported, for the grammar family PR #20533 names. ## Deviations - **One file outside the claim's surface.** `scripts/doc-authoring-prose-id.baseline.json`, the shrink-only ledger of `check:doc-authoring`'s sibling-package prose-id leg, pinned the two `#11671` string sites this stage removes, so the gate went red (「the prose-id baseline is STALE — pinned entries exceed the tree」) and prescribed regenerating it in the same PR. It was regenerated with its own command (`node scripts/check-doc-authoring.mjs --census-ledger`, which refuses to grow the ledger): 4 lines removed, the two `#11671` pairs and nothing else. The claim's file surface did not name this file; it is the gate's own remedy for the two strings the claim does name. - One site beyond the census's read grammar (the slash-joined `#11157`) is rewritten, and thirteen more lines are the other half of a rewritten sentence (listed under What changed). - `validate.ts:813-815` moved to the past tense, because the claim they carried was false before this change (see Wordings to check). - Anchor research for 64 of the 65 numbers ran in four read-only research subagents; every proposal was checked here against the commit's message or diff and every changed line was reviewed, and eight were reworded by hand (the four lines two subagents shared, 「that commit's to」, the kept PR link, and two companions). - Commit trailers are AGENTS.md's model-free pair (`Claude-Session` plus `Co-authored-by: Claude`), and the pre-push trailer check passed on every push; the harness's attribution reminder asked for a model-named trailer, which AGENTS.md overrides. The two merge commits carry git's default message. --- _Generated by [Claude Code](https://claude.ai/code/session_local_1d2a197c-c20e-4e90-9be8-413d4d432289)_ --------- Co-authored-by: Jack Zhuang <50353452+hotlong@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com>
1 parent f4ce10c commit 6bff748

94 files changed

Lines changed: 360 additions & 350 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
'@objectstack/cli': patch
3+
---
4+
5+
Provenance comments in `@objectstack/cli` were re-anchored
6+
7+
Comment and docblock lines under `src/` that cited tracker numbers which no
8+
longer resolve on GitHub now cite the commit in this repository's history that
9+
decided the matter, and say in their own words what was decided. Two strings
10+
move with them: the `os i18n extract --source-hashes` help text now says what
11+
the provenance companion records instead of citing a number, and the header
12+
that flag writes into each `<locale>.source-hashes.generated.ts` cites the
13+
commit that introduced the companion. No command, flag, exit code, error code,
14+
type, export or runtime behaviour changes.

‎packages/cli/src/commands/cloud/login.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* ## `--json` here is NDJSON — a declared exception, same as `os login` (#6730)
1313
*
1414
* Everywhere else in this CLI `--json` means "stdout is exactly one JSON
15-
* document" (#6217). Both device-flow login commands are declared exceptions to
15+
* document" (commit 2b641ddd4). Both device-flow login commands are declared exceptions to
1616
* that, and they are the SAME exception: one compact JSON document per line.
1717
*
1818
* ### What was broken

‎packages/cli/src/commands/compile.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ export default class Compile extends Command {
228228
// one. See `printAuthoringAdvisories` for the measurement.
229229
printAuthoringAdvisories(ruleAdvisories);
230230
};
231-
// [#12125] The ADR-0087 D2 conversion notices, hoisted for the SAME reason
231+
// [commit 79cf692b0] The ADR-0087 D2 conversion notices, hoisted for the SAME reason
232232
// and under the SAME ruling as the four lists above — one field over. The
233233
// notices were computed at step 2 (below) and reached the terminal SUCCESS
234234
// payload alone, so all nine failure exits dropped a list already in hand.

‎packages/cli/src/commands/create.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
* ObjectStack is a developer tool, so a documented developer-facing command has
3939
* to work for the developer who follows the docs. This command is documented on
4040
* four public doc pages (`deployment/cli`, `plugins/index`, the two
41-
* `protocol/kernel` pages) and, until #14824, every one of those readers got a
41+
* `protocol/kernel` pages) and, until commit cf6b67164, every one of those readers got a
4242
* project that CANNOT INSTALL:
4343
*
4444
* - the emitted `package.json` declared `@objectstack/spec` and
@@ -81,7 +81,7 @@
8181
*
8282
* ## The emitted package NAME follows the placement too (#15530)
8383
*
84-
* The audience decides the name, and #14824 moved the audience without moving
84+
* The audience decides the name, and commit cf6b67164 moved the audience without moving
8585
* the name: the standalone default kept stamping `@objectstack/plugin-<name>`
8686
* — a scope the developer it now scaffolds for cannot publish to — onto every
8787
* project, with the emitted README telling them to install it from there. The
@@ -321,9 +321,9 @@ function pluginDirName(name: string): string {
321321
* ## Why the standalone name is unscoped
322322
*
323323
* `@objectstack` is a scope the developer this command scaffolds FOR cannot
324-
* publish to. Until #14824 that was arguably fine, because the default output
324+
* publish to. Until commit cf6b67164 that was arguably fine, because the default output
325325
* landed inside this monorepo, where every sibling really does carry the scope.
326-
* That ruling pointed the default at the developer's own directory and the name
326+
* That commit pointed the default at the developer's own directory and the name
327327
* did not move with the audience — so the standalone emission stamped a scope
328328
* its owner does not own onto every project generated from it. ⚠️ Nothing in
329329
* this repository can see that: the name is never resolved from a registry

‎packages/cli/src/commands/database-driver-allowlist.pin.test.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@
3636
* `start.ts` and once in `dev.ts`, and that duplication is exactly how the two
3737
* can drift apart from each other as well as from the resolver.
3838
*
39-
* SCOPE (#6860 vs #6345): this pins the CANONICAL kinds — the `driverId` values
39+
* SCOPE (#6860 vs commit e2798fab7): this pins the CANONICAL kinds — the `driverId` values
4040
* the resolver produces. The resolver also accepts aliases (`pg`, `mysql2`,
4141
* `libsql`, `mingo`, `wasm`, …) which the flag deliberately does not offer;
42-
* converging that vocabulary is #6345's job, and this pin is written so it does
42+
* converging that vocabulary was commit e2798fab7's job, and this pin is written so it does
4343
* not prejudge it — an alias collapses to its canonical id and is not demanded
4444
* of the flag.
4545
*/
@@ -101,7 +101,7 @@ function candidateTokens(): string[] {
101101
* is supplied so it resolves normally; the catch is kept so the derivation
102102
* survives another kind growing the same "recognized but unusable" shape.
103103
*
104-
* `err.recognized` is what keeps that catch honest (#6345). The resolver now
104+
* `err.recognized` is what keeps that catch honest (commit e2798fab7). The resolver now
105105
* ALSO throws `UnsupportedDriverError` for a spelling nothing claims — the CLI
106106
* half of "both hosts refuse the same input", which replaced a silent fall-through
107107
* to the dev SQLite default. Reading `driverType` off that error would report the

‎packages/cli/src/commands/database-driver-flag-derivation.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
* Deriving the flag from the CONFIG-CONTRACT face (`DRIVER_ID_ALIASES` /
2525
* `resolveDriverId`) instead of the SELECTION face would offer `sqlite3`,
2626
* `better-sqlite3`, `mariadb` and `inmemory` — spellings neither boot host has
27-
* ever accepted as a selection (#6345 fixes the selection face as the union of
27+
* ever accepted as a selection (commit e2798fab7 fixes the selection face as the union of
2828
* what the two hosts accepted the day the ruling was written). The last case here
2929
* drives oclif's real parser to prove they are still refused at parse time.
3030
*/

‎packages/cli/src/commands/doctor-organizations-message-spelling.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
*
77
* ── What this closes ─────────────────────────────────────────────────────
88
*
9-
* PR #12463 (#12151) single-sourced every operator-facing occurrence in
9+
* Commit 27b690272 (PR #12463) single-sourced every operator-facing occurrence in
1010
* `serve.ts` onto `Serve.ORGANIZATIONS_RUNTIME_PKG` and pinned what those
11-
* messages render. `doctor.ts` sat outside that card's file surface and kept
11+
* messages render. `doctor.ts` sat outside that commit's file surface and kept
1212
* its own bare `@objectstack/organizations` literal inside
1313
* `TENANCY_POSTURE_FIX_HINTS`, under no check of any kind — so a roster-key
1414
* rename left `os doctor` printing a package name that boot no longer

‎packages/cli/src/commands/environments/environments.test.ts‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ describe('os environments commands', () => {
7777
});
7878

7979
/**
80-
* Pin (#10967): every `examples` entry on EVERY CLI command source names a
80+
* Pin (commit e4a71d418): every `examples` entry on EVERY CLI command source names a
8181
* command id THIS CLI ACTUALLY REGISTERS.
8282
*
8383
* ## The failure this exists to refuse
@@ -94,7 +94,7 @@ describe('os environments commands', () => {
9494
* exactly as before while any `examples` string spelling the OLD topic
9595
* silently stops being true — not a parse error, not a type error, nothing
9696
* a build catches. A user who copy-pastes the stale line hits `Error:
97-
* Command projects:bind not found.` (exit 2). That is the shape #10967
97+
* Command projects:bind not found.` (exit 2). That is the shape commit e4a71d418
9898
* fixed under `environments/*.ts`; this pin targets the MECHANISM (an
9999
* example naming an id this CLI does not register), not the literal string
100100
* `os projects`, so it keeps working for a topic nobody has renamed yet —
@@ -123,7 +123,7 @@ describe('os environments commands', () => {
123123
* ## Population: EVERY command source, via AST — not via `import`
124124
*
125125
* The property is checked against every non-test file under
126-
* `packages/cli/src/commands/**`, not just the five #10967 touches — a
126+
* `packages/cli/src/commands/**`, not just the five commit e4a71d418 touched — a
127127
* five-file population is exactly the set that is already correct, so it
128128
* cannot catch the defect class returning anywhere else (it did not catch
129129
* it in `register.ts`/`whoami.ts`/`logout.ts`, discovered by hand below).
@@ -157,23 +157,23 @@ describe('os environments commands', () => {
157157
* `examples` USED TO say `os auth register` / `os auth whoami` / `os auth
158158
* logout`, though no `auth` topic has ever existed for them (confirmed via
159159
* `--help`: `Error: Command auth:whoami not found.`) — the same defect
160-
* class as #10967, found by scanning the whole tree, but not #10967's to
161-
* fix (outside its dispatched file surface). Filed as #11221 and fixed
162-
* there, so `EXCLUDED` is now empty and all three are scanned by the main
160+
* class commit e4a71d418 fixed, found by scanning the whole tree, but not that commit's to
161+
* fix (outside its dispatched file surface). Fixed separately by commit e278a2970,
162+
* so `EXCLUDED` is now empty and all three are scanned by the main
163163
* assertion like every other command source.
164164
*
165165
* The mechanism stays, because it is what made that handoff safe: a silent,
166166
* permanent exemption is its own defect — a file excluded here stops being
167167
* checked by this pin forever, even after the excluded condition no longer
168168
* holds. So a second `it.each` re-runs the SAME predicate over the excluded
169169
* files and asserts it still finds an unresolved entry. That is not
170-
* hypothetical here: when #11221's fix removed the last unresolved entry,
170+
* hypothetical here: when commit e278a2970 removed the last unresolved entry,
171171
* this assertion went red on purpose for all three files, and its message
172172
* ("remove it from EXCLUDED above") is what retired them. The pattern
173173
* (map-of-reason + filtered main assertion + a "still needs its exclusion"
174174
* retiring assertion) matches
175175
* `packages/create-objectstack/src/starter-comments-self-contained.test.ts`'s
176-
* `EXCLUDED`, which has retired this same way before (#11022).
176+
* `EXCLUDED`, which has retired this same way before (commit 21756b325).
177177
*/
178178
describe('#10967 pin: examples resolve to a real command id', () => {
179179
const ENVIRONMENTS_DIR = fileURLToPath(new URL('.', import.meta.url));
@@ -293,7 +293,7 @@ describe('#10967 pin: examples resolve to a real command id', () => {
293293
/**
294294
* Nothing is excluded — every command source is scanned. `register.ts` /
295295
* `whoami.ts` / `logout.ts` each carried a self-retiring entry here while
296-
* their `os auth …` examples were #11221's to fix; that fix landed, the
296+
* their `os auth …` examples awaited commit e278a2970's fix; that fix landed, the
297297
* retiring assertion below went red exactly as designed, and the map goes
298298
* back to empty rather than staying around as a silent exemption over three
299299
* root-level commands. The assertion stays, so the next entry added here is

‎packages/cli/src/commands/explain.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ export const SCHEMAS: Record<string, SchemaInfo> = {
218218
{ name: 'description', type: 'string', description: 'App description' },
219219
{ name: 'navigation', type: 'NavItem[]', description: 'Menu tree. Every item needs `id` (snake_case) + `label` + a discriminant `type`, plus that type\'s own target key: object -> `objectName`, dashboard -> `dashboardName`, page -> `pageName`, url -> `url`, report -> `reportName`.' },
220220
// `theme` here described a key that is only an alias of `branding`; the
221-
// `themes` metadata surface itself was retired at #10485 (ADR-0049) —
221+
// `themes` metadata surface itself was retired by commit 35ad101bc (ADR-0049) —
222222
// `app.branding` is the one colour surface. `logo` and `defaultRoute`
223223
// were the same class of row: neither is an AppSchema key, and both are
224224
// now rejected by name (`logo` -> `branding`).

‎packages/cli/src/commands/generate-builtin-id-column.pin.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.
22

33
/**
4-
* THE #15040 PIN: the `id` column both migration generators emit is the column
4+
* THE commit 8644d1d33 PIN: the `id` column both migration generators emit is the column
55
* `driver-sql` actually creates.
66
*
77
* ## The defect
@@ -46,7 +46,7 @@
4646
*
4747
* ## The audit-stamp columns: all three rows now ruled (#15521)
4848
*
49-
* #15040 measured a THIRD disagreement in the same pass and recorded it here
49+
* Commit 8644d1d33 measured a THIRD disagreement in the same pass and recorded it here
5050
* without correcting it. #15521 split that record into rows and has now ruled
5151
* every one of them the same way — the generator follows the driver:
5252
*

0 commit comments

Comments
 (0)