…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>
Refs #11070 · Refs #11228
Clause-②: yes (narrowing).
FormulaFieldMetadata.formularetires for the spec'sexpression(typed by reference),sanitizeFormDatastops readingformula, and three display-pointer readers (deriveColumns/hydrateColumns,ObjectChart, the action-param resolver, with its internalRuntimeField.display_fieldmember) drop theirdisplay_fieldleg, under the startup no-gradualism rule. Item (i) alone, the dashboard round, was ruledClause-②: no: it moves fixtures and docs only, and the strict face does not change. The break is priced in the changeset.Round 6 of objectui#11070 (claim
5924126483). Four items in one PR: (i) objectui#11228's ruling C (5921018991, intake5921153525); (ii) seat answer A onformula(5923126508); (iii) the threedisplay_fieldconsumer legs (round 5's out-of-scope finding); (iv) dated changeset notes.What changed
(i) Dashboard widgets bind a dataset, everywhere objectui teaches one (objectui#11228 ruling C).
examples/schema-catalog/src/schemas/plugin-dashboard/filtered-dashboard*.jsonfixtures are in the ADR-0021 dataset form: every widget names adatasetwithdimensions/values, and none carries rows. Each demo keeps its filter feature (dateRangepresets,optionsFrom, text / number / lookup filters,targetWidgets,filterBindingsoverrides and opt-outs). No demo was dropped: the docs gallery's no-backend harness (apps/site/app/components/galleryDataSource.ts) answersqueryDatasetwith placeholder rows, and the gallery render pin draws every widget title with zero dataset errors.dataset-widgetsvariant is re-titled incatalog-meta.json("Widgets Over Two Datasets"), because "Dataset + Inline Widgets" became false;index.tsis regenerated from it.content/docs/guide/dashboard-filters.md: the data-surface table becomes one paragraph (a widget binds a dataset) plus a "not an authoring surface" note naming the nine keys; the retired-shape callout, the "Dataset widgets" section, the working-examples note and Known limitations stop offeringoptions.data.content/docs/api/schema-reference.md'sDashboardComponentSchemaexample: the metric, thecomponentchart and thelistwidget become dataset-boundmetric,areaandtablewidgets, and the prose under it says what a widget's data is. The standalonechartcomponent's ownchartType/xAxisKey/seriessection is untouched.strict-face-read-keys-11070.test.tsasserts each of the nine is refused by name (with a dataset-widget control that parses);plugin-dashboard-component-schema.test.tsasserts everyplugin-dashboardcatalog entry parses onStrictAnyComponentSchema.(ii)
FormulaFieldMetadata.expressionreplacesformula(seat answer A).packages/types/src/field-types.ts:expression?: SpecField['expression'](a CEL string or the spec's{ dialect, source, … }envelope). Type-level pins: by-reference identity, andformulajoins the retired-members list.content/docs/fields/formula.mdx: the typed fence, the plaintext examples (rewritten in CEL againstrecord.) and the prose. The backend section's pseudo-code goes; it said nothing true about how the platform evaluates a formula.plugin-form/src/sanitize.ts: theif (fieldDef.formula) continue;guard is removed after measurement (below). A new case pins that aformulakey marks nothing computed. TheformArmsWritePayload-10563fixture's formula column moves toexpression.ObjectFieldInspector's seed and clear,ObjectFormCanvas/FieldStub,object-fields-io.ts,clientValidation.tsandretired-field-keys.tsare not in the diff.(iii) The three
display_fieldconsumer legs.deriveColumns/hydrateColumns(plugin-form):d?.displayField || d?.reference_field. Before this change they had nodisplayFieldleg at all, so a spec-spelled lookup got no display pointer on its master-detail grid column; it does now (probe below).ObjectChart'sresolveGroupByLabels(plugin-charts):displayField, thenreference_field, then'name'.resolveActionParams(app-shell):field.displayField ?? field.reference_field; theRuntimeField.display_fieldmember goes.reference_fieldstays (FieldSchemadeclares no twin the fold could stamp it onto).display_fieldmove todisplayField(deriveMasterDetail.test.ts,resolveActionParams.test.ts,expandableFamily.identity-5874.test.ts). The two "adisplay_field-only def still resolves" pins flip to "no longer resolves", and each consumer gains a pin that keeps the snake spelling as its INPUT and shows the ingestion fold (normalizeSchemaReferenceKeys, objectui#7650 ruling A) delivers it asdisplayField.(iv) Changesets.
.changeset/11070-dashboard-formula-round6.md(minor fortypes,plugin-form,plugin-charts,app-shell; the break measured and stated). Dated, append-only notes:.changeset/7166-retire-inert-fieldmeta-copies.md(itsdisplay_fieldsentence was already false: objectui#7155 retired the cell's leg) and.changeset/lucky-donkeys-shave.md(its KEEP verdicts for these threedisplay_fieldreads are now false).Files beyond the claim's named surface, each forced by the round
packages/plugin-dashboard/README.mdandcontent/docs/plugins/plugin-dashboard.mdxtaught the same inline dialect (options.data/xField/yField) in a TypeScript fence and prose, outside M3's JSON corpus. A bounded in-place fix: the same defect class, a mechanical move to the ruled form, no open PR holds either file, and the README's existing gate (readme-dashboard-examples-spec-valid.test.ts) judges it. The seat should append both to the claim's file surface.scripts/check-doc-component-types.mjs: one exemption entry (areaonschema-reference.md).check:doc-typesrefused the rewritten example'sareawidget kind, which is a widget family and not a node type; the dashboard pages already declarebar/linethis way. The script's own tests and every test that names it ran green (25 files, 1393 tests).examples/schema-catalog/src/catalog-meta.jsonand the regeneratedindex.ts(a title made false); comment-only edits inDashboardGridLayout.legacyRetired.test.tsx(it describedfiltered-dashboard.json's widgets as inline) andpackages/core/src/utils/reference-keys.ts(it namedderiveColumns'display_fieldread as a kept snake read; it now namesreference_field).Fork clause: not triggered
No real producer of the nine keys exists outside objectui's demo corpus.
origin/maind67b94280):xField/yField0 occurrences in the whole tree; the six dashboard files (app-crm, app-showcase ×3, app-todo, platform-objects) carry 60dataset:bindings, and their widgetoptionscarryformat/currency/color/suffix/showLegend/horizontal/showDataLabels, none of the nine (that is objectstack#20960's catchall class, not here).chartType/xAxisKeyhits are chart, view and page-node keys, none on a dashboard widget. Control: the same channel findsdataset:in all six files.options.data. Writers ofoptions: { datain non-test source: 0 (control: the same pattern, 25 in tests). Theprovider: 'object'writers (anchors.ts,runtime-metadata-persistence.ts) build list / form VIEW configs, not dashboard widgets.xField/yFieldin non-test source are renderer and helper reads only.Census, base
0c6f9bb→ headxField/yFieldwrites on authoring surfaces (content,examples,apps,skills,docs, package READMEs)schema-reference.mdexample)display_fieldcode reads inpackages/*/src+apps/*/src(non-test, non-comment)RuntimeFieldmembernevertombstone and a register note)formulacode linessanitize.ts1,field-types.ts1formula:writes informula.mdxexpression:)Probes
Spec, installed
@objectstack/spec17.5.0.FieldSchemarefusesformulaon all 49 field types (unrecognized_keys, with the rename hint toexpression); controls: a baretextdef accepted,zzz_not_realrefused,expressionaccepted both as a string and as{ dialect: 'cel', source }. That is H4: no served definition can carryformulaon a non-formula type, and everytype: 'formula'field is dropped byCOMPUTED_FIELD_TYPESanyway. Producer census: objectstack writesformula:on a field only inmetadata-core's FLS test contract, on atype: 'formula'field.CEL. The nine expressions
formula.mdxnow teaches all parse with@objectstack/formula17.5.0'sparseCelToAst; control: the oldcreated_at + 7 daysdoes not parse.Display pointer (a scratch vitest file, copied into the worktree, run at base and head, removed by trap, never committed). A lookup whose pointer is
title, read byderiveColumns/hydrateColumns,resolveGroupByLabelsandresolveActionParams:display_field, handed in raw (BYO)title· axis label fromtitle·titlename· nonedisplay_field, throughObjectStackAdapter.getObjectSchematitle·title·titletitle·title·titledisplayField, rawtitle·titletitle·title·titledisplayField, through the adaptertitle·titletitle·title·title(Column order: master-detail column, chart axis, action param.) The first row is the BYO break the changeset states; the bold cells are the master-detail fix.
M3,
scripts/measure-strict-authoring-face.mjs --json, plus the PR #11069findUndeclaredKeysport for the pairs0c6f9bb95bd23c2abe905139a491From
main95bd23cto the merged head2abe905, exactly the nine dashboard pairs leave; no pair enters and no other pair moves. The last merge (5262f7d, objectui#11276) moved no M3 reading on this branch. H2 holds.Hypotheses
schema-reference.md's example, notdashboard-filters.md: the guide carried the dialect in a table row and prose, which M3's JSON-fence corpus does not read. The README andplugin-dashboard.mdxtaught it too, outside that corpus (see "Files beyond the claim").type-checkis green intypes,fields(the one importer, whoseFormulaFieldreadsreturnTypealone),plugin-form,plugin-charts,plugin-dashboard,app-shellandexample-schema-catalog, so no typed read existed. The untypedformulareads weresanitize.tsand the Studio arm, as posed.Checks
All at the final head
139a491unless marked. Heavy runs went throughos-verify-lock; exit codes were captured before any pipe.check-doc-snippet-types --build-filter, turbo--concurrency=2): 35 successful, atb126b7d(code identical toeddd18d) and again after the first merge;@object-ui/typesrebuilt after the second.type-check, exit 0:types,fields,plugin-form,plugin-charts,plugin-dashboard,app-shell,example-schema-catalog. Every touched test file is inside its package'stsconfig.test.json(--listFilesOnly).packages/types/ examples/schema-catalog/, the touched plugin tests, and 72 test files outside those packages that name a touched file or symbol: exit 0, 422 files, 12188 tests passed.packages/plugin-form/ packages/plugin-charts/ packages/plugin-dashboard/(at2abe905; the last merge touched none of them): exit 0, 398 files, 4270 tests passed, 16 skipped.packages/app-shell/in full ateddd18d: exit 0, 965 files passed, 1 skipped; 9608 tests passed. After the merges, its 17 test files that name a touched symbol ran green in the first set, and the app-shell test the first merge brought in ran green at2abe905.check:doc-fences,check:doc-snippets(698 of 698 judged, 0 failed),check:doc-types,docs:check-links,check:control-bytes,check:doc-examples,check:spec-symbols,check:doc-example-readers,check:doc-example-ids,check:new-line-citations(0 new),check:test-path-roots,regenerate-catalog-index.py --check.check:changeset-claims(report-only; it names 26 pending changesets that cite a touched file. Each was screened for this round's keys and read where it matched; only7166andlucky-donkeys-shaveare made false, and both carry a dated note),check:pending-changeset-literals,check-changeset-presence(15 source files of 6 released packages, 1 changeset),changeset:check(nomajor). Bump: minor fortypes,plugin-form,plugin-charts,app-shell.core(one comment) andplugin-dashboard(a README and a test comment) publish nothing new and take no bump..ts/.tsx/.mjsfiles, against the merge-base blobs (--stdin): 0 errors at head, warnings equal to base in every file, and 0 errors with--no-inline-configtoo. Population: the diff's changed script and TypeScript files, each matched by the rooteslint.config.js(one result per file in the JSON output). Type-aware linting is off (no parser project in that config), so the diff cannot move an untouched file's verdict.check-governed-queue-guard --testover the 33 paths: NOT GOVERNED.Ablations, re-run at
139a491with the same readings as at2abe905andeddd18d. Each prediction was written first, and each mutation went through objectstack'sablation-replace.mjs(anchor hit once, blob moved, restore blob equal to HEAD,git diff HEADempty):filtered-dashboard.json's first widget goes back to inlineoptions. The catalog schema test has 1 failed and 29 passed, and the red is the strict-face case for that entry. M3 (measured in theeddd18drun): those three pairs re-enter at 1 occurrence each, and strict-refused goes 82 to 83. As predicted.FormulaFieldMetadatadeclaresformula?: stringagain.typestsc ontsconfig.test.jsonexits 2 with one TS2344, onassertionRetiredMembersAreGone'sFormulaFieldMetadatarow. As predicted. (The first attempt was refused by the tool before anything ran, because its replacement contained its anchor. It is not counted.)sanitize.tsreadsformulaagain.sanitize.test.tshas 1 failed and 5 passed ("expected {} to deeply equal { note: 'kept' }"). As predicted.deriveColumnsreadsdisplay_fieldagain behinddisplayField.deriveMasterDetail.test.tshas 1 failed and 39 passed. As predicted.ObjectChart's chain readsdisplay_fieldagain. The display-leg test has 1 failed and 5 passed. As predicted.resolveActionParamsreadsdisplay_fieldagain. The declared-legs test has 1 failed and 11 passed. As predicted.formula.mdx's typed fence writesformula:.check:doc-snippetsexits 1, with 1 of 698 blocks failed against the rebuilt dist. Predicted TS2561; observed TS2353 ("formuladoes not exist in typeFormulaFieldMetadata"). The same refusal, without a did-you-mean.NOT MEASURED:
app-shellsuite after the two merges. It was green in full ateddd18d, and the merges brought noapp-shellsource change.main5262f7don its own. Merging it moved no reading on this branch.DataSources.Acceptance notes
options.descriptionis in ruling C's nine, and the strict face refuses it. ButDatasetWidgetreads it on the dataset path as a metric tile's sub-caption (CONSUMED_WIDGET_OPTION_KEYSinsdui-parser). No producer writes it in either repository. It belongs to objectstack#20960's catchall census (a consumed key the strict face refuses), not to this round. Noted, not filed.options.data ?? widget.data,xField || 'name', …) is untouched, as ruled. It retires on its own card.pm:blockedon this card. It closes with a pointer once this is onmain.Generated by Claude Code