Skip to content

Commit aa09db5

Browse files
test(spec): the first system/ file group's test titles state each cited decision in words instead of a tracker number (stage 26) (#21987)
Part of #20749 Clause-②: no Stage 26 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 `system/` group: the 18 id-bearing test files under `packages/spec/src/system/` from `auth-config.test.ts` to `metadata-form-declared-rows.pin.test.ts`, with `constants/system-names.test.ts` in its path position. Those files carried 91 messages and 97 tracker ids, citing 54 records. All 97 now either state what their record decided, in words (form D), or are dropped where the title already says it. No needle sits in this group. Text only: no assertion, identifier, test count or code comment changes, and no file is renamed. ## Census at the base (`dcf3eb494a`) Instruments: `census10.cjs` (md5 `9d08602ab972b4b8643c90d64d40fa41`), `census.cjs` (md5 `6e42a45a926d375013c32d62f16a296e`), `census-wide.cjs` (md5 `c98410a19529c439adb0afbfb00026a2`) and `dirtable.cjs` (md5 `dda605c54745b4a60cc14c9a686e4eff`), byte-identical to the copies stages 10 to 25 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. The worktree was cut from `origin/main` at `dcf3eb494a`, the claim's base and stage 25's landing. Both instruments read **282 messages / 297 ids in 71 files**, the seat's reading and stage 25's head reading. | directory | files | messages / ids | titles | other | |:--|--:|--:|--:|--:| | `system/` (this PR: 18 of its 34 files) | 34 | 154 / 167 | 128 / 138 | 26 / 29 | | (files directly in `src/`) | 30 | 118 / 120 | 117 / 119 | 1 / 1 | | `ui/` | 5 | 7 / 7 | 0 | 7 / 7 | | `ai/` | 1 | 2 / 2 | 0 | 2 / 2 | | `contracts/` | 1 | 1 / 1 | 0 | 1 / 1 | | **total** | **71** | **282 / 297** | **245 / 257** | **37 / 40** | The group reads **91 messages / 97 ids in 18 files**, the seat's figures file for file: | file (under `system/`) | messages / ids | titles | other | |:--|--:|--:|--:| | `auth-config.test.ts` | 2 / 2 | 2 / 2 | 0 | | `book.test.ts` | 2 / 2 | 2 / 2 | 0 | | `cache.test.ts` | 1 / 1 | 1 / 1 | 0 | | `collaboration.test.ts` | 1 / 1 | 1 / 1 | 0 | | `compliance-families-retirement.test.ts` | 7 / 7 | 4 / 4 | 3 / 3 | | `constants/system-names.test.ts` | 1 / 1 | 1 / 1 | 0 | | `core-service-provider.test.ts` | 1 / 1 | 1 / 1 | 0 | | `data-migration-flag-column-move.pin.test.ts` | 2 / 3 | 2 / 3 | 0 | | `disaster-recovery.test.ts` | 1 / 1 | 1 / 1 | 0 | | `email-config.test.ts` | 2 / 2 | 2 / 2 | 0 | | `email-template-floor-locale-parity.pin.test.ts` | 1 / 1 | 1 / 1 | 0 | | `environment-artifact.test.ts` | 5 / 5 | 5 / 5 | 0 | | `http-server.test.ts` | 2 / 2 | 2 / 2 | 0 | | `i18n-resolver.test.ts` | 53 / 56 | 50 / 53 | 3 / 3 | | `job.test.ts` | 4 / 4 | 4 / 4 | 0 | | `logging.test.ts` | 1 / 3 | 1 / 3 | 0 | | `message-queue-retirement.test.ts` | 3 / 3 | 1 / 1 | 2 / 2 | | `metadata-form-declared-rows.pin.test.ts` | 2 / 2 | 2 / 2 | 0 | | **18 files** | **91 / 97** | **83 / 89** | **8 / 8** | Ten more test files sit in the same name range and carry no id (`constants/platform-object-names`, `constants/platform-tool-names`, `core-services`, `deploy-bundle`, `doc`, `encryption`, `i18n-resolver.nav-label-identity`, `i18n-resolver.object-list-views`, `job-pull-organization`, `license`). The eight "other" strings are expect failure messages, rewritten and declared to the text-only tool: `compliance-families-retirement.test.ts:159` (a template literal), `:210` and `:494`; `message-queue-retirement.test.ts:87` (a template literal) and `:127`; `i18n-resolver.test.ts:3288` (the second leaf of a `+` chain), `:3299` and `:3303`. - **Controls.** Lit: `system/metrics.test.ts` (4 / 5) and `system/translation.test.ts` (12 / 12), outside the group, read the same at the base and at the head. Dark: `i18n-resolver.test.ts` reads 0 at the head while 47 of its lines still carry `#` plus digits: 45 comment lines and the two `(batch #58)` titles below. Planted in a scratch tree: an id put into the rewritten `i18n-resolver.test.ts` "per-component copy" title reads 1 / 1 (`title:describe`), and an id put into a `job.test.ts` comment reads 0. - **A wider pattern** (any `#` plus digits) reads the same as the gate pattern in 17 of the 18 files at the base. In `i18n-resolver.test.ts` it reads two more: `:1744` and `:1757` end in "(batch #58)", a two-digit decision-batch label that the gate's three-to-five-digit pattern does not count. Neither literal carries a counted id, so both stay, in the form earlier stages kept batch labels (stage 21's `批 17`, stage 22's `批 14` / `batch 13`). At the head the wider pattern reads 0 in 17 files and those 2 in `i18n-resolver.test.ts`. - **At the head:** 191 messages / 200 ids in 53 files. The 18 files read 0 / 0, `system/` reads 63 / 70 in 16 files, and no other file moved. ## How the area was chosen `system/` is taken in path-ordered file groups near the ~100-id bound, the rule stages 20 to 25 used, with `constants/system-names.test.ts` sorting at `constants/`. Stage 25's cut named this group at 97 ids, and this census reads 97, so no re-cut was needed. `i18n-resolver.test.ts` (56 ids; #21948 landed into it at `bab76850cd`, and its titles were read at this base) fits one PR and one text-only proof, so it is not split. **Named for the next stages** (cut from the head census, 191 / 200): - **the second `system/` group:** `metadata-form-zod-reconciliation.test.ts` through `worker.test.ts`, 16 files, 63 messages / 70 ids (45 / 49 titles, 18 / 21 other). Its first file alone carries 21 / 24, 17 of them "other" strings (its ledger `why` entries). - The files directly in `src/`, 120, one stage. - The needles: one stage, with an at-tier review. The four colour literals stay, as stage 21 decided. ## What each id became - **23 literals (25 ids)** now state a decision in words. - **11 literals (12 ids)** get their subject back in words, where the number stood for a thing. - **57 literals (60 ids)** drop a number the title already explains. Every cited record was fetched with all its comments through REST, and its decision was read from its ruling, ACCEPT and landing comments: a keyword digest of every record, and full reads wherever the new words carry a decision. 54 records are cited: 51 answer 200 (#15514 is a PR, merged as `bf1054a4c0`) and 3 answer 404. The three that answer 404 were read from what landed, through the commits endpoint (this checkout is shallow), each found through its CHANGELOG entry or the file's own commit anchor: - **#10926**, from `d173125fb8` (#11438): the component-translation `submitLabel` copy key is retired (maintainer ruling 2026-08-22, option A); - **#12961**, from `901355c3bc` (#13111): `translatePage` descends into declared `properties.children` ("Ruled 2026-08-29 (option A)"; region-level id wins a collision); - **#13218**, from `c45d8e6b4e` (#13641): `walkAddressedPageComponents` is exported as the one addressed-component walk, consumed by `translatePage` and the CLI extractor alike. **The same-id title stage 25 listed:** `book.test.ts:413` "ResolvedBookSchema is the book-tree response contract (#12038)". Its body parses the real `resolveBookTree()` output, accepts the honest-empty tree and pins each Zod schema type-identical to its interface: a describe-only transcription, which the five-part ruling's implementation plan names (`5434804846`). None of 1C · 2C · 3A · 4A · 5A is pinned, so no letter is named; the title already says the decision, and only the number goes. **"ruled:" appears in two titles,** each on a record that carries a ruling: - `data-migration-flag-column-move.pin.test.ts:72`: "(ruled: one nullable datetime on the flag row)". #15989's comment `5556979386`, headed "The four questions — ruled", answers Q1 with A: a new nullable datetime field on `DataMigrationFlagSchema`, whose failure mode is absence. #16185's body restates it ("The mechanism was ruled on #15989 as A"). - `i18n-resolver.test.ts:4944`: "(ruled: the authored label is the default-locale text)". #15711's maintainer ruling A, recorded in `5549577889`. **Stated in words** (23 literals): | record | literal (under `system/`) | now reads | the decision | |:--|:--|:--|:--| | #11739 | `auth-config.test.ts:423` | "AudienceConfigSchema — one closed audience posture, invite_only when undeclared" | One declared posture, a closed vocabulary (`invite_only` / `email_domain` / `open`), `invite_only` when undeclared, as the body records it ruled. | | #15679 (#14478 ruling B) | `cache.test.ts:336`, `collaboration.test.ts:1005`, `disaster-recovery.test.ts:235` | "… carry their unit in the key name" / "… carries its unit in the key name" | The `system/` duration keys carry their unit in the key name, stage 25's #15677 reading. | | #15513 | `compliance-families-retirement.test.ts:210`, `:494` (expect messages) | "… being undone — the three families were retired whole, none roadmapped" | Maintainer ruling A (`5548577921`): the three compliance-shaped families are retired whole; none is roadmapped. | | #15989 Q1, via #16185 | `data-migration-flag-column-move.pin.test.ts:72` | "columns_moved_at — absence is the contract (ruled: one nullable datetime on the flag row)" | Above. | | #16185 constraint 2 | `data-migration-flag-column-move.pin.test.ts:126` | "the ONE arbiter is unchanged by the new member — read beside it, never inside it" | `isDataMigrationFlagVerified` is not touched; the new field is read in addition to the arbiter, never inside it. | | #19184 | `job.test.ts:881` | "JobSchema's own @example — copied verbatim, it parses" | The example stops opening with the retired `id`, so a verbatim copy is accepted. | | #8075 | `message-queue-retirement.test.ts:127` (expect message) | "… being undone — the family had no consumer and carried an inline credential" | Fork (b): exported but unconsumed, the credential-bearing shape is retired whole. | | #16772 | `i18n-resolver.test.ts:1207` | "translateDashboard — global filters, addressable from a bundle" | Finding B: `dashboards.NAME.globalFilters` becomes a bundle group. | | #6080 | `:1573` | "per-component copy, keyed by component id" | Page component copy gets a bundle address by component id. | | #13218 (404) | `:2215` | "walkAddressedPageComponents — the one addressed-component walk, shared by the resolver and the CLI extractor" | What landed in `c45d8e6b4e`. | | #5377 | `:2652` | "resolveTabLabel — filter-preset tab labels, keyed under `_tabs`" | Tab labels get the `objects.OBJECT._tabs.TAB.label` key and a resolver. | | #3370 | `:3049` | "translateObject inline actions — served with their `_actions` translations" | Declared action labels are translated, not served as English literals. | | #3833, #3847 | `:3131` | "resolveObjectFieldLabels — the declared rich entries, read from the nested translation shape" | #3833: the nested shape, never the retired flat dialect; #3847: the rich `label` / `help` / `options` entries the response declares. | | #7679 | `:3308` | "normalizeSupportedLocales — the declared supportedLocales narrow the advertised set" | `/i18n/locales` reports the app's declared locales, not every loaded bundle. | | #11287 | `:3732`, `:4134` | "translateFlow — screen-flow copy from the `flows` bundle group" / "resolveFlowScreenTitle — a screen title from the `flows` bundle group" | The resolver half that reads `TranslationData.flows`. | | #3786 | `:4726` | "… the REST boundary follows — one derived list, no hand-kept copy" | Derive from the one source instead of hand-copying a "keep in sync" list. | | #14882 | `:4853` | "a declared fallback chain, not a literal `en`, at the resolver" | The chain honours the declared `fallbackLocale`, not a hard-wired `['en']`. | | #15711 | `:4944` | "… for a default-locale request (ruled: the authored label is the default-locale text)" | Above. | | #16458 | `:5011` | "resolveMetadataFormSchemaTitles — bundle labels overlaid as JSON Schema titles, repeater rows included" | Item-level property names get a translated title through the array's `items`. | **Subject back in words** (11 literals): - the two "zero holders after #15513" / "after #8075" template messages become "after the families' retirement" / "after the family's retirement", stage 25's form; - "[#15513] ADR-0087 registration" becomes "compliance families retirement — ADR-0087 registration"; - "keeps PR #15514's fourteen deadline-key registrations" becomes "keeps the earlier deadline-key retirement's fourteen registrations": PR #15514 retired the fourteen inert deadline keys before the families went whole; - "shipped by plugin-email since #5087" becomes "shipped by the SMTP transport in plugin-email": #5087 implemented that transport; - "#17614 — the published "must stay equal" claim" becomes "EMAIL_TEMPLATE_FLOOR_LOCALE — the published "must stay equal" claim", the constant whose docblock carries it; - "(#4666 pin)" becomes "(pinned here: a type change the key-level gates cannot see)": #4666's maintainer ruling chose direction B, fingerprinting defaults only, so the checksum object-to-string type change stays invisible to the key-level gates, and these parses are its gate; - the three "pre-#20680" / "pre-#8284" / "pre-#20731" control titles become "the behaviour before the override rule", the rule their describes name ("the catalog loses to an explicit override"); - "the contract call the #12961 line left open, made by #16772" becomes "the contract call the `children`-descent ruling left open, made for tab and accordion panels": the 2026-08-29 ruling (`901355c3bc`) named `properties.children` only, and #16772 made the `items[].children` call. **Dropped where already stated** (57 literals, 60 ids). A number goes only where the title already says its decision. Examples: `[#15513]` x2 and `[#8075]` retirement describes and `[#4740]`; the four other `[#15711]` prefixes, once the ruling is stated in the first; the tails `(#18124)`, `(#4667)` x2, `(#12038)`, `(#4611)`, `(#4451)`, `(#5307)`, `(#14865)`, `(#4938)`, `(#5295)`, `(#16292)`, `(#19085)`, `(#20439)`, `(#4854)`, `(#21257)`, `(#10926)`, `(#12961)`, `(#5775)`, `(#20940)` x3, `(#16772)` x4, `(#5377)` x2, `(#5728)` x2, `(#3847)` x2, `(#7634)` x4 (one title and three expect messages), `(#8284)`, `(#11745)`, `(#14253)` x6; the `objectstack#14972` tail with its repository qualifier; the ADR-bearing tails `(#4740, ADR-0049)`, `(#20680, ADR-0029 D9.2a)`, `(#20731, ADR-0029 D9.2a)`, `(#14478, ADR-0087 …)`, which keep their ADR; `pre-#4740` before "v0 artifact"; and `(#17782, #15939, #14478)` on "logging duration keys → *Ms", whose title shows the rename. The two 404 numbers among them (#10926, #12961) go only where the title already states what landed. **No file is renamed.** ## Readers - **Needles:** none. The eight declared strings are assertion failure messages (the second argument of `expect`), none is an expected value. The three `.pin.test.ts` files read source text, and none reads an id: `data-migration-flag-column-move.pin.test.ts` reads `isDataMigrationFlagVerified`'s body for `verified_at`, `blocking` and the absence of `columns_moved_at`; `email-template-floor-locale-parity.pin.test.ts` reads `DEFAULT_TEMPLATE_LOCALE` and "must stay equal"; `metadata-form-declared-rows.pin.test.ts` reads registered form rows. `job.test.ts`'s `@example` pin reads the anchor "@example Metadata Sync Job (Cron)". No title or message in the group is matched against a source docblock or another file's text. - **Test-name filters:** none. No tracked script, workflow or package config passes `-t` / `--testNamePattern` to vitest; the one vitest `-t` hit is a README example under `packages/qa/dogfood` filtering its own fixture. - **Snapshots:** none. No `__snapshots__` directory is tracked under `packages/spec`, and none of the 18 files calls a snapshot matcher. - **Projects:** `compliance-families-retirement.test.ts` and `email-template-floor-locale-parity.pin.test.ts` are in the `repo` project (`packages/spec/vitest.repo-tests.json`); the other 16 run in `local`. The base-versus-head run below takes both projects. - **By substring:** every old literal, its id-bearing fragment and a window around each id (272 needles) was searched with `git grep` at the base, across the tracked tree outside its own file. No gate, doc, filter, snapshot, QA checklist entry or `scripts/check-*.mjs` self-test reads one. The 12 hits are sibling test titles: the three `(#15679)` titles in this group hit each other (all rewritten here) and the five `(#15679)` titles of the second `system/` group (`metrics`, `object-storage`, `registry-config`, `tracing`, `worker`), which go with that stage. ## 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 changed string leaf must sit in a test-call title position or on a declared line, must carry a tracker id before, and must carry no `#` plus digits after. This stage declares the eight expect-message lines named above. - **Result:** 18 of 18 files SAME on all three legs, with the per-file counts predicted in writing before any edit. - **Totals:** 91 changed string leaves in 91 literals: 83 titles and 8 declared. The diff's `+` and `-` lines are exactly the 91 planned lines as multisets, and every file keeps its line count. - **Controls (14 of 14 as predicted on the first run, on scratch copies, each anchor hit once):** identifier rename DIFF; numeric literal DIFF; comment edit COMMENT DIFF; a non-title string given 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; an `it.each` row given an id VIOLATION; an undeclared expect message changed VIOLATION; a title re-split into a `+` chain DIFF; a declared expect message reverted to base SAME; a declared template expect message given a new id VIOLATION; a declared `+`-chain leaf given a new id VIOLATION; a template-literal title given a new id VIOLATION. - **Templates and tables:** no `.each` title and no `$name` placeholder changes. The two template literals change only their text after the `${…}` span. **Test counts:** the 18 files were run at the base, before the edit, and at the head, in the same worktree, with `--project local --project repo`. Both sides read 783 tests in 18 files, all passed, with the same count and status sequence per file in 18 of 18. 354 full test names change, and each changed name equals the base name with the planned replacements applied: 0 mismatches. No full name repeats on either side. No head name carries a gate-pattern id (354 base names did); two head names carry the kept "(batch #58)". No source escape sits in a planned anchor, so the comparison tool met none. ## Changeset: `skip-changeset` Measured, not assumed: - `npm pack --dry-run` of `@objectstack/spec` lists 2068 files. 0 of the 18 touched files are in it, and no `*.test.ts` at all (`files[]` ships `src/**/*.zod.ts`, not tests). The controls `src/system/job.zod.ts`, `src/system/translation.zod.ts` and `dist/index.mjs` are in it. - In the built `dist/`, two new phrases and an old one each read in 0 files. The control `Unrecognized key` reads in 42. So this PR publishes nothing, and no changeset is added. ## Verification (at `ed2bc649f3`) - `pnpm turbo run build` over all packages: 71 / 71, through the shared verify lock (turbo exit 0, recorded to a file; `VERDICT batch-last-exit 0`). - `@objectstack/spec`: - `vitest run --project local`: 619 files, 18485 passed, 1 todo. - `typecheck`: exit 0, including `check:test-typecheck` (52 files / 246 errors / 135 pinned signatures held). Its program holds all 18 group files, counted by path with `tsc --listFilesOnly -p tsconfig.test.json`. - `check:generated`: all 15 generated artifacts up to date, against the `dist/` the build above wrote. - **Gates:** `dispatch-gates --commands` derived 79 families, the same 79 as stage 25. All 79 exit 0. `--ran` reconciles: 79 derived, 79 run, 0 NOT-MEASURED, 0 UNRUN, every family with its exit code recorded. The same 79 derive from `origin/main` `4e4e881427` with this diff applied. The five roster families marked as sharing a directory with this diff (`check:meta-url-spelling`, `check:spec-changes`, `check:authz-resolver`, `check:error-code-casing`, `check:filter-alias-parity`) each exit 0. - **ESLint, a proven narrowing:** `--no-inline-config` over the 18 files reads 0 errors and 0 warnings. The population comes from ESLint's own config: 18 configured, 0 ignored. No file sets `parserOptions.project` or `projectService`, so no untouched file's verdict can move. - `check-governed-merges --test`: NOT governed, 182 changed lines (+91 / -91). - A control-byte scan over the 18 changed files finds none. ## `main` since the base Re-fetched just before this PR opened, `origin/main` was three commits past the base (`4e4e881427`: #21976, #21977, #21352). They touch 490 files, none of the 18 and none under `packages/spec/src/system/`, so `main` was not merged. The census of `4e4e881427` with this diff applied reads 191 / 200, file for file the same as the head. `git merge-tree` onto `4e4e881427` is clean, and none of the 5 open PRs touches any of the 18 files. ## Acceptance notes - **Same-id test titles in this card's later stages** go with those stages: 22 lines, among them the five `(#15679)` titles of the second `system/` group, `system/translation.test.ts`'s six (`#16772`, `#6080`, `#10926`, `#21257`, `#11287`, `#4667`) and `stack-email-template-locale-floor.test.ts`'s four `#17614` titles. - **Same-id test titles in other packages** stay: 78 lines in 14 packages (`driver-sql` 13, `cli` 12, `objectql` 10, `rest` 10, `lint` 8, `platform-objects` 6, `plugin-auth` 6, `core` 3, `runtime` 3, `service-i18n` 3, and one each in `client`, `plugin-approvals`, `qa/dogfood` and `sdui-parser`), each package's share under the #20513 lane children. - **The two "(batch #58)" titles** (`i18n-resolver.test.ts:1744`, `:1757`) stay: a two-digit decision-batch label outside the gate's pattern, with no counted id in the literal. - **Code comments with live ids** remain in these files, among them the `// #18124 — step 3 of ruling A on #18115` header in `auth-config.test.ts`, the `[#16185]` docblock in `data-migration-flag-column-move.pin.test.ts`, the `[#17614]` docblock in `email-template-floor-locale-parity.pin.test.ts` and the `// ─── [#8075]` / `[#15513]` banners. Code comments are not this card's share. --- _Generated by [Claude Code](https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 1abfc58 commit aa09db5

18 files changed

Lines changed: 91 additions & 91 deletions

‎packages/spec/src/system/auth-config.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ describe('AuthConfigSchema – new passthrough fields', () => {
420420
});
421421
});
422422

423-
describe('AudienceConfigSchema (#11739)', () => {
423+
describe('AudienceConfigSchema — one closed audience posture, invite_only when undeclared', () => {
424424
it('defaults an undeclared posture to invite_only (the ruled safe default)', () => {
425425
const parsed = AudienceConfigSchema.parse({});
426426
expect(parsed.posture).toBe('invite_only');
@@ -517,7 +517,7 @@ describe('AudienceConfigSchema (#11739)', () => {
517517
// `updateAge: this.config.session?.updateAge || 60 * 60 * 24` straight into
518518
// better-auth's `session.updateAge`, whose unit is seconds. Only `expiresIn`
519519
// carried the marker; this closes the pair.
520-
describe('AuthConfig.session.updateAge declares seconds by mirror (#18124)', () => {
520+
describe('AuthConfig.session.updateAge declares seconds by mirror', () => {
521521
it('keeps the bare name, the default and the value it always accepted', () => {
522522
expect(AuthConfigSchema.parse({}).session).toBeUndefined();
523523
const parsed = AuthConfigSchema.parse({ session: { updateAge: 3 * 86_400 } });

‎packages/spec/src/system/book.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ describe('resolveDocAudiences — union over claiming books (§6.7)', () => {
363363
});
364364

365365
// ── Inline translation maps retired in 17.0.0 (#4667, ADR-0049) ─────────────
366-
describe('retired book translation maps (#4667)', () => {
366+
describe('retired book translation maps', () => {
367367
it('rejects a book-level `translations` map and names the live neighbour', () => {
368368
// The prescription has to mention `doc.translations`: that key is live on
369369
// every doc render path and is what the author actually wanted. Without it
@@ -410,7 +410,7 @@ describe('retired book translation maps (#4667)', () => {
410410
// book-tree response contract (#12038)
411411
// ==========================================
412412

413-
describe('ResolvedBookSchema is the book-tree response contract (#12038)', () => {
413+
describe('ResolvedBookSchema is the book-tree response contract', () => {
414414
// The conformance suite for the `GET /meta/book/:name/tree` ledger rows
415415
// (#3877's no-row-without-conformance rule). Stronger than the handwritten
416416
// captures its meta.* siblings use: `resolveBookTree()` is pure and lives in

‎packages/spec/src/system/cache.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ describe('DistributedCacheConfigSchema', () => {
333333
// Asserted on the issue CODE and the prescription text, never on "it threw":
334334
// a bare `toThrow()` would stay green against a schema that rejected for any
335335
// other reason, which is the failure this pin exists to catch.
336-
describe('cache duration keys carry their unit (#15679)', () => {
336+
describe('cache duration keys carry their unit in the key name', () => {
337337
it('REFUSES the retired `CacheTier.ttl` with the rename in the message', () => {
338338
const result = CacheTierSchema.safeParse({ name: 'l1', type: 'memory', ttl: 600 });
339339
expect(result.success).toBe(false);

‎packages/spec/src/system/collaboration.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1002,7 +1002,7 @@ describe('CollaborationSessionSchema', () => {
10021002
// collision that got this population ruled: milliseconds here, seconds on the
10031003
// tenant surface. Both old spellings are `retiredKey()` tombstones; asserted on
10041004
// the issue CODE and the prescription, never on a bare `toThrow()`.
1005-
describe('collaboration session durations carry their unit (#15679)', () => {
1005+
describe('collaboration session durations carry their unit in the key name', () => {
10061006
it('REFUSES the retired `idleTimeout` with the rename in the message', () => {
10071007
const result = CollaborationSessionConfigSchema.safeParse({ mode: 'ot', idleTimeout: 600000 });
10081008
expect(result.success).toBe(false);

‎packages/spec/src/system/compliance-families-retirement.test.ts‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -148,15 +148,15 @@ const MUST_SURVIVE_SYSTEM = ['DataClassificationSchema', 'ComplianceFrameworkSch
148148
const SPEC_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..');
149149
const SRC_ROOT = path.join(SPEC_ROOT, 'src');
150150

151-
describe('[#15513] system/ compliance families retirement — the public surface', () => {
151+
describe('system/ compliance families retirement — the public surface', () => {
152152
it('every retired name has ZERO holders on any public entry; the survivors still stand', () => {
153153
for (const needed of ['.', './system', './kernel']) {
154154
expect(EXPORT_ENTRY_POINTS, `exports map must include ${needed}`).toContain(needed);
155155
}
156156
expect(exportNamesOf('./system').length, './system must export a non-trivial surface').toBeGreaterThan(100);
157157

158158
for (const name of RETIRED_NAMES) {
159-
expect(holdersOf(name), `${name} must have zero holders after #15513`).toEqual([]);
159+
expect(holdersOf(name), `${name} must have zero holders after the families' retirement`).toEqual([]);
160160
}
161161
const systemNames = exportNamesOf('./system');
162162
for (const name of MUST_SURVIVE_SYSTEM) {
@@ -207,7 +207,7 @@ describe('[#15513] system/ compliance families retirement — the public surface
207207
}
208208
};
209209
walk(SRC_ROOT);
210-
expect(importers, 'a resurrected import means the retirement is being undone — re-read #15513').toEqual([]);
210+
expect(importers, 'a resurrected import means the retirement is being undone — the three families were retired whole, none roadmapped').toEqual([]);
211211
});
212212

213213
it('the generated shards no longer list any of the nineteen defs or forty-five names', () => {
@@ -238,7 +238,7 @@ describe('[#15513] system/ compliance families retirement — the public surface
238238
});
239239
});
240240

241-
describe('[#15513] ADR-0087 registration', () => {
241+
describe('compliance families retirement — ADR-0087 registration', () => {
242242
it('declares all nineteen defs under major 18, with the three D3 semantic entries wired and no D2 conversion', () => {
243243
for (const def of RETIRED_DEFS) {
244244
expect(RETIRED_DEFS_BY_MAJOR[18], `${def} must be declared`).toContain(def);
@@ -265,7 +265,7 @@ describe('[#15513] ADR-0087 registration', () => {
265265
expect(step!.rationale).toMatch(/retires those three compliance-shaped families WHOLE/);
266266
});
267267

268-
it("keeps PR #15514's fourteen deadline-key registrations and three D3 entries as history", () => {
268+
it("keeps the earlier deadline-key retirement's fourteen registrations and three D3 entries as history", () => {
269269
for (const key of HISTORY_KEYS) {
270270
expect(RETIRED_KEYS_BY_MAJOR[18], `${key} is history — keep it`).toContain(key);
271271
}
@@ -312,7 +312,7 @@ describe('[#15513] ADR-0087 registration', () => {
312312
// the very declaration the self-test refuses.)
313313
// The residue this leg covers is everything `tsc` does not compile: JSON,
314314
// YAML, MD, MDX, and (under `packages/`) untyped `.js` / `.mjs` / `.cjs`.
315-
describe('[#15513] tree-scoped absence: nothing inside the declared radius references a retired name', () => {
315+
describe('tree-scoped absence: nothing inside the declared radius references a retired name', () => {
316316
const REPO_ROOT = path.resolve(SPEC_ROOT, '../..');
317317
const THIS_FILE = path.relative(REPO_ROOT, fileURLToPath(import.meta.url)).split(path.sep).join('/');
318318

@@ -491,6 +491,6 @@ describe('[#15513] tree-scoped absence: nothing inside the declared radius refer
491491
for (const root of WALK_ROOTS) walk(path.join(REPO_ROOT, root));
492492
// Anti-vacuity: the walk really covered the tree.
493493
expect(visited).toBeGreaterThan(1000);
494-
expect(offenders, 'a reference to a retired name means the retirement is being undone — re-read #15513').toEqual([]);
494+
expect(offenders, 'a reference to a retired name means the retirement is being undone — the three families were retired whole, none roadmapped').toEqual([]);
495495
});
496496
});

‎packages/spec/src/system/constants/system-names.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ describe('SystemFieldName', () => {
103103
// authorable, pinned in `../../data/object.test.ts`. The column reaching a row
104104
// and the tier being declarable are now BOTH true — a change from the split
105105
// state this comment used to record, not a restatement of it.
106-
it('registers the ADR-0117 business-unit ownership stamp, distinct from the user attribute (#4611)', () => {
106+
it('registers the ADR-0117 business-unit ownership stamp, distinct from the user attribute', () => {
107107
expect(SystemFieldName.OWNING_BUSINESS_UNIT_ID).toBe('owning_business_unit_id');
108108
// Guard the naming discipline ADR-0117 D10 spells out: the record stamp must
109109
// NOT be confused with `sys_user.primary_business_unit_id`, which is a USER

‎packages/spec/src/system/core-service-provider.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ describe('CORE_SERVICE_PROVIDER', () => {
3131
}
3232
});
3333

34-
it('carries no entry for retired or never-real slots (#4451)', () => {
34+
it('carries no entry for retired or never-real slots', () => {
3535
for (const slot of ['workflow', 'graphql']) {
3636
expect(
3737
Object.prototype.hasOwnProperty.call(CORE_SERVICE_PROVIDER, slot),

‎packages/spec/src/system/data-migration-flag-column-move.pin.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ function baseRow(over: Partial<DataMigrationFlag> = {}): DataMigrationFlag {
6969
};
7070
}
7171

72-
describe('columns_moved_at — absence is the contract (#16185, ruling on #15989 Q1)', () => {
72+
describe('columns_moved_at — absence is the contract (ruled: one nullable datetime on the flag row)', () => {
7373
it('parses green when the member is absent — every row alive today', () => {
7474
const result = DataMigrationFlagSchema.safeParse(baseRow());
7575
expect(result.success, JSON.stringify(result.error?.issues)).toBe(true);
@@ -123,7 +123,7 @@ describe('columns_moved_at — absence is the contract (#16185, ruling on #15989
123123
});
124124
});
125125

126-
describe('the ONE arbiter is unchanged by this card (#16185 constraint 2)', () => {
126+
describe('the ONE arbiter is unchanged by the new member — read beside it, never inside it', () => {
127127
/** `(verified_at, blocking)` and the verdict recorded BEFORE the new member existed. */
128128
const CASES: Array<{ label: string; over: Partial<DataMigrationFlag>; verified: boolean }> = [
129129
{ label: 'verified, no blocking', over: { verified_at: MOVED_AT, blocking: 0 }, verified: true },

‎packages/spec/src/system/disaster-recovery.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ import { z } from 'zod';
232232
// neighbouring `dns.ttl` is a DECLARED `externalVocabulary` mirror and must
233233
// survive this rename untouched, and no gate can catch its loss (the marker
234234
// exempts the key either way), so the pin is the only guard.
235-
describe('FailoverConfig.healthCheckInterval carries its unit (#15679)', () => {
235+
describe('FailoverConfig.healthCheckInterval carries its unit in the key name', () => {
236236
const regions = [
237237
{ name: 'us-east-1', role: 'primary' as const },
238238
{ name: 'eu-west-1', role: 'secondary' as const },

‎packages/spec/src/system/email-config.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ describe('EmailProviderSchema', () => {
5353
expect(accepted).toEqual([...DELIVERABLE_PROVIDERS]);
5454
});
5555

56-
it('accepts smtp — shipped by plugin-email since #5087 (ADR-0012)', () => {
56+
it('accepts smtp — shipped by the SMTP transport in plugin-email (ADR-0012)', () => {
5757
// The single assertion #5104 is about: green after the enum gained
5858
// 'smtp', red on any revert of it.
5959
expect(EmailProviderSchema.safeParse('smtp').success).toBe(true);
@@ -123,7 +123,7 @@ describe('EmailServiceConfigSchema', () => {
123123
// assertion below reads `parsed.data`, so each one is green after the
124124
// declaration and red on a revert of it.
125125
// ─────────────────────────────────────────────────────────────────────────────
126-
describe('EmailServiceConfigSchema — keys the CLI reads (#5307)', () => {
126+
describe('EmailServiceConfigSchema — keys the CLI reads', () => {
127127
it('carries queueDelivery through the parse, not into the bin', () => {
128128
for (const queueDelivery of [true, false]) {
129129
const parsed = EmailServiceConfigSchema.safeParse({ queueDelivery });

0 commit comments

Comments
 (0)