Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions .changeset/10478-filter-condition-value-protocol-rule.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 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
of `check`, before this change and after it.
29 changes: 29 additions & 0 deletions .changeset/10524-check-promise-text.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
'@object-ui/cli': patch
'@object-ui/types': patch
---

`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
"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 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 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. 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.
12 changes: 10 additions & 2 deletions .changeset/6475-gantt-block-face-declared.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 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.

**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
Expand Down
21 changes: 14 additions & 7 deletions .changeset/7694-chart-series-chart-type-alias-refusal.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,20 +27,27 @@ 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 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
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.

## 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,
Expand Down
9 changes: 8 additions & 1 deletion .changeset/8466-calendar-color-allday-fields.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 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.

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
Expand Down
9 changes: 8 additions & 1 deletion .changeset/8499-node-slot-registered-arms.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 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.

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
Expand Down
11 changes: 9 additions & 2 deletions .changeset/8505-grid-columns-breakpoint-narrowing.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 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.
14 changes: 11 additions & 3 deletions .changeset/8572-chatbot-body-retired.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 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.

**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
Expand Down
4 changes: 3 additions & 1 deletion .changeset/9239-object-calendar-data-array-arm.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 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.

**What does NOT change**
Expand Down
15 changes: 11 additions & 4 deletions .changeset/9511-record-id-is-a-string.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 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.

**Consequential narrowings, all compiler-forced by the door above.** `DrawerForm`,
`ModalForm`, `SplitForm`, `TabbedForm` and `WizardForm` each declare their own `recordId` and
Expand Down
13 changes: 10 additions & 3 deletions .changeset/9559-filter-operator-schema-protocol-set.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 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.

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
Expand Down
Loading
Loading