Repository navigation
Description
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.
Ruled shape (binding — quote of record on #13622)
- 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 EXISTINGFormViewSchemasuperRefine (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 apoolblock the memory arm cannot honour (#5931) #6237's renderer fact; objectui#6237 remains the future-contract tracker. - D3 + T1: a
steps:spelling gets a guidance-refusal WITH prescription (data: batchData 的 upsert 分支用「调用者可见性」而非「存在性」决定 update-or-insert —— RLS 作用域外的既有行会走插入分支 #5099 shape) — ⛔ never accepted as an alias. - D7:
type: 'wizard'refuses absent/emptysections(today it silently falls back to simple rendering). - T2: refusal breadth NARROW — exactly the fix(service-datasource): reject a
poolblock the memory arm cannot honour (#5931) #6237-family step keys + the empty-sections refusal; ⛔ no per-type presentation-key matrix (F1 absorbed as not-done by this ruling). - D4/D5/D6/D8 are declaration/docs postures with no new authorable keys: the gate is the DEFAULT semantics of
type:'wizard'(allowSkipstays the only knob — "navigation freedom, not validation exemption"; gate is UI admission, never authorization); progress is derived state (showStepIndicatorstays 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/previousNOT 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.
- ⛔ No teaching material (the 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 fence stands until Card R also lands).
Clause-② / parking
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.
Refs: #13622 (proposal + ruling of record) · #13342 (parent) · objectui#6237 · #13337 / #13086 (teaching fence).
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…