Skip to content

Commit c2d8659

Browse files
fix(cli,types): say what objectui check does; name objectui validate for the verdict (objectui#10524) (#10595)
Fixes #10524 Clause-②: no Wording only, on published text: a help string in `@object-ui/cli` and six comments in five `@object-ui/types` files. No export, type, schema or accept set moves. `check` itself is unchanged: objectui#6318 recorded its behaviour as deliberate, and whether it should parse the files it admits is that card's open question, not this one. The house wording is the one PR objectui#10523 used for the two docs pages: `check` sweeps a 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 is still read as JSON). Only a file with none of those keys is parsed against the schema. It is listed by name when its root `type` names a registered component but the document does not validate, and that list is advisory: `check` exits non-zero on unreadable JSON only. The verdict is `objectui validate`'s. ## What changed | file | change | | --- | --- | | `packages/cli/src/cli.ts` | H1. The `check` command's description changes from "Validate schema files" to "Advisory JSON file sweep; run objectui validate for a verdict" (61 characters; the longest sibling description has 57). The line count does not change. | | `packages/types/src/complex.ts` | H2. In the `ChatbotSchema.body` tombstone docblock, the root-parse parenthetical now names only `objectui validate`. A new sentence says `check` does not deliver the refusal: `body` is a structural root key, and `check` never parses a file it recognised that way against the schema. One line changed and three added. `body?: never` and every other line are byte-identical. | | `packages/types/src/layout.ts` | H3 hit. The `SemanticElementSchema` docblock said the document "was refused by `objectui check`". It now says `objectui validate`, whose refusal it was. One word changed. | | `packages/types/src/zod/layout.zod.ts` | H3 hit. The same sentence in the zod mirror's docblock ("REFUSED by `objectui check` … stop trusting the validator") now names `objectui validate`. One word changed. | | `packages/cli/src/__tests__/cli-bin.test.ts` | H5 pin, 2 cases. `check --help` must not lead with the verb "validate", and it must name `objectui validate`. Both are red on the base and green at the head (evidence below). | | `packages/types/src/zod/objectql.zod.ts` | Rework-round hits (contract review, comment 5831281522). The `ObjectGanttSchema.gantt` comment ("reaches the CLI's `validate`/`check` … refused at authoring time") and the `ObjectCalendarSchema` `sort` comment ("reaches the CLI's `validate` / `check` — `sort: 'name asc'` …") now name `validate` alone. These are `//` comments, and they ship in `dist/zod/objectql.zod.js`. Two lines changed; `git diff -w` shows no code line. | | `packages/types/src/objectql.ts` | Rework-round hit, the source twin of `.changeset/6475`. The `ObjectGanttSchema.gantt` comment ("therefore the CLI's `validate` / `check` commands") now reads "the CLI's `validate` command". One comment line changed, and it is source-only (a `//` comment on an interface member is dropped from `.d.ts`). The seat decided to fix it here; this seat's other PRs edit this file far from this line. | | `.changeset/10524-check-promise-text.md` | new: `'@object-ui/cli': patch`, `'@object-ui/types': patch`. The rework rounds tightened it: `check` skips the parse against the schema, not the JSON parse; it names the three objectql comments; and its headline counts six comment sites. | | 11 pending `.changeset/*.md` | H4 reconciliations, listed below. Front matter md5 is identical before and after for every file. | ## Measurement on the base `6ea68e63e` The CLI's dependency closure was built with `pnpm --workspace-concurrency=2 --filter "@object-ui/cli..." build`. `objectui --help` listed `check Validate schema files`, and `objectui check --help` printed `Validate schema files`. Probe documents, one directory each: | document | `objectui validate` | `objectui check` over its directory | | --- | --- | --- | | `{ "type": "chatbot", "messages": [], "body": { "tenant": "acme" } }` | exit 1: `REFUSED (objectui#8572, ADR-0049)`, `Path: body` | exit 0. The file is not mentioned, and the run ends with `✓ All checks passed`. | | `{ "type": "chatbot", "messages": "not-an-array" }` (control, no structural key) | exit 1 | exit 0. The file is listed as `carries a registered ObjectUI component type but did not validate`. | So the card's premise holds at the base. `check` admits `chatbot-body.json` by its `body` key and never parses it against the schema. In `check`'s own output, `objectui validate FILE` stands for the angle-bracket placeholder the CLI prints, because GitHub's body sanitizer deletes that shape. ## H5: the pin is red on the base and green at the head I committed the fix first (`dbbd2506e`). For the base leg, `scripts/ablation-replace.mjs` (from the objectstack checkout, in wrap mode, with a `trap … EXIT INT TERM` restore as a second guard) put the base description back into `cli.ts`. It reported anchor `x1 -> x0`, replacement `x0 -> x1` and blob `3b73365ae916 -> 165ca5b`. Then the leg rebuilt `@object-ui/cli` and grepped `dist/cli.js`: new text 0 hits, base text 1 hit. - Base leg: `Tests 2 failed | 38 passed (40)`. The failures were `expected 'Validate schema files' not to match /^\s*validates?\b/i` and `expected 'Validate schema files' to contain 'objectui validate'`. - Restore: the blob equals HEAD's `3b73365ae916` and `git diff HEAD` is empty. After a rebuild, `dist/cli.js` has 1 hit for the new text and 0 for the base text. - Head leg: `Test Files 1 passed (1)`, `Tests 40 passed (40)`, and both `check --help does not present ... (objectui#10524)` cases pass. `git status --porcelain` shows 0 lines. The JSDoc edits carry no pin. They are comments, and I checked them in the built output instead: `dist/complex.d.ts` has 1 hit for "`objectui check` does not deliver it", `dist/layout.d.ts` has 1 for "refused by `objectui validate`", `dist/zod/layout.zod.d.ts` has 1 for "REFUSED by `objectui validate`", and the two layout files have 0 remaining hits for `objectui check`. After the rework round, `dist/zod/objectql.zod.js` has 0 hits for `validate` / `check` in either spelling. Its positive control, "reaches the CLI's `validate` — `sort: 'name asc'`", has 1 hit. ## H4: pending changesets that name `check` I read every paragraph in `.changeset/` that names `check`: the literal "objectui check", plus `check` in backticks and mentions wrapped across a line break. The test I applied: does the sentence tell an author that `check` gives a verdict (refuses, fails, delivers the refusal)? A sentence that only says `check` calls `safeValidateSchema` or answers green is true, so it stands. **Reconciled (11).** Each file now names `objectui validate` for the verdict and gains a `⚠️ **Dated note, 2026-09-25 — … — objectui#10524.**` saying what `check` does. Round 3 tightened every note: `check` "never parses against the schema" a file whose root carries a structural key, because it still reads that file as JSON and fails the run when the JSON is unreadable. Front matter is byte-identical in all 12 changesets this PR touches: - `10478-filter-condition-value-protocol-rule.md`: "now fails `safeValidateSchema`, `objectui check` and `objectui validate`". Its "answered green" sentence stays true of `check`, and the note says so. - `6475-gantt-block-face-declared.md`: the heading's "validate/check time" and "the CLI's `validate` and `check` commands … **refused**, naming the missing field". - `7694-chart-series-chart-type-alias-refusal.md`: "Authors meet it … through the CLI's `objectui check` and `objectui validate` commands". Because this file was touched anyway, its five cross-file `path:line` citations became file names (AGENTS.md #11). The "Before" bullet stands. - `8466-calendar-color-allday-fields.md`: "refused … through `safeValidateSchema`, the path the CLI's `validate` / `check` take". - `8499-node-slot-registered-arms.md`: "renders correctly in the browser and is refused by `objectui check`". Its "Downstream" paragraph is about the advisory list and stands. - `8505-grid-columns-breakpoint-narrowing.md`: "the JSON authoring face — `os-ui validate` / `check` … now refuses `{ xxl: 6 }`". The command's name is also corrected to `objectui validate` in the same clause. - `8572-chatbot-body-retired.md`: "(`tsc`, `objectui validate`, `objectui check`, …)". This is the changeset twin of the H2 docblock. - `9239-object-calendar-data-array-arm.md`: "reached by `safeValidateSchema` and so by the CLI's `validate` / `check` … refused AT the key". - `9511-record-id-is-a-string.md`: its "Delivery surface" paragraph listed `objectui check` on the parse-time side. - `9559-filter-operator-schema-protocol-set.md`: "(and `objectui check` / `objectui validate`) refused filters". - `9746-render-path-not-a-validation-door.md` (empty front matter): "the three doors that do validate (…; `objectui validate` / `objectui check`; …)". Here the objectui#10533 "at this change" scoping is used, because the section did say that at that change. The note records the later correction by objectui#10416. A deviation from H4 as dispatched: for the other ten I did not use "at this change" scoping. Those sentences were never true of `check`, so scoping them would assert a false history. The sentence is corrected instead, and the dated note records the correction. **Read, and left as they are.** Each of these is either true of `check` or is not a verdict claim: - `6074`: "judges, skips and prints exactly what it did before". - `6075`: recognition by validation, and the advisory report. - `6320`: the glob ignore list. - `7004`: `.success` used as a boolean recogniser. - `7113` ("the `chart: 2` entry in `objectui check`'s 28-file census") and `6939` ("`objectui check` counts four for this row"): both are counts of the advisory list. In the filter-builder case, the four leaf fixtures carry no structural key and `search-interface.json` carries `children` and `className`, so the count is right. - `6051`, `7664`, `8344`: `check` calls `safeValidateSchema`. That is true of the validity arm, and none of these three attributes a refusal to `check`. - `8516`: `check` "was passing documents `tsc` rejects", which is true. - `8802` ("will NOT flag either namespaced spelling"), `9641` and `unknown-component-type-case-suggestion-5247`: they describe the unknown-type warning for recognised files. - `check-schema-positive-marker-and-skip-count`: the marker gate. - `6724`: `ctx.check` is the permissions API, not the CLI. - `10393`, `8760`, `9533`: these describe the unknown-type warning, not a validation verdict, so H4 does not cover them. Their bare-document examples are the finding below. ## Other places that make the same promise (H3), swept again in the rework round The first sweep of package sources used only the literal `objectui check`, so it missed three sentences written as the CLI's `validate`/`check`. The rework sweep ran over `packages/cli` and `packages/types` sources, excluding tests and CHANGELOGs, with three passes: 1. `git grep` for the literal `objectui check`, backticked `check`, `/ check`, `check command(s)` and `'check'`. 2. `git grep` for `check` within 40 characters of `validate`, `CLI` or `refus`. 3. A node scan across line breaks, for `validate` / `check` pairs wrapped over a comment line, and `CLI's … check`. On the head, pass 3 has 0 hits. Its positive control is the pre-fix blobs of `objectql.zod.ts` and `objectql.ts`, which give 2 and 1 hits. Every hit I read, with its verdict: | hit | verdict | | --- | --- | | `zod/objectql.zod.ts`, the `ObjectGanttSchema.gantt` comment ("`validate`/`check` … refused at authoring time") | changed: names `validate` alone | | `zod/objectql.zod.ts`, the `ObjectCalendarSchema` `sort` comment ("`validate` / `check` — `sort: 'name asc'` … refused at authoring time") | changed: names `validate` alone | | `objectql.ts`, the `ObjectGanttSchema.gantt` comment ("the CLI's `validate` / `check` commands … refused at authoring time") | changed: names `validate` alone | | `complex.ts`, the `ChatbotSchema.body` docblock | this PR's own sentence ("`objectui check` does not deliver it") | | `layout.ts` and `zod/layout.zod.ts`, the `SemanticElementSchema` docblocks | changed in round 1 | | `data-display.ts` `BarChartSchema` ("`objectui check` reports it as unrecognised") and `zod/data-display.zod.ts` ("could only report it") | stands: describes the advisory list, not a verdict | | `form.ts` `CodeEditorSchema` ("the validator `objectui validate` and `objectui check` read") | stands: `check` reads `AnyComponentSchema` as its recogniser | | `strict-authoring-face.ts` (wiring `objectui check` "is ruled to come after") | stands: future wiring, no present claim | | `zod/complex.zod.ts` (`safeValidateSchema`, `objectui check` and `objectui validate` "answered green") | stands: true of `check`; the file is held by another seat and not touched | | `packages/cli/README.md`, the heading "`objectui check`, `objectui doctor`, …" | stands: defers to `objectui --help` | | `packages/cli/src/cli.ts`, `.command('check')` | the command registration; its description is the H1 line | | `check.ts`: "`objectui check` judged every root `type`", "the reason `check` reports a third bucket", "the `objectui check` command passes", "`objectui check` exited 1 in any TypeScript project" | stand: the marker gate's history, the advisory bucket, the `cwd` parameter, and the JSONC parse arm, all true | | `known-schema-types.ts` ("`objectui check` uses it", "reports an unrecognised type as a warning and never fails the run") | stands: true | | `known-type-case-suggestion.ts` ("Did you mean for `objectui check`", "`check` still reports `Page` as an unknown schema type", "the suggestion clause `objectui check` appends") | stands for this card: the unknown-type warning, not a validation verdict. It has the same recognised-files-only boundary as the finding below. It is an internal comment. | | `union-arm-diagnostics.ts` ("a DIFFERENT surface (`objectui check`)") | stands: names the surface | | `index.ts` `name:'check'`, `layout.ts` "`check`, `arrow-right`", `zod/layout.zod.ts` `icon:'check'` (four lines) | not the CLI: the lucide glyph name | | `data-protocol.ts` "PRE-CHECK", `strict-authoring-face.ts` "such a check can only ADD refusals", `zod/complex.zod.ts` "the type check (`id: 42` now refuses)", `zod/objectql.zod.ts` "`.check()` refusing `kanban.groupBy`" and "Until this check" | not the CLI: refinements and value checks | ## Gates ### Round 3, head `882c5e13e` (changeset text only) `git diff --stat 1da91cb..882c5e1` lists 12 `.changeset/*.md` files, 12 insertions and 12 deletions, and nothing else. Front matter md5 is identical before and after for all 12. `git merge-tree --write-tree HEAD origin/main` (main at `ab7751321`) exits 0 with tree `dab078939`. None of main's moved files is a file this PR touches. | gate | verdict line | exit | | --- | --- | --- | | `node scripts/check-changeset-presence.mjs` | `✅ 7 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s): .changeset/10524-check-promise-text.md.` | 0 | | `node scripts/check-changeset-overwrite.mjs` (report-only) | `⚠️ This change touches 11 changeset(s) it did not add`, with all 11 declared-at-base / declares-now pairs identical | 0 | | `node scripts/check-changeset-fixed.mjs` | `✅ All workspace packages are in the changeset fixed group.` | 0 | | `node scripts/check-changeset-claims.mjs` (report-only) | `✅ Every package declared across those 11 body(ies) is either not negated …`. It lists 43 pending changesets naming a touched file; none is about `check`, the gantt block refusal or the calendar `sort` clause. | 0 | | `node scripts/check-new-cross-file-line-citations.mjs` | `VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0` | 0 | | `node scripts/check-control-bytes.mjs` | `✅ check-control-bytes: OK (scanned 8669 tracked text file(s); skipped 85 binary).` | 0 | ### Package gates, head `1da91cb5e` (no package file has changed since) | gate | verdict line | exit | | --- | --- | --- | | `pnpm --filter "@object-ui/cli..." build` (closure, under the verify lock) | `dist/cli.js` has 1 hit for the new text and 0 for the base text | 0 | | `pnpm --filter @object-ui/types type-check` (`tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json`) | no diagnostics | 0 | | `pnpm --filter @object-ui/cli type-check` (`tsc --noEmit`) | no diagnostics | 0 | | `pnpm exec vitest run packages/types/` | `Test Files 236 passed (236)` · `Tests 5223 passed (5223)` | 0 | | `pnpm exec vitest run packages/cli/` | `Test Files 20 passed (20)` · `Tests 279 passed (279)` | 0 | | `node scripts/check-changeset-no-major.mjs` | `✅ No changeset declares a `major` bump.` | 0 | At that head, `git merge-tree` exited 0 against main (`a7df45ff1`), against PR #10588's head `313ca6321`, and against `claude/issue-10518-object-chart-axis-config`. Round-1 readings that the rework does not move stand at `bf809e6c5`: the red-then-green pin (`cli.ts` and `cli-bin.test.ts` are unchanged since then), the lint subset, `pnpm check`, the installed-pin and pending-literal gates, the disk-reading tests, and the governed-surface guard. ## Acceptance notes These are not filed. - Some test comments still say `check` refuses or validates: the header of `node-slot-registered-arms-8499.test.ts`, one comment in `filter-builder-mirror-6939.test.ts`, and the headers of `filter-condition-value-protocol-rule-10478.test.ts` and `chart-data-model-7113.test.ts`. Tests are not published, and no assertion depends on those comments. - `7546-chart-series-keys-declared.md` counts `objectui check` among the consumers of the parse output. `check` reads only `.success`, so it loses nothing. That sentence does not claim a verdict. - `7773-kanban-adapter-groupfield-write.md` names `os check` / `os validate`, which is not this CLI. It was not measured. - `8516-8556-mirror-partial-record-narrowing.md` spells the CLI as `os-ui validate`, and the bin is `objectui`. Its `check` clause is true. - In `check.ts`, the inline comment "Schema validation: check for ObjectUI schema patterns" is a code comment that ships in no user-facing output. It is outside this file surface. ## For the seat - File surface: `layout.ts`, `zod/layout.zod.ts`, `objectql.ts` and `zod/objectql.zod.ts` are H3 hits inside `@object-ui/types`. `objectql.ts` is here by seat decision. Each edit is confined to its comment lines, away from the lines PR #10588 and the objectui#10518 branch edit. `git merge-tree --write-tree` of this head against PR #10588's head `313ca6321` exits 0, and against `claude/issue-10518-object-chart-axis-config` it also exits 0. The claim comment's surface names only the `complex.ts` docblock, so it needs these four paths appended. - A finding outside this card: `.changeset/8760-unfulfilled-chart-stubs.md` says `{ "type": "line-chart" }` makes `objectui check` report `Unknown schema type "line-chart"`, and `.changeset/9533-dashboard-bare-key-converge-plugin-namespace.md` says the same for `{ "type": "view:dashboard" }`. On the base, `check` over those exact bare documents prints `Skipped 2 files with a root "type" that no ObjectUI recogniser admitted.` and exits 0, with no unknown-type line. The control `{ "type": "line-chart", "className": "h-64" }` prints `⚠️ Unknown schema type "line-chart" in line-chart-structural.json`. `10393-retire-bare-map-key.md`'s "so the check now flags it" has the same boundary. This is a claim about how far a diagnostic reaches, not a verdict claim, so the contract review graded it a different family with its own card; the seat filed it as objectui#10606. That card can reuse PR objectui#10523's recognition-gate wording. Written by the dispatched dev for the `domain:ui` seat 2, session `https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN`. --- _Generated by [Claude Code](https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 6c2f3c5 commit c2d8659

19 files changed

Lines changed: 170 additions & 40 deletions

‎.changeset/10478-filter-condition-value-protocol-rule.md‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,15 @@ out of the projection, so it is still required and still accepted. A condition r
3030
for its `field`, `operator` or `id` reports only that issue.
3131

3232
**Breaking in semantics:** a document with a condition the protocol already refused, and
33-
that used to validate, now fails `safeValidateSchema`, `objectui check` and
34-
`objectui validate`. The fix is to author the value the operator takes. Released as
35-
`minor` under this repository's version-alignment rule. The TypeScript types do not
36-
change: `FilterBuilderCondition.value` stays `any`.
33+
that used to validate, now fails `safeValidateSchema` and `objectui validate`. The fix is
34+
to author the value the operator takes. Released as `minor` under this repository's
35+
version-alignment rule. The TypeScript types do not change: `FilterBuilderCondition.value`
36+
stays `any`.
37+
38+
⚠️ **Dated note, 2026-09-25 — `objectui check` does not fail such a document —
39+
objectui#10524.** This entry first listed `objectui check` beside `objectui validate`.
40+
`check` is an advisory sweep: it never parses against the schema a file whose root carries a structural key
41+
(`children`, `className`, `body`, …), it lists a file with none of those keys by name when
42+
the file does not validate, and it exits non-zero on unreadable JSON only. The verdict is
43+
`objectui validate`'s. The "answered green" sentence at the top of this entry stays true
44+
of `check`, before this change and after it.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
---
2+
'@object-ui/cli': patch
3+
'@object-ui/types': patch
4+
---
5+
6+
`objectui check`'s help line and six `@object-ui/types` comments no longer present `check` as a
7+
validator (objectui#10524).
8+
9+
- `@object-ui/cli`: `objectui --help` and `objectui check --help` described `check` as
10+
"Validate schema files". It now reads "Advisory JSON file sweep; run objectui validate for a
11+
verdict". `check` itself is unchanged. It sweeps the project's JSON files and recognises a
12+
file whose root carries a structural key (`children`, `className`, `body`, …) by that key
13+
alone, without parsing it against the schema. It parses against the schema only a file with
14+
none of those keys, and lists it by name when its root `type` names a registered component but
15+
the document does not validate. That list is advisory: `check` exits non-zero on unreadable
16+
JSON only. The verdict is `objectui validate`'s: it parses one document against the published
17+
schema, prints the schema's own errors and exits non-zero.
18+
- `@object-ui/types`: the `ChatbotSchema.body` docblock said the retired key's refusal comes from
19+
"a root parse (`objectui validate` / `objectui check`, …)". `body` is itself one of the
20+
structural keys, so `check` never parses a `chatbot` document that authors it against the
21+
schema. The docblock now names `objectui validate` alone and says why `check` does not deliver
22+
the refusal. The two
23+
`SemanticElementSchema` docblocks (the interface and its zod mirror) said a document was
24+
refused by `objectui check`; they now name `objectui validate`, whose refusal it was. The
25+
`ObjectGanttSchema.gantt` comments (the interface and its zod mirror) and the
26+
`ObjectCalendarSchema` `sort` comment in the zod mirror said the refusal reaches the CLI's
27+
`validate` / `check`; they now name `validate` alone.
28+
29+
A help string and comments only: no command's behaviour, export, type or schema moves.

‎.changeset/6475-gantt-block-face-declared.md‎

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
---
44

55
**`ObjectGanttSchema` now declares the `gantt` BLOCK face — and the spec's
6-
required trio enforces at validate/check time.**
6+
required trio enforces at validate time.**
77

88
The `gantt` nested-block spelling of a gantt config (`{ type: 'object-gantt',
99
gantt: { … } }`) had **no mirror entry at all**: it rode through
@@ -30,11 +30,19 @@ gantt: SpecGanttConfigSchema.extend(GanttConfigExtensionFields).optional(),
3030

3131
**What the CLI now refuses that it accepted before:** `ObjectGanttSchema` is a
3232
member of `AnyComponentSchema`, so it reaches `safeValidateSchema` and
33-
therefore the CLI's `validate` and `check` commands. A `gantt` block missing
33+
therefore the CLI's `validate` command. A `gantt` block missing
3434
any of the three required fields — previously accepted silently — is now
3535
**refused**, naming the missing field. A block carrying all three, or a
3636
schema with no `gantt` block at all, is accepted exactly as before.
3737

38+
⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal —
39+
objectui#10524.** This entry first named the CLI's `check` command beside
40+
`validate`, here and in its heading. `check` is an advisory sweep: it never
41+
parses against the schema a file whose root carries a structural key (`children`, `className`,
42+
`body`, …), it lists a file with none of those keys by name when the file does
43+
not validate, without naming the missing field, and it exits non-zero on
44+
unreadable JSON only. The refusal is `objectui validate`'s.
45+
3846
**This is a `declared = enforced` restoration, not new requiredness.**
3947
`getGanttConfig`'s block branch already fed the block to
4048
`GanttConfigSchema.safeParse` and logged `[ObjectGantt] Invalid gantt

‎.changeset/7694-chart-series-chart-type-alias-refusal.md‎

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,27 @@ it is named here in the words a release reader can act on:
2727
key is not folded onto `type` and no precedence is minted between the two spellings.
2828
- **Which documents to scan.** The narrowing does not stop at `ChartDataSeriesSchema`; it reaches
2929
every document through the parents that embed it — `ChartSchema.series`
30-
(`zod/data-display.zod.ts:622`, `z.array(ChartDataSeriesSchema)`) and, one level further out,
31-
`ReportSectionSchema.chart` (`zod/reports.zod.ts:105`, `ChartSchema.optional()`). Authors meet it
32-
through `safeValidateSchema()` (`zod/index.zod.ts:434`, which parses `AnyComponentSchema`) and
33-
through the CLI's `objectui check` and `objectui validate` commands (`packages/cli/src/cli.ts:211`
34-
and `:223`). In practice: every `chart` node's `series[]`, and every report section whose `chart`
35-
carries one.
30+
(`zod/data-display.zod.ts`, `z.array(ChartDataSeriesSchema)`) and, one level further out,
31+
`ReportSectionSchema.chart` (`zod/reports.zod.ts`, `ChartSchema.optional()`). Authors meet it
32+
through `safeValidateSchema()` (`zod/index.zod.ts`, which parses `AnyComponentSchema`) and
33+
through the CLI's `objectui validate` command (`packages/cli/src/cli.ts`). In practice: every
34+
`chart` node's `series[]`, and every report section whose `chart` carries one.
35+
36+
⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal — objectui#10524.**
37+
This entry first named the CLI's `objectui check` command beside `objectui validate` as a place
38+
authors meet the refusal. `check` is an advisory sweep: it never parses against the schema a file whose root carries a
39+
structural key (`children`, `className`, `body`, …), it lists a file with none of those keys by
40+
name when the file does not validate, without the issue, and it exits non-zero on unreadable JSON
41+
only. The refusal is `objectui validate`'s. The source citations in this entry now name files
42+
rather than line numbers.
3643

3744
This repository's `major` is a cross-repo pin to `@objectstack`'s major, not a severity dial; the
3845
break is announced here, which is the channel that carries it.
3946

4047
## Why a refusal, and not the two alternatives
4148

4249
`chartType` is the renderer's INTERNAL spelling of `type`: the first limb of `normalizeSeries`'
43-
`str(raw.chartType) ?? str(raw.type)` (`@object-ui/plugin-charts`, `normalizeChartSchema.ts:244`),
50+
`str(raw.chartType) ?? str(raw.type)` (`@object-ui/plugin-charts`, `normalizeChartSchema.ts`),
4451
written by the internal-shape producers that hand `dataKey`-shaped arrays straight to
4552
`ChartRenderer` (`ObjectChart`, `DatasetWidget`; `core/utils/chart-presentation` translates authored
4653
`type` *into* it) and by nothing an author writes. Re-measured at implementation time, series-level,

‎.changeset/8466-calendar-color-allday-fields.md‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,16 @@ verdict is a WRONG-TYPED value at a correctly spelled key, which the index
4545
signature and `.passthrough()` used to admit unexamined: `colorField: 0xff0000`
4646
and `allDayField: true` — the field-name-versus-value confusion these keys invite
4747
— are now refused at authoring time and through `safeValidateSchema`, the path
48-
the CLI's `validate` / `check` take. That is why this is a `minor` and not a
48+
the CLI's `validate` takes. That is why this is a `minor` and not a
4949
`patch`.
5050

51+
⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal —
52+
objectui#10524.** This entry first named the CLI's `check` command beside
53+
`validate`. `check` is an advisory sweep: it never parses against the schema a file whose root
54+
carries a structural key (`children`, `className`, `body`, …), it lists a file
55+
with none of those keys by name when the file does not validate, and it exits
56+
non-zero on unreadable JSON only. The refusal is `objectui validate`'s.
57+
5158
Neither key is added to `plugin-calendar`'s registration `inputs`, deliberately:
5259
the forward direction of `apps/console`'s registry/spec parity gate refuses an
5360
`inputs` entry the spec props schema does not accept, and all five flat keys are

‎.changeset/8499-node-slot-registered-arms.md‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,16 @@ Eight were registered renderers with fixtures proving they draw; the ninth
1212
in `scripts/check-doc-component-types.mjs`. A reader following
1313
`content/docs/utilities/runner.mdx`'s own instruction — "copy one, wrap it in a page
1414
document … and save it as `src/app-data/pages/index.json`" — got a document that
15-
**renders correctly in the browser and is refused by `objectui check`**. That is the
15+
**renders correctly in the browser and is refused by `objectui validate`**. That is the
1616
expensive direction: the likely reaction is to stop trusting the validator.
1717

18+
⚠️ **Dated note, 2026-09-25 — the refusal was `objectui validate`'s, not
19+
`objectui check`'s — objectui#10524.** This entry first named `objectui check` here.
20+
`check` is an advisory sweep: it never parses against the schema a file whose root carries a structural
21+
key (`children`, `className`, `body`, …), so the page document above passes it, and it
22+
exits non-zero on unreadable JSON only. The "Downstream" paragraph below is about
23+
`check`'s advisory list of files with none of those keys, and stands.
24+
1825
It was invisible because `check:doc-types` judges a `type` literal against the
1926
RENDERER REGISTRY — the key set whose size that gate prints in its own summary
2027
line — and not against `AnyComponentSchema`. The two faces disagreed by

‎.changeset/8505-grid-columns-breakpoint-narrowing.md‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ authoring spelling, which is where the defect was authored.
3333

3434
**The zod mirror WAS deliberately not narrowed here — corrected in #8573.** This
3535
paragraph said `zod/layout.zod.ts` still validates `columns` as
36-
`z.record(z.string(), z.number())`, so the JSON authoring face — `os-ui validate`
37-
/ `check` in `@object-ui/cli`, the real consumer of these mirrors — still admits
36+
`z.record(z.string(), z.number())`, so the JSON authoring face — `objectui validate`
37+
in `@object-ui/cli`, the real consumer of these mirrors — still admits
3838
`{ xxl: 6 }`. #8573 narrowed that mirror to a partial record over the six
3939
breakpoints (objectui#8516), so the JSON face now refuses `{ xxl: 6 }` exactly as
4040
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
4545
`PER_CHUNK_BASELINE.framework` of `72_245`; and the handoff assertion described
4646
here as holding the current reading visible is flipped to a refusal in #8573, so
4747
it no longer asserts acceptance.
48+
49+
⚠️ **Dated note, 2026-09-25 — `objectui check` is not part of that JSON face —
50+
objectui#10524.** This paragraph first named the face `os-ui validate` / `check`.
51+
The command is `objectui validate`, and `check` does not refuse `{ xxl: 6 }`: it is
52+
an advisory sweep that never parses against the schema a file whose root carries a structural key
53+
(`children`, `className`, `body`, …), lists a file with none of those keys by name
54+
when the file does not validate, and exits non-zero on unreadable JSON only.

‎.changeset/8572-chatbot-body-retired.md‎

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,17 @@ API params for a child node — it names `children` for a key the author spelled
7171
it prescribes adding a `type` to the params. It says the same thing before and after this
7272
change, and in a production build it is not emitted at all. The VS Code extension's
7373
validator is the same shape: its own walker, no mirror. ⇒ the retirement is delivered where
74-
documents are AUTHORED and CHECKED (`tsc`, `objectui validate`, `objectui check`, and any
75-
consumer that calls `safeValidateSchema`), and ⛔ not where they are RENDERED. Making the
76-
render path agree is a different change on a different package and is not made here.
74+
documents are AUTHORED and CHECKED (`tsc`, `objectui validate`, and any consumer that calls
75+
`safeValidateSchema`), and ⛔ not where they are RENDERED. Making the render path agree is a
76+
different change on a different package and is not made here.
77+
78+
⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal —
79+
objectui#10524.** This entry first listed `objectui check` among the places the retirement
80+
is delivered. `body` is itself one of the structural root keys `check` recognises a file by,
81+
and `check` never parses against the schema a file it recognised that way, so a `chatbot` document authoring
82+
`body` at its root passes `check` and exits 0. `check` exits non-zero on unreadable JSON
83+
only. The refusal is `objectui validate`'s; the `ChatbotSchema.body` docblock in
84+
`@object-ui/types` now says the same.
7785

7886
**Nothing that rendered stops rendering.** No renderer read consumes `body` for this node:
7987
the `chatbot` registration spells the chat runtime's `body` option off `requestBody`, and

‎.changeset/9239-object-calendar-data-array-arm.md‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ After objectui#8348 put the renderer on the protocol's side (maintainer ruling,
1111
**What changes for authors**
1212

1313
- `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.
14-
- `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.
14+
- `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.
1515
- Requiredness is unchanged — optional on both faces, as before — so the `zod-mirror-parity` ratchet is unmoved.
1616

17+
⚠️ **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.
18+
1719
⛔ **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.
1820

1921
**What does NOT change**

‎.changeset/9511-record-id-is-a-string.md‎

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,17 @@ and are refused now, which is the half of the corpus that shows nothing was loos
7878
number arm was removed.
7979

8080
**Delivery surface — where the refusal does and does not arrive.** PARSE-TIME on the mirror
81-
(`@object-ui/types/zod`, so `objectui validate`, `objectui check` and any consumer calling
82-
`safeParse`) and COMPILE-TIME on the declaration (`tsc`). ⚠️ As with every other key on these
83-
mirrors, the runtime render path does not parse through them, so a rendered document is not
84-
where this arrives.
81+
(`@object-ui/types/zod`, so `objectui validate` and any consumer calling `safeParse`) and
82+
COMPILE-TIME on the declaration (`tsc`). ⚠️ As with every other key on these mirrors, the
83+
runtime render path does not parse through them, so a rendered document is not where this
84+
arrives.
85+
86+
⚠️ **Dated note, 2026-09-25 — `objectui check` does not deliver this refusal —
87+
objectui#10524.** This entry first listed `objectui check` on the parse-time side. `check` is
88+
an advisory sweep: it never parses against the schema a file whose root carries a structural key (`children`,
89+
`className`, `body`, …), it lists a file with none of those keys by name when the file does
90+
not validate, and it exits non-zero on unreadable JSON only. The refusal is
91+
`objectui validate`'s.
8592

8693
**Consequential narrowings, all compiler-forced by the door above.** `DrawerForm`,
8794
`ModalForm`, `SplitForm`, `TabbedForm` and `WizardForm` each declare their own `recordId` and

0 commit comments

Comments
 (0)