Skip to content

Design the first-class wizard view schema shape — the ruled spec half of #13342 (proposal returns to the decision box before any implementation) #13622

Description

@os-warren

Spec-first design sub-card created per the #13342 ruling (maintainer, 2026-08-30, director batch #6, verbatim 「13342 A」) by the domain:spec seat (session_01PBjwYLS6BciTQW3c9xQiD2). Parent #13342 is the Feature coordination node and is never dispatched itself.

Deliverable

A contract-shape PROPOSAL for the first-class wizard view (步序 / 进度模型 / 「上一步过校验才能进下一步」的闸 — the keys and their semantics), posted on this card. ⚠️ Per the ruling, the finalized shape returns to the decision box for one maintainer pass before any implementation dispatch — the direction is ruled (build it), the concrete public-contract shape is NOT delegated. No implementation, no schema edits land from this card.

Ruled design inputs (from the ruling, binding)

Sequencing

After the maintainer passes the shape: implementation cards are filed contract-first (spec schema card, clause-② expected yes, fable + review chain; objectui render sub-card Blocked-by: the spec half). None of that is this card's.

Parent: #13342.

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) — design-proposal dispatch (sub-card of ruled parent #13342; the parent is the coordination node and is never dispatched)
    Session: session_01PBjwYLS6BciTQW3c9xQiD2
    Branch: claude/issue-13622-wizard-view-shape-proposal (reserved; a proposal-only run may leave it unpushed — the deliverable is the shape proposal on this card)
    Worktree: objectstack-issue-13622
    Domain: domain:spec (per the parent ruling's 「spec 形先行(domain:spec 席)」; label production stays triage's — this line records lane identity only)
    File surface: READ-ONLY design measurement (existing view/form schemas, ui#6237's ruled split, the #13337/#13086 fence). ⛔ Zero schema edits, zero implementation — the finalized shape returns to the decision box for one maintainer pass before any implementation card exists (stop on breach; explain in the report)
    Container & model: M design-heavy, mode:subagent, model: claude-fable-5 — first-class public-contract shape design is the heaviest protocol-design class (拿不准升档 does not even apply; this is the fable case by definition).
    Clause-②: no for THIS dispatch (no contract behaviour changes; the future implementation card is the clause-② event, pre-read yes in the parent ruling)
    Serial constraints cleared: parent ruling recorded 2026-08-30 (director batch #6, verbatim 「13342 A」), quoted into the dispatch; read-only run ⇒ no file-surface collision possible; design inputs pinned by the ruling (tabbed-form boundary · ui#6237 reconciliation · same-wave landing fence · no teaching material before both halves land).


    Generated by Claude Code

  3. os-warren commented on Aug 31, 2026

    @os-warren
    CollaboratorAuthor

    Claiming this issue.

    • Session: session_01PBjwYLS6BciTQW3c9xQiD2
    • Branch: claude/issue-13622-wizard-view-shape-proposal (reserved; design-proposal dispatch — read-only, no PR expected)
    • Scope: contract-shape proposal for the first-class wizard view schema, posted here for the maintainer's decision box. Zero edits, no new cards.

    Generated by Claude Code


    Generated by Claude Code

  4. os-warren commented on Aug 31, 2026

    @os-warren
    CollaboratorAuthor

    os-dev-report

    Wizard 一等 view 形 —— 契约形状提案(#13342 裁决 verbatim「13342 A」的 spec 半)

    只读设计派发 · session session_01PBjwYLS6BciTQW3c9xQiD2 · branch claude/issue-13622-wizard-view-shape-proposal(保留未推,无 PR)
    测量基线:objectstack origin/main @ 52bc918e · objectui origin/main @ b84dc18。所有 file:line 均对这两个 commit 实测。


    0. 先交测量翻案:平台已有大半个 wizard —— 本提案因此是「宣告 + 拒收」,不是「新造面」

    父卡 #13342 写「平台今天没有任何一层能表达它」,其 re-check 只 grep 了 steps。逐层实测:

    层 事实 出处
    spec 声明 FormViewSchema.type 枚举已含 'wizard'(注释 "Step by step") packages/spec/src/ui/view.zod.ts:2906
    spec 声明 wizard 专属键已有两个:allowSkip、showStepIndicator view.zod.ts:2925-2926
    路由 对象的 form view type 被逐字接通:'wizard' 直達 ObjectForm,sections/allowSkip/showStepIndicator 同行 objectui packages/app-shell/src/views/RecordFormPage.tsx:279-294, 361
    渲染 formType 'wizard' 且 sections 非空 ⇒ 渲染 WizardForm,步 = section objectui packages/plugin-form/src/ObjectForm.tsx:305-329
    闸(裁定要的「上一步过校验才能进下一步」) 已存在且缺省开启:Next 原生提交当前步的表单,过校验才推进;指示器只放行「allowSkip ∥ 已完成步 ∥ 当前步之前」 objectui WizardForm.tsx:555-557("Next validates the step you are leaving")、:860-863
    终提地板 终提对全部步的声明字段集重验(canonical 规则引擎 resolveFieldRuleState,与 form 渲染器、server 同一引擎),缺项回送到第一个不合格步并 toast 点名 objectui WizardForm.tsx:577-621, 639-656;判空谓词与 server 共享(cloud#972):WizardForm.tsx:184-189
    进度 指示器 + completed/invalid 集合状态机已存在,showStepIndicator 缺省 true objectui WizardForm.tsx:629-646, 923-929
    真实作者 恰 1 处:showcase 的 task 向导(3 步),只用 name/label/columns/fields;lint fixture 镜像同形 examples/app-showcase/src/ui/views/task.view.ts:386-395;packages/lint/src/showcase-shape.fixtures.ts:316-324

    缺的不是能力,是契约:闸语义只活在 objectui 的 TSDoc 注释里,spec 一个字没说;步词汇是借用的 FormSectionSchema,带着 wizard 上惰性的键(下节);steps: 这个词(假教材教过的)在 spec 只换来无处方的 unknown-key 拒收。

    ⚠️ 对裁决的含义:方向裁定(要做一等面)完全成立且本提案照办;但「实现半」的定价变了 —— objectui 渲染半大头已在 main。这使裁定输入③(声明与实现同波次)的满足代价趋近于零,详见 §5。#13622 前提有效;#13342 卡面的「没有任何一层」表述按上表读作已过期的测量,不影响裁决本体。


    1. v1 形状总览(全部现存键,零新键;新增的只有语义宣告与拒收)

    type: wizard                # FormViewSchema.type 既有枚举值(view.zod.ts:2906)
    allowSkip: false            # 缺省即闸:上一步过校验才能进下一步(view.zod.ts:2925)
    showStepIndicator: true     # 进度指示,缺省 true(view.zod.ts:2926)
    sections:                   # 步序 = 数组顺序;v1 每步可写键恰 5 个
      - name: step_basics       # i18n 锚(FormSectionSchema:2432)
        label: Basics
        description: 可选,步标题下渲染
        columns: 1              # 1|2|3|4(:2485)
        fields: [title, project]
      - name: step_assign
        label: Assignment
        fields: [assignee, priority]

    v1 每步可写键 = name label description columns fields(FormSectionSchema 减去 wizard 上拒收的键)。这恰好是在册两个真实 wizard 声明实际用的全集(§0 末行)。


    2. 逐项决策(每项:推荐 + 备选;维护者一读可裁)

    D1 宿主:深化 form 家族的 type: 'wizard' 变体,⛔ 不新增 viewKind

    • 推荐:ViewKindSchema 维持 ['list','form'](view.zod.ts:3428-3430),wizard 仍经 ViewSchema.form / formViews(:3311, 3313)寻址。整条链已通(§0),一个真实作者已这么写。
    • 备选:第三个 viewKind 'wizard' —— 代价是 switcher/scope/overlay/权限一整套 view-item 语义的新永久面,零拉动;且与既有作者写法割裂。
    • 四轴 ②④ 同指推荐项。

    D2 步的载体:sections 即步;wizard-惰性键改为 parse 拒收

    今天 spec 在 wizard 变体上接受、渲染器丢弃的步键(declared≠enforced 残渣,恰是 ui#6237 在 objectui 侧刚裁掉的同族):

    • visibleWhen/visibleOn(FormSectionSchema:2482-2484)—— ObjectForm 的 wizard 映射不拷它(ObjectForm.tsx:311-319),只有 2026-08-29 临时诊断在 console.warn(ObjectForm.tsx:222-234,裁语 "wizard stays inert by DESIGN, not by omission");
    • collapsible/collapsed(:2435-2436)—— 映射不拷,连 warn 都没有;
    • pane(:2502)—— 已有先例:非 split 即 parse 拒收(view.zod.ts:3145-3155)。

    推荐(A):保持单一 FormSectionSchema,在 FormViewSchema 既有 superRefine 里按 type === 'wizard' 拒收上述四键,处方消息点名去处(谓词 ⇒ 见 §4;折叠 ⇒ wizard 步不折叠)。机制与 pane 拒收同一处,天然继承两条既有保护:refinement 先于 groups 折叠故两桶都查(:3141-3145),.extend 保留 refinement 故 overlay 门同步生效(:3138-3141)。
    备选(B):独立 WizardStepSchema(镜像 objectui 已裁的 WizardStepConfig 独立 interface,PR #6903)+ 在 wizard 变体替换 sections 元素 schema —— 「谁有谓词槽」显式进类型,更贴 6237 裁决词;但 FormViewSchema 现为单 strictObject、变体键平铺,元素级变体化需要 union/pipe 级重构,回归面大。

    • A 与 B 契约效果等同(拒收即显式);A 的 diff 与风险最小。B 留作维护者对显式性的偏好项。

    D3 steps: 拼写:guidance 拒收,⛔ 不做接受别名

    D4 闸:宣告为 type: 'wizard' 的缺省语义,allowSkip 是唯一旋钮,⛔ 不新增 gate 键

    契约文字(落 allowSkip describe + wizard 段 docblock,进生成 JSON schema 与 references 页):

    1. 缺省(allowSkip 缺席/false):第 N+1 步仅当第 N 步表单提交且过校验后可进;后退与已完成步永远自由(WizardForm.tsx:860-863 即此语义)。
    2. allowSkip: true = 导航自由,不是校验豁免(objectui 侧原文,WizardForm.tsx:216-225):终提仍对全部步的声明字段集重验并回送(:639-656)。
    3. 两种模式下 server 都是响亮地板;判空谓词与 server 共享(cloud#972)。
    4. 闸是 UI 准入规则,永不是授权 —— 与 section visibleWhen 的既有措辞同款(view.zod.ts:2462-2469)。
    • 备选:结构化 gate: { mode: sequential | free } —— 可扩展性好,但与 allowSkip 语义重复,须退役一个已发布键,且今天没有第三种 mode 的拉动。
    • 若未来出现「按步豁免」或「软闸」(warn 但放行)拉动,gate 对象是届时的升级路径;v1 不预铺。

    D5 进度模型:派生状态机,作者可写面 = showStepIndicator 一个布尔

    进度 = 每步 ∈ {completed, current, upcoming, invalid},由闸状态派生(WizardForm.tsx:629-646),不可作者。v1 只把这个模型写进契约文字;不新增 progress 对象、百分比、图标、自定义文案键。备选(结构化 progress 对象)零拉动,defer。

    D6 每步校验绑定:只绑既有字段级词汇,⛔ 不进步级规则

    闸消费的校验 = 该步字段的既有声明:required/requiredWhen/readonlyWhen/per-option visibleWhen(packages/spec/src/data/field.zod.ts:1383-1384;写路径评估清单 view.zod.ts:2462-2466),客户端经 canonical 规则引擎(与 server 同判,§0)。不进 v1:步级 ValidationRule 绑定(packages/spec/src/data/validation.zod.ts:324 一族是写时/服务端词汇;客户端评 script/cross-field 规则是新执行面 + 漂移源)。跨字段规则仍在写时由 server 兜底 —— wizard 终提即触发。

    D7 非空步:type: 'wizard' 拒收缺席/空的 sections

    今天 wizard 无 sections ⇒ 静默按 simple 渲染(RecordFormPage.tsx:287 条件展开 + ObjectForm.tsx:305 的 sections?.length 守卫)—— accepted-but-ignored 类。v1 在 parse 拒收(处方:至少声明一步)。⛔ 不强制「至少 2 步」:1 步向导合法可渲染,武断下限不是契约的事。

    D8 步序:数组顺序即步序,⛔ 不加 order 键

    加整数 order = 两个真相源(数组序 vs 键值),AI 重排编辑必踩。宣告进 docblock 一句话即可。


    3. 与 tabbed form view 的分界(裁定输入:tabbed 能分页、无闸 —— wizard 加了什么才不是同义词)

    维度 tabbed(type: 'tabbed') wizard(type: 'wizard')
    挂载模型 全部 tab 常驻挂载、CSS 隐藏 —— 值与校验跨 tab 存活(objectui#2959 语义,form.tsx:1301,6237 卡文引证) 单步挂载(WizardForm.tsx:128-130),值经 wizard 状态归并
    导航 自由,任意顺序 受闸:前进须过当前步校验;allowSkip 才放开
    步序语义 无(tab 序只是展示序) 有:数组序即完成序
    进度/完成态 无 completed/invalid 状态机 + 指示器
    提交校验 一次全量(全部挂载所以全验) 逐步验 + 终提全量重验 + 回送到第一个不合格步
    步/节谓词槽 有:section visibleWhen 已裁已落(ui#6237 拆分支路 1,语义继承 #6619) 无,拒收(§4)

    作者选择规则(将来教材的一句话):字段互为同侪、可任意序进入 ⇒ tabbed;必须走完上一阶段才允许看见/进入下一阶段 ⇒ wizard。二者共享 sections 词汇但语义正交:tabbed 是空间分页,wizard 是时间顺序。


    4. 与 objectui#6237 已裁拆分的调和(⛔ 不旁路)

    裁决原文(2026-08-30,verbatim「同意」,objectui#6237 comment 5468763678):拆开 FormSectionConfig;「WizardForm 保持无谓词槽,#6628 文档里『WizardForm steps = No』那行保持为真」;理由是共享类型会静默给 wizard 步发无实现的谓词槽(declared≠enforced),且「WizardForm step 显隐无实测拉动,不给它无实现的槽」。已落:PR #6903,WizardStepConfig 独立 interface(7 键、无任何 *When),family pin 在 build 层钉死(WizardForm.tsx:86-88)。

    v1 的调和方案:把『No』从渲染器事实升级为作者门拒收。

    • 现状是半开的门:spec 接受 wizard 步 visibleWhen,渲染器忽略并仅 console.warn(2026-08-29 临时诊断,ObjectForm.tsx:206-234)—— 作者/AI 在编写时点看不到任何异响。
    • v1(D2)在 parse 拒收 ⇒ 「WizardForm steps = No」两处镜像文档由作者门保真;spec 侧新增 fixture pin 与 objectui 侧 family pin 构成双向钉。这是加强该裁决,不是绕开。
    • 条件步/步级显隐整体不进 v1。它不是「把 visibleWhen 拷进去」的移植题,是新契约题:隐藏步与顺序闸交互(步重编号?闸跳过还是顺延?进度模型怎么数?),比 docs(pm-dispatch): mode:cloud 一次性云卡改用 create_session,附首派实测三课 #6236 已答的「隐藏组的必填怎么办」多一整层。真实拉动出现时回 decision box;追踪卡就是 objectui#6237(执行席 2026-08-30 明确留开:三个已发布指针指着它)。届时 spec 侧的拒收即「唯一开门点」,一处放行全链贯通。

    5. 同波次落地计划(裁定输入③④:最贵失败形围栏)

    结构性事实先行:本 v1 不含任何「声明了但没有渲染器」的键 —— v1 全部键(type/sections 五步键/allowSkip/showStepIndicator)今天已被渲染链消费(§0 逐行引文);v1 的增量是语义宣告 + 拒收。「AI 照教材写、校验全绿、渲染骨架」在本形状下无处发生:比围栏更强,是结构性不可能。这正是把 v1 收在 tightening 的红利。

    • Card S(objectstack,spec 半;条款② yes,fable + 复审链 —— 父裁决预读 yes)
      内容:D2 拒收(4 键 × wizard 变体)+ D7 非空步拒收 + D3 guidance + D4/D5/D8 契约文字(describe/docblock)+ fixture triage(按规则消费半径扫,含 lint fixtures)+ gen:schema 基线再生 + changeset 与迁移说明。
      ⚠️ 语义上属收紧(既有接受面变拒收):在册作者语料零命中(两个 wizard 声明都只用净键,§0),但 semver 档位(major vs minor+迁移注)交维护者与 Card S 复审链,§8 T4。
    • Card R(objectui,渲染子卡;Blocked-by: Card S,⛔ 永不同批)
      内容:bump spec、ObjectForm/RecordFormPage 映射注释对齐、2026-08-29 临时 console.warn 诊断去留(推荐保留:程序化 SDUI 调用方不过 spec 门,warn 是他们仅有的信号;pin 已护住不误报)、拒收键「到不了渲染器」的 pin、showcase 复验。
    • 教材:两半都落地后另立 docs 卡,⛔ 之前一字不写(本席已零编辑)。 docs(objectui): layout-dsl teaches only shapes the live schemas accept #13337/[finding] YAML doc fences are validated by nothing — check:skill-examples reads only ts/tsx fences, and only opt-in, so every metadata example in content/docs/** is unverifiable by construction #13086 通道保持关闭的机械保证:os:check-yaml 钉着 layout-dsl 页的每个 YAML 示例必须过已发布 schema(该页 :1031 已在用此标记),教材物理上无法先于 Card S 落地的形状出现;两半之间窗口期现状文案(「用 tabbed」)维持,教材卡同笔修正其「declared way」表述(§9 F2)。

    6. 四轴自检(对本提案自身的形状选择)

    • ① 实际业务需求(实测):在册真实作者 1(showcase task 向导,3 步净键);假教材流量证明「向导」是作者/AI 会伸手拿的词,但拿到的形是 page 级 steps: 幻影 —— 真实的 form-view wizard 一直在而无人教。本席看不见 hotcrm/customer 语料(与父卡同一置信缺口,原样上呈)。v1 选 tightening 而非扩能力,正因需求实测薄:先让已有的能力变成可信契约,新键等拉动。
    • ② 项目长远合理性:契约说平台做的、拒平台不做的 —— declared = enforced 恢复;镜像 6237 已裁的类型拆分于 spec 门;不新增第二套半吊子;sections 单一词汇不留永久折叠债。
    • ③ 防 AI 写元数据犯错:三处静默/迟到失败变 parse 时处方 —— wizard 步 visibleWhen(runtime console.warn ⇒ 拒收)、steps:(无处方 unknown-key ⇒ guidance 教学)、无步 wizard(静默降级 simple ⇒ 拒收)。全部在编写时点响亮。
    • ④ 创业阶段不扩散:零新渲染义务;刻意不做清单(§7)显式;最小而诚实的 v1。
    • 轴间冲突(不自裁,上呈):①vs③ 在 steps: 拼写(T1);②vs④ 在拒收广度(T2);①vs④ 在按钮文案键(T3)。

    7. 刻意不进 v1(每项一句理由)

    1. 步级 visibleWhen/条件步 —— §4,已裁 No,未来经 decision box + objectui#6237。
    2. 分支/跳转逻辑 —— flow 的领地(layout-dsl 现行 callout 已把「要分支」路由给 flow)。
    3. 步级 ValidationRule 绑定 —— D6,新执行面 + 漂移源。
    4. 结构化 progress/gate 对象 —— D4/D5,零拉动,allowSkip+showStepIndicator 已覆盖。
    5. buttons.next / buttons.previous(FormButtonConfig 扩展)—— 渲染器有 nextText/prevText 而 metadata 链未通(RecordFormPage.tsx:288-295 不传);是真实的 i18n 缺口但零实测索求,列 T3 交裁。
    6. 步 order 键 —— D8,两个真相源。
    7. 服务端草稿/断点续填 —— 全新持久化面。
    8. 步 className/gridClassName —— 样式类不是元数据作者能安全写的(drawerWidth 退役同理,view.zod.ts:2933-2934);SDUI 程序化调用方仍可用。

    8. 交维护者的开放权衡

    # 问题 推荐 备选 相争的轴
    T1 steps: 拼写 guidance 拒收 + 处方(D3) 输入别名折叠到 sections ① vs ③
    T2 拒收广度 只收 6237 同族步键 + 非空步(D2/D7);跨变体展示键矩阵(如 wizard 上的 defaultTab)另卡 同卡收全矩阵 ② vs ④
    T3 buttons.next/previous 进 v1? 不进(零实测索求;进则 Card R 需接通映射,仍同波可落) 进,复用 FormButtonConfigSchema(view.zod.ts:2516-2522, 3106-3111) ① vs ④
    T4 收紧的 semver 档位 交 Card S 复审链按仓惯例(audit close-out 先例是 major + os migrate meta 注) — —
    T5 D2 实现形 A:superRefine 拒收(最小 diff) B:独立 WizardStepSchema(显式性最强,重构面大) ② vs ④

    9. 顺路发现(交 PM 分诊,本席零立卡)

    • F1 FormViewSchema 跨变体展示键全量互相接受且惰性(:2912 "all optional" 镜像注释;仅 pane 有拒收)—— wizard 上的 defaultTab、tabbed 上的 allowSkip、任意 type 上的 split*/drawer*/modalSize 都静默无效。按 type 的键矩阵拒收是一族独立卡(T2 的另一半)。
    • F2 layout-dsl.mdx :1026-1029 称 tabbed 是「The declared way to collect a long form in stages」—— 对 view 层已失真(type: 'wizard' 存在且带闸渲染)。落进两半落地后的教材卡一并修正,勿单独提前动(教材围栏)。
    • F3 FormSectionSchema 不声明 className/gridClassName,但 ObjectForm 各映射经 as any 拷它们且渲染器消费(ObjectForm.tsx:317-318)—— SDUI-only 键与作者面的分界值得一行台账,防未来被误「补声明」。
    • F4 渲染器的 nextText/prevText/submitText 从 metadata 不可达(T3 同源事实的另一半,含 submitText 被 RecordFormPage 硬编码 t('form.saveRecord'))。

    报告(机读)

    {
      "issue": 13622,
      "status": "done",
      "branch": "claude/issue-13622-wizard-view-shape-proposal",
      "pr": null,
      "premise_still_valid": true,
      "summary": "Design-proposal only, zero edits. Measured both repos: the wizard form view already exists end-to-end (spec type enum, routing, gated renderer with canonical-engine validation, progress state machine, one real author) — so the proposed first-class v1 shape is a declaration-and-refusal tightening with ZERO new keys: declare gate/progress/step-order semantics into the contract, refuse the wizard-inert step keys (visibleWhen family, collapsible/collapsed) mirroring the objectui#6237 ruled split at the spec door, refuse empty-step wizards, add guidance for the steps spelling. Parent card's 'no layer can express it' claim is stale as a measurement; the ruling's direction stands and the same-wave fence becomes structurally free because nothing declared lacks a renderer.",
      "tests": "read-only dispatch — no build or test runs; every claim is a file:line measurement against objectstack@52bc918e and objectui@b84dc18",
      "mcp_calls": "3 — claim comment, one targeted issue_read get_comments for objectui#6237 (payload channel could not reach the middle of its 100-item timeline; REST probe answered 403), this proposal comment",
      "open_questions": [
        { "question": "T1 steps spelling", "options": ["A guidance-refusal with prescription", "B accepted input alias folded to sections"], "recommendation": "A — one spelling, taught loudly at the point of error" },
        { "question": "T2 refusal breadth", "options": ["A wizard step keys + empty-steps only", "B full per-type presentation-key matrix in the same card"], "recommendation": "A — matrix goes to its own card family (finding F1)" },
        { "question": "T3 buttons.next/previous in v1", "options": ["A defer", "B include via FormButtonConfigSchema"], "recommendation": "A — zero measured pull; still same-wave landable later" },
        { "question": "T5 refusal mechanism", "options": ["A superRefine on existing FormSectionSchema", "B dedicated WizardStepSchema element type"], "recommendation": "A — equal contract effect, smallest diff; B if the maintainer wants the 6237-style explicitness in the type itself" }
      ],
      "out_of_scope_findings": [
        "handed to PM, not filed (fence): F1 cross-variant presentation keys accepted-and-inert across FormViewSchema types",
        "handed to PM, not filed: F2 layout-dsl 'declared way' sentence stale once wizard is first-class — fold into the post-landing teaching card",
        "handed to PM, not filed: F3 className/gridClassName SDUI-only vs authorable boundary undocumented",
        "handed to PM, not filed: F4 wizard button texts unreachable from metadata"
      ]
    }

    Generated by Claude Code

  5. os-warren commented on Aug 31, 2026

    @os-warren
    CollaboratorAuthor

    PM verdict: ACCEPT(设计提案交付)+ 按 #13342 裁决转入决策箱 —— 形状待维护者过一遍。(session_01PBjwYLS6BciTQW3c9xQiD2)

    提案全文 = 上方 os-dev-report 评论(读回完整)。最重要的读数是前提修正:wizard form view 已经端到端存在 —— spec FormViewSchema.type 枚举含 'wizard'(view.zod.ts:2906)+ allowSkip/showStepIndicator(:2925-2926),RecordFormPage→ObjectForm→WizardForm 渲染链活着,裁决点名的闸(离步校验 + 提交全查,与服务端共用规则引擎)与进度状态机已实现,showcase 有真实作者(task.view.ts:386)。⇒ 父卡「没有任何一层能表达它」作为测量已过时;裁定的方向不变,但 v1 从「新面」重定价为「声明与拒绝收紧、零新键」——「声明与实现同波」围栏因此结构性满足(v1 不声明任何没有现成渲染器的东西)。

    请裁(D1–D8 推荐已成型,五个开放权衡)

    # 权衡 推荐
    T1 steps: 拼写 —— guidance-refusal 带处方 vs 接受为别名 refusal(防 AI 轴 ③ 优先)
    T2 拒绝面宽度 —— 仅 6237 族步级键 + 空 sections vs 一次做全 per-type 展示键矩阵 窄(④ 不扩散;宽版即提案 F1 观察,由本项裁定吸收)
    T3 buttons.next/previous 进 v1? 缓(F4「按钮文案 metadata 不可达」随本项一并定)
    T4 收紧的 semver 档 归 Card S 复审链按仓惯例
    T5 拒绝机制 —— 既有 superRefine(最小 diff)vs 独立 WizardStepSchema(最大显式) superRefine

    一句「按推荐」即可放行 Card S(spec 收紧实施卡,条款② yes,fable+复审链)与 Card R(objectui 侧,Blocked-by: Card S —— 亦已重定价:渲染已在,预计只剩对齐与 pin);逐项异议按 T 编号回。⛔ 本席不代裁 —— 首类自裁门不适用(公开契约语义面)。

    状态转移:pm:dispatched → needs-user-decision(同笔),assignee 清空。F2(layout-dsl 教材句过时)按提案留给落地后的教材卡;F3(className SDUI-only 的 as-any 消费)另立 finding。


    Generated by Claude Code

  6. removed their assignment
    on Aug 31, 2026
  7. zhuangjianguo commented on Aug 31, 2026

    @zhuangjianguo
    Collaborator

    ⚖️ RULED — 维护者,2026-08-31,第 6 场总监席决裁批 #12,verbatim「同意」(形状按推荐通过)

    裁定:向导一等 view 契约形提案按 spec 席推荐整体通过,五个权衡逐项定案:

    前提修正一并追认:wizard 已端到端存在(spec 枚举 + 渲染链 + 离步校验闸 + showcase 真实作者),v1 = 声明与拒绝收紧、零新键——「声明与实现同波」围栏结构性满足,#13337/#13086 的假教材通道不因本项重开(两半落地前照旧不产新教材)。

    放行:Card S(spec 收紧实施卡,条款② yes,tier + 复审链)与 Card R(objectui 对齐 + pin,Blocked-by: Card S)由 spec 席立卡,契约先行、⛔ 不 co-batch。F3(className as-any 消费)另立 finding 照提案;F2 留教材卡。

    席位边界(裁不派):录裁 + 转 pm:queue(执行 = spec 席立 Card S/R),同笔摘 needs-user-decision。裁决入本场追认摘要表。


    Generated by Claude Code

  8. zhuangjianguo commented on Aug 31, 2026

    @zhuangjianguo
    Collaborator

    ⚖️ RULED — 维护者,2026-08-31,第 6 场总监席决裁批 #12,verbatim「同意」(采本席推荐;裁定评论迟于标签转移补录,裁定时点以批回为准)

    裁定:向导一等 view 契约形提案通过维护者过目,五个开放权衡全部按 PM 荐:

    # 裁定
    T1 steps: 拼写 ⇒ guidance-refusal 带处方(防 AI 轴优先,#5099 同型)
    T2 拒绝面 ⇒ 窄(仅 6237 族步级键 + 空 sections;宽版矩阵即 F1 观察,由本项吸收不另做)
    T3 buttons.next/previous ⇒ 缓(F4 随后续一并定)
    T4 收紧的 semver 档 ⇒ 归 Card S 复审链按仓惯例定
    T5 拒绝机制 ⇒ 既有 superRefine(最小 diff)

    席位边界(裁不派):录裁 + pm:queue(标签已转);Card S/R 由 spec 席立案派发。裁决入本场追认摘要表。


    Generated by Claude Code

  9. os-warren commented on Aug 31, 2026

    @os-warren
    CollaboratorAuthor

    Disposition — this design card's deliverable is complete; closing completed. (session_01PBjwYLS6BciTQW3c9xQiD2) The proposal was delivered, the maintainer passed the shape with all five trade-offs per recommendation (director batch #12, 「同意」, recorded above), and the ruled execution is now filed: Card S = #13704 (spec tightening, claimed and dispatching from this seat, clause-② fable + review chain) and Card R = objectui#6985 (Blocked-by: Card S, dispatches after it lands). Parent #13342 remains the coordination node until both land. pm:queue stripped at close; domain:spec stays.


    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

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions