S0 · 图例
全篇统一约定:灰块=真实会渲染的 UI 元素;虚线框=disabled/coming-soon(明确可见,不是死链);下列色标标注每个字段的可写性层级。
本轮字段表:FIELDS.md,19 行,与本页 S3 的四个分组一一对应。
S1 · 设置面板条目化外壳
左条目列表 + 右详情。今天「⚙ 设置」是平铺卡片流(SettingsPanel.tsx),本轮把它改成条目化外壳,Agents 是本轮唯一新增且激活的条目。
WorkbenchApp.tsx:690 左侧
rail 的独立入口(不在设置里),不是本轮新增;把它收进这个壳会改变现有导航行为,
超出本轮范围,所以标注为「已存在,是否收编待定」而不是直接假定合并。
「Runners」「外观」「关于」目前没有任何 UI 落点,标 coming-soon 是诚实占位,
不是死链——用户能看出「这块以后会有,现在还没做」,而不是以为点错了。
S2 · Agents 看板列表
11 个 agent,按 kind 分三组:role-agent(工程协作角色,7 个)/ conversational-agent(对话席位,2 个)/ domain-agent(个人域助理,2 个)。
S3 · 单 agent 详情(示例:design-agent)
字段按第三节四个分组归位。本例选 design-agent(本 agent 自己的角色)做示范,因为它的 permissions/allowed_scripts/forbidden_actions/output_contract 四个都有值,适合演示「角色卡内容」分组的完整形态;缺字段态另见 S7。
agents/design-agent/CLAUDE.md / AGENTS.md,两文件字节相同,见 S5)
L1→L2 只读
S4 · 默认引擎选择器
F1 选定方案 (c):allowed_runners 缺失时显示「未声明」并禁用选择器,而不是猜测「全部可选」或「锁定成 default_runner」。理由见 DESIGN-NOTES.md。
agent.default_runner 与
session.default_runner_id 是两层不同的东西(agent 级只读默认 vs
会话级可编辑覆盖),历史上已经被搞混过一次并发明过不存在的 runner_locked
字段(design/mockups/wb-redesign/app.js:310)。并列显示 + 不同的可写性
色标(灰=只读 L1,蓝=可编辑 L3)是防止重犯的最直接办法。
S5 · 角色卡区:role → 生成角色卡
F3:CLAUDE.md 与 AGENTS.md 今天不可能不一致(wb-materialize-agents.mjs 把同一渲染结果写进两个文件名,cc-test-agent-homes.mjs 断言字节相等)。不设计成两个页签,设计成一条关系链。
两份文件只是给两个 runner 各自的原生文件名读,不是两份可分别配置的内容 —— 界面上只展示一份「角色卡」文本,旁边注明"Claude Code 与 Codex 读到的是同一份"。
S6 · L1 不可写这件事怎么呈现
选定处理方式:只读 + 说明 + 明确标注「需新增写入通道」的具体位置(不是默默隐藏,也不是假装能编辑)。
registry/agents/<id>.yaml 再跑
npm run wb:agents:materialize。Web 端目前只有 GET /system/registry,
没有对应的 PATCH/POST 端点。
为什么不做成"假装可编辑但保存无效":design-agent 角色契约的强制字段落地规则 (2026-07-23 用户规则)要求"从不把不存在的能力伪装成真的"——一个点了没反应或悄悄 丢弃的保存按钮,比一个诚实的 disabled 按钮更容易误导用户以为"调整"已经生效。
S7 · 缺字段态(示例:chat-agent)
chat-agent 没有 default_project / default_worker / allowed_scripts / forbidden_actions / aliases / playbooks。统一用「—(未声明)」占位显示整行,不隐藏整行——隐藏会让用户误以为"这个字段这个产品概念里不存在",而不是"这个 agent 没填"。
S8 · 键盘可达 Tab 遍历顺序
编号对应上文 1314 等蓝色圆形标注。整个面板遍历顺序如下:
| # | 元素 | 行为 |
|---|---|---|
| 1 | 左侧 rail「Connectors」按钮 | 打开 Connectors 独立 surface(今天已有,非本轮范围) |
| 2 | 左侧 rail「⚙ 设置」按钮 | 打开设置面板(S1) |
| 3 | 设置左侧条目「Agents」 | 激活,Enter 展开右侧 S2 列表 |
| 4–7 | 「Connectors/Runners/外观/关于」条目(disabled) | 可 focus,Enter/Space 不跳转,仅 aria-live 播报「即将推出」/「已存在于顶层,是否收编待定」 |
| 8–14 | role-agent 分组 7 张卡片(design → dev → devops → orchestrator → product-research → qa → tech-lead) | Enter 打开 S3 详情 |
| 15–16 | conversational-agent 分组 2 张卡片(chat → web-chat) | 同上 |
| 17–18 | domain-agent 分组 2 张卡片(career → opendesign) | 同上 |
| 19 | 详情头部「返回列表」 | 回到 S2;Esc 等效 |
| 20… | 详情内四个分组按 DOM 顺序(身份 → 运行配置 → 角色卡内容 → 非角色卡字段)逐行 focus 到唯一的真实交互控件 | 只读字段本身不是 tab stop,只有下面两项是 |
| 13*(运行配置分组内) | 13 session.default_runner_id 下拉 | 唯一的可编辑控件;disabled 态(S4 情形 B)仍可 focus 但 Enter 无效并播报原因 |
| 14*(角色卡内容分组内) | 14「编辑角色卡」按钮(disabled) | Enter 弹出「需新增写入通道」提示,不跳转、不假装保存 |
标 * 的两行是详情页内部顺序,编号沿用 S3/S4 里已经标出的蓝色徽标,不与顶层 1–19 冲突。