S0 · 图例

全篇统一约定:灰块=真实会渲染的 UI 元素;虚线框=disabled/coming-soon(明确可见,不是死链);下列色标标注每个字段的可写性层级。

L1 registry yaml L2 角色卡(CLAUDE.md/AGENTS.md,L1 生成物) L3 session 覆盖 L4 全局设置(ui-prefs/model-settings)
只读 可编辑(真实写入通道) disabled(看得见但今天不能点)

本轮字段表:FIELDS.md,19 行,与本页 S3 的四个分组一一对应。

S1 · 设置面板条目化外壳

左条目列表 + 右详情。今天「⚙ 设置」是平铺卡片流(SettingsPanel.tsx),本轮把它改成条目化外壳,Agents 是本轮唯一新增且激活的条目。

Agents
Connectors 已存在于顶层,是否收编待定
Runners 即将推出
外观 即将推出
关于 即将推出
右侧详情区 → 见 S2(Agents 看板列表)
Agents 看板列表渲染在这里,见 S2
为什么这样切分:「Connectors」今天已经是 WorkbenchApp.tsx:690 左侧 rail 的独立入口(不在设置里),不是本轮新增;把它收进这个壳会改变现有导航行为, 超出本轮范围,所以标注为「已存在,是否收编待定」而不是直接假定合并。 「Runners」「外观」「关于」目前没有任何 UI 落点,标 coming-soon 是诚实占位, 不是死链——用户能看出「这块以后会有,现在还没做」,而不是以为点错了。

S2 · Agents 看板列表

11 个 agent,按 kind 分三组:role-agent(工程协作角色,7 个)/ conversational-agent(对话席位,2 个)/ domain-agent(个人域助理,2 个)。

role-agent · 7 工程协作角色
Design Agent
design-agent
runnerclaude-code
workspace_modeworktree
Development Agent
dev-agent
runnercodex-cli
workspace_modeworktree
DevOps Agent
devops-agent
runnercodex-cli
workspace_modeworktree
Orchestrator Agent
orchestrator-agent
runnerclaude-code
workspace_modehome
Product Research Agent
product-research-agent
runnerclaude-code
workspace_modehome
QA Agent
qa-agent
runnercodex-cli
workspace_modehome
Tech Lead Agent
tech-lead-agent
runnercodex-cli
workspace_modeworktree
conversational-agent · 2 对话席位
Chat Agent
chat-agent
runnerclaude-code
workspace_modehome
Web Chat Agent
web-chat-agent
runnerclaude-code
workspace_modehome
domain-agent · 2 个人域助理
个人求职助理
career-agent
runnerclaude-code
workspace_modeworktree
OpenDesign Agent
opendesign-agent
runnerclaude-code
workspace_modeworktree
为什么按 kind 分组而不是一个 11 卡片的平铺网格:三类语义不同——role-agent 走 round contract、改产品代码、住在 worktree;conversational-agent 是用户日常 打开就聊的入口;domain-agent 是长期个人事务助理。混排只靠徽标区分,在 11 张卡片 规模下扫描成本很高;分组标题本身就是信息(用户一眼能看出"这是工程流水线的角色" 还是"这是我平时聊天的对象")。徽标仍然保留在卡片上(belt & suspenders), 不单独依赖分组标题。

S3 · 单 agent 详情(示例:design-agent)

字段按第三节四个分组归位。本例选 design-agent(本 agent 自己的角色)做示范,因为它的 permissions/allowed_scripts/forbidden_actions/output_contract 四个都有值,适合演示「角色卡内容」分组的完整形态;缺字段态另见 S7。

Design Agent role-agent
design-agent · 你的设计把关人,让每个界面都顺眼又好用。
身份
iddesign-agentL1 只读
nameDesign AgentL1 只读
description你的设计把关人,让每个界面都顺眼又好用。L1 只读
kindrole-agentL1 只读
aliases(无别名)L1 只读
运行配置
default_runnerclaude-codeL1 只读
runtime_policyprefer_mac_workerL1 只读
workspace_modeworktreeL1 只读
default_projectpersonal-workbenchL1 只读
default_workermac-workerL1 只读
allowed_runners未声明 → 见 S4/S6选择器禁用
默认引擎选择器→ 展开见 S4(agent.default_runner 只读 + session.default_runner_id 可编辑并列)
角色卡内容(= L2 角色卡的 5 个渲染字段;name/id 已在「身份」分组显示,不重复)
role Owns the Workbench design system: authors and maintains design/DESIGN.md and design/tokens.css… (完整原文见生成的 agents/design-agent/CLAUDE.md / AGENTS.md,两文件字节相同,见 S5) L1→L2 只读
permissions local_change: design_dir_and_docs_only deploy: forbidden external_write: forbidden L1→L2 只读
allowed_scripts npm run cc:test:* · npm run cc:qa · npm run cc:verify · npm run cc:design:preview L1→L2 只读
forbidden_actions modify_product_code · deploy · bypass_permissions · destructive_git · read_secrets · mark_user_acceptance L1→L2 只读
output_contract design_spec_or_review · token_changes · open_questions · annotation_layer_preserved · browser_selfcheck_evidence L1→L2 只读
编辑角色卡 禁用:今天没有从 Web 写回 registry yaml 的通道,见 S6 disabled 14
非角色卡字段
memory_scopes.readprojects · agents/design-agentL1 只读
memory_scopes.writeagents/design-agentL1 只读
playbooksdocs/agent-playbooks/workspace-orchestrator.mdL1 只读

S4 · 默认引擎选择器

F1 选定方案 (c):allowed_runners 缺失时显示「未声明」并禁用选择器,而不是猜测「全部可选」或「锁定成 default_runner」。理由见 DESIGN-NOTES.md。

情形 A · orchestrator-agent(唯一声明了 allowed_runners 的 agent)
agent.default_runner(只读,agent 级默认)
claude-codeL1
候选来源allowed_runners: [claude-code, codex-cli]L1
session.default_runner_id(可编辑,本会话覆盖)
13下拉 [ claude-code ▾ ] 候选项 = claude-code / codex-cli(来自 allowed_runners,已排除 kimi-cli:status=planned) L3 可编辑
未设置时显示"沿用 agent 默认(claude-code)"
情形 B · design-agent(10/11 之一,没有 allowed_runners)
agent.default_runner(只读)
claude-codeL1
session.default_runner_id(本应可编辑,但候选源缺失)
下拉 [ 未声明 — 选择器已禁用 ▾ ] disabled
提示文案"这个 agent 没有声明 allowed_runners,需要先在 registry 补齐才能提供切换。"
解析顺序(不显示为字段,作为选择器旁的说明文案,来自 IdentityBar.tsx:55-61)
native_session_runner_id(已绑定原生会话,一旦绑定不可再改,见长期约束 C1) → session.default_runner_id(本会话覆盖) → agent.default_runner(agent 级默认) → 全局默认(DEFAULT_SESSION_RUNNER_ID)
为什么两者要并列而不是二选一显示:agent.default_runnersession.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 断言字节相等)。不设计成两个页签,设计成一条关系链。

只读态(今天)
registry yaml 的 role 字段 ──(wb:agents:materialize)──▶ 生成角色卡(同一份内容) ──▶ agents/<id>/CLAUDE.md agents/<id>/AGENTS.md

两份文件只是给两个 runner 各自的原生文件名读,不是两份可分别配置的内容 —— 界面上只展示一份「角色卡」文本,旁边注明"Claude Code 与 Codex 读到的是同一份"。

编辑态(今天没有写入通道,见 S6)
[ 角色卡文本框 — disabled,占位「需先新增 registry 写入端点才能在此编辑」]

S6 · L1 不可写这件事怎么呈现

选定处理方式:只读 + 说明 + 明确标注「需新增写入通道」的具体位置(不是默默隐藏,也不是假装能编辑)。

⚠ 这个字段今天只能在 Mac 上手改 registry/agents/<id>.yaml 再跑 npm run wb:agents:materialize。Web 端目前只有 GET /system/registry, 没有对应的 PATCH/POST 端点。
为什么不做成「隐藏只读字段,看起来像还没做」:用户明确说过要「调整默认引擎、 Agent md」,如果界面对这些字段完全沉默,用户会以为这个能力还没被理解、还没被设计, 从而重复提需求。显式标注"今天只读 + 差的是哪个写入通道",能让下一轮(写入通道 立项)有明确、可核验的起点,而不是含糊的"以后再做"。
为什么不做成"假装可编辑但保存无效":design-agent 角色契约的强制字段落地规则 (2026-07-23 用户规则)要求"从不把不存在的能力伪装成真的"——一个点了没反应或悄悄 丢弃的保存按钮,比一个诚实的 disabled 按钮更容易误导用户以为"调整"已经生效。

S7 · 缺字段态(示例:chat-agent)

chat-agent 没有 default_project / default_worker / allowed_scripts / forbidden_actions / aliases / playbooks。统一用「—(未声明)」占位显示整行,不隐藏整行——隐藏会让用户误以为"这个字段这个产品概念里不存在",而不是"这个 agent 没填"。

Chat Agent conversational-agent
chat-agent · 你的日常对话搭子,问它、聊它,它还会帮你记事。
身份
aliases(无别名)L1
运行配置
default_runnerclaude-codeL1
runtime_policyprefer_mac_workerL1
workspace_modehomeL1
default_project—(未声明)L1
default_worker—(未声明)L1
角色卡内容
permissions read_memory: auto write_memory_candidate: auto local_change: approval_required external_write: approval_required L1→L2
allowed_scripts(无)L1→L2
forbidden_actions(无)L1→L2
output_contractfinal_answer · events · memory_candidatesL1→L2
非角色卡字段
memory_scopes.readpersonal · projects · agents/chat-agentL1
memory_scopes.writeagents/chat-agentL1
playbooks—(未声明)L1

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–14role-agent 分组 7 张卡片(design → dev → devops → orchestrator → product-research → qa → tech-lead)Enter 打开 S3 详情
15–16conversational-agent 分组 2 张卡片(chat → web-chat)同上
17–18domain-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 冲突。