diff --git a/packages/spec/src/ui/view-item-config-type.test.ts b/packages/spec/src/ui/view-item-config-type.test.ts index 78af633427b..15001ef2477 100644 --- a/packages/spec/src/ui/view-item-config-type.test.ts +++ b/packages/spec/src/ui/view-item-config-type.test.ts @@ -79,7 +79,7 @@ void [ parsedArtifactScalarConfig, ]; -describe('[#19920] a ViewItem config is typed by its arm, not unknown', () => { +describe('a ViewItem config is typed by its arm, not unknown', () => { it('each body typed through the published names parses at its door', () => { expect(ViewItemSchema.safeParse(listItem).success).toBe(true); expect(ViewItemSchema.safeParse(formItem).success).toBe(true); diff --git a/packages/spec/src/ui/view-metadata-schema.test.ts b/packages/spec/src/ui/view-metadata-schema.test.ts index ad08688465f..f7572c78e25 100644 --- a/packages/spec/src/ui/view-metadata-schema.test.ts +++ b/packages/spec/src/ui/view-metadata-schema.test.ts @@ -18,7 +18,7 @@ import { ListViewSchema, ViewItemSchema, ViewMetadataSchema } from './view.zod'; const PLACEHOLDER_DATA = { provider: 'object', object: 'crm_lead' } as const; -describe('ViewMetadataSchema — genuine validation across the three runtime shapes (#3095)', () => { +describe('ViewMetadataSchema — genuine validation across the three runtime shapes', () => { // ── shape 2: standalone ViewItem record ─────────────────────────────────── describe('ViewItem record form', () => { it('accepts a well-formed list ViewItem', () => { @@ -92,7 +92,7 @@ describe('ViewMetadataSchema — genuine validation across the three runtime sha expect(ViewMetadataSchema.safeParse({ listViews: {} }).success).toBe(false); }); - it('REJECTS a bare `{}` — the pin this line used to make, reversed by #5599', () => { + it('REJECTS a bare `{}` — the pin this line used to make, reversed by the identity precondition', () => { // This assertion previously read `.toBe(true)`, justified as "legacy- // compatible … a truly empty body carries no viewKind/object, so every // consumer that filters on identity drops it". #5599 measured what that @@ -122,7 +122,7 @@ describe('ViewMetadataSchema — genuine validation across the three runtime sha expect(r.success).toBe(true); }); - it('REJECTS a raw list config with NO object binding — the #7741 dead row, with located guidance', () => { + it('REJECTS a raw list config with NO object binding — a row no read path could serve, with located guidance', () => { // ⚠️ Deliberate inversion (#7741, ruled 2026-08-12, direction B). This // test used to PIN acceptance of exactly this body ("adhoc PUT, no // registry entry to inherit from") — and QA run #7695 measured what that @@ -212,7 +212,7 @@ describe('ViewMetadataSchema — genuine validation across the three runtime sha }); // ── #5599: the identity precondition, ahead of all four arms ────────────── - describe('identity precondition (#5599)', () => { + describe('identity precondition — a body must read as a view before any member judges it', () => { // The reproduction from the issue, verbatim. On `origin/main` every input // in this block was ACCEPTED and reduced to `{ type: 'simple' }` — member 4 // (`FormViewSchema.extend(…).strip()`) both strips unknown keys and requires @@ -384,7 +384,7 @@ describe('ViewMetadataSchema — genuine validation across the three runtime sha expect(ViewMetadataSchema.safeParse({ groupByField: 'stage' }).success).toBe(false); }); - it('does NOT close the arms — `.strip()` round-tripping is untouched (#5074)', () => { + it('does NOT close the arms — `.strip()` round-tripping is untouched', () => { // The ruling on #5599 kept every arm's `.strip()`: a body that speaks the // vocabulary still carries undeclared aux keys through without a 422. // This is the deliberate residue of the minimal fix, pinned so a later @@ -403,14 +403,14 @@ describe('ViewMetadataSchema — genuine validation across the three runtime sha // authorable (objectui's `gridNonAuthorKeys` disposition). The two halves // below are the card's executable acceptance criterion; a change that flips // either one is reversing a ruling, not tidying a schema. - describe('columnState — runtime-only overlay key (#9933)', () => { + describe('columnState — runtime-only overlay key', () => { // The REAL payload, measured: objectui's `persistViewPatch` sends // `{ columnState: { order?, widths? }, _isOverride: true }` and // `normalizeViewMetadata` inherits `name`/`object`/`viewKind` from the // shadowed entry (#2555). Before commit d5552ca13 this body carried no declared key, // so the identity precondition 422'd it — the ruled patch-only write for // a column drag could not persist. - it('HALF 1 — the overlay face accepts a `columnState`-only patch (the objectui#5233 payload)', () => { + it('HALF 1 — the overlay face accepts a `columnState`-only patch (the patch-only write the console persists)', () => { const r = ViewMetadataSchema.safeParse({ name: 'showcase_task.default', object: 'showcase_task', @@ -421,7 +421,7 @@ describe('ViewMetadataSchema — genuine validation across the three runtime sha expect(r.success).toBe(true); }); - it('HALF 1 — a baseline-less columnState patch is refused at the MEMBERS (binding pair, #7741), not the precondition', () => { + it('HALF 1 — a baseline-less columnState patch is refused at the MEMBERS (the object + viewKind binding pair), not the precondition', () => { // `columnState` is vocabulary now, so the precondition stays inert; what // refuses the unbound body is the members' object+viewKind requirement. const r = ViewMetadataSchema.safeParse({ columnState: { order: ['name'] } }); diff --git a/packages/spec/src/ui/view-metadata-type.test.ts b/packages/spec/src/ui/view-metadata-type.test.ts index 8236389fac1..8907cdebecd 100644 --- a/packages/spec/src/ui/view-metadata-type.test.ts +++ b/packages/spec/src/ui/view-metadata-type.test.ts @@ -78,7 +78,7 @@ const parsedUndeclaredKey: ViewMetadataParsed = { type: 'grid', columns: ['name' const parsedScalar: ViewMetadataParsed = 42; void [parsedFromUnknown, parsedUndeclaredKey, parsedScalar]; -describe('[#19871] ViewMetadata is a view body, not unknown', () => { +describe('ViewMetadata is a view body, not unknown', () => { it('has a typed body for every member of the union', () => { expect(Object.keys(BODY_OF_EACH_MEMBER).sort()).toEqual([...VIEW_METADATA_BRANCHES].sort()); }); @@ -92,7 +92,7 @@ describe('[#19871] ViewMetadata is a view body, not unknown', () => { } }); -describe('[#19920] ViewMetadataParsed is a parsed view body, not unknown', () => { +describe('ViewMetadataParsed is a parsed view body, not unknown', () => { for (const branch of VIEW_METADATA_BRANCHES) { it(`the ${branch} member's parse output and diagnoseViewMetadata's data are both ViewMetadataParsed`, () => { const memberOutput: ViewMetadataParsed = VIEW_METADATA_MEMBERS[branch].parse(BODY_OF_EACH_MEMBER[branch]); diff --git a/packages/spec/src/ui/view-overlay-options-bag.test.ts b/packages/spec/src/ui/view-overlay-options-bag.test.ts index 0cbf7ea505a..821af214e55 100644 --- a/packages/spec/src/ui/view-overlay-options-bag.test.ts +++ b/packages/spec/src/ui/view-overlay-options-bag.test.ts @@ -77,7 +77,7 @@ function under(issues: Issue[], prefix: PropertyKey[]): Array `${a.path}|${a.code}`.localeCompare(`${b.path}|${b.code}`)); } -describe('[#20051] the bag declares exactly the list kinds, derived from the shape', () => { +describe('the bag declares exactly the list kinds, derived from the shape', () => { it('declares one block per list-view kind that has a block — `grid` has none', () => { // A pin on the DERIVATION (`listViewKindBlocks`): the list is not // hand-maintained in the schema, so it is stated once here, where a new @@ -88,7 +88,7 @@ describe('[#20051] the bag declares exactly the list kinds, derived from the sha }); }); -describe('[#20051] a direct and an `options`-wrapped out-of-contract key get the same refusal', () => { +describe('a direct and an `options`-wrapped out-of-contract key get the same refusal', () => { it('the card\'s headline: `options.timeline.metaFields` is refused by name, as `timeline.metaFields` is', () => { const timeline = { startDateField: 'created_at', titleField: 'name', metaFields: ['region'] }; const direct = listOverlayIssues(overlay({ type: 'timeline', timeline })); @@ -136,7 +136,7 @@ describe('[#20051] a direct and an `options`-wrapped out-of-contract key get the }); }); -describe('[#20051] the bag itself is closed', () => { +describe('the bag itself is closed', () => { it('`options.foo` is refused by name at `options`, not dropped', () => { const issues = listOverlayIssues(overlay({ options: { foo: 1 } })); const hit = issues.find((i) => i.code === 'unrecognized_keys'); @@ -157,7 +157,7 @@ describe('[#20051] the bag itself is closed', () => { }); }); -describe('[#20051] a legal `options.KIND` still parses and round-trips', () => { +describe('a legal `options.KIND` still parses and round-trips', () => { it('CONTROL: the legacy `options.map` bag objectui pins is accepted and kept in the parse output', () => { // objectui `packages/app-shell/src/views/InterfaceListPage.mapConfig.test.tsx` // — "CONTROL: the legacy `options.map` bag is still forwarded on its own @@ -205,7 +205,7 @@ describe('[#20051] a legal `options.KIND` still parses and round-trips', () => { }); }); -describe('[#20051] the form overlay cannot take the bag the list overlay refused', () => { +describe('the form overlay cannot take the bag the list overlay refused', () => { it('a column-less, type-less body with a bad `options` bag is refused, not accepted as a form', () => { // Without the form overlay's `options` pin this body is ACCEPTED: the list // member refuses it (no `columns`, and the bag), the form member — which @@ -252,7 +252,7 @@ describe('[#20051] the form overlay cannot take the bag the list overlay refused * `.strip()` used to drop it unread; with the save storing the parsed body it * would have vanished on a `200` instead. */ -describe('[#20051] a ViewItem record carries no top-level `options` bag', () => { +describe('a ViewItem record carries no top-level `options` bag', () => { const record = (extra: Record = {}) => ({ name: 'crm_lead.board', object: 'crm_lead', diff --git a/packages/spec/src/ui/view-overlay-options-type.test.ts b/packages/spec/src/ui/view-overlay-options-type.test.ts index 8e3be05aabf..b47373a2799 100644 --- a/packages/spec/src/ui/view-overlay-options-type.test.ts +++ b/packages/spec/src/ui/view-overlay-options-type.test.ts @@ -82,7 +82,7 @@ const numericBagArtifact: AssembledViewArtifact = { object: 'crm_lead', viewKind const numericBagParsedArtifact: AssembledViewArtifactParsed = { object: 'crm_lead', viewKind: 'list', options: { kanban: 42 } }; void [typedBag, numericBagMetadata, numericBagParsedMetadata, numericBagArtifact, numericBagParsedArtifact]; -describe('[#19920] the list overlay options bag carries each kind block', () => { +describe('the list overlay options bag carries each kind block', () => { it('the runtime key set is the kind set the type names', () => { const bag = VIEW_METADATA_MEMBERS.listOverlay.shape.options.unwrap(); expect(Object.keys(bag.shape).sort()).toEqual([...KIND_BLOCKS]); diff --git a/packages/spec/src/ui/view-overlay-owner-hidden-retirement.test.ts b/packages/spec/src/ui/view-overlay-owner-hidden-retirement.test.ts index abfedb476a0..8c5547132fc 100644 --- a/packages/spec/src/ui/view-overlay-owner-hidden-retirement.test.ts +++ b/packages/spec/src/ui/view-overlay-owner-hidden-retirement.test.ts @@ -332,7 +332,7 @@ describe('overlay owner/hidden retirement — ADR-0087 registration', () => { expect(MIGRATIONS_BY_MAJOR[18]!.conversionIds).toContain('view-overlay-owner-hidden-removed'); }); - it('the family carries ONE D3 semantic entry, and it names the family\'s D2 conversion (ruling B on #17152)', () => { + it('the family carries ONE D3 semantic entry, and it names the family\'s D2 conversion (ruled: a D3 entry per family, even beside a lossless D2)', () => { const semantic = MIGRATIONS_BY_MAJOR[18]!.semantic; const family = semantic.filter((s) => s.id === 'view-overlay-owner-hidden-retired'); expect(family).toHaveLength(1); diff --git a/packages/spec/src/ui/view-overlay-viewkind-arm.test.ts b/packages/spec/src/ui/view-overlay-viewkind-arm.test.ts index 94f178c9eac..d9849f99d86 100644 --- a/packages/spec/src/ui/view-overlay-viewkind-arm.test.ts +++ b/packages/spec/src/ui/view-overlay-viewkind-arm.test.ts @@ -80,7 +80,7 @@ function acceptance(body: unknown) { return { data: parsed.data as Record, branch: diagnosis.branch }; } -describe('#20186 a column-less list PATCH is judged by the list member', () => { +describe('a column-less list PATCH is judged by the list member', () => { it('the headline `{ name, object, viewKind: list, sort }` is ACCEPTED on listOverlay and parses to a LIST', () => { const { data, branch } = acceptance({ ...LIST, sort: [{ field: 'name', order: 'asc' }] }); expect(branch).toBe('listOverlay'); @@ -99,14 +99,14 @@ describe('#20186 a column-less list PATCH is judged by the list member', () => { ['inlineEdit', { inlineEdit: true }], ['columnState', { columnState: { widths: { name: 120 } } }], ['rowHeight', { rowHeight: 'compact' }], - ])('the console %s toggle (patch only, ruled on #7494) is ACCEPTED on listOverlay', (_label, patch) => { + ])('the console %s toggle (a patch-only write, as ruled) is ACCEPTED on listOverlay', (_label, patch) => { const { branch, data } = acceptance({ ...patch, viewKind: 'list', ...ID, _isOverride: true }); expect(branch).toBe('listOverlay'); expect(data.type).toBe('grid'); }); }); -describe('#20186 …and its list keys are JUDGED, not stripped', () => { +describe('…and its list keys are JUDGED, not stripped', () => { it('a retired bare-string `sort` is REFUSED at `sort`, with the 17.5.0 retirement prescription', () => { const r = refusal({ ...LIST, sort: 'name desc' }); expect(r.topCodes).toEqual(['invalid_union']); @@ -141,7 +141,7 @@ describe('#20186 …and its list keys are JUDGED, not stripped', () => { }); }); -describe('#20186 a column-less list overlay that NAMES a `type` stays refused — at `columns`', () => { +describe('a column-less list overlay that NAMES a `type` stays refused — at `columns`', () => { // `overlay.list.identity` in `view-union-diagnostics.test.ts`: refused before, // refused now, and still wrapped as `invalid_union` (the refusal is an // ABORTING issue, so the list member is not the union's lone survivor). @@ -161,7 +161,7 @@ describe('#20186 a column-less list overlay that NAMES a `type` stays refused }); }); -describe('#20186 the mirror: a `viewKind: form` body is judged by the form member', () => { +describe('the mirror: a `viewKind: form` body is judged by the form member', () => { it('list `columns` on a form overlay is REFUSED under formOverlay, at `columns`, with the count prescription', () => { const r = refusal({ ...FORM, columns: ['name'] }); expect(r.topCodes).toEqual(['invalid_union']); @@ -179,7 +179,7 @@ describe('#20186 the mirror: a `viewKind: form` body is judged by the form membe }); }); -describe('#20186 W2 — a list-legal value under a key both arms declare differently is ACCEPTED', () => { +describe('W2 — a list-legal value under a key both arms declare differently is ACCEPTED', () => { // Refused before: the form member judged these keys by FORM rules (a retired // `aria` tombstone, a string-only `description`, a public-link `sharing`). // Declared as a widening: `Clause-②: yes (narrowing)`. @@ -193,7 +193,7 @@ describe('#20186 W2 — a list-legal value under a key both arms declare differe }); }); -describe('#20186 controls — byte-identical parse output (measured on origin/main ce70876e)', () => { +describe('controls — byte-identical parse output (measured on origin/main ce70876e)', () => { it('a real form overlay', () => { const { data, branch } = acceptance({ name: 'acct.f', object: 'account', viewKind: 'form', type: 'simple', sections: [{ label: 'Main', fields: ['name'] }], @@ -216,7 +216,7 @@ describe('#20186 controls — byte-identical parse output (measured on origin/ma }); }); -describe('#20186 each member judges ONE viewKind — read off the members themselves', () => { +describe('each member judges ONE viewKind — read off the members themselves', () => { it('a direct parse of the form member names where a list body is judged', () => { const r = VIEW_METADATA_MEMBERS.formOverlay.safeParse({ ...LIST, sort: [{ field: 'name', order: 'asc' }] }); expect(r.success).toBe(false); @@ -232,7 +232,7 @@ describe('#20186 each member judges ONE viewKind — read off the members themse expect(issue?.message).toMatch(/^This is the flattened LIST overlay member, which judges `viewKind: "list"` only\./); }); - it('an ABSENT viewKind keeps the binding prescription (#7741), on both members', () => { + it('an ABSENT viewKind keeps the binding prescription, on both members', () => { for (const member of [VIEW_METADATA_MEMBERS.listOverlay, VIEW_METADATA_MEMBERS.formOverlay]) { const r = member.safeParse({ object: 'crm_lead', hidden: true }); const issue = r.error!.issues.find((i) => i.path[0] === 'viewKind'); @@ -241,7 +241,7 @@ describe('#20186 each member judges ONE viewKind — read off the members themse }); }); -describe('#20186 the premise: no pipe, and the served JSON Schema moves only by the contract', () => { +describe('the premise: no pipe, and the served JSON Schema moves only by the contract', () => { it('both overlay members are still plain object schemas', () => { // A pipe serves its INPUT side to `/api/v1/meta/types/view`, and for a // transform that is `{}` (the `assertViewIdentity` docblock). The input-side diff --git a/packages/spec/src/ui/view-overlay-viewkind-type.test.ts b/packages/spec/src/ui/view-overlay-viewkind-type.test.ts index bf04a8f90e3..08d6107f2e8 100644 --- a/packages/spec/src/ui/view-overlay-viewkind-type.test.ts +++ b/packages/spec/src/ui/view-overlay-viewkind-type.test.ts @@ -109,7 +109,7 @@ type IsOptionalKey = {} extends Pick ? true : false; const typeIsOptionalOnListOverlayOutput: IsOptionalKey = true; void [typeIsOptionalOnListOverlayOutput]; -describe('[#19920] the flattened overlay members keep their own viewKind literal', () => { +describe('the flattened overlay members keep their own viewKind literal', () => { it('the list-shaped `viewKind: "form"` body is refused by every door that judges it', () => { const body = { type: 'grid', columns: ['name'], object: 'crm_lead', viewKind: 'form' }; expect(VIEW_METADATA_MEMBERS.listOverlay.safeParse(body).success).toBe(false); diff --git a/packages/spec/src/ui/view-strictness-batch18.test.ts b/packages/spec/src/ui/view-strictness-batch18.test.ts index 8090b4ab282..0f7b6a79380 100644 --- a/packages/spec/src/ui/view-strictness-batch18.test.ts +++ b/packages/spec/src/ui/view-strictness-batch18.test.ts @@ -88,7 +88,7 @@ const formWithField = (field: unknown) => ({ type: 'simple', sections: [{ fields // =========================================================================== // 1. The doors — a parse must exist, or none of the rest means anything // =========================================================================== -describe('#4001 批 18 — the doors these shapes are reachable through', () => { +describe('批 18, unknown keys refused — the doors these shapes are reachable through', () => { it('the `view` metadata type resolves to a registered schema (the save-time 422 door)', () => { expect(getMetadataTypeSchema('view')).toBeDefined(); }); @@ -114,7 +114,7 @@ describe('#4001 批 18 — the doors these shapes are reachable through', () => // =========================================================================== // 2. Every closed site, at its own path // =========================================================================== -describe('#4001 批 18 — closed sites reject unknown keys where they live', () => { +describe('批 18 — closed sites reject unknown keys where they live', () => { describe('ViewDataSchema — all four provider arms', () => { it.each([ ['object', { provider: 'object', object: 'crm_lead' }], @@ -146,7 +146,7 @@ describe('#4001 批 18 — closed sites reject unknown keys where they live', () .toContain('notAnOptionKey'); }); - it('GanttConfigSchema.tooltipFields — a CLOSED entry, and since #15469 a CLOSED parent too', () => { + it('GanttConfigSchema.tooltipFields — a CLOSED entry, and since the renderer-ahead `.passthrough()` was removed a CLOSED parent too', () => { const gantt = { startDateField: 's', endDateField: 'e', titleField: 't' }; // 批 18 closed this ENTRY while the parent stayed `.passthrough()` (its // stated non-goal: renderer-ahead knobs reached plugin-gantt through the @@ -196,7 +196,7 @@ describe('#4001 批 18 — closed sites reject unknown keys where they live', () // =========================================================================== // 3. Curation — the entries that make a rejection fixable // =========================================================================== -describe('#4001 批 18 — the rejection carries a usable prescription', () => { +describe('批 18 — the rejection carries a usable prescription', () => { it('`object` → `childObject` on a subform — the word every neighbouring block uses', () => { expect(reject(FormViewSchema, { ...FORM_BASE, subforms: [{ childObject: 'x', object: 'crm_line' }] })) .toContain('`object` → `childObject`'); @@ -239,7 +239,7 @@ describe('#4001 批 18 — the rejection carries a usable prescription', () => { expect(reject(ListViewSchema, { ...LIST_BASE, emptyState: { action: {} } })).toContain('addRecord'); }); - describe('UserFiltersSchema — closed at #5073, after `allowAddTab` was promoted', () => { + describe('UserFiltersSchema — closed, after `allowAddTab` was promoted', () => { // 批 18 left this shape open because closing it would have 422'd // `allowAddTab`: objectui's renderer reads the key // (`plugin-list/src/UserFilters.tsx:182` / `:742`), and `saveMetaItem` @@ -306,7 +306,7 @@ describe('#4001 批 18 — the rejection carries a usable prescription', () => { .not.toContain('→ `showAllRecords`'); }); - it('the object variant still DERIVES its shape from the base (#2231), not a transcription', () => { + it('the object variant still DERIVES its shape from the base, not a transcription', () => { // The reason it is `.omit()` + spread rather than a hand-listed shape: a // key added to the base must appear here, or the two drift into the fork // derive-by-reference exists to prevent. @@ -326,7 +326,7 @@ describe('#4001 批 18 — the rejection carries a usable prescription', () => { // =========================================================================== // 4. Union error behaviour — pinned honestly, including what does NOT arrive // =========================================================================== -describe('#4001 批 18 — union error behaviour (#5014), pinned as it really is', () => { +describe('批 18 — union error behaviour (where a branch prescription gets buried), pinned as it really is', () => { it('submitBehavior discriminates on `kind`, so ONE member reports and the prescription survives', () => { // This is why the block is `z.discriminatedUnion` and not `z.union`. With a // plain union of four strict members the error is `invalid_union` carrying @@ -360,8 +360,8 @@ describe('#4001 批 18 — union error behaviour (#5014), pinned as it really is // =========================================================================== // 5. The shapes left OPEN — with the evidence, so nobody "finishes" them // =========================================================================== -describe('#4001 批 18 — the shapes left open, and what became of them', () => { - it('[RESOLVED at #5074] ViewItemSchema SPLIT — the authoring gate closed, the wire member kept the round-trip', () => { +describe('批 18 — the shapes left open, and what became of them', () => { + it('[RESOLVED by the ruled split] ViewItemSchema SPLIT — the authoring gate closed, the wire member kept the round-trip', () => { // 批 18 left this open and filed the design question as #5074; the // maintainer ruled "split" and it has landed, so this case is replaced // rather than deleted — the trace it recorded is still the reason the wire @@ -400,7 +400,7 @@ describe('#4001 批 18 — the shapes left open, and what became of them', () => ).toBe(false); }); - it('[RESOLVED at #5074] ListViewSchema.sort CLOSED — the console `id` is stripped on the wire instead', () => { + it('[RESOLVED with the ruled split] ListViewSchema.sort CLOSED — the console `id` is stripped on the wire instead', () => { // 批 18 closed this (with `direction → order`, the #4721 alias for the // identical tuple), hit a live 422 and reverted (#5070). The revert was // provisional pending #5074, so the case is replaced with what actually diff --git a/packages/spec/src/ui/view-submit-redirect-url.test.ts b/packages/spec/src/ui/view-submit-redirect-url.test.ts index f856aa7a307..8f1d3ec1e9c 100644 --- a/packages/spec/src/ui/view-submit-redirect-url.test.ts +++ b/packages/spec/src/ui/view-submit-redirect-url.test.ts @@ -62,7 +62,7 @@ const redirectTo = (url: unknown) => ({ ...FORM_BASE, submitBehavior: { kind: 'r // =========================================================================== // 1. The door — the refine has to be reachable, or none of the rest counts // =========================================================================== -describe('#7496 — the door', () => { +describe('the ruled redirect `url` shape — the door', () => { it('the redirect arm still parses at all (the control)', () => { const parsed = accept(redirectTo('/thanks')) as { submitBehavior?: { url?: string } }; expect(parsed.submitBehavior?.url).toBe('/thanks'); @@ -92,7 +92,7 @@ describe('#7496 — the door', () => { // =========================================================================== // 2. Ruled bullet 1 — relative paths only (the open-redirect face) // =========================================================================== -describe('#7496 bullet 1 — relative paths only', () => { +describe('ruled bullet 1 — relative paths only', () => { it.each([ ['https', 'https://example.com/thanks'], ['http', 'http://example.com/thanks'], @@ -184,7 +184,7 @@ describe('#7496 bullet 1 — relative paths only', () => { // =========================================================================== // 3. Ruled bullet 2 — interpolation only from declared record fields // =========================================================================== -describe('#7496 bullet 2 — `{{record.}}` and nothing else', () => { +describe('ruled bullet 2 — `{{record.}}` and nothing else', () => { it.each([ ['in a path segment', '/records/{{record.id}}'], ['in a query value', '/thanks?ref={{record.public_ref}}'], @@ -234,7 +234,7 @@ describe('#7496 bullet 2 — `{{record.}}` and nothing else', () => { // =========================================================================== // 4. Ruled bullet 3 — verbatim redirect on the resolved relative path // =========================================================================== -describe('#7496 bullet 3 — the value reaches the consumer unchanged', () => { +describe('ruled bullet 3 — the value reaches the consumer unchanged', () => { it.each([ ['a plain path', '/thanks'], ['a nested path', '/console/records/crm_lead'], @@ -268,7 +268,7 @@ describe('#7496 bullet 3 — the value reaches the consumer unchanged', () => { // =========================================================================== // 5. Cross-face — the sibling arms and the alias curation still behave // =========================================================================== -describe('#7496 — the neighbours the refine must not disturb', () => { +describe('the ruled redirect `url` shape — the neighbours the refine must not disturb', () => { it.each([ ['thank-you', { kind: 'thank-you', title: 'Thanks' }], ['continue', { kind: 'continue' }], diff --git a/packages/spec/src/ui/view-union-branch-focus.test.ts b/packages/spec/src/ui/view-union-branch-focus.test.ts index 2e4d108cb45..95373042a46 100644 --- a/packages/spec/src/ui/view-union-branch-focus.test.ts +++ b/packages/spec/src/ui/view-union-branch-focus.test.ts @@ -136,7 +136,7 @@ const MISDIRECTED: Array<[string, unknown, string]> = [ 'sort', ], [ - '[#21180] the retired `publicPicker` key itself — its prescription, not the container text', + 'the retired `publicPicker` key itself — its prescription, not the container text', formItem({ field: 'owner', publicPicker: { displayFields: ['name'] } }), 'publicPicker', ], @@ -158,7 +158,7 @@ const MISDIRECTED: Array<[string, unknown, string]> = [ ], ]; -describe('[#7510] a ViewItem-branch failure surfaces the ViewItem branch', () => { +describe('a ViewItem-branch failure surfaces the ViewItem branch', () => { for (const [label, body, key] of MISDIRECTED) { it(`names \`${key}\` — ${label}`, () => { const text = rendered(body); @@ -170,7 +170,7 @@ describe('[#7510] a ViewItem-branch failure surfaces the ViewItem branch', () => // before this change: the container branch wins, which is exactly the // wrong prescription the card measured. If this ever stops holding the // fix is no longer load-bearing and the tests above prove nothing. - it(`…and the pre-#7510 ranking picked \`container\` for it — ${label}`, () => { + it(`…and the pre-fix ranking picked \`container\` for it — ${label}`, () => { expect(oldSelection(body)).toBe('container'); }); } @@ -189,7 +189,7 @@ describe('[#7510] a ViewItem-branch failure surfaces the ViewItem branch', () => }); }); -describe('[#7510] the container diagnostic still belongs to containers', () => { +describe('the container diagnostic still belongs to containers', () => { // (c) of the card's constraints: the :2328 guidance text is GOOD. A body that // really is a container with a wrong-layer key must keep reading it. const BAD_CONTAINER = { @@ -200,7 +200,7 @@ describe('[#7510] the container diagnostic still belongs to containers', () => { columns: [{ field: 'title' }], }; - it('a container with wrong-layer keys keeps the #4001 wrap prescription', () => { + it('a container with wrong-layer keys keeps the `defineView` wrap prescription', () => { expect(selectViewMetadataBranch(BAD_CONTAINER)).toBe('container'); const text = rendered(BAD_CONTAINER); expect(text).toContain(CONTAINER_MISDIRECT); @@ -218,7 +218,7 @@ describe('[#7510] the container diagnostic still belongs to containers', () => { }); }); -describe('[#7510] the union\'s error payload is focused, never reshaped', () => { +describe('the union\'s error payload is focused, never reshaped', () => { const CLAIMED = formItem({ field: 'owner', keyField: { field: 'name', sort: [] } }); it('keeps four branches, in position — a positional consumer still finds its member', () => { @@ -258,7 +258,7 @@ describe('[#7510] the union\'s error payload is focused, never reshaped', () => }); }); -describe('[#7510] ⛔ the acceptance face did not move', () => { +describe('⛔ the branch focusing did not move the acceptance face', () => { // Verdict-identical to `origin/main` @ `9051802`, measured body by body // through the same door. The refusals' top-level issue CODES are pinned with // them: focusing happens inside `errors`, so the envelope other consumers key diff --git a/packages/spec/src/ui/view-union-diagnostics.test.ts b/packages/spec/src/ui/view-union-diagnostics.test.ts index 125e9641b6a..cbd7c5f004e 100644 --- a/packages/spec/src/ui/view-union-diagnostics.test.ts +++ b/packages/spec/src/ui/view-union-diagnostics.test.ts @@ -59,7 +59,7 @@ function unionOptions(): readonly unknown[] { return (out._zod?.def?.options ?? []) as readonly unknown[]; } -describe('[#6391] the union members are contractual, not positional', () => { +describe('the union members are contractual, not positional', () => { it('exposes exactly four branches, in the union\'s own order', () => { expect([...VIEW_METADATA_BRANCHES]).toEqual([ 'viewItem', @@ -99,7 +99,7 @@ describe('[#6391] the union members are contractual, not positional', () => { }); }); -describe('[#6391] selectViewMetadataBranch reads the members\' own discriminants', () => { +describe('selectViewMetadataBranch reads the members\' own discriminants', () => { const CASES: Array<[string, unknown, ViewMetadataBranch | null]> = [ ['a nested config is a ViewItem record', { viewKind: 'list', config: LIST_CFG }, 'viewItem'], ['…even when the config is the broken part', { viewKind: 'list', config: { type: 'grid', columns: 1 } }, 'viewItem'], @@ -127,7 +127,7 @@ describe('[#6391] selectViewMetadataBranch reads the members\' own discriminants }); }); -describe('[#6391] diagnoseViewMetadata names the failing branch', () => { +describe('diagnoseViewMetadata names the failing branch', () => { // The worked example from the issue: a flattened list overlay whose `columns` // is a string. Before this change the ONLY structural route to that leaf was // `error.issues[0].errors[2]` — member position 2 — while the rendered @@ -243,7 +243,7 @@ describe('[#6391] diagnoseViewMetadata names the failing branch', () => { // `normalizeViewMetadata` inherits identity, #2555) stays in ACCEPTED with its // parse output re-measured, and the unbound original moves to REFUSED so the // flip itself is pinned rather than silently absorbed. -describe('[#7025] the acceptance face of ViewMetadataSchema — as re-ruled by #7741', () => { +describe('the acceptance face of ViewMetadataSchema — frozen by the diagnostics work; every move since is deliberate and pinned', () => { const SECTION = { label: 'Main', collapsible: false, collapsed: false, columns: 1, fields: ['name'] }; /** [#7741] The binding pair the write path inherits onto a shadowing overlay. */ const BOUND_LIST = { object: 'crm_lead', viewKind: 'list' } as const; diff --git a/packages/spec/src/ui/view-union-retirement-prescription.test.ts b/packages/spec/src/ui/view-union-retirement-prescription.test.ts index 00d2f9568b3..2b9730cc03b 100644 --- a/packages/spec/src/ui/view-union-retirement-prescription.test.ts +++ b/packages/spec/src/ui/view-union-retirement-prescription.test.ts @@ -223,7 +223,7 @@ describe('§2 population — every non-catchall `never` leaf on this surface is } }); - it('[#20051] every pinned-absent key is reached, and carries its own curated refusal', () => { + it('every pinned-absent key is reached, and carries its own curated refusal', () => { expect(pinned.map((l) => l.path).sort()).toEqual(Object.keys(REFUSED_ABSENT_LEAVES).sort()); for (const leaf of pinned) { expect(leaf.message, leaf.path).toMatch(REFUSED_ABSENT_LEAVES[leaf.path]!); diff --git a/packages/spec/src/ui/view.test.ts b/packages/spec/src/ui/view.test.ts index 28b77df9b37..79049436bda 100644 --- a/packages/spec/src/ui/view.test.ts +++ b/packages/spec/src/ui/view.test.ts @@ -312,7 +312,7 @@ describe('GanttConfigSchema', () => { expect(GanttConfigSchema.parse(config)).toMatchObject({ parentField: 'parent_id', typeField: 'row_type' }); }); - it('declares the members plugin-gantt used to read through `.passthrough()` — and refuses an undeclared one (#15469)', () => { + it('declares the members plugin-gantt used to read through `.passthrough()` — and refuses an undeclared one', () => { const config = { startDateField: 'start_date', endDateField: 'end_date', @@ -339,7 +339,7 @@ describe('GanttConfigSchema', () => { // plugin-gantt GanttView.tsx: `GanttViewMode` / the `VIEW_MODES` runtime // guard), not invented; if a granularity joins or leaves the renderer, this // pin and the schema move together. - describe('viewMode (#9463)', () => { + describe('viewMode — the granularities the gantt renderer honours, measured', () => { const base = { startDateField: 'start_date', endDateField: 'end_date', @@ -438,7 +438,7 @@ describe('ListViewSchema', () => { * The `unrecognized_keys` control on the same call is what makes the * negative a verdict rather than a schema reporting nothing. */ - describe('[#17053] the legacy string `sort` clause is retired', () => { + describe('the legacy string `sort` clause is retired — one spelling, the array', () => { const withSort = (sort: unknown) => ({ columns: ['name'], sort }); it('REFUSES the bare string clause at `sort`, prescribing the array form', () => { @@ -870,7 +870,7 @@ describe('FormViewSchema', () => { // upgraded from a renderer fact to a parse refusal), a wizard must declare // its steps, and the `steps:` spelling gets a guidance-refusal — never an // alias. Breadth is ruled NARROW: exactly this step-key family. - describe('wizard tightening (#13704)', () => { + describe('wizard tightening — sections are the steps, the inert step keys are refused, no key is added', () => { const STEP = { label: 'Step', fields: ['name'] }; const issueAt = (r: ReturnType, path: string) => r.success ? undefined : r.error.issues.find((i) => i.path.join('.') === path); @@ -946,7 +946,7 @@ describe('FormViewSchema', () => { }).success).toBe(true); }); - it('the refusal is wizard-scoped: the SAME step keys stay accepted on tabbed/simple (#6237\'s split)', () => { + it('the refusal is wizard-scoped: the SAME step keys stay accepted on tabbed/simple (the ruled split confines it to wizard steps)', () => { for (const type of ['simple', 'tabbed'] as const) { const r = FormViewSchema.safeParse({ type, @@ -1006,7 +1006,7 @@ describe('FormViewSchema', () => { expect(issueAt(r, 'sections')?.message).toMatch(/empty/); }); - it('a populated legacy `groups` bucket IS steps (the #6926 fold feeds the wizard)', () => { + it('a populated legacy `groups` bucket IS steps (the producer-side `groups` fold feeds the wizard)', () => { expect(FormViewSchema.safeParse({ type: 'wizard', groups: [STEP] }).success).toBe(true); }); @@ -1022,7 +1022,7 @@ describe('FormViewSchema', () => { expect(issueAt(r, 'sections')?.message).toMatch(/empty/); }); - it('the flattened runtime overlay stays EXEMPT — a partial patch is its contract (#7025 membership)', () => { + it('the flattened runtime overlay stays EXEMPT — a partial patch is its contract, and the union corpus pins it accepted', () => { // `{ type: 'wizard' }` beside the required binding, `sections` supplied // by the shadowed base view — the `overlay.form.identity` shape the // #7025 corpus pins as ACCEPTED. Moving that membership needs its own @@ -1058,7 +1058,7 @@ describe('FormViewSchema', () => { * (acceptance, and the `pane` error path) cannot, which is the measured reason * an unfolded alias survived this file for its whole life. */ -describe('FormViewSchema — the `groups` legacy alias folds onto `sections` (#6926)', () => { +describe('FormViewSchema — the `groups` legacy alias folds onto `sections`', () => { const S = (label: string) => ({ label, fields: [label.toLowerCase()] }); const has = (o: unknown, k: string) => Object.prototype.hasOwnProperty.call(o as object, k); @@ -1725,7 +1725,7 @@ describe('FormFieldSchema', () => { * `min`/`max` stay bare numbers — any numeric bound is a legal value, * exactly as on the object-field surface. */ - describe('malformed constraint values are refused at authoring (#12174)', () => { + describe('malformed constraint values are refused at authoring', () => { const lengthCases: Array<[value: number, code: string]> = [ [0, 'too_small'], // vacuous "no minimum" / accepts-nothing maximum [-5, 'too_small'], @@ -1821,7 +1821,7 @@ describe('FormFieldSchema', () => { * bottom of it — and they are re-asserted here against the same probe so the * before/after reading is one test's worth of evidence. */ - describe('an unrenderable scale is refused at authoring (#19088)', () => { + describe('an unrenderable scale is refused at authoring', () => { const parseScale = (scale: number) => FormFieldSchema.safeParse({ field: 'amount', scale }); /** Did `fn` throw a RangeError? (Probing the platform, not the schema.) */ @@ -1890,7 +1890,7 @@ describe('FormFieldSchema', () => { } }); - it('leaves the malformed-declaration refusals (#8321/#12174) reading exactly as before', () => { + it('leaves the malformed-declaration refusals (a negative or fractional scale) reading exactly as before', () => { // The dark control, in one place: the codes and the wording below are the // readings taken on this same probe BEFORE the upper bound was added. const negative = parseScale(-1); @@ -2237,7 +2237,7 @@ describe('GroupingConfigSchema', () => { expect(() => GroupingConfigSchema.parse(grouping)).toThrow(); }); - it('fields .describe() states shape semantics without a fixed level cap (#7084)', () => { + it('fields .describe() states shape semantics without a fixed level cap', () => { const shape = (GroupingConfigSchema as unknown as { shape: Record }).shape; const doc = shape.fields!.description ?? ''; @@ -2423,7 +2423,7 @@ describe('GalleryConfigSchema', () => { }); }); -describe('ListMapConfigSchema (#9340 — the eighth visualization block)', () => { +describe('ListMapConfigSchema — the eighth visualization block', () => { it('accepts the full documented renderer surface — every key plugin-map reads, no extras', () => { // Mirrors objectui's own `ObjectMapConfigSchema` (`@object-ui/types`, // imported by `ObjectMap.tsx`): the spec block and the renderer's read set @@ -2466,7 +2466,7 @@ describe('ListMapConfigSchema (#9340 — the eighth visualization block)', () => expect(ListMapConfigSchema.safeParse({ mapStyle: 'https://tiles.example/style.json' }).success).toBe(false); }); - it('accepts the showcase task shape — the exact declaration #9340 exists to make legal', () => { + it('accepts the showcase task shape — the exact declaration this block exists to make legal', () => { // showcase_task has `title`, not `name`; before this block existed the // renderer default left every marker title undefined and there was no // spec-legal way to say otherwise. @@ -2511,7 +2511,7 @@ describe('ListMapConfigSchema (#9340 — the eighth visualization block)', () => expect(ListMapConfigSchema.safeParse({ center: [37.7749, -122.4194] }).success).toBe(true); }); - it('is declarable on a map list view — the gap #9340 closes', () => { + it('is declarable on a map list view — the gap this block closes', () => { const view = { label: 'Work Locations (Map)', type: 'map' as const, @@ -2598,7 +2598,7 @@ describe('TimelineConfigSchema', () => { // // `KanbanConfigSchema.groupByField` is the site that makes this its own card: // it is REQUIRED, so the padded value cannot be withdrawn by omitting the key. -describe('groupByField — a padded field name is refused (#17499)', () => { +describe('groupByField — a padded field name is refused', () => { /** * Per schema: the minimal valid block MINUS `groupByField`, and the sibling * `z.string()` keys on that same schema the DARK control probes. @@ -2793,7 +2793,7 @@ describe('RowColorConfigSchema', () => { // that would have caught it checks presence only, so the hex map turned it // GREEN. This pins the two properties that made the old sentence a trap, // rather than the wording that replaced it. - it('⛔ the `colors` describe never offers a hex — it names what actually resolves (#18791)', () => { + it('⛔ the `colors` describe never offers a hex — it names what actually resolves', () => { const description = (RowColorConfigSchema as unknown as { shape: { colors: { description?: string } }; }).shape.colors.description ?? ''; @@ -2873,7 +2873,7 @@ describe('ListColumnSchema pinned and summary', () => { }); }); -describe('ListColumnSchema summary object form and prefix (objectui#2231)', () => { +describe('ListColumnSchema summary object form and prefix — spec-owned, no longer an objectui-local extension', () => { it('should accept the { type, field } summary form aggregating another field', () => { const column: ListColumn = { field: 'amount', @@ -3141,7 +3141,7 @@ describe('Airtable-style ListView enhancements', () => { // Protocol Improvement Tests: FormView defaultSort // ============================================================================ -describe('FormViewSchema — retired defaultSort (#3896 close-out)', () => { +describe('FormViewSchema — retired defaultSort (audit close-out: nothing read it)', () => { it('REJECTS the retired `defaultSort` and points at the related list view', () => { let message = ''; try { @@ -3209,7 +3209,7 @@ describe('FormViewSchema - buttons & defaults', () => { expect(result.defaults).toBeUndefined(); }); - it('marks both keys live now the ObjectForm renderer folds them (framework#1894 / #2998)', () => { + it('marks both keys live now the ObjectForm renderer folds them', () => { const shape = (FormViewSchema as unknown as z.ZodObject).shape; for (const key of ['buttons', 'defaults'] as const) { // The renderer wiring landed (objectui ObjectForm foldFormButtons), so the @@ -3383,7 +3383,7 @@ describe('UserActionsConfigSchema', () => { // as `ua?.hideFields === true` / `ua?.rowColor === true` (absent ⇒ hidden). // Normalising the three to one default would silently flip a toolbar // affordance on every view that never wrote the key. - it('pins the group-ON / hideFields-OFF / rowColor-OFF defaults asymmetry (objectui#5435)', () => { + it('pins the group-ON / hideFields-OFF / rowColor-OFF defaults asymmetry, copied from what the renderer reads', () => { const config = UserActionsConfigSchema.parse({}); expect(config.group).toBe(true); expect(config.hideFields).toBe(false); @@ -3393,7 +3393,7 @@ describe('UserActionsConfigSchema', () => { // objectui's normalize-list-view fold maps legacy `showGroup` / // `showHideFields` / `showColor` onto exactly these keys, so this document is // the fold's own OUTPUT — before adoption the save gate rejected it by name. - it('accepts the legacy-fold output through ListViewSchema (acceptance criterion, objectstack#11195)', () => { + it('accepts the legacy-fold output through ListViewSchema (the acceptance criterion for adopting the three keys)', () => { const result = ListViewSchema.safeParse({ name: 'my_view', label: 'My View', @@ -3549,7 +3549,7 @@ describe('UserFiltersSchema (ADR-0047)', () => { expect(() => UserFiltersSchema.parse({ element: 'sidebar' })).toThrow(); }); - it('should accept allowAddTab on the tabs element (#5073 — promoted from objectui)', () => { + it('should accept allowAddTab on the tabs element (promoted from objectui)', () => { const uf = UserFiltersSchema.parse({ element: 'tabs', allowAddTab: true, @@ -3558,7 +3558,7 @@ describe('UserFiltersSchema (ADR-0047)', () => { expect(uf.allowAddTab).toBe(true); }); - it('should reject an unknown key (#5073 — this shape is closed)', () => { + it('should reject an unknown key (this shape is closed)', () => { expect(() => UserFiltersSchema.parse({ element: 'dropdown', allowAddTabb: true })).toThrow(); }); @@ -3823,7 +3823,7 @@ describe('ListViewSchema filter field', () => { // ============================================================================ // Issue #7: ListView responsive and performance config // ============================================================================ -describe('ListViewSchema — retired responsive/performance (#3896 close-out)', () => { +describe('ListViewSchema — retired responsive/performance (audit close-out: no renderer read them)', () => { it('REJECTS the retired `responsive` with the prescription', () => { expect(() => ListViewSchema.parse({ type: 'grid', columns: ['name'], responsive: { hiddenOn: ['xs'] }, @@ -3844,7 +3844,7 @@ describe('ListViewSchema — retired responsive/performance (#3896 close-out)', // Every measured reader copied the key forward; ObjectGrid, where the chains // end, never spells any of the three. // ============================================================================ -describe('ListViewSchema — retired striped/bordered/virtualScroll (#7176 pass-through-only)', () => { +describe('ListViewSchema — retired striped/bordered/virtualScroll (every reader only passed them through)', () => { it('REJECTS the retired `striped` with the prescription', () => { expect(() => ListViewSchema.parse({ type: 'grid', columns: ['name'], striped: true, @@ -3860,7 +3860,7 @@ describe('ListViewSchema — retired striped/bordered/virtualScroll (#7176 pass- type: 'grid', columns: ['name'], virtualScroll: true, })).toThrow(/`view\.virtualScroll`.*removed.*large datasets page via `pagination`/s); }); - it('the prescriptions carry the pinned migrate sentence (#7176 rides the protocol-17 conversion)', () => { + it('the prescriptions carry the pinned migrate sentence (the retirement rides the protocol-17 conversion)', () => { for (const key of ['striped', 'bordered', 'virtualScroll'] as const) { let message = ''; try { @@ -3908,7 +3908,7 @@ describe('ListViewSchema — retired striped/bordered/virtualScroll (#7176 pass- // legacy bare array stays accepted and lifts to `{ formats }` at parse. // `'pdf'` left the enum in the same change (#1301 NOT_PLANNED). // ============================================================================ -describe('ListViewSchema.exportOptions — object form + array lift + pdf retirement (#8010)', () => { +describe('ListViewSchema.exportOptions — object form + array lift + pdf retirement', () => { it('accepts the object form with all five renderer-read keys, byte-preserved (no unrecognized_keys)', () => { const exportOptions = { formats: ['csv', 'xlsx', 'json'] as const, @@ -4004,7 +4004,7 @@ describe('HttpMethodSubsetSchema/HttpRequestSchema backward compat', () => { // entries. `HttpRequestSchema` was never duplicated — `./ui` imports and // re-exports `./shared`'s const — so the only thing that ever split was the type // alias, which is exactly the part runtime cannot see. Hence two layers. -describe('[#4688] HttpRequest is single-source across ./shared and ./ui', () => { +describe('HttpRequest is single-source across ./shared and ./ui', () => { it('both entry points expose the very same schema declaration at runtime', async () => { const sharedEntry = await import('../shared/index'); const uiEntry = await import('../ui/index'); @@ -4084,7 +4084,7 @@ describe('[#4688] HttpRequest is single-source across ./shared and ./ui', () => // `**/*.test.ts`; vitest never enables `typecheck`). The compiler-API test is // therefore the load-bearing one; the runtime tests below it guard the value // ranges the whole argument rests on. -describe('[#4691] `HttpMethod` is not exported from ./ui', () => { +describe('`HttpMethod` is not exported from ./ui', () => { it('resolves the export surface: ./ui has no `HttpMethod`, ./shared and ./api share one', () => { // A sanity anchor: if this entry resolved to nothing, the absence // assertions below would prove nothing at all. @@ -4096,7 +4096,7 @@ describe('[#4691] `HttpMethod` is not exported from ./ui', () => { // 2. …but it still offers the 5-value type under its own name, so the // migration stays inside this entry point. - expect(uiNames, '`HttpMethodType` was renamed at #5832').not.toContain('HttpMethodType'); + expect(uiNames, '`HttpMethodType` was renamed to `HttpMethodSubset`').not.toContain('HttpMethodType'); expect(maybeOriginOf('./ui', 'HttpMethodSubset'), './ui must export `HttpMethodSubset`').toBeDefined(); expect(originFileOf('./ui', 'HttpMethodSubset')).toBe('src/shared/http.zod.ts'); @@ -4233,7 +4233,7 @@ describe('ADR-0089 D3a — strict view form schemas (loud mis-layered keys)', () * future edit that folds the sentence back into the middle passes all of them * and fails here. */ -describe('visibility unknown-key message order — fix before history (#6416 / #6619)', () => { +describe('visibility unknown-key message order — fix before history', () => { const HISTORY = 'Before ADR-0089 D3a these were dropped silently, shipping inert metadata; ' + 'a mis-layered or stale key is now a loud parse error.'; @@ -4362,7 +4362,7 @@ const viewDoorsCarryingObjectLevelChecks = [ * on different mechanisms (an `error` map keyed on `issue.input` vs a * `retiredKey()` tombstone), so each is pinned on its own. */ -describe("ListViewSchema — the RETIRED `page` view type (#17063)", () => { +describe("ListViewSchema — the RETIRED `page` view type", () => { /** * Walk `invalid_union` wrappers and return every issue, nested arms included * — the same helper the calendar block below needs, for the same reason. @@ -4521,7 +4521,7 @@ const flattenUnionIssues = (issues: z.ZodIssue[]): z.ZodIssue[] => * larger bug, and `navigation` is one `strictObject`, so the blast radius of a * mistake here is the whole block. */ -describe('ListViewSchema — the RETIRED `navigation.view` binding (#16885)', () => { +describe('ListViewSchema — the RETIRED `navigation.view` binding', () => { describe.each(viewDoorsCarryingObjectLevelChecks)('%s', (_label, parse) => { it('REFUSES `navigation.view` with the tombstone prescription, not a bare unknown-key report', () => { const r = parse({ type: 'grid', columns: ['name'], navigation: { view: 'summary_view' } }); @@ -4596,7 +4596,7 @@ describe('ListViewSchema — the RETIRED `navigation.view` binding (#16885)', () }); }); -describe("ListViewSchema — calendar in `appearance.allowedVisualizations` requires the `calendar:` block (#13817)", () => { +describe("ListViewSchema — calendar in `appearance.allowedVisualizations` requires the `calendar:` block", () => { // The same three doors, and since #17063 this is the ONLY object-level check // they carry — it is attached at three separate points for the zod-4 reason, // and a missing re-attachment is invisible (the door keeps accepting, which @@ -4705,9 +4705,9 @@ describe("ListViewSchema — calendar in `appearance.allowedVisualizations` requ // it is a published-surface narrowing and belongs to a ruling, not to a pin. // ============================================================================ -describe("ListViewSchema — the `type: 'calendar'` axis is NOT gated by the #13817 check (#16577)", () => { +describe("ListViewSchema — the `type: 'calendar'` axis is NOT gated by the `allowedVisualizations` check (ruled: a completeness warning)", () => { describe.each(viewDoorsCarryingObjectLevelChecks)('%s', (_label, parse) => { - it("ACCEPTS `type: 'calendar'` with no `calendar:` block — the axis #13817 does not gate", () => { + it("ACCEPTS `type: 'calendar'` with no `calendar:` block — the axis the `allowedVisualizations` check does not gate", () => { const r = parse({ type: 'calendar', columns: ['name'] }); expect(r.success, r.success === false ? JSON.stringify((r as unknown as { error: z.ZodError }).error.issues) : '').toBe(true); }); @@ -4753,7 +4753,7 @@ describe("ListViewSchema — the `type: 'calendar'` axis is NOT gated by the #13 // pinning, because one of the two is a silent downgrade. // ============================================================================ -describe('ListViewSchema — `viewType` is not a spelling of `type` (#16577)', () => { +describe('ListViewSchema — `viewType` is not a spelling of `type`', () => { it('is an UNKNOWN key at the two authoring doors — refused, not aliased', () => { for (const [label, parse] of [ ['ListViewSchema', (b: Record) => ListViewSchema.safeParse(b)], @@ -4790,7 +4790,7 @@ describe('ListViewSchema — `viewType` is not a spelling of `type` (#16577)', ( // with no declared precedence between them. // ============================================================================ -describe('view row bound — no per-kind `limit` on the view configs (#19228)', () => { +describe('view row bound — `pagination.pageSize` is the one bound; no per-kind `limit` on the view configs', () => { it('refuses `limit` BY NAME on each per-kind view config', () => { const PER_KIND = [ ['gallery', GalleryConfigSchema as unknown as z.ZodTypeAny], diff --git a/packages/spec/src/ui/widget-i18n-retirement.test.ts b/packages/spec/src/ui/widget-i18n-retirement.test.ts index 10aa834ab38..2d52a040d2e 100644 --- a/packages/spec/src/ui/widget-i18n-retirement.test.ts +++ b/packages/spec/src/ui/widget-i18n-retirement.test.ts @@ -67,7 +67,7 @@ import { // conditional-type pin in this package was a no-op until #5286 (tsconfig // excluded `**/*.test.ts`; vitest never enables `typecheck`), so the // compiler-API walk with anti-vacuity guards is the load-bearing instrument. -describe('[#5055] ui/ widget + i18n family retirement', () => { +describe('ui/ widget + i18n family retirement — doorless vocabularies removed, not tightened', () => { /** The 20 names the ten retired defs exported (10 schema consts + 10 types). */ const RETIRED_NAMES = [ // widget.zod.ts — the widget-registration vocabulary @@ -132,7 +132,7 @@ describe('[#5055] ui/ widget + i18n family retirement', () => { // ── ABSENCE (every entry, not just ./ui) ────────────────────────────── for (const name of [...RETIRED_NAMES, ...RETIRED_PARSED_ALIASES]) { const holders = holdersOf(name); - expect(holders, `${name} must have zero holders after #5055`).toEqual([]); + expect(holders, `${name} must have zero holders after the widget + i18n retirement`).toEqual([]); } // ── SURVIVAL (on ./ui, where they live) ─────────────────────────────── @@ -193,7 +193,7 @@ describe('[#5055] ui/ widget + i18n family retirement', () => { } }); - it('the surviving `error` slot is exactly the one objectui pinned to (objectui#3289)', async () => { + it('the surviving `error` slot is exactly the one objectui renamed its own slot onto, with no alias', async () => { // The keep is only defensible while the consumer's assertion holds. objectui // asserts `HasKey` and // `Equal` diff --git a/packages/spec/src/ui/widget.test.ts b/packages/spec/src/ui/widget.test.ts index fd4e82a66ef..54fe948c53e 100644 --- a/packages/spec/src/ui/widget.test.ts +++ b/packages/spec/src/ui/widget.test.ts @@ -364,7 +364,7 @@ describe('FieldWidgetPropsSchema', () => { // but `unreachable` is NOT the retirement trigger for this one. Re-measure the // objectui consumer before touching it. // ============================================================================ -describe('#5055 — the one surviving shape, and the eight that left', () => { +describe('the widget retirement — the one surviving shape, and the eight that left', () => { it('FieldWidgetPropsSchema is still unreachable — and that is not a reason to retire it', () => { const { verdict, nodeCount, rootCount } = measureDoors();