Repository navigation
feat(types)!: an authored object-chart takes its props in the properties bag; the flat spelling is refused by name (objectui#11276) - #11328
Conversation
…ies bag (objectui#11276) `ObjectChartBlockSchema` arms the authored `object-chart` node: `BaseSchema` + the literal + `NODE_ENVELOPE` + `properties` through `propsBag`, whose members are the flat `ObjectChartSchema` mirror's own members by reference (the spec has no `ComponentPropsMap['object-chart']` row, and none is invented). Each bag member written flat is refused by name with `Did you mean KEY → properties.KEY?`; the chart-family floor is read in the bag. The flat mirror leaves `ObjectQLComponentSchema` and stays published as the post-hoist reading; its TypeScript twin is re-declared, not retired. Claude-Session: https://claude.ai/code/session_011p7ikEivgXefNDaE5S5Uec Co-authored-by: Claude <noreply@anthropic.com>
…e move forces (objectui#11276) New pin `object-chart-properties-bag-11276.test.ts`: the showcase's bag nodes pass both faces, the bag is the mirror's own members by reference, each flat member is refused by name with the bag prescription, the family floor is read in the bag, and the flat mirror stays the post-hoist reading. Census rows and fixture triage: the parity census gains one EXCLUSIONS row; the union-arm counts move (ObjectQL union 10 to 9, public-block union gains `object-chart`); door rows that judged a flat authored chart now write the bag, while the mirror rows keep the post-hoist spelling. Claude-Session: https://claude.ai/code/session_011p7ikEivgXefNDaE5S5Uec Co-authored-by: Claude <noreply@anthropic.com>
…hangeset declares the authoring break (objectui#11276) `@object-ui/types` minor with a BREAKING (authoring) banner: a flat authored `object-chart` is refused by name; the same props in `properties` parse. Claude-Session: https://claude.ai/code/session_011p7ikEivgXefNDaE5S5Uec 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: Inputs: card #11276 (body and all seven comments, 5921136804 through 5924540849), PR #11328 (body, the 17-file list, the net diff against ① Derived judgments
② Semver level
③ Boundary flagsNo
The out-of-scope notes, against the filing rule (three classes, each owing
Every other sentence of the PR body was checked against the diff and the head files and holds; the stale ones are the three quoted in item 2. Implemented-by: VERDICT: PASS Generated by Claude Code |
…Source are the spec's, by reference; GridColumnDefinition retires (objectui#11070, round 7) (objectstack-ai#11352) Refs objectstack-ai#11070 Clause-②: yes (narrowing). The strict face's accept set widens (a grid field's `columns` and an `object-chart` node's `dataSource` binding parse), and the tolerant face narrows (both keys are now judged by their declared type: a grid column the spec refuses, or a non-binding `dataSource` on `object-chart`, is refused where it used to be stripped or kept unjudged). `GridColumnDefinition` retires from `@object-ui/types`, and `GridColumn` in `@object-ui/fields` becomes the spec's `InlineGridColumn`. Priced in `.changeset/11070-grid-columns-chart-binding-round7.md` as minor with a BREAKING banner. `Refs`, not a closing keyword, on purpose. Round 7 of the card, under the seat's claim `5925545318` (remainder items 2 and 3 of `5919314708`). Draft; the dev does not mark it ready. ## What changed **(i) The grid field's `columns`, by reference to the spec.** - `GridFieldMetadata.columns` (`field-types.ts`) and `FormField.columns` (`form.ts`) are `SpecField['inlineColumns']`; the zod mirror `FormFieldSchema` declares `stripImportedDefaults(SpecFieldSchema).shape.inlineColumns`. `form-field-zod-coverage` gains the `columns` row. `FormFieldSchema` was already a registered, spec-derived pair in `zod-mirror-parity`; its `SPEC_DERIVED_PAIRS` note records the new member, and no ledger total moved. - `GridColumnDefinition` is retired (interface and barrel export). Nothing in production read it, and it was not the shape the widget read. - `GridField`'s `GridColumn` is `InlineGridColumn` from `@objectstack/spec/data`, by reference. The renderer notes its per-member JSDoc carried move into one docblock. No read changes: the widget already read exactly the spec's twenty keys. - Fixtures: `fields-grid/*` already write only `name` / `label` / `type`; all nine columns parse against the spec element, so none changes. - `content/docs/fields/grid.mdx`: the typed fence drops a column `defaultValue`; the prose names the spec column and lists the nine cell types; the plaintext fences stop teaching `boolean`, `percent` and `user` column types; the validation sketch drops a column `min` the column does not have. **(ii) `object-chart` · `dataSource`, re-measured and declared.** - `ObjectChartSchema` (TypeScript and the flat zod mirror) declares `dataSource` as the spec's `ElementDataSource` / `ElementDataSourceSchema`, by reference. `OBJECT_CHART_NODE_LEVEL_KEYS` keeps it out of the authored bag, and `ObjectChartBlockSchema` carries it at node level (the mirror's own member), as `ObjectFormBlockSchema` and `ObjectMapBlockSchema` do. - The stale `SHOWCASE_NODE` pin (`object-chart-react-tier-node-10770.test.ts`) drops `dataSource: null` and the comment describing a wrapper write that round 2 removed; a binding row and a `null`-refused row join it. **Rows the declarations force (fixture triage):** `object-chart-properties-bag-11276` (the node-level key set gains `dataSource`, on the type and runtime legs; its "left undeclared" row becomes a "parses at node level, not a bag member" row) and `public-block-responsive-styles-10872` (`DECLARES_DATA_SOURCE` names `object-chart`, the control built to redden exactly when an arm gains the key). `strict-face-read-keys-11070` moves `columns` and `object-chart` to the declared blocks and empties its PENDING list. Comment-only: `deriveMasterDetail.declaredSpelling.test.tsx`, and the two `GridField` tests now type their fixtures `GridFieldMetadata['columns']`. **Changesets.** One new (`@object-ui/types`, `@object-ui/fields` minor). Dated notes on the five pending changesets of this release whose sentence the round makes false: `11276-object-chart-properties-bag`, `10872-flat-arm-responsive-styles`, `11070-strict-face-read-keys`, `6138-fields-schema-block-parity-pr2`, `8209-datetime-widget-faces`. ## Census (i): the grid column, measured at `5262f7dd` | source | shape | |:--|:--| | installed `@objectstack/spec` 17.5.0 | No `grid` field type and no `columns` member on `FieldSchema`. The list is `inlineColumns` (on `master_detail`), elements `InlineGridColumnSchema`: strict, 20 keys (`name` required; `label`, `type` in nine values, `width`, `required`, `options`, `prefix`, `step`, `reference`, `displayField`, `idField`, `multiple`, `accept`, `defaultHidden`, `computed`, `expr`, `scale`, `autofill`, `readonlyWhen`, `requiredWhen`). Named refusals: `field` / `fieldName` / `key` (→ `name`), `title` / `header` (→ `label`), `size`, `expression`, `hidden`; `scale` refused on a `currency` column. | | `GridField`'s local `GridColumn` | The same 20 keys and the same nine-value `type`. Value domain differs on `readonlyWhen` / `requiredWhen` only (local object arm had an optional free-string `dialect`). | | what `GridField` reads | `cfg.columns`, and per column exactly those 20 keys (a census of member reads off the column: 20 distinct, 0 outside the spec; no spread or computed read of a column). | | `GridColumnDefinition` | 7 keys: `name`, `label`, `type` (required, free string), `required`, `defaultValue`, `width`, `validate`. 2 keys not in the spec, `type` wider. Production readers: 0 (two `fields` tests and the docs prose). | | `fields-grid/*` fixtures | 3 documents, 9 columns, keys `name` / `label` / `type` (`text`, `number`, `currency`, `date`); 9 of 9 parse against `InlineGridColumnSchema`. | | `grid.mdx` | typed fence: a column `defaultValue`; plaintext fences: `boolean` (2), `percent`, `user` column types; validation sketch: a column `min`. | | objectstack example apps (`94608a7d7`) | No `grid` field (the spec has none). One producer of the spec element: `app-showcase` `invoice.object.ts` `inlineColumns`, seven identity-only `{ name }` entries. | H1 holds in substance, not as posed: the spec declares no grid `columns`; its `inlineColumns` element is key-for-key `GridColumn`. H2 holds: `GridColumnDefinition` had no production reader, so it retires. No non-spec column spelling is read, so nothing else retires and no producer stop applied. The alignment is a type reference, not a renderer redesign. ## Census (ii): `object-chart` · `dataSource` on `5262f7dd` | fact | reading | |:--|:--| | renderer read | the `object-chart` registration is `elementDataSourceBlock`-wrapped; `ElementDataSourceGate` reads the node's `dataSource` and lands `object` on `objectName` | | producer | the react-page wrapper builds `{ ...props, specType, type }`, no `dataSource` write (round 2) | | strict face | `{ type: 'object-chart', properties: { objectName, chartType }, dataSource: { object } }` refused, unrecognized key `dataSource` | | tolerant face | the same document, and `dataSource: null` or an adapter object, accepted unjudged (the arm is passthrough) | Not resolved by PR objectstack-ai#11328 or round 2, and no ruling needed: declared like the seven other gate-wrapped blocks. ## M3 before / after `scripts/measure-strict-authoring-face.mjs --json` plus the PR objectstack-ai#11069 `findUndeclaredKeys` port for pairs, each on a freshly built `@object-ui/types`. | reading | base `5262f7dd` | main `770cc5ba` | this head `62fe84ae` | |:--|--:|--:|--:| | documents | 601 | 601 | 601 | | nodes | 2229 | 2229 | 2229 | | strict-refused nodes | 94 | 94 | 91 | | strict-only nodes | 63 | 63 | 60 | | red today (tolerant) | 31 | 31 | 31 | | documents refused whole-tree | 88 | 88 | 85 | | port: pairs | 60 | 60 | 59 | | port: tolerant-refused | 28 | 28 | 28 | Main to head: exactly `form · fields[].columns` (3 occurrences, 3 strict-only, the three `fields-grid` documents) leaves; no pair enters or moves, and the tolerant face refuses the same documents. H3 holds. `object-chart` · `dataSource` has no corpus occurrence, so it moves no M3 figure; its pins carry it. ## Verification All on this branch; heavy runs through `os-verify-lock` with 2 workers and a memory watchdog. - `@object-ui/types`: `type-check` exit 0 and `vitest packages/types/` 309 files / 7828 tests passed at `62fe84ae`; build exit 0. - `type-check` exit 0 in all 11 census packages (types, core, components, fields, plugin-form, plugin-charts, plugin-dashboard, plugin-detail, plugin-tree, plugin-grid, schema-catalog) at `3eecfc2c`. - Tests at `3eecfc2c`: `packages/fields/` 226 files passed, 1 skipped (3515 tests); `packages/plugin-form/` 157 / 1822; `packages/plugin-charts/` + `examples/schema-catalog/` 121 / 3233; the 86 test files outside those packages that read the zod faces, 86 / 2110. - Reverse type check: a temporary `plugin-form` file assigning a `boolean` column, a column `defaultValue`, an adapter `dataSource` and a dialect-less `readonlyWhen` object made `tsc` exit 2 with exactly those four errors (TS2322, TS2353, TS2353, TS2322), and a spec-valid control line none; the file was removed. - Ablations, committed first, predicted in writing before each run, through objectstack's `ablation-replace.mjs` (anchor 1 → 0, restore blob == HEAD, `git diff HEAD` empty; subjects resolve from source): - A1, item (i): drop `FormFieldSchema.columns`. Predicted 7 red + tsc red; measured 7 failed / 52 passed, `tsc -p tsconfig.test.json` exit 2 (the parity ledger). - A1b, docs leg: plant the column `defaultValue` back in `grid.mdx`'s typed fence. Predicted 1 block red; measured `check:doc-snippets` 698 judged, 1 failed (TS2353 on `defaultValue`). - A2, item (ii): drop `dataSource` from `ObjectChartBlockSchema`. Predicted 5 red, tsc green; measured 5 failed / 321 passed, tsc exit 0. - Gates at `62fe84ae`: `check:doc-snippets` 698 of 698 judged, 0 failed (closure rebuilt, 35 of 35 tasks); `check:doc-fences`, `docs:check-links`, `check:control-bytes`, `check:changeset-claims`, `check:pending-changeset-literals`, `changeset:check`, `check-changeset-presence`, `check:new-line-citations` (0 new), `check:spec-symbols`, `check:test-path-roots`, `check:doc-types`, `check:doc-examples`, `check:doc-example-ids` all exit 0. `check-governed-queue-guard --test` over the 23 net paths: NOT GOVERNED. - Narrowed lint: the population is `**/*.{ts,tsx}` (the config's `files`), so 16 of the 23 changed paths; `eslint --no-inline-config --format json` on those 16 at head and at the base: 0 new errors, warnings equal per file except `field-types.ts` 5 → 4. The one error (`index.ts`, `no-restricted-imports`) is present at the base too. The config has no type-aware linting and no rule reads another file, so the diff cannot move an untouched file's verdict. ## Notes - **The `Spec Main Shape Gate`.** objectui#11330's repair (PR objectstack-ai#11343) landed on `main` as `47e3ce00` and is merged into this branch, so its fleet-wide red is not expected here; the result is CI's. - **PR objectstack-ai#11333** (round 6) shares `packages/types/src/field-types.ts` on disjoint hunks (`FormulaFieldMetadata` there, the grid metadata here). This branch merges `main` again once it lands. - **Not touched:** `strict-authoring-face.ts`, PR objectstack-ai#11333's surface, `docs/adr/0001-master-detail-subform.md` (a governed record that still names `GridColumnDefinition`). ## Acceptance notes - `grid.mdx`'s typed fence still teaches `allow_reorder: false`. `GridFieldMetadata` declares `allow_reorder`, and `GridField` reads `reorderable`: a probe rendering the widget measured two drag handles with no key, two with `allow_reorder: false`, and none with `reorderable: false`. The widget's other field-level reads (`total_field`, `amount_field`, `amountField`, `allow_duplicate`, `show_line_numbers`, `sort_field`, `add_label`, `reorderable`) are declared on neither face. These are field-level keys, outside this round's `columns` scope; they are in the report for the seat. --- _Generated by [Claude Code](https://claude.ai/code/session_01TdiauJaVCHuj45EzZGUxHh)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
Part of #11276
Clause-②: yes (narrowing)
Clause-②: yes (narrowing), copied from the PM claim5924110462:@object-ui/types' authoring faces widen (a bagobject-chartnode that is refused today parses) and narrow (a flatobject-chartnode that parses today is refused). This is objectui's narrowing-as-minorrule, with a BREAKING (authoring) banner in the changeset.The
object-chartbatch of objectui#11276. It executes triage's routing call A (5921136804) as released by the retriage answer (5922517855, Q2: "the next claim's scope isobject-chartonly"), with the construct of objectui#10859 batches 4 and 5 (PRs objectui#11291 and objectui#11309). The card stays open:object-gridis the next batch, andflexis with the maintainer as objectui#11300.What changed
packages/types/src/zod/objectql.zod.ts: newObjectChartBlockSchema, the batch 4/5 construct:BaseSchema+ theobject-chartliteral +NODE_ENVELOPE+propertiesthrough the sharedpropsBaghelper, beside:aliasKeyRefusalper bag member, keyed by the bag's own key set (read off the bag, not transcribed), so each prop written flat is refused on both faces withDid you mean KEY → properties.KEY?and one prescription that shows the whole bag document;xAxisField,yAxisFields,aggregation) keep the flat mirror's own retirement tombstones when written flat (the same objects), so their remedy stays the spec spelling rather than a pointer at a bag member that is itself retired;body/children: the flat mirror's objectui#9256 refusals, by reference;requireObjectChartFamilyInBagrefuses a node naming neitherproperties.chartTypenorproperties.specType, atproperties.chartType.@objectstack/spec17.5.0'sComponentPropsMaphas noobject-chartrow, so the spec's page component takes ANY bag on this type. The bag (ObjectChartPropsBag) is therefore the flatObjectChartSchemamirror's OWN members by reference: its shape less the node-level keys (BaseSchema's andNODE_ENVELOPE's, both read off their declarations), each the same schema object the mirror holds. It is built from the mirror's shape, not with.omit()on the mirror, because zod refuses.pick()/.omit()on an object carrying a refinement. The bag keeps the mirror's posture (.passthrough()), so an undeclared bag key is judged exactly as it was on the flat node: unjudged by the tolerant face, refused by name by the strict face. The code docblock and the bag's.describe()say this.packages/types/src/zod/public-blocks.zod.ts:propsBaggains an optionaldescriptionargument for the one bag that is not a spec row, so the arm does not describe itself asComponentPropsMap['object-chart']. Every other caller omits it and its description is byte-identical.ObjectQLPublicBlockComponentSchema(object-chartis inPUBLIC_BLOCKS).ObjectChartSchema(the flat mirror) leavesObjectQLComponentSchema(10 to 9 arms), stays exported, and stays paired with its TypeScript twin in the parity census.packages/types/src/objectql.ts: the TypeScriptObjectChartSchemais re-declared, not retired. Members unchanged; its docblock now says it is the node asObjectChartreads it afterSchemaRendererhoistsproperties, and as code composes it. The TypeScript union's docblock names the zod union's new count.packages/types/src/zod/index.zod.ts(one barrel export) andpackages/types/src/zod/README.md(the ObjectQL public-block group lists the arm, 6).packages/types/src/__tests__/object-chart-properties-bag-11276.test.ts(58 rows plus a type-level block)..changeset/11276-object-chart-properties-bag.md:@object-ui/typesminor, BREAKING (authoring) banner. No other released package's source changes, so there is no second changeset.Files beyond the claimed surface, each forced:
zod-mirror-parity.test.ts(oneEXCLUSIONSrow;EXPECTED_MIRROR_PAIRSuntouched),objectql-union-arms-7363.test.ts(9 arms,object-chartnot among them),registered-type-arms-10859-b2.test.ts(the exact public-block literal list gainsobject-chart),public-block-responsive-styles-10872.test.ts(object-chartgets the smallest family bag inRECORD_SOURCE, because the arm keeps the floor),flat-arm-responsive-styles-10872.test.ts(the batch-9 flat population isflexandobject-grid; one row pins that the flat mirror keeps the shared member as the post-hoist reading);content-channel-e3-residual-9256.test.ts(AUTHORED_REQUIREDgains the chart),object-chart-axis-config-10518.test.ts(5 door rows and the showcase lit control write the bag),object-chart-legacy-axis-keys-retired-10608.test.ts(the door refuses the retired key in the bag AND written flat; the remedy rows write the bag),object-chart-react-tier-node-10770.test.ts(the door row reads the wrapper's props in the bag),strict-face-read-keys-11070.test.ts(thedataSourcerow writes its chart props in the bag; the row's verdict is unchanged).Zone 1, measured before building
@objectstack/spec17.5.0:ComponentPropsMaphas no ownobject-chartproperty (controls:object-mapandobject-gridhave one).PageComponentSchemarefuses the flat node{ type: 'object-chart', chartType, objectName, aggregate }withunrecognized_keysnaming the three ("Unrecognized key(s) on this page component … ADR-0089 D3a") and accepts the same props inproperties. Control: a flataction:buttonactionTypeis refused the same way.0c6f9bbd7,git grep -l object-chartgives 57 non-test files: 16CHANGELOG.mdand 16 pending changesets (records, not producers) and 25 others. Seat 1's census (5922247963) re-verified on this base:SchemaRenderer, never meet a zod face)views/ObjectView.tsx(2 sites), plugin-viewObjectView.tsx(2), plugin-listListView.tsx(2), plugin-dashboardDashboardGridLayout.tsx(1) andDashboardRenderer.tsx(1); the react-page wrapper (react-page.tsx, a comment hit; it composes by tag)objectql.ts,objectql.zod.ts,public-blocks.zod.ts(comment +propsBag)register-plugins.ts,known-schema-types.ts, corepublic-blocks.ts,chart-category-key.ts, plugin-chartsObjectChart.tsx/index.tsx/normalizeChartSchema.ts, plugin-dashboardObjectMetricWidget.tsx/index.tsx, sdui-parserparse.ts, typesdata-display.ts,scripts/regenerate-known-schema-types.mjs,ROADMAP.md,content/docs/guide/data-source.md(a table row)skills/**skills/objectui/guides/data-integration.md,skills/objectui/guides/schema-expressions.md: each namesobject-chartin a prose list ofuseDataScopecallers, no nodeStop line: not tripped. The zod
ObjectChartSchemaobject has one reader in objectui source, theObjectQLComponentSchemaunion (plus the barrel re-export); no schema is built from it (unlikeobject-view'stableslot fromObjectGridSchema, the shape theobject-gridbatch meets). Every non-page context that keeps the flat spelling depends on the TypeScript twin (the composers,ObjectChartProps.schema,ObjectMetricWidget's aggregate type), which is unchanged.3. The arm, as above. The TypeScript twin is re-declared, not retired; nothing had to retire, so the
needs_decisionstop did not fire.4. Producers: zero objectui-authored flat
object-chartpage-node producers to rewrite; zero governed producers (two governed prose hits, listed above).Zone 2, re-measured
ObjectChartSchemais inobjectql.zod.ts, its twin inobjectql.ts,ObjectMapBlockSchema(batch 5) inobjectql.zod.ts. The new arm sits right after the flat mirror it reads, which also keeps it out of PR objectui#11312's hunks.mainat 2026-10-01T04:02Z, after this branch's commits and before this PR opened. Together withbe5211522,mainhas moved by three commits since the base, and the last two touchobjectql.zod.ts,objectql.ts,public-blocks.zod.tsandzod-mirror-parity.test.ts. Their hunks are disjoint from this diff's: GitHub reports the PR mergeable, and the merge queue re-tests the merged tree.Tests (heavy runs through
os-verify-lock.sh, slotissue-11276)a13229954(before triage):pnpm exec vitest run packages/types/src/gaveTests 29 failed | 7663 passed (7692)in 10 files: exactly the census rows and door fixtures listed above.03b6e0d98:pnpm exec vitest run packages/types/ packages/cli/gaveTest Files 330 passed (330),Tests 8079 passed (8079), VERDICT command-exit 0.f1cd6ab70(the head before the README + changeset commit): 234 tracked test files outsidepackages/typesandpackages/clithat nameobject-chart,plugin-charts,ObjectChartSchema,ObjectChartBlockSchema,AnyComponentSchema,StrictAnyComponentSchema,safeValidateSchema,ObjectQLComponentSchema,ObjectQLPublicBlockComponentSchema,PUBLIC_BLOCKS,getPublicConfigs,ComponentPropsMap,KNOWN_SCHEMA_TYPES,nodeOraclesor the parity / strict-face / handler-key ledgers, in three chunks:79 passed / 2499 tests,73 passed / 787 tests,82 passed / 1576 tests, each VERDICT 0. The later commit changes onlyREADME.mdand the changeset; the tests that read the zod README are inpackages/typesandscripts/__tests__, both re-run after it.scripts/__tests__/(a markdown file changed) at03b6e0d98:Test Files 177 passed | 2 skipped (179),Tests 5371 passed | 2 skipped (5373), VERDICT 0.node scripts/markdown-test-inputs.mjs --audit: "107 candidate test files, all adjudicated; 78 declared entries, all present".pnpm --filter @object-ui/types type-check(tsc --noEmit, examples,tsconfig.test.json, which includessrc/**/*.test.ts), VERDICT 0.@object-ui/typeshas no workspace dependency to build first.scripts/ablation-replace.mjs, two nested WRAP legs plus an EXIT/INT/TERM trap, absolute paths): the flat arm restored, i.e.ObjectChartSchemaback intoObjectQLComponentSchema(anchor x1 to x0, blobec019f61to0bc58a72) andObjectChartBlockSchemaout of the public-block union (anchor x1 to x0, blob tofb03dd31); on disk,ObjectChartSchema,x1 in the ObjectQL union andObjectChartBlockSchema,x0 in the public one. Over 14 files (the new pin, the 10 triaged and census files, and three untouched chart and bag pins as controls):Tests 66 failed | 651 passed (717). Red: 43 rows of the new pin and 23 triaged or census rows (10608 12, 10518 3, 9256 2, 10872-batch-9 2, and one each in 10770, 7363, b2 and 11070), which is exactly the set this diff added or changed. Green: the untouched pins (object-chart-undeclared-keys-8885,widget-schema-anchors-7946,object-map-properties-bag-10859-b5), the census files whose subject is the export itself, and the pin's 15 rows that do not depend on which arm the union selects (the spec lit controls, the bag's key set and member identity, its description, and the refusals the flat mirror shares). Direction red, as expected. Restored: blob == HEADec019f61,git diff HEADempty. Vitest imports the zod sources relatively, so no build sat between the mutation and the run..omit(OBJECT_CHART_NODE_LEVEL_KEYS)widened to also dropdatasetmadetsc -p tsconfig.test.jsonexit 2 with exactly one error,TS2344: Type 'false' does not satisfy the constraint 'true'on the pin'skeyof Bagrow. Restored, blob == HEAD.SchemaRendererand registry, not committed): the bag node{ type: 'object-chart', properties: { objectName, chartType, aggregate, filter, title } }makes the same data-source calls as the flat node with the same props and draws an identical DOM; control: a bag naming another object makes different calls.Tests 1 passed (1).Gates (exit codes captured before any pipe)
node scripts/check-changeset-presence.mjs("16 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)"),changeset:check("No changeset declares amajorbump."),check:control-bytes("OK (scanned 9793 tracked text file(s); skipped 85 binary)"),check:new-line-citations("VERDICT new-cross-file-line-citations: 0 new citation(s)"),check:handler-key-reads("OK 140 arm(s), 212 registration(s) (138 keyed onto an arm), 56 reachable handler read(s), 56 judged"),check:spec-symbols,check:element-data-source-declaration,check:component-surface-parity,check:doc-types,check:prompt-keys,check:test-path-roots,check:installed-pin-claims,check:vi-mock-specifiers,check:pending-changeset-literals,check:changeset-claims(report-only),docs:check-links,check:governed-queue-guard, andcheck-governed-queue-guard.mjs --testover the 17 changed paths ("NOT GOVERNED").pnpm exec eslinton the 15 changed source and test files: 0 errors, 37 warnings, allno-explicit-anyon lines this diff does not touch.check:readme-exports,check:doc-snippets,check:doc-examples,check:skill-examples,check:sdui-registration-pins. This diff changes no fenced block in any README, doc or skill. Left to CI, which builds first.pnpm lintand the fullpnpm testfarm (CI's).Acceptance notes
datastays a node-levelBaseSchemakey on this arm, as on every arm.ObjectChartreadsschema.data(inline rows) and the registration'sinputslistdata, but neither the mirror nor the TypeScript twin declares it as a chart member, so it is not in the bag: a flatdatapasses both objectui faces (the spec's page component refuses it at node level), andproperties.datapasses the tolerant face unjudged and is refused by the strict face. Whetherdatais a chart member is a declaration decision this card did not take. Noted, not filed; no carrier.dataSourcestays undeclared onobject-chart, on the bag arm as on the flat mirror, as objectui#11070 left it ("refused by name until it is declared"). The registration is gate-wrapped and reads the binding.xAxisKey, the{ dataKey }series arm,specType): the bag is the mirror's members, so they are judged in the bag exactly as they were judged flat. No member's verdict changed; only its layer.10518,10608,10770and10872-flat-arm-responsive-stylesdescribe validator readings on a flatobject-chart; this PR's changeset says those readings now happen in the bag on an authored node and still hold on the flat mirror (the batch-5 precedent). They are not edited.SchemaRenderer's generic hoist, already pinned for the earlier bag arms; the one-time probe above measured it for this type.Overlap
PR objectui#11312 (merged first) edited other regions of
objectql.zod.ts,objectql.ts,public-blocks.zod.tsandzod-mirror-parity.test.ts. The hunks are disjoint, and this PR lands through the merge queue, which tests the merged tree.Session:
https://claude.ai/code/session_011p7ikEivgXefNDaE5S5Uec(the dispatching seat's id; this run is its subagent on branchclaude/issue-11276-object-chart-properties-bag).Generated by Claude Code