Repository navigation
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
Activity
- added a parent issue
on Aug 31, 2026 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
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
os-dev-report
Wizard 一等 view 形 —— 契约形状提案(#13342 裁决 verbatim「13342 A」的 spec 半)
只读设计派发 · session
session_01PBjwYLS6BciTQW3c9xQiD2· branchclaude/issue-13622-wizard-view-shape-proposal(保留未推,无 PR)
测量基线:objectstackorigin/main@52bc918e· objectuiorigin/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:2906spec 声明 wizard 专属键已有两个: allowSkip、showStepIndicatorview.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,步 = sectionobjectui 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缺省 trueobjectui 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 每步可写键 =
namelabeldescriptioncolumnsfields(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 拒收,⛔ 不做接受别名- 推荐:给
FormViewSchema的 unknown-key 拒收挂guidance处方(既有机制先例:view.zod.ts:3075-3078;userFilters.allowAddTab是 objectui 真读、spec 从未声明的活能力 —— promote 还是 reject?(挡住 #4001 批 18 的 UserFiltersSchema 收紧) #5073 一族):steps⇒ 「wizard 的步写作 sections,type: wizard;步序即数组顺序」。AI/人最自然会写的词在出错点得到教学,而平台只有一种拼写。 - 备选:接受
steps为输入别名并折叠到sections(groups先例,:2956-2958)—— 一物两拼写永久化,AI 语料里两形并存互相污染;且groups别名是历史包袱不是榜样。 - ①(作者顺手)与 ③(单一拼写防错)在此相争,推荐③赢;见 §8 T1。
D4 闸:宣告为
type: 'wizard'的缺省语义,allowSkip是唯一旋钮,⛔ 不新增 gate 键契约文字(落
allowSkipdescribe + wizard 段 docblock,进生成 JSON schema 与 references 页):- 缺省(
allowSkip缺席/false):第 N+1 步仅当第 N 步表单提交且过校验后可进;后退与已完成步永远自由(WizardForm.tsx:860-863即此语义)。 allowSkip: true= 导航自由,不是校验豁免(objectui 侧原文,WizardForm.tsx:216-225):终提仍对全部步的声明字段集重验并回送(:639-656)。- 两种模式下 server 都是响亮地板;判空谓词与 server 共享(cloud#972)。
- 闸是 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-optionvisibleWhen(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-examplesreads onlyts/tsxfences, and only opt-in, so every metadata example incontent/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(每项一句理由)
- 步级
visibleWhen/条件步 —— §4,已裁 No,未来经 decision box + objectui#6237。 - 分支/跳转逻辑 —— flow 的领地(layout-dsl 现行 callout 已把「要分支」路由给 flow)。
- 步级 ValidationRule 绑定 —— D6,新执行面 + 漂移源。
- 结构化
progress/gate对象 —— D4/D5,零拉动,allowSkip+showStepIndicator已覆盖。 buttons.next/buttons.previous(FormButtonConfig 扩展)—— 渲染器有nextText/prevText而 metadata 链未通(RecordFormPage.tsx:288-295不传);是真实的 i18n 缺口但零实测索求,列 T3 交裁。- 步
order键 —— D8,两个真相源。 - 服务端草稿/断点续填 —— 全新持久化面。
- 步
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
- 推荐:
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
zhuangjianguo commented
on Aug 31, 2026 CollaboratorMore actions⚖️ RULED — 维护者,2026-08-31,第 6 场总监席决裁批 #12,verbatim「同意」(形状按推荐通过)
裁定:向导一等 view 契约形提案按 spec 席推荐整体通过,五个权衡逐项定案:
- T1:
steps:拼写 ⇒ guidance-refusal 带处方(⛔ 不作别名接受;防 AI 轴优先,data: batchData 的 upsert 分支用「调用者可见性」而非「存在性」决定 update-or-insert —— RLS 作用域外的既有行会走插入分支 #5099 形)。 - T2:拒绝面 ⇒ 窄(仅 fix(service-datasource): reject a
poolblock the memory arm cannot honour (#5931) #6237 族步级键 + 空 sections;per-type 展示键矩阵即提案 F1,由本项裁定吸收为不做)。 - T3:
buttons.next/previous⇒ 缓(F4 按钮文案可达性随之一并缓)。 - T4:收紧的 semver 档 ⇒ 归 Card S 复审链按仓惯例定。
- T5:机制 ⇒ 既有
superRefine(最小 diff)。
前提修正一并追认: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
- T1:
zhuangjianguo commented
on Aug 31, 2026 CollaboratorMore actions⚖️ 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)- 前提修正采信:wizard view 已端到端存在(spec 枚举
'wizard'+ 渲染链 + 离步校验闸 + showcase 真作者),v1 重定价为「声明与拒绝收紧、零新键」——「声明与实现同波」围栏结构性满足,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 关掉的假教学通道不因本项重开。 - 放行 Card S(spec 收紧实施卡,条款② yes,达档 + 复审链)与 Card R(objectui 对齐 + pin,
Blocked-by:Card S);D1–D8 设计定案照提案。F3(className as-any 消费)另立 finding;F2 留教材卡。
席位边界(裁不派):录裁 +
pm:queue(标签已转);Card S/R 由 spec 席立案派发。裁决入本场追认摘要表。
Generated by Claude Code
- 前提修正采信:wizard view 已端到端存在(spec 枚举
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:queuestripped at close;domain:specstays.
Generated by Claude Code
- added a commit that references this issue
on Oct 7, 2026
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)
FormSectionConfigsplit: WizardForm's side deliberately has NO predicate slot — if the first-class shape introduces step-level visibility, it must RECONCILE with that ruling, not bypass it.check:skill-examplesreads onlyts/tsxfences, and only opt-in, so every metadata example incontent/docs/**is unverifiable by construction #13086) was just closed and must not reopen. The proposal must state the two-wave landing plan (spec half + objectui render half withBlocked-by:, never co-batched).check:skill-examplesreads onlyts/tsxfences, and only opt-in, so every metadata example incontent/docs/**is unverifiable by construction #13086 pins it).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.