Repository navigation
Commit 866b439
test(spec): shared test titles state each cited decision in words instead of a tracker number (stage 12) (#21750)
Part of #20749
Clause-②: no
Stage 12 of this card, and the third area of class (e): the test strings
shipped under `packages/spec/src`, as ruled in `5902360492` on #20513.
This stage takes the whole `shared/` directory. Its 85 test-title and
test-string literals carried 95 tracker ids: 92 cite 49 records, and 3
are a `#0000` placeholder that cites none. Each id now either states
what its record decided, in words (form D), or is dropped where the
title already says it. Text only: no assertion, identifier, test count
or code comment changes.
## Census at the base (`72b6333cd8`, the claim's base)
Instrument: stage 10's `census10.cjs` (md5
`9d08602ab972b4b8643c90d64d40fa41`) and stage 9's `census.cjs` (md5
`6e42a45a926d375013c32d62f16a296e`), both byte-identical to the copies
stages 10 and 11 used. A literal counts as a test title when its folded
message is argument 0 of a `describe` / `it` / `test` call, `.each` /
`.skip` / `.only` chains included. Everything else is an "other" string.
Both instruments read **1594 messages / 1701 ids in 369 files at the
base**, which is stage 11's reading at its head exactly. `shared/` reads
85 / 95, also stage 11's figure.
| directory | files | messages / ids | titles | other |
|:--|--:|--:|--:|--:|
| `data/` | 95 | 468 / 501 | 445 / 475 | 23 / 26 |
| `ui/` | 81 | 392 / 415 | 374 / 397 | 18 / 18 |
| `api/` | 40 | 189 / 201 | 181 / 193 | 8 / 8 |
| `system/` | 34 | 154 / 165 | 128 / 138 | 26 / 27 |
| (files directly in `src/`) | 30 | 118 / 120 | 117 / 119 | 1 / 1 |
| **`shared/`** (this PR) | 21 | **85 / 95** | 73 / 81 | 12 / 14 |
| `contracts/` | 25 | 63 / 74 | 59 / 70 | 4 / 4 |
| `conversions/` | 9 | 34 / 34 | 34 / 34 | 0 |
| `security/` | 8 | 28 / 28 | 28 / 28 | 0 |
| `ai/` | 9 | 18 / 20 | 13 / 15 | 5 / 5 |
| `identity/` | 6 | 15 / 15 | 14 / 14 | 1 / 1 |
| `integration/` | 4 | 14 / 14 | 13 / 13 | 1 / 1 |
| `migrations/` | 2 | 9 / 12 | 9 / 12 | 0 |
| `marketplace/`, `meta-spelling/`, `studio/` | 5 | 7 / 7 | 7 / 7 | 0 |
| **total** | **369** | **1594 / 1701** | **1495 / 1596** | **99 / 105**
|
- **Controls.** Lit, a title: `shared/duration.test.ts:45` reads one
message with #18122. Lit, an `expect` message:
`shared/retry-policy.test.ts:113` reads one message. Dark: the comment
at `shared/alias-integrity.test.ts:519` ("#5593 migrated the last of
them") reads 0; the file's messages sit at `:516`, `:770` and onwards.
Planted in a scratch copy: an id added to a title reads 1 / 1, and an id
in an added comment reads 0.
- **A wider pattern** (any `#` plus digits) reads 87 / 97 under
`shared/` at the base. The two extra hits are `(#1)` placeholders in two
fixtures of `retired-key-migrate-sentence.test.ts` (`:378`, `:380`, the
"accepts the two legal shapes" case). They fall outside the gate's
3-to-5-digit pattern and the claim's surface, and are untouched. At the
head the wider pattern reads only those two, and the gate pattern reads
0 / 0.
- **At the head:** 1509 messages / 1606 ids in 348 files. `shared/`
reads 0 / 0. Nothing else moved.
## How the area was chosen
Stage 10's rule: rank whole first-level directories by ids, and take the
busiest one within about 10% of the ~100-id bound. The four busiest each
exceed the bound alone: `data/` (501), `ui/` (415), `api/` (201) and
`system/` (165). The files directly in `src/` (120) are 20% over.
`shared/` (95) is the busiest whole directory within the bound, and its
census reads exactly stage 11's 95, so the rule needed no second pass.
**Named for the next stages:** `data/` (about five stages, by
subdirectory or file group; `data/driver/` alone is 52), `ui/` (about
four), `api/` (two), `system/` (two), the files directly in `src/` (one,
120), `contracts/` with `conversions/` (one, 108), and `security/`,
`ai/`, `identity/`, `integration/`, `migrations/`, `marketplace/`,
`meta-spelling/` and `studio/` together (one, 96).
## What each id became
22 ids now state a decision in words, one per literal. 73 are dropped:
67 where the title already says what a live record decided, 3 dead
numbers whose decisions were read from what landed, and the 3 `#0000`
placeholders. Every cited record was read with its comments through
REST. 46 answer 200. Three answer 404, and their decisions were read
from their landing commits.
| record | ids | result |
|:--|--:|:--|
| #7889 | 3 of 5 | The three synthetic `history` strings in the
reachability self-test read "n/a — planted for the reachability
self-test". Nothing reads them: `unreachableAliasRows` reads only
`aliases` and `guidanceSets`. Dropped from the 2 titles that state the
check. |
| #6416 | 1 of 2 | "the three hand-written error maps are FOLDED and
judged here". Dropped from the `expect` message that already explains
the blind spot. |
| #6619 | 1 of 6 | "the two maps the first fold MISSED": #6619 folded
three maps, and #6805 found two more. Dropped from 5 literals that state
the fold. |
| #7887 | 1 of 4 | "editability lives on fields — the boundary
prescription an author actually sees". That is the maintainer's boundary
ruling: sections and page components gate visibility only. Dropped from
3 titles. |
| #5955 | 1 of 2 | "(the fix-first order survives the new set)": the
history sentence is emitted last, so the author reads the fix first.
Dropped once. |
| #15811 | 1 of 2 | "evaluated-slot population — no declaring position
still mounts the persistence schema". Dropped once, where the title
states the rule. |
| #3278 | 1 | "never re-advertises `js`, retired in favour of
ScriptBody". #3278 retired the `js` expression dialect as redundant with
the L2 `ScriptBody`. |
| #7739 | 1 | "EXTERNAL_ERROR_HTTP_STATUS — each external error carries
an HTTP status". The title was the symbol alone. Its landing gave the
whole family one status table, so none can leak as a bare 500. |
| #19101 | 1 of 2 | "lazySchema × z.toJSONSchema — a lazy reference
keeps its metadata". The ruling fixed the root cause in `lazySchema`, so
descriptions no longer depend on which generator ran. Dropped once. |
| #8421 | 1 of 2 | "(flipped once unknown type names were refused)",
where the title said "#8421 flipped this". Dropped once. |
| #16845 | 1 of 2 | "ProtectionSchema — unknown-key refusal names the
surface and the rename": the block adopted `strictObject`. Dropped from
"accept set is unchanged". |
| #12840 | 1 | "acceptRetiredDefaultResidue — a retired default parses
as inert residue". The title was the symbol alone. |
| #17109 | 1 | "enumWithRetiredValues — value-level retirement beside
retiredKey()": the maintainer chose a generic helper, not a one-enum
refinement. |
| #6414 | 1 | The `expect` message reads "the prescription must not
point at the retired ETL layer": #6414 retired L2 `ETLPipeline`. |
| #4001 | 2 | The synthetic widget `history` reads "Until unknown keys
were refused, these were dropped silently". Both copies change together.
The test asserts the message ends with that exact constant, so the
fixture and its expectation move as one. |
| #7832 | 3 of 5 | "the reverse-direction alias curation added here",
"already curated before the reverse-direction sweep", and "the two
`visibleWhen` shapes the first sweep never enumerated". #7832 was the
reverse direction of the action shapes' alias table. Dropped twice. |
| #7816 | 1 | "the boolean `enabled: false` first". #7816 noted that the
boolean case must point at `enabled`, or the hint just moves the
confusion. |
| dropped only (live) | 49 | #4661 (2), #4962, #4964, #4971, #4990,
#5389 (3), #5481 (2), #5552, #5593 (2), #6630, #6805 (4), #6856, #7030,
#8201, #8202 (2), #8318 (4), #8382 (2), #8424, #9529 (3), #7894 (4),
#10096, #10848, #13859 (3), #15028, #15035, #15423, #15430, #16320,
#18122. Each title already states the pinned decision. |
| dropped only (404) | 3 | #6085 (landing `026101660`: the dialect table
drops `js`, adds `template` and states it IS the enum), #10485
(`35ad101`: the `themes` carrier key and `ThemeSchema` retired,
`/meta/theme` refused), #11166 (`735f5c709`: `SchemaDiffEntry` gains a
distinct `unreachable` kind). Each title already carries what landed. |
| `#0000` | 3 | A placeholder in synthetic fixtures
(`retired-key.test.ts:26`, `:28`; the planted source in
`retired-key-migrate-sentence.test.ts:342`), cited no record. Dropped.
The two `retired-key.test.ts` constants are both input and expectation,
so the byte-for-byte assertions move with them. It is the same reasoning
by which #17109's patch round took the made-up `(ADR-0000)` out of these
fixtures: a made-up number squats on a real one. |
## Readers
- **Test-name filters:** none. A tracked-tree search for `-t` and
`--testNamePattern` finds only `packages/qa/dogfood/README.md:142` (`-t
"owner-scoped"`), which is unrelated.
- **Snapshots:** none. `shared/` has no `__snapshots__`, and no `.snap`
file is tracked under `packages/spec`.
- **Gates that read a touched file:**
- `scripts/check-future-spec-major.mjs` keeps a witnessed ledger entry
for `retired-key.test.ts` (`witness: /was removed in @objectstack\/spec
99/`, `covers: 4`). The rewritten constants still carry that sentence.
`check:future-spec-major` was derived for this diff and exits 0, "every
witness still matching".
- `packages/spec/vitest.repo-tests.json` lists
`retired-key-migrate-sentence.test.ts`, so that file runs in the `repo`
project. It was run there at the base and at the head.
- **Titles by substring:** every old literal, plus a window around each
id (221 needles), was searched across the tracked tree outside its own
file. No gate, doc, filter or script reads one. The 21 needle hits land
on 8 lines:
- Sibling titles in other lanes' files:
`packages/cli/test/format-zod-union.test.ts:301` (`[#5389]
formatZodErrors …`) and
`packages/metadata-protocol/src/protocol.unrecognised-meta-type.test.ts:171`
(`[#10485] \`theme\` …`).
- A later stage's row in this package:
`packages/spec/src/ai/knowledge-source.test.ts:97`, an `it.each` row
name with "retired at #3278".
- A self-test fixture in `scripts/check-future-spec-major.mjs:767-768`
that copies the two `retired-key.test.ts` constants with `(#0000)`. It
is its own text and does not read the file.
- Code comments: the `strict-object.ts:71` docblock example and
`suggestions.zod.ts:319`.
- A self-test fixture with a different string in
`scripts/check-doc-authoring.mjs:2507`.
## Text-only proof
Stage 10's scratch tool (`textonly10.cjs`, md5
`d5e4801dbb4329ab1984da91e92fc47c`) compares base and head file by file
on three legs:
1. **Skeleton:** the full AST, with string pieces masked. It must be
identical.
2. **Comments:** every comment, byte-equal.
3. **Strings:** each string leaf that changed must sit in a test-call
title position, or on one of the 12 declared lines. Each changed leaf
must carry a tracker id before and no `#` plus digits after. The
declared lines are:
- the synthetic `history` strings at `alias-integrity.test.ts:917`,
`:939`, `:952` and `strict-object.test.ts:16`, `:196`;
- the `expect` messages at `alias-integrity.test.ts:1100` and
`retry-policy.test.ts:113`;
- the fixture constants at `retired-key.test.ts:26`, `:28` and the
planted source at `retired-key-migrate-sentence.test.ts:342`;
- the fixture names at `union-branch-policy.parity.test.ts:164`, `:169`,
which reach `it` titles through a template.
- **Result:** 21 of 21 files SAME, 85 changed (73 title, 12 declared),
on all three legs.
- **Diff hunks:** exactly the 85 planned lines, with every file keeping
its line count.
- **Controls (10 of 10 as predicted, on scratch copies, each anchor hit
once):** identifier rename DIFF; numeric literal DIFF; comment edit
COMMENT DIFF; a non-title string with an id VIOLATION; a rewritten title
given a new id VIOLATION; a title that was id-free at base edited
VIOLATION; one title reverted to base SAME; a declared string keeping an
id VIOLATION; an undeclared `expect` message changed VIOLATION; a title
re-split into a `+` chain DIFF.
**Test counts:** the 21 files were run at the base (in a separate base
worktree) and at the head, 20 in the `local` project and one in `repo`.
Both sides read 567 / 567 passed, with the same count and status
sequence per file in 21 of 21. 450 full test names change, and each
equals the base name with the planned replacements applied.
## Changeset: `skip-changeset`
Measured, not assumed:
- `npm pack --dry-run` of `@objectstack/spec` lists 2068 files under
`files[]`. 0 of the 21 touched files are in it, and 0 `*.test.ts` at
all. The control `src/shared/expression.zod.ts` is in it.
- In `dist/`, four new phrases read in 0 files. Of three old ones, two
read in 0, and the third reads only in `shared/index.d.ts` / `.d.mts`,
from the `strict-object.ts` docblock comment, not from a test. The
control `Unrecognized key(s) on` reads in 42.
So this PR publishes nothing, and no changeset is added.
## Verification (at `fd8fd92d13`)
- `pnpm turbo run build` over all packages: 71 / 71.
- `@objectstack/spec`:
- `vitest run --project local`: 613 files, 18215 passed, 1 todo.
- `typecheck` exit 0, including `check:test-typecheck`. Its program
holds all 21 touched files, counted with `tsc --listFilesOnly`.
- **Gates:** `dispatch-gates --commands` derived 80 families, and all 80
exit 0. That is stage 11's 79 plus `check:future-spec-major`. `--ran`
reconciles: 80 derived, 80 run, 0 NOT-MEASURED, 0 UNRUN.
- Five roster families whose rosters sit under a touched directory were
also run, and each exits 0: `check:meta-url-spelling`,
`check:spec-changes`, `check:authz-resolver`, `check:error-code-casing`
and `check:filter-alias-parity`.
- **ESLint, a proven narrowing:** `--no-inline-config` over the 21
files, 0 errors and 0 warnings. The population comes from ESLint's own
config: 21 configured, 0 ignored. No `parserOptions.project` or
`projectService`, so no untouched file's verdict can move.
- `check-governed-merges --test`: NOT governed, 170 changed lines.
## Acceptance notes
- **Code comments still carry ids** in these 21 files and in the
`shared/` sources. One of them ships: the `strict-object.ts:71` docblock
example quotes the old widget `history` with `#4001`, and it is emitted
into `dist/shared/index.d.ts`. Comments are not this card's share and
are untouched here.
- **Sibling titles in other packages** repeat two rewritten titles' ids
(`cli`'s `format-zod-union.test.ts:301`, `metadata-protocol`'s
`protocol.unrecognised-meta-type.test.ts:171`). Each is its own lane's
test-string stage. `spec`'s `ai/knowledge-source.test.ts:97` is this
card's later small-directories stage.
- **`scripts/check-future-spec-major.mjs:767-768`** keeps its own
self-test copy of the two fixture constants with `(#0000)`. It is a
non-test file outside this claim's surface, and it reads nothing from
`retired-key.test.ts`.
- **`origin/main` moved** seven commits past the base before this PR
opened (#21737, #21741, #21739, #21744, #21740, #21746, #21749). One
touches `packages/spec` (`api/error-code-ledger.zod.ts`); none touches a
file in this diff, so nothing was merged.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent 1289925 commit 866b439
21 files changed
Lines changed: 85 additions & 85 deletions
File tree
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
513 | 513 | | |
514 | 514 | | |
515 | 515 | | |
516 | | - | |
| 516 | + | |
517 | 517 | | |
518 | 518 | | |
519 | 519 | | |
| |||
767 | 767 | | |
768 | 768 | | |
769 | 769 | | |
770 | | - | |
| 770 | + | |
771 | 771 | | |
772 | 772 | | |
773 | 773 | | |
| |||
809 | 809 | | |
810 | 810 | | |
811 | 811 | | |
812 | | - | |
| 812 | + | |
813 | 813 | | |
814 | 814 | | |
815 | 815 | | |
| |||
849 | 849 | | |
850 | 850 | | |
851 | 851 | | |
852 | | - | |
| 852 | + | |
853 | 853 | | |
854 | 854 | | |
855 | 855 | | |
| |||
880 | 880 | | |
881 | 881 | | |
882 | 882 | | |
883 | | - | |
| 883 | + | |
884 | 884 | | |
885 | 885 | | |
886 | 886 | | |
| |||
904 | 904 | | |
905 | 905 | | |
906 | 906 | | |
907 | | - | |
| 907 | + | |
908 | 908 | | |
909 | 909 | | |
910 | 910 | | |
| |||
914 | 914 | | |
915 | 915 | | |
916 | 916 | | |
917 | | - | |
| 917 | + | |
918 | 918 | | |
919 | 919 | | |
920 | 920 | | |
| |||
936 | 936 | | |
937 | 937 | | |
938 | 938 | | |
939 | | - | |
| 939 | + | |
940 | 940 | | |
941 | 941 | | |
942 | 942 | | |
| |||
949 | 949 | | |
950 | 950 | | |
951 | 951 | | |
952 | | - | |
| 952 | + | |
953 | 953 | | |
954 | 954 | | |
955 | 955 | | |
| |||
963 | 963 | | |
964 | 964 | | |
965 | 965 | | |
966 | | - | |
| 966 | + | |
967 | 967 | | |
968 | 968 | | |
969 | 969 | | |
| |||
1008 | 1008 | | |
1009 | 1009 | | |
1010 | 1010 | | |
1011 | | - | |
| 1011 | + | |
1012 | 1012 | | |
1013 | 1013 | | |
1014 | 1014 | | |
| |||
1028 | 1028 | | |
1029 | 1029 | | |
1030 | 1030 | | |
1031 | | - | |
| 1031 | + | |
1032 | 1032 | | |
1033 | 1033 | | |
1034 | 1034 | | |
| |||
1055 | 1055 | | |
1056 | 1056 | | |
1057 | 1057 | | |
1058 | | - | |
| 1058 | + | |
1059 | 1059 | | |
1060 | 1060 | | |
1061 | 1061 | | |
| |||
1097 | 1097 | | |
1098 | 1098 | | |
1099 | 1099 | | |
1100 | | - | |
| 1100 | + | |
1101 | 1101 | | |
1102 | 1102 | | |
1103 | 1103 | | |
1104 | | - | |
| 1104 | + | |
1105 | 1105 | | |
1106 | 1106 | | |
1107 | 1107 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
42 | 42 | | |
43 | 43 | | |
44 | 44 | | |
45 | | - | |
| 45 | + | |
46 | 46 | | |
47 | 47 | | |
48 | 48 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
99 | 99 | | |
100 | 100 | | |
101 | 101 | | |
102 | | - | |
| 102 | + | |
103 | 103 | | |
104 | 104 | | |
105 | 105 | | |
| |||
128 | 128 | | |
129 | 129 | | |
130 | 130 | | |
131 | | - | |
| 131 | + | |
132 | 132 | | |
133 | 133 | | |
134 | 134 | | |
| |||
138 | 138 | | |
139 | 139 | | |
140 | 140 | | |
141 | | - | |
| 141 | + | |
142 | 142 | | |
143 | 143 | | |
144 | 144 | | |
| |||
168 | 168 | | |
169 | 169 | | |
170 | 170 | | |
171 | | - | |
| 171 | + | |
172 | 172 | | |
173 | 173 | | |
174 | 174 | | |
| |||
217 | 217 | | |
218 | 218 | | |
219 | 219 | | |
220 | | - | |
| 220 | + | |
221 | 221 | | |
222 | 222 | | |
223 | 223 | | |
| |||
277 | 277 | | |
278 | 278 | | |
279 | 279 | | |
280 | | - | |
| 280 | + | |
281 | 281 | | |
282 | 282 | | |
283 | 283 | | |
| |||
341 | 341 | | |
342 | 342 | | |
343 | 343 | | |
344 | | - | |
| 344 | + | |
345 | 345 | | |
346 | 346 | | |
347 | 347 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
187 | 187 | | |
188 | 188 | | |
189 | 189 | | |
190 | | - | |
| 190 | + | |
191 | 191 | | |
192 | 192 | | |
193 | 193 | | |
| |||
402 | 402 | | |
403 | 403 | | |
404 | 404 | | |
405 | | - | |
| 405 | + | |
406 | 406 | | |
407 | 407 | | |
408 | 408 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
36 | 36 | | |
37 | 37 | | |
38 | 38 | | |
39 | | - | |
| 39 | + | |
40 | 40 | | |
41 | 41 | | |
42 | 42 | | |
| |||
Lines changed: 2 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
107 | 107 | | |
108 | 108 | | |
109 | 109 | | |
110 | | - | |
| 110 | + | |
111 | 111 | | |
112 | 112 | | |
113 | 113 | | |
| |||
242 | 242 | | |
243 | 243 | | |
244 | 244 | | |
245 | | - | |
| 245 | + | |
246 | 246 | | |
247 | 247 | | |
248 | 248 | | |
| |||
Lines changed: 2 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
64 | 64 | | |
65 | 65 | | |
66 | 66 | | |
67 | | - | |
| 67 | + | |
68 | 68 | | |
69 | 69 | | |
70 | 70 | | |
| |||
79 | 79 | | |
80 | 80 | | |
81 | 81 | | |
82 | | - | |
| 82 | + | |
83 | 83 | | |
84 | 84 | | |
85 | 85 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
32 | | - | |
| 32 | + | |
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
| |||
112 | 112 | | |
113 | 113 | | |
114 | 114 | | |
115 | | - | |
| 115 | + | |
116 | 116 | | |
117 | 117 | | |
118 | 118 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
127 | 127 | | |
128 | 128 | | |
129 | 129 | | |
130 | | - | |
| 130 | + | |
131 | 131 | | |
132 | 132 | | |
133 | 133 | | |
| |||
168 | 168 | | |
169 | 169 | | |
170 | 170 | | |
171 | | - | |
| 171 | + | |
172 | 172 | | |
173 | 173 | | |
174 | 174 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
72 | 72 | | |
73 | 73 | | |
74 | 74 | | |
75 | | - | |
| 75 | + | |
76 | 76 | | |
77 | 77 | | |
78 | 78 | | |
| |||
0 commit comments