Repository navigation
feat(types): declare node-level responsiveStyles on flex, object-grid and object-chart, by reference to the spec (objectui#10872, batch 9) - #11273
Conversation
…-grid` and `object-chart`, by reference to the spec (objectui#10872, batch 9) The three arms outside the public-block set whose nodes a producer writes `responsiveStyles` on spread batch 8's shared fragment, so the member is the same object on all 33 arms. The fragment is renamed from `PUBLIC_BLOCK_ENVELOPE` to `NODE_ENVELOPE`, because it is no longer the public blocks' alone. The published TypeScript twins declare the key as the spec's `ResponsiveStyles`, which the mirror-parity census requires for a mirrored key. `BaseSchema` and every other arm are unchanged. Claude-Session: https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ Co-authored-by: Claude <noreply@anthropic.com>
… and the imported-defaults note (objectui#10872) Text only. The census reads the row's presence, not its words. Claude-Session: https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ Co-authored-by: Claude <noreply@anthropic.com>
…eStyles` (objectui#10872, batch 9) The slot takes `ObjectGridSchema`'s members, so declaring the key on the grid put it in the slot too, where nothing compiles it: the view draws its grid as a component. The slot now refuses `table.responsiveStyles` by name on both faces, as it refuses the other node-level keys (objectui#10976), with a reason of its own. The two member pins that read the TypeScript twins name the one new member: the grid's count, and the one member `flex` declares and `stack` does not. Claude-Session: https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ Co-authored-by: Claude <noreply@anthropic.com>
…n, not a bare `any` (objectui#10872) `stack` declares no `responsiveStyles`, so its member resolves through the index signature: the exact shape the three twins had before this batch. No explicit `any` is left in the file. Claude-Session: https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ Co-authored-by: Claude <noreply@anthropic.com>
|
changeset-claim-re-read
|
✅ Console Performance Budget
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
Size Limits
|
Contract reviewServed-tier: PR objectui#11273 (batch 9 of card objectui#10872), judged against the card's body and its 54 comments, the PR body and file list, the net diff against ① Derived judgmentsEvery accept-set and public-surface change the diff implies, each judged:
② Semver level
③ Boundary flagsDev report
Implemented-by: VERDICT: PASS |
…, mirror two chatbot keys, file eighteen runtime slots by name (objectui#6152, round 4) (objectstack-ai#11285) Refs objectstack-ai#6152 Clause-②: yes (narrowing). The two mirrors widen `@object-ui/types/zod` and the strict authoring face to keys the TypeScript face already invited and the renderers read (`requestBody`, `floatingConfig`). The four retirements (`label.content`, `report.chartConfig`, `report.reportType`, `detail-view.autoDiscoverRelated`) narrow both faces at once, under the startup no-gradualism rule. It is priced in `.changeset/6152-unmirrored-round4.md` as `minor`, with the break stated. Round 4 of objectui#6152, dispatched under claim `5919877490` (the `domain:devx` seat 2, session `session_01TdiauJaVCHuj45EzZGUxHh`, on the maintainer's direct order). The rulings are the seat review `5914490915`: Q1 B, Q2 A, Q3 B. ⛔ This is a draft from a dispatched dev: do not mark it ready and do not enable auto-merge. The card stays open, because `ObjectGridSchema`, the spec-derived pairs and three `DataTableSchema` keys (below) are not this round's. ## What changed 1. **Q1 B: `LabelSchema.content` is retired.** It is `?: never` on `form.ts` and a `retirementTombstone` on `form.zod.ts` that names the kept spellings `text` and `label`. The `label` renderer drops its third read limb (`schema.text || schema.label`). Re-measured: 0 documents author it (JSON, Markdown JSON fences and typed literals); its only author was a test in `form-renderers.test.tsx`, which now pins the refusal. Which of `text` / `label` is canonical is not decided here. 2. **Q2 A: `DetailViewSchema` `activities`, `comments`, `history` and `recordNavigation` go to `RuntimeOnlyDeclared` by name.** Each has a row with its reason on `RuntimeOnlyNamedAllowList`, in round 3's shape. They carry host-fetched runtime data, and `recordNavigation.onNavigate` is a required function. 3. **Q3 B, under objectui#7654 ruling B: `displayMode` keeps its TypeScript-only refusal.** It gets no zod arm, because stored designer documents carry `displayMode: 'floating'` (pinned by `chatbot-display-mode-retired.test.ts`). The ledger entries no longer call the mirror half "owed"; the key stays listed by decision. Separately, after a reader census for each: - `ChatbotSchema.requestBody` is mirrored through the shared pick. All three chatbot registrations read it (`body: schema.requestBody`). - `ChatbotFloatingSchema.floatingConfig` is mirrored through a module-private restatement of `FloatingChatbotConfig`. That restatement judges the six members `FloatingChatbot` destructures, and carries the `triggerIcon` tombstone's runtime half that the objectui#7654 tripwire asked for. 4. **The three zero-read candidates are retired on both faces.** They are `ReportComponentSchema.chartConfig`, `ReportComponentSchema.reportType` and `DetailViewSchema.autoDiscoverRelated`, each `?: never` plus a `retirementTombstone`. `reportType`'s one in-code producer, `specReportToPresentation` in `spec-report.ts`, no longer writes it, and `LegacyReportPresentationLike` no longer declares it. 5. **`DataTableSchema`: 14 of 17 keys go to `RuntimeOnlyDeclared` by name.** They are produced only in code, by `ObjectGrid`'s in-code `data-table` node or `RelatedList`'s, and authored by no document. Three keys fit none of the classes, so the round stopped at them (see "Stopped" below). 6. **The pagination corpus fix, carried from round 3.** `components-basic-pagination/with-item-count.json` no longer authors `pageSize` / `totalItems`, which neither face declares and nothing reads. The plaintext interface block on `content/docs/components/basic/pagination.mdx` stops listing them, and its section is retitled from "With Page Size" to "On a Later Page". 7. **Changesets.** One new: `.changeset/6152-unmirrored-round4.md` (`@object-ui/types` minor, `@object-ui/components` minor, with the break stated). Four dated, append-only corrections were added, each 2 lines with frontmatter unchanged: `6639-objectgrid-title-mirrored.md` (the stale "97 + 1 + 23" sentence), `7654-floating-chatbot-trigger-icon-tombstone.md`, `7655-chatbot-registration-authoring-faces.md` and `9447-detail-view-handler-key-refusal.md`. Every other pending changeset was re-read after the merges, including the 8 that landed since the base, and none is made false by this round. ## Ledger totals, before and after These are read by the file's own pins (`objectui#7279` derives every figure) and re-counted with the TypeScript parser on the final head. | ledger | before (`origin/main` `e420df3`) | after (`2cc4ab9`) | | --- | --- | --- | | `UnmirroredDeclared` | 9 entries / 44 keys: 3 / 14 spec-derived, 6 / 30 local | **6 / 20**: 3 / 14 spec-derived, 3 / 6 local | | `RuntimeOnlyDeclared` | 4 / 9 | **4 / 27** | | `RuntimeOnlyNamedAllowList` | 1 entry / 2 rows | 3 / 20 | | cross-ledger | 2 of the 4 are in `UnmirroredDeclared`; union 11 = 9 + 2 | **1 of the 4**; union **9** = 6 + 3 | | `KnownDrift` | 49 / 86 | 49 / 86, unchanged. This round does not edit its total line; PR objectstack-ai#11269's 87 to 86 edit is kept as merged. | | `WiderThanDeclared`, `MirroredUndeclared` | 3 / 3, 2 / 2 | unchanged | The 24 keys that left `UnmirroredDeclared` moved by three routes, which must not be added up as one repair: 2 were mirrored, 4 were retired, and 18 were reclassified by name. The reclassification is one move seen from both ledgers: it is not new debt, and it mirrors nothing. ## Per-key table | pair · key | measured (type-checker read census over 5548 sources; authored census over tracked JSON, Markdown JSON fences and `type` literals) | route | | --- | --- | --- | | `label` · `content` | 1 read (the third limb in `label.tsx`), 0 documents (1 test) | retired on both faces; the read is dropped | | `report` · `chartConfig` | 0 typed reads. The untyped `widget?.chartConfig` hits are plugin-dashboard's `DatasetWidget` (`widget: any`, a dashboard widget), which plugin-report never imports. 0 documents | retired on both faces | | `report` · `reportType` | 0 reads; one in-code producer (`specReportToPresentation`); 0 documents | retired on both faces; the producer write is removed | | `detail-view` · `autoDiscoverRelated` | 0 reads (typed or untyped), 0 documents | retired on both faces | | `chatbot` · `requestBody` | 3 reads (all three chatbot registrations) | mirrored (shared pick) | | `chatbot-floating` · `floatingConfig` | 1 read (`floatingConfig={schema.floatingConfig}`); 6 of 7 `FloatingChatbotConfig` members read, and `triggerIcon` 0 | mirrored, with a `FloatingChatbotConfig` restatement | | `chatbot`, `chatbot-floating` · `displayMode` | 0 reads; stored documents carry it | unchanged by ruling (TypeScript-only refusal) | | `detail-view` · `activities` (7 reads), `comments` (4), `history` (7) | host-fetched rows; 0 documents | `RuntimeOnlyDeclared` by name | | `detail-view` · `recordNavigation` | 11 reads; its value carries a required function | `RuntimeOnlyDeclared` by name | | `data-table` · `disableInnerScroll`, `manualPagination`, `manualSearch`, `manualSorting`, `page`, `rowActionDefs`, `rowClassName`, `rowCount`, `rowStyle`, `search`, `selectionResetKey`, `showAddRow`, `showSelectionCount`, `sort` | read by `data-table`; produced only in code (`ObjectGrid`, `RelatedList`); 0 docs and 0 catalog documents | `RuntimeOnlyDeclared` by name; the reasons are on the allow-list | | `data-table` · `editable`, `singleClickEdit` | read; produced in code by `ObjectGrid`; 0 documents, but `data-table.mdx` lists both and teaches `editable: true` | **stopped**, ruling needed | | `data-table` · `selectionStyle` | read; 0 producers and 0 documents (0 hits in objectstack too) | **stopped**, ruling needed | ## Runtime probe for the three zero-read retirements AGENTS.md requires more than a source census, because leftover keys reach a renderer as spread props. So the probe used the real `SchemaRenderer` and the real registry, and varied only the key. It was a one-off: the files were deleted afterwards and `git diff HEAD` is empty. - `report`: the DOM is identical with and without `chartConfig` plus `reportType` (797 = 797 characters, byte-equal). Lit control: changing `title` changes the DOM (805). - `detail-view`: the DOM is identical with and without `autoDiscoverRelated: true`, after normalising React's `useId` tokens. The only raw difference was `radix-_r_5_` against `radix-_r_d_`. The data-source and `fetch` call log is identical: `getObjectSchema(account)` and two `security/explain` fetches. Lit control: changing `title` changes the DOM (5943 against 5951). ## Ablations The predictions were written at `4c272dc` before any run, and every leg was restored with the blob equal to `HEAD` and `git diff HEAD` empty. - **A1:** plant a `LabelSchema` literal carrying `content` into `label.tsx`. Components `tsc --noEmit` exits 2 with exactly one TS2322 there (`'string' is not assignable to type 'undefined'`), as predicted. This red direction also shows the consumer read the rebuilt `.d.ts`. - **A2:** restore the four `zod/*.zod.ts` files to base `f61dab1`. `unmirrored-declared-round4-6152.test.ts` reads `27 failed | 6 passed (33)`, exactly as predicted, and `tsc -p tsconfig.test.json` exits 2 with its only error in the ledger reconciliation of `zod-mirror-parity.test.ts`. - **A3:** rename the allow-list row `rowCount` to `rowCountRenamed`. `tsc -p tsconfig.test.json` exits 2 with exactly two TS2344, at the two allow-list pins, as predicted. ## Verification on the final head `2cc4ab9` This round resumed after two container restarts, so every run below was redone on `2cc4ab9`. That head carries `origin/main` `e420df3`, merged twice (never rebased): once through PR objectstack-ai#11275, and before that through PRs objectstack-ai#11267, objectstack-ai#11268, objectstack-ai#11269, objectstack-ai#11271, objectstack-ai#11273 and objectstack-ai#11274. Each run went through the shared verify lock with at most 2 workers. - `@object-ui/types`: `type-check` (the `--noEmit`, `tsconfig.examples.json` and `tsconfig.test.json` legs) exits 0; `vitest run packages/types/` gives 299 files and 7498 tests passed; `build` exits 0 (138 emitted files verified). - Consumers, from the type-checker census: `type-check` exits 0 with 0 TS errors for `components`, `plugin-report`, `plugin-detail` and `plugin-chatbot`. `vitest run packages/plugin-report/ packages/plugin-chatbot/` plus `form-renderers.test.tsx` gives 78 files, 827 passed and 7 skipped. All 228 `plugin-detail` test files, run in two halves, give 227 files passed plus 1 skipped, and 2264 tests passed plus 8 skipped. - Zod-face consumers: `vitest run examples/schema-catalog/ packages/cli/` plus the 17 app-shell files that import `@object-ui/types/zod` or sit in `metadata-admin/previews/__tests__` give 77 files and 2741 tests passed. - Gates, all exit 0: `check:changeset-claims`, `check:pending-changeset-literals`, `check-changeset-presence` (16 source files of 2 released packages, 1 changeset), `check-changeset-no-major`, `check-changeset-fixed`, `check-changeset-overwrite` (report-only; its 4 findings are the 4 dated appends above), `check:control-bytes` (9717 files), `check:doc-fences`, `check:doc-snippets` (697 of 697 blocks judged, 0 failed), `check:doc-examples`, `check:doc-types`, `check:doc-example-ids`, `check:doc-example-readers`, `check:skill-examples`, `check:handler-key-reads`, `check:component-surface-parity` (report-only), `check:designer-field-key-parity`, `check:element-data-source-declaration`, `check:new-line-citations` (0 new), `check:prompt-keys`, `check:readme-exports`, `check:spec-symbols`, `check:test-path-roots`, `check:unreferenced-sources` and `check-type-check-coverage`. `doc-snippets` and `doc-examples` ran after the scoped build their own `--build-filter` names (35 turbo tasks, all successful). - Lint, narrowed: `eslint --no-inline-config --format json` over the 16 lintable changed files gives 0 errors. All 16 were judged and 0 were ignored, a population read from eslint's own output. The 39 warnings are pre-existing `no-explicit-any`, and the diff adds no explicit `any`. `eslint.config.js` declares no `parserOptions.project` or `projectService`, and no custom rule in `eslint-rules/` reads the disk, so this diff cannot move any untouched file's verdict. The repo-wide `pnpm lint` is CI's. - Governed surface: `check-governed-queue-guard.mjs --test` over the 23 paths reports NOT GOVERNED. - NOT MEASURED: - `check:sdui-registration-pins`: it needs a console build, and this diff changes no registration. - The full `pnpm test` farm and repo-wide lint: CI's. - `plugin-grid`: its code and tests are untouched. The 14 reclassified keys moved between two test ledgers and no declaration changed. ## Stopped (ruling needed; reported in the card report with options) - `DataTableSchema.editable` and `singleClickEdit`. `data-table` reads both and `ObjectGrid` sets both in code, while no document authors them. But `content/docs/components/complex/data-table.mdx` lists both in its interface block and teaches `editable: true`. Filing them runtime-only would contradict that page. Mirroring them would rest on no authored document, and, from the source, an authored `editable: true` stages cell edits locally and persists nothing without the `onRowSave` / `onCellChange` function slots. - `DataTableSchema.selectionStyle`. `data-table` reads it (`'always'` or `'hover'`), and nothing authors or produces it in either repository. - Noted, not narrowed: `ChatbotSchema.floatingConfig` has 0 reads on the `chatbot` node (only `chatbot-floating` reads it), which makes it an ADR-0049 narrowing candidate. The `chatbot` half of `floating-chatbot-trigger-icon-retired.test.ts` pins its absence as a tripwire. ## Parallel discipline PR objectstack-ai#11269 and PR objectstack-ai#11273 edited `zod-mirror-parity.test.ts` in disjoint hunks: the `KnownDrift` total line, the Kanban entry and one `EXCLUSIONS` row. Both merges were clean. This round's ledger edits stay in the `UnmirroredDeclared` / `RuntimeOnlyDeclared` / `RuntimeOnlyNamedAllowList` blocks, their prose totals and its own pairs' entries. Every prose total was reconciled to the measured count above. The diff does not touch `zod/objectql.zod.ts`, `zod/index.zod.ts`, `zod/nested-component-walk.ts`, `strict-authoring-face.ts`, `zod/README.md`, `field-types.ts`, the `DetailViewField` member, or `data-table.tsx` (read only). ## Acceptance notes - 23 files, under the ~25-file size guard, so no pair was cut. - Every pending changeset this round made false carries a dated append. The ones it leaves true were re-read: `7654-chatbot-display-mode-tombstone.md`, `6150-…`, `7804-…`, `6175-…`, `7722-…`, `7947-…` and `8072-…`. Session: `https://claude.ai/code/session_01TdiauJaVCHuj45EzZGUxHh` --- _Generated by [Claude Code](https://claude.ai/code/session_01TdiauJaVCHuj45EzZGUxHh)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
Part of #10872
Clause-②: yes
Batch 9 of objectui#10872. It declares the node-level
responsiveStylesthat@objectstack/spec'sPageComponentSchemadeclares on every page component on the three arms outside the public-block set that a producer writes it on:flex,object-gridandobject-chart. The declaration is by reference to the spec, from batch 8's fragment. Claim5918816527, seatdomain:ui#1, sessionhttps://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ.Clause-② yes (widening). The strict authoring face (
StrictAnyComponentSchema) now accepts a spec-valid node-levelresponsiveStylesonFlexSchema,ObjectGridSchemaandObjectChartSchema. Before, it refused the key by name. Changeset:.changeset/10872-flat-arm-responsive-styles.md,'@object-ui/types': minor. Unlike batch 8's arms, these three were already published, so the changeset spells out the narrowings too (see Acceptance notes).What changed
FlexSchema(layout.zod.ts),ObjectGridSchemaandObjectChartSchema(objectql.zod.ts) spread the same fragment the 30 public-block arms spread. The member is ONE object on all 33 arms: the spec'sResponsiveStylesSchemathrough the objectui#8317 boundary.BaseSchemais not touched, and neither is any other arm.PUBLIC_BLOCK_ENVELOPEtoNODE_ENVELOPE. It stays inpublic-blocks.zod.ts, because that module imports onlybase.zod.ts,imported-defaults.tsandtombstone.zod.ts, so neither import makes a cycle. Withflexspreading it, the old name would tell a reader thatflexis a public block. The rename is mechanical: 30 occurrences inpublic-blocks.zod.ts, 5 inobjectql.zod.ts, plus one census row key, one test comment and one README line. On-disk counts were 0 old / 38 new after the rename.FlexSchema(layout.ts),ObjectGridSchemaandObjectChartSchema(objectql.ts) declareresponsiveStyles?: ResponsiveStyles, the spec's type by reference (type-only import, asdataSource?: ElementDataSourcealready is). It is not onFlexLayoutProps, sostackdoes not gain it.object-view'stableslot does not gain the key. The slot is built fromObjectGridSchema's shape, so the zod change alone would have madetable.responsiveStylesaccepted and judged, where nothing compiles it:ObjectViewdraws its grid as a component. The slot now refuses it by name, as it refuses the other node-level keys (objectui#10976). The reason is its own, not the shared node-level one, because that one points the author at theobject-viewnode, whose arm does not declare the key either.packages/types/src/__tests__/flat-arm-responsive-styles-10872.test.ts, with 37 runtime rows and 3 type-level assertion groups. Forced edits to existing pins:flextogrid;object-view-slot-key-lists.test.ts: the grid's member count goes from 63 to 64, andresponsiveStylesjoins thenodeLevelwithheld set;stack-schema-emitted-members.test.ts:stackdeclares exactlyflex's members less the namedresponsiveStyles;zod-mirror-parity.test.tsandimported-defaults-8317.test.ts: the row key follows the rename, and the reason names the three arms. The census reads presence, not words.README.mdline plus the rename in the existing line, and one changeset.The order's mechanism assumptions, measured
The pull, re-driven. objectui
54a78308a3was read from its tracked files. objectstackaaad682dbc(main at 2026-09-30T19:33Z) was read from a depth-1 scratch clone; the shared checkout was not fetched or edited. The instrument isscripts/body-dialect-census.mjs(scanNodes,keepFencedCodeOnly,bucketOf) under an uncommitted scratch driver. It counts NODES carrying a node-levelresponsiveStyles, and it reads the arm population at run time fromAnyComponentSchema(189 literals, 30 of them public-block literals).flex16 (showcasecommand-center.page.ts8 andstyling-gallery.page.ts7, plus skillrules/pages.md1),object-chart1 andobject-grid1 (both incommand-center.page.ts). Every other non-public arm: 0. objectui non-test: 0.flex11; objectuiflex1,object-chart1).The faces at base. For all three arms, the strict face refused a valid map as
unrecognized_keysnamingresponsiveStyles. The tolerant face ACCEPTED and kept7and{ md: … }unjudged.grid,stackandcontainerread the same. Confirmed.Reuse the fragment. There is no cycle, so the fragment was not moved. It was renamed because the name would lie (see What changed). There is no second copy of the member: the pin asserts identity with
PageSectionBlockSchema.shape.responsiveStyles.Flat arms and the TypeScript twins. Measured with the zod member alone, before any TypeScript edit,
tsc -p tsconfig.test.jsonfailed on two census assertions:assertionMirroredUndeclaredMatchesLedgernamed exactly the three pairs (layout.zod.ts#FlexSchema,objectql.zod.ts#ObjectChartSchema,objectql.zod.ts#ObjectGridSchema);assertionMirroredUndeclaredRecordsEveryKeynamedresponsiveStyles.Two edits turn it green: three new
MirroredUndeclaredrows, or the declaration on the twins. That ledger is a floor that "can only shrink", so the declaration was taken, by reference to the spec's type, as the order's item 4 says. It is part of the same widening. Two more consumers read the twins through the compiler and were forced as listed above.BaseSchemastays untouched. It is not in the diff; the pin asserts thatBaseSchema.shapelacks the key and that every other arm refuses it. There is noneeds_decision.Evidence
Red first, at base
54a78308a3with the pin added and the source unmodified.pnpm exec vitest run --maxWorkers=2 …/flat-arm-responsive-styles-10872.test.tsgaveTests 17 failed | 20 passed (37). The 17 reds:unrecognized_keys);The 20 controls (population, lit control,
grid/stack/container, and the other five envelope keys) were green.pnpm --filter @object-ui/types type-checkat base gave 8 errors: TS2339 on the three zod shapes, and TS2344Type 'false' does not satisfy the constraint 'true'on the three TypeScript-twin assertions.Ablation, at
c4edd1d106with the implementation committed first. It ran three single-arm legs through objectstack'sscripts/ablation-replace.mjsin WRAP mode, plus a shell trap restoring both zod files by absolute path. Each leg deleted one arm's spread, and each anchor hit exactly once:flexleg: blob797a9c0b4e63to6011a4533631,Tests 7 failed | 30 passed (37);object-gridleg:2aa44c282213to1e00d88afe2c,6 failed | 31 passed;object-chartleg:2aa44c282213to673ec48085df,6 failed | 31 passed.The union of the three is exactly the 17 red-first rows. Every restore read
ok restored: blob == HEAD … git diff HEAD is empty, and the final check read both blobs equal to HEAD withgit diff HEADat 0 bytes. The pin imports../zod/index.zod.jsfrom source, so there is no dist leg.Reverse type check, through the rebuilt
dist. A scratch consumer inpackages/componentsresolved@object-ui/typestopackages/types/dist/index.d.ts(--traceResolution). It got exactly 3 errors, one per bad line: TS2353'md' does not exist, TS2559 for a number, and TS2322 for a boolean style value. The three valid lines got none. The scratch files were deleted.Runtime probe (scratch, deleted). Each type was mounted through the real
SchemaRendererand registry, and each emitted astyle[data-os-scope]with the base block and the@mediaoverride:flex: the scope class is on the flex rootdiv;object-grid: on the grid's containerdiv, which holds the rows;object-chart: on the chart container ([data-slot="chart"]), which holds the SVG.In each control without the key, 0 style tags were emitted. Declared is enforced on these arms.
Final head
c31dff6c1f, clean tree, one os-verify-lock hold per step, every VERDICT command-exit 0:pnpm --filter @object-ui/types buildgavedist completeness: 1 package(s) complete;pnpm --filter @object-ui/types type-checkpassed, andtsc -p tsconfig.test.json --listFilesOnlylists both 10872 pins;pnpm exec vitest run packages/types/gaveTest Files 296 passed (296)andTests 7412 passed (7412);pnpm exec vitest run packages/cli/gave23 passed (23)and335 passed (335); the registered-types ratchet is unchanged;packages/typesandpackages/cli: every file naming the zod node union, the strict face,safeValidateSchema, the@object-ui/types/zodentry, an arm.shape, orFlexSchema/StackSchema/ObjectGridSchema/ObjectChartSchema/ObjectViewSchema/responsiveStyles/ the fragment. It gave79 passedwith 1537 tests and83 passedwith 1196 tests;scripts/__tests__files that read.changeset/gave24 passed (24)and914 passed (914).Gates at
c31dff6c1fobjectui has no
scripts/pm/dispatch-gates.mjs. The families were derived by hand from the rootpackage.jsonfor this diff's paths (packages/types/src/**, one README, one changeset).pnpm check:handler-key-reads: exit 0,OK 140 arm(s), 212 registration(s).pnpm check:spec-symbols: exit 0.pnpm check:new-line-citations: exit 0,VERDICT new-cross-file-line-citations: 0 new citation(s).node scripts/check-changeset-presence.mjs: exit 0,12 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s).pnpm changeset:check: exit 0,No changeset declares a major bump.pnpm check:control-bytes: exit 0. Agrep -Pcontrol-byte scan of the 13 changed files found 0.check:changeset-claims(report-only),check:pending-changeset-literals,check:component-surface-parity(report-only; no row names these keys),check:test-path-roots,check:element-data-source-declaration,check:esm-specifiers, andmarkdown-test-inputs --audit.check-governed-queue-guard.mjs --teston the 13 paths: NOT GOVERNED.--no-inline-config --format json: 11 files, 0 errors. All 37 warnings areno-explicit-anyon lines this diff does not add (checked line by line against the diff).--print-configshows noproject/projectService, so linting is not type-aware and an untouched file's verdict cannot move. Repo-widepnpm lintis CI's.check:readme-exports. Its population collapsed (packagesRead: found 3, floor is 25) because the other packages'distis not built in this worktree. That is a prerequisite, not a verdict. The README lines edited here carry no fenced block.Acceptance notes
responsiveStylesvalue on the three arms, andtable.responsiveStylesby name. The three TypeScript interfaces type the key as the spec's type, where it wasanythrough the index signature. Level:minor, as the ruling set it;check-changeset-no-majorforbidsmajor.properties. The three flat arms do not declareproperties, so the strict face also refuses them by name. On the tolerant face theobject-gridandobject-chartnodes are refused too (objectNamerequired; no chart family), because the arms read those keys at node level.SchemaRendererhoistspropertiesand renders the nodes, and the spec accepts them. This is reported to the seat as a finding, and is relevant to PR objectui#11069's un-park census.object-chart's scope class lands on the chart container, not theObjectChartroot. A first probe on a node with no series binding drew the explanatory placeholder, and that placeholder did not carry the class.Type Check. Outsidepackages/types, no TypeScript source writesresponsiveStyleson a node typed as one of these interfaces: the only hits are comments,identity-probefixtures andSchemaRenderer's own read. The one derived type, thetableslot'sPick, is pinned byobject-view-slot-key-lists.origin/mainmoved tof4ed2387e9(objectui#10188, objectui#11163) with zero file overlap with this branch, so it was not merged; the queue rebuilds onmain.Deviations
public-blocks.zod.ts(rename only),layout.ts/objectql.ts(the twins, forced by the census), and two existing type-reading pins (forced). Each is listed above with its reason.Generated by Claude Code