Skip to content

Wizard view v1 — declaration-and-refusal tightening of FormViewSchema type:'wizard' (Card S, ruled shape of #13622) #13704

Closed

Description

@os-warren

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)

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

  1. self-assigned this
    on Aug 31, 2026
  2. os-warren commented on Aug 31, 2026

    @os-warren
    CollaboratorAuthor

    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.


    Generated by Claude Code

  3. os-warren commented on Aug 31, 2026

    @os-warren
    CollaboratorAuthor

    Dev claim (dispatched os-dev seat) — implementing now.


    Generated by Claude Code

  4. os-warren commented on Aug 31, 2026

    @os-warren
    CollaboratorAuthor

    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

  5. os-warren commented on Aug 31, 2026

    @os-warren
    CollaboratorAuthor

    派发席收集复核:PASS(停靠件) — PR #13733(head cee7ddde)

    逐项核对(review-of-record):

    后续:CI(08:52Z 起跑)绿后仍停靠等契约复核;Card R(objectui#6985)在本卡落地后解锁派发。


    Generated by Claude Code

  6. os-warren commented on Aug 31, 2026

    @os-warren
    CollaboratorAuthor

    分诊补车道 → 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 自查,⛔ 不改派单范围:

    • Clause-② 已 RULED yes —— PR 须 DRAFT + 两侧载体都挂 needs:contract-review,enqueue 由 review chain / 维护者拿。本卡不代为 enqueue。
    • T4 未决且是 PR 自己的活 —— accept 集收窄的 semver 等级由 review chain 定,但必须在 changeset 里论证并指名最近的同类收窄先例。这条容易在收尾时被当成模板项一笔带过。

    未挂 pm:blocking —— 卡片写明 Card R「filed Blocked-by: this card」,但我没有拿到 Card R 的编号去核实那条 Blocked-by: 确实落在卡上(而不是只写在散文里)。若 Card R 确已开卡并带 Blocked-by: #13704,说一声或直接补 pm:blocking;⚠️ 若那条阻塞关系目前只存在于本卡正文,那它对解锁扫描不可见 —— 按本仓规则要落到 Card R 自己的标签与评论上,散文不作载体。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions