Repository navigation
Commit 0ef9029
test(spec): the second root-level test file group's titles state each cited decision in words instead of a tracker number (stage 29) (#22376)
Part of #20749
Clause-②: no
Stage 29 of this card: the next area of class (e), the test strings
shipped under `packages/spec/src`, as ruled in `5902360492` on #20513.
This stage takes the second name-ordered group of the test files
directly in `packages/spec/src/`: 15 files,
`root-entry-migrations-split.pin.test.ts` through `stack.test.ts`. 12 of
them carried 57 tracker ids in test titles (59 ids), one of which sits
in a declared describe label rather than a literal title. All 57 now
either state what their record decided, in words (form D), or drop the
number where the title already says it. Text only: no assertion,
identifier, test count, code comment, file name or non-test file
changes. No file directly in `src/` carries an id in a string any more
(`type-alias-convention.pin.test.ts`, which sorts after the group, reads
0); the card stays open for the subdirectory files named under
Acceptance notes.
## Census (re-taken first)
The instrument is stage 28's `census28.cjs`, byte-identical (md5
`31d8488b5194b8d3048e3fcaec0efaed`, the value stage 28 published): an
AST walk over the `packages/spec/src` test files, one message per folded
string (a lone literal, a template, or a plus chain) that matches the
gate's id pattern, a title when the folded root is argument 0 of a
describe / it / test / suite / bench call, comments never read. It was
run against the three published readings before it was trusted, and all
three reproduce exactly: 128 messages / 130 ids in 37 files at stage
27's landing `f7b8a5932b`, 191 / 200 in 53 files (titles 162 / 168,
other 29 / 32) at `aa09db58c9`, and 73 / 76 in 24 files at stage 28's
landing `b7e01fbbd`.
| reading | messages / ids | files |
|:--|--:|--:|
| the group, base `43fc50051` | 57 / 59 (titles 56 / 58, other 1 / 1) |
12 of 15 |
| class (e) whole, base `43fc50051` | 73 / 76 (titles 61 / 64, other 12
/ 12) | 24 |
| class (e) whole, this head | 16 / 17 (titles 5 / 6, other 11 / 11) |
12 |
| the group, this head | 0 / 0 | 0 of 15 |
The group reads 57 / 59, stage 28's landing figure: no re-cut. The
census at `3f80f1716` (the dispatch base) and at stage 28's landing read
the same per file as at `43fc50051`.
Per file, messages at base: root-entry-migrations-split.pin 1,
stack-artifact-crossref 11 (12 ids), stack-artifact-packages 3,
stack-cross-reference-envelope 2 (one title, one declared label),
stack-dev-logins 4, stack-email-template-locale-floor 6,
stack-inline-action-crossref 13, stack-json-stage-package-body 4,
stack-refusal-envelopes 2, stack-requires 4 (5 ids),
stack-top-level-strict 5, stack 2. `stack-conversions-record`,
`stack-duplicate-action-key` and `stack-provenance` carry no id in any
literal.
Controls:
- Pathspec: the 15 named paths hit the control word `describe(` in 15 of
15 files, and a nonsense word in none; the census scanned 15 of 15.
- Lit outside the group, at base and head: `ai/build-progress.test.ts` 2
/ 2 and `ui/dashboard.test.ts` 2 / 2.
- Lit at base and dark at head, inside the group:
`stack-artifact-crossref` 11 / 12, `stack-inline-action-crossref` 13 /
13, `stack-requires` 4 / 5 and `stack-cross-reference-envelope` 2 / 2
each read 0.
- Dark at both ends: `stack-conversions-record` has no id anywhere;
`stack-duplicate-action-key` and `stack-provenance` carry an id in one
comment line each and read 0. The 15 group files read 0 at head while 55
of their comment lines still carry ids (112 id-bearing lines at base,
comments included, 14 files).
- Planted, in a scratch tree: an id in a describe title, a plus-chain
title, an expect message, an it.each row name, a template title and a
declared string each read once (6 / 6); a comment, a six-digit number,
an HTML entity and a markdown heading read 0.
## What changed
57 literals, one line each, in 12 files: +57 / -57. Every file keeps its
line count.
- 6 state the decision in words: "a modal target names a page, only" for
the inline and the embedded modal-target refusals
(stack-inline-action-crossref 133 and 330); "it was never built by a
stack producer" for the hand-built stack object composeStacks refuses
before either artifact-scoped rule runs (stack-artifact-crossref 380);
"compatibility with the multi-package artifact" (stack-artifact-crossref
270); "unchanged from before the dangling-`objectName` refusal"
(stack-inline-action-crossref 399); and the declared label
"hooks[].object (the hook-ownership rule)", the rule ADR-0130 states as
"the split must follow hook ownership" (stack-cross-reference-envelope
91).
- 4 get their subject back where the number was the only subject: "the
no-floor report: warn-once bookkeeping" and "the floor guard's declared
scope boundary" (stack-email-template-locale-floor 159 and 179), "the
strict top-level door: the accept side does not move" and "defineStack
surfaces the unknown-top-level-key refusal" (stack-top-level-strict 173
and 225).
- 47 drop a number the title already explains, with its connector: a `#N
— ` or `#N ` prefix, a `[#N] ` prefix, or a trailing `(#N)`. That
includes the twin title `stack-artifact-packages.test.ts:355`, which
read `does not warn about an undeclared composition rule (#5005 rule 3)`
and now reads `does not warn about an undeclared composition rule`, the
same text stage 28 gave its copy at
`compose-stacks-manifest-preserve.test.ts:308`.
## Cited records
26 distinct ids. 25 answer 200 and were read: the body and the comment
thread as the API serves it, with the rulings and landings that the
rewritten titles state read in full. #10485 answers 404; its decision
was read from its landing commit `35ad101bc` (the `themes` carrier
retired under ADR-0049 enforce-or-remove; `app.branding` is the one
colour surface) and from the unknown-key strictness ledger, which
records the maintainer's 2026-08-21 disposition as retiring the
authorable surface, the phrase the title keeps verbatim. The comments
counter of four records differs from what the comments endpoint serves
(#14122 serves 21 of 22, #17614 5 of 6, #16449 0 of 5, #18056 5 against
a counter of 4); everything served was read, and #16449's decision is in
its body.
What each record decided, as the titles now say it:
- #6739, ruling A (2026-08-09): a `type: 'modal'` target names a page,
only; the object fallback is consumer leniency and enters retirement.
- #20367, ruling B: one authoring shape; `defineStack` and
`composeStacks` stamp a provenance mark and `composeStacks` refuses an
unmarked input with `STACK_PROVENANCE_MISSING` / 422.
- #7456, Option A: the embedded `objectName` gets the registered rule's
existence check, and only a dangling name newly refuses.
- #19926, ruling A: `packages: null` is malformed, not absent.
- #19784, ruling C: a non-array concat key is refused with the envelope.
- #5005 (2026-08-04): same value passes, a conflict throws a
prescriptive error, an undeclared top-level key warns.
- #8687, Shape B: the top-level stack door is strict, and the lint
yields to it.
- #14122 / #18202: one artifact carries N packages; the artifact-scoped
permission and seed references resolve against the artifact, a stack
that does not opt in is untouched.
- #17518, ruling A prime: the artifact-stage and record-stage package
bodies are declared beside the assembled one.
- #6889 and #7397: inline page-element actions and object-embedded
actions get the registered action rule's target cross-references.
- #17063: the `type: 'page'` list-view mount is retired. #17556: an app
declares its own `devHint` / `devLogins`. #17614 and #18056: the
no-`en-US`-floor report and its declared scope. #14552 and #15963: every
`defineStack` refusal carries an ADR-0112 envelope; #16449 registers
each shipped code in the ledger. #3265 and #3308: `requires` is
validated at the producer and the camelCase aliases are removed. #14153
and #20332: trigger capability validation and its `triggers` without
`automation` pair. #20646: the root entry stops carrying the migration
registries. #2611: named import mappings are wired into the import path.
## Readers
173 needles (each old literal, a 24-character window around each id, and
the text left and right of each id) were searched with `git grep -F`
over the tracked tree at the base outside the 15 files, with a lit
control (`composeStacks` in `stack.zod.ts`, hit) and a dark control (a
nonsense string, no hit). One needle hit, one line: a `//` comment in
`packages/qa/dogfood/test/fixtures/override-composite-fixture.ts` that
quotes the tail of one title with its id. It is a comment, not a reader.
The only reader of the declared label is the file's own
`describe(row.label, ...)`. No group file reads a test name
(`currentTestName`, `expect.getState`, snapshots: 0). The 15 file names
appear elsewhere only in prose and comment lines, in
`packages/spec/test-typecheck-debt.json` (keyed by file and error text,
not by title) and in two `dispatch-gates.mjs` /
`check-changeset-no-major.mjs` fixtures that name a path or a changeset
file. Every old literal occurs exactly once across the 15 files (its own
site).
## Text-only proof
- `textonly28.cjs` (stage 28's, md5 `957eff6b3837d762b8e03d070155930a`),
per file, base text against head text: both texts with every string
token masked are byte-equal (code and comments), the string-token counts
are equal, and every changed token sits in a describe / it / test title
position or on a declared line, carried an id at base and carries no `#`
plus digits at head. 15 / 15 files SAME; 57 changed tokens, 56 titles
and 1 declared label (run with `--declared 91`); per-file counts exactly
as predicted in writing at 2026-10-08T22:57Z, before the edit. The 3
untouched files read SAME with 0 changed.
- 17 / 17 controls on scratch copies of the head files behave as
predicted: an identifier rename, a numeric literal, a comment edit, a
non-title string given an id, a rewritten title given a new id, a title
that was id-free at base edited, one rewritten title reverted to base
(SAME, 0 changed), an it.each title given an id, an expect message
changed, a title re-split into a plus chain, a template title given an
id, a test added, an id appended to a rewritten title in a many-title
file, an untouched file (SAME, 0 changed), the declared label run
without `--declared` (refused), the declared line plus another changed
string (refused) and the declared line alone (SAME, 2 changed).
- `git diff -U0`: 57 plus and 57 minus lines, each the planned line; 0
added lines carry `#` plus digits; control-byte scan of the 12 files and
of this body: 0 hits.
## Tests
- The 15 files with `--project local --project repo` and the JSON
reporter, at the base (same worktree, before the edit) and at the head
`65b42b7d1`: 405 / 405 passed in 15 files, 108 suites each side;
per-file test count and status sequence identical in 15 / 15; 229 full
names changed, 0 mismatches against the plan (each head name equals the
base name with the planned replacement applied); 0 duplicate full names
either side; names with `#` plus digits 229 at base, 0 at head.
- spec `vitest run --project local`: 626 files passed, 18740 tests
passed | 1 todo, exit 0.
- spec `typecheck`: `VERDICT command-exit 0`; `check:test-typecheck` 52
files / 246 errors / 135 pinned signatures held, unchanged; `tsc
--listFilesOnly -p tsconfig.test.json` holds 15 of 15 group files.
- turbo build of all packages before the gates: `Tasks: 71 successful,
71 total`. Heavy runs went through `scripts/pm/os-verify-lock.sh` (slot
`dev-20749-s29`).
- No reverse verification or ablation applies: no assertion, gate or
reader moved.
## Gates
All at `65b42b7d1`. The dispatch list (77 commands, derived at
`3f80f1716`) equals the list re-derived from the real change set at this
head, 12 paths against merge base `43fc50051` (114 changed lines):
nothing added, nothing dropped. All 77 exit 0 and `dispatch-gates --ran`
reads "77 derived, 77 run, 0 NOT-MEASURED, 0 UNRUN". Also run, exit 0:
the five roster families that share a directory with the diff
(`check:meta-url-spelling`, `check:spec-changes`,
`check:authz-resolver`, `check:error-code-casing`,
`check:filter-alias-parity`) and `check:generated` ("All 15 generated
artifacts are up to date", measured against the dist the full build
wrote at this head). ESLint, narrowed and proven: 15 files linted with
`--no-inline-config`, 0 errors, 0 warnings; the population read from
ESLint's own config is 15 configured, 0 ignored; no file has
`parserOptions.project` or `projectService`, so type-aware linting is
not enabled and this diff cannot move the verdict of a file it did not
touch.
## Packaging and landing
- No changeset: `skip-changeset`. `npm pack --dry-run --json
--ignore-scripts` in `packages/spec` lists 2069 files, none of the 12
changed files and no `*.test.ts`; controls `src/stack.zod.ts`,
`dist/index.mjs` and `package.json` are present; an old and a new title
phrase read 0 files in `dist/`, the control `Unrecognized key` reads 42.
- Not governed: `check-governed-merges --test` on the 12 paths reads 0
of 12; 114 changed lines.
- `git merge-tree` onto `origin/main` `6a53564b9`: clean. None of the 17
open PRs touches any of the 15 files (file lists read; 6 of them touch
`packages/spec/src`, so the scan sees spec files).
## Acceptance notes
- Class (e) is not finished: 16 messages / 17 ids remain in 12 files,
all in subdirectories. By directory: `ui/` 9 / 9 in 7 files,
`automation/` 2 / 3 in 1, `ai/` 2 / 2 in 1, and `api/`, `contracts/` and
`kernel/` 1 / 1 in 1 each. Their plan is the cutting seat's: stage 27's
landing sets the needles stage apart (one stage, with an at-tier review)
and keeps `ui/`'s four colour literals as decided, and this stage
measured neither.
- Regrowth for stage 30's plan: five subdirectory test files carry 6
messages / 7 ids that were added after stage 27's landing. The files are
older; the ids entered their strings in three commits.
`api/meta-item-response-shapes.test.ts` 1 / 1 (a title, from #22126);
`automation/builtin-node-config.test.ts` 2 / 3 (two titles, from #22259,
which re-added ids to a title stage 10 had rewritten);
`kernel/manifest.test.ts` 1 / 1, `ui/action-description.test.ts` 1 / 1
(titles) and `ui/view-submit-redirect-url.test.ts` 1 / 1 (an `other`
string, to be needle-checked there), all three from #22125. Nothing
regrew since stage 28's landing: the per-file census at `b7e01fbbd`
equals the one at `43fc50051`. Test files are outside
`check:doc-authoring`'s ledgered leg, so nothing refused these on
arrival. Not edited here.
- Code comments in the 15 files still carry live ids (55 lines).
Comments are not this card's share. Carrier: none.
- `origin/main` moved from `43fc50051` to `6a53564b9` while this ran;
one commit touches `packages/spec` (`api/error-code-ledger.zod.ts`, none
of the 15 files), so nothing was merged into the branch.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01DhTqaEHqPVSVnAkjG3jywn)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent 1915434 commit 0ef9029
12 files changed
Lines changed: 57 additions & 57 deletions
File tree
- packages/spec/src
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
140 | 140 | | |
141 | 141 | | |
142 | 142 | | |
143 | | - | |
| 143 | + | |
144 | 144 | | |
145 | 145 | | |
146 | 146 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
142 | 142 | | |
143 | 143 | | |
144 | 144 | | |
145 | | - | |
| 145 | + | |
146 | 146 | | |
147 | 147 | | |
148 | 148 | | |
| |||
159 | 159 | | |
160 | 160 | | |
161 | 161 | | |
162 | | - | |
| 162 | + | |
163 | 163 | | |
164 | 164 | | |
165 | 165 | | |
| |||
227 | 227 | | |
228 | 228 | | |
229 | 229 | | |
230 | | - | |
| 230 | + | |
231 | 231 | | |
232 | 232 | | |
233 | 233 | | |
| |||
267 | 267 | | |
268 | 268 | | |
269 | 269 | | |
270 | | - | |
| 270 | + | |
271 | 271 | | |
272 | 272 | | |
273 | 273 | | |
| |||
303 | 303 | | |
304 | 304 | | |
305 | 305 | | |
306 | | - | |
| 306 | + | |
307 | 307 | | |
308 | 308 | | |
309 | 309 | | |
| |||
340 | 340 | | |
341 | 341 | | |
342 | 342 | | |
343 | | - | |
| 343 | + | |
344 | 344 | | |
345 | 345 | | |
346 | 346 | | |
| |||
377 | 377 | | |
378 | 378 | | |
379 | 379 | | |
380 | | - | |
| 380 | + | |
381 | 381 | | |
382 | 382 | | |
383 | 383 | | |
| |||
423 | 423 | | |
424 | 424 | | |
425 | 425 | | |
426 | | - | |
| 426 | + | |
427 | 427 | | |
428 | 428 | | |
429 | 429 | | |
| |||
454 | 454 | | |
455 | 455 | | |
456 | 456 | | |
457 | | - | |
| 457 | + | |
458 | 458 | | |
459 | 459 | | |
460 | 460 | | |
| |||
465 | 465 | | |
466 | 466 | | |
467 | 467 | | |
468 | | - | |
| 468 | + | |
469 | 469 | | |
470 | 470 | | |
471 | 471 | | |
| |||
511 | 511 | | |
512 | 512 | | |
513 | 513 | | |
514 | | - | |
| 514 | + | |
515 | 515 | | |
516 | 516 | | |
517 | 517 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
250 | 250 | | |
251 | 251 | | |
252 | 252 | | |
253 | | - | |
| 253 | + | |
254 | 254 | | |
255 | 255 | | |
256 | 256 | | |
| |||
322 | 322 | | |
323 | 323 | | |
324 | 324 | | |
325 | | - | |
| 325 | + | |
326 | 326 | | |
327 | 327 | | |
328 | 328 | | |
| |||
352 | 352 | | |
353 | 353 | | |
354 | 354 | | |
355 | | - | |
| 355 | + | |
356 | 356 | | |
357 | 357 | | |
358 | 358 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
88 | 88 | | |
89 | 89 | | |
90 | 90 | | |
91 | | - | |
| 91 | + | |
92 | 92 | | |
93 | 93 | | |
94 | 94 | | |
| |||
135 | 135 | | |
136 | 136 | | |
137 | 137 | | |
138 | | - | |
| 138 | + | |
139 | 139 | | |
140 | 140 | | |
141 | 141 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
68 | 68 | | |
69 | 69 | | |
70 | 70 | | |
71 | | - | |
| 71 | + | |
72 | 72 | | |
73 | 73 | | |
74 | 74 | | |
| |||
113 | 113 | | |
114 | 114 | | |
115 | 115 | | |
116 | | - | |
| 116 | + | |
117 | 117 | | |
118 | 118 | | |
119 | 119 | | |
| |||
150 | 150 | | |
151 | 151 | | |
152 | 152 | | |
153 | | - | |
| 153 | + | |
154 | 154 | | |
155 | 155 | | |
156 | 156 | | |
| |||
171 | 171 | | |
172 | 172 | | |
173 | 173 | | |
174 | | - | |
| 174 | + | |
175 | 175 | | |
176 | 176 | | |
177 | 177 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
63 | 63 | | |
64 | 64 | | |
65 | 65 | | |
66 | | - | |
| 66 | + | |
67 | 67 | | |
68 | 68 | | |
69 | 69 | | |
| |||
90 | 90 | | |
91 | 91 | | |
92 | 92 | | |
93 | | - | |
| 93 | + | |
94 | 94 | | |
95 | 95 | | |
96 | 96 | | |
| |||
99 | 99 | | |
100 | 100 | | |
101 | 101 | | |
102 | | - | |
| 102 | + | |
103 | 103 | | |
104 | 104 | | |
105 | 105 | | |
| |||
130 | 130 | | |
131 | 131 | | |
132 | 132 | | |
133 | | - | |
| 133 | + | |
134 | 134 | | |
135 | 135 | | |
136 | 136 | | |
| |||
156 | 156 | | |
157 | 157 | | |
158 | 158 | | |
159 | | - | |
| 159 | + | |
160 | 160 | | |
161 | 161 | | |
162 | 162 | | |
| |||
176 | 176 | | |
177 | 177 | | |
178 | 178 | | |
179 | | - | |
| 179 | + | |
180 | 180 | | |
181 | 181 | | |
182 | 182 | | |
| |||
0 commit comments