Skip to content

Commit 72b6333

Browse files
test(spec): kernel test titles state each cited decision in words instead of a tracker number (stage 11) (#21736)
Part of #20749 Clause-②: no Stage 11 of this card, and the second area of class (e): the test strings shipped under `packages/spec/src`, as ruled in `5902360492` on #20513. This stage takes the whole `kernel/` directory. Its 102 test-title and test-message literals carried 106 tracker ids citing 69 records. 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, fixture value, test count or code comment changes. ## Census at the base (`3fa850cf00`, 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 stage 10 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 **1696 messages / 1807 ids in 405 files at the base**, which is stage 10's reading at its head exactly. `kernel/` reads 102 / 106, also stage 10'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 | | **`kernel/`** (this PR) | 36 | **102 / 106** | 92 / 96 | 10 / 10 | | `shared/` | 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** | **405** | **1696 / 1807** | **1587 / 1692** | **109 / 115** | - **Controls.** Lit, a title: `kernel/capability-metadata-kind.test.ts:66` reads one message with #5961. Lit, a template-literal expect message: `kernel/cli-command-contribution-retirement.test.ts:74` reads one message. Dark: the `// ─── [#17178] …` comment at `kernel/execution-context.test.ts:205` reads 0 (the file's messages sit at `:72`, `:167`, `:219`, `:233` and `:237`). 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 107 / 111 under `kernel/` at the base. The five extra hits are hex colours (`#94A3B8`, `#0f0`) in `functional-completeness.test.ts` and one `§3.10 #3` section reference in `manifest.zod.ts`, a non-test file. None is a tracker id. At the head the wider pattern reads only those five, and the gate pattern reads 0 / 0. - **At the head:** 1594 messages / 1701 ids in 369 files. `kernel/` reads 0 / 0. Nothing else moved. ## How the area was chosen Stage 10's rule, applied before any card was read: 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. `kernel/` (106) is the busiest whole directory within the bound, and its census reads exactly stage 10's 106, 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), `shared/` (one, 95), `contracts/` with `conversions/` (one, 108), and `security/`, `ai/`, `identity/`, `integration/`, `migrations/`, `marketplace/`, `meta-spelling/` and `studio/` together (one, 96). ## What each id became Of the 106 ids, 32 now state a decision in words, in 31 literals. 74 are dropped where the title already explains them; two of those (#14478) sit in literals that also gained words for another id. Every record was read with its comments through REST. 58 answer 200. Ten answer 404, and their decisions were read from what landed. One is in a repository not attached to this session. | record | ids | result | |:--|--:|:--| | #12007, #11825, #12340, #4914, #15932, #11846, #16059 | 10 of 20 | Every expect message that read "must have zero holders after #N" or "must not be exported after #N" now reads "after its retirement": each record retired the names it lists. The other 10 sit in `describe` / `it` titles that already say what was retired, and were dropped. #11846 answers 404; its retirement was read from the CHANGELOG entry for landing `0c2334f`. | | #7280 | 1 | "the ADR-0069 gate posture is a declared field": `authGate` is declared on `ExecutionContextSchema`, not spread behind an `as any`. | | #17178 | 1 | "SEED_WRITE_EXECUTION_CONTEXT — one spelling of the seed posture": one exported constant replaced the private copies. | | cloud#687 | 1 | "(the founding case: a roll-up that reads 0 forever)". The cloud repository is not attached to this session (403). The decision was read from ADR-0078's "Surfaced by" line and the CHANGELOG paragraph on the founding case: a bare `{ type: 'summary' }` field read 0 forever, and the rule now flags it as an error. | | #14192 (404) | 4 | "(the silent-drop measurement, inverted)", where the title said "the card's measurement". Dropped from 3 titles that state the refusal. Decision read from landing `4d0d944`: `ManifestSchema` goes strict and refuses unknown keys inside `manifest:`. | | #10726 (404) | 2 | "removed for the `http.server` mount, maintainer-ruled 2026-08-22", where the title said "Option B". Read from landing `bc56e18` and PR #12417's body: Option B removes `contributes.routes` and points authors at the imperative `http.server` mount. Dropped once. | | #4148 | 1 | "the object/field unknown-key warnings survive the generalization", where the title said "the #4148 behaviours". | | #4001 | 3 | "(the evidence base for the strict tiers)", where the title said "#4001 evidence phase". Dropped from 2 titles that state the pinned rule. | | #4167, #8687 | 3 | "top-level stack keys (named, then refused at parse)": #4167 made an undeclared top-level key say so instead of vanishing, and #8687 ruled Shape B, a strict top level. Dropped once more for #8687. | | #15624 | 2 | "cache.ttl → deleted (the unread outer block is retired)". Dropped once. | | #14478 | 3 | Dropped. The `→ ttlMs` / `→ timeoutMs` renames and "carry their unit" already state the rule: the unit lives in the key name. | | #15939 | 1 | "RuntimeConfig.resourceLimits.timeout → timeoutMs (its unit was named in JSDoc only)", where the title said "ruling A". Ruling A renames the keys whose unit was named only in JSDoc, per file. | | #5086 | 2 | "(PUT /meta refuses the inlet)": a code-only kind's create is refused with 403 `NOT_CREATABLE` before anything persists. | | #7743 | 1 | "UNCHANGED, the field overlay refusal stays", where the title said "#7743's overlay refusal". | | #8154 | 1 | "(the consumer contract of the per-type redaction hook)". | | #21120 | 1 | "stored metadata ROWS — the family-wide seam every exit routes through". This says only what the card's public summary says: one shared seam, which every surface routes through or refuses. | | #6245 | 1 | "the bound-but-unregistered fence, pinned": schemas are bound for those kinds WITHOUT registering them. | | #11263 | 1 | "PLATFORM_PLUGIN_WIRED_RUNTIMES — runtimes wired by plugins[], not by a token": a sibling roster was added, and no token was minted. | | #3366 | 1 | "classifyRequiredCapability — preflight for an installable provider in this edition". | | #17676 | 1 | "package-registry carve-out — its persistence is always-on core, split from `marketplace`", where the title said "ruling A′". | | #16365 | 1 | "accepts %s, which the regex refused before the SemVer widening", where the title said "the pre-#16365 regex". The `%s` values do not change. | | #17227 | 1 | "dashboard.header.actions stays titled — the first carrier given item-level names". | | dropped only (live) | 45 | #3308 (2), #3433, #3760, #3786, #4212, #4509, #4587, #4657, #4741, #4834, #4939, #5488, #5961, #6881, #6931, #7893, #8586, #10039 (2), #11169, #12032, #12428, #13613, #15678 (7), #16328, #16334, #16449, #17232 (2), #17445, #17780, #18124 (2), #18791 (3), #19630, #20102: each title already states the pinned decision. | | dropped only (404) | 8 | #10194 (landing `2306a76`: each bound entry is its stack collection's schema), #10338 (`d2619fd`: `target` optional, the gate holds the flow requirement), #10724 (`be21955`: the nine dead members tombstoned), #11330 (`a9ee98992`: the trust-tier text tells the truth), #11332 (`dce5cd4`: the three dead containers retired), #13135 (`9e0ba21`: the paper customization protocol retired), #17147 (2, `aaacf1d5c`: the granted set is registered and refuses nothing, said truthfully). Each title already carries what landed. | ## 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. `kernel/` has no `__snapshots__`, and no `.snap` file is tracked under `packages/spec`. - **Titles by substring:** every old title, plus a window around each id (256 needles), was searched across the tracked tree outside its own file. No gate, doc or script matches one. At the head, 8 hits remain: three sibling titles in other lanes' or stages' files (`metadata-protocol/src/protocol.capability-write-door.test.ts:183`, `spec/src/api/contract.test.ts:813`, `spec/src/system/auth-config.test.ts:520`), three released `packages/spec/CHANGELOG.md` entries, and one code comment in `kernel/metadata-authoring-lint.ts:268`, which belongs to the comment lane. ## 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 10 declared lines. Those are the expect messages at `cli-command-contribution-retirement.test.ts:74` and `:86`, `plugin-lifecycle-advanced-retirement.test.ts:103`, `:124` and `:141`, `plugin-loading-retirement.test.ts:125`, `plugin-security-scan-result-retirement.test.ts:123`, `preview-mode-retirement.test.ts:193` and `startup-orchestrator-retirement.test.ts:85` and `:106`. Each changed leaf must carry a tracker id before and no `#` plus digits after. - **Result:** 36 of 36 files SAME, 102 changed (92 title, 10 declared), on all three legs. - **Diff hunks:** exactly the 102 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 36 files were run at the base (in a separate base worktree) and at the head: 841 / 841 tests on both sides, with the same count and status sequence per file in 36 of 36. 388 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 36 touched files are in it, and 0 `*.test.ts` at all. The controls `src/kernel/manifest.zod.ts` and `src/kernel/execution-context.zod.ts` are in it. - In `dist/`, three new phrases and three old ones each read in 0 files. The control `Plugin compatibility ranges (ADR-0025` reads in 20. So this PR publishes nothing, and no changeset is added. ## Verification (at `e0ad8f50af`) - `pnpm turbo run build` over all packages: 71 / 71 (at the first commit), then `@objectstack/spec` rebuilt at `e0ad8f50af`. - `@objectstack/spec`: `vitest run --project local`, 613 files and 18215 passed, 1 todo. `typecheck` exit 0, including `check:test-typecheck`, whose program holds all 36 touched files. - **Gates:** `dispatch-gates --commands` derived 79 families at `e0ad8f50af`, and all 79 exit 0. `--ran` reconciles: 79 derived, 79 run, 0 NOT-MEASURED, 0 UNRUN. - **ESLint, a proven narrowing:** `--no-inline-config` over the 36 files, 0 errors and 0 warnings. The population comes from ESLint's own config: 36 configured, 0 ignored. No `parserOptions.project` or `projectService`, so no untouched file's verdict can move. - `check-governed-merges --test`: NOT governed, 204 changed lines. ## Acceptance notes - **Code comments still carry ids** in these 36 files and in the `kernel/` sources, for example `execution-context.test.ts:205`, `metadata-authoring-lint.ts:268` and `functional-completeness.ts:148`. They are the comment lane's, untouched here. - **A sibling title in another package** repeats `#5961 — capability` (`packages/metadata-protocol/src/protocol.capability-write-door.test.ts:183`). It is that package's test-string stage, not this one. - **The second commit** (`e0ad8f50af`) rewords one title from this PR's first commit, "the one carrier already titled", which read as a tautology, to "the first carrier given item-level names". Every proof above was re-run at that head. - **`origin/main` moved** three commits past the base before this PR opened (#21717, #21715, #21660). None touches `packages/spec`, so nothing was merged. --- _Generated by [Claude Code](https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 316be32 commit 72b6333

36 files changed

Lines changed: 102 additions & 102 deletions

‎packages/spec/src/kernel/activation-events-retirement.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import {
3535
// (#4834 superseded the kernel half: `DynamicLoadRequest` — the shape that
3636
// carried the tombstoned key — was removed whole, so this file's kernel-side
3737
// parse assertion is gone. See the block above the studio test.)
38-
describe('[#4657] ActivationEventSchema removal — no entry exports the name', () => {
38+
describe('ActivationEventSchema removal — no entry exports the name', () => {
3939
it('resolves the export surface: the retired names have ZERO holders across every public entry', () => {
4040
// Anti-vacuity: the baseline must cover the real surface. (This used to
4141
// enumerate package.json's exports map and build its own `ts.createProgram`

‎packages/spec/src/kernel/additional-types-retirement.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import { MetadataPluginConfigSchema, MetadataPluginManifestSchema } from './meta
3131
// pins assert the strongest set this surface really has: refusal, the issue
3232
// `code`, the `path` naming WHICH key was refused, and the prescription text
3333
// (#5240: where the wording is the contract, pin the wording).
34-
describe('[#8586] MetadataPluginConfig.additionalTypes retirement', () => {
34+
describe('MetadataPluginConfig.additionalTypes retirement', () => {
3535
/** A config that is valid except for whatever the individual test adds. */
3636
const baseConfig = { storage: {} } as const;
3737

‎packages/spec/src/kernel/capability-metadata-kind.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ const DECLARATION = {
6363
packageId: 'com.acme.billing',
6464
};
6565

66-
describe('#5961 — capability is a registered metadata kind', () => {
66+
describe('capability is a registered metadata kind', () => {
6767
// ── the three registries that were missing it ─────────────────────────
6868

6969
it('is a member of the kind enum', () => {

‎packages/spec/src/kernel/cli-command-contribution-retirement.test.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import {
3838
//
3939
// Form follows #11825 / commit 2c86fe3ea / #4988: resolved symbol identity over every
4040
// public entry via the build-time `export-origins/` artifact.
41-
describe('[#12007] kernel/ CLICommandContribution retirement', () => {
41+
describe('kernel/ CLICommandContribution retirement', () => {
4242
/** The 2 names the retired def exported (1 schema const + 1 type). */
4343
const RETIRED_NAMES = [
4444
'CLICommandContributionSchema',
@@ -71,7 +71,7 @@ describe('[#12007] kernel/ CLICommandContribution retirement', () => {
7171

7272
// ── ABSENCE (every entry, not just ./kernel) ──────────────────────────
7373
for (const name of RETIRED_NAMES) {
74-
expect(holdersOf(name), `${name} must have zero holders after #12007`).toEqual([]);
74+
expect(holdersOf(name), `${name} must have zero holders after its retirement`).toEqual([]);
7575
}
7676

7777
// ── SURVIVAL ──────────────────────────────────────────────────────────
@@ -83,7 +83,7 @@ describe('[#12007] kernel/ CLICommandContribution retirement', () => {
8383

8484
it('the runtime barrel resolves without the retired schema and keeps the survivor', async () => {
8585
const kernel = await import('./index');
86-
expect(kernel, 'CLICommandContributionSchema must not be exported after #12007')
86+
expect(kernel, 'CLICommandContributionSchema must not be exported after its retirement')
8787
.not.toHaveProperty('CLICommandContributionSchema');
8888
// Anti-vacuity: the barrel really resolved and still exports the live
8989
// oclif surface plus an unrelated kernel anchor.

‎packages/spec/src/kernel/events.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ describe('EventSchema', () => {
135135
// This pin holds the WIDENING: spellings the retired grammar refused
136136
// (PascalCase, kebab-case, leading digit/dot) now parse — a regression to a
137137
// schema-level grammar here should be a deliberate ruling, not drift.
138-
it('accepts event names as plain strings — the dot-notation grammar is retired (#13613)', () => {
138+
it('accepts event names as plain strings — the dot-notation grammar is retired', () => {
139139
const names = [
140140
// conventional dot-notation spellings (valid before and after)
141141
'user.created',
@@ -823,7 +823,7 @@ describe('Enhanced Event Handler', () => {
823823
// payload) rather than a bare unrecognized-key error, and the value survives at
824824
// the same magnitude. Asserting the message, not just `.toThrow()`: a bare
825825
// throw stays green when the schema throws for some unrelated reason.
826-
describe('Event bus retention windows carry their unit (#15678)', () => {
826+
describe('Event bus retention windows carry their unit', () => {
827827
it.each([
828828
['EventPersistence', EventPersistenceSchema, { enabled: true }],
829829
['EventSourcingConfig', EventSourcingConfigSchema, {}],

‎packages/spec/src/kernel/execution-context.test.ts‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ describe('ExecutionContextSchema', () => {
6969
// `message: undefined`. The contract is stated here, at the producer's
7070
// declaration, rather than tolerated at each consumer.
7171
// ---------------------------------------------------------------------------
72-
describe('ExecutionContextSchema.authGate — the ADR-0069 gate posture (#7280)', () => {
72+
describe('ExecutionContextSchema.authGate — the ADR-0069 gate posture is a declared field', () => {
7373
it('accepts a well-formed gate', () => {
7474
const ctx = ExecutionContextSchema.parse({
7575
userId: 'u1',
@@ -164,7 +164,7 @@ describe('ExecutionContextSchema.authGate — the ADR-0069 gate posture (#7280)'
164164
// were emptied, so the non-empty check is what makes this pin fail on a blank
165165
// cell rather than only on changed wording.
166166
// ---------------------------------------------------------------------------
167-
describe('ExecutionContextSchema.preserveAudit — the published description (#6881)', () => {
167+
describe('ExecutionContextSchema.preserveAudit — the published description', () => {
168168
const description = ExecutionContextSchema.shape.preserveAudit.description ?? '';
169169

170170
it('is present and non-empty, so the generated reference row is not blank', () => {
@@ -216,7 +216,7 @@ describe('ExecutionContextSchema.preserveAudit — the published description (#6
216216
// that lost it once seeded with automation live while the main path had it
217217
// suppressed, a self-trigger loop that wedged first boot (#3760). So "one flag
218218
// looks redundant, drop it" is exactly the edit that must go red.
219-
describe('[#17178] SEED_WRITE_EXECUTION_CONTEXT', () => {
219+
describe('SEED_WRITE_EXECUTION_CONTEXT — one spelling of the seed posture', () => {
220220
it('is a valid ExecutionContext — the WHOLE value parses, not merely its key names', () => {
221221
const parsed = ExecutionContextSchema.safeParse(SEED_WRITE_EXECUTION_CONTEXT);
222222
expect(parsed.success, JSON.stringify('error' in parsed ? parsed.error : {})).toBe(true);
@@ -230,11 +230,11 @@ describe('[#17178] SEED_WRITE_EXECUTION_CONTEXT', () => {
230230
]);
231231
});
232232

233-
it('sets `skipTriggers` — `isSystem` alone does NOT suppress trigger dispatch (#3760)', () => {
233+
it('sets `skipTriggers` — `isSystem` alone does NOT suppress trigger dispatch', () => {
234234
expect(SEED_WRITE_EXECUTION_CONTEXT.skipTriggers).toBe(true);
235235
});
236236

237-
it('sets `seedReplay` — the state_machine exemption a mid-lifecycle seed row needs (#3433)', () => {
237+
it('sets `seedReplay` — the state_machine exemption a mid-lifecycle seed row needs', () => {
238238
expect(SEED_WRITE_EXECUTION_CONTEXT.seedReplay).toBe(true);
239239
});
240240

‎packages/spec/src/kernel/functional-completeness.test.ts‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ const only = (findings: ReturnType<typeof checkFieldCompleteness>) => {
3939
};
4040

4141
describe('checkFieldCompleteness — the verified inert shapes go red', () => {
42-
it('flags a bare summary as an ERROR (the cloud#687 founding case)', () => {
42+
it('flags a bare summary as an ERROR (the founding case: a roll-up that reads 0 forever)', () => {
4343
const f = only(checkFieldCompleteness({ type: 'summary' }));
4444
expect(f.rule).toBe(FIELD_SUMMARY_WITHOUT_OPERATIONS);
4545
expect(f.severity).toBe('error');
@@ -158,7 +158,7 @@ describe('checkViewCompleteness — layout bindings', () => {
158158
expect(checkViewCompleteness({ type: 'tree', tree: { parentField: 'parent' } })).toEqual([]);
159159
});
160160

161-
it('the calendar body describes the REFUSAL, not a deleted literal fallback (#17445)', () => {
161+
it('the calendar body describes the REFUSAL, not a deleted literal fallback', () => {
162162
// Re-measured on objectui `main` at `0cf2d6644` (2026-09-21), both halves
163163
// of the path: `ListView.tsx`'s `case 'calendar'` restates only declared
164164
// bindings — objectui#7029 deleted the `startDateField || 'start_date'` /
@@ -199,7 +199,7 @@ describe('checkViewCompleteness — layout bindings', () => {
199199
keys: ['timeline.startDateField', 'timeline.titleField'] },
200200
{ type: 'map', component: 'ObjectMap.tsx', screen: 'Map configuration required',
201201
keys: ['map.locationField', 'map.latitudeField', 'map.longitudeField'] },
202-
])('the $type body describes the REFUSAL, not a deleted literal fallback (#19630)', ({ type, component, screen, keys }) => {
202+
])('the $type body describes the REFUSAL, not a deleted literal fallback', ({ type, component, screen, keys }) => {
203203
const f = only(checkViewCompleteness({ type }) as never);
204204
expect(f.rule).toBe(VIEW_LAYOUT_WITHOUT_BINDING);
205205
expect(f.message).not.toContain('falls back to literal default field names');
@@ -429,7 +429,7 @@ describe('checkViewCompleteness — rowColor without a colour map (the parse-cle
429429
// Pinning the literal string would rot. What is pinned instead is the
430430
// PROPERTY that made it wrong: the value the prescription suggests is fed
431431
// back through this module, and must survive it.
432-
it('hands the author a prescription this module itself accepts (#18791)', () => {
432+
it('hands the author a prescription this module itself accepts', () => {
433433
const f = only(checkViewCompleteness({ type: 'grid', rowColor: { field: 'status' } }) as never);
434434
const suggested = /'<field_value>':\s*'([^']+)'/.exec(f.fix)?.[1];
435435
expect(suggested, `no suggested colour value in the prescription: ${f.fix}`).toBeDefined();
@@ -440,7 +440,7 @@ describe('checkViewCompleteness — rowColor without a colour map (the parse-cle
440440
).toEqual([]);
441441
});
442442

443-
it('⛔ names no hex placeholder anywhere in the prescription (#18791)', () => {
443+
it('⛔ names no hex placeholder anywhere in the prescription', () => {
444444
// The direct, dumb half of the pin above: whatever the wording becomes, it
445445
// must not put a hex back in front of an author. `token` is refused for the
446446
// same reason — it named nothing an author could look up, and stood beside
@@ -519,7 +519,7 @@ describe('checkViewCompleteness — rowColor without a colour map (the parse-cle
519519
* app-local resolvability arm went red naming all four, and the presence arm
520520
* stayed green.
521521
*/
522-
describe('checkViewCompleteness — rowColor values the renderer resolves to nothing (#18791)', () => {
522+
describe('checkViewCompleteness — rowColor values the renderer resolves to nothing', () => {
523523
const grid = (colors: Record<string, unknown>) =>
524524
checkViewCompleteness({ type: 'grid', rowColor: { field: 'priority', colors } });
525525

‎packages/spec/src/kernel/manifest-unknown-keys.test.ts‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ const unrecognized = (result: ReturnType<typeof ManifestSchema.safeParse>) => {
5959
| undefined;
6060
};
6161

62-
describe("#14192 — unknown keys inside `manifest:` are refused at parse (the card's measurement, inverted)", () => {
62+
describe("unknown keys inside `manifest:` are refused at parse (the silent-drop measurement, inverted)", () => {
6363
it('a transposed `namesapce` is a named refusal carrying the rename — not an undefined namespace', () => {
6464
// The card's own measurement: parse success, key dropped, namespace undefined.
6565
const { namespace: _omitted, ...withoutNamespace } = legal();
@@ -108,7 +108,7 @@ describe("#14192 — unknown keys inside `manifest:` are refused at parse (the c
108108
});
109109
});
110110

111-
describe('#14192 — the refusal reaches every door the measurement listed', () => {
111+
describe('the refusal reaches every door the measurement listed', () => {
112112
const typo = () => {
113113
const { namespace: _omitted, ...rest } = legal();
114114
return { ...rest, namesapce: 'probe' };
@@ -218,7 +218,7 @@ describe('#14192 — the refusal reaches every door the measurement listed', ()
218218
});
219219
});
220220

221-
describe('#14192 — the nested blocks inside `manifest:` are closed under the same measurement', () => {
221+
describe('the nested blocks inside `manifest:` are closed under the same measurement', () => {
222222
it('`contributes.kind` (for `kinds`) is refused at the block, with the rename', () => {
223223
const result = ManifestSchema.safeParse({ ...legal(), contributes: { kind: [{ id: 'sys.bi.report' }] } });
224224
expect(result.success).toBe(false);
@@ -278,7 +278,7 @@ describe('#14192 — the nested blocks inside `manifest:` are closed under the s
278278
});
279279
});
280280

281-
describe('#14192 — the accept side does not move, and `main` is declared', () => {
281+
describe('the accept side does not move, and `main` is declared', () => {
282282
it('every live key parses and survives — the whole declared vocabulary in one manifest', () => {
283283
const full = {
284284
...legal(),
@@ -357,7 +357,7 @@ describe('#14192 — the accept side does not move, and `main` is declared', ()
357357
});
358358
});
359359

360-
describe('#16328 — the `permissions` union door names the surface and the rename, like every other door', () => {
360+
describe('the `permissions` union door names the surface and the rename, like every other door', () => {
361361
// ## What #16328 reported, and what was actually wrong
362362
//
363363
// The card measured `{ services: ['object'], hoooks: ['x'] }` refused with a

‎packages/spec/src/kernel/manifest.test.ts‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ describe('ManifestSchema', () => {
381381
});
382382
});
383383

384-
describe('contributes dead-member retirement (#10724, ADR-0049 — tombstoned, not deleted)', () => {
384+
describe('contributes dead-member retirement (ADR-0049 — tombstoned, not deleted)', () => {
385385
// Nine members had zero readers monorepo-wide (the controlled census commit be21955ba records,
386386
// completed on cloud 2026-08-24). When they were retired `ManifestSchema` and
387387
// the `contributes` object were NOT `.strict()`, so a plain deletion would
@@ -417,7 +417,7 @@ describe('contributes dead-member retirement (#10724, ADR-0049 — tombstoned, n
417417
);
418418
});
419419

420-
it('still parses the surviving `kinds` member — `routes` retired separately (#10726)', () => {
420+
it('still parses the surviving `kinds` member — `routes` retired separately', () => {
421421
const parsed = ManifestSchema.parse({
422422
...base,
423423
contributes: {
@@ -434,7 +434,7 @@ describe('contributes dead-member retirement (#10724, ADR-0049 — tombstoned, n
434434
});
435435
});
436436

437-
describe('contributes.routes retirement (#10726, ADR-0049 — maintainer-ruled Option B 2026-08-22)', () => {
437+
describe('contributes.routes retirement (ADR-0049 — removed for the `http.server` mount, maintainer-ruled 2026-08-22)', () => {
438438
// The one `contributes` member split onto its own card: zero readers like
439439
// its nine siblings retired by commit be21955ba (that commit's controlled census, cloud leg closed
440440
// clean on 2026-08-24), but four published surfaces taught it as THE way to
@@ -472,7 +472,7 @@ describe('contributes.routes retirement (#10726, ADR-0049 — maintainer-ruled O
472472
});
473473
});
474474

475-
describe('contributes.kinds[].globs retirement (#11169, ADR-0049 — maintainer-ruled 2026-08-24)', () => {
475+
describe('contributes.kinds[].globs retirement (ADR-0049 — maintainer-ruled 2026-08-24)', () => {
476476
// The sub-field promised glob-driven file-type discovery that actually runs
477477
// off the metadata type registry's `filePatterns` — which `contributes.kinds`
478478
// does not extend — so an authored `globs` was stored, served back, and never
@@ -511,7 +511,7 @@ describe('contributes.kinds[].globs retirement (#11169, ADR-0049 — maintainer-
511511
});
512512
});
513513

514-
describe('dead-container retirement (#11332, ADR-0049 — tombstoned, not deleted)', () => {
514+
describe('dead-container retirement (ADR-0049 — tombstoned, not deleted)', () => {
515515
// Three top-level manifest containers had ZERO reads of the container itself
516516
// monorepo-wide (objectstack + objectui + cloud, controlled census), which
517517
// settles every key beneath them at once — a key cannot be read if the
@@ -667,7 +667,7 @@ describe('manifest.id — reverse-domain identifier', () => {
667667
expect(ManifestSchema.safeParse({ ...legal('com.example.app'), namespace: 'my_app' }).success).toBe(true);
668668
});
669669

670-
describe('the refusal carries a remedy (#4001)', () => {
670+
describe('the refusal carries a remedy', () => {
671671
const refusalFor = (id: string) => {
672672
const r = ManifestSchema.safeParse(legal(id));
673673
expect(r.success).toBe(false);

‎packages/spec/src/kernel/metadata-authoring-lint.test.ts‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ const lintAuthoring = (raw: unknown) => lintUnknownAuthoringKeys(raw, ObjectStac
4949
*/
5050
const VIEW_ENTRY = { name: 'v1', object: 'task', list: { columns: ['title'] }, bogusViewKey: 1 };
5151

52-
describe('coverage derivation (#3786 — no third hand-written list)', () => {
52+
describe('coverage derivation (no third hand-written list)', () => {
5353
it('spans the non-strict population, not a sample', () => {
5454
// #4148 covered object+field: 2 surfaces. The point of this walker is the
5555
// rest. If the derivation regresses to a handful, the "evidence base" for
@@ -92,7 +92,7 @@ describe('coverage derivation (#3786 — no third hand-written list)', () => {
9292
}
9393
});
9494

95-
it('reads posture from the schema the PARSE applies, not the type registry (#10039)', () => {
95+
it('reads posture from the schema the PARSE applies, not the type registry', () => {
9696
// `view` was counted as lint-covered because the posture came from
9797
// `getMetadataTypeSchema('view')` — `ViewMetadataSchema`, the strip-mode
9898
// UNION over persisted view BODIES. What `defineStack` actually applies to
@@ -181,7 +181,7 @@ describe('coverage derivation (#3786 — no third hand-written list)', () => {
181181
});
182182
});
183183

184-
describe('the #4148 behaviours survive the generalization', () => {
184+
describe('the object/field unknown-key warnings survive the generalization', () => {
185185
const stackWith = (obj: Record<string, unknown>, field: Record<string, unknown>) => ({
186186
objects: [
187187
{ name: 'crm_case', label: 'Case', fields: { owner: { label: 'Owner', type: 'text', ...field } }, ...obj },
@@ -301,7 +301,7 @@ describe('the #4148 behaviours survive the generalization', () => {
301301
});
302302
});
303303

304-
describe('nested descent (#4001 evidence phase)', () => {
304+
describe('nested descent (the evidence base for the strict tiers)', () => {
305305
// Before this the walk stopped at each item's top level plus a hard-coded
306306
// hop into `object.fields`, leaving 227 strip-mode objects below those roots
307307
// reporting nothing. These pin the four structural moves the descent makes
@@ -436,7 +436,7 @@ describe('nested descent (#4001 evidence phase)', () => {
436436
});
437437
});
438438

439-
describe('top-level stack keys (#4167 → #8687)', () => {
439+
describe('top-level stack keys (named, then refused at parse)', () => {
440440
const lint = (raw: unknown) => lintUnknownStackKeys(raw, ObjectStackDefinitionSchema);
441441

442442
// GRADUATION (#8687): `ObjectStackDefinitionSchema` is now `.strict()`, so
@@ -518,7 +518,7 @@ describe('STACK_KEY_GUIDANCE does not rot', () => {
518518
}
519519
});
520520

521-
it('every runtime member is a key the schema now declares (#8687)', () => {
521+
it('every runtime member is a key the schema now declares', () => {
522522
// Until #8687 this pin ran the other way: `onEnable` had to be excluded
523523
// AND undeclared, because the exclusion list was what kept the lint from
524524
// calling an honoured-but-undeclared member "dropped at load". The strict
@@ -545,7 +545,7 @@ describe('STACK_KEY_GUIDANCE does not rot', () => {
545545
});
546546
});
547547

548-
describe('one voice, and a single report per record (#10039)', () => {
548+
describe('one voice, and a single report per record', () => {
549549
// The card's measured repro, kept in the shape it was filed in. An otherwise
550550
// VALID view container (it has `list`, so nothing else is wrong with it) plus
551551
// one undeclared key used to produce BOTH:

0 commit comments

Comments
 (0)