Skip to content

Commit 2799155

Browse files
test(spec): the second data/ file group's test titles state each cited decision in words instead of a tracker number (stage 16) (#21831)
Part of #20749 Clause-②: no Stage 16 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 file group directly under `packages/spec/src/data/`: the 20 test files from `default-value-shape.test.ts` to `filter-comparand-shape.test.ts`. They carried 94 messages and 100 tracker ids, citing 59 records plus one decision-batch number. Every one of those ids 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 (`a3ffc4512d`) Instruments: `census10.cjs` (md5 `9d08602ab972b4b8643c90d64d40fa41`), `census.cjs` (md5 `6e42a45a926d375013c32d62f16a296e`), `census-wide.cjs` (md5 `c98410a19529c439adb0afbfb00026a2`) and `dirtable.cjs` (md5 `dda605c54745b4a60cc14c9a686e4eff`). They are byte-identical to the copies stages 10 to 15 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 **1231 messages / 1304 ids in 262 files**, the seat's reading at `a3ffc4512d` (stage 15's head). | directory | files | messages / ids | titles | other | |:--|--:|--:|--:|--:| | `ui/` | 81 | 393 / 416 | 375 / 398 | 18 / 18 | | `data/` (this PR: the second 20 files) | 75 | 374 / 399 | 353 / 376 | 21 / 23 | | `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 | | `ai/` | 1 | 2 / 2 | 0 | 2 / 2 | | `contracts/` | 1 | 1 / 1 | 0 | 1 / 1 | | **total** | **262** | **1231 / 1304** | **1154 / 1224** | **77 / 80** | The group reads **94 messages / 100 ids in 20 files**, the seat's figures, file for file: | file (under `data/`) | messages / ids | titles | other | |:--|--:|--:|--:| | `default-value-shape.test.ts` | 6 / 6 | 6 / 6 | 0 | | `default-value-tokens.test.ts` | 1 / 1 | 1 / 1 | 0 | | `document.test.ts` | 2 / 2 | 2 / 2 | 0 | | `driver-nosql.test.ts` | 1 / 1 | 1 / 1 | 0 | | `driver.test.ts` | 5 / 5 | 5 / 5 | 0 | | `esignature-deadline-keys-retirement.test.ts` | 4 / 4 | 4 / 4 | 0 | | `external-lookup-retirement.test.ts` | 3 / 3 | 1 / 1 | 2 / 2 | | `feed.test.ts` | 1 / 1 | 1 / 1 | 0 | | `field-autonumber-default-format.test.ts` | 1 / 1 | 1 / 1 | 0 | | `field-autonumber-default-unique.test.ts` | 2 / 2 | 2 / 2 | 0 | | `field-autonumber-readonly.test.ts` | 2 / 3 | 2 / 3 | 0 | | `field-currency-scale-refused.test.ts` | 3 / 3 | 3 / 3 | 0 | | `field-default-value.test.ts` | 4 / 4 | 1 / 1 | 3 / 3 | | `field-rows-option-description.test.ts` | 4 / 4 | 4 / 4 | 0 | | `field-value.test.ts` | 5 / 5 | 5 / 5 | 0 | | `field.test.ts` | 32 / 36 | 32 / 36 | 0 | | `filter-array-declaration.test.ts` | 2 / 2 | 1 / 1 | 1 / 1 | | `filter-ascii-fold.test.ts` | 1 / 1 | 1 / 1 | 0 | | `filter-boolean-comparand-declared-type.test.ts` | 11 / 11 | 11 / 11 | 0 | | `filter-comparand-shape.test.ts` | 4 / 5 | 4 / 5 | 0 | | **20 files** | **94 / 100** | **88 / 94** | **6 / 6** | - **Controls.** Lit, a title: `data/filter-comparand-type.test.ts`, outside the group, reads 9 / 10 at the head as at the base. Lit, "other" strings: the twin expect messages in `system/message-queue-retirement.test.ts` (`:87`, `:127`) still read at the head. Dark: `data/filter-array-declaration.test.ts` reads 0 / 0 at the head while 9 of its comment lines still carry a number. Planted in a scratch copy of the head `data/filter-ascii-fold.test.ts`: an id put into a title reads 1 / 1, and an id put into a comment reads 0. - **A wider pattern** (any `#` plus digits) reads the same totals in 19 of the 20 files. In `field.test.ts` it reads four more, at both base and head: the hex colours `#00FF00` / `#00AA00` in option fixtures (`:859`, `:1461`, `:1476`, `:1484`), which are not tracker ids. - **At the head:** 1137 messages / 1204 ids in 242 files. The 20 files read 0 / 0 on the gate pattern, and no other file moved. ## How the area was chosen `data/` has no subdirectory to split by, so its stages take name-ordered file groups near the ~100-id bound. Stage 15's re-cut named this group at exactly 100, and this census reads 100, so the rule needed no re-cut. **Named for the next stages** (re-cut from the head census, 1137 / 1204; `data/` 280 / 299 left, the same cut stage 15 named): - `data/` in three more stages, name-ordered: 1. `filter-comparand-type.test.ts` to `filter-view-operator-parity.test.ts`: 20 files, 95 messages / 99 ids; 2. `filter.test.ts` to `object.test.ts`: 17 files, 103 / 114. `object.test.ts` alone carries 42, so no cut lands nearer the bound; 3. `query-transport.test.ts` to `validation.test.ts` (11 files, 34 / 34) with `data/driver/` (7 files, 48 / 52): 86 ids. - `ui/` 416, about four stages. `api/` 201, two. `system/` 165, two. The files directly in `src/`, 120, one. - The three docblock needles (`ai/build-progress.test.ts:236`, `:237`, `contracts/approval-service.test.ts:274`), one stage with their docblocks. ## What each id became 31 literals (36 ids) now state a decision in words. 2 literals (2 ids) get their subject back in words where the number stood in for it. 61 literals (62 ids) drop a number the title already explains. Every cited record was read with its comments through REST: 56 answer 200, the four `objectui` records among them. #8656, #12868 and #16867 answer 404, and their decisions were read from what landed: `94f7ef8` (a `Field.time` builder that produces the literal shape an author could already write), `c459da6bc` (the form-view option shape is the object-field option shape minus `default`) and `0ee32ed` (the flat `notNull` spellings prescribe `storage.notNull`, not `required`), each with its CHANGELOG entry. | record(s) | literal (under `data/`) | now reads | |:--|:--|:--| | #4560 | `default-value-tokens.test.ts:15` | "defaultValue runtime tokens — one vocabulary the engine and the DDL both read". The token set moved to one source that the engine's default stamping and the SQL driver's column defaults both read, so a runtime token is never written as a literal column DEFAULT. | | #14477 (2) | `document.test.ts:238`, `:255` | "… a retiredKey() tombstone, since nothing ever read it (ADR-0049)". The pair had no reader and no roadmap, so it retired with the other deadline families. | | #4484 | `driver.test.ts:112` | "the streaming prescription names the removed findStream and the paged-find fix". `findStream` had no caller and was retired; the `streaming` bit described it. | | #14478 | `driver.test.ts:399` | "DriverOptions.timeout → DriverOptions.timeoutMs: the key carries its unit". | | #18063 | `driver.test.ts:428` | "driverSupportsTransactions — a driver that cannot honour transactions says so". Decision batch 148, item 3, letter B: a transport may declare that it has no transactions, and the engine refuses transactional use loudly. | | #8075 (2) | `external-lookup-retirement.test.ts:89`, `:130` | Two declared expect messages: "… must have zero holders after the external-lookup retirement" and "… being undone — the family had no consumer and accepted inline credentials". The measurement found no door reaching either schema, and both carried inline secrets, so both families were removed whole. | | #11807 | `feed.test.ts:22` | "SYS_ACTIVITY_BUILTIN_TYPES — the built-in activity types, published by the spec". Ruling A. | | #5628, #5503 | `field-autonumber-readonly.test.ts:82` | "RUNTIME_OWNED_FIELD_TYPES is the protocol vocabulary — the types whose value the runtime owns". The engine strips a client's autonumber value, and the builder declares the field read-only. | | #13388 | `field-default-value.test.ts:98` | A declared case label: "(`postal_code`, as the showcase seed once wrote it)". The seed's key was corrected to `postalCode`. | | #16077 (2) | `field-default-value.test.ts:116`, `:123` | Two declared case labels: "… (the rename is named over the missing-member error that sorts ahead)" and "… (the rename is named over the type error)". The literal gate prefers the rename over a positional member error. | | objectui#6140 | `field-rows-option-description.test.ts:52` | "FieldSchema accepts `rows` on the multiline editor types — declared because the editor widget reads it". Option A: validation and the running widget agree. | | objectui#6153 | `field-rows-option-description.test.ts:162` | "SelectOptionSchema accepts `description` — declared because the lookup widget reads it", the inherited ruling for a consumed key. | | #12868 | `field-rows-option-description.test.ts:192` | "… by construction (that face is the option shape minus `default`)". | | #8163 | `field.test.ts:197` | "FieldSchema — field-level `currency` key guidance, naming `currencyConfig.defaultCurrency`". The refusal gained a prescription; nothing it accepts moved. | | #9784, #4447 | `field.test.ts:997` | "keeps non-reference types ACCEPTING the key (installed-base artifact shape) — materialization moved to the reference-types block below". `deleteBehavior` materializes only on reference types. #4447 is dropped: "installed-base artifact shape" already says why the key must stay legal. | | #8793 | `field.test.ts:1174` | "relatedListFilter is judged by the schema door that refuses a bare date preset as a comparand", the ruled half that refuses the preset vocabulary as a bare temporal comparand at publish time. | | #8656 | `field.test.ts:1434` | "should create time field — the same literal shape an author could already write". | | #11437, objectui#4015 | `field.test.ts:2105` | "FieldSchema — authored `radio` + `multiple: true` is REFUSED (ruled: at the entrance, never rendered as checkboxes)". Option C; option A was not taken. | | #17469 | `field.test.ts:2191` | "FieldSchema — authored `multiple: true` on a NON-MULTI-CAPABLE type is REFUSED (ruled: one definition of multi-value, the radio rule generalised)". Option 1′ of decision batch 128, item 5. That batch number went with the id. | | #9019, objectui#4676 | `field.test.ts:2320` | "FieldSchema — `placeholder` is a DECLARED key (ruled: the renderers already apply it)". Option C: the producer moves. | | #8993 | `field.test.ts:2393` | "FieldSchema — `maskingRule` is a DECLARED key (ruled: partial masking, enforced at runtime)". Option A: partial masking as a runtime-first capability, declared only with its enforcement. | | #11339 | `field.test.ts:2476` | "Polymorphic pointer pair — referenceVia names the sibling column that holds the object (ADR-0052 §5)", the declared pointer-pair carrier. | | #5158 | `filter-array-declaration.test.ts:142` | A declared expect message: "… — the array form is input-only sugar, lowered before any driver sees it". Ruling C: one lowering seam. | | #5286 | `filter-array-declaration.test.ts:233` | "FilterArray type-level declaration (type-checked since the test layer got its own tsc program — see above)". | | #4706 | `filter-ascii-fold.test.ts:32` | "leaves non-ASCII letters ALONE — the case-insensitive operators fold ASCII only", the record's first question, answered A. | | #21333 | `filter-boolean-comparand-declared-type.test.ts:138` | "booleanComparandDoorVerdict — an accepted spelling narrows to its boolean, any other is refused". | | #5423 (2) | `filter-comparand-shape.test.ts:779`, `:1068` | "the whole refusal fits under the 500-char client bound the REST layer truncates at". The REST layer truncates a long 4xx message rather than replacing it. | **Subject restored (2 ids):** #16077 at `default-value-shape.test.ts:172` ("the rename preference is a NO-OP for a class that cannot emit `unrecognized_keys`"; without its number the title would have read as if `checkLiteralDefaultValue` itself were the no-op) and #21382 at `filter-boolean-comparand-declared-type.test.ts:195` ("the accepted set is unchanged — the non-string widening adds refusals only"). **Dropped only (62 ids):** #2004, #3855 (2), #4001 (3), #4455, #4634 (2), #5628, #5869, #6555, #7127 (3), #7768, #8075, #8321 (2), #8371, #9228, #9689 (4), #9784, #11566, #11949, #13053, #13671, #13802, #13894, #14168, #14477 (4), #15680, #16077 (3), #16867, #18972, #19629 (3), #19992 (5), #20740, #21333 (5), #21382 (4), #21448. - Each of these titles already states the decision it pins: for example "deleteBehavior: set_null on master_detail is a parse-time rejection" for #9689, "the list-comparand shape door runs inside parseFilterAST" for #5869 and #9228, or "refuses `precision` at EVERY value, in range or not: the key was removed, not re-bounded" for #19992. - **`driver-nosql.test.ts:375`** now reads "NoSQLQueryOptions.timeout carries its unit", the same text stage 14 gave `ai/conversation.test.ts`, so the two read alike. - **`filter-boolean-comparand-declared-type.test.ts`:** its six describes and five `it`s carried the two records as a file-wide tag. The verdict's describe now states the decision (above). The others name the contract part they pin (the accepted spellings, the judged fields, the refusal message, the fixture, the case table), and their child titles state what each part does. The file's header comment still names both records; comments are not touched here. - **The `(the #9689 class)` tails** on three idempotency titles go: each title already says "parse(parse(x)) is byte-identical" or "re-parses cleanly", which is what that class names. ## Readers - **Test-name filters:** none. A tracked-tree search for `--testNamePattern` and `vitest … -t` finds only the option name in `packages/qa/vitest-filter-preflight/src/project-cli-override-preflight.ts:212`, which filters nothing. - **Snapshots:** none. No `.snap` file or `__snapshots__` directory is tracked under `packages/spec`. - **Projects:** none of the 20 files is listed in `packages/spec/vitest.repo-tests.json`; all 20 run in the `local` project. - **By substring:** every old literal, plus a window around each id (287 needles), was searched across the tracked tree outside its own file. No gate, doc, filter, snapshot or `scripts/check-*.mjs` self-test reads one. The 33 needle hits fall on 18 lines: - **same-text strings in this card's later stages:** `data/driver/memory.test.ts:548` and `data/driver/turso.test.ts:172` (the last `data/` group), `ui/dashboard.test.ts:717` ("carries its unit"); `system/message-queue-retirement.test.ts:87` and `:127`, the twin expect messages of the two `external-lookup-retirement.test.ts` strings; `system/translation.test.ts:767` ("unknown-key strictness"); `ui/action.test.ts:1245` ("alias is REMOVED"); - **sibling titles in other lanes:** `objectql` `engine-aggregate-flag-comparand-refusal.test.ts:187`, `service-analytics` `where-boolean-flag-refusal.test.ts:197` and `where-empty-operator.test.ts:130` (all `[#21448] a LIST …`); - **comments and CHANGELOG:** `field.zod.ts:2264`, `driver-sql` `sql-driver.ts:20176`, `cli` `generate.ts:30`, `filter-comparand-shape.ts:735` and `:802`, `filter-comparand-type.ts:116` and `:228`, and one `packages/spec/CHANGELOG.md` entry. None reads a test title. - **Same-text titles named in stage 14's and 15's ACCEPTs:** `driver-nosql.test.ts:375` (`(#15680)`) is the one in this group, rewritten as above. ## 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. The declared lines are `external-lookup-retirement.test.ts:89` and `:130`, `field-default-value.test.ts:98`, `:116` and `:123`, and `filter-array-declaration.test.ts:142`. - **Result:** 20 of 20 files SAME on all three legs, with the per-file counts predicted in writing before the run. - **Totals:** 94 changed literals, 88 titles and 6 declared. The diff's `+` and `-` lines are exactly the 94 planned lines, and every file keeps 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 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; a declared string given a new id VIOLATION; an undeclared `expect` message changed VIOLATION; a title re-split into a `+` chain DIFF. **Test counts:** the 20 files were run at the base, in a separate base worktree, and at the head, with `--project local --project repo`. Both sides read 766 tests (765 passed, 1 todo), with the same count and status sequence per file in 20 of 20. 503 full test names change, and each equals the base name with the planned replacements applied (0 mismatches). No full name repeats on either side. ## `main` since the base Re-fetched just before this PR opened, `origin/main` was six commits past the base (`088428fb42`). None of them touches any of the 20 files, so `main` was not merged. Two of them touch `packages/spec` source (`ui/report.form.ts` and `data/object.zod.ts`); this diff changes only test-title text, so it cannot combine with them into a joint failure, and the merge queue re-runs the suite on the merged generation. ## Changeset: `skip-changeset` Measured, not assumed: - `npm pack --dry-run` of `@objectstack/spec` lists 2068 files. 0 of the 20 touched files are in it, and no `*.test.ts` at all. The controls `src/data/field.zod.ts`, `src/data/filter.zod.ts` and `dist/data/index.js` are in it. - In the built `dist/`, five new phrases and four old literals each read in 0 files. The control `Unrecognized key(s) on` reads in 42. So this PR publishes nothing, and no changeset is added. ## Verification (at `95baf08ba9`) - `pnpm turbo run build` over all packages: 71 / 71. - `@objectstack/spec`: - `vitest run --project local`: 615 files, 18360 passed, 1 todo. - `typecheck` exit 0, including `check:test-typecheck` (52 files / 246 errors / 135 pinned signatures held). Its program holds all 20 touched files, counted with `tsc --listFilesOnly -p tsconfig.test.json`. - `check:generated`: all 15 generated artifacts up to date. - **Gates:** `dispatch-gates --commands` derived 79 families, the same set as stages 13 to 15, and all 79 exit 0. `--ran` reconciles: 79 derived, 79 run, 0 NOT-MEASURED, 0 UNRUN, every family with its exit code recorded. - The derivation printed STALE TREE: `main` moved past the base during verification and `scripts/engine-double-contract.pinned.json` changed there. `check:engine-double-contract` exits 0 on this tree, this diff touches no engine double, and the queue re-runs the family on the merged generation. - The 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 20 files reads 0 errors and 0 warnings. The population comes from ESLint's own config: 20 configured, 0 ignored. No file sets `parserOptions.project` or `projectService`, so no untouched file's verdict can move. - `check-governed-merges --test`: NOT governed, 188 changed lines. ## Acceptance notes - **No needle in this group.** Every id was a title or a declared string; no expected value of an assertion over a source docblock was found. The three known needles are untouched. - **Same-id test titles in this card's later stages** go with those stages: 46 lines in `packages/spec/src` (14 in later `data/` groups, 9 in `system/`, 23 in `ui/`). Among them, `ui/view.test.ts:1893` ("leaves the malformed-declaration refusals (#8321/#12174) reading exactly as before") and `ui/action-param-default-value.test.ts:154` (`#16077 carries the rename …`) are near-twins of titles rewritten here. - **Same-id test titles in other packages** are their lanes' test-string shares. A search of `describe` / `it` / `test` lines outside `packages/spec` finds 111 lines in 15 packages citing ids this PR handled: `objectql` 47 (22 files), `driver-sql` 18 (13), `rest` 15 (12), `driver-mongodb` 6 (3), `lint` 5 (4), `plugin-security` 5 (2), `cli` 3 (2), `core` 2, `driver-memory` 2, `metadata-protocol` 2, `service-analytics` 2, and one each in `driver-turso`, `plugin-audit`, `qa/dogfood` and `service-automation`. - **Two spec test files outside `src/`** carry same-id titles: `packages/spec/scripts/check-generated-ledger.test.ts:100` and `packages/spec/scripts/file-description.test.ts:66`. They are outside class (e) as ruled ("the test strings shipped under `src/`"). - **Code comments still carry ids** in these files and their sources, for example the header of `filter-boolean-comparand-declared-type.test.ts`, the block above `filter-array-declaration.test.ts:233`, and the `field.zod.ts` docblocks naming the shadowing mechanism. Comments are not this card's share, and none is touched here. --- _Generated by [Claude Code](https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 8832655 commit 2799155

20 files changed

Lines changed: 94 additions & 94 deletions

‎packages/spec/src/data/default-value-shape.test.ts‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {
2222
} from './default-value-shape';
2323
import { DEFAULT_VALUE_TOKENS } from './default-value-tokens';
2424

25-
describe('#7127 discriminateDefaultValueShape — engine-parity classification', () => {
25+
describe('discriminateDefaultValueShape — engine-parity classification', () => {
2626
const CASES: Array<{ label: string; dv: unknown; shape: DefaultValueShape }> = [
2727
// ── Expression envelopes: the engine's structural predicate, verbatim ────
2828
{ label: 'canonical CEL envelope', dv: { dialect: 'cel', source: 'today()' }, shape: 'expression' },
@@ -87,7 +87,7 @@ describe('#7127 discriminateDefaultValueShape — engine-parity classification',
8787
});
8888
});
8989

90-
describe('#7127 checkLiteralDefaultValue — the shared stored-form literal check', () => {
90+
describe('checkLiteralDefaultValue — the shared stored-form literal check', () => {
9191
it('refuses a literal that cannot satisfy the stored contract, with the contract\'s own detail', () => {
9292
const v = checkLiteralDefaultValue({ type: 'number' }, 'abc');
9393
expect(v.ok).toBe(false);
@@ -130,7 +130,7 @@ describe('#7127 checkLiteralDefaultValue — the shared stored-form literal chec
130130
// also be wrong. Each case below asserts BOTH halves: the prescription is
131131
// present, AND the half that was being shown instead is gone. Without the
132132
// second the pin cannot see a regression back to the positional read.
133-
it('#16077 prefers the rename over a MISSING-member type error (location)', () => {
133+
it('prefers the rename over a MISSING-member type error (location)', () => {
134134
const v = checkLiteralDefaultValue({ type: 'location' }, { latitude: 1, longitude: 2 });
135135
expect(v.ok).toBe(false);
136136
// Positionally this rejection reads
@@ -148,7 +148,7 @@ describe('#7127 checkLiteralDefaultValue — the shared stored-form literal chec
148148
// discarding it cost the author the whole thing.
149149
});
150150

151-
it('#16077 prefers the rename over a WRONG-TYPED-member error (address)', () => {
151+
it('prefers the rename over a WRONG-TYPED-member error (address)', () => {
152152
const v = checkLiteralDefaultValue({ type: 'address' }, { street: 5, postal_code: '98101' });
153153
expect(v.ok).toBe(false);
154154
// Every member of `address` is optional, which rules out a MISSING-member
@@ -158,7 +158,7 @@ describe('#7127 checkLiteralDefaultValue — the shared stored-form literal chec
158158
expect(v.detail).not.toContain('expected string, received number');
159159
});
160160

161-
it('#16077 leaves the already-correct case exactly as it was (the asymmetry is gone)', () => {
161+
it('leaves the already-correct case exactly as it was (the asymmetry is gone)', () => {
162162
// No member error to sort ahead, so this one was always right. Pinning it
163163
// beside the two above is what states the property: the diagnosis no
164164
// longer depends on whether an unrelated member happened to also be wrong.
@@ -169,7 +169,7 @@ describe('#7127 checkLiteralDefaultValue — the shared stored-form literal chec
169169
expect(unlucky.detail).toContain('`postal_code` \u2192 `postalCode`');
170170
});
171171

172-
it('#16077 is a NO-OP for a class that cannot emit `unrecognized_keys`', () => {
172+
it('the rename preference is a NO-OP for a class that cannot emit `unrecognized_keys`', () => {
173173
// The sweep over all sixteen classes `valueSchemaFor(def, 'stored')`
174174
// covers found only `location` and `address` backed by a `strictObject`,
175175
// so only they can emit the issue the preference looks for. For the other

‎packages/spec/src/data/default-value-tokens.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
isAppResolvedDefaultToken,
1313
} from './default-value-tokens.js';
1414

15-
describe('defaultValue runtime tokens (#4560)', () => {
15+
describe('defaultValue runtime tokens — one vocabulary the engine and the DDL both read', () => {
1616
it('declares the complete family, and every member is described', () => {
1717
expect([...DEFAULT_VALUE_TOKENS]).toEqual(['NOW()', 'current_user']);
1818
for (const token of DEFAULT_VALUE_TOKENS) {

‎packages/spec/src/data/document.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ describe('ESignatureConfigSchema', () => {
235235
// pin, the tsc `never` channel and the ADR-0087 registration — lives in
236236
// `esignature-deadline-keys-retirement.test.ts`; these two are the family
237237
// tests' one-line refusal witnesses (the #14477 house shape).
238-
it('REFUSES an authored `expirationDays` — a retiredKey() tombstone since #14477 (ADR-0049)', () => {
238+
it('REFUSES an authored `expirationDays` — a retiredKey() tombstone, since nothing ever read it (ADR-0049)', () => {
239239
const wellFormed = {
240240
provider: 'custom',
241241
signers: [{ email: 'test@example.com', name: 'Test', role: 'Test', order: 1 }],
@@ -252,7 +252,7 @@ describe('ESignatureConfigSchema', () => {
252252
expect(parsed).not.toHaveProperty('expirationDays');
253253
});
254254

255-
it('REFUSES an authored `reminderDays` — a retiredKey() tombstone since #14477 (ADR-0049)', () => {
255+
it('REFUSES an authored `reminderDays` — a retiredKey() tombstone, since nothing ever read it (ADR-0049)', () => {
256256
const wellFormed = {
257257
provider: 'docusign',
258258
signers: [{ email: 'test@example.com', name: 'Test', role: 'Test', order: 1 }],

‎packages/spec/src/data/driver-nosql.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ describe('NoSQL Driver Protocol', () => {
372372
// never on a bare `toThrow()`. The shape is not strict, so without the
373373
// tombstone a query authored with `timeout` would have run with NO deadline at
374374
// all — the failure a driver timeout exists to prevent — and reported nothing.
375-
describe('NoSQLQueryOptions.timeout carries its unit (#15680)', () => {
375+
describe('NoSQLQueryOptions.timeout carries its unit', () => {
376376
it('REFUSES the retired `timeout` with the rename in the message', () => {
377377
const result = NoSQLQueryOptionsSchema.safeParse({ timeout: 5000 });
378378
expect(result.success).toBe(false);

‎packages/spec/src/data/driver.test.ts‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,15 +101,15 @@ describe('DriverCapabilitiesSchema', () => {
101101
// Retired capability bits (#4634, ADR-0049 enforce-or-remove)
102102
// ===========================================================================
103103

104-
describe('[#4634] the 31 inert capability bits are tombstoned, not stripped', () => {
104+
describe('the 31 inert capability bits are tombstoned, not stripped', () => {
105105
it.each(RETIRED_BITS)('REJECTS an authored `%s`, with the prescription in the message', (bit) => {
106106
const value = bit === 'isolationLevels' ? ['read-committed'] : true;
107107
expect(() => DriverCapabilitiesSchema.parse({ [bit]: value })).toThrow(
108108
new RegExp(`DriverCapabilities\\.${bit}.*removed.*Delete the key`, 's'),
109109
);
110110
});
111111

112-
it('the streaming prescription carries the #4484 findStream story and the paged-find fix', () => {
112+
it('the streaming prescription names the removed findStream and the paged-find fix', () => {
113113
expect(() => DriverCapabilitiesSchema.parse({ streaming: true })).toThrow(
114114
/DriverCapabilities\.streaming.*removed.*findStream.*`find\(\)` with `limit`\/`offset`.*Delete the key/s,
115115
);
@@ -163,7 +163,7 @@ describe('[#4634] the 31 inert capability bits are tombstoned, not stripped', ()
163163
// so the load-bearing tsc-channel proof is the compiler-API test below, with
164164
// anti-vacuity guards; sabotage-verified in the PR (S1: re-adding a live
165165
// `streaming: z.boolean()` turns it red).
166-
describe('[#4634] tsc channel: the retired bits are unwritable in DriverCapabilities', () => {
166+
describe('tsc channel: the retired bits are unwritable in DriverCapabilities', () => {
167167
it('types every retired bit as authored-unwritable and every live bit as writable', async () => {
168168
const ts = (await import('typescript')).default;
169169
const { resolve, dirname } = await import('node:path');
@@ -396,7 +396,7 @@ describe('DriverInterfaceSchema', () => {
396396
// else; the unit now lives in the key name. Tombstoned (the shape is not
397397
// strict, so a bare deletion would strip the old key in silence) and
398398
// registered as `data/DriverOptions:timeout` under protocol 18.
399-
describe('DriverOptions.timeout → DriverOptions.timeoutMs (#14478)', () => {
399+
describe('DriverOptions.timeout → DriverOptions.timeoutMs: the key carries its unit', () => {
400400
it('REFUSES the retired `timeout` spelling with the rename in the message', () => {
401401
const result = DriverOptionsSchema.safeParse({ timeout: 5000 });
402402
expect(result.success).toBe(false);
@@ -425,7 +425,7 @@ describe('DriverOptions.timeout → DriverOptions.timeoutMs (#14478)', () => {
425425
// [#18063] driverSupportsTransactions — the one definition of the gate
426426
// ===========================================================================
427427

428-
describe('[#18063] driverSupportsTransactions', () => {
428+
describe('driverSupportsTransactions — a driver that cannot honour transactions says so', () => {
429429
const withMethod = { beginTransaction: async () => ({}) };
430430

431431
it('is false for a driver with no beginTransaction — the pre-existing gate, unchanged', () => {

‎packages/spec/src/data/esignature-deadline-keys-retirement.test.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ function expectTombstoneRefusal(site: Pick<RetiredSite, 'qualified' | 'schema' |
141141
expect(issue!.message).not.toMatch(/os migrate meta/);
142142
}
143143

144-
describe('[#14477] ESignatureConfig deadline pair retirement — refusal at every site', () => {
144+
describe('ESignatureConfig deadline pair retirement — refusal at every site', () => {
145145
for (const site of SITES) {
146146
it(`REJECTS an authored \`${site.qualified}\` at path \`${site.issuePath.join('.')}\`, carrying the prescription`, () => {
147147
expectTombstoneRefusal(site);
@@ -169,7 +169,7 @@ describe('[#14477] ESignatureConfig deadline pair retirement — refusal at ever
169169
});
170170
});
171171

172-
describe('[#14477] no-materialize: parsed configurations carry neither key and neither former default', () => {
172+
describe('no-materialize: parsed configurations carry neither key and neither former default', () => {
173173
it('on the base schema', () => {
174174
const parsed = ESignatureConfigSchema.parse(CONFIG);
175175
expect(parsed).not.toHaveProperty('expirationDays');
@@ -187,7 +187,7 @@ describe('[#14477] no-materialize: parsed configurations carry neither key and n
187187
});
188188
});
189189

190-
describe('[#14477] the tsc channel: the input type of both retired keys is `never`', () => {
190+
describe('the tsc channel: the input type of both retired keys is `never`', () => {
191191
it('fails tsc at both authoring sites', () => {
192192
const config: ESignatureConfig = {
193193
...CONFIG,
@@ -215,7 +215,7 @@ describe('[#14477] the tsc channel: the input type of both retired keys is `neve
215215
});
216216
});
217217

218-
describe('[#14477] ADR-0087 registration', () => {
218+
describe('ADR-0087 registration', () => {
219219
it('declares both sites under major 18, with the D3 semantic entry wired and no D2 conversion', () => {
220220
for (const site of SITES) {
221221
expect(RETIRED_KEYS_BY_MAJOR[18], `${site.registered} must be declared`).toContain(site.registered);

‎packages/spec/src/data/external-lookup-retirement.test.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ import {
5454
// Form follows #4988 / #5055: resolved symbol identity over every public entry
5555
// via the build-time `export-origins/` artifact, plus the file-deletion probe
5656
// in the #4988 direction (whole-file retirement, no surviving occupant).
57-
describe('[#8075] data/ external-lookup family retirement', () => {
57+
describe('data/ external-lookup family retirement', () => {
5858
/** The 8 names the three retired defs exported (3 schema consts + 5 types). */
5959
const RETIRED_NAMES = [
6060
'ExternalDataSourceSchema', 'ExternalDataSource',
@@ -86,7 +86,7 @@ describe('[#8075] data/ external-lookup family retirement', () => {
8686

8787
// ── ABSENCE (every entry, not just ./data) ────────────────────────────
8888
for (const name of RETIRED_NAMES) {
89-
expect(holdersOf(name), `${name} must have zero holders after #8075`).toEqual([]);
89+
expect(holdersOf(name), `${name} must have zero holders after the external-lookup retirement`).toEqual([]);
9090
}
9191

9292
// ── SURVIVAL ──────────────────────────────────────────────────────────
@@ -127,7 +127,7 @@ describe('[#8075] data/ external-lookup family retirement', () => {
127127
}
128128
};
129129
walk(srcRoot);
130-
expect(importers, 'a resurrected import means the retirement is being undone — re-read #8075').toEqual([]);
130+
expect(importers, 'a resurrected import means the retirement is being undone — the family had no consumer and accepted inline credentials').toEqual([]);
131131
});
132132

133133
it('runtime namespace agrees with the compiler view', async () => {

‎packages/spec/src/data/feed.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ describe('FeedItemType', () => {
1919
});
2020
});
2121

22-
describe('SYS_ACTIVITY_BUILTIN_TYPES (#11807)', () => {
22+
describe('SYS_ACTIVITY_BUILTIN_TYPES — the built-in activity types, published by the spec', () => {
2323
/**
2424
* Mechanical invariants only. The semantic pin — every entry has a recorded
2525
* writer disposition — lives with the object that declares the column:

‎packages/spec/src/data/field-autonumber-default-format.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import { z } from 'zod';
2525
import { FieldSchema } from './field.zod';
2626
import { DEFAULT_AUTONUMBER_FORMAT, resolveAutonumberFormat } from './autonumber-format';
2727

28-
describe('FieldSchema.autonumberFormat — the declared contract default (#6555)', () => {
28+
describe('FieldSchema.autonumberFormat — the declared contract default', () => {
2929
it('declares `{0000}` as the JSON-Schema default for the key', () => {
3030
const js = z.toJSONSchema(FieldSchema as unknown as z.ZodType, {
3131
unrepresentable: 'any',

‎packages/spec/src/data/field-autonumber-default-unique.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ function minimalField(type: string): Record<string, unknown> {
5151
return input;
5252
}
5353

54-
describe('#13894 — autonumber defaults to unique: organization', () => {
54+
describe('autonumber defaults to unique: organization', () => {
5555
it("materializes 'organization' when the author omits `unique`", () => {
5656
const parsed = FieldSchema.parse({ type: 'autonumber' });
5757
expect(parsed.unique).toBe('organization');
@@ -101,7 +101,7 @@ describe('#13894 — autonumber defaults to unique: organization', () => {
101101
expect(text.indexOf('unique')).toBe(text.indexOf('multiple') + 1);
102102
});
103103

104-
it('is idempotent — parse(parse(x)) is byte-identical (the #9689 class)', () => {
104+
it('is idempotent — parse(parse(x)) is byte-identical', () => {
105105
for (const input of [{ type: 'autonumber' }, { type: 'autonumber', unique: false }, { type: 'text' }]) {
106106
const once = FieldSchema.parse(input);
107107
const twice = FieldSchema.parse(once);

0 commit comments

Comments
 (0)