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
**BREAKING** accept-set narrowing on `FormViewSchema`, shipped as `minor` under the
8
+
repo's launch-window convention for breaking changes. Grade argued per the #13622
9
+
ruling (T4 leaves the final call to this PR's review chain): the nearest
10
+
tightening precedents are the two `ActionSchema` accept-set narrowings #11519
11
+
(doubled post-success navigation refused) and #11842 (`newTabUrl` /
12
+
`opensInNewTab` co-constraint), both shipped `minor` with the **BREAKING** header;
13
+
the mechanism precedent is the `section.pane` non-split parse refusal this change
14
+
extends. The measured population of affected authored sources is zero in every
15
+
in-tree corpus (the showcase task wizard and its lint-fixture mirror are the whole
16
+
authored wizard corpus; both already use only clean step keys).
17
+
18
+
The wizard form view existed end to end (spec enum, gated renderer, one real
19
+
author) but its contract was silent: the gate semantics lived only in renderer
20
+
comments, wizard-inert section keys parsed clean, and a step-less wizard silently
21
+
rendered as a plain simple form. Ruled on #13622 (maintainer 2026-08-31, director
22
+
batch #12, 「同意」), v1 is a declaration-and-refusal tightening with **zero new
23
+
authorable keys**:
24
+
25
+
-**Wizard steps carry no predicate slot and do not collapse** (upgrades
26
+
objectui#6237's ruled `FormSectionConfig` split to a parse refusal): on
27
+
`type: 'wizard'`, a section `visibleWhen` (or its deprecated `visibleOn`
28
+
alias), `collapsible: true`, or `collapsed: true` is now refused at parse with
29
+
a prescription. Fix: remove the key — put visibility predicates on the fields
30
+
inside the step, or use a `simple`/`tabbed` form for section-level
31
+
visibility/collapsing. The same keys stay accepted on every non-wizard form
32
+
type.
33
+
-**A wizard must declare its steps**: `type: 'wizard'` with absent or empty
34
+
`sections` is refused (it previously fell back to plain simple rendering,
35
+
silently). Fix: declare at least one step — `sections: [{ label, fields }]`.
36
+
The flattened runtime personalization overlay (a partial patch bound by
37
+
`object` + `viewKind`) is deliberately exempt.
38
+
-**`steps:` is refused with guidance, never accepted as an alias**: the
39
+
unknown-key rejection now teaches the ruled spelling — sections ARE the steps,
40
+
array order is step order.
41
+
-**The ruled semantics are declared in the schema** (TSDoc + generated
42
+
reference docs): the step gate is the default of `type: 'wizard'`; `allowSkip`
43
+
is navigation freedom, not a validation exemption; the gate is UI admission,
44
+
never authorization; progress is derived state with `showStepIndicator` the
45
+
only authorable knob; per-step validation binds only the existing field-level
46
+
vocabulary; array order is step order.
47
+
48
+
<!-- adr-0087: not-required (no-migration-prescription) A validity narrowing over existing keys: no key is removed, renamed or re-shaped, so there is no tombstone and nothing mechanical for `objectstack migrate meta` to rewrite. The parse refusal is the channel that reaches an affected author, at the parse site, carrying the remedy; whether an inert wizard-step `visibleWhen` meant "move it onto the fields" or "delete the leftover" is authoring intent no migration entry can decide on an upgrader's behalf — and the measured population of affected sources is zero in every corpus. Mirrors the disposition of the #11519 / #11842 ActionSchema narrowings. -->
|**showStepIndicator**|`boolean`| optional | Show the step indicator (wizard forms)|
1677
+
|**allowSkip**|`boolean`| optional |Wizard step-gate opt-out: allow entering a later step without submitting the one before it. Navigation freedom, NOT a validation exemption — the final submit still re-validates every step and returns to the first failing one. Default (absent/false): steps unlock in array order as each prior step submits validly. UI admission only, never authorization.|
1678
+
|**showStepIndicator**|`boolean`| optional | Show the wizard step indicator (renderer default: shown). Step progress (completed/current/upcoming/invalid) is derived from the step gate — this boolean is the only authorable progress surface.|
|**showStepIndicator**|`boolean`| optional | Show the step indicator (wizard forms)|
1762
+
|**allowSkip**|`boolean`| optional |Wizard step-gate opt-out: allow entering a later step without submitting the one before it. Navigation freedom, NOT a validation exemption — the final submit still re-validates every step and returns to the first failing one. Default (absent/false): steps unlock in array order as each prior step submits validly. UI admission only, never authorization.|
1763
+
|**showStepIndicator**|`boolean`| optional | Show the wizard step indicator (renderer default: shown). Step progress (completed/current/upcoming/invalid) is derived from the step gate — this boolean is the only authorable progress surface.|
|**showStepIndicator**|`boolean`| optional | Show the step indicator (wizard forms)|
406
+
|**allowSkip**|`boolean`| optional |Wizard step-gate opt-out: allow entering a later step without submitting the one before it. Navigation freedom, NOT a validation exemption — the final submit still re-validates every step and returns to the first failing one. Default (absent/false): steps unlock in array order as each prior step submits validly. UI admission only, never authorization.|
407
+
|**showStepIndicator**|`boolean`| optional | Show the wizard step indicator (renderer default: shown). Step progress (completed/current/upcoming/invalid) is derived from the step gate — this boolean is the only authorable progress surface.|
|**showStepIndicator**|`boolean`| optional | Show the step indicator (wizard forms)|
1798
+
|**allowSkip**|`boolean`| optional |Wizard step-gate opt-out: allow entering a later step without submitting the one before it. Navigation freedom, NOT a validation exemption — the final submit still re-validates every step and returns to the first failing one. Default (absent/false): steps unlock in array order as each prior step submits validly. UI admission only, never authorization.|
1799
+
|**showStepIndicator**|`boolean`| optional | Show the wizard step indicator (renderer default: shown). Step progress (completed/current/upcoming/invalid) is derived from the step gate — this boolean is the only authorable progress surface.|
|**showStepIndicator**|`boolean`| optional | Show the step indicator (wizard forms)|
1883
+
|**allowSkip**|`boolean`| optional |Wizard step-gate opt-out: allow entering a later step without submitting the one before it. Navigation freedom, NOT a validation exemption — the final submit still re-validates every step and returns to the first failing one. Default (absent/false): steps unlock in array order as each prior step submits validly. UI admission only, never authorization.|
1884
+
|**showStepIndicator**|`boolean`| optional | Show the wizard step indicator (renderer default: shown). Step progress (completed/current/upcoming/invalid) is derived from the step gate — this boolean is the only authorable progress surface.|
|**showStepIndicator**|`boolean`| optional | Show the step indicator (wizard forms)|
2158
+
|**allowSkip**|`boolean`| optional |Wizard step-gate opt-out: allow entering a later step without submitting the one before it. Navigation freedom, NOT a validation exemption — the final submit still re-validates every step and returns to the first failing one. Default (absent/false): steps unlock in array order as each prior step submits validly. UI admission only, never authorization.|
2159
+
|**showStepIndicator**|`boolean`| optional | Show the wizard step indicator (renderer default: shown). Step progress (completed/current/upcoming/invalid) is derived from the step gate — this boolean is the only authorable progress surface.|
|**showStepIndicator**|`boolean`| optional | Show the step indicator (wizard forms)|
2344
+
|**allowSkip**|`boolean`| optional |Wizard step-gate opt-out: allow entering a later step without submitting the one before it. Navigation freedom, NOT a validation exemption — the final submit still re-validates every step and returns to the first failing one. Default (absent/false): steps unlock in array order as each prior step submits validly. UI admission only, never authorization.|
2345
+
|**showStepIndicator**|`boolean`| optional | Show the wizard step indicator (renderer default: shown). Step progress (completed/current/upcoming/invalid) is derived from the step gate — this boolean is the only authorable progress surface.|
0 commit comments