From dbbd2506e019bb39f169f19fb49590b198ee36a4 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 25 Sep 2026 10:11:28 +0000 Subject: [PATCH 1/4] fix(cli,types): say what `objectui check` does; name `objectui validate` for the verdict `check`'s help line read "Validate schema files", and the `ChatbotSchema.body` tombstone docblock named `objectui check` beside `objectui validate` as a root parse that refuses the key. `check` is an advisory sweep: a file whose root carries a structural key (`body` is one) is recognised by that key and never parsed, and only unreadable JSON exits non-zero. Both texts now say so and point at `objectui validate`. The two `SemanticElementSchema` docblocks that said `objectui check` refused a document now name `objectui validate`. Ten pending changesets that named `check` as delivering a refusal are reconciled with a dated note; their front matter is unchanged. A pin in `cli-bin.test.ts` keeps `check --help` from leading with "validate" and requires it to name `objectui validate`. Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN Co-authored-by: Claude --- ...78-filter-condition-value-protocol-rule.md | 16 +++++++++--- .changeset/10524-check-promise-text.md | 25 +++++++++++++++++++ .changeset/6475-gantt-block-face-declared.md | 12 +++++++-- ...4-chart-series-chart-type-alias-refusal.md | 21 ++++++++++------ .../8466-calendar-color-allday-fields.md | 9 ++++++- .changeset/8499-node-slot-registered-arms.md | 9 ++++++- .changeset/8572-chatbot-body-retired.md | 14 ++++++++--- .../9239-object-calendar-data-array-arm.md | 4 ++- .changeset/9511-record-id-is-a-string.md | 15 ++++++++--- ...559-filter-operator-schema-protocol-set.md | 13 +++++++--- .../9746-render-path-not-a-validation-door.md | 18 +++++++++---- packages/cli/src/__tests__/cli-bin.test.ts | 22 ++++++++++++++++ packages/cli/src/cli.ts | 2 +- packages/types/src/complex.ts | 5 +++- packages/types/src/layout.ts | 2 +- packages/types/src/zod/layout.zod.ts | 2 +- 16 files changed, 154 insertions(+), 35 deletions(-) create mode 100644 .changeset/10524-check-promise-text.md diff --git a/.changeset/10478-filter-condition-value-protocol-rule.md b/.changeset/10478-filter-condition-value-protocol-rule.md index d464ca40d0..fd7e05ec2e 100644 --- a/.changeset/10478-filter-condition-value-protocol-rule.md +++ b/.changeset/10478-filter-condition-value-protocol-rule.md @@ -30,7 +30,15 @@ out of the projection, so it is still required and still accepted. A condition r for its `field`, `operator` or `id` reports only that issue. **Breaking in semantics:** a document with a condition the protocol already refused, and -that used to validate, now fails `safeValidateSchema`, `objectui check` and -`objectui validate`. The fix is to author the value the operator takes. Released as -`minor` under this repository's version-alignment rule. The TypeScript types do not -change: `FilterBuilderCondition.value` stays `any`. +that used to validate, now fails `safeValidateSchema` and `objectui validate`. The fix is +to author the value the operator takes. Released as `minor` under this repository's +version-alignment rule. The TypeScript types do not change: `FilterBuilderCondition.value` +stays `any`. + +⚠️ **Dated note, 2026-09-25 — `objectui check` does not fail such a document — +objectui#10524.** This entry first listed `objectui check` beside `objectui validate`. +`check` is an advisory sweep: it never parses a file whose root carries a structural key +(`children`, `className`, `body`, …), it lists a file with none of those keys by name when +the file does not validate, and it exits non-zero on unreadable JSON only. The verdict is +`objectui validate`'s. The "answered green" sentence at the top of this entry stays true +of `check`, before this change and after it. diff --git a/.changeset/10524-check-promise-text.md b/.changeset/10524-check-promise-text.md new file mode 100644 index 0000000000..f1a79e2df1 --- /dev/null +++ b/.changeset/10524-check-promise-text.md @@ -0,0 +1,25 @@ +--- +'@object-ui/cli': patch +'@object-ui/types': patch +--- + +`objectui check`'s help line and three `@object-ui/types` docblocks no longer present `check` +as a validator (objectui#10524). + +- `@object-ui/cli`: `objectui --help` and `objectui check --help` described `check` as + "Validate schema files". It now reads "Advisory JSON file sweep; run objectui validate for a + verdict". `check` itself is unchanged. It sweeps the project's JSON files and recognises a + file whose root carries a structural key (`children`, `className`, `body`, …) by that key + alone, without parsing it. It parses only a file with none of those keys, and lists it by name + when its root `type` names a registered component but the document does not validate. That + list is advisory: `check` exits non-zero on unreadable JSON only. The verdict is + `objectui validate`'s: it parses one document against the published schema, prints the + schema's own errors and exits non-zero. +- `@object-ui/types`: the `ChatbotSchema.body` docblock said the retired key's refusal comes from + "a root parse (`objectui validate` / `objectui check`, …)". `body` is itself one of the + structural keys, so `check` never parses a `chatbot` document that authors it. The docblock + now names `objectui validate` alone and says why `check` does not deliver the refusal. The two + `SemanticElementSchema` docblocks (the interface and its zod mirror) said a document was + refused by `objectui check`; they now name `objectui validate`, whose refusal it was. + +A help string and comments only: no command's behaviour, export, type or schema moves. diff --git a/.changeset/6475-gantt-block-face-declared.md b/.changeset/6475-gantt-block-face-declared.md index 20c9f2ec69..ad137587b2 100644 --- a/.changeset/6475-gantt-block-face-declared.md +++ b/.changeset/6475-gantt-block-face-declared.md @@ -3,7 +3,7 @@ --- **`ObjectGanttSchema` now declares the `gantt` BLOCK face — and the spec's -required trio enforces at validate/check time.** +required trio enforces at validate time.** The `gantt` nested-block spelling of a gantt config (`{ type: 'object-gantt', gantt: { … } }`) had **no mirror entry at all**: it rode through @@ -30,11 +30,19 @@ gantt: SpecGanttConfigSchema.extend(GanttConfigExtensionFields).optional(), **What the CLI now refuses that it accepted before:** `ObjectGanttSchema` is a member of `AnyComponentSchema`, so it reaches `safeValidateSchema` and -therefore the CLI's `validate` and `check` commands. A `gantt` block missing +therefore the CLI's `validate` command. A `gantt` block missing any of the three required fields — previously accepted silently — is now **refused**, naming the missing field. A block carrying all three, or a schema with no `gantt` block at all, is accepted exactly as before. +⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal — +objectui#10524.** This entry first named the CLI's `check` command beside +`validate`, here and in its heading. `check` is an advisory sweep: it never +parses a file whose root carries a structural key (`children`, `className`, +`body`, …), it lists a file with none of those keys by name when the file does +not validate, without naming the missing field, and it exits non-zero on +unreadable JSON only. The refusal is `objectui validate`'s. + **This is a `declared = enforced` restoration, not new requiredness.** `getGanttConfig`'s block branch already fed the block to `GanttConfigSchema.safeParse` and logged `[ObjectGantt] Invalid gantt diff --git a/.changeset/7694-chart-series-chart-type-alias-refusal.md b/.changeset/7694-chart-series-chart-type-alias-refusal.md index de2f03b395..302c87b331 100644 --- a/.changeset/7694-chart-series-chart-type-alias-refusal.md +++ b/.changeset/7694-chart-series-chart-type-alias-refusal.md @@ -27,12 +27,19 @@ it is named here in the words a release reader can act on: key is not folded onto `type` and no precedence is minted between the two spellings. - **Which documents to scan.** The narrowing does not stop at `ChartDataSeriesSchema`; it reaches every document through the parents that embed it — `ChartSchema.series` - (`zod/data-display.zod.ts:622`, `z.array(ChartDataSeriesSchema)`) and, one level further out, - `ReportSectionSchema.chart` (`zod/reports.zod.ts:105`, `ChartSchema.optional()`). Authors meet it - through `safeValidateSchema()` (`zod/index.zod.ts:434`, which parses `AnyComponentSchema`) and - through the CLI's `objectui check` and `objectui validate` commands (`packages/cli/src/cli.ts:211` - and `:223`). In practice: every `chart` node's `series[]`, and every report section whose `chart` - carries one. + (`zod/data-display.zod.ts`, `z.array(ChartDataSeriesSchema)`) and, one level further out, + `ReportSectionSchema.chart` (`zod/reports.zod.ts`, `ChartSchema.optional()`). Authors meet it + through `safeValidateSchema()` (`zod/index.zod.ts`, which parses `AnyComponentSchema`) and + through the CLI's `objectui validate` command (`packages/cli/src/cli.ts`). In practice: every + `chart` node's `series[]`, and every report section whose `chart` carries one. + +⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal — objectui#10524.** +This entry first named the CLI's `objectui check` command beside `objectui validate` as a place +authors meet the refusal. `check` is an advisory sweep: it never parses a file whose root carries a +structural key (`children`, `className`, `body`, …), it lists a file with none of those keys by +name when the file does not validate, without the issue, and it exits non-zero on unreadable JSON +only. The refusal is `objectui validate`'s. The source citations in this entry now name files +rather than line numbers. This repository's `major` is a cross-repo pin to `@objectstack`'s major, not a severity dial; the break is announced here, which is the channel that carries it. @@ -40,7 +47,7 @@ break is announced here, which is the channel that carries it. ## Why a refusal, and not the two alternatives `chartType` is the renderer's INTERNAL spelling of `type`: the first limb of `normalizeSeries`' -`str(raw.chartType) ?? str(raw.type)` (`@object-ui/plugin-charts`, `normalizeChartSchema.ts:244`), +`str(raw.chartType) ?? str(raw.type)` (`@object-ui/plugin-charts`, `normalizeChartSchema.ts`), written by the internal-shape producers that hand `dataKey`-shaped arrays straight to `ChartRenderer` (`ObjectChart`, `DatasetWidget`; `core/utils/chart-presentation` translates authored `type` *into* it) and by nothing an author writes. Re-measured at implementation time, series-level, diff --git a/.changeset/8466-calendar-color-allday-fields.md b/.changeset/8466-calendar-color-allday-fields.md index dda117b34f..bc1f86554f 100644 --- a/.changeset/8466-calendar-color-allday-fields.md +++ b/.changeset/8466-calendar-color-allday-fields.md @@ -45,9 +45,16 @@ verdict is a WRONG-TYPED value at a correctly spelled key, which the index signature and `.passthrough()` used to admit unexamined: `colorField: 0xff0000` and `allDayField: true` — the field-name-versus-value confusion these keys invite — are now refused at authoring time and through `safeValidateSchema`, the path -the CLI's `validate` / `check` take. That is why this is a `minor` and not a +the CLI's `validate` takes. That is why this is a `minor` and not a `patch`. +⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal — +objectui#10524.** This entry first named the CLI's `check` command beside +`validate`. `check` is an advisory sweep: it never parses a file whose root +carries a structural key (`children`, `className`, `body`, …), it lists a file +with none of those keys by name when the file does not validate, and it exits +non-zero on unreadable JSON only. The refusal is `objectui validate`'s. + Neither key is added to `plugin-calendar`'s registration `inputs`, deliberately: the forward direction of `apps/console`'s registry/spec parity gate refuses an `inputs` entry the spec props schema does not accept, and all five flat keys are diff --git a/.changeset/8499-node-slot-registered-arms.md b/.changeset/8499-node-slot-registered-arms.md index d1e3962d51..09484a2662 100644 --- a/.changeset/8499-node-slot-registered-arms.md +++ b/.changeset/8499-node-slot-registered-arms.md @@ -12,9 +12,16 @@ Eight were registered renderers with fixtures proving they draw; the ninth in `scripts/check-doc-component-types.mjs`. A reader following `content/docs/utilities/runner.mdx`'s own instruction — "copy one, wrap it in a page document … and save it as `src/app-data/pages/index.json`" — got a document that -**renders correctly in the browser and is refused by `objectui check`**. That is the +**renders correctly in the browser and is refused by `objectui validate`**. That is the expensive direction: the likely reaction is to stop trusting the validator. +⚠️ **Dated note, 2026-09-25 — the refusal was `objectui validate`'s, not +`objectui check`'s — objectui#10524.** This entry first named `objectui check` here. +`check` is an advisory sweep: it never parses a file whose root carries a structural +key (`children`, `className`, `body`, …), so the page document above passes it, and it +exits non-zero on unreadable JSON only. The "Downstream" paragraph below is about +`check`'s advisory list of files with none of those keys, and stands. + It was invisible because `check:doc-types` judges a `type` literal against the RENDERER REGISTRY — the key set whose size that gate prints in its own summary line — and not against `AnyComponentSchema`. The two faces disagreed by diff --git a/.changeset/8572-chatbot-body-retired.md b/.changeset/8572-chatbot-body-retired.md index 8544a8b3f3..9303eb0678 100644 --- a/.changeset/8572-chatbot-body-retired.md +++ b/.changeset/8572-chatbot-body-retired.md @@ -71,9 +71,17 @@ API params for a child node — it names `children` for a key the author spelled it prescribes adding a `type` to the params. It says the same thing before and after this change, and in a production build it is not emitted at all. The VS Code extension's validator is the same shape: its own walker, no mirror. ⇒ the retirement is delivered where -documents are AUTHORED and CHECKED (`tsc`, `objectui validate`, `objectui check`, and any -consumer that calls `safeValidateSchema`), and ⛔ not where they are RENDERED. Making the -render path agree is a different change on a different package and is not made here. +documents are AUTHORED and CHECKED (`tsc`, `objectui validate`, and any consumer that calls +`safeValidateSchema`), and ⛔ not where they are RENDERED. Making the render path agree is a +different change on a different package and is not made here. + +⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal — +objectui#10524.** This entry first listed `objectui check` among the places the retirement +is delivered. `body` is itself one of the structural root keys `check` recognises a file by, +and `check` never parses a file it recognised that way, so a `chatbot` document authoring +`body` at its root passes `check` and exits 0. `check` exits non-zero on unreadable JSON +only. The refusal is `objectui validate`'s; the `ChatbotSchema.body` docblock in +`@object-ui/types` now says the same. **Nothing that rendered stops rendering.** No renderer read consumes `body` for this node: the `chatbot` registration spells the chat runtime's `body` option off `requestBody`, and diff --git a/.changeset/9239-object-calendar-data-array-arm.md b/.changeset/9239-object-calendar-data-array-arm.md index 5c98e4c99d..85c1f4d995 100644 --- a/.changeset/9239-object-calendar-data-array-arm.md +++ b/.changeset/9239-object-calendar-data-array-arm.md @@ -11,9 +11,11 @@ After objectui#8348 put the renderer on the protocol's side (maintainer ruling, **What changes for authors** - `ObjectCalendarSchema` (TypeScript): `data?: ViewData` becomes `data?: unknown[]`, DERIVED from the protocol's own row rather than re-spelled, so the key cannot drift from it a second time. A calendar literal carrying `data: { provider: 'value', items: [...] }` is now a compile error at `data`; an array of records compiles. -- `ObjectCalendarSchema` (Zod mirror, reached by `safeValidateSchema` and so by the CLI's `validate` / `check`): `ViewDataSchema.optional()` becomes `z.array(z.unknown()).optional()`. The config object is now refused AT the key; an array is accepted. +- `ObjectCalendarSchema` (Zod mirror, reached by `safeValidateSchema` and so by the CLI's `validate`): `ViewDataSchema.optional()` becomes `z.array(z.unknown()).optional()`. The config object is now refused AT the key; an array is accepted. - Requiredness is unchanged — optional on both faces, as before — so the `zod-mirror-parity` ratchet is unmoved. +⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal — objectui#10524.** This entry first named the CLI's `check` command beside `validate`. `check` is an advisory sweep: it never parses a file whose root carries a structural key (`children`, `className`, `body`, …), it lists a file with none of those keys by name when the file does not validate, and it exits non-zero on unreadable JSON only. The refusal is `objectui validate`'s. + ⛔ **The accept set genuinely shrinks. That is the point**, and it is a narrowing onto a contract `@objectstack/spec` already publishes, not a new dialect: every document this declaration now refuses was already refused by the protocol, by `os validate`, by the save gate and by the renderer. Nothing that renders today stops rendering because of this change — objectui#8348 is where the runtime behaviour moved. **What does NOT change** diff --git a/.changeset/9511-record-id-is-a-string.md b/.changeset/9511-record-id-is-a-string.md index f211fc569a..17d2685500 100644 --- a/.changeset/9511-record-id-is-a-string.md +++ b/.changeset/9511-record-id-is-a-string.md @@ -78,10 +78,17 @@ and are refused now, which is the half of the corpus that shows nothing was loos number arm was removed. **Delivery surface — where the refusal does and does not arrive.** PARSE-TIME on the mirror -(`@object-ui/types/zod`, so `objectui validate`, `objectui check` and any consumer calling -`safeParse`) and COMPILE-TIME on the declaration (`tsc`). ⚠️ As with every other key on these -mirrors, the runtime render path does not parse through them, so a rendered document is not -where this arrives. +(`@object-ui/types/zod`, so `objectui validate` and any consumer calling `safeParse`) and +COMPILE-TIME on the declaration (`tsc`). ⚠️ As with every other key on these mirrors, the +runtime render path does not parse through them, so a rendered document is not where this +arrives. + +⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal — +objectui#10524.** This entry first listed `objectui check` on the parse-time side. `check` is +an advisory sweep: it never parses a file whose root carries a structural key (`children`, +`className`, `body`, …), it lists a file with none of those keys by name when the file does +not validate, and it exits non-zero on unreadable JSON only. The refusal is +`objectui validate`'s. **Consequential narrowings, all compiler-forced by the door above.** `DrawerForm`, `ModalForm`, `SplitForm`, `TabbedForm` and `WizardForm` each declare their own `recordId` and diff --git a/.changeset/9559-filter-operator-schema-protocol-set.md b/.changeset/9559-filter-operator-schema-protocol-set.md index 66335d0365..3f82b8af51 100644 --- a/.changeset/9559-filter-operator-schema-protocol-set.md +++ b/.changeset/9559-filter-operator-schema-protocol-set.md @@ -7,9 +7,16 @@ feat(types): `FilterOperatorSchema` is the protocol's operator set, and normalis `FilterOperatorSchema` — the validator for a `filter-builder` condition's `operator` — was a 14-member local list that had fallen six members behind `@objectstack/spec` (`icontains`, `is_empty`, `is_not_empty`, `before`, `after`, `between`) and refused every -legacy spelling the protocol accepts. So `safeValidateSchema` (and `objectui check` / -`objectui validate`) refused filters that the protocol's own `ViewFilterRuleSchema` and -the runtime both accept (objectui#9559, ruling B). +legacy spelling the protocol accepts. So `safeValidateSchema` (and `objectui validate`) +refused filters that the protocol's own `ViewFilterRuleSchema` and the runtime both +accept (objectui#9559, ruling B). + +⚠️ **Dated note, 2026-09-25 — `objectui check` did not refuse them — objectui#10524.** +This entry first listed `objectui check` beside `objectui validate`. `check` is an +advisory sweep: it never parses a file whose root carries a structural key (`children`, +`className`, `body`, …), it lists a file with none of those keys by name when the file +does not validate, and it exits non-zero on unreadable JSON only. The verdict is +`objectui validate`'s. It is now the spec rule's own `operator` member — `VIEW_FILTER_OPERATORS` plus the spec's alias fold, taken from `@objectstack/spec/ui` instead of copied — so it cannot fall behind diff --git a/.changeset/9746-render-path-not-a-validation-door.md b/.changeset/9746-render-path-not-a-validation-door.md index 33dd76b64f..bd5f9f8229 100644 --- a/.changeset/9746-render-path-not-a-validation-door.md +++ b/.changeset/9746-render-path-not-a-validation-door.md @@ -7,11 +7,19 @@ Document that the render path is not a validation door (objectui#9746). `SchemaRenderer` never parses a document against the published Zod schema, the one document check on the render path is `@object-ui/core`'s hand-written structural walker, and that call sits behind a development-only guard — so a production build validates nothing before it draws. -The section names the three doors that do validate (the framework's load-time Zod parse, -surfaced as the `_diagnostics` envelope the Metadata Diagnostics guide describes; `objectui -validate` / `objectui check`; and `safeValidateSchema` from `@object-ui/types/zod`) and states -that the walker and the schema do not share an accept set, so neither verdict stands in for the -other. `SchemaRenderer.tsx` gains one comment line beside that guard pointing at the section. +At this change the section named three doors that do validate (the framework's load-time Zod +parse, surfaced as the `_diagnostics` envelope the Metadata Diagnostics guide describes; +`objectui validate` / `objectui check`; and `safeValidateSchema` from `@object-ui/types/zod`) +and stated that the walker and the schema do not share an accept set, so neither verdict stands +in for the other. `SchemaRenderer.tsx` gains one comment line beside that guard pointing at the +section. + +⚠️ **Dated note, 2026-09-25 — `objectui check` is not a validation door — objectui#10524.** +Later in this same release objectui#10416 corrected the section: its second door is now +`objectui validate` alone, and it says what `objectui check` does instead. `check` is an +advisory sweep: it never parses a file whose root carries a structural key (`children`, +`className`, `body`, …), it lists a file with none of those keys by name when the file does not +validate, and it exits non-zero on unreadable JSON only. Ruled on objectui#9746 (letter B, 2026-09-18): the render path stays exactly as it is and is *declared* so. No code path changes and the dev-only walker is untouched. diff --git a/packages/cli/src/__tests__/cli-bin.test.ts b/packages/cli/src/__tests__/cli-bin.test.ts index da9dbf0394..d303c1140d 100644 --- a/packages/cli/src/__tests__/cli-bin.test.ts +++ b/packages/cli/src/__tests__/cli-bin.test.ts @@ -176,6 +176,28 @@ describe('@object-ui/cli bin', () => { }); }); + // objectui#10524 — `check` is an advisory sweep, not a validator: a file whose + // root carries a structural key is recognised by that key and never parsed, + // and only unreadable JSON exits non-zero. Its help line used to read + // "Validate schema files". These assert the kind of claim and the command it + // names, not the wording. + describe('check --help does not present `check` as the validator (objectui#10524)', () => { + const checkDescription = () => { + const res = run(['check', '--help']); + expect(res.code, res.stderr || res.stdout).toBe(0); + // Commander prints `Usage: …`, a blank line, then the description paragraph. + return res.stdout.split(/\n\s*\n/)[1] ?? ''; + }; + + it('does not describe `check` with the verb "validate"', () => { + expect(checkDescription()).not.toMatch(/^\s*validates?\b/i); + }); + + it('names `objectui validate` as the command that gives the verdict', () => { + expect(checkDescription()).toContain('objectui validate'); + }); + }); + describe('flag contracts (locked-in by docs)', () => { const cases: Array<[string, RegExp[]]> = [ ['dev', [/-p, --port /, /-h, --host /, /--no-open/]], diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 165ca5b82c..3b73365ae9 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -209,7 +209,7 @@ program program .command('check') - .description('Validate schema files') + .description('Advisory JSON file sweep; run objectui validate for a verdict') .action(async () => { try { await check(); diff --git a/packages/types/src/complex.ts b/packages/types/src/complex.ts index 2e4964f0be..48b2c7ac43 100644 --- a/packages/types/src/complex.ts +++ b/packages/types/src/complex.ts @@ -1581,10 +1581,13 @@ export interface ChatbotSchema extends BaseSchema { * through `@object-ui/core`'s hand-written `validateSchema`, which walks base * keys and recurses into content — it never consults these mirrors, so it has * no per-component key to refuse. ⇒ an authored `body` that meets neither - * `tsc` nor a root parse (`objectui validate` / `objectui check`, which call + * `tsc` nor a root parse (`objectui validate`, which calls * `safeValidateSchema`) is dropped exactly as silently after this change as * before it. The refusal is delivered where documents are AUTHORED and * CHECKED, not where they are rendered. + * `objectui check` does not deliver it: `body` is one of the structural root + * keys that command recognises a file by, and a file recognised that way is + * never parsed against the schema. The CLI's verdict is `objectui validate`. * * @deprecated Not a channel `chatbot` reads — author the chat API's body * params as `requestBody`. diff --git a/packages/types/src/layout.ts b/packages/types/src/layout.ts index 84dfd2df9e..2d2b1dc05d 100644 --- a/packages/types/src/layout.ts +++ b/packages/types/src/layout.ts @@ -1665,7 +1665,7 @@ export interface PageSlotMap { * They are registered, live renderers carrying nine catalog fixtures under * `examples/schema-catalog/src/schemas/components-layout-semantic/`, and until * objectui#8499 no arm of `AnyComponentSchema` named any of them — so a document - * that rendered correctly in the browser was refused by `objectui check`. + * that rendered correctly in the browser was refused by `objectui validate`. * * The renderer is one factory over all seven tags: it renders * `renderChildren(schema.children)` inside the tag and declares exactly one diff --git a/packages/types/src/zod/layout.zod.ts b/packages/types/src/zod/layout.zod.ts index 2ade6eeb93..a69b99b43d 100644 --- a/packages/types/src/zod/layout.zod.ts +++ b/packages/types/src/zod/layout.zod.ts @@ -865,7 +865,7 @@ export const PageNodeSchema = BaseSchema.extend(SpecPageFields.shape).extend({ * These seven are REGISTERED, LIVE renderers with nine catalog fixtures of * their own under `examples/schema-catalog/src/schemas/components-layout-semantic/`, * and `AnyComponentSchema` had no arm for any of them. So a document that - * renders correctly in the browser was REFUSED by `objectui check` — the + * renders correctly in the browser was REFUSED by `objectui validate` — the * expensive direction, because the author's likely reaction is to stop trusting * the validator rather than to fix the document (objectui#8499 triage). * From bf809e6c537b60377ff337d521e427c1b7a5eaf5 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 25 Sep 2026 10:35:40 +0000 Subject: [PATCH 2/4] docs(changeset): reconcile the grid columns entry's JSON face with what `check` does The 8505 entry named `os-ui validate` / `check` as the JSON authoring face that now refuses `{ xxl: 6 }`. The command is `objectui validate`, and `check` refuses nothing on validation. Front matter unchanged; a dated note records the correction. Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN Co-authored-by: Claude --- .changeset/8505-grid-columns-breakpoint-narrowing.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.changeset/8505-grid-columns-breakpoint-narrowing.md b/.changeset/8505-grid-columns-breakpoint-narrowing.md index e12009e161..30494c5c06 100644 --- a/.changeset/8505-grid-columns-breakpoint-narrowing.md +++ b/.changeset/8505-grid-columns-breakpoint-narrowing.md @@ -33,8 +33,8 @@ authoring spelling, which is where the defect was authored. **The zod mirror WAS deliberately not narrowed here — corrected in #8573.** This paragraph said `zod/layout.zod.ts` still validates `columns` as -`z.record(z.string(), z.number())`, so the JSON authoring face — `os-ui validate` -/ `check` in `@object-ui/cli`, the real consumer of these mirrors — still admits +`z.record(z.string(), z.number())`, so the JSON authoring face — `objectui validate` +in `@object-ui/cli`, the real consumer of these mirrors — still admits `{ xxl: 6 }`. #8573 narrowed that mirror to a partial record over the six breakpoints (objectui#8516), so the JSON face now refuses `{ xxl: 6 }` exactly as the declaration above does. Its two supporting statements went with it, and #8573 @@ -45,3 +45,10 @@ maintainer's raise to `PER_CHUNK_GZIP_CEILINGS.framework` `100_000` against a `PER_CHUNK_BASELINE.framework` of `72_245`; and the handoff assertion described here as holding the current reading visible is flipped to a refusal in #8573, so it no longer asserts acceptance. + +⚠️ **Dated note, 2026-09-25 — `objectui check` is not part of that JSON face — +objectui#10524.** This paragraph first named the face `os-ui validate` / `check`. +The command is `objectui validate`, and `check` does not refuse `{ xxl: 6 }`: it is +an advisory sweep that never parses a file whose root carries a structural key +(`children`, `className`, `body`, …), lists a file with none of those keys by name +when the file does not validate, and exits non-zero on unreadable JSON only. From 1da91cb5e3b4c90734d687d0788ecaf94c3f059f Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 25 Sep 2026 11:02:20 +0000 Subject: [PATCH 3/4] fix(types): name `validate` alone where the objectql comments said `validate`/`check` refuses Three comments in `@object-ui/types` said a refusal reaches the CLI's `validate` / `check`: the `ObjectGanttSchema.gantt` comment on the interface and on its zod mirror, and the `ObjectCalendarSchema` `sort` comment on the zod mirror (which ships in `dist/zod/objectql.zod.js`). `check` refuses nothing on validation, so each now names `validate` alone. Comment lines only. The new changeset now says `check` skips the parse against the schema, not the parse, and names these three comments. Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN Co-authored-by: Claude --- .changeset/10524-check-promise-text.md | 24 ++++++++++++++---------- packages/types/src/objectql.ts | 2 +- packages/types/src/zod/objectql.zod.ts | 4 ++-- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/.changeset/10524-check-promise-text.md b/.changeset/10524-check-promise-text.md index f1a79e2df1..2278666fab 100644 --- a/.changeset/10524-check-promise-text.md +++ b/.changeset/10524-check-promise-text.md @@ -3,23 +3,27 @@ '@object-ui/types': patch --- -`objectui check`'s help line and three `@object-ui/types` docblocks no longer present `check` -as a validator (objectui#10524). +`objectui check`'s help line and five `@object-ui/types` comments no longer present `check` as a +validator (objectui#10524). - `@object-ui/cli`: `objectui --help` and `objectui check --help` described `check` as "Validate schema files". It now reads "Advisory JSON file sweep; run objectui validate for a verdict". `check` itself is unchanged. It sweeps the project's JSON files and recognises a file whose root carries a structural key (`children`, `className`, `body`, …) by that key - alone, without parsing it. It parses only a file with none of those keys, and lists it by name - when its root `type` names a registered component but the document does not validate. That - list is advisory: `check` exits non-zero on unreadable JSON only. The verdict is - `objectui validate`'s: it parses one document against the published schema, prints the - schema's own errors and exits non-zero. + alone, without parsing it against the schema. It parses against the schema only a file with + none of those keys, and lists it by name when its root `type` names a registered component but + the document does not validate. That list is advisory: `check` exits non-zero on unreadable + JSON only. The verdict is `objectui validate`'s: it parses one document against the published + schema, prints the schema's own errors and exits non-zero. - `@object-ui/types`: the `ChatbotSchema.body` docblock said the retired key's refusal comes from "a root parse (`objectui validate` / `objectui check`, …)". `body` is itself one of the - structural keys, so `check` never parses a `chatbot` document that authors it. The docblock - now names `objectui validate` alone and says why `check` does not deliver the refusal. The two + structural keys, so `check` never parses a `chatbot` document that authors it against the + schema. The docblock now names `objectui validate` alone and says why `check` does not deliver + the refusal. The two `SemanticElementSchema` docblocks (the interface and its zod mirror) said a document was - refused by `objectui check`; they now name `objectui validate`, whose refusal it was. + refused by `objectui check`; they now name `objectui validate`, whose refusal it was. The + `ObjectGanttSchema.gantt` comments (the interface and its zod mirror) and the + `ObjectCalendarSchema` `sort` comment in the zod mirror said the refusal reaches the CLI's + `validate` / `check`; they now name `validate` alone. A help string and comments only: no command's behaviour, export, type or schema moves. diff --git a/packages/types/src/objectql.ts b/packages/types/src/objectql.ts index efe2595f4a..e605921677 100644 --- a/packages/types/src/objectql.ts +++ b/packages/types/src/objectql.ts @@ -3232,7 +3232,7 @@ export interface ObjectGanttSchema extends BaseSchema { // PARSED, and `GanttConfig` derives from the spec's `GanttConfigSchema`, which // REQUIRES `startDateField`, `endDateField` and `titleField`. Because // `ObjectGanttSchema` is a member of `AnyComponentSchema`, that reaches - // `safeValidateSchema` and therefore the CLI's `validate` / `check` commands: a + // `safeValidateSchema` and therefore the CLI's `validate` command: a // block missing one of the three moves from "accepted, then warned about at // runtime" to "refused at authoring time". // diff --git a/packages/types/src/zod/objectql.zod.ts b/packages/types/src/zod/objectql.zod.ts index 2176166f03..f3448a803c 100644 --- a/packages/types/src/zod/objectql.zod.ts +++ b/packages/types/src/zod/objectql.zod.ts @@ -1956,7 +1956,7 @@ export const ObjectGanttSchema = BaseSchema.extend({ // `gantt` block previously rode through `.passthrough()` entirely unvalidated; // now it is PARSED against the spec's `GanttConfigSchema`, which REQUIRES // `startDateField`/`endDateField`/`titleField`. This mirror reaches the CLI's - // `validate`/`check` through `AnyComponentSchema` → `safeValidateSchema`, so a + // `validate` through `AnyComponentSchema` → `safeValidateSchema`, so a // block missing the trio moves from "accepted, then warned about at runtime" // to "refused at authoring time" — a `declared = enforced` restoration, not // new requiredness: the renderer already fed the block to @@ -2085,7 +2085,7 @@ export const ObjectCalendarSchema = BaseSchema.extend({ // index-signature ceiling: that ceiling is about a MISSPELLED key, which // stays admitted either way. A DECLARED key is now VALUE-validated, and this // mirror reaches `safeValidateSchema` through `AnyComponentSchema` and so - // reaches the CLI's `validate` / `check` — `sort: 'name asc'`, the string + // reaches the CLI's `validate` — `sort: 'name asc'`, the string // clause objectui#8221 retired, moves from "parses green here, then silently // dropped by `convertSortToQueryParams` at runtime" to "refused at authoring // time". From 882c5e13ebb6b1b254bbec841ca412491b478cb4 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 25 Sep 2026 11:22:35 +0000 Subject: [PATCH 4/4] docs(changeset): the dated notes say `check` skips the schema parse, not the JSON parse `check` reads every `.json` through `parseJsonc`, and unreadable JSON still fails the run even when the root carries a structural key. What it skips is the parse against the schema. The 11 dated notes now say "never parses against the schema". The new changeset's headline counts six comment sites, not five. Front matter is unchanged in all 12 files. Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN Co-authored-by: Claude --- .changeset/10478-filter-condition-value-protocol-rule.md | 2 +- .changeset/10524-check-promise-text.md | 2 +- .changeset/6475-gantt-block-face-declared.md | 2 +- .changeset/7694-chart-series-chart-type-alias-refusal.md | 2 +- .changeset/8466-calendar-color-allday-fields.md | 2 +- .changeset/8499-node-slot-registered-arms.md | 2 +- .changeset/8505-grid-columns-breakpoint-narrowing.md | 2 +- .changeset/8572-chatbot-body-retired.md | 2 +- .changeset/9239-object-calendar-data-array-arm.md | 2 +- .changeset/9511-record-id-is-a-string.md | 2 +- .changeset/9559-filter-operator-schema-protocol-set.md | 2 +- .changeset/9746-render-path-not-a-validation-door.md | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.changeset/10478-filter-condition-value-protocol-rule.md b/.changeset/10478-filter-condition-value-protocol-rule.md index fd7e05ec2e..2f00e6898e 100644 --- a/.changeset/10478-filter-condition-value-protocol-rule.md +++ b/.changeset/10478-filter-condition-value-protocol-rule.md @@ -37,7 +37,7 @@ stays `any`. ⚠️ **Dated note, 2026-09-25 — `objectui check` does not fail such a document — objectui#10524.** This entry first listed `objectui check` beside `objectui validate`. -`check` is an advisory sweep: it never parses a file whose root carries a structural key +`check` is an advisory sweep: it never parses against the schema a file whose root carries a structural key (`children`, `className`, `body`, …), it lists a file with none of those keys by name when the file does not validate, and it exits non-zero on unreadable JSON only. The verdict is `objectui validate`'s. The "answered green" sentence at the top of this entry stays true diff --git a/.changeset/10524-check-promise-text.md b/.changeset/10524-check-promise-text.md index 2278666fab..33f443b9bc 100644 --- a/.changeset/10524-check-promise-text.md +++ b/.changeset/10524-check-promise-text.md @@ -3,7 +3,7 @@ '@object-ui/types': patch --- -`objectui check`'s help line and five `@object-ui/types` comments no longer present `check` as a +`objectui check`'s help line and six `@object-ui/types` comments no longer present `check` as a validator (objectui#10524). - `@object-ui/cli`: `objectui --help` and `objectui check --help` described `check` as diff --git a/.changeset/6475-gantt-block-face-declared.md b/.changeset/6475-gantt-block-face-declared.md index ad137587b2..e8d61a85f6 100644 --- a/.changeset/6475-gantt-block-face-declared.md +++ b/.changeset/6475-gantt-block-face-declared.md @@ -38,7 +38,7 @@ schema with no `gantt` block at all, is accepted exactly as before. ⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal — objectui#10524.** This entry first named the CLI's `check` command beside `validate`, here and in its heading. `check` is an advisory sweep: it never -parses a file whose root carries a structural key (`children`, `className`, +parses against the schema a file whose root carries a structural key (`children`, `className`, `body`, …), it lists a file with none of those keys by name when the file does not validate, without naming the missing field, and it exits non-zero on unreadable JSON only. The refusal is `objectui validate`'s. diff --git a/.changeset/7694-chart-series-chart-type-alias-refusal.md b/.changeset/7694-chart-series-chart-type-alias-refusal.md index 302c87b331..926657bee1 100644 --- a/.changeset/7694-chart-series-chart-type-alias-refusal.md +++ b/.changeset/7694-chart-series-chart-type-alias-refusal.md @@ -35,7 +35,7 @@ it is named here in the words a release reader can act on: ⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal — objectui#10524.** This entry first named the CLI's `objectui check` command beside `objectui validate` as a place -authors meet the refusal. `check` is an advisory sweep: it never parses a file whose root carries a +authors meet the refusal. `check` is an advisory sweep: it never parses against the schema a file whose root carries a structural key (`children`, `className`, `body`, …), it lists a file with none of those keys by name when the file does not validate, without the issue, and it exits non-zero on unreadable JSON only. The refusal is `objectui validate`'s. The source citations in this entry now name files diff --git a/.changeset/8466-calendar-color-allday-fields.md b/.changeset/8466-calendar-color-allday-fields.md index bc1f86554f..fa689ee0dc 100644 --- a/.changeset/8466-calendar-color-allday-fields.md +++ b/.changeset/8466-calendar-color-allday-fields.md @@ -50,7 +50,7 @@ the CLI's `validate` takes. That is why this is a `minor` and not a ⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal — objectui#10524.** This entry first named the CLI's `check` command beside -`validate`. `check` is an advisory sweep: it never parses a file whose root +`validate`. `check` is an advisory sweep: it never parses against the schema a file whose root carries a structural key (`children`, `className`, `body`, …), it lists a file with none of those keys by name when the file does not validate, and it exits non-zero on unreadable JSON only. The refusal is `objectui validate`'s. diff --git a/.changeset/8499-node-slot-registered-arms.md b/.changeset/8499-node-slot-registered-arms.md index 09484a2662..7128a6df7d 100644 --- a/.changeset/8499-node-slot-registered-arms.md +++ b/.changeset/8499-node-slot-registered-arms.md @@ -17,7 +17,7 @@ expensive direction: the likely reaction is to stop trusting the validator. ⚠️ **Dated note, 2026-09-25 — the refusal was `objectui validate`'s, not `objectui check`'s — objectui#10524.** This entry first named `objectui check` here. -`check` is an advisory sweep: it never parses a file whose root carries a structural +`check` is an advisory sweep: it never parses against the schema a file whose root carries a structural key (`children`, `className`, `body`, …), so the page document above passes it, and it exits non-zero on unreadable JSON only. The "Downstream" paragraph below is about `check`'s advisory list of files with none of those keys, and stands. diff --git a/.changeset/8505-grid-columns-breakpoint-narrowing.md b/.changeset/8505-grid-columns-breakpoint-narrowing.md index 30494c5c06..c418152e6a 100644 --- a/.changeset/8505-grid-columns-breakpoint-narrowing.md +++ b/.changeset/8505-grid-columns-breakpoint-narrowing.md @@ -49,6 +49,6 @@ it no longer asserts acceptance. ⚠️ **Dated note, 2026-09-25 — `objectui check` is not part of that JSON face — objectui#10524.** This paragraph first named the face `os-ui validate` / `check`. The command is `objectui validate`, and `check` does not refuse `{ xxl: 6 }`: it is -an advisory sweep that never parses a file whose root carries a structural key +an advisory sweep that never parses against the schema a file whose root carries a structural key (`children`, `className`, `body`, …), lists a file with none of those keys by name when the file does not validate, and exits non-zero on unreadable JSON only. diff --git a/.changeset/8572-chatbot-body-retired.md b/.changeset/8572-chatbot-body-retired.md index 9303eb0678..1c12f8db8b 100644 --- a/.changeset/8572-chatbot-body-retired.md +++ b/.changeset/8572-chatbot-body-retired.md @@ -78,7 +78,7 @@ different change on a different package and is not made here. ⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal — objectui#10524.** This entry first listed `objectui check` among the places the retirement is delivered. `body` is itself one of the structural root keys `check` recognises a file by, -and `check` never parses a file it recognised that way, so a `chatbot` document authoring +and `check` never parses against the schema a file it recognised that way, so a `chatbot` document authoring `body` at its root passes `check` and exits 0. `check` exits non-zero on unreadable JSON only. The refusal is `objectui validate`'s; the `ChatbotSchema.body` docblock in `@object-ui/types` now says the same. diff --git a/.changeset/9239-object-calendar-data-array-arm.md b/.changeset/9239-object-calendar-data-array-arm.md index 85c1f4d995..00a28b7013 100644 --- a/.changeset/9239-object-calendar-data-array-arm.md +++ b/.changeset/9239-object-calendar-data-array-arm.md @@ -14,7 +14,7 @@ After objectui#8348 put the renderer on the protocol's side (maintainer ruling, - `ObjectCalendarSchema` (Zod mirror, reached by `safeValidateSchema` and so by the CLI's `validate`): `ViewDataSchema.optional()` becomes `z.array(z.unknown()).optional()`. The config object is now refused AT the key; an array is accepted. - Requiredness is unchanged — optional on both faces, as before — so the `zod-mirror-parity` ratchet is unmoved. -⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal — objectui#10524.** This entry first named the CLI's `check` command beside `validate`. `check` is an advisory sweep: it never parses a file whose root carries a structural key (`children`, `className`, `body`, …), it lists a file with none of those keys by name when the file does not validate, and it exits non-zero on unreadable JSON only. The refusal is `objectui validate`'s. +⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal — objectui#10524.** This entry first named the CLI's `check` command beside `validate`. `check` is an advisory sweep: it never parses against the schema a file whose root carries a structural key (`children`, `className`, `body`, …), it lists a file with none of those keys by name when the file does not validate, and it exits non-zero on unreadable JSON only. The refusal is `objectui validate`'s. ⛔ **The accept set genuinely shrinks. That is the point**, and it is a narrowing onto a contract `@objectstack/spec` already publishes, not a new dialect: every document this declaration now refuses was already refused by the protocol, by `os validate`, by the save gate and by the renderer. Nothing that renders today stops rendering because of this change — objectui#8348 is where the runtime behaviour moved. diff --git a/.changeset/9511-record-id-is-a-string.md b/.changeset/9511-record-id-is-a-string.md index 17d2685500..65e87511c2 100644 --- a/.changeset/9511-record-id-is-a-string.md +++ b/.changeset/9511-record-id-is-a-string.md @@ -85,7 +85,7 @@ arrives. ⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal — objectui#10524.** This entry first listed `objectui check` on the parse-time side. `check` is -an advisory sweep: it never parses a file whose root carries a structural key (`children`, +an advisory sweep: it never parses against the schema a file whose root carries a structural key (`children`, `className`, `body`, …), it lists a file with none of those keys by name when the file does not validate, and it exits non-zero on unreadable JSON only. The refusal is `objectui validate`'s. diff --git a/.changeset/9559-filter-operator-schema-protocol-set.md b/.changeset/9559-filter-operator-schema-protocol-set.md index 3f82b8af51..1940b48479 100644 --- a/.changeset/9559-filter-operator-schema-protocol-set.md +++ b/.changeset/9559-filter-operator-schema-protocol-set.md @@ -13,7 +13,7 @@ accept (objectui#9559, ruling B). ⚠️ **Dated note, 2026-09-25 — `objectui check` did not refuse them — objectui#10524.** This entry first listed `objectui check` beside `objectui validate`. `check` is an -advisory sweep: it never parses a file whose root carries a structural key (`children`, +advisory sweep: it never parses against the schema a file whose root carries a structural key (`children`, `className`, `body`, …), it lists a file with none of those keys by name when the file does not validate, and it exits non-zero on unreadable JSON only. The verdict is `objectui validate`'s. diff --git a/.changeset/9746-render-path-not-a-validation-door.md b/.changeset/9746-render-path-not-a-validation-door.md index bd5f9f8229..15b9c858b5 100644 --- a/.changeset/9746-render-path-not-a-validation-door.md +++ b/.changeset/9746-render-path-not-a-validation-door.md @@ -17,7 +17,7 @@ section. ⚠️ **Dated note, 2026-09-25 — `objectui check` is not a validation door — objectui#10524.** Later in this same release objectui#10416 corrected the section: its second door is now `objectui validate` alone, and it says what `objectui check` does instead. `check` is an -advisory sweep: it never parses a file whose root carries a structural key (`children`, +advisory sweep: it never parses against the schema a file whose root carries a structural key (`children`, `className`, `body`, …), it lists a file with none of those keys by name when the file does not validate, and it exits non-zero on unreadable JSON only.