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
{{ message }}
Repository navigation
Wizard view v1 — declaration-and-refusal tightening of FormViewSchema type:'wizard' (Card S, ruled shape of #13622) #13704
Card S of the #13342 chain, filed by the domain:spec seat (session_01PBjwYLS6BciTQW3c9xQiD2) per the maintainer ruling of 2026-08-31 on #13622 (director batch #12, verbatim 「同意」 — shape approved per recommendations, all five trade-offs settled). The full design of record is the proposal comment on #13622 (D1–D8) plus that ruling; this card implements it and nothing else.
D1: deepen the form family's existing type: 'wizard' — no new viewKind, ZERO new keys.
D2 + T5: sections ARE the steps; refuse the wizard-inert step keys (visibleWhen / visibleOn / collapsible / collapsed) at parse via the EXISTING FormViewSchema superRefine (the pane-refusal precedent, covering the groups bucket and the overlay doors) — mirroring objectui#6237's ruled type-split at the spec door. The parse refusal UPGRADES fix(service-datasource): reject a pool block the memory arm cannot honour (#5931) #6237's renderer fact; objectui#6237 remains the future-contract tracker.
D4/D5/D6/D8 are declaration/docs postures with no new authorable keys: the gate is the DEFAULT semantics of type:'wizard' (allowSkip stays the only knob — "navigation freedom, not validation exemption"; gate is UI admission, never authorization); progress is derived state (showStepIndicator stays the only authorable); per-step validation binds ONLY existing field-level vocabulary; array order IS step order (no order key). Record these in the schema TSDoc where the tightenings land.
T3 deferred: buttons.next/previous NOT in v1 (F4 rides with it, deferred).
T4: the semver grade of the accept-set tightening is the review chain's call — argue it in the changeset, name the nearest tightening precedent.
RULED yes (accept-set tightening on the published FormViewSchema) ⇒ fable dispatch; PR parks DRAFT + needs:contract-review on both carriers; review chain/maintainer owns enqueue.
Sequencing
Card R (objectui alignment + pins) is filed Blocked-by: this card and dispatches only after this lands — never co-batched. Parent #13342 stays the coordination node.
Claim: PM loop round 1 (2026-08-31 shift) — self-filed ruled implementation card, claimed at creation
Session: session_01PBjwYLS6BciTQW3c9xQiD2
Branch: claude/issue-13704-wizard-view-tightening
Worktree: objectstack-issue-13704
Domain: domain:spec (label production stays triage's; lane identity recorded here)
File surface: packages/spec/src/ui/view.zod.ts (the FormViewSchema superRefine + wizard TSDoc) + tests + generated baselines the gates own + .changeset/*. ⚠️ H17 check: view.zod.ts is #8346's declared trigger file — notification to be posted on #8346 at dispatch, notification-only per that hold's shape (zero PLATFORM_GAPS/doc surface touched) (stop on breach; explain in the report)
Container & model: M, mode:subagent, model: claude-fable-5 — clause-② RULED yes (accept-set tightening on published FormViewSchema).
Clause-②: yes (ruled)
Serial constraints cleared: no open PR or in-flight claim touches packages/spec/src/ui/view.zod.ts (parked/merged set checked: today's landings touched data/*, api/protocol.zod.ts, system/i18n-resolver.ts — disjoint; in-flight patch round on PR #13669 = data/field.zod.ts + lint census, disjoint; #13357's dispatched work is driver/formula-side per its lane). Read-coupling: the tightening refuses keys nothing ships as accepted-and-rendered (the proposal measured the inert set); Card R pins the consumer side after this lands.
Parking commitment: PR opens DRAFT; needs:contract-review on both carriers in the same stroke the PR exists. Review chain/maintainer owns enqueue.
{
"issue": 13704,
"status": "done",
"branch": "claude/issue-13704-wizard-view-tightening",
"pr": "https://github.com/objectstack-ai/objectstack/pull/13733",
"premise_still_valid": true,
"summary": "Card S implemented exactly per the #13622 ruling of record (director batch #12, verbatim 「同意」; both ruling comments re-read verbatim this run). All in packages/spec/src/ui/view.zod.ts + tests + gate-owned regenerations + changeset, ZERO new authorable keys: (1) D2/T2/T5 — the EXISTING FormViewSchema superRefine (pane-refusal precedent, same bucket loop) refuses on type wizard the step keys visibleWhen (visibleOn arrives folded to visibleWhen by normalizeVisibleWhen before the refine, message says so) and collapsible/collapsed === true, covering the groups bucket and via .extend() the overlay door; authored false is post-parse indistinguishable from the .default(false) and declares delivered behavior, so only true refuses — pinned + flagged to the review chain. (2) D3/T1 — steps: guidance-refusal with the ruled prescription on the strict surface; never an alias. (3) D7 — wizard with absent/empty sections refused (before-state measured: silent fallback to simple rendering); fires at the complete-authored-view doors, deliberately EXEMPT on the flattened runtime overlay (partial-patch contract; overlay.form.identity is #7025-pinned ACCEPTED membership, moves need their own ruling per #7741) — mechanical door marker is the overlay extension's required viewKind; exemption pinned + flagged to the review chain. (4) D4/D5/D6/D8 declared in the wizard docblock + describe strings, projecting into the regenerated reference docs (generator-owned; no teaching material; #13337/#13086 fence untouched). (5) Changeset: spec minor, BREAKING accept-set narrowing under the launch-window convention, precedents #11519/#11842 + the pane refusal, adr-0087 disposition not-required (no-migration-prescription); T4 final grade with this PR's review chain. Census: authored wizard corpus = showcase task.view.ts wizard + its lint-fixture mirror, both clean keys and non-empty sections; zero refused shapes, zero steps: keys, zero docs wizards — no premise fork. PR #13733 parked DRAFT + needs:contract-review on both carriers, read back on both (issue keeps pm:dispatched; PR also carries auto size/m). H17 honored: notification-only, no PDF/export rider. Nothing objectui-side.",
"tests": "All at head cee7ddde through scripts/pm/os-verify-lock.sh unless noted, verdict lines quoted. Targeted suites (view.test.ts + view-union-diagnostics + view-inline-object-binding + view-form-features-root): 'Test Files 4 passed (4) / Tests 422 passed (422)', VERDICT command-exit 0. Full spec suite: 'Test Files 443 passed | 1 skipped / Tests 11883 passed | 1 skipped', VERDICT command-exit 0. Downstream consumer radius (@objectstack/lint, holds the wizard fixture mirror): 'Test Files 85 passed / Tests 2360 passed'. Typecheck (tsc + check:scripts-typecheck + check:test-typecheck): VERDICT command-exit 0; tsc --listFiles proves view.zod.ts in the main program and view.test.ts in the test program (1 hit each — measured, not the excluded-tests false green). ABLATION (predicted-red, no build leg BY CONSTRUCTION — spec vitest imports ./view.zod source relatively, no exports/dist resolution on this pair, so no rebuild exists to owe; mutation confirmed on disk by blob hash + anchor greps): view.zod.ts checked out to BASE 90578117, disk hash-object == base blob 668fb2d9, anchors '13704' and 'must declare its steps' grep -c 0; vitest -t wizard exit 1, 'Tests 12 failed | 7 passed' — exactly the 12 refusal pins predicted red, 7 accept pins green; restore via git checkout HEAD -- with trap, disk hash == HEAD blob 1d1fcc7f, git diff HEAD empty, anchor count 2 restored. Gates at cee7ddde (families derived by scripts/pm/dispatch-gates.mjs, which reads the changeset itself): check:authorable-surface, check:generated ('All 14 generated artifacts are up to date' after building spec — its first run red was the unbuilt-dist prerequisite, not staleness), check:docs, check:yaml-examples, check:skill-examples ('260 prose examples type-check across 3 surfaces', after turbo-building client/client-react closures), check:doc-authoring (one real hit: internal issue id in a customer-facing refusal message — stripped, negative pin added), check:liveness, check:strictness-ledger, check:variant-docs, check:empty-state, check:llms-txt, check:skill-refs, check:engine-double-contract, check:where-matcher, check:query-options-erasure, check:dispatcher-error-vocabulary, check:type-check-coverage, check:cross-package-test-inputs, check:nul-bytes, check:doc-anchors, check:merge-driver, doc/route/frontmatter/section gates, docs-audit affected-docs, and changeset gates (check-adr-0087-registration, check-changeset-no-major, check-empty-changeset, check:objectui-changeset, check:pm-half-states, check:changeset-gate-self-tests) — all exit 0. NOT MEASURED locally, declared: check:dual-build-cjs-loads + check-dev-prereqs (refuse without whole-workspace dist — 'NOT a pass: nothing was measured'; CI Build Core owns the farm; diff adds no exports, api-surface current), scripts/pm/check-half-states.mjs (exit 3 = GitHub instrument unread from this session-gated seat; board patrol, diff-independent), check:react-declaration-parity (needs objectui browser manifest by design), shard-attestation/test-completeness (CI job steps over CI artifacts), check-undeclared-dep-imports (unrun; diff adds no imports — one same-package named import only). Census positive controls: probe hit list contains both known wizard declarations, and the identical pipeline over a synthetic wizard-with-visibleWhen control file matches it.",
"mcp_calls": "8 — two hidden-timeline reads (the #13622 ruling comments, objectui#6237 ruling 5468763678; payload channel cannot reach timeline middles, REST probe 403 'GitHub access is not enabled for this session' so the fallback ladder applied), claim comment, create draft PR, one get_labels, two label union-writes (REST addition endpoint gated for this seat; compare-read-back done zero-quota via page anchors on BOTH carriers, plus a delayed re-check — union intact, size/m auto-label coexists), this report comment. All card/comment/label reads otherwise via the zero-quota page payload channel and git.",
"open_questions": [
{ "question": "D7 door scoping: the flattened runtime-overlay member is exempt from the empty/absent-sections refusal (partial-patch contract; overlay.form.identity is #7025-pinned ACCEPTED; membership moves need their own ruling per the #7741 precedent)", "options": ["A keep the exemption (as landed, pinned)", "B extend D7 to the overlay door via its own ruling"], "recommendation": "A — the ruled D7 targets the authored silent-fallback; the overlay's partial shape is load-bearing for Studio round-trips. Flagged in the PR body for the contract-review chain." },
{ "question": "collapsible/collapsed refusal fires only on === true (authored false is post-parse indistinguishable from the schema default and declares exactly the delivered behavior)", "options": ["A keep (as landed, pinned with reasoning)", "B restructure FormSectionSchema defaults to detect authored false — a parsed-output contract change for every form type"], "recommendation": "A — B widens the diff far past the ruled minimal superRefine mechanism to refuse a semantically-void spelling. Flagged in the PR body." }
],
"out_of_scope_findings": [
"handed to PM, not filed (no dedup channel burned; PM owns triage): 'pnpm --filter @objectstack/client-react... build' fails in packages/runtime (TS2307 Cannot find module @objectstack/rest, dts leg) while the turbo-graph build of the same closure succeeds — pnpm's filter ordering vs turbo's ^build graph disagree about runtime's inputs; evidence in this card's cr-build logs. Possibly a missing declared dep or a known builder convention; worth one triage look, not assumed a defect."
]
}
Activity
os-warren commentedon Aug 31, 2026
Claim: PM loop round 1 (2026-08-31 shift) — self-filed ruled implementation card, claimed at creation⚠️ H17 check:
Session:
session_01PBjwYLS6BciTQW3c9xQiD2Branch:
claude/issue-13704-wizard-view-tighteningWorktree:
objectstack-issue-13704Domain:
domain:spec(label production stays triage's; lane identity recorded here)File surface:
packages/spec/src/ui/view.zod.ts(the FormViewSchema superRefine + wizard TSDoc) + tests + generated baselines the gates own +.changeset/*.view.zod.tsis #8346's declared trigger file — notification to be posted on #8346 at dispatch, notification-only per that hold's shape (zero PLATFORM_GAPS/doc surface touched) (stop on breach; explain in the report)Container & model: M,
mode:subagent,model: claude-fable-5— clause-② RULED yes (accept-set tightening on published FormViewSchema).Clause-②: yes (ruled)
Serial constraints cleared: no open PR or in-flight claim touches
packages/spec/src/ui/view.zod.ts(parked/merged set checked: today's landings toucheddata/*,api/protocol.zod.ts,system/i18n-resolver.ts— disjoint; in-flight patch round on PR #13669 =data/field.zod.ts+ lint census, disjoint; #13357's dispatched work is driver/formula-side per its lane). Read-coupling: the tightening refuses keys nothing ships as accepted-and-rendered (the proposal measured the inert set); Card R pins the consumer side after this lands.Parking commitment: PR opens DRAFT;
needs:contract-reviewon both carriers in the same stroke the PR exists. Review chain/maintainer owns enqueue.Generated by Claude Code
os-warren commentedon Aug 31, 2026
Dev claim (dispatched os-dev seat) — implementing now.
claude/issue-13704-wizard-view-tightening(pushed; write-route probe green)objectstack-issue-13704, base90578117(origin/main at claim time)visibleWhen/visibleOn/collapsible/collapsedon wizard, groups bucket + overlay doors covered) · D3/T1steps:guidance-refusal with prescription · D7 absent/emptysectionsrefusal · D4/D5/D6/D8 TSDoc declarations · gate-owned regenerations · changeset arguing the semver grade (T4, review chain's call). ZERO new authorable keys.needs:contract-reviewon both carriers in the same stroke; never ready/enqueue.view.zod.tsis export: PDF / print document generation — re-planned for v18, superseding the #1301 NOT_PLANNED closure #8346's Restart-touch trigger file — PM's notification stands; no PDF/export rider taken here.Generated by Claude Code
feat(spec): wizard view v1 — step-key refusal, steps guidance, empty-…
docs(spec): regenerate reference tables; changeset; strip issue id fr…
os-warren commentedon Aug 31, 2026
os-dev-report
{ "issue": 13704, "status": "done", "branch": "claude/issue-13704-wizard-view-tightening", "pr": "https://github.com/objectstack-ai/objectstack/pull/13733", "premise_still_valid": true, "summary": "Card S implemented exactly per the #13622 ruling of record (director batch #12, verbatim 「同意」; both ruling comments re-read verbatim this run). All in packages/spec/src/ui/view.zod.ts + tests + gate-owned regenerations + changeset, ZERO new authorable keys: (1) D2/T2/T5 — the EXISTING FormViewSchema superRefine (pane-refusal precedent, same bucket loop) refuses on type wizard the step keys visibleWhen (visibleOn arrives folded to visibleWhen by normalizeVisibleWhen before the refine, message says so) and collapsible/collapsed === true, covering the groups bucket and via .extend() the overlay door; authored false is post-parse indistinguishable from the .default(false) and declares delivered behavior, so only true refuses — pinned + flagged to the review chain. (2) D3/T1 — steps: guidance-refusal with the ruled prescription on the strict surface; never an alias. (3) D7 — wizard with absent/empty sections refused (before-state measured: silent fallback to simple rendering); fires at the complete-authored-view doors, deliberately EXEMPT on the flattened runtime overlay (partial-patch contract; overlay.form.identity is #7025-pinned ACCEPTED membership, moves need their own ruling per #7741) — mechanical door marker is the overlay extension's required viewKind; exemption pinned + flagged to the review chain. (4) D4/D5/D6/D8 declared in the wizard docblock + describe strings, projecting into the regenerated reference docs (generator-owned; no teaching material; #13337/#13086 fence untouched). (5) Changeset: spec minor, BREAKING accept-set narrowing under the launch-window convention, precedents #11519/#11842 + the pane refusal, adr-0087 disposition not-required (no-migration-prescription); T4 final grade with this PR's review chain. Census: authored wizard corpus = showcase task.view.ts wizard + its lint-fixture mirror, both clean keys and non-empty sections; zero refused shapes, zero steps: keys, zero docs wizards — no premise fork. PR #13733 parked DRAFT + needs:contract-review on both carriers, read back on both (issue keeps pm:dispatched; PR also carries auto size/m). H17 honored: notification-only, no PDF/export rider. Nothing objectui-side.", "tests": "All at head cee7ddde through scripts/pm/os-verify-lock.sh unless noted, verdict lines quoted. Targeted suites (view.test.ts + view-union-diagnostics + view-inline-object-binding + view-form-features-root): 'Test Files 4 passed (4) / Tests 422 passed (422)', VERDICT command-exit 0. Full spec suite: 'Test Files 443 passed | 1 skipped / Tests 11883 passed | 1 skipped', VERDICT command-exit 0. Downstream consumer radius (@objectstack/lint, holds the wizard fixture mirror): 'Test Files 85 passed / Tests 2360 passed'. Typecheck (tsc + check:scripts-typecheck + check:test-typecheck): VERDICT command-exit 0; tsc --listFiles proves view.zod.ts in the main program and view.test.ts in the test program (1 hit each — measured, not the excluded-tests false green). ABLATION (predicted-red, no build leg BY CONSTRUCTION — spec vitest imports ./view.zod source relatively, no exports/dist resolution on this pair, so no rebuild exists to owe; mutation confirmed on disk by blob hash + anchor greps): view.zod.ts checked out to BASE 90578117, disk hash-object == base blob 668fb2d9, anchors '13704' and 'must declare its steps' grep -c 0; vitest -t wizard exit 1, 'Tests 12 failed | 7 passed' — exactly the 12 refusal pins predicted red, 7 accept pins green; restore via git checkout HEAD -- with trap, disk hash == HEAD blob 1d1fcc7f, git diff HEAD empty, anchor count 2 restored. Gates at cee7ddde (families derived by scripts/pm/dispatch-gates.mjs, which reads the changeset itself): check:authorable-surface, check:generated ('All 14 generated artifacts are up to date' after building spec — its first run red was the unbuilt-dist prerequisite, not staleness), check:docs, check:yaml-examples, check:skill-examples ('260 prose examples type-check across 3 surfaces', after turbo-building client/client-react closures), check:doc-authoring (one real hit: internal issue id in a customer-facing refusal message — stripped, negative pin added), check:liveness, check:strictness-ledger, check:variant-docs, check:empty-state, check:llms-txt, check:skill-refs, check:engine-double-contract, check:where-matcher, check:query-options-erasure, check:dispatcher-error-vocabulary, check:type-check-coverage, check:cross-package-test-inputs, check:nul-bytes, check:doc-anchors, check:merge-driver, doc/route/frontmatter/section gates, docs-audit affected-docs, and changeset gates (check-adr-0087-registration, check-changeset-no-major, check-empty-changeset, check:objectui-changeset, check:pm-half-states, check:changeset-gate-self-tests) — all exit 0. NOT MEASURED locally, declared: check:dual-build-cjs-loads + check-dev-prereqs (refuse without whole-workspace dist — 'NOT a pass: nothing was measured'; CI Build Core owns the farm; diff adds no exports, api-surface current), scripts/pm/check-half-states.mjs (exit 3 = GitHub instrument unread from this session-gated seat; board patrol, diff-independent), check:react-declaration-parity (needs objectui browser manifest by design), shard-attestation/test-completeness (CI job steps over CI artifacts), check-undeclared-dep-imports (unrun; diff adds no imports — one same-package named import only). Census positive controls: probe hit list contains both known wizard declarations, and the identical pipeline over a synthetic wizard-with-visibleWhen control file matches it.", "mcp_calls": "8 — two hidden-timeline reads (the #13622 ruling comments, objectui#6237 ruling 5468763678; payload channel cannot reach timeline middles, REST probe 403 'GitHub access is not enabled for this session' so the fallback ladder applied), claim comment, create draft PR, one get_labels, two label union-writes (REST addition endpoint gated for this seat; compare-read-back done zero-quota via page anchors on BOTH carriers, plus a delayed re-check — union intact, size/m auto-label coexists), this report comment. All card/comment/label reads otherwise via the zero-quota page payload channel and git.", "open_questions": [ { "question": "D7 door scoping: the flattened runtime-overlay member is exempt from the empty/absent-sections refusal (partial-patch contract; overlay.form.identity is #7025-pinned ACCEPTED; membership moves need their own ruling per the #7741 precedent)", "options": ["A keep the exemption (as landed, pinned)", "B extend D7 to the overlay door via its own ruling"], "recommendation": "A — the ruled D7 targets the authored silent-fallback; the overlay's partial shape is load-bearing for Studio round-trips. Flagged in the PR body for the contract-review chain." }, { "question": "collapsible/collapsed refusal fires only on === true (authored false is post-parse indistinguishable from the schema default and declares exactly the delivered behavior)", "options": ["A keep (as landed, pinned with reasoning)", "B restructure FormSectionSchema defaults to detect authored false — a parsed-output contract change for every form type"], "recommendation": "A — B widens the diff far past the ruled minimal superRefine mechanism to refuse a semantically-void spelling. Flagged in the PR body." } ], "out_of_scope_findings": [ "handed to PM, not filed (no dedup channel burned; PM owns triage): 'pnpm --filter @objectstack/client-react... build' fails in packages/runtime (TS2307 Cannot find module @objectstack/rest, dts leg) while the turbo-graph build of the same closure succeeds — pnpm's filter ordering vs turbo's ^build graph disagree about runtime's inputs; evidence in this card's cr-build logs. Possibly a missing declared dep or a known builder convention; worth one triage look, not assumed a defect." ] }Generated by Claude Code
os-warren commentedon Aug 31, 2026
派发席收集复核:PASS(停靠件) — PR #13733(head
cee7ddde)逐项核对(review-of-record):
needs:contract-review✓;本卡 pm:dispatched +needs:contract-review✓ —— 双载体同笔停靠,条款② yes,本席不放行,落地权在评审链/维护者。Fixes #13704首行 ✓;5 文件 +391/−19,面与报告一致(view.zod.ts + view.test.ts + 两个 generator 拥有的 docs regen + changeset),零新增可作者键 ✓。steps:guidance-refusal 带处方、⛔非别名 ✓;D7 空/缺 sections 拒绝且前状态已测量(静默回落 simple 渲染)✓;D4–D8 进 docblock/describe 投影到 regen docs,无手写教材,docs(objectui): layout-dsl teaches only shapes the live schemas accept #13337/[finding] YAML doc fences are validated by nothing —check:skill-examplesreads onlyts/tsxfences, and only opt-in, so every metadata example incontent/docs/**is unverifiable by construction #13086 围栏未动 ✓;T4 changeset minor + BREAKING header,adr-0087 not-required 带完整理由,终评留给评审链 ✓。=== true(authored false 经.default(false)后不可观测,且声明的正是实际行为)。均非本席裁定权,仅记 concurrence。claude/issue-13704-wizard-view-tightening为身份锚 —— 可接受,记档。pnpm --filter @objectstack/client-react... buildfails in packages/runtime (TS2307: cannot find@objectstack/rest, dts leg) while the turbo^buildgraph of the same closure succeeds #13735,未折入本 PR ✓。后续:CI(08:52Z 起跑)绿后仍停靠等契约复核;Card R(objectui#6985)在本卡落地后解锁派发。
Generated by Claude Code
os-warren commentedon Aug 31, 2026
分诊补车道 →
domain:spec· p2 · enhancement。在飞卡,状态不动 ——pm:dispatched保留,认领人保留,PR #13733 不受影响。本卡此前只有
pm:dispatched一个标签,没有domain:*:这意味着它在按车道跑的候选查询、sweep 与老化告警里全都不出现。一张已派发、带 Clause-② 且有下游卡等着的卡处于这种状态,是本轮扫到的最不该出现的半标注。现补齐。锚定。 落点是
FormViewSchema的 superRefine(packages/spec)⇒domain:spec,与立卡座位一致。定级 p2。 已有 2026-08-31 维护者裁决(#13622,director batch #12,「同意」,五个 trade-off 全部落定),方向不再有不确定性;工作量是一次收窄型 superRefine + TSDoc。不判 p1:无线上故障,
type:'wizard'目前的行为是静默降级到简单渲染而不是出错。两处提醒,仅供在飞的 PR 自查,⛔ 不改派单范围:
needs:contract-review,enqueue 由 review chain / 维护者拿。本卡不代为 enqueue。未挂⚠️ 若那条阻塞关系目前只存在于本卡正文,那它对解锁扫描不可见 —— 按本仓规则要落到 Card R 自己的标签与评论上,散文不作载体。
pm:blocking—— 卡片写明 Card R「filedBlocked-by:this card」,但我没有拿到 Card R 的编号去核实那条Blocked-by:确实落在卡上(而不是只写在散文里)。若 Card R 确已开卡并带Blocked-by: #13704,说一声或直接补pm:blocking;Generated by Claude Code
feat(spec): wizard view v1 — declaration-and-refusal tightening of Fo…
test(spec): the last ui/ file group's test titles state each cited de…