Skip to content

Commit 7ba2ce4

Browse files
test(spec): the first root-level test file group's titles state each cited decision in words instead of a tracker number (stage 28) (#22342)
Part of #20749 Clause-②: no Stage 28 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 first name-ordered group of the test files directly in `packages/spec/src/`: 20 files, `assembled-package-body.test.ts` through `inline-grid-column-carriers.test.ts`. 18 of them carried 61 tracker ids in test titles. All 61 now either state what their record decided, in words (form D), or drop the number where the title already says it. No declared string or expect message in the group carries an id, so no needle is in play. Text only: no assertion, identifier, test count, code comment, file name or non-test file changes. The card stays open for the second group. ## Census (re-taken first) The census instruments of stages 10-27 are not on disk in this container, so `census28.cjs` (md5 `31d8488b5194b8d3048e3fcaec0efaed`) was rebuilt from the definition those stage reports give: 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 (each, skip, only chains included), comments never read. It was calibrated against two published readings before it was trusted: 128 messages / 130 ids in 37 files at stage 27's landing `f7b8a5932b`, and 191 / 200 in 53 files (titles 162 / 168, other 29 / 32) at `aa09db58c9`. Both reproduce exactly. | reading | messages / ids | files | |:--|--:|--:| | the group, base `28bff18d0` | 61 / 61 (all titles) | 18 | | class (e) whole, base `28bff18d0` | 134 / 137 (titles 122 / 125, other 12 / 12) | 42 | | class (e) whole, this head | 73 / 76 (titles 61 / 64, other 12 / 12) | 24 | | the group, this head | 0 / 0 | 0 | | files directly in `src/`, base then head | 118 / 120 in 30 files, then 57 / 59 in 12 | | The group reads 61, the claim's figure: no re-cut. The whole class reads 6 messages / 7 ids above stage 27's landing reading (128 / 130) because five new files outside this group landed since, all in subdirectories: `api/meta-item-response-shapes`, `automation/builtin-node-config` (2 / 3), `kernel/manifest`, `ui/action-description` and `ui/view-submit-redirect-url`. Controls: lit, outside the group, at base and head: `ai/build-progress.test.ts` 2 / 2, `stack-artifact-crossref.test.ts` 11 / 12 and `stack-inline-action-crossref.test.ts` 13 / 13. Lit at base and dark at head, inside the group: the three stage-27 controls, `assembled-package-body.test.ts` 4 / 4, `compose-key-dispositions-export.pin.test.ts` 5 / 5 and `compose-stacks-action-collision-shape.test.ts` 3 / 3 (identical to stage 27's readings of them). Dark: five stage-27 files under `system/` read 0 while their comment lines still carry ids, and the 20 group files read 0 at head while 84 comment lines in them still carry ids (a wider pattern, any `#` plus digits, reads only the `(stack #0)` index positions of composeStacks refusal text, unchanged). Planted, in a scratch tree: ids 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; a comment, a six-digit number, an HTML entity and a markdown heading read 0. Per file, messages at base: assembled-package-body 4, compose-key-dispositions-export.pin 5, compose-stacks-action-collision-shape 3, compose-stacks-action-echo 4, compose-stacks-action-key-collision 2, compose-stacks-collection-pipe-arm 5, compose-stacks-concat-shape-refusal 1, compose-stacks-i18n-merge 2, compose-stacks-key-loss 8, compose-stacks-manifest-preserve 7, compose-stacks-merge-collection-refusal 1, compose-stacks-objects-shape-refusal 1, compose-stacks-refusal-envelopes 1, cron-typed-positions-retirement 5, define-stack-non-strict-actions-shape-refusal 3, define-stack-non-strict-objects-shape-refusal 1, eager-entry-import 1, inline-grid-column-carriers 7. `compose-stacks.test.ts` and `compose-stacks-merge-config-object-refusal.test.ts` carry ids only in comments. ## What changed 61 title literals, one line each, in 18 files: +61 / -61. - 8 state the decision in words: the assembled body "declared apart from the authoring manifest" and "the mismatch that is the reason two declarations exist" (assembled-package-body 125 and 168), "defineStack's scope-qualified action-key refusal" in place of a rule number (compose-stacks-action-echo 176 and 224), "the 'merge' collection refusal, not an action-key collision" (compose-stacks-action-key-collision 222), "as read before the `pipe` arm took the authored side" (compose-stacks-collection-pipe-arm 211), "the inbound rate limiting config" (compose-stacks-key-loss 64), and "the export-job family, `ScheduleState`, the connector `DataSyncConfig`" (cron-typed-positions-retirement 347). - 8 get their subject back where the number was the only subject: the five "compose-key dispositions export, pin N" describes and the three "composition rule N" describes. - 45 drop a number the title already explains, with its connector: a `#N — ` prefix, a `[#N] ` prefix, or a trailing `(#N)`. ## Cited records 24 distinct ids. 23 answer 200 and were read with every comment the API serves. #14686 answers 404; its decision was read from its landing commit `279431e7a3` and that commit's changeset: `defineStack` refuses two actions that resolve to one scope-qualified runtime key. The comments counter of three records exceeds what the comments endpoint and the timeline serve (#5051 serves 2 of 5, #14848 7 of 8, #19150 5 of 6); everything served was read. What each record decided, as the titles now say it: #4910 the `server` key carries the inbound rate limiting config; #5005 the three composition rules (same value passes, a conflict throws a prescriptive error, an undeclared key warns); #5051 `i18n` joins them (option A, no last-wins); #14242 option B, the assembled body gets its own declaration (option C refused); #14512 a multi-package artifact carries its collections once in the package bodies, and keeps the flattened copy where the bodies cannot reproduce it; #14847 a bound standalone action appears once in the composed object; #14848 ruling 4, `objectConflict: 'merge'` refuses a differing collection; #14877 ruling 1, the compose-key table is a frozen public export; #15219 ruling A, `plugins` and `devPlugins` are envelope keys; #16075 option 1, the refusal extends to fixed-shape config objects; #16320 the seven cron-typed positions are deleted; #16348 composeStacks conflict refusals carry ADR-0112 envelopes; #17158 ruling A, the export-job family retires whole; #18239 ruling B, a non-array `objects` is refused with the envelope; #19150 a `pipe` is read on its authored side; #19784 ruling C, a non-array concat key is refused; #19785 and #19799 the non-strict `defineStack` door refuses a non-array `objects` and a malformed `actions` with the envelope; #19816 the collision pass skips a malformed `actions` and step 7 refuses it; #19930 every published entry imports first under `OS_EAGER_SCHEMAS=1`; #20901, #20928 and #21142 each inline grid column carrier references `InlineGridColumnSchema`. ## Readers 184 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 20 files, with a lit control (a known string, hit) and a dark control (a nonsense string, no hit). 7 needles hit, 24 lines: prose, changelog and code-comment lines elsewhere that share a short phrase, two `//` comment lines in `migrations/` that quote the old #20901 header, and one twin title. No gate, doc table, `-t` filter, snapshot, `currentTestName` read or self-test reads a rewritten title. The twin: `stack-artifact-packages.test.ts:355` carries the same old title as `compose-stacks-manifest-preserve.test.ts:308`. It belongs to the second name-order group; to keep the pair equal its rewrite should read `does not warn about an undeclared composition rule`. ## Text-only proof - `textonly28.cjs` (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, carried an id at base and carries no `#` plus digits at head. 20 / 20 files SAME; 61 changed tokens, all titles, 0 declared; per-file counts exactly as predicted in writing at 2026-10-08T17:34:10Z, before the edit. - 14 / 14 controls on scratch copies of the head files behave as predicted on the first run: 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 row 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 key-loss title, and an untouched file (SAME, 0 changed). - `git diff -U0`: 61 plus and 61 minus lines, each the planned line; 0 added lines carry `#` plus digits; every file keeps its line count. ## Tests - The 20 files with `--project local --project repo` and the JSON reporter, at the base (same worktree, before the edit) and at the head `437b4778f`: 594 / 594 passed in 20 files, 146 suites each side; per-file test count and status sequence identical in 20 / 20; 409 full names changed, 0 mismatches against the plan; 0 duplicate full names either side; names with `#` plus digits 409 at base, 0 at head. - spec `vitest run --project local`: 626 files passed, 18720 tests passed | 1 todo, exit 0. - spec `typecheck`: exit 0 (`VERDICT command-exit 0`); `check:test-typecheck` 52 files / 246 errors / 135 pinned signatures held, unchanged; `tsc --listFilesOnly -p tsconfig.test.json` holds 20 of 20 group files. - turbo build of all packages: `Tasks: 71 successful, 71 total`. Heavy runs went through `scripts/pm/os-verify-lock.sh` (slot `dev-20749-s28`). - No reverse verification or ablation applies: no assertion, gate or reader moved. ## Gates All at `437b4778f`. The dispatch list (77 commands, derived at `fe98cc63a`) equals the list re-derived from the real change set at this head, 18 paths against merge base `28bff18d0`: 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"). ESLint, narrowed and proven: 20 files linted with `--no-inline-config`, 0 errors, 0 warnings; the population read from ESLint's own config is 20 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 18 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 18 paths reads 0 of 18; 122 changed lines. - `git merge-tree` onto `origin/main` `e36ee5351`: clean. None of the 19 open PRs touches any of the 20 files (file lists read; 7 of them touch `packages/spec/src`, so the reader sees them). ## Acceptance notes - The next group is `root-entry-migrations-split.pin.test.ts` through `stack.test.ts`, 12 files, 57 messages / 59 ids at this head, with the one "other" string at `stack-cross-reference-envelope.test.ts` to be needle-checked there. The five new subdirectory files named above carry 6 messages / 7 ids; the cutting seat decides where they go. - Code comments in these files still carry live ids (84 lines across the 20 files). Comments are not this card's share. Carrier: none. - Same-id titles in other packages were not re-measured here; stage 27's list stands. --- _Generated by [Claude Code](https://claude.ai/code/session_01DhTqaEHqPVSVnAkjG3jywn)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 54c3ce1 commit 7ba2ce4

18 files changed

Lines changed: 61 additions & 61 deletions

‎packages/spec/src/assembled-package-body.test.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ const ordersStack = () => defineStack({ manifest: ordersManifest, objects: [orde
122122

123123
// ─── 1. The key set is derived ──────────────────────────────────────
124124

125-
describe('#14242 B — the assembled body carries the stack schema\'s collections, derived', () => {
125+
describe('the assembled body, declared apart from the authoring manifest, carries the stack schema\'s collections, derived', () => {
126126
it('lacks exactly the artifact-envelope keys, and nothing else', () => {
127127
const stackKeys = shapeKeys(ObjectStackDefinitionSchema);
128128
const bodyKeys = shapeKeys(AssembledPackageBodySchema);
@@ -156,7 +156,7 @@ describe('#14242 B — the assembled body carries the stack schema\'s collection
156156

157157
// ─── 2. Each stage refuses the other's spelling ─────────────────────
158158

159-
describe('#14242 B — two stages, two declarations, neither tolerant of the other', () => {
159+
describe('two stages, two declarations, neither tolerant of the other', () => {
160160
const assembledBody = { ...coreManifest, objects: [accountObject] };
161161
const globBody = { ...coreManifest, objects: ['./src/objects/*.object.ts'] };
162162

@@ -165,7 +165,7 @@ describe('#14242 B — two stages, two declarations, neither tolerant of the oth
165165
expect(verdict.success).toBe(true);
166166
});
167167

168-
it('the AUTHORING entry still refuses that same body — the mismatch #14242 measured', () => {
168+
it('the AUTHORING entry still refuses that same body — the mismatch that is the reason two declarations exist', () => {
169169
// Kept as a live measurement rather than prose: it is the reason two
170170
// declarations exist, and a widened authoring schema (road C) would turn
171171
// this green without anyone noticing the stages had merged.
@@ -281,7 +281,7 @@ describe("ADR-0130 D4 — `manifest: 'preserve'` assembles each input stack", ()
281281

282282
// ─── 4. `plugins` / `devPlugins` are envelope keys (#15219) ──────────
283283

284-
describe('#15219 A — `plugins` / `devPlugins` are envelope keys: top level only, never inside `packages[]`', () => {
284+
describe('`plugins` / `devPlugins` are envelope keys: top level only, never inside `packages[]`', () => {
285285
/** What a host hands to `kernel.use()` — a live instance, not metadata. */
286286
const livePlugin = { name: 'plugin.example', init: () => undefined };
287287

‎packages/spec/src/compose-key-dispositions-export.pin.test.ts‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ afterEach(() => {
9898

9999
// ─── 1. Key-set parity with the schema, both directions ─────────────
100100

101-
describe('#14877 pin 1 — the exported key set equals the schema\'s declared top-level key set', () => {
101+
describe('compose-key dispositions export, pin 1 — the exported key set equals the schema\'s declared top-level key set', () => {
102102
it('COMPOSE_KEY_DISPOSITIONS names every key the schema declares, and no other', () => {
103103
const schemaKeys = schemaTopLevelKeys();
104104
// Non-vacuity: the schema really is the 40+-key envelope, not an empty shape agreeing with anything.
@@ -135,7 +135,7 @@ describe('#14877 pin 1 — the exported key set equals the schema\'s declared to
135135

136136
// ─── 2. Frozen ──────────────────────────────────────────────────────
137137

138-
describe('#14877 pin 2 — the view is frozen', () => {
138+
describe('compose-key dispositions export, pin 2 — the view is frozen', () => {
139139
it('COMPOSE_KEY_DISPOSITIONS is frozen and refuses assignment to an existing key', () => {
140140
expect(Object.isFrozen(COMPOSE_KEY_DISPOSITIONS)).toBe(true);
141141
const mutable = COMPOSE_KEY_DISPOSITIONS as unknown as Record<string, string>;
@@ -163,7 +163,7 @@ describe('#14877 pin 2 — the view is frozen', () => {
163163

164164
// ─── 3. Every value is a declared disposition ───────────────────────
165165

166-
describe('#14877 pin 3 — every value is one of the declared dispositions', () => {
166+
describe('compose-key dispositions export, pin 3 — every value is one of the declared dispositions', () => {
167167
it('no key carries a disposition outside the ComposeDisposition vocabulary', () => {
168168
const vocabulary = new Set(Object.keys(DECLARED_DISPOSITIONS));
169169
for (const [key, disposition] of Object.entries(COMPOSE_KEY_DISPOSITIONS)) {
@@ -189,7 +189,7 @@ describe('#14877 pin 3 — every value is one of the declared dispositions', ()
189189

190190
// ─── 4. The dispositions are the composer's rules ───────────────────
191191

192-
describe('#14877 pin 4 — each disposition is what composeStacks actually does', () => {
192+
describe('compose-key dispositions export, pin 4 — each disposition is what composeStacks actually does', () => {
193193
it("every 'concat' key concatenates in stack order — the export's concat subset IS the composer's", () => {
194194
const concatKeys = keysWith('concat');
195195
// Non-vacuity: the concat family is the bulk of the table.
@@ -264,7 +264,7 @@ describe('#14877 pin 4 — each disposition is what composeStacks actually does'
264264

265265
// ─── 5. Derived, and reaching the surface as the same objects ───────
266266

267-
describe('#14877 pin 5 — STACK_DEFINITION_KEYS is derived, and both symbols reach the package surface', () => {
267+
describe('compose-key dispositions export, pin 5 — STACK_DEFINITION_KEYS is derived, and both symbols reach the package surface', () => {
268268
it('STACK_DEFINITION_KEYS is Object.keys of the table — same members, same order, no second literal', () => {
269269
expect([...STACK_DEFINITION_KEYS]).toEqual(Object.keys(COMPOSE_KEY_DISPOSITIONS));
270270
});

‎packages/spec/src/compose-stacks-action-collision-shape.test.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ const topEntries: Array<{ label: string; value: unknown }> = [
101101
{ label: 'an array', value: [] },
102102
];
103103

104-
describe('#19816 — a non-object top-level `actions` entry is refused with the envelope, not a TypeError', () => {
104+
describe('a non-object top-level `actions` entry is refused with the envelope, not a TypeError', () => {
105105
for (const row of topEntries) {
106106
it(`entry ${row.label} is refused at ['actions', 1]`, () => {
107107
const refused = refusal(() => compose([valid(), withTop([row.value])]));
@@ -123,7 +123,7 @@ describe('#19816 — a non-object top-level `actions` entry is refused with the
123123
});
124124
});
125125

126-
describe("#19816 — a malformed object's own `actions` is refused with the envelope, not a TypeError", () => {
126+
describe("a malformed object's own `actions` is refused with the envelope, not a TypeError", () => {
127127
const nonArrays: Array<{ label: string; value: unknown }> = [
128128
{ label: 'a number', value: 5 },
129129
{ label: 'a string', value: 'abc' },
@@ -165,7 +165,7 @@ describe("#19816 — a malformed object's own `actions` is refused with the enve
165165
});
166166
});
167167

168-
describe('#19816 — the controls: well-formed stacks compose, and a real collision is still refused', () => {
168+
describe('the controls: well-formed stacks compose, and a real collision is still refused', () => {
169169
it('a valid pair composes, every action carried', () => {
170170
const composed = compose([valid(), withTop([act('b_home')])]);
171171
expect(composed.actions?.map((a) => a.name)).toEqual(['a_home', 'b_home']);

‎packages/spec/src/compose-stacks-action-echo.test.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ const boundA = () =>
8585
const boundB = () =>
8686
defineStack({ manifest: mf('com.example.b'), objects: [obj('b_item')], actions: [act('dup_y', { objectName: 'b_item' })] });
8787

88-
describe('composeStacks - a bound standalone action appears once in the composed object (#14847)', () => {
88+
describe('composeStacks - a bound standalone action appears once in the composed object', () => {
8989
it("carries each input's own bound action once under the default strategy, and the standalone once at the top", () => {
9090
const a = boundA();
9191
const b = boundB();
@@ -137,7 +137,7 @@ describe('composeStacks - a bound standalone action appears once in the composed
137137
expect(keysOf(out).embedded).toEqual({ shared: ['emb3/EMB', 'b3/BOUND', 'b1/BOUND', 'b2/BOUND'] });
138138
});
139139

140-
it("with three stacks under objectConflict: 'merge', the composition is refused at the object merge — each built object carries a different `actions` array (#14848)", () => {
140+
it("with three stacks under objectConflict: 'merge', the composition is refused at the object merge — each built object carries a different `actions` array", () => {
141141
// s1's `shared` carries [emb1, b1/BOUND], s2's [emb2, b2/BOUND]: two
142142
// declarations `'merge'` used to resolve by replacement, dropping `emb1`.
143143
let msg: string | null = null;
@@ -173,7 +173,7 @@ describe('composeStacks - a bound standalone action appears once in the composed
173173
});
174174

175175
describe('composeStacks - what the identity skip does NOT fold', () => {
176-
it("refuses a hand-written twin — the same action authored standalone AND on its object — through #14686's rule, unchanged", () => {
176+
it("refuses a hand-written twin — the same action authored standalone AND on its object — through defineStack's scope-qualified action-key refusal, unchanged", () => {
177177
const msg = refusal(() =>
178178
defineStack({
179179
manifest: mf('com.example.t'),
@@ -221,7 +221,7 @@ describe('composeStacks - round trip through defineStack', () => {
221221
expect(keysOf(defineStack(out))).toEqual(keysOf(out));
222222
});
223223

224-
it("with bound actions, is refused exactly as far as a lone built input is — 'declared twice' by #14686's landed pin, never '3 times'", () => {
224+
it("with bound actions, is refused exactly as far as a lone built input is — 'declared twice' by defineStack's scope-qualified action-key refusal, never '3 times'", () => {
225225
const a = boundA();
226226
const LINE =
227227
" ✗ Action key 'a_item:dup_x' is declared twice: stack.actions[0] (objectName 'a_item') and " +

‎packages/spec/src/compose-stacks-action-key-collision.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ describe('composeStacks - object-scoped keys across stacks, judged on what the c
219219
['embedding stack last', () => [boundToSharedB(), embeddedA()], "'com.example.b' (stack #0)", "'com.example.a' (stack #1)"],
220220
['embedding stack first', () => [embeddedA(), boundToSharedB()], "'com.example.a' (stack #0)", "'com.example.b' (stack #1)"],
221221
] as const)(
222-
"under 'merge' the same pair is refused one step earlier, at the object merge: both objects declare a DIFFERENT `actions` (%s) — #14848, not a collision",
222+
"under 'merge' the same pair is refused one step earlier, at the object merge: both objects declare a DIFFERENT `actions` (%s) — the 'merge' collection refusal, not an action-key collision",
223223
(_order, stacks, holder, later) => {
224224
// B's built object carries its bound copy (`dup_m/BOUND`), A's carries
225225
// the embedded declaration (`dup_m/EMB`): two different arrays on one
@@ -259,7 +259,7 @@ describe('composeStacks - object-scoped keys across stacks, judged on what the c
259259
expect((out.objects ?? []).find((o) => o.name === 'shared')?.actions?.[0]?.label).toBe('Dup E (b)');
260260
});
261261

262-
it("refuses the same pair under 'merge' — two different `actions` arrays on one object are no longer resolved by replacement (#14848; formerly the P3 acceptance pin)", () => {
262+
it("refuses the same pair under 'merge' — two different `actions` arrays on one object are no longer resolved by replacement (formerly the P3 acceptance pin)", () => {
263263
const msg = refusal(() => composeStacks([embedA(), embedB()], { objectConflict: 'merge' }));
264264
expect(msg).toContain(
265265
"composeStacks conflict: object 'shared' is defined in multiple stacks and its 'actions' is declared " +

‎packages/spec/src/compose-stacks-collection-pipe-arm.test.ts‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ const composedShared = (left: Record<string, unknown>, right: Record<string, unk
189189
const refuse = (key: string, left: unknown, right: unknown) =>
190190
refusal(() => composedShared({ [key]: left }, { [key]: right }));
191191

192-
describe('#19150 — the probe keys are the shapes this pin is about (anti-vacuity)', () => {
192+
describe('the probe keys are the shapes this pin is about (anti-vacuity)', () => {
193193
it('the preprocess probe is a pipe whose IN is a transform and whose OUT is the array', () => {
194194
const def = defOf(defOf(probe(NAMES.preprocess))?.innerType);
195195
expect(def?.type).toBe('pipe');
@@ -208,7 +208,7 @@ describe('#19150 — the probe keys are the shapes this pin is about (anti-vacui
208208
});
209209
});
210210

211-
describe('#19150 BRIGHT CONTROL — the pre-fix reading of the preprocess probe', () => {
211+
describe('BRIGHT CONTROL — the preprocess probe as read before the `pipe` arm took the authored side', () => {
212212
it('reading IN alone answers "not a collection" — the silent direction', () => {
213213
expect(inOnlyWalk(probe(NAMES.preprocess))).toBe(false);
214214
});
@@ -230,7 +230,7 @@ describe('#19150 BRIGHT CONTROL — the pre-fix reading of the preprocess probe'
230230
});
231231
});
232232

233-
describe('#19150 MAIN — the preprocess-wrapped collection key is IN the refusal set', () => {
233+
describe('MAIN — the preprocess-wrapped collection key is IN the refusal set', () => {
234234
it('refuses two differing declarations, naming the object, the key and both stacks', () => {
235235
const msg = refuse(NAMES.preprocess, ['a'], ['b']);
236236
expect(msg).toContain(
@@ -264,7 +264,7 @@ describe('#19150 MAIN — the preprocess-wrapped collection key is IN the refusa
264264
});
265265
});
266266

267-
describe('#19150 DARK CONTROL — keys whose verdict must not move', () => {
267+
describe('DARK CONTROL — keys whose verdict must not move', () => {
268268
it('a genuine `.pipe()` authored as a scalar composes by later-wins, and is NOT refused', () => {
269269
expect(refuse(NAMES.pipeScalar, 'a', 'b')).toBeNull();
270270
expect(composedShared({ [NAMES.pipeScalar]: 'a' }, { [NAMES.pipeScalar]: 'b' })?.[NAMES.pipeScalar]).toBe('b');
@@ -287,7 +287,7 @@ describe('#19150 DARK CONTROL — keys whose verdict must not move', () => {
287287
});
288288
});
289289

290-
describe("#19150 TODAY-INVARIANCE — the fix moves no key on today's ObjectSchema", () => {
290+
describe("TODAY-INVARIANCE — the fix moves no key on today's ObjectSchema", () => {
291291
const realShape = async (): Promise<Record<string, unknown>> => {
292292
const actual = await vi.importActual<typeof import('./data/object.zod')>('./data/object.zod');
293293
return shapeOf(actual.ObjectSchema);

‎packages/spec/src/compose-stacks-concat-shape-refusal.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ afterEach(() => {
7272
vi.restoreAllMocks();
7373
});
7474

75-
describe('#19784 — composeStacks refuses a non-array concatenated collection', () => {
75+
describe('composeStacks refuses a non-array concatenated collection', () => {
7676
it('covers every concat key the composer declares (the table is the census, not a transcription)', () => {
7777
expect(CONCAT_KEYS).toContain('permissions');
7878
expect(CONCAT_KEYS).toContain('data');

‎packages/spec/src/compose-stacks-i18n-merge.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ afterEach(() => {
6363

6464
// ─── Conflicts — the behaviour #5051 changed ────────────────────────
6565

66-
describe('#5051 — conflicting `i18n` declarations are a composition error', () => {
66+
describe('conflicting `i18n` declarations are a composition error', () => {
6767
it('throws instead of letting the later stack win (the issue\'s own repro)', () => {
6868
const a = raw({ manifest: manifestA, i18n: { defaultLocale: 'en' } });
6969
const b = raw({ manifest: manifestB, i18n: { defaultLocale: 'zh-CN' } });
@@ -172,7 +172,7 @@ describe('#5051 — conflicting `i18n` declarations are a composition error', ()
172172

173173
// ─── Pass-through — CONTROL (green before and after #5051) ──────────
174174

175-
describe('#5051 control — an `i18n` nobody disagrees about still composes', () => {
175+
describe('control — an `i18n` nobody disagrees about still composes', () => {
176176
it('keeps the only declaration, from either position', () => {
177177
const withI18n = { manifest: manifestA, i18n: { defaultLocale: 'en', supportedLocales: ['en'] } };
178178
const without = { manifest: manifestB };

‎packages/spec/src/compose-stacks-key-loss.test.ts‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ afterEach(() => {
5050

5151
// ─── Rule 1 — same value passes through ─────────────────────────────
5252

53-
describe('#5005 rule 1 — non-array top-level keys survive composition', () => {
53+
describe('composition rule 1 — non-array top-level keys survive composition', () => {
5454
it('keeps `api` when only one stack declares it (the issue\'s own repro)', () => {
5555
const a = raw({ manifest: manifestA, api: { enforceProjectMembership: true } });
5656
const b = raw({ manifest: manifestB });
@@ -61,7 +61,7 @@ describe('#5005 rule 1 — non-array top-level keys survive composition', () =>
6161
expect(composeStacks([b, a]).api).toEqual({ enforceProjectMembership: true });
6262
});
6363

64-
it('keeps `server` when only one stack declares it (#4910 rate limiting)', () => {
64+
it('keeps `server` (the inbound rate limiting config) when only one stack declares it', () => {
6565
const a = raw({
6666
manifest: manifestA,
6767
server: { security: { rateLimit: { enabled: true, maxRequests: 5 } } },
@@ -101,7 +101,7 @@ describe('#5005 rule 1 — non-array top-level keys survive composition', () =>
101101

102102
// ─── Rule 2 — conflict is an error with a prescription ──────────────
103103

104-
describe('#5005 rule 2 — conflicting values throw a prescriptive error', () => {
104+
describe('composition rule 2 — conflicting values throw a prescriptive error', () => {
105105
it('throws naming the key, both source stacks and the fix', () => {
106106
const a = raw({ manifest: manifestA, api: { enforceProjectMembership: true } });
107107
const b = raw({ manifest: manifestB, api: { enforceProjectMembership: false } });
@@ -157,7 +157,7 @@ describe('#5005 rule 2 — conflicting values throw a prescriptive error', () =>
157157

158158
// ─── Rule 3 — unhandled keys warn ───────────────────────────────────
159159

160-
describe('#5005 rule 3 — a key with no declared rule warns', () => {
160+
describe('composition rule 3 — a key with no declared rule warns', () => {
161161
it('warns once, names the key and carries the declare-a-rule prescription', () => {
162162
// A key the schema does not declare: reaches composeStacks only via
163163
// `strict: false`, which is exactly how a NEW key looks before someone
@@ -188,7 +188,7 @@ describe('#5005 rule 3 — a key with no declared rule warns', () => {
188188
expect(warnSpy.mock.calls.map((c) => String(c[0])).some((w) => w.includes("'futureList'"))).toBe(true);
189189
});
190190

191-
it('refuses — never skips — a collection key that holds a non-array value (#19784)', () => {
191+
it('refuses — never skips — a collection key that holds a non-array value', () => {
192192
// Skipping it (the #5005 warn-and-drop) composed an artifact that silently
193193
// lacked stack B's views; the full per-key census lives in
194194
// `compose-stacks-concat-shape-refusal.test.ts`.
@@ -217,7 +217,7 @@ describe('#5005 rule 3 — a key with no declared rule warns', () => {
217217

218218
// ─── Control — array keys keep today's concat semantics ─────────────
219219

220-
describe('#5005 control — array keys still concatenate', () => {
220+
describe('control — array keys still concatenate', () => {
221221
it('concatenates in stack order, unchanged', () => {
222222
const a = raw({
223223
manifest: manifestA,
@@ -294,7 +294,7 @@ describe('#5005 control — array keys still concatenate', () => {
294294

295295
// ─── Control — the pre-existing bespoke strategies are untouched ────
296296

297-
describe('#5005 control — manifest / objects strategies unchanged', () => {
297+
describe('control — manifest / objects strategies unchanged', () => {
298298
it('manifest still follows the `manifest` option', () => {
299299
const a = raw({ manifest: manifestA });
300300
const b = raw({ manifest: manifestB });
@@ -319,7 +319,7 @@ describe('#5005 control — manifest / objects strategies unchanged', () => {
319319

320320
// ─── Structural pin — every declared key has a rule ─────────────────
321321

322-
describe('#5005 structural pin — the schema and the composer cannot drift', () => {
322+
describe('structural pin — the schema and the composer cannot drift', () => {
323323
/**
324324
* The disposition table is typed `Record< keyof ObjectStackDefinition, … >`,
325325
* so a key added to the schema without a composition rule is already a

0 commit comments

Comments
 (0)