You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
chore(spec): flip FormView buttons/defaults to live; close view inverse-drift (#1894)
The structured `FormViewSchema.buttons`/`defaults` shipped under the ADR-0078
escape hatch (declared, but marked `[EXPERIMENTAL — NOT ENFORCED]`) pending an
ObjectUI consumer. The objectui `ObjectForm` renderer now folds both onto the
flat props it reads (`showSubmit`/`submitText`/`showCancel`/`cancelText`/
`showReset`/`initialValues`), so:
- Drop the experimental markers from the two `.describe()` strings + the
`FormButtonConfigSchema` leaf doc (the spec liveness gate keys `experimental`
off that exact substring).
- Flip `view.form.buttons` / `view.form.defaults` in `liveness/view.json`
`experimental → live`, citing the objectui consumer; update the `view` row in
`liveness/README.md` (70 live / 0 exp / 5 dead).
- Update the `view.test.ts` marker assertion to lock in the live state.
- Annotate audit cluster #6 + the viewschema audit's inverse-drift line as
resolved.
Closes the `view` item of #1894 (inverse drift — renderers read undeclared
props); the dashboard + app items were already reconciled. Co-lands with the
objectui ObjectForm wiring. No shape/parse-behavior change.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CMaDBhnZEUu1fcw8Rvo6Yq
Copy file name to clipboardExpand all lines: docs/audits/2026-06-viewschema-property-liveness.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -23,6 +23,7 @@ Variant routing (`tabbed/wizard/split/drawer/modal`) exists in `plugin-form/Obje
23
23
-`bulkActions` works **only** because `ListView.tsx:1318` remaps it to `batchActions` (ObjectGrid's real key) — a direct `object-grid` caller using `bulkActions` silently no-ops.
24
24
-`groups` vs `sections` — both alive but on different code paths, not aliased in one place.
25
25
- Inverse problem: `ObjectView.tsx:809-823`'s form adapter reads keys (`layout,showSubmit,submitText,customFields,title,initialValues,className`) that **don't exist in `FormViewSchema`** — renderer-invented surface with no spec backing.
26
+
-**✅ Resolved (#1894 / #2998).**`layout`/`title` are declared on `FormViewSchema`; the button/visibility keys (`showSubmit`/`submitText`/`showCancel`/`cancelText`/`showReset`) and `initialValues` got structured spec homes (`buttons` / `defaults`) that the objectui `ObjectForm` now folds onto its flat props — so the two ledger entries are `live`, and the flat keys survive only as deprecated back-compat. `customFields`/`className`/`fields` stay classified as renderer-only ObjectUI extensions (objectui#2545), not spec surface.
26
27
27
28
## Recommendation (for ADR)
28
29
1.**Migrate the chart renderers to `dataset`/`dimensions`/`values`** (ADR-0021) — pairs with the dashboard/report seed migration; currently the entire chart view variant is dead against the spec.
Copy file name to clipboardExpand all lines: docs/audits/README.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -52,6 +52,8 @@ field enhanced-type configs (barcode/qr/slider/rating/color/location) + governan
52
52
### 6. Inverse drift — renderer depends on UNDECLARED props
53
53
dashboard `component`/`data`/`rowField`/`columnField`; view `ObjectView` form-adapter keys; app `accentColor`/`badgeVariant`/`separator`. These break a strict `Schema.parse()`.
54
54
55
+
**✅ Resolved (#1894).** All three reconciled so strict validation holds: **dashboard** — `component`/`data` + the pre-ADR-0021 inline-analytics keys (`rowField`/`columnField`/…) are quarantined and rejected by the strict `DashboardWidgetSchema` error map (`dashboard.zod.ts`), pointing authors at the `dataset`/`dimensions`/`values` shape (renderer-only extras → `options`). **app** — `accentColor`/`badgeVariant`/`separator` are now declared on `AppSchema` (`app.zod.ts`). **view** — the structured `buttons`/`defaults` were added to `FormViewSchema` (#2998 Track A) and are now consumed: objectui `ObjectForm` folds them onto its flat renderer props (framework#1894 / #2998), so the two liveness-ledger entries flip `experimental → live`; the remaining flat form-adapter keys (`customFields`/`className`/`fields`) are classified renderer-only ObjectUI extensions (objectui#2545).
56
+
55
57
### 7. Designer authoring gaps (live prop, no Studio editor)
56
58
dataset `filter`/`format`/`derived`/`dateGranularity`; skill `triggerConditions` (the activation-critical field); flow `notify` (absent from static palette).
| page | 16 | – | – | 1 | fully live + one planned |
204
-
| view |68|2| 5 | – | list/form drilled via `children` (#2998 Track B); dead = list.{responsive,performance} + form.{data,defaultSort,aria}, all but aria authorWarn'd; exp = form.{buttons,defaults} awaiting objectui#2545; audit-era DEAD lines superseded by re-verification (submitBehavior, sharing.lockedBy, list ViewData providers, and the ADR-0021 chart shape — all live now); level-2 dead residue (userActions.buttons, addRecord.mode/formView, tabs[].order) noted on parents — one drill level only |
204
+
| view |70|0| 5 | – | list/form drilled via `children` (#2998 Track B); dead = list.{responsive,performance} + form.{data,defaultSort,aria}, all but aria authorWarn'd; form.{buttons,defaults} now live — objectui ObjectForm folds them onto its flat props (framework#1894 / #2998); audit-era DEAD lines superseded by re-verification (submitBehavior, sharing.lockedBy, list ViewData providers, and the ADR-0021 chart shape — all live now); level-2 dead residue (userActions.buttons, addRecord.mode/formView, tabs[].order) noted on parents — one drill level only |
205
205
206
206
The `dead` set across types is the enforce-or-remove worklist (ADR-0049); every
207
207
misleading entry carries `authorWarn` so authors hear about it at compile time.
Copy file name to clipboardExpand all lines: packages/spec/liveness/view.json
+2-2Lines changed: 2 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -99,8 +99,8 @@
99
99
},
100
100
"sharing": { "status": "live", "evidence": "packages/rest/src/rest-server.ts:4384", "note": "Framework-side consumer: public (anonymous) form endpoints opt in via FormView.sharing — /forms/:slug resolves sharing.publicLink across form + formViews (rest-server.ts:1716, :4366-4405) and grants publicFormGrant. Renderer-side the config is not read (audit L20) — the public form is served, not re-parsed client-side." },
101
101
"submitBehavior": { "status": "live", "note": "objectui: WizardForm.tsx:315-316 + ObjectForm.tsx dispatch thank-you/redirect/continue/next-record; covered by ObjectForm.submitBehavior.test.tsx / WizardForm.successBehavior.test.tsx. Supersedes the 2026-06 audit's DEAD line (L20) — wiring landed with the objectui#2545/#2552 reconciliation." },
102
-
"buttons": { "status": "experimental", "note": "#2998 Track A — structured action-button config awaiting the ObjectForm read (objectui#2545); the renderer still reads the flat invented showSubmit/submitText keys (ObjectForm.tsx:147-157). Spec .describe() carries the [EXPERIMENTAL — NOT ENFORCED] marker; drop marker + flip to live when the wiring lands." },
103
-
"defaults": { "status": "experimental", "note": "#2998 Track A — create-mode initial values awaiting the ObjectForm read (objectui#2545); the renderer still reads the flat invented initialValues key (ObjectForm.tsx:364-437). Spec marker as above." },
102
+
"buttons": { "status": "live", "note": "objectui: ObjectForm.tsx foldFormButtons() reads schema.buttons and folds submit/cancel/reset {show,label} onto the flat showSubmit/submitText/showCancel/cancelText/showReset props (framework#1894 / #2998); ObjectView + RecordFormPage forward it. Flat keys kept as deprecated back-compat (explicit flat key wins)." },
103
+
"defaults": { "status": "live", "note": "objectui: ObjectForm.tsx foldFormButtons() reads schema.defaults and folds it into create-mode initialValues (framework#1894 / #2998); an explicit initialValues (URL prefill) still wins." },
104
104
"aria": {
105
105
"status": "dead",
106
106
"evidence": "no reader in either repo (objectui@fb35e48 grepped 2026-07-16: no schema.aria read in plugin-form/SchemaForm; only ListView applies aria)",
.describe('[EXPERIMENTAL — NOT ENFORCED, #2998] Initial field values for create-mode forms (spec home for ObjectUI `initialValues`). Renderer wiring pending (objectui#2545).'),
1049
+
.describe('Initial field values for create-mode forms (folded into ObjectUI ObjectForm initial values; framework#1894 / #2998).'),
1050
1050
1051
1051
/** ARIA accessibility attributes */
1052
1052
aria: AriaPropsSchema.optional().describe('ARIA accessibility attributes for the form view'),
0 commit comments