Skip to content

fix(cli,types): say what objectui check does; name objectui validate for the verdict (objectui#10524) - #10595

Merged
objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/issue-10524-check-promise-text
Sep 25, 2026
Merged

objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/issue-10524-check-promise-text

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

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 -> 165ca5b82c62. 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 [WIP] Update documentation for project #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 1da91cb5e..882c5e13e 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 fix(plugin-kanban): delete KanbanEnhanced.tsx, the module no export or barrel reached (objectui#8932) #10588 and the objectui#10518 branch edit. git merge-tree --write-tree of this head against PR fix(plugin-kanban): delete KanbanEnhanced.tsx, the module no export or barrel reached (objectui#8932) #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

…te` 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 <noreply@anthropic.com>
…at `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 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 43 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/4895-retire-block-schema-family.md

  • names packages/types/src/layout.ts → packages/types/src/layout.ts — edited by this change

    ⚠️ Not this family, and not touched. The live slotted record-page vocabulary — PageNodeSchema.kind === 'slotted' with slots?: PageSlotMap (packages/types/src/layout.ts), rendered by usePageAssignment / PageBlockCanvas / PageBlockInspector in @object-ui/app-shell — shares the words "block" and "slot" with the retired family and shares no declaration, type or file with it. Neither is the type: 'component' NAVIGATION item kind ({ type: 'component', componentRef }, NavigationItemSchema in zod/app.zod.ts), a different declaration in a different module.

.changeset/5632-svg-host-dom-passthrough.md

  • names packages/types/src/layout.ts → packages/types/src/layout.ts — edited by this change

    Both renderers forwarded their whole prop bag to the SVG they render, so every authored SDUI key on the node became an attribute — 14 per target, and icon="check" on all 71 icon nodes in the schema catalog. The two nodes declare different keys, and each renderer consumes its own node's keys by name: IconSchema (packages/types/src/layout.ts) against the pass-through docblock in renderers/basic/icon.tsx, and SpinnerSchema (packages/types/src/feedback.ts) against the one in renderers/feedback/spinner.tsx. icon and color are IconSchema's alone — SpinnerSchema declares neither. Read those two declarations for what they carry; this paragraph deliberately copies no member list. So the SDUI pass-through list withholds nothing they need.

.changeset/5903-objectgantt-declared-keys.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    Both halves move together. The TS declaration (packages/types/src/objectql.ts) and its zod mirror (src/zod/objectql.zod.ts) gain the same ten keys at the same requiredness — all optional — and no KnownDrift entry is added. navigation is taken from @objectstack/spec's NavigationConfigSchema by reference rather than restated, matching ObjectGridSchema.navigation.

  • names src/zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    Both halves move together. The TS declaration (packages/types/src/objectql.ts) and its zod mirror (src/zod/objectql.zod.ts) gain the same ten keys at the same requiredness — all optional — and no KnownDrift entry is added. navigation is taken from @objectstack/spec's NavigationConfigSchema by reference rather than restated, matching ObjectGridSchema.navigation.

.changeset/6687-chatbot-surface-authorable.md

  • names packages/types/src/complex.ts → packages/types/src/complex.ts — edited by this change

    Measured on both declaration faces before the fix, each with a control that had to hit: schema.surface appeared 0 times in renderer.tsx against schema.placeholder at 3 (one per registration) and schema.processVisibility at 1; and ChatbotSchema (packages/types/src/complex.ts) declared 34 keys, not this one. Two faces agreeing is what made the zero a reading rather than a bad query.

.changeset/6939-kanban-column-cards.md

  • names complex.ts → packages/types/src/complex.ts — edited by this change

    Breaking, deliberately. KanbanColumn declared its card list as items in complex.ts and in the zod mirror complex.zod.ts. Every board reads cards. Measured on origin/main 78a3cc238: KanbanImpl.tsx reads .cards on 12 lines, KanbanEnhanced.tsx on 8, and bucketCardsIntoColumns twice more as col.cards || []; .items had zero read sites in either board (a same-shaped .title control on the same two files returns 8 and 3, so those zeros are readings and not a mis-shaped probe). Both catalog entries, the plugin docs and content/docs/api/schema-reference.md all author cards.

.changeset/6940-rowactions-boolean-mirror.md

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    The list view's same-named rowActions in zod/objectql.zod.ts — z.array(z.string()), the legacy bare-name action list on ObjectGridSchema — is a different key that is correct as it stands, is in parity with its own TS twin (rowActions?: string[]), and is not touched.

.changeset/6951-text-value-retired.md

  • names layout.ts → packages/types/src/layout.ts — edited by this change

    Two published faces, one retirement. The TypeScript interface TextSchema (@object-ui/types, layout.ts) declares value?: never; the Zod mirror TextSchema (@object-ui/types/zod, layout.zod.ts) declares value as a retirementTombstone(), so the key stays DECLARED and is refused BY NAME — a plain deletion would have let an authored value ride BaseSchema's .passthrough() into a silent blank, which is worse than the tolerated fallback it replaces. The value?: string members of TextSpanSchema and TabsSchema in the same file are other schemas' contracts and are unchanged.

  • names layout.zod.ts → packages/types/src/zod/layout.zod.ts — edited by this change

    Two published faces, one retirement. The TypeScript interface TextSchema (@object-ui/types, layout.ts) declares value?: never; the Zod mirror TextSchema (@object-ui/types/zod, layout.zod.ts) declares value as a retirementTombstone(), so the key stays DECLARED and is refused BY NAME — a plain deletion would have let an authored value ride BaseSchema's .passthrough() into a silent blank, which is worse than the tolerated fallback it replaces. The value?: string members of TextSpanSchema and TabsSchema in the same file are other schemas' contracts and are unchanged.

.changeset/7113-chart-data-model.md

  • names objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    .extend() with a NEW key still works and preserves the fold and the refinement; .optional(), z.discriminatedUnion, z.toJSONSchema and safeValidateSchema are all unaffected. Nothing in this repository calls the throwing combinators on either const, and the published surface already ships refined mirrors (objectql.zod.ts, complex.zod.ts, form.zod.ts, app.zod.ts), so the class is not new — but it is a real behaviour change on a published export and it belongs in the release note rather than in a reviewer's file.

.changeset/7200-object-form-section-style-keys-undeclared.md

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    The authored-metadata type now agrees with @objectstack/spec, whose FormSectionSchema is a strict object declaring neither key, and with the ruling's rationale (maintainer 2026-09-01, verbatim): "retire the reads … Declaring the keys was weighed and not adopted: it would formally invite free Tailwind strings into authored metadata, the exact class the boundary exists to keep out." A ?: never tombstone was not used: ObjectFormSection has no zod mirror (ObjectFormSchema in zod/objectql.zod.ts does not declare sections), so there is no parse door to refuse at, and a tombstone is still a declaration in completion and in the published .d.ts.

.changeset/7265-types-user-filter-field-derives.md

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    zod/objectql.zod.ts declared two schemas under names @objectstack/spec/ui already exports. They were triaged separately, by reading their sites, and went different ways.

.changeset/7295-chat-message-avatar-keys.md

  • names packages/types/src/complex.ts → packages/types/src/complex.ts — edited by this change

    packages/plugin-chatbot/src/index.tsx:173–178 reads message.avatar || userAvatarUrl and message.avatarFallback || userAvatarFallback (and the assistant twins), the authoring-to-runtime seam spreads every unlisted key through (chatMessageAdapter.ts, ...passthrough), and the SDUI renderer feeds the authored messages[] straight in — a per-message avatar override renders, is documented, and no authoring-facing type declared it. ChatMessage in packages/types/src/complex.ts has no index signature (objectui#5155, deliberately — none is added here), so an author annotating ChatbotSchema.messages was told a value that renders is an error (TS2353); the zod mirror ChatMessageSchema is a plain strip-mode z.object, so the value parsed green and was silently DROPPED from the parsed output.

.changeset/7322-object-kanban-group-by-limit.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    Breaking for authored metadata: ObjectKanbanSchema.groupField is RETIRED (objectui#7322, ADR-0049 enforce-or-remove), and the two keys the object-kanban renderer actually reads — groupBy and limit — are now DECLARED and validated on both published faces: the TypeScript interface in objectql.ts and the Zod mirror in zod/objectql.zod.ts.

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    Breaking for authored metadata: ObjectKanbanSchema.groupField is RETIRED (objectui#7322, ADR-0049 enforce-or-remove), and the two keys the object-kanban renderer actually reads — groupBy and limit — are now DECLARED and validated on both published faces: the TypeScript interface in objectql.ts and the Zod mirror in zod/objectql.zod.ts.

.changeset/7352-drill-down-config-mirror.md

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    DrillDownConfigSchema is the zod mirror of DrillDownConfig, and both declarations that carry drillDown reference it — ChartSchema (zod/data-display.zod.ts) and ObjectDataTableSchema (zod/objectql.zod.ts) — so the published validator under @object-ui/types/zod reads the key for the first time (objectui#7352).

.changeset/7363-objectql-union-arms.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectGallerySchema and ObjectDataTableSchema are members of ObjectQLComponentSchema on both faces — the TS union in objectql.ts and the zod union in zod/objectql.zod.ts — so AnyComponentSchema, and with it validateSchema / safeValidateSchema / objectui validate, has an arm for object-gallery and object-data-table nodes (objectui#7363).

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    ObjectGallerySchema and ObjectDataTableSchema are members of ObjectQLComponentSchema on both faces — the TS union in objectql.ts and the zod union in zod/objectql.zod.ts — so AnyComponentSchema, and with it validateSchema / safeValidateSchema / objectui validate, has an arm for object-gallery and object-data-table nodes (objectui#7363).

.changeset/7632-shared-record-source-config.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    That ladder is published contract on both faces — packages/types/src/objectql.ts and its zod mirror both ship .describe() strings naming getDataConfig's order (objectui#6939, maintainer ruling 2026-09-02), pinned by objectql-record-source-refinement-6939.test.ts — and it was hand-copied into five plugin components with no gate holding them together. A change to the ruled order had five edit sites and nothing that noticed a missed one; that is the AGENTS.md #0.1 drift class.

.changeset/7655-chatbot-registration-authoring-faces.md

  • names complex.ts → packages/types/src/complex.ts — edited by this change

    New published symbol: ChatbotSharedKey, the string-literal union of the twenty keys all three registrations read. It is exported from complex.ts because an exported interface may not extend a Pick over a private name (TS4022), so it is emitted into dist/complex.d.ts and is reachable through the published @object-ui/types/complex subpath (it is not re-exported from the package entry). It is a census, not an authoring face.

.changeset/7703-chatbot-dark-keys-retired.md

  • names packages/types/src/complex.ts → packages/types/src/complex.ts — edited by this change

    Each member goes to ?: never on packages/types/src/complex.ts and to retirementTombstone(...) on packages/types/src/zod/complex.zod.ts — both halves, in lockstep, the convention MarkdownSchema.sanitize (objectui#6972), TimelineSchema.timeScale (objectui#6355) and ObjectViewSchema.viewTabBar (objectui#7779) already carry. Each refusal names the key, says why it is retired, and points at what to write instead; one string feeds both the parse-time message and the .describe() metadata, so the two cannot drift.

.changeset/7735-zod-mirrors-stop-authoring-defaults.md

  • names layout.zod.ts → packages/types/src/zod/layout.zod.ts — edited by this change

    What changed. All 41 .default() call sites under packages/types/src/zod/ are removed — layout.zod.ts 22, crud.zod.ts 11, form.zod.ts 5, views.zod.ts 2, app.zod.ts 1. @object-ui/components reconciles the third face objectui#8229 found: flex's registration defaultProps.align seeded 'center', the value its own renderer never applies, so a designer-made node laid out differently from a hand-authored one; it now seeds 'start'.

.changeset/7804-objectql-handler-key-arms.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    The four plain objectql.ts node faces declare the nine handler keys their registered renderers read (objectui#7804, the objectql.ts slice): ObjectFormSchema.onCancel / .onError / .onOpenChange / .onStepChange / .onSuccess, ObjectGallerySchema.onCardClick / .onRowClick, ObjectGridSchema.onNavigate and ObjectViewSchema.onNavigate.

.changeset/7804-tree-view-handler-slot.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    'runtime-slot' and not 'retired', measured at this key's own channel. 'retired' publishes "no renderer reads this key, so nothing could ever run it" — true of the two siblings already tombstoned on this arm (onSelectChange, onExpandChange) and flatly false here, since the read is live and INVOKED. ⚠️ No in-repo host builds a tree-view node carrying the key: the channel is wired end to end and only the supplier is absent, which is the same shape as ObjectFormSchema.onStepChange in this card's objectql.ts slice and is not evidence of a dead read. The TypeScript declaration is unchanged and still callable, so a programmatic host supplies it exactly as before.

.changeset/7917-export-breadcrumb-object-tree-zod-schemas.md

  • names objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    AnyComponentSchema declares 107 node component types. 105 of them could be named on the ./zod barrel — ButtonSchema.safeParse(node), which is what a designer, a form builder or a targeted test needs. The arms declaring type: 'breadcrumb' (navigation.zod.ts) and type: 'object-tree' (objectql.zod.ts) could not: both were already export const in their own module, but index.zod.ts — the package's only zod entry point — did not re-export them, so the schemas existed, were maintained, and were applied by the union while no consumer could name them.

.changeset/7963-alert-dialog-footer-keys-retired.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    Nothing else moves. These spellings are overloaded across the tree and every other owner is a live key on a different declaration — FormSchema.cancelLabel, objectql.ts's confirmLabel, plugin-designer's ConfirmDialog React props, plugin-grid's def.confirmLabel, and plugin-form's ModalForm / DrawerForm, which build a local cancelLabel from schema.cancelText. None is an AlertDialogSchema; none is touched, and a pin asserts it. No fixture, catalog schema, example app or doc fence authored any of the three on an alert-dialog node, so no shipped document is stranded.

.changeset/8415-filter-builder-condition-id.md

  • names complex.ts → packages/types/src/complex.ts — edited by this change

    Breaking for authored metadata: a filter-builder CONDITION must now declare id (objectui#8415). It is declared on both published faces — the TypeScript interface FilterBuilderCondition in complex.ts and the Zod mirror FilterBuilderConditionSchema in zod/complex.zod.ts — so a key the renderer has always required is finally validated instead of silently discarded.

.changeset/8478-describe-line-addresses.md

.changeset/8478-zod-pins-form-layout.md

.changeset/8516-8556-mirror-partial-record-narrowing.md

  • names zod/layout.zod.ts → packages/types/src/zod/layout.zod.ts — edited by this change

    | key | mirror was | mirror is | | :-- | :--------- | :-------- | | GridSchema.columns (zod/layout.zod.ts) | z.record(z.string(), z.number()) | a PARTIAL record over the six breakpoints | | ReportComponentSchema.exportConfigs (zod/reports.zod.ts) | z.record(z.string(), ReportExportConfigSchema) | a PARTIAL record over ReportExportFormat |

.changeset/8735-objectql-mirror-docblocks-not-defaulted.md

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    Correct four zod/objectql.zod.ts docblocks that described the behaviour objectui#8317 removed. Since that change the zod mirrors strip imported @objectstack/spec defaults at this package's import boundary, but the docblocks on HttpRequestSchema, ListColumnSchema, SelectionConfigSchema and PaginationConfigSchema still said, in the present tense, that method, prefix.type, type and pageSize are defaulted on parse — the opposite of what each export does. Each now says the key is declared and accepted but NOT defaulted on parse.

.changeset/8767-object-grid-refuses-string-sort.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    Migration. Write the array: sort: [{ field: 'name', order: 'desc' }]. Both keys are required. SortConfig.order carries no ? in @object-ui/types (packages/types/src/objectql.ts) and no .optional() in its zod mirror, and the protocol's own reusable SortItemSchema requires order as well — measured: that schema refuses [{ field: 'name' }] with invalid_value at 0.order. Do not omit it: this block's array arm interpolates whatever is present, so an omitted order lowers to $orderby: 'name undefined' today. That is pre-existing behaviour on the arm this change does not touch, and it is filed as a successor card rather than widened into here.

.changeset/8801-object-kanban-allow-collapse-retired.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    • the declarations retired here — packages/types/src/objectql.ts and its mirror packages/types/src/zod/objectql.zod.ts; - the pins that assert the retirement — object-kanban-allow-collapse-retired-8801.test.ts and bare-kanban-node-key-retired-8802.test.ts; - a comment in packages/types/src/zod/complex.zod.ts, recording that the deleted retiredZeroReadKanbanKey helper once carried this spelling on the SIBLING arm; - one row of content/docs/api/schema-reference.md; - the .changeset/ release notes that discuss it — this one, the two historical entries covering the sibling arm's own spelling, and objectui#9629's note recording the correction to this paragraph.
  • names packages/types/src/zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    • the declarations retired here — packages/types/src/objectql.ts and its mirror packages/types/src/zod/objectql.zod.ts; - the pins that assert the retirement — object-kanban-allow-collapse-retired-8801.test.ts and bare-kanban-node-key-retired-8802.test.ts; - a comment in packages/types/src/zod/complex.zod.ts, recording that the deleted retiredZeroReadKanbanKey helper once carried this spelling on the SIBLING arm; - one row of content/docs/api/schema-reference.md; - the .changeset/ release notes that discuss it — this one, the two historical entries covering the sibling arm's own spelling, and objectui#9629's note recording the correction to this paragraph.

.changeset/8802-8257-8008-kanban-gantt-family-retirement.md

  • names complex.ts → packages/types/src/complex.ts — edited by this change

    What each retirement was, measured. Three of the four were registration-only: no schema face in @object-ui/types ever declared kanban-ui, kanban-enhanced or gantt as a component node type, so unregistering is the whole retirement. The bare kanban key was the exception — it had a declared arm on both faces (KanbanSchema in complex.ts and its Zod mirror), and a plain deletion there would have been the objectui#7664 failure: BaseSchema is .passthrough(), so a document naming a dropped key validates green and renders nothing. It therefore retires as a named refusal: the Zod union keeps an arm claiming the literal and answers a { "type": "kanban" } document with a message naming object-kanban as the remedy, while the TypeScript half is the absence of the arm from ComplexSchema and of the key from SchemaRegistry, so tsc refuses it at the authoring site.

.changeset/8871-page-node-refuses-breadcrumbs.md

  • names layout.ts → packages/types/src/layout.ts — edited by this change

    What was measured, on this branch's base 93127bd6f. Zero readers, with a point-access probe rather than a bare word: on that base \.breadcrumbs scores 0 tree-wide (exit 1) against \.breadcrumb\b's 12 files tree-wide (10 under packages/) as the lit control. At head the same two probes read 16 and 13 and \.breadcrumbs is exit 0 over 4 files — every hit one of this branch's own four files (this changeset, the refusal pin, layout.ts, zod/layout.zod.ts) quoting the probe string, and the pin's own exclusions put head back at exit 1. The base reading is the measurement; the head reading is this branch's echo of it. The bare word would have lied — it also names Sentry's own unrelated concept (app-shell/src/observability/sentry.ts) and appears in two comments listing UI surfaces (core/src/utils/record-title.ts, layout/src/NavigationRenderer.tsx), so a bare probe reports five readers that do not exist.

  • names zod/layout.zod.ts → packages/types/src/zod/layout.zod.ts — edited by this change

    What was measured, on this branch's base 93127bd6f. Zero readers, with a point-access probe rather than a bare word: on that base \.breadcrumbs scores 0 tree-wide (exit 1) against \.breadcrumb\b's 12 files tree-wide (10 under packages/) as the lit control. At head the same two probes read 16 and 13 and \.breadcrumbs is exit 0 over 4 files — every hit one of this branch's own four files (this changeset, the refusal pin, layout.ts, zod/layout.zod.ts) quoting the probe string, and the pin's own exclusions put head back at exit 1. The base reading is the measurement; the head reading is this branch's echo of it. The bare word would have lied — it also names Sentry's own unrelated concept (app-shell/src/observability/sentry.ts) and appears in two comments listing UI surfaces (core/src/utils/record-title.ts, layout/src/NavigationRenderer.tsx), so a bare probe reports five readers that do not exist.

.changeset/8885-object-chart-drilldown-title-compareto.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectChart.tsx reads all three off schema, and until now neither published copy declared any of them: not the TS interface (packages/types/src/objectql.ts) and not the zod mirror (packages/types/src/zod/objectql.zod.ts). They rode BaseSchema's index signature / .passthrough() and arrived unvalidated. drillDown was the sharpest case — this component's registry inputs advertise it to the designer palette, and @objectstack/spec publishes ChartDrillDownSchema for exactly this carrier, so an author was offered a key that neither published shape mentioned.

  • names packages/types/src/zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    ObjectChart.tsx reads all three off schema, and until now neither published copy declared any of them: not the TS interface (packages/types/src/objectql.ts) and not the zod mirror (packages/types/src/zod/objectql.zod.ts). They rode BaseSchema's index signature / .passthrough() and arrived unvalidated. drillDown was the sharpest case — this component's registry inputs advertise it to the designer palette, and @objectstack/spec publishes ChartDrillDownSchema for exactly this carrier, so an author was offered a key that neither published shape mentioned.

.changeset/8913-object-kanban-columns-declared.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    What moved. ObjectKanbanSchema gains columns on both halves that move together — the TypeScript interface (objectql.ts) and its Zod mirror (zod/objectql.zod.ts). Retiring the bare kanban node type key (objectui#8802) removed the only face that judged a lane, and object-kanban had never declared the key, so it rode BaseSchema's [key: string]: any / .passthrough(): read by the renderer at three sites, named by no published face.

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    What moved. ObjectKanbanSchema gains columns on both halves that move together — the TypeScript interface (objectql.ts) and its Zod mirror (zod/objectql.zod.ts). Retiring the bare kanban node type key (objectui#8802) removed the only face that judged a lane, and object-kanban had never declared the key, so it rode BaseSchema's [key: string]: any / .passthrough(): read by the renderer at three sites, named by no published face.

.changeset/8990-object-kanban-groupby-optional.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    @objectstack/spec declares the key optional — groupBy: z.string().optional() on ObjectKanbanPropsSchema — while this package required it on the TypeScript declaration (packages/types/src/objectql.ts) and on the Zod mirror (packages/types/src/zod/objectql.zod.ts). objectui was therefore narrower than the protocol on a published key: ObjectKanbanSchema.safeParse and safeValidateSchema refused an object-kanban node the protocol accepts, and such a node could not be annotated with its own type.

  • names packages/types/src/zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    @objectstack/spec declares the key optional — groupBy: z.string().optional() on ObjectKanbanPropsSchema — while this package required it on the TypeScript declaration (packages/types/src/objectql.ts) and on the Zod mirror (packages/types/src/zod/objectql.zod.ts). objectui was therefore narrower than the protocol on a published key: ObjectKanbanSchema.safeParse and safeValidateSchema refused an object-kanban node the protocol accepts, and such a node could not be annotated with its own type.

.changeset/8992-user-actions-collapse-and-docblock.md

  • names objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    objectql.zod.ts's UserActionsSchema read stripImportedDefaults(Spec).extend({ group, hideFields, rowColor }), an extension that existed only because @objectstack/spec did not declare those three keys while normalizeListViewSchema folded objectui's legacy showGroup / showHideFields / showColor onto them. The protocol adopted all three in 17.3.0 (objectui#5435's ruling), so the extension is now a second local copy of a protocol declaration — the shape two faces start drifting from — and it collapses into the plain by-reference re-export its own note always said it would become.

.changeset/9092-inline-locale-declared-face.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    • AppComponentSchema.label (app.ts) - ObjectGridSchema.label and .description (objectql.ts) - PageNodeSchema.aria.ariaLabel (layout.ts)
  • names layout.ts → packages/types/src/layout.ts — edited by this change

    • AppComponentSchema.label (app.ts) - ObjectGridSchema.label and .description (objectql.ts) - PageNodeSchema.aria.ariaLabel (layout.ts)

.changeset/9309-object-gallery-filter-destination-typed.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectGallerySchema.filter is typed as the destination its own docblock names — QueryParams['$filter'] — on both faces, the TS interface in objectql.ts and the zod mirror in zod/objectql.zod.ts (objectui#9309).

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    ObjectGallerySchema.filter is typed as the destination its own docblock names — QueryParams['$filter'] — on both faces, the TS interface in objectql.ts and the zod mirror in zod/objectql.zod.ts (objectui#9309).

.changeset/9549-tree-filter-declared.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectTreeSchema.filter is declared on both faces, in the shape objectui#9309 settled for ObjectGallerySchema.filter: QueryParams['$filter'] by indexed access on the TS interface in objectql.ts, and the same two-arm union (array first) on the zod mirror in zod/objectql.zod.ts (objectui#9549).

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    ObjectTreeSchema.filter is declared on both faces, in the shape objectui#9309 settled for ObjectGallerySchema.filter: QueryParams['$filter'] by indexed access on the TS interface in objectql.ts, and the same two-arm union (array first) on the zod mirror in zod/objectql.zod.ts (objectui#9549).

.changeset/9550-object-tree-root-barrel.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectQLComponentSchema declares the node types an ObjectQL block may be. Every one of its arms was a named export of this package's root barrel except ObjectTreeSchema, which was declared in objectql.ts, applied by the union, and re-exported by the ./zod barrel (objectui#7917) — while no TypeScript consumer could name it. There is no ./objectql subpath to reach around the barrel: the package's exports map is pinned by packages/types/src/__tests__/package-exports-manifest.test.ts, and the root barrel was the only route to this type.

.changeset/9606-object-kanban-card-title.md

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    Both published faces of the object-kanban arm now name the key: the zod mirror ObjectKanbanSchema in zod/objectql.zod.ts and its TypeScript twin, the ObjectKanbanSchema interface in objectql.ts. Both declare it OPTIONAL, at the same requiredness the other face uses, so the two faces accept and refuse the same documents. (Located and cited by SYMBOL: line addresses in zod/objectql.zod.ts have drifted before, and this change is itself about a drifted mirror.)

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    Both published faces of the object-kanban arm now name the key: the zod mirror ObjectKanbanSchema in zod/objectql.zod.ts and its TypeScript twin, the ObjectKanbanSchema interface in objectql.ts. Both declare it OPTIONAL, at the same requiredness the other face uses, so the two faces accept and refuse the same documents. (Located and cited by SYMBOL: line addresses in zod/objectql.zod.ts have drifted before, and this change is itself about a drifted mirror.)

.changeset/9628-kanban-column-collapsed-honoured.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    The key was declared on both published faces of the object-kanban arm — the lane element of ObjectKanbanSchema (objectql.ts and its Zod mirror) and the runtime lane KanbanColumn (complex.ts and its mirror) — and read by KanbanEnhanced alone, a module no production source imports. An authored { "id": "todo", "title": "To Do", "collapsed": true } therefore parsed green on both faces and reached a board that did nothing with it: KanbanImpl's only collapse is the SWIMLANE row's, held in viewer state under objectui:kanban-collapsed:ANGLE-BRACKETS(swimlaneField) and never keyed to a lane's declared value. That is the ADR-0049 declared-but-unhonoured shape.

  • names complex.ts → packages/types/src/complex.ts — edited by this change

    The key was declared on both published faces of the object-kanban arm — the lane element of ObjectKanbanSchema (objectql.ts and its Zod mirror) and the runtime lane KanbanColumn (complex.ts and its mirror) — and read by KanbanEnhanced alone, a module no production source imports. An authored { "id": "todo", "title": "To Do", "collapsed": true } therefore parsed green on both faces and reached a board that did nothing with it: KanbanImpl's only collapse is the SWIMLANE row's, held in viewer state under objectui:kanban-collapsed:ANGLE-BRACKETS(swimlaneField) and never keyed to a lane's declared value. That is the ADR-0049 declared-but-unhonoured shape.

.changeset/calendar-readme-schema-keys-5045.md

  • names packages/types/src/complex.ts → packages/types/src/complex.ts — edited by this change

    README.md's "Schema API / CalendarView" block described a CalendarViewSchema that does not exist. Measured against the interface itself (packages/types/src/complex.ts) and its zod mirror: events — the schema's only required key besides type — was published as events?, so a reader following the README omits it and TypeScript rejects the node; defaultDate was string where the schema says string | Date; and onDateClick was listed as a schema key when it is a CalendarViewProps component prop, sending readers to a different package's surface for a key calendar-view does not have (the schema's key is onDateChange). The block also listed 6 of the schema's 13 keys with nothing saying it was a summary (objectui#5045).

.changeset/layout-default-jsdoc-7361.md

  • names layout.ts → packages/types/src/layout.ts — edited by this change

    The published @default documentation on two layout.ts members now matches the value the renderer actually applies. ContainerSchema.maxWidth documented 'lg' while container.tsx applies schema.maxWidth ?? 'xl', and the shared FlexLayoutProps.align documented 'center' while flex.tsx applies schema.align || 'start' and stack.tsx applies schema.align || 'stretch'. The renderers are unchanged — they are the authority for what runs — so only the docblocks moved; align now states both consumers in prose instead of carrying a single @default, because one member shared by two deliberately divergent component types cannot have one correct default.

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Angle-bracketed names in the quoted prose above are rewritten as ANGLE-BRACKETS(name): GitHub deletes tag-shaped fragments from a stored body, and a quote that silently loses the identifier it is about is worse than a visible repair.

Compared the checked-out tree with ab7751321 (merge-base with origin/main): 7 file(s) changed outside .changeset/, read against 1457 pending declaration(s) that publish a body (2038 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3047.3 KB 3104.5 KB
Main entry chunk (gzip) 147.9 KB 350 KB
Entry file index-BXiHI3D8.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.68KB 6.20KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.52KB 3.45KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 546.32KB 130.64KB
core (index.js) 9.22KB 3.71KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 223.91KB 62.28KB
fields (index.js) 258.79KB 65.62KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.28KB 11.09KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.93KB
plugin-calendar (index.js) 51.40KB 14.61KB
plugin-charts (index.js) 74.94KB 20.89KB
plugin-chatbot (index.js) 198.36KB 47.20KB
plugin-dashboard (index.js) 133.50KB 35.37KB
plugin-designer (index.js) 216.25KB 44.39KB
plugin-detail (index.js) 232.59KB 61.50KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 147.92KB 37.83KB
plugin-gantt (index.js) 169.62KB 41.91KB
plugin-grid (index.js) 215.37KB 58.92KB
plugin-kanban (index.js) 48.26KB 15.04KB
plugin-list (index.js) 114.43KB 28.26KB
plugin-map (index.js) 22.42KB 7.38KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.64KB 8.94KB
plugin-tree (index.js) 10.52KB 3.69KB
plugin-view (index.js) 87.31KB 21.78KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 114.58KB 37.60KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.03KB 1.86KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.78KB 2.56KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 18.27KB 6.20KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 17.15KB 6.32KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: bf809e6c537b60377ff337d521e427c1b7a5eaf5

① Derived judgments

Refs. git rev-parse refs/review/pr-10595 = bf809e6c5 (matches). merge-base with main = 6ea68e63e; main is now 50e41f738 (PR is "behind"). 17 files, +163/-37. Checkout untouched (git status --porcelain = 0 lines; no worktree created).

The help line. True of check as implemented (packages/cli/src/commands/check.ts at head, unchanged since 2acd8e109, 2026-09-19). Glob is **/*.{json,yaml,yml} but only file.endsWith('.json') is read, so it is a JSON sweep (yaml/yml are counted in "Analyzing N files..." and never opened). A root with any OBJECTUI_STRUCTURAL_KEYS member (body, children, className, ...) is admitted by isObjectUiSchemaFile without a schema parse; only a root with none is parsed via safeValidateSchema(...).success, and a failing one whose type is registered is pushed to unvalidatedCandidates and printed with "Run objectui validate FILE ... for the reason". errors++ happens only on parseErrors.length OF 0 or a read exception, both printed as "Invalid JSON"; process.exit(1) only when errors OF 0. So "Advisory JSON file sweep; run objectui validate for a verdict" matches objectui#10523's house wording ("that list is advisory: check exits non-zero on unreadable JSON only"). Minor: the 61-char line under-states the parse-error exit and will wrap in the objectui --help command column (commander, ~44 cols left); cosmetic, nothing pins it.
Pin (cli-bin.test.ts +22): reads paragraph 1 of check --help (split(/\n\s*\n/)[1]), asserts not.toMatch(/^\s*validates?\b/i) and toContain('objectui validate'). Red on base for the right reason (base text "Validate schema files" trips both), green on head; property-based, not an exact string. Adequate proxy.

ChatbotSchema.body JSDoc (complex.ts @1584-1591): 1 line changed, 3 added; body?: never and every other line byte-identical (diff hunk confirms). Every sentence true: body is in OBJECTUI_STRUCTURAL_KEYS (check.ts line 46, kept "ON PURPOSE"), so a chatbot file authoring root body is never schema-parsed by check; validate.ts calls safeValidateSchema and exits 1. Ships in dist/complex.d.ts: it is a /** */ JSDoc, declaration: true, no removeComments; my tsc probe (scratchpad/pr-10595-review/dts-probe, tsc from objectui-issue-10518/node_modules) shows declaration emit keeps JSDoc on members (1 hit) and drops // comments (0 hits).

layout.ts / layout.zod.ts: one word each (check to validate), git diff -w confirms comment-only. True: pre-8499 AnyComponentSchema had no section arm; objectui validate = safeValidateSchema = that union, and node-slot-registered-arms-8499.test.ts pins AnyComponentSchema.safeParse({ type: 'div', children: [{ type }] }).success false for unarmed types. The same page document has children at the root, so check never parsed it; the original "refused by objectui check" was false.

The 11 pending changesets. Frontmatter md5 base vs head identical 11/11 (10 = ecedb10c5189, 9511 = faab52a0d3f0, 9746 empty frontmatter = 2ee28f1e1b44). Dated note ⚠️ **Dated note, 2026-09-25 ... objectui#10524.** present 11/11, each recording the original wording ("This entry first listed/named objectui check ..."), so nothing shipped is erased. False when written: all 11 were created 2026-08-28..2026-09-25, after 94021ddba (2026-08-20, structural marker gate) and 7dc08a3e7 (2026-08-25, validity arm + advisory list); git show 94021ddba^:.../check.ts imports no safeValidateSchema and increments errors only on parse failure, so "check refuses" was never true at any commit. Corrections true sentence by sentence (validate does refuse; check lists without naming the field; 10478's "answered green" stays true of check). Adaptation sound: "at this change" scoping would assert a false history; 9746 alone was true of the docs section at the time (10523's diff shows the base section named both commands) and is correctly scoped with the 10416 correction noted.

  • 7694: 5 citation sites (6 addresses: data-display.zod.ts:622, reports.zod.ts:105, index.zod.ts:434, cli.ts:211/:223, normalizeChartSchema.ts:244) became file names, symbols retained. AGENTS.md [WIP] Update documentation for project #11 names changesets as a carrier and says "when you touch a file anyway, fix the cross-file line addresses inside it"; 0 path:line remain in all 11 touched files. Meaning preserved.
  • 8505: packages/cli/package.json bin is objectui only; os-ui validate to objectui validate is correct. (Untouched 8516 still says os-ui validate; dev's acceptance note; consistent with the opportunistic rule.)

Missed hits (owed). git grep at head over packages/cli + packages/types for objectui check and for backticked check (non-test) finds three remaining sentences in @object-ui/types that say the CLI's check refuses, none read or listed in the PR body's H3 "stand as they are" set:

  • packages/types/src/zod/objectql.zod.ts:1958-1961: "This mirror reaches the CLI's validate/check ... so a block missing the trio moves from 'accepted, then warned about at runtime' to 'refused at authoring time'".
  • packages/types/src/zod/objectql.zod.ts:2087-2090: "reaches the CLI's validate / check — sort: 'name asc' ... to 'refused at authoring time'".
  • packages/types/src/objectql.ts:3234-3237: "reaches safeValidateSchema and therefore the CLI's validate / check commands: a block missing one of the three moves ... to 'refused at authoring time'". This is the source twin of .changeset/6475, which the PR did reconcile.
    The two objectql.zod.ts lines are // comments inside the z.object literal: dropped from .d.ts (tsc probe) but shipped in dist/zod/objectql.zod.js (build = tsc && vite build, tsc keeps comments, vite minify: false). objectql.ts:3234 is a // comment on an interface member: source-only, not in dist. The dev's sweep applied the backticked-check test to .changeset but only the literal objectui check to package sources. The 6 literal hits the dev did read (data-display.ts, form.ts, strict-authoring-face.ts, complex.zod.ts, data-display.zod.ts) are not verdict claims; agreed.

The dev's out-of-scope finding. Verified from source, no probe (checkout has no node_modules/dist; not cheap): "Unknown schema type" is printed only inside the isObjectUiSchemaFile true branch; a bare { "type": "line-chart" } has no structural key, fails the validity arm, and line-chart is absent from known-schema-types.ts (only bar-chart present), so it lands in skipped++, exit 0. So 8760/9533/10393 are wrong for the bare documents they quote. Judgment: a diagnostic-reach claim (unknown-type warning), not a verdict claim, so a different family; own card acceptable. The dev's stated reason is wrong, though: 10523's wording does describe the recognition gate ("checks the type of each file it recognises ... recognised by that key alone"), so that card can reuse it.

② Semver level

patch + patch, Clause-②: no — correct. git diff -w ... -- '*.ts': cli.ts 1 line (the .description(...) string), cli-bin.test.ts +22, complex.ts/layout.ts/layout.zod.ts comment lines only. No export, type, schema or accept-set move; check.ts untouched. New changeset 10524-check-promise-text.md is true sentence by sentence, with one imprecision to tighten in release text: "recognises a file whose root carries a structural key ... by that key alone, without parsing it" — check does JSON-parse the file (parseJsonc); only the schema parse is skipped (the docblock says "never parsed against the schema"; the changeset drops "against the schema").

③ Boundary flags

  • CI on head (final read): 43 check-runs, 40 success, 3 skipped, 0 failure, 0 in progress. Lint, Type Check, Test shards 1-8, Line Citation Gate, Changeset Claim Re-read, Changeset Overwrite Report, Governed Surface Queue Guard all green.
  • git merge-tree --write-tree refs/review/main refs/review/pr-10595: exit 0, tree e46dc1f49; clean against 50e41f738.
  • Serial: PR 10588 (313ca6321) edits complex.ts @57-60 and @128-135; this PR edits @1581-1591. No textual overlap; merge-tree of the two branches exits 0. objectql.ts not touched here (but see ①: the owed objectql.ts:3234 hit sits in that held file, so it must be named for the seat, not edited here). Stale draft PR 8941 also touches objectql.ts.
  • Governed sibling 10526 / PR 10574: this PR touches 0 skills/ paths.
  • Stop-landing: the ① missed hits.

Implemented-by: claude/issue-10524-check-promise-text
Reviewed-by: session_014mXUNuFomfj24w7s1pZzhN

VERDICT: FAIL

Exactly what stops it: three remaining @object-ui/types sentences say the CLI's check refuses a document — packages/types/src/zod/objectql.zod.ts:1958-1961 and :2087-2090 (not held by any open PR; fix here, same form as layout.zod.ts: name validate alone) and packages/types/src/objectql.ts:3234-3237 (serially held by 10588; name it in the PR body's "For the seat" section as a held twin of .changeset/6475, the way complex.zod.ts is named). Also tighten the new changeset's "without parsing it" to "without parsing it against the schema". Everything else in ①-③ passes.


Generated by Claude Code

…alidate`/`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 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3047.3 KB 3104.5 KB
Main entry chunk (gzip) 147.9 KB 350 KB
Entry file index-C-zfN6xz.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.68KB 6.20KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.52KB 3.45KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 546.37KB 130.65KB
core (index.js) 9.22KB 3.71KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 223.91KB 62.28KB
fields (index.js) 259.12KB 65.73KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.28KB 11.09KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.93KB
plugin-calendar (index.js) 51.40KB 14.61KB
plugin-charts (index.js) 74.94KB 20.89KB
plugin-chatbot (index.js) 198.36KB 47.20KB
plugin-dashboard (index.js) 133.50KB 35.37KB
plugin-designer (index.js) 216.25KB 44.39KB
plugin-detail (index.js) 232.59KB 61.50KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 147.92KB 37.83KB
plugin-gantt (index.js) 169.62KB 41.91KB
plugin-grid (index.js) 215.37KB 58.92KB
plugin-kanban (index.js) 48.26KB 15.04KB
plugin-list (index.js) 114.43KB 28.26KB
plugin-map (index.js) 22.42KB 7.38KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.64KB 8.94KB
plugin-tree (index.js) 10.52KB 3.69KB
plugin-view (index.js) 87.31KB 21.78KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 114.58KB 37.60KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.03KB 1.86KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.78KB 2.56KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 18.27KB 6.20KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 17.15KB 6.32KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 1da91cb5e3b4c90734d687d0788ecaf94c3f059f

① Derived judgments

Refs. refs/review/pr-10595 = 1da91cb5e (matches). One commit on top of round-1 bf809e6c5; the rework delta is 3 files (+17/-13): .changeset/10524-check-promise-text.md, packages/types/src/objectql.ts (1 line), packages/types/src/zod/objectql.zod.ts (2 lines). merge-base with main unchanged at 6ea68e63e; main is now aa38e195d. Checkout untouched (git status --porcelain = 0 lines). Full diff vs merge-base: 19 files, +170/-40.

FAIL item, missed hits: fixed.

  • objectql.zod.ts:1959 now reads "This mirror reaches the CLI's validate through AnyComponentSchema → safeValidateSchema, so a block missing the trio moves ... to 'refused at authoring time'". objectql.zod.ts:2088 now reads "reaches the CLI's validate — sort: 'name asc' ... moves ... to 'refused at authoring time'". objectql.ts:3235 now reads "reaches safeValidateSchema and therefore the CLI's validate command: a block missing one of the three moves ... to 'refused at authoring time'". All three name validate alone, and each is true: validate.ts (untouched) calls safeValidateSchema at line 59 and process.exit(1) on failure; ObjectGanttSchema.gantt is stripImportedDefaults(SpecGanttConfigSchema) and ObjectCalendarSchema.sort is z.array(SortConfigSchema), so a missing trio or a string sort fails the union parse.
  • Comment-only: git diff -w bf809e6c5..head -- '*.ts' filtered to non-comment lines is empty. git diff -U0 vs merge-base shows exactly six comment sites in @object-ui/types: complex.ts @1584/@1588 (one docblock), layout.ts @1668, layout.zod.ts @868, objectql.ts @3235, objectql.zod.ts @1959 and @2088. No code line anywhere in the PR beyond cli.ts's .description(...) string and the 22-line test pin.
  • Built output: the two objectql.zod.ts sites are // comments inside the BaseSchema.extend({...}) literal. packages/types build is tsc && vite build; neither the root nor the package tsconfig.json sets removeComments, so tsc's per-file dist/zod/objectql.zod.js keeps them with the corrected text. Vite writes only dist/zod/index.zod.js (fileName: () => 'index.zod.js', outDir: dist/zod, emptyOutDir: false), so it does not overwrite that file. objectql.ts:3235 is a // comment on an interface member, dropped from .d.ts per the round-1 tsc probe; source-only, as the body says.
  • Re-sweep (my own, at head, packages/cli/src + packages/types/src non-test, plus READMEs and .changeset/*.md; literal, backticked/near-validate/refus grep, and a cross-line node scan that joins comment lines): 15 literal objectui check hits, 38 cross-line hits in packages, 128 in .changeset. Every hit is one of: this PR's own corrected sentence; the advisory list or unknown-type warning (data-display.ts:2874, data-display.zod.ts:1215, known-schema-types.ts, known-type-case-suggestion.ts, union-arm-diagnostics.ts, 9641, 8802); "answered green" / "calls safeValidateSchema" / "consumer of the parse output" (complex.zod.ts:338, form.ts:2423, 10478:8, 6051:88 which explicitly defers the refusal to its own card, 7664:10, 8344:97, 7546:38, 7694:15 "validated green", 8516:17); future wiring (strict-authoring-face.ts:22); the lucide glyph or .check() refinements; or the 8760/9533/10393 unknown-type-reach family already graded a different card in round 1. No sentence in package sources or pending changesets still says check validates, refuses or fails a document. The dev's per-hit table in the landing body matches my sweep hit for hit; its cross-line pass "0 hits at head" reproduces.

The tightened changeset. Frontmatter md5 e0d5a07580e3 identical round 1 to round 2. Both check sentences now say "without parsing it against the schema" / "parses against the schema only a file with none of those keys"; the ChatbotSchema.body bullet now says "never parses a chatbot document that authors it against the schema". The new sentence naming the ObjectGanttSchema.gantt comments (interface and zod mirror) and the ObjectCalendarSchema sort comment is true (those comments did say the refusal reaches the CLI's validate / check; they now name validate alone). The headline is false: it says "five @object-ui/types comments", and the bullet's own enumeration sums to six (ChatbotSchema.body 1 + "the two SemanticElementSchema docblocks" 2 + "the ObjectGanttSchema.gantt comments (the interface and its zod mirror)" 2 + the ObjectCalendarSchema sort comment 1). The diff confirms six distinct comment sites in five files. The landing body's first paragraph repeats "five comments in @object-ui/types". The round-1 changeset's "three docblocks" was correct; the rework added three sites and raised the count by two. This publishes verbatim into the CHANGELOG. Owed: "six".

The 11 dated notes, "never parses". Judged FALSE, not shorthand. check.ts:256-261 reads every .json file and calls parseJsonc(text, parseErrors, ...); the structural-key gate (isObjectUiSchemaFile, line 143) runs on the parsed object, and a file whose root carries a structural key still costs errors++ and process.exit(1) when its JSON is unreadable. So "it never parses a file whose root carries a structural key" is literally untrue; it is only true with "against the schema" appended, which is exactly the tightening round 1 required of the same phrase in the new changeset, and which this PR now carries in the new changeset while 11 sibling notes in the same release say the untightened form (10478:40, 6475:40-41, 7694:38, 8466:53-54, 8499:20, 8505:52, 8572:81 "never parses a file it recognised that way", 9239:17, 9511:88, 9559:16, 9746:20). The dev's own acceptance note concedes "this is the same imprecision the rework round tightened". The seat did not rule on this wording. Owed in this PR: add "against the schema" (or "never schema-parses") at the 11 sites; the frontmatter is untouched by that edit.

Nothing regressed. The delta touches nothing round 1 passed: cli.ts, cli-bin.test.ts, complex.ts, layout.ts, layout.zod.ts and the 11 reconciled changesets are byte-identical to bf809e6c5. Frontmatter md5 base vs head SAME 11/11 (ecedb10c5189 ×9, faab52a0d3f0, 2ee28f1e1b44). complex.ts:1588-1590 still reads "a file recognised that way is never parsed against the schema" (correct form).

Landing body claims. Reproduced: git merge-tree --write-tree a7df45ff1 refs/review/pr-10595 = dd2a12f42, exit 0; main had moved in 51 files at a7df45ff1, 0 overlapping this PR (now 54, still 0). The objectql rows ("two lines changed", "one comment line", "git diff -w shows no code line", ship/does-not-ship) are true. The "five comments" sentence is the one false claim (above).

② Semver level

patch + patch, Clause-②: no — confirmed. The only non-comment source change is the check .description(...) string in cli.ts and the test file; no export, type, schema or accept set moves; check.ts untouched. check-changeset-* gates green in CI.

③ Boundary flags

  • CI on head, final read: 43 check-runs, 40 success, 3 skipped (Test (coverage), coverage-shard matrix stub, dependabot), 0 failure, 0 in progress. Spec Main Shape Gate was in_progress on the first read and completed success. Lint, Type Check, Test shards 1-8, Test (dist pins), Line Citation Gate, Changeset Claim Re-read, Changeset Overwrite Report, Governed Surface Queue Guard, Build & E2E all green.
  • git merge-tree --write-tree refs/review/main refs/review/pr-10595 (main aa38e195d): exit 0, tree 99f1d4cda.
  • Serial: vs PR 10588 claude/issue-8932-retire-kanban-enhanced (313ca6321, not yet in main): exit 0, tree 354e85d51. 10588 edits objectql.ts @3725-3760 and complex.ts @57-60/@128-135; this PR edits objectql.ts @3235 and complex.ts @1581-1591. vs claude/issue-10518-object-chart-axis-config (PR 10601, 74cf402ed, not in main): exit 0, tree 19afb5d6e. 10601 edits objectql.ts @139/@4245/@4489 and objectql.zod.ts @38/@2393/@2496; this PR edits objectql.zod.ts @1959/@2088. No hunk within 300 lines of another's; a squash of either order applies cleanly.
  • Governed sibling 10526 / PR 10574: this PR touches 0 skills/ paths.
  • Stop-landing: the two release-text items in ①.

Implemented-by: claude/issue-10524-check-promise-text
Reviewed-by: session_014mXUNuFomfj24w7s1pZzhN

VERDICT: FAIL

Exactly what stops it, both text-only and both in files this PR already edits: (1) .changeset/10524-check-promise-text.md headline says "five @object-ui/types comments" while its own enumeration and the diff give six (five files, six comments); change to "six", and the same word in the landing body's first paragraph. (2) The 11 dated notes' "it never parses a file whose root carries a structural key" (and 8572's "never parses a file it recognised that way") is the untightened form round 1 required fixing in the new changeset; check JSON-parses every file and exits 1 on unreadable JSON regardless of root keys, so append "against the schema" at the 11 sites, frontmatter untouched. Everything else in ①-③ passes: the three objectql comments are fixed and true, comment-only, shipped where the body says, the re-sweep is clean, round-1 PASS items are byte-identical, CI is fully green, and merge-tree is clean against main, 10588 and 10601.


Generated by Claude Code

…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 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3047.4 KB 3104.5 KB
Main entry chunk (gzip) 147.9 KB 350 KB
Entry file index-CLEgVjRg.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.68KB 6.20KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.52KB 3.45KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 546.37KB 130.65KB
core (index.js) 9.22KB 3.71KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 223.91KB 62.28KB
fields (index.js) 259.41KB 65.82KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.28KB 11.09KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.93KB
plugin-calendar (index.js) 51.40KB 14.61KB
plugin-charts (index.js) 74.94KB 20.89KB
plugin-chatbot (index.js) 198.36KB 47.20KB
plugin-dashboard (index.js) 133.50KB 35.37KB
plugin-designer (index.js) 216.25KB 44.39KB
plugin-detail (index.js) 232.60KB 61.49KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 147.92KB 37.83KB
plugin-gantt (index.js) 169.62KB 41.91KB
plugin-grid (index.js) 215.37KB 58.92KB
plugin-kanban (index.js) 48.26KB 15.04KB
plugin-list (index.js) 114.43KB 28.26KB
plugin-map (index.js) 22.42KB 7.38KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.67KB 8.95KB
plugin-tree (index.js) 10.52KB 3.69KB
plugin-view (index.js) 87.31KB 21.78KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 114.58KB 37.60KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.03KB 1.86KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.78KB 2.56KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 18.27KB 6.20KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 17.15KB 6.32KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 882c5e13ebb6b1b254bbec841ca412491b478cb4

① Derived judgments

Refs. refs/review/pr-10595 = 882c5e13e (matches). One commit on top of round-2 1da91cb5e: "docs(changeset): the dated notes say check skips the schema parse, not the JSON parse". merge-base with main unchanged at 6ea68e63e (same for the round-2 head); main is now 21d34d5e2. Checkout untouched (git status --porcelain = 0 lines). Full diff vs merge-base: 19 files, +170/-40, unchanged from round 2.

Delta scope: changeset text only. git diff --stat 1da91cb5e..head lists exactly 12 .changeset/*.md files, 12 insertions, 12 deletions, nothing else; each file has exactly one line changed. Frontmatter md5 (the bytes between the first two --- lines) is identical at merge-base, round-1 bf809e6c5, round-2 and head for all 12: ecedb10c5189 ×9, faab52a0d3f0 (9511), 2ee28f1e1b44 (9746, the empty frontmatter), and the new changeset e0d5a07580e3 unchanged since round 1 ('@object-ui/cli': patch, '@object-ui/types': patch). No package file moved: cli.ts, cli-bin.test.ts, complex.ts, layout.ts, layout.zod.ts are byte-identical to bf809e6c5; objectql.ts and objectql.zod.ts are identical to 1da91cb5e.

Item 1, "six": true. The new changeset's headline now reads "objectui check's help line and six @object-ui/types comments"; no "five" remains in the file. git diff -U0 merge-base..head over packages/types gives exactly six comment sites in five files: complex.ts @1584 plus @1588-1590 (one ChatbotSchema.body docblock, closing on body?: never), layout.ts @1668 (the docblock preceding export interface SemanticElementSchema at 1678), layout.zod.ts @868 (the docblock preceding export const SemanticElementSchema at 896), objectql.ts @3235, objectql.zod.ts @1959 and @2088. The bullet's own enumeration (1 + 2 + 2 + 1) sums to six and every named site is real. The landing body's first paragraph reads "six comments in five @object-ui/types files"; its only other "five" (line 55) is 7694's five cross-file citations, unrelated.

Item 2, "against the schema": all 11 fixed. Every dated note's changed line now carries the tightened form: 10478:40, 6475:41, 7694:38, 8466:53, 8499:20, 8505:52, 9239:17, 9511:88, 9559:16 and 9746:20 say "it never parses against the schema a file whose root carries a structural key", and 8572:81 says "check never parses against the schema a file it recognised that way". No untightened form remains: a literal sweep and a line-joined sweep of every .changeset/*.md at head find "never pars" only in those 11 sites, in the new changeset's round-2-accepted sentence "check never parses a chatbot document that authors it against the schema" (10524:20), and in five sentences about the serve path or SchemaRenderer that are not about check (7650 ×2, 8355:83, 8572:57, 9746:7). The landing body's three occurrences (lines 13, 35, 51) all carry "against the schema". In package sources, complex.ts:1590 reads "never parsed against the schema" (correct). Outside the judged set: the comment at cli-bin.test.ts:179-180 still says "recognised by that key and never parsed" (a test file, unpublished, no assertion depends on it, unchanged since round 1 which passed it); an acceptance-note item, not a blocker.

Landing body, hunted again; no sentence false at head. Reproduced: the "changed" rows (complex.ts one line changed and three added; objectql.zod.ts two lines; objectql.ts one comment line; the new changeset "counts six comment sites"); "Round 3 tightened every note"; "Front matter is byte-identical in all 12". Round-3 gates paragraph: git diff --stat 1da91cb5e..882c5e13e reproduces, and git merge-tree --write-tree ab7751321 head = dab078939, exit 0, reproduces exactly. "None of main's moved files is a file this PR touches" is dated to ab7751321, where main had moved 59 files with 0 overlapping this PR: true of the main it names (10588's squash 58b7b3dc1 landed after ab7751321; see ③). check-changeset-presence "7 source files of 2 released packages, 1 changeset" matches the diff (7 package files across @object-ui/cli and @object-ui/types); check-changeset-overwrite "11 changesets it did not add" matches. The gates split ("Round 3, head 882c5e13e" for changeset gates; "Package gates, head 1da91cb5e (no package file has changed since)") is correct because the delta touches no package file, and every changeset gate is green on the head (Changeset Declaration, Bump Policy, Fixed Group Check, Overwrite Report, Claim Re-read, Line Citation Gate, Control Byte Scan). "Round-1 readings stand at bf809e6c5": cli.ts and cli-bin.test.ts are unchanged since then. The seat's sentence "the seat filed it as objectui#10606": issue 10606 exists, open, label finding, titled "three pending changesets say objectui check reports a bare document's type as unknown, but check skips a root with no structural key and never reaches that warning", citing 8760 / 9533 / 10393 and PR 10595, consistent with round 2's different-family grading. "The claim comment's surface names only the complex.ts docblock": claim comment 5830461205 on objectui#10524, unedited since creation, lists cli.ts, complex.ts (the ChatbotSchema.body JSDoc only), the pin test and pending changesets, and no other @object-ui/types path: true. objectui#6318 exists (closed, "53 in-repo schema files carry a registered ObjectUI type but fail safeValidateSchema").

② Semver level

patch + patch, Clause-②: no: confirmed, unchanged. The round-3 delta is changeset prose only, frontmatter bytes identical in all 12, and no package file has moved since round 2, so round 2's reading stands: the only non-comment source change in the PR is the check .description(...) string plus the 22-line test pin; no export, type, schema or accept set moves. Changeset Bump Policy is green on the head.

③ Boundary flags

  • CI on head 882c5e13e, final read: 43 check-runs, 40 success, 3 skipped (Test (coverage), the coverage-shard matrix stub, dependabot), 0 failure, 0 in progress. Eight runs were in progress on the first read (Spec Main Shape Gate, Test shards 1, 2, 4, 5, 6, 7, 8); all completed success. Lint, Type Check, Test shards 1-8, Test (dist pins), Build & E2E, Line Citation Gate, the five changeset gates and Governed Surface Queue Guard are green. No red check.
  • git merge-tree --write-tree refs/review/main refs/review/pr-10595 (main 21d34d5e2): exit 0, tree 133198e83. PR fix(plugin-kanban): delete KanbanEnhanced.tsx, the module no export or barrel reached (objectui#8932) #10588 (claude/issue-8932-retire-kanban-enhanced) is merged as squash 58b7b3dc1 and edits complex.ts @60 and @131-134 and objectql.ts @3728-3755; this PR edits complex.ts @1584-1590 and objectql.ts @3235. Main now moves 78 files since the merge-base, of which those two are the only ones this PR touches; no hunk is within 1400 (complex.ts) or 490 (objectql.ts) lines of the other's, and the merge is clean. The landing body's "none of main's moved files" sentence is dated to ab7751321 and was true there; against today's main it is stale, not false. GitHub reports mergeable: true, mergeable_state: behind.
  • git merge-tree --write-tree refs/review/br-10518 refs/review/pr-10595 (claude/issue-10518-object-chart-axis-config, now 0b1b1c816, moved since round 2's 74cf402ed): exit 0, tree 3c0bd3db3. That branch edits objectql.ts @141, @4247, @4363, @4491 and objectql.zod.ts @40, @2395, @2498; this PR edits objectql.ts @3235 and objectql.zod.ts @1959 and @2088. Either squash order applies cleanly.
  • Governed sibling: this PR touches 0 skills/ paths.
  • Stop-landing: none. Both round-2 items are fixed exactly as owed, with the delta confined to changeset prose and every frontmatter byte unchanged.

Implemented-by: claude/issue-10524-check-promise-text
Reviewed-by: session_014mXUNuFomfj24w7s1pZzhN

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review September 25, 2026 11:55
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 25, 2026
Merged via the queue into main with commit c2d8659 Sep 25, 2026
45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-10524-check-promise-text branch September 25, 2026 12:10
akarma-synetal pushed a commit to akarma-synetal/objectui that referenced this pull request Sep 28, 2026
… in three pending changesets, and name `objectui validate` for the verdict (objectui#10606) (objectstack-ai#10642)

Fixes objectstack-ai#10606
Clause-②: no

Release text only. Three pending changesets told an author that
`objectui check` reports a bare retired type key as unknown: `{ "type":
"line-chart" }` (8760), `{ "type": "view:dashboard" }` (9533) and bare
`map` (10393). `check` prints that warning only for a file it
recognises. A root with no structural key that does not validate, and
whose `type` is off the known-type list `check` reads, is counted as
skipped, and the run exits 0. Each sentence is corrected in the
objectui#10533 dated-note form, with the front matter byte-identical,
and names `objectui validate` for the verdict. `check` itself is
unchanged: whether it should parse the files it admits is
objectui#6318's open question.

The house wording is PR objectui#10523's: `check` checks the `type` of
each file it recognises, and a file whose root carries an ObjectUI
structural key (`children`, `className`, `body`, …) is recognised by
that key alone. A file with none of those keys is parsed against the
schema. It is listed by name when its root `type` is on the known-type
list and the document does not validate, and is otherwise counted as
skipped. `check` exits non-zero on unreadable JSON only.

## What changed

| file | change |
| --- | --- |
| `.changeset/8760-unfulfilled-chart-stubs.md` | The **Breaking**
paragraph no longer says `objectui check` reports `Unknown schema type
"line-chart"`. It now says `objectui validate` refuses the document at
`type` (`invalid_union`). A new `⚠️ **Dated note, 2026-09-25 — … —
objectui#10606.**` records the correction and says what `check` does
with the bare document and with a structural one. |
| `.changeset/9533-dashboard-bare-key-converge-plugin-namespace.md` |
The **Breaking for authored metadata** paragraph no longer says `check`
reports `{ "type": "view:dashboard" }` as unknown. It names `objectui
validate` instead. In **What changed**, "`objectui check` names it
rather than blessing it" is scoped to "names it in a file it
recognises". One dated note, after the first paragraph, covers both
sentences. |
| `.changeset/10393-retire-bare-map-key.md` | The `@object-ui/cli`
bullet's "so the check now flags it" becomes "so the check now reports
`map` as an unknown schema type in a file it recognises". A dated note
follows the bullet list and names `objectui validate` for the verdict.
Round 2: the same bullet's `view:map` clause, "and `objectui check` does
not flag it", now says `check` does not report `view:map` as an unknown
schema type in a file it recognises, and that a bare `{ "type":
"view:map" }` is listed in `check`'s advisory did-not-validate list
instead. |

Front matter md5 before (at base `5add18a67`) and after, per file,
identical:

| file | md5 of the front matter block |
| --- | --- |
| `8760-unfulfilled-chart-stubs.md` | `24d9e155a9fe760e502862226ced2ba3`
|
| `9533-dashboard-bare-key-converge-plugin-namespace.md` |
`04b5781f09530b1c4efda2273bc5a87a` |
| `10393-retire-bare-map-key.md` | `02a248bf14464234d9665bad2c91931b` |

The 10393 md5 is the same again at the round-2 head `7467d4e39`.
`check-changeset-overwrite` prints the same declared-at-base /
declares-now pair for all three files (quoted under Gates).

## Measurement on base `5add18a67`

I built the CLI with `pnpm --workspace-concurrency=2 --filter
"@object-ui/cli..." build` under the verify lock (`VERDICT command-exit
0`). Each probe document sat alone in its own directory, and `check` ran
with that directory as `cwd`.

| document | `objectui check` over its directory | `objectui validate
FILE` |
| --- | --- | --- |
| `{ "type": "line-chart" }` | `Skipped 1 file with a root "type" that
no ObjectUI recogniser admitted.`, then `✓ All checks passed`, exit 0.
No unknown-type line. | exit 1: `Path: type`, `Code: invalid_union`, `No
arm accepts type "line-chart".` |
| control `{ "type": "line-chart", "className": "h-64" }` | `⚠️ Unknown
schema type "line-chart" in line-chart-structural.json`, exit 0 | exit
1, same error |
| `{ "type": "view:dashboard" }` | `Skipped 1 file …`, exit 0. No
unknown-type line. | exit 1: `Path: type`, `Code: invalid_union`, `No
arm accepts type "view:dashboard".` |
| control `{ "type": "view:dashboard", "className": "h-64" }` | `⚠️
Unknown schema type "view:dashboard" in view-dashboard-structural.json`,
exit 0 | exit 1, same error |
| `{ "type": "map" }` | `Skipped 1 file …`, exit 0. No unknown-type
line. | exit 1: `Path: type`, `Code: invalid_union`, `No arm accepts
type "map".` |
| control `{ "type": "map", "className": "h-64" }` | `⚠️ Unknown schema
type "map" in map-structural.json`, exit 0 | exit 1, same error |

`validate` refuses all three bare documents at `type`. It does not name
a replacement spelling. Its "Nearest … accepted types" hint lists
`chart` for `line-chart` and `dashboard` for `view:dashboard`, and
nothing close to `object-map` for `map`. So the corrected sentences say
only that `validate` refuses the document at `type` (`invalid_union`)
and exits non-zero.

## Why "corrected", not "at this change"

None of the three sentences was ever true of the bare document it
quotes. The recognition gate landed before all three changes: `git
merge-base --is-ancestor 7dc08a3 X` exits 0 for X = `6a4680b57`
(8760), `e356c39ee` (9533) and `64563a915` (10393). `7dc08a3e7` is the
validity-recogniser commit (objectui#6322), and it sits on top of the
marker gate. Exit 0 is self-proving, so no control leg is needed; the
checkout is not shallow. At each of those commits `check.ts` has the
`OBJECTUI_STRUCTURAL_KEYS.some((key) => key in content) ||` recogniser
and the `skipped++` branch. So I followed objectstack-ai#10595's route for sentences
that were never true: the sentence is corrected, and the dated note
records the correction. The objectui#10533 "at this change" scoping
would have asserted a false history.

## H4: other pending changesets that name `check` near a diagnostic

Sweeps, run against `origin/main`, with both the file list and the
contents read from that ref:

1. The dispatch grep `git grep -n -E "objectui
check|\bcheck\b.*(reports|flags|refuses|Unknown schema type)"
origin/main -- .changeset`.
2. A paragraph-level node scan across line breaks: a paragraph that
names the CLI (`objectui check`, backticked `check`, `the check`, `check
command`) together with `unknown`, `flag`, `warn`, `report`, `names it`,
`bless` or `unrecognised`. It matched 25 paragraphs. I re-ran it at main
`98b1a7cac` after fetching, and it matched the same 25.
3. `git grep -i -E "unknown schema type|unknown-type|as unknown|flags?
(it|them|the|a|bare)"` over `.changeset/` at main `98b1a7cac`.

The test for each hit: does it promise a `check` diagnostic on a
document with no structural root key? Every hit I read, with its
verdict:

| hit | verdict |
| --- | --- |
| `8760` **Breaking** paragraph | changed (above) |
| `9533` **Breaking** paragraph, and "names it rather than blessing it"
in **What changed** | changed (above) |
| `10393` `@object-ui/cli` bullet, "so the check now flags it" | changed
(above) |
| `10393` same bullet, `view:map` "`objectui check` does not flag it" |
changed in round 2. A bare `{ "type": "view:map" }` is flagged by name
in the advisory did-not-validate list, so the absence claim was false. |
| `8802` "`objectui check` will NOT flag either namespaced spelling" |
stands. It claims an absence and promises no diagnostic. |
| `unknown-component-type-case-suggestion-5247` "`objectui check`
reports `Unknown schema type "Page" in FILE — did you mean "page"?`" |
stands. It gives the text of the warning, framed as "both surfaces that
report the miss", and quotes no document. (Here `FILE` stands for the
angle-bracket placeholder the entry prints, which GitHub deletes from a
body.) |
| `9641` (four paragraphs: "Stop `objectui check` reporting five real
page types as unknown", and so on) | stands. It describes a false
positive being removed and promises no diagnostic. |
| `check-schema-positive-marker-and-skip-count` (two paragraphs),
`6075`, `7004`, `6074` | stand. They describe the marker gate, the
validity recogniser and the skip count themselves. |
| `8499` "**Downstream.** `objectui check` stops reporting these
documents", `7113` (`chart: 2` census), `6939` ("counts four for this
row") | stand. They are about the advisory list; objectstack-ai#10595 read them the
same way. |
| `6051`, `8344`, `7546` | stand. They say `check` / `validate` call
`safeValidateSchema`, which is true of the validity arm. |
| `7694`, `10478`, `6475`, `8466`, `8505`, `8572`, `9239`, `9511`,
`9559`, `9746`, `10524` | objectstack-ai#10595 already reconciled these (the
validation-verdict family, `objectui#10524` dated notes). None of them
promises the unknown-type warning on a bare document. |
| `6320` | stands. It is about the glob ignore list. |
| `6143`, `6296`, `6426`, `6559`, `6577`, `7122`, `7282`, `7804`,
`8557`, `9126`, `9497`, `9653`, `9659`, `9743`, `9922`,
`curly-hoops-attack`, `issue-5709-…`, `nine-holdouts-six-narrow`,
`tidy-pumas-repeat` | not the CLI. They name another `check*` script, a
gate or the plain word. |

So no H4 hit beyond the three named files.

## Gates at head `c9ef2ce5d`

The diff touches only `.changeset/*.md`. No workspace package changed,
so there is no dependency-closure build and no package `type-check` or
test run to owe. The CLI build above was for the measurement only. The
families below come from objectui's own `package.json` and
`.github/workflows/`: `changeset-guard.yml` (no-major, overwrite),
`changeset-presence.yml` (presence, claims), `ci.yml` (fixed),
`control-bytes.yml`, `line-citation-gate.yml`, and the `check:*` scripts
that read `.changeset/**`.

| gate | verdict line | exit |
| --- | --- | --- |
| `node scripts/check-changeset-presence.mjs` | `✅ No source or
published contract of a released package changed in this range, so no
changeset is owed.` | 0 |
| `node scripts/check-changeset-overwrite.mjs` (report-only) | `⚠️ This
change touches 3 changeset(s) it did not add`. For all 3 files the
declared-at-base line equals the declares-now line. | 0 |
| `node scripts/check-changeset-no-major.mjs` | ``✅ No changeset
declares a `major` bump.`` | 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 3 body(ies) is either not negated …` and
`✅ No pending changeset names a file this change touches.` | 0 |
| `pnpm check:new-line-citations` | `VERDICT
new-cross-file-line-citations: 0 new citation(s), enforcement
report-only -> exit 0` | 0 |
| `pnpm check:control-bytes` | `✅ check-control-bytes: OK (scanned 8726
tracked text file(s); skipped 85 binary).` | 0 |
| `pnpm check:pending-changeset-literals` | `✅ No test source names a
pending changeset.` | 0 |
| `pnpm check:installed-pin-claims` | `OK` | 0 |
| `pnpm check:vi-mock-override-shape` | `✅ check-vi-mock-override-shape:
OK …` | 0 |
| `node scripts/markdown-test-inputs.mjs --changed` (the three paths) |
lists all three: they fall under the `.changeset/**` input class of
`check-changeset-no-major.test.ts` and
`dollar-dialect-alias-census.test.ts` | 0 |

The two tests that read `.changeset/**`, `pnpm exec vitest run
--maxWorkers=2 scripts/__tests__/check-changeset-no-major.test.ts
scripts/__tests__/dollar-dialect-alias-census.test.ts` under the verify
lock: `Test Files 2 passed (2)`, `Tests 44 passed (44)`, `VERDICT
command-exit 0`.

`git merge-tree --write-tree HEAD origin/main` (main at `98b1a7cac`)
exits 0. Main has not changed any of the three files since base.

H5: overwrite gate route. objectstack-ai#10595 cleared `check-changeset-overwrite` as
report-only (its PR body quotes the same `⚠️ This change touches 11
changeset(s) it did not add` line, exit 0). No allow-list, no trailer
and no gate label was involved. `changeset-guard.yml` runs the script
without `OS_CHANGESET_OVERWRITE_ENFORCE`. This PR takes the same route:
case 2 of the script's own text, "prose that no longer matches the
change". No pin is owed: this PR changes changeset prose only.

## Round 2, head `7467d4e39`

The contract review of `c9ef2ce5d` found one false sentence, and
measured it. In `10393`, the `view:map` clause "and `objectui check`
does not flag it" was false for a bare document. `{ "type": "view:map"
}` prints the advisory header `⚠️ 1 file carries a registered ObjectUI
component type but did not validate as an ObjectUI schema:`, then
`view-map.json (type "view:map")` on the next line, exit 0. With
`"className": "h-64"` it prints nothing. The clause now reads, rewrapped
to the file's width: "and `objectui check` does not report it as an
unknown schema type in a file it recognises. A bare `{ "type":
"view:map" }` with no structural key is listed in `check`'s advisory
did-not-validate list instead, because `view:map` is on the known-type
list and `AnyComponentSchema` has no arm for it; that line does not say
the node renders a placeholder. Search documents for `view:map`
directly." `packages/types/src/` has no `view:map` literal (positive
control: `object-map` has 3 hits in `zod/objectql.zod.ts`). The file's
dated note already says a non-validating file is listed by name when its
`type` is on the known-type list, so it agrees with the new clause and
is unchanged. Front matter md5 `02a248bf14464234d9665bad2c91931b` at
`5add18a67`, `c9ef2ce5d`, `7467d4e39` and `3f0f8eca3`.

Round 3, head `3f0f8eca3`: "because `view:map` is on that list" became
"because `view:map` is on the known-type list". "That list" followed the
advisory did-not-validate list and could be read as naming it. No other
byte changed. At that head, `check-changeset-presence`,
`check-changeset-no-major` and `check-control-bytes` print the same
verdict lines as in the table below, each with exit 0. `git merge-tree
--write-tree HEAD origin/main` (main at `f99f9cde7`) exits 0.

| gate at `7467d4e39` | verdict line | exit |
| --- | --- | --- |
| `node scripts/check-changeset-presence.mjs` | `✅ No source or
published contract of a released package changed in this range, so no
changeset is owed.` | 0 |
| `node scripts/check-changeset-no-major.mjs` | ``✅ No changeset
declares a `major` bump.`` | 0 |
| `node scripts/check-control-bytes.mjs` | `✅ check-control-bytes: OK
(scanned 8726 tracked text file(s); skipped 85 binary).` | 0 |
| the two `.changeset/**`-reading tests, under the verify lock | `Test
Files 2 passed (2)`, `Tests 44 passed (44)`, `VERDICT command-exit 0` |
0 |

`git merge-tree --write-tree HEAD origin/main` (main at `4a3d500fd`)
exits 0. Main has not changed any of the three files since base.

## Acceptance notes

These are not filed.

- This one is read from source and not measured. At each change's
parent, the retired key was on the CLI's known-type list
(`known-schema-types.ts` has the literal at `6a4680b57^`, `e356c39ee^`
and `64563a915^`), and `packages/types/src/zod/` has no literal for it.
So the same bare document was then most likely listed in the advisory
"did not validate" list, and the retirement moved it into the silent
skipped count. That bears on objectui#6318's open question and is not
acted on here.

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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding(cli,types): two published sources still promise objectui check validates schemas — the CLI's check help text and ChatbotSchema.body's JSDoc

2 participants