Skip to content

R26 集成批 5:网页/交付物文案修复批 + 桌面端 MCP 设置分区 + 成本页任务编号 + 三件小活 - #29

Merged
mycyg merged 22 commits into
mainfrom
r26/integration-8
Sep 5, 2026
Merged

mycyg merged 22 commits into
mainfrom
r26/integration-8

Conversation

@mycyg

@mycyg mycyg commented Sep 5, 2026

Copy link
Copy Markdown
Owner

R26 集成批 5:网页/共享 UI/服务端页面/交付物模板文案修复批(F2)+ 桌面端 MCP 服务器设置分区(M7)+ 成本页任务编号接线 + 三件小活(W-Z)+ 审查依据归档。

一、网页端 / 共享 UI / 服务端页面 / 交付物模板文案修复批(r26/f2-web-copy-fix,9 commits)

  • 审查清单 96 条:改 93 条、部分改 3 条(设置页系统诊断分区权限门是产品决定;成本页任务编号由本 PR 的路由接线补齐;agent-runner 的品牌名 WorkHub AI 保留,UI 本就不读它)。
  • 四条系统性裂缝全部收口:路由非就绪态与右栏「数据源 / 实时数据」这类界面自述删除或改成对用户有用的一句;裸 uuid / 枚举 / 动作名 / sha256 不再透到界面(按人用昵称、审计行只说对象类型、处理方式改人话、指纹移到 data-*);「AI 融合正式稿」只剩标题与合并后的正文,Proposal ID / 冲突 key / 融合理由 / JSON 围栏全部移出,兜底文件名用变更申请标题;提示词与技能合同不再规定英文自述形状(blocker / [sandbox: …] / 「完成了:」),与下游 isModelSelfNarration() 口径一致。
  • 词表 13 组收口并落 glossary-dejargon.md §11(任务 / AI 小组 / 还原点 / 自主率 / 邀请码 / 生成任务 / 关联 / 指派审批人 / 开始执行 / AI 复核 / 全托管 / 只能人来做;计费 token 不进用户面只说钱)。
  • 新增 9 份词典文件(*-copy.ts / locales.ts),带插值文案走 {name} 占位符。两份棘轮基线只减不加。

二、桌面端「MCP 服务器」设置分区(r26/m7-desktop-mcp-settings,4 commits)

  • 长在「插件」分区之下:清单四态(已停用 / 已连接 · N 个工具 / 已连接(空闲)/ 连不上,last_error 走产品句在前、诊断在括号);九字段添加表单(名字带 mcp__<名字>__… 预览、密钥引用只从服务端变量名下拉);启用 / 停用 / 测试连接(单段)/ 改信任级别(放宽才两段)/ 改超时(离开字段即保存)/ 移除(两段)。九条体检码逐条有人话,npx 类启动器被拦时引导「先在这台机器上装好,再填装好之后的路径」。
  • 风险词说两次:表单常驻通则(叫 finance / publish 的服务器全部工具无差别转人)+ 回执按 risk_tokens 回显;插件分区同步补了同一句(插件工具 id 整体参与人工保留门分词)。
  • 68 个新文案 key 全进 spotlight/views/locales.ts;1751 桌面测试;可证伪性三条回归各自能红。真机未验(浏览器预览没有 Tauri 运行时)。

三、成本页「按任务分账」显示任务编号 · 标题(bd32e48f)

  • 仓储加 listWorkItemLabelsByIds(工作区围栏、一次 IN 查询、空清单不发查询);路由照 taskPlanMeta / objectiveTitles 同款:仅管理员取、失败静默降级,页面层回落「未命名任务」。路由级测试钉住:管理员看到「PROJ-001 · 标题」而不是 uuid;取数失败仍 200。

四、三件小活(r26/z-small-fixes,4 commits)

  • qa:r1-pg-smoke 同库复跑假红是三个坑叠着:并发探针种子被上次的偏好覆盖(且 mergeUpsert 有「新旧同值即放行」快路径,把现存值当 base 会让 CAS 失效);主线工单交付物路径写死撞上上次的正式版;崩溃模拟后败者重入队的预留从未释放顶满 team/day cap。一次性容器三连跑 exit 0,插件门同库再跑一次 exit 0。
  • 删除桌面死码 createDesktopCuuDemoScript 及只为它存在的三个辅助。
  • 命令面板 18 个命令的 label/hint(36 条)搬进 command-palette/locales.tskeywords 搜索词按既有注释保留原地;新旧注册表逐字段深比较字节级未变。

五、审查依据归档

reports/r25-侦察-2026-09-05/C1-桌面端与Cuu文案审查.mdC2-网页与交付物文案审查.mdT-测试脆性分析.md

expected 基线 diff 摘要(pnpm gen:expected 幂等)

  • F2:4 份变——agent-run-system-prompt.worker/.fullagent-run-request.loop/.loop2,全部集中在工作纪律第 2/3/4/7 行(不再要求英文 blocker、总结模板「完成了:」→「做出来的:」、明写不把 [sandbox: …] 原文抄进总结)。其余零变化。

验证

  • pnpm -r typecheck 全 Done;ui / web / web-runtime / api / tools / agent / desktop-webview / cuu / db / contracts / api-client / mcp-client / plugin-host / audit / scripts 全过(数字见 CI)。
  • audit 九道全过;qa:plugin-smoke / qa:mcp-smoke 通过;棘轮基线:文案 locale 3670→2808,禁词 62→49(只减不加)。

🤖 Generated with Claude Code

mycyg and others added 22 commits September 6, 2026 00:02
- 路由态五种状态的中英文案改成对用户有用的一句话(en 侧原文是设计规格自述)
- 错误卡没有 traceId 时不再兜底渲内部轮次代号,整条 footer 不渲染
- 枚举缺人话映射时回落到该维度中性词并登记,由 i18n.test.ts 断言缺映射为空
- 结构化字段详情:合并处理方式走人话映射、去掉 JS 值类型药丸、还原点 id 改为「可还原到改动前」
- 回放页去掉结果指纹可见文案(值留 data 属性)、批量结果不再直出枚举
- 冲突卡去掉两串内容指纹(同卡正文写的正是「不用看技术细节」)
- 登录/邀请屏去掉「实例 / 局域网信任模式 / 令牌 / 只存哈希」等部署与实现词
- 快照→还原点、军团→AI 小组、工作项→任务,权威用词表补进 glossary §11
- 触碰到的五份非词典文件的文案整体搬进词典文件,ui-i18n 基线净减 145 条

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- 右栏「数据源 / 实时数据 / 数据以后台为准」区块整块删除;已入库未渲染的 masthead.* 自我解说组一并删
- 设置页四条(分层决策 / shared contracts / client layer / 路线图)改成用户能用上的一句话
- 成本页预算状态兜底不再直出 ok;三处空态改用已有的空态文案而不是枚举
- 军团/智能代理军团/指挥台 统一为「AI 小组」,页面标题与导航标签逐条对齐
- 试点项目→默认项目、选项优先/option-first、AI-first、trace、hunks、第 5 档、令牌 等内部词清理
- 审计行/成本分组/依赖 pill 不再把 uuid 前 8 位当编号,取不到人话就省略该行
- 技能卡不再渲染 AI 精修时写给自己的 rationale_md
- 「本页/此页/项目主页摘要展示…」自指措辞改成信息本身
- 三份内联词典搬进 *-copy.ts,带插值的文案改走 routeTf 占位符;ui-i18n 基线净减 416 条

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- 已物化→已生成任务、挂链→关联、自治率→自主率、快照→还原点、军团→AI 小组
- 「失焦/注入/后端/密码登录模式/昵称模式/缓存文本预览/路由给对方」改成用户能读懂的话
- 搜索页与知识页 masthead 去掉「运行时: 实时数据」这条开发期非假数据标记
- surfaceLabel(值为内部轮次代号)改为可选,网页外壳不再传
- 「暂停派发/恢复派发」与洗词层的「派发→开始执行」统一成同一种说法
- 开工提示不再写内部实体名 Proposal / Replay
- 触碰到的文案搬进词典文件(routes-copy / notice-copy / web locales 占位符),基线净减 95 条

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- 成本页「按人花费」用昵称(取不到说「已停用成员」)、工作项行不再把 uuid 当业务编号
- 回放页证据标题按动作查表出人话,不再是「proposal.merge audit」
- 计划物化失败不再写「judge 漏网 / 成环 / 物化」,AI 计划解析原文降级到 detail 字段
- 「并发在飞 / 租约 / 心跳超时 / 预算预留服务 / UTF-8 / 三方合并 base / dry-run / 分支 / PR 式」全改人话
- 升级说明去掉 agent 第一人称自述与「工具调用」实现动作
- 审批「最近已处理」署名用昵称,取不到说「其他成员」
- 预算卡说钱与百分比,不再说「令牌」(该词已被邀请码占用)
- AI 复核:内部产出的英文 reasons/summary 在源头写成中文,洗词表只保留模型可能回抄的 12 条并逐条加测试
- 采纳的候选按标题渲染,不再写内部候选 id;审阅署名改为「AI 复核」
- 金路径示例页不再把 Cuu 机械替成英文 "AI assistant",示例验收项换成业务口径
- 触碰到的文案搬进 services/locales.ts 与两份 *-copy.ts;ui-i18n 基线净减 121 条、禁词基线净减 4 条

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- AI 融合稿落网盘的文件只写合并后的正文(标题=变更申请标题),id/冲突 key/选择方案/AI 融合理由/JSON 围栏全部移出正文
- 该文件的兜底文件名改用变更申请标题,不再带 change_id 与 "ai-fusion" 代号
- 工作纪律不再要求模型在用户可见总结里写英文 blocker,也不许把 [sandbox: …] 原文抄进总结
- 三行总结模板首词由「完成了:」改成「做出来的:」,与下游 isModelSelfNarration 过滤器口径一致
- 技能合同:「沙箱内未实测网络部分」→「网络部分未实际验证」;「未尽事项与建议」→「待确认与下一步」
- 沙箱拒绝说明同步去 blocker
- 模型可见提示词按既有约定加 ui-i18n-allow(不是界面文案)
- pnpm gen:expected 重生成 4 份基线,只有上述四条纪律行变化,二次运行幂等

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
MCP(模型上下文协议)服务器分区要用的中英文案一次落进 spotlight/views/locales.ts:
清单三种状态、启动前检查的九个稳定错误码、添加表单的字段说明与首次引导、
密钥引用只选变量名的提示。带值的句子留 {占位符},值在渲染层填,词典条目保持纯字符串
以维持 `satisfies Record<keyof typeof zh, string>` 那条编译期对齐。

同批补 pluginNameRiskNote:词表分类先于风险分级这条纪律对插件同样成立——插件工具 id 是
`plugin__<插件名>__<工具名>`,人工保留门对整个 id 分词,所以一个叫 finance / publish 的插件
它的每个工具都会每次转人,与信任级别无关。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
新增 spotlight/views/settings-mcp.ts:清单行(状态 / 原因 / 信任级别 / 命令 / 工具预览 /
单次调用超时)、添加表单(名字 · 显示名 · 命令 · 参数 · 环境变量 · 密钥引用 · 工作目录 ·
信任级别 · 超时)与添加结果卡,全部是纯函数,30 条单测直接对着它们写而不是从整份
innerHTML 里捞正则。

三处刻意的判断:
- 状态与连接分开说。空闲回收把子进程收掉之后 live=false 而 status 仍是 connected,
  那不是矛盾(下次用到会重新握手);挤进一句话就只能在「刚回收过」和「连不上」之间说错话。
- 连不上时产品文案在前、服务端诊断只作为括号里的次级信息(withErrorDetail 的既有口径),
  不把一句英文诊断直接当结论渲上去。
- 工具名前缀预览的三个常量与 @workhub/mcp-client 逐字对齐但不 import 那个包:它不是本应用的
  依赖,且 names.ts 顶层引了 node:crypto,进浏览器包会在打包期就炸。单测把三个常量钉死。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
在「插件」分区之下并列长出「MCP 服务器」分区,六个动作逐条接到 M3 的端点:
清单 GET /api/mcp-servers、添加 POST /api/mcp-servers、启用 / 停用
POST /api/mcp-servers/:id/{enable,disable}、测试连接 POST /api/mcp-servers/:id/reload、
改信任级别与超时 PATCH /api/mcp-servers/:id、移除 DELETE /api/mcp-servers/:id。

几处判断:
- 管理员门借 vm.plugins !== undefined(服务端只给管理员填那个字段,而 MCP 端点整条也是
  管理员门),不猜身份、也不靠一次注定 403 的请求闪一下。非管理员连清单都不去拉。
- 测试连接是单段——它不改任何配置;连不上时端点仍回 200,那是一条结论而不是一次失败的请求,
  所以这条成功路径也可能渲出「连不上」,且不弹错误提示。
- 启停 / 移除两段确认;改信任级别只有「往下放宽到只读断言」要确认,收紧是把门装回去不再拦。
- 每个写动作的回执都整行替换本地那一行:启停之后的状态可能是 connect_failed,本地猜不出来。
  停用的回执没有连接快照,那一份也一并丢掉,免得「已停用」旁边还挂着上一次的工具清单。
- 添加表单先在本地拦三种一定会被 422 的填法(名字/命令为空、环境变量行读不了、超时越界),
  其余交给服务端的启动前检查;被拒时按稳定错误码出人话,不解析英文诊断。
- 密钥引用只从 available_secret_refs 下拉选变量名,两边都只是名字,值从不经过这一层。

插件分区同步补上「名字里的词先于信任级别参与风险判定」这一句(同一条纪律的两面)。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
记下分区结构、六个动作各走哪条端点、与插件分区共用的部分,以及两条要交给后续工包的东西:
① 契约缺 last_error_code(会话失败的稳定码没有字段带到客户端,桌面端因此给不出按码写的
「握手超时」那句人话);② 管理员门现在是借 vm.plugins 的,M8 给 settings VM 加上 mcp_servers
之后应当换回去。另附真机未验的五条走查清单。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- 审计动作/对象标签、健康页信号、搜索页说明、日程右栏等剩余「事项/工单」统一为「任务」
- 回放空态、还原点标题、审计里的「文件快照」统一为「还原点」
- 两份审计标签词典搬进 route-components-copy.ts,五条服务层消息搬进 services/locales.ts

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
全仓 grep 确认只有它自己的测试引用;连同只为它存在的私有辅助
selectDemoEvents/desktopShellPayloadFromWorkHubEvent/streamFromTopic、
本地类型别名 GoldPathEvent 及因此闲置的 GoldPathSurfaceVM 类型导入一并清理,
避免只删导出函数把辅助变成新的死码。ui-i18n 基线随之缩小一条
(demo 脚本里唯一的中文字面量"连接不太稳,Cuu 正在重连。"不再出现)。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
command-palette.ts 里 18 条命令、36 处 { "zh-CN": …, en: … } 内联展示文案
(label/hint)违反「用户可见文案由 locale 独占」门禁,搬进新建的
command-palette/locales.ts:zh/en 两个对象都 satisfies Record<CommandId, …>
直接绑定既有的 CommandId 联合,新增/删除命令忘了同步词典会编译不过。
调用点用 ...commandPaletteCopy(id) 展开取代原来的两行内联字面量;keywords
搜索词数组(60 处含汉字的中文搜索词)按 F1 注释保留原地,不是展示文案。

已用脚本对新旧 commandRegistry 输出做逐字段深比较(label/hint/keywords/
icon/action),确认渲染结果字节级未变;command-palette.test.ts 断言不变
仍然全绿。ui-i18n 基线该文件存量 96→60。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
三处非幂等种子叠在一起,CI 每次新容器从没暴露,本机反复跑必撞:

- 并发探针 r9-concurrency-probe 的种子步骤写死初始值,复跑时这行已被
  上次跑的并发候选值覆盖,无 base 的 mergeUpsert 落进 conflict 分支即误判失败。
  改为按返回状态分流:conflict 时用一次不参与并发的 mergeUpsert 把现存值
  转回固定初始值(这一步没有并发对手,CAS 必赢),再让下面的并发断言原样验证
  「同 base 并发写恰好一个赢家」,不放宽断言本身。
- 主线工单的 outputs/result.md 交付物路径写死,而它挂在的默认项目
  (defaultSeedFixture.projects)跨进程持久存在;复跑时全新工单的首次合并
  撞上上次跑留下的同路径正式版,触发未预期的 409。改为每次进程启动一份
  随机后缀的交付物路径,天然不跟历史撞车。
- R2 原子预算并发 deny 门收尾用 releaseExpired 模拟胜者崩溃释放、让败者
  重新入队,但重新入队造出的 run 从未被释放,遗留的 active 预留把 team/day
  cap 顶满;复跑时两个全新并发入队因此双双 402。补上 queue.abort 释放这个
  收尾 run 的预留,做法与脚本前面 B-R9.0-2 释放升级重试 run 同源。

本机起一次性 Docker 容器验证:连跑 3 次 qa:r1-pg-smoke 全部 exit 0(含首次
干净库),随后 qa:r1-pg-plugin-smoke 复用同一个库同一份 env 再跑一次同样
exit 0。CI「每次新容器」路径不受影响,三处修复均在该路径上验证过原样通过。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
# Conflicts:
#	scripts/dev/copy-terms-baseline.json
- 仓储加 listWorkItemLabelsByIds(工作区围栏、一次 IN 查询、空清单不发查询)
- 路由照 taskPlanMeta/objectiveTitles 同款:仅管理员取、失败静默降级,不拖垮成本页
- 路由级测试:管理员看到「PROJ-001 · 标题」而不是 uuid;取数失败仍 200 且回落「未命名任务」

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@mycyg
mycyg merged commit 8034b24 into main Sep 5, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant