diff --git a/packages/spec/src/root-entry-migrations-split.pin.test.ts b/packages/spec/src/root-entry-migrations-split.pin.test.ts index 88ccd6c23cb..5884be9b2f4 100644 --- a/packages/spec/src/root-entry-migrations-split.pin.test.ts +++ b/packages/spec/src/root-entry-migrations-split.pin.test.ts @@ -140,7 +140,7 @@ function valueGraph(entry: string): Set { return new Set([...seen].map((f) => relative(SRC, f).split('\\').join('/'))); } -describe('the migration chain is `@objectstack/spec/migrations`, not the root (#20646)', () => { +describe('the migration chain is `@objectstack/spec/migrations`, not the root', () => { it('the root module exports none of the moved values', () => { expect(MOVED_VALUES.filter((name) => name in root)).toEqual([]); }); diff --git a/packages/spec/src/stack-artifact-crossref.test.ts b/packages/spec/src/stack-artifact-crossref.test.ts index a54db00c939..f7d4ad9fa22 100644 --- a/packages/spec/src/stack-artifact-crossref.test.ts +++ b/packages/spec/src/stack-artifact-crossref.test.ts @@ -142,7 +142,7 @@ const SEED_ON_CASE = "Seed data references object 'crm_case' which is not define const GRANT_ON_NOWHERE = `Permission 'sales_rep' grants on object '${NOWHERE}' which is not defined in objects.`; const SEED_ON_NOWHERE = `Seed data references object '${NOWHERE}' which is not defined in objects.`; -describe('#18202 — the per-stack pass, without the opt-in', () => { +describe('the per-stack pass, without the opt-in', () => { it('REFUSES an app-owned grant and seed on a module-owned object — the reported defect', () => { const refused = refusalOf(() => defineStack(appConfig('crm_case', 'crm_case'))); expect(refused?.code).toBe('STACK_CROSS_REFERENCE_INVALID'); @@ -159,7 +159,7 @@ describe('#18202 — the per-stack pass, without the opt-in', () => { }); }); -describe('#18202 — `artifactObjects` widens exactly the two ARTIFACT-SCOPED classes', () => { +describe('`artifactObjects` widens exactly the two ARTIFACT-SCOPED classes', () => { it('ACCEPTS the app package once the artifact’s other objects are declared', () => { const service = serviceStack(); const accepted = refusalOf(() => @@ -227,7 +227,7 @@ describe('#18202 — `artifactObjects` widens exactly the two ARTIFACT-SCOPED cl }); }); -describe('#18202 — the ARTIFACT pass: the refusal MOVED, it did not disappear', () => { +describe('the ARTIFACT pass: the refusal MOVED, it did not disappear', () => { /** The opt-in is a promise about a composition; this is the composition calling it in. */ const composeClaiming = (name: string) => { const service = serviceStack(); @@ -267,7 +267,7 @@ describe('#18202 — the ARTIFACT pass: the refusal MOVED, it did not disappear' }); }); -describe('#18202 — #14122 §6 compatibility: a stack that does not opt in is untouched', () => { +describe('compatibility with the multi-package artifact: a stack that does not opt in is untouched', () => { it('a single-package stack still refuses its own dangling grant', () => { const refused = refusalOf(() => defineStack(anyStack({ @@ -303,7 +303,7 @@ describe('#18202 — #14122 §6 compatibility: a stack that does not opt in is u }); }); -describe('#18202 — the object-less leniency the ARTIFACT pass inherits verbatim', () => { +describe('the object-less leniency the ARTIFACT pass inherits verbatim', () => { /** * hotcrm#1449's shape: the app package declares NO objects, so * `validateCrossReferences` early-returns and the ARTIFACT pass skips it for @@ -340,7 +340,7 @@ describe('#18202 — the object-less leniency the ARTIFACT pass inherits verbati * it, `collectArtifactCrossReferenceErrors`'s docstring says it, and these * fixtures hold it. */ -describe('#18202 — an input that bypassed the strict parse IS checked at composition', () => { +describe('an input that bypassed the strict parse IS checked at composition', () => { /** The app package as an unparsed stack: `strict: false` skips every validation. */ const unparsedApp = (grantObject: string, seedObject: string) => defineStack(appConfig(grantObject, seedObject), { strict: false }); @@ -377,7 +377,7 @@ describe('#18202 — an input that bypassed the strict parse IS checked at compo expect(refused?.issues).toContain(SEED_ON_NOWHERE); }); - it('REFUSES a hand-built stack object before either rule runs — it was never built (#20367 ruling B)', () => { + it('REFUSES a hand-built stack object before either rule runs — it was never built by a stack producer', () => { // Since ruling B a hand-built object no longer reaches the artifact pass: // `composeStacks` refuses an input no stack producer built at its step 0, // naming the input, so the two rules above never get to run on it. The @@ -423,7 +423,7 @@ describe('#18202 — an input that bypassed the strict parse IS checked at compo * before this pass runs — skipping it composed an artifact without that * stack's grants or seed rows — so those two cases assert the refusal. */ -describe('#18202 — a malformed collection on an unparsed input is skipped or refused, never a bare TypeError', () => { +describe('a malformed collection on an unparsed input is skipped or refused, never a bare TypeError', () => { /** Collect `console.warn` for one call, restoring the real one afterwards. */ function warningsDuring(run: () => unknown): { warnings: string[]; thrown: Envelope | null } { const warnings: string[] = []; @@ -454,7 +454,7 @@ describe('#18202 — a malformed collection on an unparsed input is skipped or r const composeWith = (stack: ReturnType) => () => composeStacks([serviceStack(), stack], { manifest: 'preserve' }); - it('a non-array `permissions` is refused by the concat pass, never a bare TypeError (#19784)', () => { + it('a non-array `permissions` is refused by the concat pass, never a bare TypeError', () => { // Map format written onto a built stack (only `defineStack` normalizes it). It // is NOT iterable, which is what makes this the case that distinguishes a // guard from a bare `TypeError`: a string value would iterate its @@ -465,7 +465,7 @@ describe('#18202 — a malformed collection on an unparsed input is skipped or r expect(thrown?.status).toBe(422); }); - it('a non-array `data` is refused by the concat pass, never a bare TypeError (#19784)', () => { + it('a non-array `data` is refused by the concat pass, never a bare TypeError', () => { const { thrown } = warningsDuring(composeWith(malformed({ data: 42 }))); expect(thrown?.code).toBe('STACK_SCHEMA_INVALID'); expect(thrown?.status).toBe(422); @@ -511,7 +511,7 @@ describe('#18202 — a malformed collection on an unparsed input is skipped or r * This block is the fence on that qualifier: if the early return is ever * removed, the qualifier becomes wrong and these tests say so. */ -describe('#18202 — a composition of ONE package never reaches the artifact pass', () => { +describe('a composition of ONE package never reaches the artifact pass', () => { const claiming = () => defineStack(appConfig(NOWHERE, NOWHERE), { artifactObjects: [NOWHERE] }); it('accepts a one-input composition whose claim names an object nothing defines', () => { diff --git a/packages/spec/src/stack-artifact-packages.test.ts b/packages/spec/src/stack-artifact-packages.test.ts index d3f51e096f3..0b210997c01 100644 --- a/packages/spec/src/stack-artifact-packages.test.ts +++ b/packages/spec/src/stack-artifact-packages.test.ts @@ -250,7 +250,7 @@ describe('ADR-0130 D4 — each `packages` entry is an OBJECT wrapping its manife expect(issueAt(result, ['packages'])?.code).toBe('invalid_type'); }); - it('refuses `packages: null` — `.optional()` admits `undefined`, not `null` (#19926)', () => { + it('refuses `packages: null` — `.optional()` admits `undefined`, not `null`', () => { // `null` is a present, non-array `packages`: malformed, not absent. Every // reader of the key refuses it too (`INVALID_ARTIFACT_PACKAGES`); the rule // is stated once, beside `AssembledPackageBodySchema`. @@ -322,7 +322,7 @@ describe('ADR-0130 D4 — `packages` has a declared composition rule', () => { ]); }); - it('refuses `packages: null` on any input when composing two or more stacks (#19926)', () => { + it('refuses `packages: null` on any input when composing two or more stacks', () => { // The concat pass skips `undefined` alone: `null` is malformed, not // absent, and is refused with the strict parse's own envelope rather than // composed as if the stack declared no packages. `strict: false` is the @@ -352,7 +352,7 @@ describe('ADR-0130 D4 — `packages` has a declared composition rule', () => { expect(composed.packages.map((p) => p.manifest.id)).toEqual(['com.example.crm.cpq']); }); - it('does not warn about an undeclared composition rule (#5005 rule 3)', () => { + it('does not warn about an undeclared composition rule', () => { composeStacks([ raw({ manifest: crmManifest, packages: [{ manifest: crmManifest }] }), raw({ manifest: cpqManifest }), diff --git a/packages/spec/src/stack-cross-reference-envelope.test.ts b/packages/spec/src/stack-cross-reference-envelope.test.ts index 606746e18e5..c17c67c8c34 100644 --- a/packages/spec/src/stack-cross-reference-envelope.test.ts +++ b/packages/spec/src/stack-cross-reference-envelope.test.ts @@ -88,7 +88,7 @@ const stackWith = (extra: Record) => */ const rows: Array<{ label: string; config: Record; message: string }> = [ { - label: 'hooks[].object (#14122 §4 rule R4)', + label: 'hooks[].object (the hook-ownership rule)', config: { hooks: [{ name: 'probe_hook', object: MISSING, events: ['afterInsert'], handler: 'noop' }], }, @@ -135,7 +135,7 @@ const rows: Array<{ label: string; config: Record; message: str }, ]; -describe('#14552 — defineStack cross-reference refusals carry an ADR-0112 envelope', () => { +describe('defineStack cross-reference refusals carry an ADR-0112 envelope', () => { for (const row of rows) { describe(row.label, () => { it('refuses with code STACK_CROSS_REFERENCE_INVALID and status 422', () => { diff --git a/packages/spec/src/stack-dev-logins.test.ts b/packages/spec/src/stack-dev-logins.test.ts index 6d6c1733dc4..00d84a2cf40 100644 --- a/packages/spec/src/stack-dev-logins.test.ts +++ b/packages/spec/src/stack-dev-logins.test.ts @@ -68,7 +68,7 @@ const issuesOf = (verdict: ReturnType): string[] => // ─── GREEN — what is writable now, and was not before ─────────────── -describe('#17556 accept — an application may declare its own first-run credentials', () => { +describe('accept — an application may declare its own first-run credentials', () => { it('accepts a full `devLogins` entry and carries every field through the parse', () => { const verdict = parse({ ...base(), @@ -113,7 +113,7 @@ describe('#17556 accept — an application may declare its own first-run credent // ─── RED — the entry is strict from birth, and says so usefully ───── -describe('#17556 refuse — a `devLogins` entry is closed against unknown keys', () => { +describe('refuse — a `devLogins` entry is closed against unknown keys', () => { it('refuses an undeclared key inside an entry, at the entry`s path', () => { const verdict = parse({ ...base(), devLogins: [{ email: 'a@b.example', totallyBogus: 1 }] }); expect(verdict.success).toBe(false); @@ -150,7 +150,7 @@ describe('#17556 refuse — a `devLogins` entry is closed against unknown keys', // ─── DARK CONTROL — the door did not open, two keys were declared ─── -describe('#17556 control — the top-level door is still strict everywhere else', () => { +describe('control — the top-level door is still strict everywhere else', () => { it('a neighbouring undeclared key still refuses, so the accept above is about these two keys', () => { // If this went green the reading "devHint/devLogins are now writable" would // be indistinguishable from "the strict close regressed". @@ -171,7 +171,7 @@ describe('#17556 control — the top-level door is still strict everywhere else' // ─── COMPOSITION — both publishers' personas survive; hints refuse ── -describe('#17556 compose — personas concatenate, a contradicting hint is named', () => { +describe('compose — personas concatenate, a contradicting hint is named', () => { const hiring = () => defineStack({ manifest, devHint: 'seed first', diff --git a/packages/spec/src/stack-email-template-locale-floor.test.ts b/packages/spec/src/stack-email-template-locale-floor.test.ts index d9222c9e995..449e70b29c9 100644 --- a/packages/spec/src/stack-email-template-locale-floor.test.ts +++ b/packages/spec/src/stack-email-template-locale-floor.test.ts @@ -63,7 +63,7 @@ afterEach(() => { vi.restoreAllMocks(); }); -describe('#17614 — the floor tag is one named constant, not two spellings', () => { +describe('the floor tag is one named constant, not two spellings', () => { it('is the schema default for `locale`, so a row that omits the key HAS the floor', () => { expect(EMAIL_TEMPLATE_FLOOR_LOCALE).toBe('en-US'); const parsed = EmailTemplateDefinitionSchema.parse({ @@ -90,7 +90,7 @@ describe('#17614 — the floor tag is one named constant, not two spellings', () // A published declaration promising a loud permanent refusal where the // runtime performs a silent fill is the defect; both call shapes must stay // named, so the promise cannot quietly go unconditional again. - it('[#18056] scopes the dead-letter promise to a call that NAMES a locale, and states the other case', () => { + it('scopes the dead-letter promise to a call that NAMES a locale, and states the other case', () => { const text = String(EmailTemplateDefinitionSchema.shape.locale.description ?? ''); expect(text).toMatch(/NAMES a locale/); expect(text).toMatch(/lowest locale tag/); @@ -99,7 +99,7 @@ describe('#17614 — the floor tag is one named constant, not two spellings', () }); }); -describe('#17614 — defineStack reports a bundle with no `en-US` floor', () => { +describe('defineStack reports a bundle with no `en-US` floor', () => { it('reports the trap: every supportedLocales tag authored, none of them the floor', () => { const { warns, value } = warningsOf(stack(['en', 'zh-CN', 'ja-JP', 'es-ES'].map((l) => tpl(l)), THE_TRAP)); const hits = floorWarns(warns); @@ -130,7 +130,7 @@ describe('#17614 — defineStack reports a bundle with no `en-US` floor', () => }); }); -describe('#17614 — and stays silent where the bundle HAS a floor (the controls)', () => { +describe('and stays silent where the bundle HAS a floor (the controls)', () => { // ⛔ Every case in THIS block is a bundle that genuinely carries the floor // row. The shapes that are floorless and silent anyway are the guard's scope // boundary and live in their own block below — filing them here read as @@ -156,7 +156,7 @@ describe('#17614 — and stays silent where the bundle HAS a floor (the controls }); -describe('#17614 — warn-once bookkeeping', () => { +describe('the no-floor report: warn-once bookkeeping', () => { it('warns once for one bundle, however many times the same stack is defined', () => { const first = warningsOf(stack([tpl('pt-BR')], { defaultLocale: 'pt-BR', supportedLocales: ['pt-BR'] })); const second = warningsOf(stack([tpl('pt-BR')], { defaultLocale: 'pt-BR', supportedLocales: ['pt-BR'] })); @@ -176,7 +176,7 @@ describe('#17614 — warn-once bookkeeping', () => { // enforce-or-remove question and is not decided here; what is closed is the // silence being undeclared and unpinned. -describe('#18056 — the guard\'s declared scope boundary', () => { +describe('the floor guard\'s declared scope boundary', () => { it('early return 1: a stack with no `i18n` block is never examined, floorless or not', () => { const { warns, value } = warningsOf(stack([tpl('en', 'acme.scope_no_i18n')])); expect(floorWarns(warns)).toEqual([]); diff --git a/packages/spec/src/stack-inline-action-crossref.test.ts b/packages/spec/src/stack-inline-action-crossref.test.ts index ed92e566762..af589c52bda 100644 --- a/packages/spec/src/stack-inline-action-crossref.test.ts +++ b/packages/spec/src/stack-inline-action-crossref.test.ts @@ -122,7 +122,7 @@ function refusals(config: unknown): string[] { } } -describe('defineStack — inline action cross-references: modal targets (#6889)', () => { +describe('defineStack — inline action cross-references: modal targets', () => { it('rejects a dangling inline modal target (probe row E) with the registered rule\'s wording', () => { expect(refusals(inlineStack({ name: 'probe_new_task', type: 'modal', target: 'probe_nowhere' }))).toEqual([ "Inline action 'probe_new_task' on page 'probe_home' (regions.0.components.0) " @@ -130,7 +130,7 @@ describe('defineStack — inline action cross-references: modal targets (#6889)' ]); }); - it('rejects an inline modal target naming an OBJECT — #6739 ruling A, a modal target names a page (probe row D)', () => { + it('rejects an inline modal target naming an OBJECT — a modal target names a page, only (probe row D)', () => { expect(refusals(inlineStack({ name: 'probe_new_task', type: 'modal', target: 'probe_task' }))).toEqual([ "Inline action 'probe_new_task' on page 'probe_home' (regions.0.components.0) " + "references page 'probe_task' (via modal target) which is not defined in pages.", @@ -159,7 +159,7 @@ describe('defineStack — inline action cross-references: modal targets (#6889)' }); }); -describe('defineStack — inline action cross-references: flow targets (#6889)', () => { +describe('defineStack — inline action cross-references: flow targets', () => { it('rejects an inline flow target that names no declared flow', () => { expect(refusals(inlineStack({ name: 'probe_run', type: 'flow', target: 'probe_nowhere' }, { flows }))).toEqual([ "Inline action 'probe_run' on page 'probe_home' (regions.0.components.0) " @@ -179,7 +179,7 @@ describe('defineStack — inline action cross-references: flow targets (#6889)', }); }); -describe('defineStack — inline action cross-references: the traversal itself (#6889)', () => { +describe('defineStack — inline action cross-references: the traversal itself', () => { it('reaches a button nested inside a container\'s children and reports its path', () => { const config = { manifest: baseManifest, @@ -261,7 +261,7 @@ describe('defineStack — inline action cross-references: the traversal itself ( }); }); -describe('defineStack — inline action cross-references: what the walk must NOT refuse (#6889)', () => { +describe('defineStack — inline action cross-references: what the walk must NOT refuse', () => { it.each([ ['form', { name: 'probe_form', type: 'form', target: 'probe_task.edit' }], ['url', { name: 'probe_url', type: 'url', target: '/environments' }], @@ -319,7 +319,7 @@ const registeredStack = (action: unknown, extra: Record = {}) = const modalAction = (target: string) => ({ name: 'probe_new_task', label: 'New', type: 'modal' as const, target }); const flowAction = (target: string) => ({ name: 'probe_run', label: 'Run', type: 'flow' as const, target }); -describe('defineStack — object-embedded action cross-references: modal targets (#7397)', () => { +describe('defineStack — object-embedded action cross-references: modal targets', () => { it('rejects a dangling embedded modal target (probe row b) with the registered rule\'s wording', () => { expect(refusals(embeddedStack(modalAction('probe_nowhere')))).toEqual([ "Action 'probe_new_task' on object 'probe_task' " @@ -327,7 +327,7 @@ describe('defineStack — object-embedded action cross-references: modal targets ]); }); - it('rejects an embedded modal target naming an OBJECT — #6739 ruling A, a modal target names a page (probe row d)', () => { + it('rejects an embedded modal target naming an OBJECT — a modal target names a page, only (probe row d)', () => { expect(refusals(embeddedStack(modalAction('probe_task')))).toEqual([ "Action 'probe_new_task' on object 'probe_task' " + "references page 'probe_task' (via modal target) which is not defined in pages.", @@ -348,7 +348,7 @@ describe('defineStack — object-embedded action cross-references: modal targets }); }); -describe('defineStack — object-embedded action cross-references: flow targets (#7397)', () => { +describe('defineStack — object-embedded action cross-references: flow targets', () => { it('rejects an embedded flow target that names no declared flow (probe row c)', () => { expect(refusals(embeddedStack(flowAction('probe_nowhere'), { flows }))).toEqual([ "Action 'probe_run' on object 'probe_task' " @@ -365,7 +365,7 @@ describe('defineStack — object-embedded action cross-references: flow targets }); }); -describe('defineStack — object-embedded action cross-references: objectName → object (#7456)', () => { +describe('defineStack — object-embedded action cross-references: objectName → object', () => { const dangling = { name: 'probe_on', label: 'On', type: 'script' as const, target: 'doThing', objectName: 'probe_missing' }; it('rejects a dangling embedded objectName (probe row k) with the registered rule\'s wording, subject adjusted to the owning object', () => { @@ -396,12 +396,12 @@ describe('defineStack — object-embedded action cross-references: objectName expect(refusals(config)).toEqual([]); }); - it('leaves an embedded action with no objectName alone — unchanged from before #7456', () => { + it('leaves an embedded action with no objectName alone — unchanged from before the dangling-`objectName` refusal', () => { expect(refusals(embeddedStack({ name: 'probe_on', label: 'On', type: 'script' as const, target: 'doThing' }))).toEqual([]); }); }); -describe('defineStack — object-embedded action cross-references: the b/f, c/g, d/i splits (#7397)', () => { +describe('defineStack — object-embedded action cross-references: the b/f, c/g, d/i splits', () => { it.each([ ['modal → nothing (rows b/f)', modalAction('probe_nowhere')], ['modal → object (rows d/i)', modalAction('probe_task')], @@ -420,7 +420,7 @@ describe('defineStack — object-embedded action cross-references: the b/f, c/g, }); }); -describe('defineStack — object-embedded action cross-references: the traversal itself (#7397)', () => { +describe('defineStack — object-embedded action cross-references: the traversal itself', () => { it('labels each offender with ITS OWN object, not a fixed subject', () => { const config = { manifest: baseManifest, @@ -497,7 +497,7 @@ describe('defineStack — object-embedded action cross-references: the traversal }); }); -describe('defineStack — object-embedded action cross-references: what the walk must NOT refuse (#7397)', () => { +describe('defineStack — object-embedded action cross-references: what the walk must NOT refuse', () => { it.each([ ['form', { name: 'probe_form', label: 'Form', type: 'form', target: 'probe_task.edit' }], ['url', { name: 'probe_url', label: 'Url', type: 'url', target: '/environments' }], diff --git a/packages/spec/src/stack-json-stage-package-body.test.ts b/packages/spec/src/stack-json-stage-package-body.test.ts index 359b1ba7081..6575c0b2c39 100644 --- a/packages/spec/src/stack-json-stage-package-body.test.ts +++ b/packages/spec/src/stack-json-stage-package-body.test.ts @@ -111,7 +111,7 @@ const RECORD_BODY = { hooks: [{ name: 'on_insert', object: 'task', events: ['beforeInsert' as const] }], }; -describe('#17518 the two JSON stages CONVERT, which is the whole point of declaring them', () => { +describe('the two JSON stages CONVERT, which is the whole point of declaring them', () => { it('both new bodies convert under `z.toJSONSchema` — over the WHOLE body, not two members', () => { // Stated over the whole body on purpose: the tax this closes is paid by // EMBEDDERS, and an embedder loses its JSON Schema to any one @@ -144,7 +144,7 @@ describe('#17518 the two JSON stages CONVERT, which is the whole point of declar }); }); -describe('#17518 the three stages have the SAME key set — they narrow, they do not drop', () => { +describe('the three stages have the SAME key set — they narrow, they do not drop', () => { it('artifact and record carry every member the assembled body carries', () => { const assembled = shapeKeys(AssembledPackageBodySchema); expect(shapeKeys(ArtifactStagePackageBodySchema)).toEqual(assembled); @@ -183,7 +183,7 @@ describe('#17518 the three stages have the SAME key set — they narrow, they do }); }); -describe('#17518 each stage accepts ITS OWN payload and refuses the neighbouring ones', () => { +describe('each stage accepts ITS OWN payload and refuses the neighbouring ones', () => { it('assembled accepts the live composed body; both JSON stages refuse it', () => { expect(AssembledPackageBodySchema.safeParse(IN_MEMORY_BODY).success).toBe(true); expect(ArtifactStagePackageBodySchema.safeParse(IN_MEMORY_BODY).success).toBe(false); @@ -218,7 +218,7 @@ describe('#17518 each stage accepts ITS OWN payload and refuses the neighbouring }); }); -describe('#17518 `effect` is READ off the declaration schema, never minted here', () => { +describe('`effect` is READ off the declaration schema, never minted here', () => { it('a lowered entry with no `effect` materialises the declaration default', () => { // `FlowFunctionDeclarationSchema.effect` is // `FlowFunctionEffectSchema.default(DEFAULT_FLOW_FUNCTION_EFFECT)` — a diff --git a/packages/spec/src/stack-refusal-envelopes.test.ts b/packages/spec/src/stack-refusal-envelopes.test.ts index ace7ac794af..83ac6aaa87d 100644 --- a/packages/spec/src/stack-refusal-envelopes.test.ts +++ b/packages/spec/src/stack-refusal-envelopes.test.ts @@ -153,7 +153,7 @@ const rows: Array<{ }, ]; -describe('#15963 — every defineStack refusal carries an ADR-0112 envelope', () => { +describe('every defineStack refusal carries an ADR-0112 envelope', () => { for (const row of rows) { describe(row.site, () => { it(`refuses with code ${row.code} and status 422`, () => { @@ -241,7 +241,7 @@ describe('#15963 — every defineStack refusal carries an ADR-0112 envelope', () } }); - it('every code is a member of the closed `ErrorCode` union, registered under @objectstack/spec (#16449)', () => { + it('every code is a member of the closed `ErrorCode` union, registered under @objectstack/spec', () => { // The #16404 ruling: a code that ships in `dist` is the published face, // door or no door — so each refusal's spelling is a ledger row, and a // consumer's `switch (e.code)` is exhaustive over the union it ships with. diff --git a/packages/spec/src/stack-requires.test.ts b/packages/spec/src/stack-requires.test.ts index d83c7fa8cfe..3d108f0a100 100644 --- a/packages/spec/src/stack-requires.test.ts +++ b/packages/spec/src/stack-requires.test.ts @@ -7,7 +7,7 @@ import { defineStack } from './stack.zod'; // deprecated `aiStudio`/`aiSeat` aliases were removed in #3308, so those now // reject like any other typo — there is no canonicalization step left. -describe('defineStack requires validation (#3265/#3308)', () => { +describe('defineStack requires validation', () => { it('canonical declarations pass through untouched', () => { const stack = defineStack({ requires: ['ai', 'ai-studio', 'ai-seat', 'hierarchy-security', 'governance'] }); expect(stack.requires).toEqual(['ai', 'ai-studio', 'ai-seat', 'hierarchy-security', 'governance']); @@ -19,7 +19,7 @@ describe('defineStack requires validation (#3265/#3308)', () => { ); }); - it('the removed camelCase aliases now REJECT like any other unknown token (#3308)', () => { + it('the removed camelCase aliases now REJECT like any other unknown token', () => { expect(() => defineStack({ requires: ['aiStudio'] })).toThrowError( /'aiStudio' is not a known platform capability/, ); @@ -59,7 +59,7 @@ describe('defineStack requires validation (#3265/#3308)', () => { // and never fires. The refusal reuses the automation engine's boot-audit // wording (flow name, resolved trigger kind, the exact remedy). -describe('defineStack trigger capability validation (#14153)', () => { +describe('defineStack trigger capability validation', () => { const node = (id: string, type: string, config?: Record) => ({ id, type, @@ -222,7 +222,7 @@ describe('defineStack trigger capability validation (#14153)', () => { // prescription literally and asserts the result is ACCEPTED — the property // the neither-arm exists for. -describe('defineStack trigger capability — the pair: `triggers` without `automation` (#20332)', () => { +describe('defineStack trigger capability — the pair: `triggers` without `automation`', () => { type Envelope = Error & { code?: string; status?: number; issues?: readonly string[] }; const refusalOf = (stack: Record): Envelope | null => { try { diff --git a/packages/spec/src/stack-top-level-strict.test.ts b/packages/spec/src/stack-top-level-strict.test.ts index 5d06b5e4ba9..ee725b9bd17 100644 --- a/packages/spec/src/stack-top-level-strict.test.ts +++ b/packages/spec/src/stack-top-level-strict.test.ts @@ -47,7 +47,7 @@ const legalStack = () => ({ const parseTopLevel = (raw: Record) => ObjectStackDefinitionSchema.safeParse(raw); -describe('#8687 — unknown top-level stack keys are refused at parse', () => { +describe('unknown top-level stack keys are refused at parse', () => { it("inverts the card's measured control: the three bogus keys now FAIL parse instead of adding zero warnings", () => { // Measured on 17.0.0 GA: each of these parsed `success: true` with the key // silently dropped, and injecting all three into a real app config added @@ -125,7 +125,7 @@ describe('#8687 — unknown top-level stack keys are refused at parse', () => { }); }); -describe('#10485 — the `themes` carrier is retired (ADR-0049; ruled 退役授权面 2026-08-21)', () => { +describe('the `themes` carrier is retired (ADR-0049; ruled 退役授权面 2026-08-21)', () => { // A theme body that parsed green on 17.0 — the exact authoring the issue // measured shipping end-to-end while changing nothing on screen. const previouslyAcceptedThemes = [ @@ -170,7 +170,7 @@ describe('#10485 — the `themes` carrier is retired (ADR-0049; ruled 退役授 }); }); -describe('#8687 — the accept side does not move', () => { +describe('the strict top-level door: the accept side does not move', () => { it('accepts every declared top-level key', () => { // Structural sweep: a declared key must never be refused as unknown. All // 40+ top-level keys are optional (tombstones included), so presence with @@ -212,7 +212,7 @@ describe('#8687 — the accept side does not move', () => { }); }); -describe('#8687 — one voice: the lint yields to the strict parse', () => { +describe('one voice: the lint yields to the strict parse', () => { it('lintUnknownStackKeys goes quiet on the now-strict stack schema (its own posture rule)', () => { // The graduation day the lint's docblock always promised: a strict schema // rejects loudly on its own, so the lint must not become a second, @@ -222,7 +222,7 @@ describe('#8687 — one voice: the lint yields to the strict parse', () => { }); }); -describe('#8687 — defineStack surfaces the refusal', () => { +describe('defineStack surfaces the unknown-top-level-key refusal', () => { it('throws with the curated message, did-you-mean included', () => { expect(() => defineStack({ objectz: [] } as never)).toThrowError( /Unrecognized key\(s\) on this stack definition: `objectz`\. Did you mean `objectz` → `objects`\?/, diff --git a/packages/spec/src/stack.test.ts b/packages/spec/src/stack.test.ts index 9a2258cade6..5022365e255 100644 --- a/packages/spec/src/stack.test.ts +++ b/packages/spec/src/stack.test.ts @@ -562,7 +562,7 @@ describe('defineStack - Seed Data Cross-Reference Validation', () => { }); }); -describe('defineStack - Mapping Cross-Reference Validation (#2611)', () => { +describe('defineStack - Mapping Cross-Reference Validation', () => { const baseManifest = { id: 'com.example.test', name: 'test-project', @@ -1507,7 +1507,7 @@ describe('defineStack — ADR-0087 D2 conversion notices', () => { }); }); -describe('defineStack — the RETIRED `type: page` view mount (#17063)', () => { +describe('defineStack — the RETIRED `type: page` view mount', () => { const baseManifest = { id: 'com.example.test', name: 'test-project',