项目曾用名 NovaCode,2026-09-29 起更名 RainCode(ADR-07);本文件 §3/§4 历史日志与 docs/benchmarks/ 历史基准报告中保留的旧名均为当时事实记录,不作回改。
本文件是开发进度的唯一事实来源(Single Source of Truth)。 项目中断后恢复开发时,第一步读本文件,第二步读
docs/07-dev-plan.md中当前里程碑的任务分解表,然后从「下一步队列」取第一个未完成任务继续。更新协议:每完成一个任务、解决一个问题、做出一个方向性决策,必须立即更新本文件(不等攒批)。规则见 §6。
| 项目 | 值 |
|---|---|
| 当前里程碑 | M6 执行中 🚧(07-dev-plan §12「生态分发与治理收线」:T6.1 插件 marketplace 分发基座 ✅ / T6.2 会话录制回放测试 lane ✅ 2026-10-07;T6.3 |
| 已完成任务 | M1 全量 ✅ · M2 全量(T2.1 |
| 最新提交 | 见 git log -1 |
| 工作区状态 | clean(.trae/ spec 文档为工作区过程资产,不入库) |
| 门禁状态 | typecheck ✅(14 项目全绿)/ oxlint ✅(0 error,11 warning 旧存留——全部位于非本轮文件)/ architecture:check ✅(342 文件 0 违规,maxFileLines 500)/ protocol:check ✅(62 方法 21 事件一致;T6.1 新增 marketplace 域 4 方法 + 错误码族段 15 四码,协议 v1.14 additive;T6.2 协议零变更)+ event-matrix:check ✅(25 事件 = 协议 21 + 存储级 4,一致,双生成物门禁绿)/ 单测 506 ✅(T6.2 回放 lane +3:storage replay-lane.test.ts 3(fixture 全集独立验证 / DB 级两次 resume 收敛+对账回写 / 崩溃种子残尾修复+悬挂合成))(T6.1 +4:server marketplace.test.ts 3 + agent-core skill 第三源优先级 1)(T5.7 +1 base64 契约保真(SshExecutor 拆分 executor-ssh.test.ts 护 500 行门禁)+ 门禁升级轮 +9 cli 构建管线纯函数 pinned-manager 4 + bundle-metafile-check 5)/ smoke:p0 16 子冒烟 ✅ + smoke:plugin ✅ + smoke:marketplace ✅(T6.1 三用例:分发全链/逃逸防护/卸载复原)/ smoke:bundle ✅(CLI esbuild 产物 8 断言:命令集 + 协议握手 + tools.list 14 工具 + session.create 迁移自举)/ NFR 抽查 ✅(NFR-1 768.9ms ≤2s / NFR-2 P95 4.4ms ≤300ms / NFR-7 PASS) · CI ✅(GitHub Actions windows-latest 与本地同集;T5.7 门禁升级轮双 job 形态——gates 前置 pinned 校验 preflight + cli-bundle 独立 job build:cli → smoke:bundle) |
| 快照日期 | 2026-10-07 |
| 里程碑 | 优先级 | 目标 | 状态 |
|---|---|---|---|
| Phase 1 设计 | — | 7 份产品/技术设计文档 | ✅ 完成(2026-09-28) |
| M1 | P0 | 单进程 CLI 打通日常可用闭环 | ✅ 完成(2026-09-28) |
| M2 | P1 | 能力补全 + 桌面端 Alpha | ✅ 完成(2026-09-29,场景 5 走查已自动化闭环) |
| M3 | P2 | 七模块全量对齐 | ✅ 完成(2026-10-03,T3.1~T3.9 + NFR 全量重测 + 4.2 矩阵核对;环境不可得人工项见 m3 报告 §8) |
| M4 | —(增补) | 工程加固与遗留收口(CI 落地 / 内核收尾竞态 / 生成式协议目录 / 技能模型侧可发现性 / Web 管理面板 / 防御式模式文档 / 遗留收口两批次 / 可视化缺陷修复批次) | ✅ 完成(2026-10-04,T4.1~T4.9;验收核对见 docs/benchmarks/m4-2026-10-04.md §7;L-01/L-14 环境门控保留口径) |
| M5 | —(增补) | 扩展机制与上下文治理(hooks 生命周期 v1 / 沙箱 enforcement 上报 / 记忆与历史检索增强 / compact 预剪枝 / config dump+事件矩阵 / MCP 工具目录化 / 工程收尾+遗留批次 C) | ✅ 完成(2026-10-04 起 ~ 2026-10-06,07-dev-plan §11:T5.1 hooks v1 ✅ 2026-10-04;T5.2 enforcement ✅ / T5.3 记忆与历史检索 ✅ / T5.4 compact 预剪枝 ✅ / T5.5 可观测性 ✅ 2026-10-05(门槛 T5.1~T5.5 全部达成);T5.6 MCP 工具目录化 ✅ 2026-10-06(协议零变更,58 方法/21 事件);T5.7 工程收尾 ✅ 2026-10-06(L-16 核销 + T4.8 SSH 残差核销 + CI 门禁升级);L-01/L-14 环境门控保留口径复查申报;参照三仓调研 docs/research/2026-10-04-m5-reference-repos.md,01-PRD v1.1 已登记) |
| M6 | —(增补) | 生态分发与治理收线(插件 marketplace 分发基座 / 会话录制回放测试 lane / spill 溢出家族 / session.delete 物理删除 / Goal judge MVP / 工程收尾+遗留批次 D) | 🚧 执行中(T6.1 插件 marketplace 分发基座 ✅ / T6.2 会话录制回放测试 lane ✅ 2026-10-07;T6.3~T6.6 排队;07-dev-plan §12:共 13 人日,裁剪次序 §12.3;01-PRD v1.2 §1.7 已登记——风险 7 纪律前置条件满足;证据基座 docs/research/2026-10-06-m6-schedule-research.md) |
格式:
[日期] 任务 — 结果(含关键产出物与提交号)。新条目插在本节最上方。
- [2026-10-07] T6.2 会话录制回放测试 lane(M6 第二任务;协议零变更,62 方法 / 21 事件不变)——a) 录制工具
pnpm record:replay-fixtures(scripts/record-replay-fixture.mts):mock LLM 驱动真实服务节点四场景种子录制——plain-chat(两轮纯文本基线)/ tool-roundtrip(真实 write 工具往返:tool_call 块 + role:"tool" 结果行配对)/ compaction(手动 session.compact 确定性触发:compaction.applied 标记 + epoch 1 + 摘要替换重放语义 + 压缩后新轮)/ crash-seed(正常一轮后节点关闭,文件级注入悬挂 assistant tool_call 消息 + 半行截尾——05 §4.4 悬挂补齐 / §4.5 残尾修复的崩溃态种子,单写者已停无覆写风险)。b) fixture 归档形态:packages/storage/test/fixtures/replay/<scenario>/——events.jsonl 原字节归档不改写(checkpoint.pos 字节偏移不变量)+ expected.json(录制期幂等 session.resume 快照冻结的原会话终态全量内存历史 + crash-seed 种子申报)。c) 重放 harnesspackages/storage/test/replay-lane.test.ts3 用例 + 共享断言库 replay-lane-lib.ts(录制工具与 CI 用同一实现,录制期 fail-fast 与回归判定同口径):凭据扫描 fail-closed(04 §5.3:API key / Bearer / 凭据 JSON 字段 / 凭据 env 赋值 / JWT 形态五类模式)+ 确定性(同路复跑完全一致)+ 双路重放收敛(tail-scan/full-replay 自动定位路径 vs recorded O(1) 定位路径,除 source 外逐字段 deepEqual)+ 投影逐字段一致(重放 history ↔ 原会话终态,压缩摘要替换与崩溃悬挂合成含内)+ DB 级 resume(fixture 字节经真实 Storage.resumeSession 两次冷恢复收敛 + checkpoint_offset/epoch/message_count 对账回写核对,05 §4.4 第 6 步)+ 崩溃种子专项(repairDanglingTail 残尾另存 .tail- 恰一份 + 修复后重放零损坏行 + 合成保持)。d) 门禁:typecheck 全绿 / lint 0 error(11 warning 旧存留)/ architecture 342 文件 0 违规 / 单测 506(+3)/ protocol:check + event-matrix:check 不变 / smoke:p0 全绿。e) 文档:testing.md(506 + 回放 lane 说明段)+ 07 §12.2 实施注记回填 + 本文件。偏差申报:raincode replay调试子命令按 §12.3 裁剪次序顺延(回放 lane 收为纯内部 harness,07 §12.3 第 3 条既有预案)。提交:见 git log。
- [2026-10-07] T6.1 插件 marketplace 分发基座(M6 首任务;协议 additive 58 → 62 方法 / 21 事件,v1.14;错误码新增段 15 四码
MARKETPLACE_NOT_FOUND/MARKETPLACE_INVALID/MARKETPLACE_SEED_MISMATCH/MARKETPLACE_ESCAPE_BLOCKED;capabilitymarketplace)——a) shared schema 单一事实源:新域文件packages/shared/src/schemas/marketplace.ts(市场清单 marketplace.json 字段子集 name/version/source/description/displayName/category 的 strict schema + 注册表/种子/台账文件形态 + 4 方法入出参 schema;呈现层 i18n/icon/examplePrompts 不做)+ METHOD_SCHEMAS 登记 4 方法 + V1_CAPABILITIES 增marketplace;skillSummarySchema source 枚举增"plugin"(agent-core SkillDir 同步)。b) 分发核心(packages/server/src/marketplace-runtime.ts+ fs 原语marketplace-fs.ts):已知市场注册表<dataRoot>/marketplaces.json(path 本地目录源先行,url/github 形态预留不实现——schema 收窄以免假支持);安装布局<dataRoot>/marketplaces/cache/<marketplaceId>/<plugin>/<version>/(ZCode「源/市场缓存副本/安装副本」三分离中的市场缓存副本属远端源形态,顺延);内容寻址种子.zcode-plugin-seed.json(插件树「相对路径+内容」sha256,种子自身不参与哈希不参与拷贝);重装双段校验(副本哈希 = 种子 且 源哈希 = 种子 → 幂等;副本被篡改或同版本源漂移 →MARKETPLACE_SEED_MISMATCH拒绝,卸载重装复位);安装台账<dataRoot>/marketplaces/installed.json(重启重 attach 事实源,插件名全局唯一键)。c) 逃逸防护(T6.1 验收项):安装前逐条目遍历——插件树内 symlink/junction realpath 解析越界(Windows 大小写/分隔符归一比对)或悬空即拒绝安装(不部分拷贝),越界路径入错误消息与诊断审计;市场源条目 source 相对路径 resolve 级限制市场根内。d) 插件域扩展(plugin-runtime):PluginRecord 增 origin(dir/marketplace)+attachExternal(同源同目录幂等 / 异目录原位升级 / dir 来源同名冲突拒绝)+detachExternal(deactivate + 注销 + 停用名单同步清除——卸载 ≠ 停用;dir 来源拒绝;幂等容忍);marketplace 安装副本激活时清单目录名比对放宽(readPluginManifest增 dirNameMustMatch 选项——缓存目录尾段是版本号,身份由市场清单 + 台账背书,安装前已做 manifest name/version 一致性校验);装配序确定化:PluginRuntime 增 postBootstrap 钩子(初扫 + 激活完成后、ready 放行前执行 marketplace 台账重 attach——修复单测逮住的「重启后首次 plugins.list 可先于台账重装配返回」竞态)。e) 技能随插件第三源(T6.1 验收项):SkillRuntime 增 pluginSkillRoots 注入(marketplace.installedPluginDirs 就绪门投影),解析优先级 workspace > global > plugin(用户自定义可覆盖市场随附技能);skills.list/systemPromptProvider/expandForModel 三通道同链路。f) 宿主装配:CLI in-process / serve / web / 桌面 agent 子进程四处marketplace: {}与 plugins 域同启(marketplace 域要求 plugins 域在位,缺位连带不装配)。g) 示例与冒烟:examples/marketplaces/local/(marketplace.json + hello 插件 + 随附技能 plugin-demo——技能文件名须等于技能名的约定由冒烟逮住修正);scripts/smoke-marketplace.mts三用例(A 分发全链:注册 → 安装 → 种子落盘 → 插件激活 → 第三源技能可见 → skills.invoke 起 turn → mock 下发 plugin__hello__greet 真实执行回传;B 逃逸防护:junction 越界拒绝 + 审计消息;C 卸载复原:不可见 + 副本删除 + 台账清空 + 重复卸载 NOT_FOUND + 重装恢复)入回归。h) 单测 +4 共 503(server marketplace.test.ts:哈希确定性 + 逃逸防护 junction 越界/根内放行 + RPC 全链含幂等/篡改/逃逸/清单一致性/冲突/台账回滚/重启重装配;agent-core skill.test.ts 第三源优先级)。i) 门禁:typecheck 14 项目全绿 / lint 0 error(11 warning 旧存留)/ architecture 339 文件 0 违规(agent-service.ts 精确压回 500 行门禁)/ protocol:gen+check 62 方法 21 事件 / event-matrix 25 事件不变 / smoke:p0 + smoke:plugin + smoke:bundle 全绿。j) 文档:06 v1.14(头表状态 / §2.9 第三源 / §2.10 marketplace 分发面叙述 + 4 方法行 / §4.3 段 15 四码 / §6 错误码族计数 / §7.5 v1.14 行)+ 02 §2.3 分发注记 + testing.md(503 + smoke:marketplace 行)+ docs/README 计数校准 + 本文件。偏差申报:计划 3 方法(list/install/uninstall)实际 4——marketplace.add为注册市场的必要入口(无注册则 install 无从谈起),additive 登记于 §7.5;双端最小安装入口(07 §12.2 可选项)顺延未做,端层经 capability 探测。提交:见 git log。
- [2026-10-06] M6 排期轮(用户指令:子代理调研目录下其余项目与当前进展 → 详细调研分析 → M6 排期;协议零变更)——a) 四路子代理只读调研:① RainCode 自身进展与 M6 候选锚点复核(07 §11.5 五族 + §10.5 三条 ⏸ 行 + 代码侧钩子:events.jsonl/jsonl-resume 回放前提半成立、compact 三件套在位、Goal judge 零代码、plugin/skill 系统在位缺分发、rpc transport 扩展点);② D:\ACMHelper(ICPC 出题 Agent 系统:三态 checkReport 门禁 + 双程序对拍证据化判定 + generation_tasks 任务表/状态机/token 计量 + 失败不回滚手动重试;后端未实现仅文档+mock 如实申报);③ D:\ZCODE 安装包解包(v3.14.4:marketplace.json / known_marketplaces.json / 缓存+seed 内容寻址布局 / plugin.json 组件字段 / SKILL.md 契约全套真实格式;ACP 已退役迁自有协议(退役目录清单 + acp_session_id 迁移器 + legacy 恢复插件);无系统 daemon(utilityProcess 子进程 + automations 调度态落库);compact trigger 枚举与 model-io 分层录制参照);④ zhixue-engine(systemd unit/healthcheck/优雅停机/JudgeWorker 轮询线程池样板)+ smart-term(无回放——命令级三元组反向定义回放数据维度)+ 其余同盘项目排除记录。b) 调研报告落盘 docs/research/2026-10-06-m6-schedule-research.md(各源发现 + 五族证据映射 + 取舍结论)。c) M6 定案「生态分发与治理收线」(07 §12,13 人日):纳入 T6.1 marketplace 分发基座(path 源先行 + 逃逸防护 + seed 校验 + 技能第三源)/ T6.2 回放测试 lane / T6.3 spill 溢出家族 / T6.4 session.delete(tombstone+vacuum)/ T6.5 Goal judge MVP(三态 verdict + 防早停续跑)/ T6.6 工程收尾+遗留批次 D(knip / --changed / NFR 复跑);明确不做:ACP(ZCode 退役实证降级,如未来启用前置 = DB 预留外部会话 ID 列 + 迁移钩子)、系统级守护(ZCode 无系统 daemon 实证)、市场远端源与呈现层、逐帧终端回放;裁剪次序 T6.5 降 spike → T6.1 缩水 → T6.2 缩水,不可裁 T6.3/T6.4/T6.6;§10.5 三条 ⏸ M6+ 行全部销账。d) 01-PRD v1.2(风险 7 纪律前置条件):头部升版 + §1.5 M6 行 + §1.7 M6 增补范围三段式 + §5 新功能点 AC-13(Goal/Stop 判定 judge)/ TL-8(marketplace 分发基座)/ TL-9(spill 溢出治理)+ AC-8 注记更新(物理删除登记入 M6)。e) 07 §12:§11.5 追加处置记录表(五族 12 行)+ §12.1~§12.5(背景定位 / 任务分解表 / 裁剪次序与关键路径 / 验收清单 / M7+ 候选沉淀含本轮调研新证据)。f) PROGRESS §1/§2/§3/§5 刷新;申报性保留计数校准 4→5(legacy-items 实有 L-09/18/19/20/24 五项,§5 注记漏 L-24 溯源于 UI 收口轮申报后未同步)。(本轮提交)
- [2026-10-05] UI 异常态与运行时面板收口轮(「UI 异常态与运行时面板收口」;spec
.trae/specs/polish-ui-states-and-runtime/,03-ui-design v1.7 §17;协议零变更 58 方法/21 事件、token 色值零变更)——a) 缺口盘点与协议核实:03 v1.6 剩余「§7 纸面异常态 / §8.1 键盘可达未落地 / 三个 RPC 方法族有方法无界面」三类缺口逐一核实协议面真实存在(tool.background.list/kill/output、tool.tools.list、permission.decisions.list在 agent-service 恒常构造;config.providers.list/switch、memory.search已实现),零假 UI。b) 异常态与加载态收口(§7 + §8.1,本轮主项):新组件StatusBanner.tsx双端同构(toneinfo|warn|danger+ 可选动作 + 可选关闭,接入 ChatFlow 顶部错误/重连条与记忆/扩展/设置面板错误行,既有文案不变);新纯函数turn-error.ts(双端同构,自贴 500 行的session-view.ts下沉)——parseTurnError消费error事件结构字段scope/code/message/recoverable/turnId(缺结构化字段回落既有字符串横条、未知 scope 保底 system、兼容历史嵌套{error:{...}})+applyErrorEvent双路;ChatFlow 失败回合处 danger 卡「回合失败(code)」+recoverable===true时「重试」按钮(以该轮用户原始输入重发,斜杠命令经skills.invoke同路径);侧栏连接徽章补disconnecteddanger 圆点 +「离线」;chat 视图连接非 ready 且非 fatal 时主区顶部 warn 重连条「重连中(断线补偿)…」;.skeleton(--bg-raised微 shimmer 320ms,reduced-motion 收敛静态)替换 MCP 工具清单/记忆预览/关于/工具目录/后台任务/决策审计六处纯文本「加载中…」。c) 键盘可达与焦点管理(§8.1):新纯函数list-nav.ts(clampIndex/nextIndex/nextIndexFromKey)+focus-trap.ts(FOCUSABLE_SELECTOR/focusableWithin/nextFocusIndex)双端同构——会话列表(Delete=归档确认)/权限规则表(Delete=删除确认)/MCP 服务器行/记忆条目/工具目录行落地↑↓/Home/End 高亮 + Enter 激活 + 高亮行滚动入视;审批弹窗与两段确认弹窗接入焦点陷阱(打开聚焦首个可交互元素、Tab/Shift+Tab 回绕不逃逸、关闭归还焦点);:focus-visible焦点环双端全局落地(--border-strong+ 1px 外扩)。d) 后台任务面板(B1):新组件BackgroundTab.tsx+ 纯函数background-view.ts(backgroundStatusView五态状态灯/isRunning/sortTasks)接入右栏第 4 Tab「后台」(cyan 模块色)——tool.background.list行(状态灯 + 等宽 command + 相对时间 + exitCode)+ Running 行「终止」(kill)+ 行展开产出 tail(output {tail:200},truncated 提示)+ 存在 Running 且面板可见时 2s 轮询 + 刷新 + 空态一行;口径注记:registry 全局共享,展示全量(06 §2.7),不做按会话过滤的假 UI。e) 工具目录(B2):新组件SettingsTools.tsx接入设置页第 7 组「工具」——tool.tools.list三源过滤 chips + 行(glyph/等宽名/source 徽章/描述截断)+ 行展开 JSON-Schema 参数块;只读无调用入口。f) 审批审计(B3):新组件SettingsAudit.tsx接入「命令权限」组「决策审计」子区——permission.decisions.listdecision 三态 + toolName 过滤(300ms 防抖)+ 记录表(相对时间/等宽 toolName/decision 徽章/matchedBy/respondLatencyMs)+ 游标「加载更多」;只读。g) 记忆与输入区深化(C):MEMORY.md 预览改复用既有Markdown.tsx;检索路径服务端化(query 非空走memory.search {query,kind?,limit:50}250ms 防抖,移除端层content.includes旁路,空查询走memory.entries.list);新纯函数highlight.ts(splitHighlight:大小写不敏感/多命中/空 query 原样/正则元字符零语义)命中片段以--accent-bg高亮;输入区 ctx 行模型名改按钮 → 弹层(config.providers.list)→config.providers.switch快切(会话历史不动);无活跃 Provider 时输入区置灰禁用 + 引导条「先配置模型 Provider →」。h) L-22 收口:packages/server/src/mcp-runtime.ts的init()读配置失败(缺失/损坏/冲突)改安静空投影 + stderr 诊断mcp domain degraded: config load failed …,不再以未分类 INTERNAL 上抛;右栏 MCP Tab 空态改一行配置指引;mcp-degrade.test.ts补「缺失 mcp.json」回归用例。i) 产品截图 +12(双端 43 张:web 22 + desktop 21):双端各补工具目录(含 schema 展开)/决策审计/模型快切弹层/后台任务 Tab(真实 Running + 产出展开)/会话列表键盘高亮/回合失败重试卡六张。j) 电脑控制真机验收 12 项全过(真实 Web 工作台 + 种子 home,Edge + UI Automation):起始态/右栏 4 Tab/后台 Tab 空态与 registry 全量注记/MCP Tab 空态/设置页 7 组导航/工具目录三源 chips 与 JSON-Schema 展开/决策审计子区/关于版本渲染/模型快切弹层与 active 标记/会话列表 ↑↓ 高亮/主题三态循环/回合失败卡「重试」重发;两处环境限制如实申报:① 瞬态骨架未捕获(数据瞬时返回);②Ctrl+J被浏览器扩展 Sider 劫持(RainCode 自带「/」折叠按钮正常、Electron 不受影响,与 §8.1「浏览器保留键」口径一致);首跑阻塞(全部 RPC INTERNAL)经查为种子夹具 BOM 缺陷(PowerShell-Encoding utf8写 BOM 致config.json is not valid JSON),非产品缺陷,修好夹具后复验全过(§4 记一笔)。k) 测试 +81 共 455(双端 turn-error / list-nav / focus-trap / highlight / background-view 五纯函数模块 + mcp-degrade 缺失用例)。l) 门禁:typecheck 14 项目全绿 / lint 0 error(11 warning 旧存留基线)/ architecture 320 文件 0 违规(maxFileLines 500)/ protocol:check 58 方法 21 事件 + event-matrix:check 25 事件双生成物一致(佐证协议零变更) / 双端构建 + walkthrough-web 19/19 + walkthrough-desktop 14/14(DOM 契约零破坏,第 4 Tab 与第 7 组导航为纯增量)。m) 文档:03 v1.7(§6.1/§6.2/§6.3/§7/§8.1 实现注记 + §17 变更记录十二条)、README(产品一览 v1.7 + 新能力 + 双端截图 12 张嵌入 + shots 口径 22/21)、testing.md(455 + 五纯函数模块与 mcp-degrade 覆盖行 + 走查/截图基数)、legacy-items(L-22 核销 + L-24 附件入口申报,申报性保留 6)、06-api-spec(§2.7 tool.background 全局口径实现注记,无协议变更)、PROGRESS §1/§3。已知口径:附件入口不做(端能力缺口)、沙箱 Tab 维持协议缺口、消息数徽章与限流 429 横条维持未实现。
- [2026-10-05] UI 管理面板深化轮(「同步进度 + 新一轮 UI 优化设计实现 + 电脑控制验收」;spec
.trae/specs/expand-ui-admin-panels/,03-ui-design v1.6 §16;协议零变更 58 方法/21 事件)——a) 缺口盘点与协议核实:03 v1.5 剩余「已设计未实现」五项逐一核实协议面真实存在(permission.rules.、mcp.servers.add/remove、session.rename/fork/archive/compact、compact. 事件、hooks.list/trust.、system.version、session.list filter.keyword),零假 UI。b) 设置页六组导航双端落地(§6.2 本轮主项):新SettingsView.tsx(web 拆 SettingsPermissions/SettingsMcp,desktop 另有共享 SettingsCard)——左导航 200px 六组(激活项 text-hi + 2px accent 指示条)+「← 返回」「设定」走查契约保留;命令权限(rules.list/add/remove 全闭环:behavior 三色徽章 + 等宽tool:pattern ?? "*"+ 作用域 + 来源 中文口径 + 删除 + 新建规则表单 scope 仅 project/global + 危险示例置顶);MCP 服务器(servers.add/remove:卡片 + 添加表单 serverKey 正则/stdio command+args+env/url + 实时 JSON 预览 + 删除两段确认;运行态操作不与右栏 MCP Tab 重复);通用(主题三态与侧栏「◐」同状态源显式选择 + 工作区只读行 + 语言静态行);快捷键(静态 .kbd 键位表 + 浏览器保留键附注);关于(system.version 四行);Provider 与模型(ProviderSettings 原样迁入行为零变更)。c) 会话操作与检索(L-23 核销):新session-filters.ts双端同构(isSubsessionSession[subagent:前缀 + filterSessionRows Active/非子会话基线);侧栏搜索框 300ms 防抖 →session.list {filter:{keyword}}服务端过滤 + 折叠态搜索图标;会话项「⋯」菜单(重命名 inline → session.rename 本地即时更新 / 分叉 session.fork / 归档两段确认 session.archive,域错误落横条);「显示已归档」「显示子会话」开关默认关 localStorageraincode.*持久化、归档行灰态只读;已归档行经session.list {filter:{state:"Archived"}}追加拉取(服务端默认仅 Active,开关驱动双拉合并——电脑控制验收发现后修复)。d) 压缩可视化(§7 落地):新compact-view.ts双端同构(CompactionBanner + applyCompactEvent:仅活跃会话应用、字段守卫、completed 沿用 started trigger、ok/failed 分相)+ ChatFlow 顶部提示条三态(running shimmer / ok「⌃ 上下文已压缩 · 第 N 代 · 手动/自动 · tokens X→Y」/ failed danger + reason,可 dismiss、切会话重置)+ InputArea「压缩」按钮 → session.compact → completed 联动 refreshUsage;microcompact 存储级事件不经 RPC 不呈现。e) 扩展面板 Hooks 分区(T5.1 UI 缺口收口):hooks.list 双源投影(user=全局 cyan / project=项目 violet + loaded 状态灯 + 事件芯片)+ project 授信闭环(trust.grant/revoke 绑定活跃会话)+ 空态一行说明。f) 键盘可达(§8.1):Ctrl+N 新会话 / Ctrl+J 右栏开关双端全局 keydown(浏览器保留键口径注记)。g) 产品缺陷修复 ×2(截图/验收反哺,B2 同款盲区第三、四次复发):① hooks 域四真实入口(CLI in-process/stdio host/web 宿主/桌面 agent entry)均未装配hooks: {}(仅 smoke-hooks 自建节点手装)→ hooks.list METHOD_NOT_FOUND,四入口补装配;② compaction 域四真实入口均未传compaction选项(buildCompactionOptions(undefined) → 双 null)——auto-compact(NFR-6)/ microcompact(T5.4)/ session.compact 在真实入口从未生效,四入口补compaction: {}全缺省。h) 截图 +11(双端 31 张):web +5(Hooks 分区/设置命令权限/MCP/关于/压缩条)+ desktop +6(命令权限真实表单加规则/MCP/Provider/关于/压缩条/Hooks 分区);shots 脚本补 hooks.json 双源种子(matcher__never__零真实执行)+ 权限规则种子(web RPC 直种 / desktop 真实表单驱动)+ 压缩前置历史补足(cutIndex = length − keepRecent(20),历史未超出保留区时 session.compact 无事件——首跑修出)。i) 电脑控制真机验收 14 项(临时 harness:mock LLM + 种子 home + CDP 预置会话):会话回合/重命名/搜索/归档两段确认/过滤开关/设置页导航/权限增删/MCP 卡片/快捷键与关于/主题三态/Hooks 授信闭环/Ctrl+J/Ctrl+N/压缩按钮域错误路径——13 项首跑即过,「已归档开关」缺陷修复后复验全过。j) 测试 +19 共 374(双端 applyCompactEvent 5+4 / session-filters 5+5)。k) 门禁:typecheck 14 项目 / lint 0 error(11 warning 旧存留)/ architecture 289 文件 0 违规 / protocol:check + event-matrix:check 双生成物门禁绿(event-matrix 因新增端层 compact. 消费者登记再生成)/ 单测 374 全绿 / 双端构建 + walkthrough-web 19/19 + walkthrough-desktop 14/14(修复后复跑)。l) 文档:03 v1.6(§6.1/§6.2/§7/§8.1 实现注记 + §16 变更记录九条)、README(产品一览 v1.6 + 双端 Alpha 功能范围 + 截图 11 张嵌入 + shots 口径)、testing.md(374 + compact-view/session-filters 覆盖行)、legacy-items(L-23 核销,申报性保留 7→6)、PROGRESS §1/§3。已知口径:沙箱 Tab 维持协议缺口、消息数徽章维持未实现(session.list 无字段)、归档单向只读(协议无取消归档)。
- [2026-10-04] UI 三栏演进轮(「先详细设计 UI 的进一步演进与优化,对标规格文档 UI 预期与其余仓库 UI 设计,先规划后重构,电脑控制验收并更新截图文档」;spec
.trae/specs/refine-ui-context-panel/,03-ui-design v1.5 §15)——a) 缺口调研:03 v1.4 全文对照当前实现,锁定「已设计未实现」五项——右侧上下文面板(§6.0/§6.1 三栏布局核心,App 仅两栏整页切换)/ 左侧栏折叠 56px / 会话时间分组 / 子代理进度卡(web 源码零 subagent 引用,三事件未消费)/ ctx 用量条(§7);协议核对确认记忆/MCP/子代理三域方法+事件齐备、沙箱无 RPC 域(禁做假 Tab);三参照仓借鉴点取自 m5-reference-repos 调研(ZCode 同构 token 纪律 / dsh 24px 行 data-state + StateDot 密度 / MiMo 信息分层)。b) 双端并行实现(web/desktop 两子代理同构镜像):新ContextPanel.tsx三 Tab(记忆=ok / MCP=info / 子代理=violet 2px 指示条;记忆摘要卡+防抖检索;MCP 行展开工具清单+Failed 重试+启停+tick 实时重拉;子代理运行中/历史分组)+ App 三栏装配(非 chat 视图隐藏右栏)+ 折叠竖条唤起;新subagent-view.ts(自 session-view 拆分保 500 行门禁)——applySubagentEvent(spawned 绑定到达时活跃会话归属,06 §3.2 C 组全局事件无 sessionId 口径)/ groupSessions / ctxLevel 纯函数;ChatFlow 子代理进度卡(violet 卡完成折叠单行汇总);Sidebar 折叠 56px 图标态(展开态走查契约零变更)+ 会话今天/昨天/更早分组;InputArea ctx 用量条(直接消费 session.list/snapshot 既有 contextUsage 投影,>80 warn >95 danger,refreshUsage 并行 session.list 同步刷新)。c) 产品缺陷修复(截图验收反哺,B2 同款):三端真实入口(raincode web / raincode serve / 桌面 agent entry)均未装配subagent域——agent 工具与 subagent.* 三端全不可达,被 smoke-subagent 自建节点手装域掩盖(T4.9 B2 memory 同款盲区);三入口补subagent: {}(协议零变更,profile 解析 global+builtin 层)。d) 截图 +6 双端 20 张:shots 脚本补 agent 回合素材(builtin researcher 真实 spawn)+ 右栏 MCP/子代理 Tab + 侧栏折叠态;修出脚本时序缺陷(web「回合先跑页面后开」错过瞬态全局事件致右栏子代理假空态——agent 回合改页面在线后驱动)。e) 电脑控制真机验收(UI Automation,computer-use skill):三栏布局 / 三 Tab 切换(模块色指示条)/ 右栏折叠→竖条唤起→展开恢复 / 侧栏 56px 图标态→展开 / 浅色主题右栏全组件重映射逐项通过;发现并复验「mcp.json 缺失落 INTERNAL 横幅」为域装配降级既有行为(legacy-items 登记)。f) 测试 +15 共 305:双端 applySubagentEvent 5+4 / groupSessions 2+2 / ctxLevel 1+1。g) 门禁:typecheck 14 项目 / lint 12 warning 基线 0 error / architecture 259 文件 0 违规 / 单测 305 全绿 / 双端构建 + walkthrough-web 19/19 + walkthrough-desktop 14/14(装配改动后复跑)。h) 文档:03 v1.5(§6.1 右栏实现注记 + 沙箱 Tab 协议缺口口径 + §15 变更记录八条)、README(产品一览 v1.5 三栏口径 + 双端 Alpha 功能范围 + 右栏/侧栏折叠截图 6 张嵌入)、testing.md(305 + session-view v1.5 覆盖行)、PROGRESS §1/§3、legacy-items(mcp.json 缺失横幅 + 子会话入侧栏两条观察项)。已知口径:子会话([subagent:profile] 前缀)随 session.list 进侧栏列表(真实投影,过滤留待后续轮);设置页 6 组导航与消息数徽章维持未实现。
- [2026-10-04] UI 浅色主题落地轮(「根据其余项目的前端展示与前端设计文档补全 UI 设计」;03-ui-design v1.4 §14)——a) 缺口调研:03 v1.3 全文核对,§3.2 浅色主题为唯一登记「已设计未实现(v1.1 起 M6+ 候选)」条目;参照 ZCode
packages/ui/src/styles.css双主题 token 纪律(语义 token 重映射、组件零色值改动)。b) 浅色主题双端实现:v1.1 打下的「Tailwind 语义色全映射 CSS 变量」地基使组件零改动——[data-theme="light"]块重映射 token(§3.2 规范关键映射 + 同纪律派生:冷灰白阶梯 / 边框加深 / text-faint / accent 三态 / diff 色浅底加深 / 阴影遮罩收敛;:root补color-scheme原生控件随主题)。c) 硬编码值 token 化(双端,深色视觉零变更):主按钮文字text-void→text-on-accent(14 处,--on-accent语义别名——--bg-void浅色下转浅灰不再兼任)、审批遮罩bg-black/60→.overlay-mask(--overlay,规范 §6.0 原值入 token)、::selection→--selection-bg、TailwindboxShadow→--shadow-1/2/3。d) 三态切换(双端同语义):侧栏品牌头「◐」循环 深/浅/跟随系统;theme.ts纯函数面(resolveTheme/nextTheme/存取校验)+applyTheme落<html data-theme>;localStorageraincode.theme双端同名;跟随系统经prefers-color-scheme监听实时重映射,main.tsx 渲染前应用防闪色;theme 状态入双端 state(initialState(themePref))。e) 截图 +2:shots 脚本各补浅色对照(web-chat-light / desktop-chat-light,导航态切 data-theme 截后还原),README 嵌入(双端 14 张)。f) 测试 +12 共 290:双端 theme.test.ts 各 6(解析/循环/持久化纯函数面)。g) 门禁:typecheck 14 项目 / lint 12 warning 基线 / architecture 255 文件 0 违规 / 单测 290 全绿 / 双端构建 + walkthrough-web 19/19 + walkthrough-desktop 14/14(首跑「插件再激活」偶发超时复跑即绿,DOM 契约零破坏)。h) 文档:03 v1.4(§3.2 实现状态改写 + §9 稿件注记 + §14 变更记录五条 + 头部版本史)、README(产品一览 + 双端 Alpha 功能范围 + 浅色截图 + shots 8/6 张口径)、testing.md(290 + theme 覆盖行)、PROGRESS §1/§3。CLI 端零改动申报:浅色主题不提供 CLI(§3.2 口径,CLI 遵循终端自身配色)。
- [2026-10-04] UI 重设计轮(双端统一「赤陶磷光 v2」;03-ui-design v1.1 §11 变更记录)——a) 三参照仓 UI 只读调研(三个调研子代理并行,结论逐条落证据路径):ZCode(双形态 TUI+GUI,
packages/ui/src/styles.css双主题 token 纪律——中性色 alpha 化rgba(13,13,13,.1)跨主题通用、CJK 等宽字体显式插入防落宋体、DESIGN.md 契约、六类节点色系、color-mix派生 hover);MiMo-Code(纯 TUI,tui/context/theme/*.json33 主题 defs→token→RGBA 三层、用户消息左边框卡、审批三态卡、prefers-reduced-motion降级、ASCII Logo 空态、diff 成对 token);deepseek-harness(Web GUI,ui-theme/styles/静态色板→语义 alias 两层 token、24px 工具行 data-state 驱动、StateDot、流式渐隐 mask、审批卡「色带+等宽命令+右对齐决策」范式、裸 monospace 令中文落宋体教训)。b) Web 端整体重设计(本轮主项):自 T3.8 时期ink-*简化盘(GitHub-dark 硬编码色)迁移至 03 §3.1 token 体系——index.css全量重写(tokens + 动效)+tailwind.config.cjs语义色映射与桌面端同源;全组件重写呈现层(逻辑与走查 DOM 契约零变更):Sidebar(✦ 品牌头 + 连接徽章 + 会话 accent 指示条 + 模块标识色面板入口)、ChatFlow(用户浅橙底右对齐气泡 / 助手卡片 ✦ 署名 + model 标签、空态 ASCII、hook 执行行、shimmer turn 指示)、ToolCard 自 ChatFlow 迁出独立组件(与桌面端同构:折叠头 32px + 五状态灯 + 2px 左边框 + 30 行截断 + 模块徽标——mcp__<server>__<tool>→info「MCP·server」、agent→violet「子代理」)、ApprovalDialog(顶部琥珀色带 + 角标 + 中风险徽章 + 四级决策)、InputArea / ProviderSettings / MemoryManager / ExtensionsPanel 全面对齐。c) 桌面端精修:global.css v2 增补(--font-mono补 CJK 去 JetBrains Mono/裸 monospace 兜底、shimmer、anim-fade/rise-in、.corner-ticks取景框角标 utility、:focus-visible焦点环、选区色、dot-idle、prefers-reduced-motion全覆盖);Sidebar 品牌头 + 模块标识点、ToolCard 模块徽标、ApprovalDialog 色带 + 角标 + 入场动效(B4 焦点接管保留)、ChatFlow 内容列角标 + EmptyState 动效、MessageBubble 围栏边框、ExtensionsPanel 断连态 dot-idle(原dot无色不可见)、App 视图切换 anim-fade。d) 走查 DOM 契约零破坏验证:walkthrough-web 19/19、walkthrough-desktop 14/14 全绿(按钮文案「+ 新会话/设定/仅本次允许/4 拒绝/← 返回/扩展面板/记忆管理器/+ 新建会话/健康检查」、aside input、textarea、border-danger 错误条、↑/↓ 用量行、__raincodeStoreaid 全部原样保留)。e) 可视化验收:临时 CDP 截图脚本(验收后即删)驱动真实构建产物采集 7 张(Web 会话流/审批弹窗/记忆管理器/扩展面板 + 桌面同四态)至d:/tmp/ui-redesign-shots/,人工核对通过——首跑修出脚本自身两缺陷(表格 markdown 的|不入 innerText 断言改纯文本片段;createSession 抢跑 bootstrap 握手门「handshake required」——引导等待条件bodyContains(扩展面板)在 Sidebar 渲染即满足而 system.ping 未完成,补等connection === "ready"收敛;走查脚本自身不触发因扩展面板往返耗时天然跨过握手窗口,非产品缺陷)。f) 文档:03-ui-design v1.0→v1.1(头部口径 + §1 CLI 形态校准 readline REPL + §3.2 浅色登记 M6+ 候选 + §3.3 mono 栈修订 + §3.5 减动效偏好落地 + §11 变更记录七条)、README 桌面端/Web 节视觉口径、PROGRESS §1/§3。g) 门禁:typecheck 14 项目 / lint 12 warning 基线 0 error / architecture 243 文件 0 违规 / 单测 250 全绿(UI 轮零测试增减,reducer/协议未动)/ protocol:check 不涉及 / 双端构建 + 双走查全绿。浅色主题经用户确认本轮不做(登记 M6+ 候选);抽公共 renderer 包仍留待第三端或令牌治理立项(04 §2.3 口径不变)。
- [2026-10-04] UI 重构轮(「前端进一步优化重构 + 产品介绍截图到 picture/ 并嵌入 README」;03-ui-design v1.3 §13 / 06 §7.5 v1.13)——a) 呈现层组件化(双端,行为零变更):markdown 渲染抽出独立
Markdown.tsx(行内 + 块级 + CodeFence)+ web 补齐MessageBubble.tsx与桌面端同构;MessageBubble/Markdown/ToolCard双端React.memo——长会话流式仅活动消息重渲染;走查 DOM 契约零破坏。b) CodeFence v1.3(双端):围栏升级「头行 + 主体」整体容器——头行语言芯片(fence 首行语言标签,无标签text兜底)+ 常驻复制按钮(03 §6.5 修订)。c) 冷重建补全(截图验收反哺的双端真缺陷):产品截图以「回合先跑、页面后开」路径暴露session.resume冷重建两处退化——工具卡参数摘要裸JSON.stringify(活路径摘要 v2,恢复后退化为 JSON 墙)+ 思考块丢失(reasoning 瞬态不落盘);修复 = 重建逻辑抽纯函数rebuildItemsFromHistory(双端镜像 + 单测锁定,desktop 独立history-rebuild.ts保 500 行门禁)统一消费摘要 v2 + 协议 v1.13 additiveMessageRecord.reasoning(agent-core turn-loop 累积delta.reasoning随 assistant 行落盘,persistPartialText中断残留同口径;CLI 上下文组装不消费,行为零变更)——思考块跨宿主重启 / 换端接续保留。d) 产品截图管线:scripts/product-shots-web.mts/product-shots-desktop.mts(pnpm shots:web/shots:desktop)——真实入口(raincode web宿主 / 构建产物 electron)+ mock LLM 脚本回放(推理流 / markdown / 并行只读工具含 todo_write 审批自动放行 / MCP·fixture echo 审批 / write 审批)+ node WS RPC 驱动回合 + CDP 语义导航与Page.captureScreenshot(web 1440×900@2x,desktop 1280×800@2x),产出 12 张真实渲染截图入库picture/(web 7:chat/tools/slash/memory/extensions/settings/approval;desktop 5:chat/tools/approval/memory/extensions)并嵌入 README(产品一览两栏 hero + 双端节两栏 +<details>折叠更多);首跑修出脚本自身四缺陷(浏览器 CDP 端口未就绪/json/newfetch failed 补轮询、web UI workspace 需经侧栏「设定」、web 端不监听session.created改 reload 后选中、MCP/write 审批分流守卫——均非产品缺陷)。e) 测试 +8 共 278:agent-core round-helpers 2(buildAssistantRecord reasoning 随行/空串省略)+ desktop history-rebuild 3 + web session-view 3(rebuildItemsFromHistory:reasoning 恢复/无 reasoning 不设字段/摘要 v2 重建/结果归并/空 history)。f) 门禁:typecheck 14 项目 / lint 12 warning 基线 / architecture 251 文件 0 违规(500 行门禁收敛 desktop session-view 与 turn-loop 注记压缩)/ protocol:gen+check 58 方法 21 事件 / 单测 278 全绿 / 双端构建 + walkthrough-web 19/19 + walkthrough-desktop 14/14 复归。g) 文档:03 v1.3(§6.1 思考块 v1.3 增补 / §6.5 围栏头行修订 / §13 变更记录五条)、06 v1.13(§6.3 snapshot 注记 + §7.5 变更行 + 头部口径,protocol-catalog gen 同步)、README(产品一览 + 双端截图 + shots 命令 + v1.3 口径)、testing.md(278 + round-helpers/history-rebuild 覆盖行)、PROGRESS §1/§3。
- [2026-10-04] UI 重设计二轮(思考块 + 工具卡 v2 生产级深化;03-ui-design v1.1 → v1.2 §12 变更记录;用户指令「优化工具卡/思考块展示、对标三仓进一步美化、生产级组件搭配、优化所有端」)——a) 思考块落地(双端,本轮核心缺口):协议
message.delta自始含 text/reasoning 双类型(CLI B7 经 stderr 消费),但双端 session-view reducer 对delta.type !== "text"整体丢弃、ChatItem.reasoning字段预留未填充——双端 reducer 补 reasoning 独立累积:reasoning 先行到达新建流式助手项(text 空串起步)/ 同一流式消息内与 text 交替各自累积 /message.completed收束 streaming=false 且 reasoning 保留 / 未知 delta 类型整体忽略不建视图;UIReasoningBlock(双端同构):✻ 思考过程 · N 字单行开关(violet 标识 + 2px 左边线),流式期间自动展开实时呈现(italic 弱化 + 48px 渐隐 maskstream-fade),完成后自动折叠可再展开(MiMo Thought / ZCode running→completed 自动收束语义)。b) 工具卡 v2(双端同构):glyph 表与 CLItheme.glyphFor同源(◇ mcp / ◈ agent / ✓ todo / ✱ 检索 / ← 写入 / $ bash / ⚙ 兜底——三端同一视觉语言,状态灯右侧 cyan);summarizeInputv2 按工具域提炼主参数(bash$ 命令多行折叠 / grep·glob"模式" · 范围/ read·write·edit 路径 / web_fetch URL / agentprofile · task/ skill/name/ 未知形状回退紧凑 JSON,统一 120 字符截断)替代原始 JSON 墙;状态底色 tint(pending warn / running cyan / error danger 各 5%)与 2px 左边框双通道状态编码;结果预览 diff 行着色(结构化标记diff/@@/---/+++或 +/- 行成对才启用,markdown 列表不误判,--diff-add-tx/--diff-del-tx进 Tailwind 令牌)+truncated琥珀截断提示。c) 组件搭配补全(双端):代码围栏右上角复制按钮(clipboard API 优先、file:// 非安全上下文回退 execCommand,1.5s「已复制」反馈);快捷键提示行 kbd 芯片(.kbd等宽 10px + 下边加重 2px)——审批弹窗「快捷键 1–4 直选 · Esc 拒绝」与斜杠面板「↑↓ 选择 · Tab 补全 · Enter 执行 · Esc 关闭」两处;desktopglobal.css补.stream-fade/.kbd,webindex.css补.kbd。d) 测试 +20 共 270:desktop session-view 10(reasoning 累积四用例 + summarizeInput v2 矩阵含 reducer 接线回归护栏)+ web session-view 10(新测试文件,与桌面端同语义镜像);lint 新增 6 warning(ToolCard diff 正则触发 prefer-string-starts-ends-with)当场收敛回 12 基线。e) 验收:门禁 typecheck / lint 12 基线 / architecture 244 文件 0 违规 / 单测 270 全绿;双端构建 + walkthrough-web 19/19 + walkthrough-desktop 14/14;CDP 截图 8 张(思考块+围栏复制 / read ok 态展开 / MCP 审批 / MCP 徽标,双端各四,d:/tmp/ui-redesign-shots-2/)人工核对——首跑修出截图脚本自身两缺陷(read mock 用file_path不符工具 schemapath、目标文件未种入致 ENOENT 假红,均非产品缺陷);临时脚本验收后即删。f) 文档:03-ui-design v1.2(§6.1 思考块条目 / §6.4 v1.2 细则五条 / §6.5 kbd 与复制按钮 / §12 变更记录四条)、README 双端 Alpha 功能范围行、testing.md(270 + desktop/web session-view 新测试覆盖描述)、PROGRESS §1/§3。CLI 端本轮零改动申报:CLI 视觉 = 终端原生美学(M2 展示升级轮已对齐 03 tokens 与 glyph 语言,reasoning 经 B7 stderr 通道已消费),GUI 二轮的 glyph/摘要语义与 CLI 同源即「所有端一致」的落地形态。
-
[2026-10-06] T5.7 门禁升级轮(测试补全 + CI 门禁升级;用户指令两段式的第二段——T5.7 开发提交 8cbcb56 → 本轮提交)——a) pinned 包管理器校验入 CI(T5.7 任务行承接,MiMo build.ts:22-29 pinned 教训「杂散二进制可致运行时挂死而 smoke 仍绿」):scripts/check-pinned-manager.mjs 三面校验——packageManager 必须精确
pnpm@<exact semver>(可选 +sha512 corepack 改写后缀;范围/^/~/>=/x 形态一律拒绝即「可升级」不 pinned)+ pnpm-lock.yaml 在位 +pnpm --version实测与 pinned 一致;本地pnpm check:manager,CI gates job 前置 Preflight 步骤(install 之前)。b) CLI bundle 冒烟独立 job:ci.yml 新增 cli-bundle job(windows-latest 与 gates 并行:checkout → setup pnpm/node → install frozen →pnpm build:cli→pnpm smoke:bundle)——esbuild 产物随门禁回归防「源码绿、产物坏」;CI 形态「六门禁 gates + cli-bundle」双 job,ELECTRON_SKIP_BINARY_DOWNLOAD 同步。c) 测试补全 +9 共 499:构建管线纯函数可测化抽取——metafile 重复依赖校验自 build.mjs 抽出 apps/cli/scripts/lib/metafile-check.mjs(.d.mts 声明供 NodeNext TS 导入;apps/cli tsconfig include 增 test)——bundle-metafile-check 5 用例(单实例多包计数与 workspace/入口排除 / scoped 名 + 还原 / 多版本抛错 / 同版本不同 peer 哈希抛错——完整 .pnpm spec 键控不做 peer 剥离,peer 剥离会把两个物理实例折叠成同一键漏报,抽取单测首跑即抓出该设计缺陷并修正;spec 含 peer 后缀时 lastIndexOf("@") 截错改「首个后随数字的 @」定位版本边界 / Windows 反斜杠归一 / 形态异常不误报)+ pinned-manager 4 用例(精确通过 / +sha512 通过 / 范围形态拒绝 / 非 pnpm 与缺失拒绝);apps/cli 首次拥有单测文件。d) 门禁:typecheck 14 项目(apps/cli tsconfig 增 test 面)/ 单测 499 全绿 / build:cli + smoke:bundle 复跑绿(更严格完整 spec 键控下 18 包零误报零漏报)。e) 文档:04 §6.3 / 07 §11.2 T5.7 注记 / testing.md(499 + CI 行「已落地」+ cli 覆盖行)/ README(工程门禁块 check:manager 行)/ PROGRESS §1/§3。- [2026-10-06] T5.7 工程收尾 + 遗留批次 C(07 §11.2;协议零变更 58 方法/21 事件;M5 收官任务,L-16 核销 + T4.8 SSH 双引号残差核销)——a) CLI esbuild 前置编译(L-16 核销,apps/cli/scripts/build.mjs,ZCode build.mjs 三件套参照 docs/research/2026-10-04-m5-reference-repos.md §2.3):dist/raincode.mjs 单文件 ESM bundle(format=esm——isDirectRun 的 import.meta.url 语义要求 ESM;desktop agent bundle 用 CJS 系其入口由 main 进程 require 驱动,两形态各自成立)+ 三件套:①原生模块外置清单(better-sqlite3 external,apps/cli 显式声明依赖经 node_modules 解析——pnpm 严格布局下外置模块必须由打包应用声明;desktop 同款先例;ws/@modelcontextprotocol/sdk 纯 JS 全内联)②metafile 重复依赖校验(构建后扫 metafile.inputs,同一包多个 .pnpm 物理实例——多版本或同版本多 peer 哈希——即失败:zod 双实例致 schema instanceof 跨包失效属 ZCode 真实踩坑,18 个第三方包全量核对)③alias 逐条精确声明(@raincode/* 十包逐条映射各包 src/ 目录,无通配无前缀猜测;esbuild alias 按包边界前缀改写故子路径 @raincode/rpc/client 仍经文件名解析命中)。b) bundle 自举注入(banner,仅 bundle 形态生效;dev/tsx 形态仍走源码位置解析):RAINCODE_MIGRATIONS_DIR → 随包分发的 dist/migrations/(.sql 构建期复制,desktop 迁移随包同款)+ RAINCODE_APP_VERSION → 根 package.json version 内联(bundle 内 app-version.ts 的相对路径探测不可达)+ ESM/CJS 互操作 require 绑定(cross-spawn 等传递依赖的惰性 require(node 内建) 在 ESM 输出不可用——esbuild __require shim 优先拾取模块作用域内 createRequire 绑定,首跑 manual 验证抓出)。c) CLI bundle 产物冒烟(scripts/smoke-cli-bundle.mts,pnpm smoke:bundle,脚本自跑构建一体化;验收「命令集与协议断言」):A help 六命令齐备 / B 未知命令 exit 2 / C config dump --default-only exit 0(bundle 内配置管线)/ D 握手门禁 ping 前 session.list → VERSION_MISMATCH / E system.ping protocolVersion+capabilities / F tool.tools.list 14 工具逐项一致(13 内置 + agent 子代理派发——serve 装配面与源码运行一致)/ G session.create 返回 sessionId(migrations 自举生效证据:bundle 路径下 storage 打开走迁移)/ H stdin end 优雅退出 exit 0。d) SSH 执行域 base64 加固(T4.8 双引号残差核销):SshExecutor.buildRemoteCommand 重写为echo <b64> | base64 -d | sh——cd/env/sh -c 三段整体编入 base64(字母表无引号无空格无元字符),命令行全程零双引号,免疫 Windows argv 解析(CommandLineToArgvW 吃双引号)与本地 shell 逐层传递;旧形态cd "…" && env K="V" sh -c "<cmd>"(JSON.stringify 嵌入)经逐层解析消耗一层转义、含内嵌双引号的远端命令被改写(m4 报告 §4 申报);远端解码后引号语义在唯一一层 shell 内闭合(shSingleQuote POSIX ''' 习语);要求远端 coreutils base64(POSIX 标配;探测命令 exit 0 不变)。e) smoke:ssh 扩展双引号场景转绿(验收项):mock LLM 增第三跳echo "double-\"q\"-and-&&-intact 'sq'" > …(内嵌双引号 + && + 单引号),服务端按新契约解码(wire 形态校验 + base64 解码 + ''' 习语还原),命令逐字保真断言(records[i].command === 模型意图,旧契约下被改写的正是这一断言)+ 落盘输出核对(N-3 模式,contentPreview 仅首行不可用);smoke:p0 16 子冒烟全回归绿。f) pinned 包管理器校验 + bundle 冒烟入 CI(T5.7 承接的 CI 升级,MiMo build.ts pinned 教训):scripts/check-pinned-manager.mjs(packageManager 字段必须精确 pinnedpnpm@<semver>拒绝范围/^ 形态 + pnpm-lock.yaml 在位 +pnpm --version实测版本与 pinned 一致——杂散 pnpm 二进制可致运行时挂死而 smoke 仍绿)入 CI 步骤;新增 CLI bundle 构建冒烟 job(windows-latest 独立 job 与六门禁并行:install → build:cli → smoke:bundle);CI 门禁集「六门禁 + bundle」双 job 形态,文档 04 §6.3 / testing.md §2.4 同步——CI 工作流变更(ci.yml + check-pinned-manager.mjs)于同日门禁升级轮提交落地(用户指令两段式:T5.7 开发提交 → 测试补全+门禁升级提交)。g) 测试 +1 共 490:executor-ssh.test.ts(SshExecutor 用例自 executor.test.ts 抽出——T5.7 用例加入后 518 行超 500 门禁,按域拆分;含 base64 契约解码核对 / 连接参数 / env 注入 / 双引号逐字保真(单测面)/ 工厂回退 / bash 接线 7 用例);architecture 330 文件 0 违规。h) 遗留批次 C 复查:L-14 密钥到位复查——smoke:remote 矩阵实测 1/2 连通(aliyun-qwen qwen3.7-flash PASS 1.2s;ollama-local FAILED:本地 Ollama 服务在运行但已无已安装模型(/v1/models 空、api/tags 空)——机器状态变化非代码回归,模型重装后即入阵;OpenAI/DeepSeek/Kimi/GLM 密钥仍缺)→ 保留口径不变;L-01 复测——docker CLI 仍缺失、WSL 仍无发行版 → 保留口径不变;NFR 抽查(07 §10.4 口径)——NFR-1 冷启动 768.9ms 中位数(≤2s,M2 装配面扩大后绝对值仍 2.6× 余量;bundle 正是 L-16 对策,NFR 口径以 tsx 源码路径为准)/ NFR-2 P95 4.4ms(≤300ms)/ NFR-7 crash×1 PASS。i) 门禁:typecheck 14 项目 / lint 0 error(11 warning 基线)/ architecture 330 文件 0 违规 / 单测 490 全绿 / smoke:p0 16 子冒烟 / smoke:bundle 8 断言 / protocol:check + event-matrix:check 双生成物绿。j) 文档:04 §6.3 CI 门禁双 job 形态、07 §11.1 L-16 行转 ✅ + §11.2 T5.7 行实施注记、README(CLI esbuild 前置编译节 + 工程脚本表)、testing.md(490 + smoke:bundle + executor-ssh 拆分行)、legacy-items(L-16 核销、L-14/L-01 复查注记、统计更新)、PROGRESS §1/§2/§3/§5。偏差申报:单文件 bundle 1.4MB 未做压缩资产剥离与 SEA 单二进制(调研报告 §3 已定论 npm 分发 + esbuild bundle 覆盖需求);smoke:remote ollama 条目因本机模型缺失临时不连通,如实申报不修饰。 -
[2026-10-06] T5.6 MCP 工具目录化(07 §11.2;协议零变更 58 方法/21 事件,新增数据级错误码
TOOL_MCP_NOT_LOADED)——a) 机制总纲(MiMo mcp-tool-search 参照,02 §3.3 新节):目录模式 = mcp 域装配即默认启用(toolSearch:false显式关闭;四个真实入口零装配改动——规避 B2 族「真实入口漏装配」盲区),MCP 工具参数 schema 不再全量进模型载荷,改为目录摘要 +mcp_tool_search按需检索激活。b) server:mcp-tool-catalog.tsMcpToolCatalog(目录快照 = registry source=mcp 字典序条目;digest=sha256 12 位,变化即「重发布」诊断(T4.4 同款);渲染三级降级——富(名+描述)→ 仅名称 → 字典序前缀+省略计数,预算 = 10% 窗口封顶 20000 tokens、估算 tokens=ceil(chars/3) 同 T5.4 口径;参数 schema 与参数描述绝不进目录,仅作检索语料)+bm25-index.ts纯模块(BM25 K1=1.2/b=0.75 内存索引,语料 = 名+描述+递归参数名/描述;分词 ASCII 非字母数字切分(snake_case 展开)+ CJK 二元 bigram;相对分数地板 top×0.15——T5.3 检索同纪律,BM25 绝对阈值随语料尺寸漂移不可用)+collectSchemaParamNames递归参数名收集(深度限制防异构 schema 爆炸)。c) agent-core:新turn/mcp-catalog.ts——McpRequestCatalog逐循环状态机:每轮payloadFor(目录生效 → 未激活 MCP 不进载荷 + mcp_tool_search description 换目录摘要;未生效 → 全量投影剔除检索工具;round===1 重置请求域激活 = MiMo S3「新用户消息重新隐藏」;digest 变化激活集整体失效)+eligibility()调度守卫 +captureSearches激活重导出(对本轮成功的搜索调用以同索引确定性重导出登记——不信任模型可见输出;digest 校验 + 目录成员校验;累计上限 32);tool-phase 新mcpEligibilityctx 守卫——未激活mcp__*调用调度期拒绝(TOOL_MCP_NOT_LOADED + 指引先检索,先于 zod/hook/permission——未在载荷声明的调用不进审批闭环),executor/batchCtx 通道透传。d) tools:handlers/mcp-tool-search.ts内置第 13 个工具(readOnly 零副作用快速通道;ctx.searchMcpTools通道 server 装配注入,缺省 TOOL_UNAVAILABLE;命中格式化单行化 + score 四位 + 「下一轮可调用」指引);shared TOOL_ERROR_CODES 增TOOL_MCP_NOT_LOADED(目录 gen 同步)。e) 装配:runtime-domains 集中接线(expandSkill/searchHistory 通道装配同步收拢 + searchMcpTools + mcpCatalog 构造);agent-servicemcp:{toolSearch?}选项 + create/resume/fork 三路径 mcpToolCatalog 端口注入(子代理循环不接——维持全量 schema,偏差申报:profile 任务域窄、allow 白名单已收窄工具面)。f) 测试 +34 共 489:server mcp-tool-catalog 15(分词/排序/地板/截断/CJK/三级降级确定性/空目录/digest 稳定/热变更诊断/参数名语料)+ server mcp-tool-search e2e 4(验收三断言:多 server fixture(alpha/beta×6 schema 重工具)目录开/关 token 对比——开启载荷零 mcp__ 工具且序列化体积 >1.5× 小于全量 schema;search 命中→下一轮激活→真实执行回传;未加载直调 TOOL_MCP_NOT_LOADED 零执行痕迹 + turn 间热变更重发布)+ agent-core mcp-catalog 11 + tools mcp-tool-search 5;smoke-mcp case D 改造——「检索→激活→调用」真实目录流程(首跑抓出真回归:mock 直调未激活工具被守卫拒绝 = 守卫生效佐证,冒烟脚本随语义演进更新);smoke-tools 内置清单 12→13;smoke:p0 16 子冒烟全回归。g) 门禁:typecheck 14 项目 / lint 0 error(11 warning 基线)/ architecture 328 文件 0 违规(tool-phase 500、turn-loop 500、agent-service 499 顶行贴限)/ protocol:check 58/21 + event-matrix:check 25 双生成物绿 / 全量单测 489 全绿。h) 文档:02 §2.3 工具表 + §3.3「MCP 工具目录化」新节(四件套:目录与预算降级/BM25 检索/请求域激活/执行安全)+ §3.4 两行、06 §4.3 TOOL 段 + 生成目录、07 §11.2 T5.6 行实施注记、README(M5 行 + 内置工具表 + MCP 目录化段 + 计数 13)、testing.md(489 + 四组覆盖行)、PROGRESS §1/§2/§3/§5。偏差申报:MiMo 的上下文压力降级(用量 ≥70% 转名称列表)不做——压力面归 compact 线治理;目录只做静态预算降级。 -
[2026-10-05] T5.5 可观测性:config dump + 事件矩阵(07 §11.2;协议零变更 58 方法/21 事件)——a)
raincode config dump(apps/clicommands/config.ts,不 boot 服务、不产生配置副作用,dsh dump-config 同纪律):归并链两域分列——Provider 启动域 = 内置默认 → providers 配置文件(--provider-config/RAINCODE_PROVIDER_CONFIG/<cwd>/config/providers.local.json)→ env(RAINCODE_PROVIDER_*)→ CLI 参数,全局域 = 内置默认 →<dataRoot>/config.json(ConfigStore.read()同一读路径,与config.get同文档);逐项标来源(resolveProviderConfigadditivefieldSources/configPath逐字段 cli/env/config/default/unset;resolveDataRoot经 server 转发导出守住 cli requires=[server,rpc,shared] 边界);诚实性:config.json permissions/compaction 节 schema 已声明但运行时消费方未接线 → dump 如实标注「schema 已声明,运行时消费方未接线」(dump 输出与实际生效一致 = 验收标准;文件不存在回退内置默认文档也标注);--default-only损坏诊断 = 跳过一切文件读取仅打印内置默认层 + env(正常模式损坏时也尽量打印其余层 + 诊断行退出码 1);parseCliArgs 增--default-only;help 与 README CLI 表登记。b) 事件生产者/消费者矩阵(scripts/gen-event-matrix.mts,扩展 T4.3 gen 管线):生成docs/generated/event-matrix.md25 事件 = 协议 21(EVENT_SCHEMAS)+ 存储级 4(STORAGE_EVENTS 登记表:compaction.applied/pruned + hook.invoked/result 审计对;session.created 双栖=协议事件+会话日志头行);扫描 packages/apps src(跳 test/注释行),分类形态 = 派发(emitPersisted/emitAudit/publishTransient/publish/appendEvent/emit 调用 + 对象键name:"x.y")/ 监听(apps 层 case/onEvent/注册数组键行(含行尾注释)/name ===比较 + packages 层=== 常量重放);登记式纪律(dsh「显式收录绕过点」同款):EXCLUDED_PREFIXES(双端 renderer/components 状态 switch、packages/rpc 传输管道)+ OVERRIDES(mirror 子代理镜像转发、tool-phase 变量形态emitPersisted(name, build)、compact service 多行 appendEvent)+ EXCLUDED_HITS 假阳性精确剔除(ports/types 类型声明行、mirrorstage:"done"属 subagent.progress 载荷)逐条注因入生成物;防漏登记守卫 = 事件域前缀点分小写字面量未登记(协议 ∪ 存储 ∪ 方法名 ∪ NON_EVENT_LITERALS 豁免表:TurnTrigger 迁移名×3/能力键×3/配置文件名×2,首跑逐一核实)即生成器报错退出 1;扫描既知事实如实呈现(session.snapshot 派发点为空 = 06 §3.2 响应投影 buildSessionSnapshotEvent 零调用方、compact.started/completed 无端层监听);gen +--check双模式 + package.jsonevent-matrix:gen/check+ CI 门禁 6 扩展为双生成物(protocol:check + event-matrix:check);手改变红实测:改级别列 → check 退出 1 精确差异定位,恢复后复绿。c) 矩阵 25 行逐一人工核对(对照独立 grep 全量清单):message.delta/tool_call.progress 派发方 = loop-eventspublishTransient(瞬态不落盘)/tool_call.progress = turn-loop;error 行双端 ToolCard 假阳性经 EXCLUDED_PREFIXES 剔除;desktop session-viewname ===行 190 真监听核实。d) 测试 +7 共 355(apps/cli/test/config-dump.test.ts 首个 cli 测试文件):env 覆盖 providers 配置文件且值与resolveProviderConfig同输入解析一致(dump 与实际生效一致验收)/ CLI 参数最高层 / config.json 逐字段投影+未接线注记 / 损坏 config 诊断+退出码 1 与--default-only内置默认退出码 0 / 明文 key env+配置文件两路与 ws token 绝不入输出 / 未配置 Provider 占位 / 数据根来源标注。e) 门禁:typecheck 14 项目 / lint 0 error(11 warning 旧存留)/ architecture 273 文件 0 违规(gen-event-matrix.mts 471 行、config.ts 265 行均 <500)/ protocol:check 58 方法 21 事件 + event-matrix:check 25 事件 / 单测 355 全绿 / smoke:p0 16 子冒烟全回归。f) 文档:04 §5.4 config dump 新节(归并链/来源标签/--default-only/安全)+ §6.3 门禁 6 双生成物、06 §3 生成物指针(语义权威仍在 06)、07 §11.2 T5.5 行实施注记、README M5 行 + CLI 命令表 config dump 行、testing.md(355 + cli config-dump 覆盖行 + event-matrix:check 门禁行)、PROGRESS §1/§2/§3/§5。 -
[2026-10-05] T5.4 compact 预剪枝(07 §11.2;协议零变更 58 方法/21 事件)——a) storage:
compaction.pruned事件常量 +CompactionPrunedPayload/Replacement类型(storage 级事件同 compaction.applied 先例:不经 RPC 发布、不携带 epoch 不推进压缩代次)+ jsonl-resume 重放applyCompactionPruned(按sourceMessageId回指定位原文、内联prunedContent同 id 新对象替换、index 稳定不增删——full compactsummarizedCount位置截断语义不受影响;宽松校验缺字段/非法值/原文不可定位逐项忽略不中断重放)。b) agent-core:新compact/microcompact.ts——常量齐 ZCode/dsh 参照(阈值比 0.9/保留 5/min savings 256/单条 8192·head 4096·tail 1024/白名单 read·bash·grep·glob·web_fetch);resolveMicrocompactConfig构造期 fail-fast 校验(head+marker+tail ≤ 单条阈值 = 单过收敛不变量静态保证);pruneToolResultTexthead+marker+tail 按 code point 切分不劈代理对(Array.from,字素簇切开与 dsh 同口径申报);planMicrocompact纯函数单过计划(候选=role tool+string content+非 error+白名单内(工具名自 assistant tool_call 块回查)+超阈值+未剪枝,保留最近 N 条,tokensSaved=floor(剪除 cps/3) 整 pass all-or-nothing);MicrocompactService.maybePrune(压力确认=估算 ≥ 0.9×full 线才剪——full 线经CompactionService.fullCompactThresholdTokens单一事实源(失败上调 0.9 联动);fire-and-forget 事件经单写者链落盘,重放为真源两向收敛)。c) turn-loop 接线:runCompactionBoundary替换两处maybeTrigger直调点(组装上下文前/T13 聚合后)——先 micro 后 full,应用后节省 tokens 回落lastPromptTokens(最近真实请求含未剪枝原文),预剪枝足够时 full compact 让位;replaceAt宿主方法(同 id 新对象就地替换);压缩锁括弧协议兼容=不取去重锁、不 bump epoch、不产生 compact.started/completed。d) server:CompactionOptions.microcompact选项透传(agent-service options 类型 +buildCompactionOptions)。e) 测试 +20 共 348:agent-core microcompact 17(配置校验三面 / 收敛不变量+锚点+标记 / ≤ 阈值不动 / emoji 骑 head 边界完整+无代理区裸项 / 白名单外·isError·未超阈值·已剪枝重入跳过 / 候选全落保留区不剪 / 保留 5 剪 2+工具名回查+账目 / below_min_savings / not_triggered 双路径 / 压力确认应用+回指 payload / enabled:false+幂等)+ storage jsonl-resume-prune 3(回指替换 / 宽松校验八种非法形态 / 与 compaction.applied 先后位置截断一致)。f) smoke:compact 扩展 case D/E(AE 五用例):D 预剪枝端到端——白名单内 read 大结果(1540 cps)T13 边界剪枝(节省 366 tokens 回落 usage 估算 350→0 后 full compact 让位不触发)+ events.jsonl 原始行回指校验(sourceMessageId/charsBefore/charsAfter/prunedContent/tokensSaved 账目)+ resume 重放按回指替换为同一剪后内容 + 下一请求模型所见一致;E 白名单外不动(compactableTools 限 bash,read 原样保留无剪枝事件)。g) 门禁:typecheck 14 项目 / lint 0 error(11 warning 旧存留非本轮文件)/ architecture 270 文件 0 违规(turn-loop.ts 首跑 537 行超限 → 压缩服务装配编排与 CompactionHost/MicrocompactHost 宿主桥下沉E)、PROGRESS §1/§2/§3/§5。compact/wiring.ts(TurnCompactionBridge + TurnCompactionRefs 窄引用面),循环不再持有压缩面细节)/ protocol:check 58 方法 21 事件零变更 / 单测 348 全绿 / smoke:compact 五用例 + smoke:p0 全回归。h) 文档:02 §1.2.5 microcompact 段(常量表+四机制约束)、05 §4.2 compaction.pruned 约定行 + §4.4 恢复流程回指替换注记、07 §11.2 T5.4 行实施注记(偏差申报:不做 ZCode 绝对 2000-token buffer;sourceEventSeqs→sourceMessageId 形态申报)、README M5 行、testing.md(348 + 覆盖行 + smoke:compact A -
[2026-10-05] T5.3 记忆与历史检索增强(07 §11.2;协议零变更 58 方法/21 事件;不做 embeddings——01-PRD §1.6 定论)——a) storage history FTS part 级索引:004 迁移新建
history_parts(消息 part 级:text 块正文 + tool_call 工具名;tool_result 正文与 reasoning 不入索引,02 §7 口径;UNIQUE(session_id,seq,part_index))+history_ftstrigram external-content 虚表 + insert/delete 触发器(同 memory_fts §5.3 形态)+ memory_entries.scope 列预留(ALTER TABLE ADD COLUMN scope TEXT DEFAULT 'workspace',跨项目全局条目存储位,业务不接线)。b) versioned 增量迁移(history-search.tsHistorySearchRepo):正文真源仍是各会话 events.jsonl(05 §1.2 派生索引不双写)——检索前按 workspace 全会话自 settings 键history.idx.<sessionId>(JSON{v,offset})记录的字节偏移增量续扫;HISTORY_INDEX_VERSION漂移 → 整会话删除重扫;进度损坏按未索引自 0 重扫;INSERT OR IGNORE+ UNIQUE 使重扫/并发回填幂等;Buffer 层 0x0A 分界半行尾不推进偏移(多字节安全,补齐后恰好索引一次);文件短于记录偏移(外部截断)钳制自 0;写入方唯一 = HistorySearchRepo。c) 检索 API:Storage.searchHistory(workspaceId, query, opts)——查询按空白切词、逐词 phrase 转义(内部引号双写,防 FTS5 语法注入)、词间 OR(多词部分匹配可召回,bm25 排序);3x 过取样 + 相对分数地板(仅保留 |bm25| ≥ top×0.15——BM25 绝对阈值随语料尺寸漂移不可用,MiMo-Code 调研经验 docs/research §2.1);命中带相对分(|bm25|/top,1.0=最优);<3 code point 或 FTS 空结果 → LIKE 兜底(ts DESC,同 memory 召回口径);excludeSessionId 排除当前会话(实施注记已申报 07 行:当前回合全文已在模型上下文,自指命中以短文本优势占 top 位属纯噪声;已知取舍 compact 后同会话早期原文不可经本 API 召回,M6 可议开关)。d) 全局记忆双层注入:memory 包loadGlobalMemory(dataRoot)(<RAINCODE_HOME>/MEMORY.md,缺失/空白 exists:false 无模板骨架——不向每个项目注入空模板噪声);servermemoryLoopEnhancements组装 global 先 workspace 后(各自标题行,空行分隔;项目层模板兜底语义不变);06 §2.6 memory.read 零改动(全局层仅经系统提示注入露面)。e) session_search 模型工具(内置第 12 个,handlers/session-search.ts):metadata 只读零副作用走五级判定快速通道;ctx.searchHistory 通道(tools ToolExecutionContext + agent-core ToolPhaseDepsSessionHistorySearchChannel端口,tool-phase 注入会话归属与 workspaceId)——ToolExecutor ctx 组装补 searchHistory 透传(首跑单测抓出:逐字段构造漏新通道致通道缺省误判 UNAVAILABLE);serverhistory-search-channel.ts薄投影(排除当前会话 + 失败投影 TOOL_EXEC_FAILED ok/code 形态同 expandSkill;agent-service.ts 抽出独立文件为 500 行治理);候选裁剪:命中已排序已地板裁剪 + 工具面再单行化 + 160 字符片段截断 + sessionId/日期出处行;fail-safe:通道缺省 → TOOL_UNAVAILABLE(同 ask_user/skill 口径);UI/CLI 零改动申报:工具卡参数摘要走 summarizeInput v2 未知形状紧凑 JSON 回退(桌面/Web 会话流对未知工具的原生降级面),协议 tools.list 为通用投影无新方法。f) 测试 +18 共 328:storage history-search 10(中英文 part 级 / tool_result·reasoning 不入索引 / workspace 隔离 / phrase 转义引号与 FTS5 语法字面量 / 分数地板裁剪超长弱相关文档·top 相对分 1.0 / 增量续扫不重复 / 版本漂移与进度损坏重扫幂等 / 半行尾补齐恰好索引一次 / LIKE 兜底 score null / excludeSessionId 双路径)+ tools session_search 5(格式化单行化截断 / 空结果占位 / 通道缺省 UNAVAILABLE / !ok 域码投影 / query·limit 透传)+ memory global-memory 3(缺失无模板 / 原文读回 / 空白跳过);smoke:memory 扩展 case H/I(AI 九用例):H 全局记忆双层注入(system 含全局标题行与内容且先于项目层)+ I session_search 端到端(tools.list 可见 + 种子会话历史 → mock LLM 发起工具调用 → 命中计数/出处 sessionId/正文片段回传续答收束)——入 smoke:p0 回归链 16 子冒烟。g) 门禁:typecheck 14 项目 / lint 0 error(11 warning 旧存留,全部非本轮文件)/ architecture 266 文件 0 违规(agent-service.ts 519 行超限 → 检索通道装配抽I);PROGRESS §1/§2/§3/§5。history-search-channel.ts)/ protocol:check 58 方法 21 事件零变更 / 单测 328 全绿 / smoke:p0 全回归(两处冒烟夹具随内置工具与迁移面貌同步:smoke-tools 内置清单断言 11→12(T5.3 增 session_search);smoke-migrations t3 存量库模拟降版本行version=3→version>=3并连带 DROP 004 表——旧夹具在多版本迁移下 MAX(version) 仍为 4 致 003 不回放,属夹具随 schema 演进更新的应然面,非产品缺陷)。h) 文档:02 §2.3 工具表 + session_search 行、§7.4 两表行(全局记忆缺失 / 历史检索空结果)+ 「检索结果与模型所见一致」不变量段(同一真源同一路径、UI 与模型工具面禁旁路、排除当前会话口径、双层注入顺序、scope 预留);05 §2.1 目录布局 + MEMORY.md、§3.9 scope 列、§3.12 history_parts/history_fts 新节、§5.4 历史检索查询示例(OR 短语 + 过取样地板 + LIKE + 排除当前会话)、§8 对照表两行;07 §11.2 T5.3 行实施注记;README M5 行 + 工具计数 12;testing.md(328 + storage/tools/memory 覆盖行 + smoke:memory A -
[2026-10-05] T5.2 沙箱 enforcement 上报(07 §11.2;协议零变更 58 方法/21 事件)——a) shared:
schemas/config.ts增sandboxEnforcementSchema = z.enum(["full","partial"])(自报语义注释:绝对边界方为 full,应用层约束与环境隔离一律 partial——02 §5.1「约束非隔离」口径 + dsh 纪律「绝对边界不得当作 full」)。b) 四执行域自报(Executor接口增readonly enforcement):LocalExecutor=partial(约束非隔离,同构 dsh Windows ACL 档先例)/ DockerExecutor=full(workspace 独挂 + 缺省--network none的绝对 fs 边界;bridge 属显式网络面放宽,fs 边界不变)/ WslExecutor=partial(偏差申报:07 §11.2 初稿 wsl=full,但 02 §5.1 与 executor 头注明言 WSL 环境隔离非安全边界——发行版 fs 完整可见、/mnt/* 主机盘可达、网络开放,按「绝对边界不得当作 full」如实自报 partial;07 行已补偏差注记)/ SshExecutor 构造器注入(缺省 partial)——远端 enforcement 探针SandboxProbes.sshEnforcement?(07「按远端探测」面:返回 full 仅当远端具备绝对边界机制,undefined/抛错=探针不可得 → partial;v1 缺省探针不实现——远端无沙箱机制,可注入替身供矩阵单测),经resolveSandboxExecutorssh 分支注入。c) bash 结果 metadata 持续携带:BashData增enforcement(前台 +runInBackground双路径,与data.sandbox同层);非 local 域内容首行扩为sandbox: <kind> (enforcement: <mode>)(local 保持无头行 P0 字节兼容,数据面已携带;模型可见面由拒绝标记补足)。d) 模型可见拒绝标记:ToolExecutor.errorResult中央接线——TOOL_PATH_ESCAPEDmessage 统一追加[sandbox: path access denied under partial mode] retry with a workspace-relative path if intended(新sandbox/enforcement.tshelper,dsh 同款格式;恒 partial:path-guard 为应用层预检(02 §5.1 约束非隔离),拒绝发生在投递前与执行域是否 docker 无关;message 已含[sandbox:不重复追加;中央接线自动覆盖全部 guardPath 拒绝点与未来新增处理器,content=${code}: ${message}同步可见)。e) 测试 +5 共 310:executor.test 增「T5.2 enforcement 自报矩阵与拒绝标记」——四域自报矩阵(wsl=partial 锁偏差口径)/ ssh 探针可得注入 full + 未实现/抛错 partial / docker·wsl·ssh 不可用回退 local=partial / PATH_ESCAPED 标记恰好一次 + 自带标记不重复 + content 可见 + 非 PATH_ESCAPED 无标记;既有 4 断言同步头行新格式与 data.enforcement(ssh/docker/local/后台)。f) 冒烟扩展:smoke-ssh A 探针增enforcement=partial断言(远端探针不可得缺省面)+ B 端到端增tool_call.completed首行 contentPreview 标注断言——smoke:p0 16 子冒烟全回归绿。g) 门禁:typecheck 14 项目 / lint 12 warning 基线 0 error / architecture 260 文件 0 违规(executor.test.ts 首跑 502 行超限——桩工具两工厂合并为makeDeniedTool(code, message)收敛)/ protocol:check 58 方法 21 事件(零变更)/ 单测 310 全绿。h) 文档:02 §5.3(Executor 接口增 enforcement 字段 + kind 联合类型顺带补 ssh 修漂移 + 新增「enforcement 自报与模型可见性」段落)、07 §11.2 T5.2 行偏差申报注记、README M5 行、testing.md(310 + executor 覆盖行 + smoke-ssh 行)、PROGRESS;06 零改动(协议与 ToolResult schema 未变,行为文档归 02 §5.3)。 -
[2026-10-04] T5.1 hooks 生命周期 v1(07 §11.2 / 06 §2.12 v1.12 additive:58 方法 / 21 事件)——a) shared 协议层:
schemas/hook.ts新建——hooksFileSchema(user/project 双源 hooks.json,CC 兼容形态{hooks:{<Event>:[{matcher?,hooks:[{type:"command",command,args?,timeoutMs?,async?}]}]}},读 strip/写 strict)/ hookInputSchema(stdin JSON 契约,session_id snake_case 别名)/ hookOutputSchema(strict:continue/reason/decision(approve|block)/systemMessage/suppressOutput/additionalContext/hookSpecificOutput.permissionDecision(allow|ask|deny);exit 2 = 显式 block;空 stdout = no-op;非 JSON/schema 不符/超时/其余非零 = failed 告警不阻塞)/ hook.started+hook.completed 事件(EVENT_SCHEMAS 登记,rpc 投影)/ hook.invoked+hook.result log-only 审计对 schema(不进 EVENT_SCHEMAS,stderr 截断 ≤500 落盘,dsh 语义)/ hooks 域 3 方法(hooks.list 双源投影+授信状态、hooks.trust.grant 绑定配置 digest、hooks.trust.revoke);TOOL_ERROR_CODES 增 HOOK_DENIED;LoopEvents 增 emitAudit(log-only:seq 同链落 JSONL 不发布);SettingsRepo 增 del(授信撤销)。b) agent-core hooks 引擎:hooks/runner.ts(runHook:node child_process spawn argv 直执行不经 shell、stdin 单 JSON 后关闭、stdout/stderr 32768 字节捕获上限、timeoutMs 缺省 60s→SIGKILL、引擎永不抛);hooks/dispatcher.ts(HookDispatcher:hook.started → hook.invoked(audit) → port → hook.result(audit per hook) → hook.completed 事件链 + additionalContext provenance 缓冲([hook:<phase> via <hookIds>])+ 热路径护栏(plan 空 = 零事件零审计)+ port null/抛错 no-op 收敛);hooks/types.ts(HooksPort 窄端口:配置装载/trust 重验/进程编排全在实现侧);SessionTurnLoop 选项增 hooks 端口(构造期建 dispatcher 单点)+ 四生命周期接线——UserPromptSubmit 于输入落库后模型请求前(block → settler.failed HOOK_BLOCKED,顺带补状态机 ProcessingInput request.failed 合法迁移)、Stop 于纯文本收束前(v1 无续跑语义,blocked 不改收束)、PreToolUse 于 zod 校验后权限判定前(block → TOOL_HOOK_DENIED 不进审批闭环)、PostToolUse 于结果落库后逐实际执行调用(v1 非阻塞);assembleChatMessages 增 hookContext 注入(先于 steering);phase 状态机 +1 迁移;Options 接口拆turn/loop-options.ts、tool-phase 工具函数拆turn/tool-phase-util.ts(500 行治理)。c) server HooksRuntime(hooks-runtime.ts,agent-service/nodehooks:{}装配 + create/resume 双路径接线):双源装载 stat(mtime+size)重验缓存(热路径 dispatch 只付两次 stat,NFR-2 护栏)、坏文件降级 error 注记不阻塞、project trust 每 dispatch 前重读 settings 比对 digest(授权决定绝不缓存,撤销/改文件立即生效;键hooks.trust.<workspaceHash>)、matcher 语义(Pre/Post 对 toolName、UserPromptSubmit 对 prompt、Stop 恒匹配、非法正则 fail-closed 不匹配)、async hook 触发即返完成仅补审计、first-block-wins 聚合 + additionalContext 执行序拼接;方法表 hooks.list/grant/revoke。d) 双端投影:desktop/web session-view reducer 增 HookItem(hook.started running → hook.completed 终态,invocationId 配对)+ ChatFlow hook 执行行(拦截/失败警示色);未知事件忽略口径不变。e) 测试 +30 共 250:agent-core hooks-runner 13(契约矩阵:block 三来源/exit 2/空 stdout/坏 JSON/strict schema/超时/stdin 回读/stderr 捕获/spawn 失败/60s 常量)+ hooks-dispatcher 6(事件配对/审计对+截断 500/skipped_untrusted/provenance drain/热路径护栏/port 异常收敛)+ server hooks-runtime 10(fast-path/user 源/PreToolUse block/matcher 命中与跳过/坏文件降级+list 注记/trust 闭环:未授信跳过→grant 生效→revoke 立即失效→digest 失效/list 投影/grant 无配置拒绝/async 补审计);smoke:hooks新建(mock LLM + 临时双源 hooks.json + rpc 客户端):①PreToolUse deny 真实拦截(TOOL_HOOK_DENIED + hook.completed(blocked),default-allow 政策证明拦截先于权限)②additionalContext provenance 注入(mock 请求体[hook:UserPromptSubmit via ...])③超时+坏 JSON 容错(timed_out/failed 不阻塞工具照常执行 + stderr 截断 ≤500)④授信闭环(skipped_untrusted → grant 后 UserPromptSubmit block → turn failed HOOK_BLOCKED → revoke 立即失效)⑤审计对落盘(JSONL 含 hook.invoked+hook.result)+ 附加 hooks.list 双源投影;入 smoke:p0 回归链(16 子冒烟);smoke:tools/kernel/compact/permission/skills/subagent/mcp/stdio/plugin/ssh 全回归绿。首跑修出两真缺陷:①untrustedSkipped 误计整个配置文件(其他事件的 hook 也发 skipped_untrusted 事件)→ 改只计当前事件命中面(countGroups);②UserPromptSubmit block 经 settler.failed 从 ProcessingInput 触发 request.failed 非法迁移 → IllegalPhaseTransitionError 噪音 + 错误码退化为 TURN_INTERNAL → 状态机补合法迁移后 HOOK_BLOCKED 直达(smoke 断言 error.code 锁定)。f) 文档:06 §2.12 hooks 域(§2.13/§2.14 顺延 + §8 自检引用同步)+ §3.2 D 组事件与 log-only 审计对注记 + §4 错误码 TOOL_HOOK_DENIED/HOOKS_CONFIG_INVALID 段 11 + §7.5 v1.12 + 生成目录计数、protocol-catalog.md gen 同步(58/21)、07 头部协议口径、README M5 进度、testing.md(250 + smoke:hooks 行 + p0 链)、PROGRESS §1/§2/§3/§5。门禁:typecheck 14 项目 / lint 12 warning 基线 0 error / architecture 242 文件 0 违规 / protocol:check 58 方法 21 事件 / 单测 250 / smoke:p0 全回归。PermissionRequest hook / permissionUpdates 动态权限规则留 M6+(07 §11.5)。
- [2026-10-04] M5 规划轮(三仓调研 + 01-PRD v1.1 登记 + 07 v1.2 §11 排期)——a) 三仓参照系只读调研(三个调研子代理并行 very thorough,结论逐条落证据路径;仓库均已克隆至工作区并加入 .gitignore 不入库):报告 docs/research/2026-10-04-m5-reference-repos.md——MiMo-Code(小米 OpenCode fork,Bun+Effect,29.6 万行:FTS5+BM25 记忆/历史检索全套 + 相对分数地板与 3x 过取样经验、gate.ts 工具 FIFO 闸门+fail-cascade、三层记忆文件+结构化 checkpoint 模板、Dream/Distill 自我改进、mcp_tool_search BM25 延迟加载、Goal/Stop judge、pinned 包管理器教训);deepseek-harness 二轮(首轮 2026-10-03,本轮只做 M5 五候选机制级增量:hooks=CC/Codex 兼容桥 + log-only 审计事件对、enforcement full|partial 落地细节与 Windows ACL partial 先例、回放三层基建与「回放格式=日志格式本身」、dump-config 静态列层、compact pruner 三不变量+shadow-price、spill 溢出家族、jobs 完成通知注入、per-file 覆盖豁免 membership contract、无 embeddings/无全局记忆/无 session.delete 澄清);ZCode(同构度最高参照系,76 万行:hooks 全解 7 事件+JSON 输出契约+project trust 每 dispatch 重验、skills 渐进加载与 marketplace 三层分发、microcompact 常量、rewind checkpoint、esbuild 三件套 metafile 校验、architecture-policy 声明式治理;避坑:双 workspace zod 双实例 / 测试近乎清零不可照抄 / ui 包失控样本);七条共性定论(调研报告 §1):embeddings 三仓均无→FTS+BM25 路线够用、hooks 两仓成熟→M5 主菜、compact 预剪枝两仓同题互证、IDE 接入正姿=ACP 标准协议、守护进程无共识形态、回放先做事件矩阵、权限语义对照出差距;b) 01-PRD v1.0→v1.1:§1.5 里程碑表增 M5 行 + §1.6 M5 增补范围登记(纳入 T5.1
T5.7 / 明确不做清单 / M6+ 指针)——07 §10.5 纪律「排期前先修订 01-PRD」就此闭环;c) 07-dev-plan v1.1→v1.2 增补 §11 M5「扩展机制与上下文治理」:T5.1 hooks 生命周期 v1(69 人日:四事件+command 类型+JSON 输出契约+project trust 授信每 dispatch 重验+provenance+审计事件对,协议 additive v1.12)/ T5.2 沙箱 enforcement 上报(23:full|partial 工厂自报+工具结果持续携带+模型可见拒绝标记)/ T5.3 记忆与历史检索增强(46:history FTS trigram+相对分数地板+全局记忆双层注入,不做 embeddings)/ T5.4 compact 预剪枝(35:microcompact 常量+sourceEventSeqs 回指+单过确定性收敛)/ T5.5 config dump+事件矩阵(23:静态归并来源标签+--default-only 诊断+T4.3 管线扩展)/ T5.6 MCP 工具目录化(34:BM25+mcp_tool_search,可裁)/ T5.7 工程收尾+遗留批次 C(35:CLI esbuild L-16 核销+SSH base64 加固+L-14/L-01 复查,可裁);2335 人日、门槛 T5.1T5.5(17~26)、裁剪次序 T5.6→T5.7→T5.5→T5.4、验收清单七项 + §11.5 M6+ 候选沉淀(marketplace/ACP/守护进程/回放 lane/spill/Goal judge/工具闸门/last-match-wins 等五族)+ §10.5 处置表(11 项候选逐项排期/缓议/不做去向)+ §10.1 §10.6 笔误修正;d) 文档收口:PROGRESS §1/§2(M4 行「已排期」→「✅ 完成」收口漂移 + M5 行已排期)/§3/§5、README 当前状态行、docs/README 调研索引、.gitignore(MiMo-Code/ ZCode/);legacy-items 台账 21 项原样保留(待收口 0 · 环境门控 2 · 申报性 5 · 运维 1),M5.7 遗留批次 C 承接 L-16 核销与 L-14/L-01 复查;纯文档零代码改动。
-
[2026-10-04] T4.8 遗留收口批次 B(L-02/L-03/L-15 执行收口 + L-14 矩阵自动化 + L-01 保留口径复测;环境门控批次不计门槛,执行留存 docs/benchmarks/m4-2026-10-04.md)——① 五 Provider 连通矩阵自动化(L-14 承接):
smoke:remote矩阵化重写——读config/remote-providers.local.json(gitignored 矩阵形态 {providers:[{name,baseURL,model,apiKey,timeoutMs?,disabled?}]},缺失回退旧单条形态)逐条「临时 RAINCODE_HOME → env 注入 → 进程内 CLI run → exit 0/非空回答/apiKey 零泄露」+ 矩阵汇报;实测 2/5 连通(aliyun-qwen qwen3.7-flash 1.2s / ollama-local qwen3:1.7b 44s 经 OpenAI 兼容端点),OpenAI/DeepSeek/Kimi/GLM 密钥不可得按保留口径申报(密钥到位即入阵)。② 真实仓库 Bug 修复端到端样例(L-15):minimistjs/minimist v1.2.5(真实 CVE-2021-44906 原型污染,复现形态经 1.2.5/1.2.6 差分电池实证唯一命中)+ 复现脚本(缺陷在位 exit 1)+ 真实 Provider qwen3.7-flash CLI chat 会话(管道预置审批 B5 LineChannel 通路)——agent 独立完成复现→定位(setKey 仅拦 proto)→修复(两行扩展 constructor/prototype 拦截)→复现转绿→结构化汇报,仓库完整 tap 套件 160/160 全绿;偏差申报:agent 修复比上游 1.2.6 更严格(constructor/prototype 全拦),本仓库回归不受影响;首跑发现run模式不带 --yes 时审批策略为自动拒绝(06 §2.10 非交互语义),预置应答通道仅在 chat REPL。③ 场景 6 真实 MCP 任务样例(L-03):@modelcontextprotocol/server-filesystem 官方包(npm 临时安装 node 直跑 stdio)+ 真实 Provider 周报汇总任务(提示词约束走 mcp__filesystem__ 前缀)——transcript 证据 read_text_file×4/read_multiple_files×2/write_file×6/edit_file×3 + 10 次审批闭环 + summary.md 落盘内容逐条核对(N-3);预置应答耗尽后 EOF fail-safe deny 干净退出(B5 语义真实会话再现)。④ SSH 真实执行域端到端(L-02):真 OpenSSH 服务端/真 Linux 主机不可得(已知远端主机 BatchMode 实测 Permission denied + 本机无 sshd 且无管理员权限)→ loopback 真 SSH2 协议服务端(ssh2 npm:密钥交换/公钥认证/exec 通道真实线上协议)+ 一次性 ssh-keygen 密钥 + SshExecutor 经真 OpenSSH ssh.exe 客户端——scripts/smoke-ssh.mts5 断言全绿入 smoke:p0 回归链(15 子冒烟):A 探针 kind=ssh / B 回合端到端(cwd 映射线上核对 + 远端落盘 N-3)/ C env 注入 / D 错误密钥 fail-closed 回退 / E 本地审计(T3.2);修出真实缺陷:SshExecutor.run/spawn argv 裸 join 成 shell 命令串——Windows 反斜杠路径被 bash 转义吃掉 + 远端命令 && 被本地 shell 截断(m3 argv 级断言测不出),修复 = join 点 shell 单引号包装(bash/PS 双字面语义)+ 测试断言同步,归位 N-5 新案例(argv 世界 ≠ shell 字符串世界);残留申报:远端命令内嵌双引号经本地 shell 消耗一层转义(base64 包装加固列 M5+ 候选)。⑤ L-01 复测申报:docker CLI 缺失 / wsl 无发行版 / 无管理员权限——保留口径不变。⑥ NFR 抽查(07 §10.4):NFR-1 478.5ms(≤2s)/ NFR-2 P95 2.0ms(≤300ms)/ NFR-4 复跑达标;M4 验收清单七项核对全达成(m4 报告 §7)。门禁:typecheck 14 项目 / lint 12 warning 基线 0 error / architecture 230 文件 0 违规 / protocol:check 55 方法 19 事件 / 单测 220 ✅ / smoke:ssh ✅ / smoke:remote 2/2 ✅;test/smoke 由 CI 六门禁复跑把关。 -
[2026-10-04] T4.7 遗留收口批次 A(L-04/L-05 核销 + L-21 复核收口)——① dist 产物落地(L-04):
apps/desktop/scripts/prepare-native.mjs(electron-ABI 原生模块暂存——better-sqlite3 在 dev 树为系统 node 编译而 packaged agent 走 ELECTRON_RUN_AS_NODE,ABI 号经 electron 二进制process.versions.modules实测;按依赖链穿透 pnpm 符号链接拷贝运行时闭包 better-sqlite3→bindings→file-uri-to-path;gh-proxy 下载 electron prebuild 覆盖 build/Release;中性 cwd 探针自检——探针 cwd 在仓库内会先命中 dev 树副本造成假红/假绿)+dist.mjs(gh-proxy 镜像 env 兜底 ELECTRON_MIRROR/ELECTRON_BUILDER_BINARIES_MIRROR;winCodeSign 缓存预填充——7z 内 darwin 符号链接解包需管理员特权且对 Windows 未签名构建无用,容忍该两项失败 + Windows 侧关键文件校验)+electron-builder.yml(agent 目录 asarUnpack 成真实文件 + extraResources 分发暂存副本;移除无可匹配文件的死 asarUnpack 规则)+main.ts打包分支重写(asar 虚拟路径不可作 spawn cwd 的 ENOENT 修复:入口/migrations 取 app.asar.unpacked 孪生路径、cwd 取安装根 dirname(process.execPath)、NODE_PATH 注入 electron-ABI 副本回退解析不遮蔽 dev 树)→ nsis 产物 RainCode-Setup-0.1.0.exe 落地 + 静默安装(/S /D=)+ walkthrough-desktop 安装目标 14/14 全绿(含 mock 会话全链路,M4 验收清单场景 3);walkthrough-desktop 重构:Cdp 客户端与 DOM 助手提取scripts/cdp-lib.mts共享件 +RAINCODE_WALKTHROUGH_APP_PATH安装目标参数(首跑发现走查自身 dev 分支丢 app 路径参数——electron 启动 default_app 假象,guard 当场变红)。② Web 真浏览器走查(L-05):scripts/walkthrough-web.mts19 断言两轮稳定——真实入口raincode web --static+ Edge headless CDP:A 鉴权(错误 token → fatal「连接被拒绝」+ UNAUTHORIZED 停止重连;正确 token → 已连接徽章);B 会话回合(React 受控 input 原生 setter 写值 + 键盘发送 + message.delta 实时渲染 + session.usage 行);C 审批闭环(write 审批弹窗 → 放行后文件真实落盘 / 拒绝后被拒文件不存在,N-3);D 重连恢复(杀宿主 → 重连态徽章 → 同 home/port 重启 → 退避自动重连 + history 冷重建零交互恢复 + B9 无滞留横幅);web renderer 补window.__raincodeStore走查 aid(与桌面端 main.tsx 同口径)。③ L-21 复核收口:Page.setWebLifecycleState冻结/解冻确定性注入「Edge 后台标签冻结」假说(emulateNetworkConditions offline 只拦新请求不掐既有 ws,实测无效故弃用)——冻结期回合不达(负面断言防平凡通过)→ 解冻零交互补偿拉平 → 在线实时扇出零缺口;假说成立无需修码,协议层用例 E 继续回归。④ 问题归位与文档:§4 新增两条(/json/new&截断 → P-2;打包宿主环境假设族 → 新增 N-5 并入速查表);legacy-items L-04/L-05/L-21 ✅ + 统计行(待收口归零);testing.md(walkthrough:web 行 + walkthrough-desktop 安装目标 + verify-agent-bundle「人工验收」口径核销);README(M4 进度行 / dist 自动化口径 / 双端走查命令);docs/README(defensive-patterns 行 N-1~N-5);门禁:typecheck 14 项目 / lint 12 warning 基线 / architecture 229 文件 0 违规 / protocol:check 55 方法 19 事件一致 / smoke:web 5/5;test/smoke 由 CI 六门禁复跑把关。 -
[2026-10-04] T4.6 防御式模式文档(调研借鉴 #3)——a)
docs/defensive-patterns.md落地:dsh 六条适配 P-1 正交结果独立上报(MCP 失败隔离 / 工具错误数据级回传 / turns_count 逐列维护)· P-2 公共契约两侧遵守(executor ctx 手拷漏字段 / mcp.json 双形态 / stdin 单读方 / 畸形帧双侧处置)· P-3 异步状态不是同步状态(审批快照执行 / seq 缺口锚点与基线防回退 / 端侧视图是缓存)· P-4 dispose 必须达到静默(close 四步曲 T4.2 / readline close 雷 T4.9 B5 / 孤儿进程收割 L-17 / 容器清理 T3.1)· P-5 派发器收容回调异常(域 init 降级不崩溃 / 插件 failed 隔离 / 抽取与压缩钩子失败跳过)· P-6 不给不可信输出环境变量或可预测路径(SSRF fail-closed / 路径逃逸防护族 / apiKeyRef 秘密治理 / 插件 metadata 缺省从严),各条 = 陈述 + 违反症状 + 实战案例(含任务锚点)+ 评审检查点;原生沉淀 N-1 信号分辨率不足叠加第二指标(mtime + size 双指标)/ N-2 断言必须有区分力、测试不得自建平行装配(>= 0恒真与 B2 手装域盲区)/ N-3 验证世界而非自述、guard 只在回归能变红时才叫 guard(调研报告 §4 #3 采纳落地)/ N-4 基准必须测真实存活的进程树(NFR-4 口径申报);§0 问题记录格式(症状 → 根因 → 处置含归位编号与修复锚点,PROGRESS §4 后续按此沉淀)+ 附提交前自评审速查表;b) 接入:docs/README 过程资产索引、CONTRIBUTING §2 增自评审清单步骤 + §3 问题记录行标注归位编号、testing.md §7 增「护栏必须演示过变红路径」约定、PROGRESS §4 头注指针;c) 顺带收口文档漂移:legacy-items §3 统计行(L-08 已于 T4.5 ✅ 但统计行仍计待收口——待收口 3→2(L-04/05)· M4 执行收口 2→3(L-06/07/08))+ L-17 处置指向已沉淀模式 + docs/README 台账行 19→21 项;d) 纯文档零代码改动:typecheck / lint(12 warning 基线)/ architecture:check / protocol:check 本地绿,test / smoke 由 CI 六门禁复跑把关。 -
[2026-10-03] T4.9 可视化测试缺陷修复批次(B1
B13;测试报告 2026-10-03 Computer Use 三端可视化测试)——a) B1(高)dev 模式 renderer 全挂:@raincode/rpc 直读###### 标题 / | 表格(含分隔行判定)/ - * 列表解析,行内 code/粗体/斜体与 ``` 围栏保持。g) B7(低)CLI reasoning 混流:缺省省略 reasoning delta(每 turn 一次 stderr dim 提示),process.env["NODE_ENV"],浏览器无 process 且 Vite dev 不做静态替换 →BOOTSTRAP_FAILED横幅 + Provider 添加报错 + RPC 全不可用 → validate.tsisDevMode改typeof process守卫(undefined 视为开发,宁多勿漏),client.ts devAssert 缺省经 isDevMode 解析;B13(未配置 Provider 误报)随 B1 收口。b) B2(高)memory 域三端未装配:CLI context / stdio host / web 宿主 / 桌面 agent entry 四入口均只传 skills/plugins/mcp → memory.read METHOD_NOT_FOUND(记忆管理器 UI 全挂)且 README 承诺的 MEMORY.md 注入 / 会话抽取 / 晋升草案在真实入口全部失效(单测冒烟自建节点手装 memory 域造成测试盲区)→ 四入口补memory: {}(CLI 有 --workspace 时含 workspaceRoot);Web 记忆管理器可视化复验:三栏真实渲染(分桶 / MEMORY.md 预览 / 草案区),零报错。c) B3(中)多连接扇出:协议层复验本就正常——smoke:web 增用例 E(双 createReconnectingRpcClient 浏览器同构路径:B 经 resume → setSeqBaseline 选中 A 所建会话后,A 的回合 delta/completed/done 实时到达 B,零缺口)+ web-clientsetSeqBaseline基线防回退加固(resume 响应与在途事件竞态时过期 lastSeq 不得回退已观察基线,单测 +1 锁定);真浏览器一次 stale 观测经 node 第三连接探针 + CDP 帧捕获判别:服务端扇出正常、帧到达浏览器页面,最可能根因为 Edge 后台窗口标签冻结(JS 挂起、唤醒后 resume 补偿拉平——与原报告「手动重选恢复」吻合),按 L-21 观察项登记(挂 T4.7 真浏览器走查复核)。d) B4(中)桌面审批快捷键失效:审批弹出时消息输入框保持焦点,keydown 守卫「输入控件聚焦不响应」使 1-4/Esc 全落输入框 → 弹窗挂载时ref.focus()接管焦点(tabIndex=-1 + outline-none),键盘直选恢复。e) B5(中)CLI 管道输入丢失 + 退出噪音:readline/promisesquestion()在无挂起读取时到达的行被直接丢弃(预置审批应答「1」必丢)→ chat.ts 新 LineChannel(常驻 'line' 监听 + 队列,stdin 单读方;首跑发现第二根因:readline close 后prompt()内部 resume() 抛 ERR_USE_AFTER_CLOSE——next() 须先消费队列/判定 EOF,仅挂起等待时才渲染提示);EOF 主循环干净退出(exit 0)、挂起审批即时 fail-safe deny、ask_user_question 应答经同一通道(ApprovalMode.interactive 增可选 answer 回调);PC_GRANT_NOT_FOUND 降级为说明非报错。真实 Provider 管道复测:预置「1」即时审批通过 → 文件落盘 → exit 0,stderr 零噪音。f) B6(低)markdown 块级渲染:桌面 MessageBubble 与 Web ChatFlow(按端最小实现,04 §2.3 政策)增 #RAINCODE_CLI_SHOW_REASONING=1/true恢复逐条输出(与桌面/Web 仅渲染 content 对齐,stdout 纯净)。h) B8(低)风险徽章 i18n:Web 审批弹窗 riskLevel 直出英文 → 与桌面端同文案映射(高风险/中风险/低风险,未知值原样);可视化复验「中风险」徽章 + 键盘 1 放行 + 工具 ok。i) B9(低)Web 首载竞态横幅:bootstrap 在 ws 握手完成前调 refreshLists → TRANSPORT_CLOSED 横幅驻留 → refreshLists 对 TRANSPORT_CLOSED 静默(ready 后自动重试)+ ready 时清 error;新窗口首载无横幅复验 ✅。j) B10(低)插件刷新语义:新增 `plugins.rescan`(协议 v1.11 additive,55 方法)——运行时重扫描 plugins 目录装载新拷入插件(仅新增目录不重载已有、激活走既有 failed 隔离、幂等);双端扩展面板「刷新」= rescan + 重拉;smoke:plugin 增 case D(新目录装载 / 幂等 / 状态事件)+ 可视化复验免重启装载 active。k) B11(低)README 快速开始 cwd 口径:provider 配置按 `/config/` 解析而 `pnpm --filter` 的 cwd 是 apps/cli → README 补位置说明与 `node --import tsx apps/cli/src/index.ts` 根目录直跑方式。l) B12(低)会话列表口径:设计确认(数据根全量会话跨端可见是特性),README 口径化 + legacy-items L-20 申报保留。m) 测试 +1 共 220(web-client 基线防回退);smoke:web 4→5 用例、smoke:plugin 3→4 用例;协议目录 gen 同步(55 方法)。n) 文档:06 §2.10 plugins.rescan 行 + §7.5 v1.11、README(协议 55 方法 / 快速开始 / 插件发布刷新语义 / 审批焦点 / 会话列表口径 / RAINCODE_CLI_SHOW_REASONING)、testing.md(220 / 用例 E / case D)、07-dev-plan §10.2 T4.9 行、legacy-items L-20/L-21、PROGRESS §1/§3/§4/§5;六门禁全绿 + 桌面走查 14/14(B2 装配后记忆管理器可达)+ CLI 管道真实 Provider 复测。 -
[2026-10-02] T4.5 Web 端管理面板对齐(L-08 核销)——a) 复用策略登记(policy 先行,04 §2.3):多端 UI 采用按端最小实现、不抽公共 renderer 子包——复用粒度是协议与方法表 + 会话状态机语义(session-view 同构 reducer)而非组件树;理由:双端设计令牌不同(desktop
bg-panel/text-hi/dotvs webink-*简化盘),统一令牌属设计系统立项且有回归已验收桌面 UI 之险;第三端或令牌统一立项(M5+ 候选)时再抽packages/renderer——预留缝而非提前抽象。policy.yaml app-web requires 增 shared(仅类型依赖,dev 依赖构建期擦除)。b) 四面板落地(web 令牌,与桌面端同 RPC 面):记忆管理器(MEMORY.md 预览 / 草案确认 / 条目检索与晋升,workspace 未设降级提示);扩展面板(MCP 状态投影/健康检查/启停重试 + 插件启停,域未装配 METHOD_NOT_FOUND 降级,mcp.server_status_changed / plugin.status_changed → store extTick 触发重拉收敛);斜杠命令面板(InputArea/唤起 skills.list 双层清单,↑↓/Tab/Esc/Enter 键盘语义与 IME 守卫同桌面,发送路径 parseSlashInvocation → skills.invoke 展开在 server 侧);用量统计(侧栏 ↑/↓ token/回合数/费用估算行,done 后与切会话/重连恢复刷新 session.usage)。c) 首跑发现并修复 turns_count 恒 0 缺陷:sessions-repo.accumulateUsage 只累加 token,CLI「turns N」/ 桌面「N 轮」/ session.usage.turnsCount 全链路失真(smoke-kernel 旧断言 ≥0 掩盖)——SQL 同语句原子自增 turns_count(completed turn 每回合恰一次 recordUsage),smoke-kernel 断言收紧 ≥1 + storage 回归单测 1 条。d) 验收达成:smoke:web 增用例 D 四面板服务面 4/4(skills.list 双层 source 投影 + skills.invoke 端到端回合 / session.usage 投影 / memory.read 空态→write→回读 + drafts/entries / MCP 连接投影→健康 RTT→启停事件到达→重连收敛 + 插件 active→停用→再激活),入 smoke:p0 回归链;真浏览器走查归 T4.7(L-05)。e) 文档:04 §2.3 端层复用策略 + app-web 行、README Web 节承诺核销(移除「桌面端独有」)、legacy-items L-08 ✅、testing.md(219 / smoke:web 4 用例);门禁:typecheck 14 项目 / oxlint 12 warning 基线 / architecture 227 文件 0 违规(policy 13 模块)/ 单测 219 / protocol:check 54 方法 19 事件一致 / smoke:p0 全回归 ✅。 -
[2026-10-03] T4.4 技能模型侧可发现性(调研借鉴 #1;01-PRD TL-6 实现注记)——a) 系统提示目录注入 + digest 热变更重发布:
SkillRuntime.systemPromptProvider(sessionId, workspaceRoot, basePrompt)返回逐 turn 提供者(SessionTurnLoop 新可选systemPromptProvider,优先于静态 systemPrompt),基础提示(角色 + memory 块,create/resume/fork 三装配点传入)之上追加技能目录块(name/description/argumentHint/source,modelInvocable: false不进模型目录);目录内容每 turn 现扫(同步低频 IO,同 profile 口径),sha256 digest 按会话登记、变化即诊断「重发布」——新技能下一 turn 生效;无技能返回基础提示原样。b)skill内置工具(11 个):{ name, arguments? },readOnly/零副作用/needsApproval=false,展开模板作为工具结果回传、模型同 turn 续答收束;经 ToolPhaseDeps 新expandSkill通道(ask_user 同形态:ports → tool-phase batchCtx → executor ctx 透传——首跑发现 executor.executeInner 显式重建 handler ctx 漏新字段,补透传后转绿)由 server 接线SkillRuntime.expandForModel= skills.invoke 同链路的解析+展开段(展开单点不变,ADR-06 口径);工具调用走标准五级判定链。c) modelInvocable 开关(协议 v1.10,additive):frontmatter 缺省/空 = true,仅接受 true/false 其余 SKILL_INVALID;SkillSummary增modelInvocable(skills.list 投影,面板可见性不受影响);开关只挡模型侧调用(expandForModel 拒绝 → TOOL_PERMISSION_DENIED),斜杠命令不受限。d) 错误投影(错误类不越 port,ok/code 结果形态):SKILL_NOT_FOUND→TOOL_INVALID_INPUT、SKILL_INVALID→TOOL_EXEC_FAILED、开关关闭→TOOL_PERMISSION_DENIED、skills 域未装配→TOOL_UNAVAILABLE。e) 协议目录随 schema 变更protocol:gen同步(T4.3 机制首次实战);测试 +6 共 218:agent-core 开关解析 3 + server skill-tool mock 端到端 3(系统提示目录注入断言 → skill 工具调用展开回传续答收束 / 热变更重发布 / 开关拒绝 + skills.list 投影;请求体捕获式 mock LLM 母版);smoke-tools 内置清单 10→11。f) 文档:06 §2.9 模型侧可发现性段落 + §7.5 v1.10、01-PRD TL-6 实现注记、README 内置工具表 + 当前状态、testing.md 218;门禁:typecheck / oxlint 12 warning 基线 / architecture 223 文件 0 违规(turn-loop 495 / tool-phase 497 / agent-service 500 行上限内)/ 单测 218 / smoke:skills ✅ / smoke:p0 全回归 ✅。 -
[2026-10-03] T4.3 生成式协议目录 + 防漂移门禁——a)
scripts/gen-protocol-catalog.mts(gen /--check双模式,package.json 增protocol:gen/protocol:check):从 sharedMETHOD_SCHEMAS/EVENT_SCHEMAS注册表与五个*_ERROR_CODES常量生成docs/generated/protocol-catalog.md(989 行);zod 3 内省口径——_def.typeName分派渲染、对象经 shape 展开(深度 ≥3 折叠为 object 防爆炸)、约束取 checks(int/min/max/regex/url/email)与 describe() 描述、ZodDefault 读 defaultValue 注记默认值;输出确定性(域与方法、事件排序,无时间戳)——同注册表必得同字节输出,--check 才可判漂移;不直接依赖 zod 类型(scripts 侧最小结构面 SchemaLike)。b) 生成物三节:方法表 54(11 域分节,每方法入参/出参顶层字段表:字段/类型/必填/约束说明)/ 事件表 19(EventBase 三基字段 seq·sessionId·ts 散文声明一次,各表只列特有字段)/ 错误码族 5(SYSTEM 段 0、PC 段 2、MEMORY 段 6、TOOL 段 7、PLUGIN 段 10 常量直读;session/config/mcp/subagent/skills 域为调用点字面量 → 注记 06 §4.3 手写表为权威);文档头声明职责边界:生成物只承载字段/类型/必填/约束,语义、行为、时序、业务码含义仍以 06 手写章节为唯一权威,不一致时以注册表为准修正 06 而非手改生成物。c) CI 门禁 6:ci.yml 五门禁→六门禁(Gate 6/6pnpm protocol:check),本地与 CI 门禁集保持一致。d) 验收达成(07 §10.2):手改生成文件 →--check变红(退出码 1 + 首个差异行定位)→protocol:gen一键再生成恢复绿;协议演进路径 = 改 schema 注册表 → gen 再生成 → 核对 06 手写表。e) 文档:06 §5 增生成式目录注记(演进顺序三步)、docs/README 过程资产索引、testing.md §5 六门禁行、README 当前状态;门禁:typecheck / oxlint 12 warning 基线 / architecture 222 文件 0 违规(+1 新脚本)/ 单测 212 / smoke:kernel ✅;本次无运行时代码改动(纯工具链/生成物/文档),smoke:p0 由 CI 门禁 5 复跑把关。 -
[2026-10-03] T4.2 内核收尾竞态修复(L-06 核销)——a) 根因(§4 2026-09-29 条目的收口):
emitPersisted入队即发布(事实先行=入队先行、完成不等人),node.close()原先service.close()(快速拆除,不等队列)后即storage.close();close 窗口内 serialWrite 队列迟到的持久化任务三条死路——撞在途句柄 EBADF(原报错)/streams清空后经 openSessionStream 重开文件句柄(泄漏 + 写入落在关闭之后)/ db 已关则抛 SQLITE 错;b) 四层修复(方案「close 感知 pending 写 + flush-then-close」并用):①SessionStream流内单写者链——seq 分配与句柄写入同链串行(并发 append 不重号不再依赖调用方自律),close()先设拒绝栅栏再经同链排空在途写后才释放句柄,幂等(closePromise 复用);②Storage关闭栅栏——closing标志使 close 后openSessionStream抛类型化STORAGE_CLOSED(errors.ts 新码),不再重开句柄;Storage.close()同样幂等化;③LoopEvents.flush()+SessionTurnLoop.flushEvents()——排空单写者链(契约:生产方停发后调用,promise 永不 reject);④shutdownService注入排空步——turn 终态(pending 收敛)后先排主会话写链,再 subagent 停止级联 +SubagentRuntime.flushPersist()(子会话循环登记表:终态→自排空→移除,flushPersist 对未终态循环等终态+兜底排空),全部排空后onShutdown才关存储;AgentService.shutdown转公开,node.close()复用 system.shutdown 同一条收敛链(零新增方法,域二次 close 幂等性逐一核验:broker 清空式 / mcp closeAll 断连 catch / plugins stopAll 幂等);c) 复现回归 9 用例:storage jsonl-stream 6(close 排空在途写不丢行且 seq 严格递增 / close 后 STORAGE_CLOSED 拒绝不重开句柄 / close 幂等 / 并发 append 不重号 / Storage 栅栏 / Storage.close 幂等)+ agent-core loop-events-flush 3(emit→flush→close 零告警零丢失含迟到 phase_changed / flush 幂等 / 未 flush 即 close 转类型化告警——旧缺陷路径从 EBADF 竞态变为响亮可诊的 STORAGE_CLOSED);storage 包首开 test 目录;d) 文档:05 §4.3 追加写协议第 1 条 close 排空语义、testing.md 单测 212 + 用例行;门禁:typecheck / oxlint 12 warning 基线 / architecture 221 文件 0 违规(turn-loop.ts 压缩导入块保住 500 行上限)/ 单测 212 / smoke:kernel ✅ / smoke:p0 全回归 ✅。 -
[2026-10-03] T4.1 CI 落地(L-07 核销)——a)
.github/workflows/ci.yml(提交 2cf2cda):windows-latest 主 lane 五门禁(typecheck / lint / architecture:check / test / smoke:p0,与本地门禁集一致)+ pnpm store 缓存(setup-node cache:pnpm)+ push(master)/PR 触发 + concurrency 同 ref 取消旧跑 + job timeout 45min;b) electron 二进制跳过:ELECTRON_SKIP_BINARY_DOWNLOAD=1经锁文件精确版本 electron@33.4.11 install.js 源码核验(检查该变量即 exit(0));desktop 单测与 smoke 全程 node/tsx agent 路径零 electron 运行时依赖 → CI 免 ~100MB 平台二进制下载(完整 dist 打包属 T4.7 批次 A,不入 CI);c) better-sqlite3 预编译 CI 口径:GitHub 托管 runner 直连 GitHub release(prebuild-install 默认主机),仓库 .npmrc 头注的 npmmirror 镜像变量为本机网络口径不适用 CI,预编译不可得时 node-gyp + runner 自带 VS 工具链兜底;allowBuilds(better-sqlite3/esbuild/electron)与 pnpm@11.24.0(packageManager 钉死)保证 CI 与本机装配行为一致;d) 首次运行全绿:run 37107475417(push 触发,head 2cf2cda),步骤级 install 11s / typecheck 32s / lint 1s / architecture:check 1s / 单测 8s(203)/ smoke:p0 23s(14 子冒烟),job 总时长 104s,五门禁步骤逐项 success;README 增 CI badge 常态可见;e) 验收达成(07 §10.2):CI 首次全绿 + 本地与 CI 门禁集一致;本地绿色基线先行复跑(typecheck 14 项目 / oxlint 0 错误 12 warning 基线 / architecture 219 文件 0 违规 / 单测 203 / smoke:p0 全 OK)。环境注记:本机直连 github.com 与 api.github.com 被网络策略拦截(curl 000),push 走 git 通道正常,Actions 状态经 gh-proxy.org 镜像代理 REST API 轮询取证(run/jobs 端点,未动凭据)。
- [2026-10-03] M4 规划与文档补全 —— a) deepseek-harness 只读调研(DeepSeek 官方 agent harness,
319 包 / docs 60+ 主题双语,已克隆至工作区并加入 .gitignore 不入库):报告 docs/research/2026-10-03-deepseek-harness.md——定位/架构(Cordis 全插件树、profile/bundle/patch 组合、model-visible⟺logged 等设计不变量)、与 RainCode 能力矩阵逐维对照、10 项设计思想与 10 项工程实践的采用决策(M4 采纳 4 / M5+ 候选 6 / 不采纳 5 并附理由);b) 遗留项台账建立:docs/legacy-items.md——三里程碑累积遗留 19 项全量登记(M4 待收口 5:electron-builder dist / Web 真浏览器走查 / Storage.close EBADF 竞态 / CI 缺失 / Web 管理面板;环境门控保留 5;申报性保留 9;规划轮就地收口 4),今后新遗留项先登记此处;c) 07-dev-plan v1.1 增补 §10 M4 排期(工程加固与遗留收口,T4.1 CI 落地 / T4.2 close 竞态修复 / T4.3 生成式协议目录+防漂移门禁 / T4.4 技能模型侧可发现性——借鉴 dsh 技能目录注入与 modelInvocable / T4.5 Web 端管理面板对齐 / T4.6 防御式模式文档 / T4.7 遗留收口批次 A / T4.8 环境门控批次 B;814.5 人日;裁剪次序与验收清单;§10.5 M5+ 候选方向登记「P2 后再议」条目);d) 文档漂移修订四处:01-PRD 头部关联文档过时引用(仍写「02-技术架构设计(待撰写)」)+ AC-8 删除语义 archive 注记、04-architecture ADR-02 修订(Ink → readline REPL 中间形态落地事实)、02-module-design / 05-database 实现校准注记;e) README 里程碑行与文档表、docs/README 索引、.gitignore(deepseek-harness/)、PROGRESS §1/§2/§3/§5 收口。
-
[2026-10-03] T3.9 桌面端补齐 + M3 全量对齐验收(07 §4.1 / UI-4 / 07 §4.4 验收清单)——a) 桌面 UI-4 补齐:扩展面板(MCP 服务器:mcp.servers.list 投影 / setEnabled 启停 / health 健康检查 RTT / retry,Failed 行内重试;插件:plugins.list 投影 / setEnabled 启停 / 工具清单;全局事件 mcp.server_status_changed / plugin.status_changed 经 reducer 落 store 活更 + extensionsTick 通道驱动面板重拉——拉取早于域就绪时事件对未知行不可增量补,走查发现);斜杠命令面板(InputArea
/唤起 skills.list 清单浮层,↑↓ + Tab + Esc 键盘导航,发送路径 parseSlashInvocation 纯函数解析 → skills.invoke,SKILL_NOT_FOUND 走错误横条;parseSlashInvocation 名字域 [a-z0-9-] 与 CLI 同语义);用量统计(selectSession 与 done 事件后 session.usage 刷新,侧栏 ↑/↓ tokens / 回合 / 费用估算行);视图联合类型 chat|settings|memory|extensions;b) MCP 域用户入口装配补齐(全量对齐缺口):mcp 域此前仅测试手装、任何用户入口均未装配——CLI in-process(context.ts,--workspace时含 project 层 mcp.json)/ stdio 宿主(host.ts,serve 与桌面 agent 子进程)/ web 宿主 / 桌面打包 agent 入口(entry.ts,skills/plugins/mcp 三域对齐 host.ts 同构)全入口装配,多工作区入口全局层生效;c) 走查发现并修复 3 缺陷(scripts/walkthrough-desktop.mts,CDP 驱动构建产物 14 断言全过:扩展面板启停双向+事件活更 / 斜杠面板键盘流+skills.invoke 端到端 / 用量统计 / 记忆管理器):① 生态形态 mcp.json 被拒载——README 文档形态{mcpServers:{<key>:{...}}}(serverKey 由 map 键承载)被 mcpServerConfigSchema 判缺 serverKey 字段,smoke 一直写冗余字段从未暴露 → loadFile 按 map 键注入 + 显式字段一致性校验(mcp config.test 6 用例锁定);② 损坏 mcp.json 崩掉 agent——McpRuntime.init() 抛 MCP_CONFIG_INVALID 经void init()未处理拒绝 → agent 崩溃循环放弃 → init 失败降级 stderr 诊断 + 域空转(server mcp-degrade.test 2 用例锁定);③ 斜杠面板吞 Enter——面板打开且已输参时 palette 分支 return 拦截发送路径 → 有参 Enter 落回正常发送分支;d) NFR-1~7 全量重测留存(docs/benchmarks/m3-2026-10-02.md):NFR-1 477.9ms(跨 Node v22→v24 版本 -50% 如实申报)/ NFR-2 2.7ms / NFR-3 0.0ms / NFR-5 61.4ms / NFR-7 PASS / NFR-6 compact 专项 PASS / NFR-4 中位数 450.8MB 峰值 452.9MB ≤500MB(agent 子进程 78.7MB 真实存活;+8.7% 为 skills/plugins/mcp 装配面扩大申报);附加约束(远程执行 NFR-2 本地区间 ≤300ms)由 T3.2 同一 ToolExecutor 链路承担;4.2 对比矩阵 RainCode 列 13 行逐项核对 + 07 §4.4 验收清单 7 项对照(报告 §4~§5);e) 测试:单测 +14 共 203(desktop session-view reducer 全局事件投影与斜杠解析 6 / mcp config 文件形态矩阵 6 / server mcp-degrade 2);web-client「服务未就绪」用例单点断言采样化加固(10ms 退避下高负载 connecting 瞬态击穿,T3.9 复跑发现);smoke-memory case B 走查期复现 Windows 同时钟刻 mtime 盲窗(15.6ms tick 内 stat→外部写→stat 复检 mtime 不变 → 冲突漏检,FileSnapshot 增 size 判定修复后 6/6 确定性,见 §4);f) README 桌面端功能范围/MCP 装配语义/能力行/里程碑行、testing.md 203 + 走查脚本行、docs/README 基准索引;PROGRESS §1§5 收口(M3 全量完成);四门禁全绿 + smoke:p0 全回归 OK(14 子冒烟)+ 桌面走查 14/14。遗留人工项(环境不可得):Docker/WSL 真实执行域运行时验证、SSH 端到端样例、场景 6 真实 MCP 任务样例、electron-builder 完整 dist、Web 工作台真实浏览器人工走查。 -
[2026-10-02] T3.8 Web 界面(07 §4.1 / 06 §6.3 / UI-5,协议 v1.9 54 方法)——a) rpc:WebSocketTransport(websocket.ts):每条 WS 文本消息一帧、帧结构与 stdio 完全一致(帧协议与方法表零改动,「传输无关」最终验证);delta 批量窗口自 stdio 抽出共用模块 delta-window.ts(stdio 行为零变更,既有单测作回归护栏);畸形帧按角色处置(server 角色可定位 id 回 PARSE_ERROR / client 角色丢弃+告警,均不断开);双面结构适配 WsSocketLike(node「ws」
on事件面与浏览器addEventListener面均满足,rpc 包不引 ws 依赖);b) binding 连接级鉴权门(server.tsauthGate选项):时序ws.auth→system.ping→ 业务方法,鉴权前一切请求(含 ping,不泄露版本)回新增系统码UNAUTHORIZED(段 0);成功应答才开门、失败不开、门随连接生存;c) web-client(@raincode/rpc/web 浏览器安全子路径):createReconnectingRpcClient——重连握手(ws.auth+ping)编排、指数退避(1s×2 封顶 10s 可注入)、per-session seq 缺口检测→onSeqGap、恢复后 onRestored、鉴权失败 onFatal 停机、在途调用断线即 TRANSPORT_CLOSED fail-fast、resync 窗口丢事件防补推重复;d) server:WebHost(web-host.ts)——http+ws upgrade、逐连接独立绑定(authGate 开门 + ws.auth handler 注入方法表,token sha256+timingSafeEqual 常数时间比较)、事件多连接扇出、ws.ping 心跳探活(30s 周期,空闲 terminate)、可选静态工作台资源(路径穿越防护 + 421 纯 WS 端点提示);AgentService 多绑定化(bindings Set + publisher 扇出 + detach,stdio/in-memory 单连接零回归);createAgentServiceNode transport 参数可选(Web 多连接宿主延迟 attach);agent-service 523→499 行治理:五域构造下沉 runtime-domains.ts、shutdown 主流程下沉 session-support.shutdownService;e) apps/cliraincode web:装配口径与 serve 一致(provider 三来源 + skills/plugins 域),token 解析 --token > RAINCODE_WEB_TOKEN > 自动生成打印 stderr(绝不落盘);apps/web 会话工作台(React 18 + Zustand + Tailwind,@raincode/rpc/web 单一依赖面):reducer 与桌面端同状态机(03 §7 一致性),onRestored/onSeqGap 双出口接 resume 补偿 + setSeqBaseline 回填,会话流/工具卡五状态/审批四级决策键盘直选/Provider 设置/连接状态条(重连可视化);f) 协议 v1.9 additive:ws 域 1 方法 ws.auth + UNAUTHORIZED 段 0 + capability ws.auth(stdio/in-memory 不暴露);06 §2.11 插入(原 2.11/2.12 顺延 2.12/2.13,tool-phase.ts 引用同步)、§6.3 由预留说明重写为落地定义(心跳/退避/补偿路径/扇出);g) 测试:单测 +21 共 189(rpc:websocket 6 传输/畸形/窗口/close/断开 + web-client 6 握手/缺口/resync/重连/fatal/未就绪 + authGate 4;server:web-host 5 鉴权/解绑/扇出/静态/421);smoke:web 三用例入 smoke:p0 回归(A 鉴权+浏览器端到端会话 / B 断线重连快照补偿——mock 延迟 1200ms 使回合内容整体产生于断线窗口,resume 补推零丢失的最强断言 / C 多连接扇出);并修正 T2.8 遗漏(smoke:stdio 此前未入 smoke:p0 回归环);h) README Web 界面节 + 命令表 + 能力行、06 五处、04 §4.4 落地化、testing.md 计数 189 + smoke 行;PROGRESS §1/§2/§3/§4/§5 推进(T3.8 ✅);四门禁全绿 + smoke:p0 全回归 OK(smoke:web 3/3 复跑稳定)。 -
[2026-10-02] T3.5 插件化(07 §4.1 / 02 §2.3 插件扩展点,协议 v1.8 53 方法/19 事件)——a) 插件包形态:
<dataRoot>/plugins/<name>/(plugin.json 清单 zod 单一事实源:name [a-z0-9-]+ 与目录名一致性校验防路径逃逸 / description 必填 / version? / entry? 缺省 index.mjs + 入口 ES module 契约activate({pluginDir}) → 工具描述符数组、可选deactivate());仅全局层不做 workspace 逐会话层——插件是注册进节点全局 ToolRegistry 的可执行代码,per-session 解析会跨会话泄漏(技能 per-session 口径不适用,07「复用技能加载的注册机制」落实在清单+目录扫描+首命中+坏件跳过的机制层);b) 加载器/适配器(packages/tools/src/plugin/):scanPluginDir/readPluginManifest/activatePlugin(动态 import + 逐条描述符校验:name [a-z0-9_]+/description 必填/execute 函数/JSON Schema 直通/metadata 子集类型校验)+ createPluginTool(plugin__<名>__<工具>命名空间、metadata 缺省从严 needsApproval=true/riskLevel=medium 声明可收窄、非字符串返回值 JSON 序列化、execute 抛错 → 数据级 TOOL_EXEC_FAILED);registry 命名空间豁免:source="plugin" 放行 plugin__ 前缀(mcp__ 豁免同构),其余来源__仍拒绝;c) PluginRuntime(server 装配,风格对齐 McpRuntime):构造期 bootstrap + 就绪门(控制面方法 await 初次扫描完成——修掉 fire-and-forget init 的 list 落空竞态);启停 = plugins.json 停用名单{disabled:[]}持久化(目录即配置,停用 ≠ 卸载;同态幂等);生命周期 active/disabled/failed 三态 + plugin.status_changed 全局事件(v1.8 第 19 事件);故障隔离(验收项):坏清单/activate 抛错 → 该插件 failed + lastError 不阻塞启动与其他插件;d) 协议 v1.8(minor+1 additive):plugins.list/setEnabled 两方法 + 错误码段 10(PLUGIN_NOT_FOUND/PLUGIN_INVALID)+ 06 §2.10 插入(原 2.10/2.11 顺延 2.11/2.12,tool-phase.ts 外部引用同步);e) 官方示例插件 examples/plugins/hello(greet/word_count 双工具演示 JSON Schema 参数与 metadata 收窄)+ CLI context/host 默认装配plugins:{};f) 测试:单测 +10 共 168(清单/扫描/激活契约/适配器/命名空间矩阵,临时目录真实 .mjs 动态 import 每用例独立 mkdtemp 防 ESM 缓存串扰)+ smoke:plugin 三用例(A 示例插件发布加载/模型调用双工具 + B 启停落盘幂等 NOT_FOUND + C 故障隔离 failed 投影/数据级回传/内核不受影响)入 smoke:p0 回归;g) README 能力行/插件化节/目录树 + testing.md 计数 168 + smoke 行 + 06 §2.10/§3.2/§4.3/§5/§7.5;PROGRESS §1/§2/§3/§5 推进(T3.5 ✅);四门禁全绿 + smoke:p0 全回归 OK(smoke:plugin 3/3 复跑稳定)。 -
[2026-10-02] T3.3 记忆自动抽取 + 管理界面(07 §4.1 / 02 §7.2 第三层,协议 v1.7 51 方法)——a) 晋升草案待确认区:
packages/memory/src/promotion/drafts.ts,载体 settings KV(键memory.drafts.<workspaceId>,05 §3.11 运行期非配置状态,不为 memory_entries 发明字段);生成规则 = 抽取新落盘条目 confidence ≥ 0.8(MEMORY_DRAFT_MIN_CONFIDENCE 高置信晋升线,高于召回线 0.6)且 kind ≠ todo(「当前进行」为 Agent 专用章节,循环已直写无需晋升)→ pending 草案 + KIND_TO_SECTION 章节预填(decision→项目概览 / convention/preference→工作约定 / pitfall→已知坑 / todo→当前进行);同条目任意状态草案不重复建议;superseded 条目的 pending 草案失效隔离不投影(升位条目另有草案);处置流 confirm 经 promote 链合入 MEMORY.md(section 可覆盖预填)/ reject 仅标记,终态不可再变更(非 pending → MEMORY_DRAFT_NOT_FOUND);直接管 promote 同条目自动收敛其 pending 草案为 confirmed(不悬挂过期建议)——「记忆 Agent 循环」= 事件驱动抽取(session-end/compact,T2.4 已有)+ 晋升草案生成(本任务),第三层落地完整;b) 协议 v1.7(minor+1 additive):memory 域 5→7 方法memory.drafts.list {status?}(MemoryDraft = 草案字段 + entry 本体随行,新者在前)/memory.drafts.resolve {draftId, action, section?} → {resolved, promoted};错误码段 6 增 MEMORY_DRAFT_NOT_FOUND;server 端 memory-runtime 扁平投影(包内嵌套 draft+entry → 协议扁平形状);c) 单测 16 新增共 158(验收项「抽取幂等/去重/矛盾标记单测」落地:幂等键三态 / 归一化 touch / 互含新强 supersede / 旧强丢弃 / 候选清洗夹取截断;草案生成规则 / 失效隔离 / confirm-reject 终态 / section 覆盖 / 直管晋升收敛,内存替身不落盘);smoke-memory 增用例 G(生成规则 / 直管晋升收敛 / confirm 合入 / 终态与 NOT_FOUND 族);d) case B 确定性收口:SectionEditHooks.onBeforeRecheck 注入缝(project-file 写路径 S2 mtime 复检前同步触发,prod 依赖注入选项——ESM 静态绑定下 fs monkey-patch 不传播,PROGRESS §4 遗留项)贯穿 service/runtime/node 装配链,case B 弃「setInterval(0) 竞速 + 10 轮重放」改一次性装填直改,复跑 4/4 确定性命中 MEMORY_WRITE_CONFLICT(旧法 ~1/6 闪失终结);e) 桌面记忆管理器(MR-4,03 §6.3 稿件 03):MemoryManager 视图三栏——左记忆源(MEMORY.md 卡 + kind 分桶计数点击过滤)/ 中 MEMORY.md 只读预览 / 右待确认草案(章节 select 可改 + 确认合入 + 忽略)+ 条目检索 / kind chips / 置信度 / superseded 标记 / 直管晋升;Sidebar 增入口,view 联合类型 chat|settings|memory,rpcCall 低频控制面共享出口(memory 域无事件推送,进视图与处置后全量刷新);f) 06-api-spec §2.6 两行 + §4.3 段 6 + §7.5 v1.7;README 项目记忆节 / 桌面端 Alpha 范围;testing.md 单测 158 + smoke-memory 行 + lint 基线 12 申报;PROGRESS §1/§2/§3/§5 推进(T3.3 ✅);四门禁全绿 + smoke:p0 全回归 OK(smoke-memory 4/4 复跑确定性通过)。 -
[2026-09-29] T3.6 子代理编排增强(07 §4.1 / 验收:并行委派汇聚用例)— a) 内置角色模板:BUILTIN_ROLE_TEMPLATES(agent-core 代码常量不落盘,无打包/路径问题)——researcher(只读调研)/ reviewer(代码审查)/ tester(测试执行),profile 解析链 workspace → global → builtin 三级(用户同名 profile 遮蔽内置,可整体覆写);SubagentRuntime.resolveSpawnProfile 目录未命中时兜底(subagent.spawn 控制面 catch 原生 SubagentProfileError → RpcCallError 域码映射,agent 工具路径保持原生错误模型可自纠——两路径错误语义分层);profileCatalog 未被用户覆盖的内置模板以 source:"builtin" 追加投影(agent 工具 description 同源,模型开箱可见);shared subagentProfileSummarySchema.source 枚举增 "builtin"(协议 v1.6 additive,06 §7.5 登记);b) 并行编排汇聚:原语已在(agent 工具 metadata.readOnly=true → ToolExecutor 同批只读并行上限 4 + SubagentManager 并发槽 4 + 各完成通知按批次合并),本任务以验收用例坐实——smoke-subagent 用例 H 同轮两个 agent tool_call(index 0/1 分组流式帧,p0-lib toolCallFrame 增可选 index)→ 双子代理并发执行(mock 请求到达间隔 7ms,串行基线 ≥400ms)→ 双完成通知合并回主循环各自携带子结论;c) 测试:单测 +3 共 142(内置模板结构合法——名字互重/提示非空/maxTurns 界内/tools ⊆ 内置工具名/builtinRoleOf 命中语义);smoke-subagent +2 用例共 8(G 内置角色 spawn 可收束 + C 组断言扩展 builtin 投影与遮蔽 / H 并行汇聚),既有 A
F 零回归(C 用例 count 2→4 适配内置项);06 §2.5 profiles.list 行 + README 子代理节同步。(07 §4.1 / 06 §2.5 mcp 域 8 方法)— a) 运行时启停:mcp 包F 零回归;README MCP 节补启停/健康检查两条。07 §4.2 验收对照:配置化管理(T2.2 mcp.json 双层 + add/remove ✅)、自动恢复(T2.2 M4 退避重连 ✅)、启停与健康检查(本任务 ✅),域验收闭环。McpManager.setEnabled(内存 config.enabled 改写,持久化归 runtime 层——mcp.json 归属层不同)+McpRuntime新方法mcp.servers.setEnabled {serverKey, enabled}:停 = 断连(M8 语义 intentionalClose)+ 命名空间工具注销 + mcp.jsonenabled: false持久化(配置保留 ≠ remove,再启不重配);启 =enabled: true持久化 + 受理即返重连(Disconnected/Failed 均可受理,connect 幂等保护在途态,最终状态经mcp.server_status_changed事件);enabled 语义此前只被 init/add 消费一次(装配期静默跳过),运行时无任何切换入口——本任务补齐 07 §4.1「启停」缺口;b) 健康检查:McpManager.health(Connected server 发 MCPping实测 RTT,探测只读——失败不改状态机,自动恢复仍由 callTool 连续超时 + M4 重连链路承担;探测不建连——非 Connected 状态只读投影 status/lastError)+mcp.servers.health {serverKey?}(缺省检查全部已注册 server,Promise.all 并发);协议 v1.5(minor+1):shared mcp.ts 增 setEnabled/health 请求响应 schema + METHOD_SCHEMAS 登记(49 方法),mcp-fixture-stdio 本就实现 ping 无需改动;c) 验收:smoke-mcp 用例 G(health on Connected RTT 实测 / Failed 只读投影 / 停后工具不可用 + MCP_UNAVAILABLE + enabled:false 落盘 / 重启 Connected + 工具恢复 + enabled:true 写回 / 未知 key NOT_FOUND 族)——T2.2 既有用例 A -
[2026-09-29] T3.4 技能与斜杠命令(TL-6 / 06 §2.9 skills 域)— a) 技能包规范:markdown + frontmatter 单文件(
<ws>/.raincode/skills/<name>.mdworkspace 层 /<dataRoot>/skills/<name>.mdglobal 层双源,workspace 同名先命中生效,镜像 T2.3 profile 目录口径);字段 name(可省缺省文件名,[a-z0-9-]+ 挡路径逃逸)/ description(必填)/ argumentHint(可选),正文 = 提示词模板;frontmatter 解析抽包内共用模块agent-core/src/frontmatter.ts(profile.ts 零行为变更复用);b) 展开语义:$ARGUMENTS占位替换(多次出现)→ 无占位符且有参 → 参数独立行追加末尾 → 无参原样;展开在 server 侧(04 ADR-06 唯一组装点),CLI 与桌面端只做/name args转发无第二展开点;c) 协议 v1.4(minor+1):skills 域 2 方法skills.list {sessionId?}(sessionId 提供时含该会话 workspace 层,缺省仅 global;非法文件跳过不阻塞面板仅产诊断)/skills.invoke {sessionId, name, arguments?}(受理即返与 session.send 同形,turn 事件流完全一致故无新事件、无新 capability——端层经 METHOD_NOT_FOUND 探测);错误码段 9SKILL_NOT_FOUND/SKILL_INVALID;06 §2 原映射/时序两节顺延 §2.10/§2.11(外部引用已同步);d) server:SkillRuntime(风格对齐 SubagentRuntime;workspace 层目录按会话 workspaceRoot 逐会话解析——storage.workspaceRootOf——装配期无参数,与 memory 同形态);agent-service 提取submitTurn提交链(session.send / skills.invoke 共用:requireActive + provider 缺席拒绝 + 受理即返 + usage 旁路);CLI in-process(context.ts)与 stdio 宿主(host.ts,桌面 agent 子进程同形态)默认装配;e) CLI chat:/skills技能面板(名称/参数提示/来源层/描述)+ 内置命令未命中的斜杠输入路由 skills.invoke(stream.ts 提取streamTurn订阅先于提交、submit 点插拔,sendAndStream 成为其特例;SKILL_NOT_FOUND 回退未知命令提示;内置命令名优先于技能名);f) 3 个官方示例技能examples/skills/(review 代码审查 / test-gen 测试生成 / README 指引复制进技能目录);g) 测试:单测 +11 共 139(解析校验/双源优先/首命中不回落/路径逃逸/展开三语义);smoke:skills五用例(A 官方示例真身加载入列+坏文件跳过 / B 双源优先级 / C 示例技能端到端——mock 请求体末条 user 含 $ARGUMENTS 替换后文本即展开在 server 侧的真实证据 / D 自定义技能展开语义三连 / E 错误族)入 smoke:p0 回归。桌面端斜杠命令面板 UI 留 T3.9(UI-4 补齐)。 -
[2026-09-29] T3.2 远程执行(ES-5 / 复用 T3.1 Executor 抽象)—
SshExecutor:命令经ssh投递远端主机,本地 cwd 前缀映射远端remoteWorkspaceRoot(toRemotePath,guardPath 保证 cwd ∈ workspace 后前缀展开);连接参数user@host+-p端口 +-i密钥 +-o BatchMode=yes(密钥不通即失败收敛,不挂交互提示)+StrictHostKeyChecking=accept-new;env 经远端env K=V前缀注入(ssh 不转发本地环境,AcceptEnv 依赖服务端配置不可靠);本地审计记录保留——事件流/审批审计照旧落本地 RAINCODE_HOME(ES-5 口径),执行域无感;shared sandbox schema 扩展executor: "ssh"+ssh: {host,user,port,identityFile,remoteWorkspaceRoot}节(strict 写路径);工厂resolveSandboxExecutor增 ssh 分支:探针=对配置主机ssh ... exit 0(ConnectTimeout 6s,可注入替身)→ 未配置 ssh 节/不可达均回退 local + 告警(文案区分两种原因);单测 +6 共 128(路径映射/连接参数/env 注入/工厂三态/bash 接线 sandbox 标记);README 沙箱执行域节补 ssh 段与 ES-5 审计口径。07 §4.2 验收的端到端样例(远程仓库修改 → 远程测试 → 结果回传)需真实 SSH 主机,随 M3 全量对齐人工执行(本机无 SSH 服务端,探针/argv 级已自动化)。 -
[2026-09-29] T3.1 容器沙箱(SB-3 前置 / ES-3~4)— a)
packages/tools/src/sandbox/executor.ts:Executor执行域抽象(local/docker/wsl,命令投递面;后台任务生命周期仍由 BackgroundTaskRegistry 持有——02 §5.3 start/kill/list 拆分申报,registry 单例为所有权与审计事实源);DockerExecutor(ES-3):仅挂载 workspace(fs 隔离,主机其余路径容器内不可见)+--network none缺省断网(可配 bridge)+ workdir 相对映射(D:\ws\docs→/workspace/docs)+ env-e注入 + exit 后 best-effortdocker rm -f清理(taskkill 硬杀不经信号代理,防容器孤儿);WslExecutor(ES-4):wsl --cd自动翻译路径 +-d发行版 +env K=V前缀注入,发行版 fs 完整可见(环境隔离非安全边界口径申报);resolveSandboxExecutor工厂:CLI 探测(docker version / wsl --status,可注入替身)→ 不可用回退 local + stderr 告警(02 §5.4),kind 标记真实执行环境;b) 配置面:sharedsandboxConfigSchema(executor/image/network/wslDistro)进 config.json 读 strip/写 strict 双 schema,config.set可定点写;c) 接线:createBashTool({executor})工厂化(bash 前台经 executor.run、后台经 registry 同域投递;结果data.sandbox字段 + 非 local 内容头行标注,local 输出与 P0 字节兼容);BackgroundTaskRegistry({executor});server 装配在createAgentServiceNode(异步探测,构造器保持同步)——读 config.json sandbox 节(不可读按 local)→ 探测解析 → 回退告警走 stderr(stdout 只承载协议帧),调用方显式tools.executor优先于文件配置;d) agent-service.ts 469 行逼近治理上限:resume 主流程按方法族拆分下沉session-support.resumeSessionFlow(06 §5 预留拆分口径,SessionEntry/快照组装同文件归位);e) 单测 +17 共 122(工厂解析矩阵/docker argv 策略断言含「仅挂载 workspace」越界拦截语义/wsl 翻译/bash 接线与守卫不变/后台同域)。验收口径:本机无 Docker 且 WSL 无发行版(真实执行域运行时验证留人工项,随 M3 全量对齐执行);不可用回退告警 + argv 级隔离策略已自动化覆盖。README 新增「沙箱执行域」节。
- [2026-09-29] M2 场景 5 桌面端 GUI 走查(人工项自动化闭环)— 以「构建产物 electron.exe 直启 + CDP 远程调试(--remote-debugging-port)驱动 renderer 真实输入事件」方式执行 03 §6 四项走查:① 会话管理:新建会话/列表/跨会话切换 ✓;② 工作区选择:原生目录对话框选区 → 侧栏显示 ws 路径 ✓;③ 审批弹窗:高风险徽章 + 默认 ask reason + 参数预览 + 四级决策按钮全呈现,键盘「1」直选放行(焦点在输入框时按设计忽略)、Esc 拒绝后工具卡呈现 TOOL_PERMISSION_DENIED 且文件未落盘、批准后 mkdir 真实执行 ✓;④ Provider 设置:表单添加两项 / 切换 / 活跃徽章移动 / 侧栏状态行同步 ✓;另验证「CLI 里开始的会话桌面端打开即续接」(同 RAINCODE_HOME 跨端恢复)。走查发现并修复 4 缺陷:a) 桌面端 dev 模式 agent 子进程 spawn 路径错误(repoRoot() 从 dist-electron/main 上溯两级得 apps/desktop 而非仓库根 → MODULE_NOT_FOUND 崩溃循环 5 次放弃,窗口仅显示「已断开」)——拆分 desktopRoot()/repoRoot() 并在放弃守护诊断中附 stderr 尾部;b) renderer 无参 RPC 调用缺
{}(system.ping / config.providers.list → server strict schema INVALID_PARAMS;帧序列化丢 params 键)——两处补参 + call 包装器统一params ?? {}兜底;c) 桌面端冷恢复空白:snapshot.messages 为 NFR-5 尾部增量口径,renderer 误当全量历史用 → 已收束会话恢复视图为空——协议 v1.3 增可选snapshot.history(全量消息,resume 冷恢复/幂等路径双填充,06 §7.5 登记),renderer 以history ?? messages重建(含工具卡归并);d) 无 title 会话落库空串(桌面端新建会话 → 列表出现无文字行)——server 端 createSession 缺省「新会话」。测试设施沉淀:scripts/llm-fixture-http.mjsOpenAI 兼容流式 fixture(SSE tool_call 分帧/工具结果续答/run: 前缀脚本化命令),GUI 走查与后续端到端联调复用。教训:构建产物直启形态(isPackaged=false)此前从未真实联调过 agent 链路——bench:mem:desktop 仅采样内存,agent 崩溃循环不影响测量值(NFR-4 口径申报见 §4),「能跑通的门禁」≠「联调过的功能」。 - [2026-09-29] 文档完善(用户要求的文档收口轮)—
README.md全面重写至 M2 现状:双端能力表(桌面端/stdio/P1 工具/会话管理转入已完成)、CLI 四命令 + chat REPL 十命令详表(审批四级数字决策口径与实现核对)、桌面端 dev/build/dist 指引、Provider 配置三方式与 providers.local.json 双形态示例(含单价字段与 file: 引用制)、数据目录布局(~/.raincode 与 workspace .raincode 双层)、MCP mcp.json schema 示例与状态机说明、子代理 profile 格式示例、内置工具九件清单表、权限五级判定/三层规则/审批闭环/模式语义(plan 写类 deny、auto-accept workspace 内 allow 与 permission/service.ts 实现核对)、环境变量总览、开发测试基准命令;CONTRIBUTING.md架构约束句更新(登记式子路径入口);docs/README.md基准报告点名 m1/m2;协议规模数字以 METHOD_SCHEMAS/EVENT_SCHEMAS 实测 45/18 为准(原 43/17 为规划口径)。本轮纯文档无代码改动。 - [2026-09-29] T2.10 M2 验收与基准留存 — a) NFR 基准留存
docs/benchmarks/m2-2026-09-29.md:NFR-1/2/3/5/7 复跑(NFR-2/3/5/7 达标且 2/3/5 改善或持平;NFR-1 冷启动 949ms 相对 M1 509ms +86% 原因申报:M2 装配面扩大 → tsx 转译链变长,绝对值仍 2.1× 余量达标,优化方向=M3 CLI 前置编译);NFR-4 新增达标:pnpm bench:mem:desktop(新脚本:electron dist 产物 + 进程树 WorkingSet 采样 60s 预热 + 10×30s = 5 分钟空载窗口)中位数 339.8MB / 峰值 350.5MB ≤ 500MB(余量 30%,无泄漏形态);NFR-6 新增达标:packages/server/test/compact-nonblocking.test.ts专项单测(摘要延迟 600ms 窗口内 send 受理 <100ms + tools.list 探测 <100ms + compact.completed 收敛)+ smoke:compact A 进程级佐证;b) MCP/子代理/记忆验收样例留存:smoke:mcp / smoke:subagent / smoke:memory 全绿(smoke:p0 回归);c) 07 §3.4 场景 1~4 自动化覆盖核对入报告 §4;场景 5(桌面 GUI 四项走查)/场景 6(真实 MCP 任务样例)标注人工验收项(pnpm --filter @raincode/desktop dev)。教训:NFR-5 首轮 118ms 为冷缓存波动,复跑 80ms 回归 M1 水平——基准对比以多轮复跑为准。 - [2026-09-29] T2.9 桌面端 Alpha(Electron 三泳道)— a) 三泳道进程模型(04 §3.2):main(窗口 + agent 子进程守护 + 字符串级帧转发,不解析业务帧)/ preload(contextBridge 最小帧通道 API)/ renderer(React 18 + Zustand + Tailwind,IpcBridgeTransport 虚拟 stdio);b) AgentHost(纯 Node 可单测):spawn headless Agent Service(dev =
node --import tsx raincode serve与 CLI 完全同入口;packaged = electron.exe + ELECTRON_RUN_AS_NODE 跑 esbuild bundle)、JSONL 帧桥 StringDecoder 分帧、意外退出自动重启(1.5s 退避 + 连续 5 次放弃 + intentional/hadTraffic 语义)、优雅 stop;c) renderer 协议层:IpcBridgeTransport(IMessageTransport kind=stdio,帧 JSON 透传)+ session-view 纯函数事件 reducer(message.delta 流式光标 / tool_call 五状态 / permission.requested 审批队列 / done 收束)+ store(ping→list→providers 引导、create/send/resume 快照重建、审批四级决策 respond、config.providers add/switch);d) UI 组件 9 文件按 03 §6 规范:Sidebar(工作区选择器 + 会话列表)/ ChatFlow / MessageBubble(轻量 markdown)/ ToolCard(五状态灯 + 折叠展开)/ ApprovalDialog(风险徽章 + 键盘 1-4/Esc)/ InputArea(Enter 发送 + 停止)/ ProviderSettings;e) 打包形态通路:esbuild bundle agent 入口 + migrations 随包复制 + RAINCODE_MIGRATIONS_DIR/RAINCODE_APP_VERSION env 注入(bundle 内 import.meta.url shim 为空对象,storage/server 相应增加 env 覆盖,dev/CLI 路径不变)+ electron-builder Windows 配置(nsis + asarUnpack better-sqlite3);打包产物冒烟node scripts/verify-agent-bundle.mjs(entry.cjs ping/pong)PASS;electron-builder 完整 dist 留待人工验收(pnpm 符号链接 + 原生模块 rebuild 属打包机环节);f) 工程配套:rpc 包新增@raincode/rpc/client子路径导出(stdio 依赖 node 内建不可进浏览器图)+ policy 登记式子路径入口(specifier=path约定)+ architecture-check 子路径校验扩展 + rpc/sharedsideEffects:false;单测 +3(AgentHost 帧桥/stop/崩溃重启),总 104。教训:esbuild CJS 输出把 import.meta.url shim 成空对象——任何new URL(rel, import.meta.url)的运行时文件定位在 bundle 内必须改 env 注入或构建期内联。 - [2026-09-29] T2.8 rpc stdio + server headless — a)
StdioTransport(rpc 包,stdio.ts):stdin/stdout 每行一帧 JSONL(StringDecoder 跨 chunk 多字节安全分帧);畸形行按 06 §1.2 处置(可定位 id → PARSE_ERROR response,否则丢弃 + stderr 告警,不断开);message.delta50ms 批量窗口(同 turn 同 round 同类型合并:text/argsPartial 拼接、seq/ts 取最新、tool_call id/name 最新非空;非 delta 帧发送前先 flush 保证边界事件不乱序);stdin end 经 onInputEnd 回调交持有方收尾(transport 保持可写,在途响应 flush 后 close,不丢帧);b) headless 入口:raincode serve(apps/cli host.ts 端层唯一 stdio 组装点 → createAgentServiceNode,与桌面 agent 子进程同形态,stdout 只承载协议帧、诊断全走 stderr);c) snapshot 补推(06 §3.2/02 §6.4):session.resumemessages=checkpoint 后尾部增量(replay.messages 同源;内存态会话为空)+ pendingApprovals=ApprovalBroker.pendingGrantsOf(settled=false 按会话过滤,normalizedInput 与事件同脱敏,超时器不受补推影响);单测 +13(rpc stdio 9 + broker pending 4),总 101;smoke:stdio(A 握手门禁 VERSION_MISMATCH / B ping / C 畸形带 id PARSE_ERROR / D 畸形无 id 丢弃不断开 + stderr 告警 / E create→resume 幂等快照字段齐全 / F stdin end 优雅退出 0)入回归。教训:畸形行正则可定位 id 的口径先于 JSON.parse 成败(06 §1.2「可定位 id」含 parse 失败行)。 - [2026-09-29] T2.7 工具增强与 P1 工具 — a) 单测设施落地:node:test + tsx(零依赖,
pnpm test),现 88 用例;b) 并发上限可配 maxConcurrency(默认 4)+ 截断提示增强(omitted 字节 + 分页建议);c) 越界升级 ask 全链(02 §5.4):tool-phase 路径预检 → permission 强制 ask(跳过 readOnly 快速通道,宁可误问不可漏拦)→ 获批后 pathPolicy allowEscaped 精确放行该绝对路径;d)web_fetch(首个 network 工具,needsApproval 从严):SSRF 强制黑名单(IPv4 11 段 + IPv6 环回/链路本地/ULA/IPv4-mapped + DNS 解析后逐 IP 校验 + localhost 拒 + DNS 失败 fail-closed + 重定向逐跳重校验上限 5 跳,TOOL_SSRF_BLOCKED)+ HTML 剥标签/实体解码转文本 + maxBytes 截断;e)ask_user_question:复用审批闭环(broker.askAndWait 专用方法 + respond answerText 载荷 + permission.resolved 透传),提问即挂起等答、应答即工具结果同 turn 续答(偏差申报:02 L322 的 T14 awaiting_user 状态机简化为同构最小实现;单问题+choices≤6;不进五级判定链,无副作用);CLI stream.ts 提问卡渲染与序号应答;协议:06 §2.2/§3.2 answerText + §4.3 错误码 + §7.2 capability + §7.5 v1.2;smoke:p1tools(SSRF 端到端拦截 / headless TOOL_UNAVAILABLE fail-safe)入回归;testing.md 新增单测节。教训:内置工具数断言(smoke-tools 8→10)随清单扩展需同步。 - [2026-09-29] T2.6 内核增强(AC-9
12)— AC-9 会话管理:200)+session.rename(title trim 1session.fork(全量历史逐条落盘复制 + parent_session_id 回链 + checkpoint 恢复点 + seq 口径对齐 resume,源会话运行中先 cancel 收束)+session.usage(累计 tokens/turns + costEstimateUsd 按 active provider 单价估算,单价齐备才算);AC-10:ProviderConfig 加inputPricePerMtok/outputPricePerMtok(strict schema 三处同步扩展,旧 config.json 兼容读取);AC-11:config.providers.switch实现(ConfigStore.setActiveProvider 持久化)+ llmFor(undefined) 缺省绑定改为 config.activeProviderId 解析(switch 后新会话走新活跃项,已建会话不动;无 active 回退主客户端兼容 CLI 直传);AC-12:受限重试——turn 内工具参数校验失败(TOOL_INVALID_INPUT)计数 ≥3 → settler fail(TOOL_INPUT_RETRY_EXCEEDED),此前仅 maxRoundsPerTurn 兜底;顺手修复 recordUsage 读-改-写丢更新(SessionsRepo.accumulateUsage SQL 原子自增)。协议:06-api-spec §2.1 三方法 + §2.3 单价 + §4.3 错误码 + §7.5 变更记录;CLI 新增 /rename /fork /usage + /providers 单价列;新增smoke:kernel(A rename / B fork 上下文连续性 / C usage 估算与省略语义 / D switch 双 mock 三态 / E 受限重试恰 3 轮收束)入 smoke:p0 回归。 - [2026-09-29] T2.5 permission 持久化与危险命令(验收补齐)— 核心能力(三层 scope CRUD:session 内存/project/global SQLite + 层级内 deny>ask>allow 收敛 + 同行为取最新 + 高危根命令通配 allow 强制降级 ask + 五级判定链)M1 Wave 5 已实现并具备协议 5 方法;本轮按 07 T2.5 验收补齐测试:smoke:permission 新增 e 组规则优先级合并矩阵用例(e1 project deny 覆盖 global allow 首个命中层级生效 / e2 global deny 收敛+removeRule 即时生效 / e3 清空回归 default ask / e4 project 规则 workspace 隔离 ws2 免疫 ws1 / e5 global 跨 workspace 放行对照)并消除与 p0-lib 重复的 mock server 实现;新增
smoke:migrations迁移回放冒烟(空库全量迁移 / 重开幂等数据保留 / 001+002 存量库升级重放 003:表恢复+002 数据保留)并纳入 smoke:p0 回归。教训:持久层规则唯一键(scope+workspace+tool+pattern)下同键 allow/deny 互斥,后写者需先删旧规则(测试编排踩坑)。 - [2026-09-29] CLI 展示升级 — 参考 MiMo-Code(opencode 系)print 模式调研结论,新增
apps/cli/src/ui/渲染层(ADR-02 中间形态:readline REPL + ANSI 富文本,不引入 TUI 框架):theme.ts(03 §3.1 tokens 同源 truecolor + 工具 glyph 表 ✱/←/$/◇/◈/⚙ + 非 TTY 全退化);markdown.ts(StreamMarkdownRenderer 行缓冲状态机:标题/围栏代码块/列表/行内码/粗斜体/引用,嵌套安全 SGR 关闭序列);format.ts(formatDuration 三档);stream.ts 工具行三态着色(运行中 cyan/完成 dim/失败 danger/被拒或取消=删除线「已作废」语义)+ reasoning dim 斜体(stderr 通道不变);chat banner/prompt 着色;run 回合头。验证:临时脚本断言 TTY/非 TTY 双模式 + 逐字符分包一致性;smoke:remote 真实 Provider 回合管道输出零 ANSI/零密钥泄露。 - [2026-09-29] 产品更名 NovaCode → RainCode(ADR-11)— 全仓 132 文件同步(包名 @raincode/、bin raincode、env RAINCODE_HOME/RAINCODE_PROVIDER_、数据目录 .raincode、文档与 UI mockup 文案);PROGRESS §3/§4 历史日志与 docs/benchmarks/ 历史基准保留旧名作为事实记录;桌面端等后续形态遵循新名。
- [2026-09-28] T2.4 memory 包 — 三层记忆落地:L1 项目 MEMORY.md(
<workspace>/.raincode/MEMORY.md,模板初始化/章节读-改-写 + mtime 冲突检测 + 原子重命名提交;02 §7.1 的.nova为笔误已统一);L2 会话记忆(003_memory.sql:memory_entries + memory_fts trigram external-content 虚表 + settings 键值表;抽取幂等键memory.extracted.<sessionId>;归一化去重 touch + 同 kind 互含矛盾 supersede);FTS5 trigram 检索(phrase 转义防语法注入)+ <3 字符 LIKE 兜底 + confidence≥0.6 默认召回集;promote 单向晋升(只改文件不改条目行);MEMORY.md 全文注入 systemPrompt(server 装配点拼接,ADR-06);会话结束(archive)+ compact(onBeforeReplace 钩子先于历史替换,失败仅 diag 不阻塞)双触发抽取;LLM 抽取经 MemoryExtractPort 端口注入(30s 超时/宽容 JSON 解析/失败跳过);memory 域 5 协议方法(read/write/search/entries.list/promote);验收冒烟smoke:memory(A 模板与注入 / B write 越界拦截+mtime 冲突 / C archive 抽取+幂等 / D search 四路 / E promote / F compact 钩子)并纳入 smoke:p0 回归。 - [2026-09-28] T2.3 子代理 — profile 解析(markdown + 手写 frontmatter,
[a-z0-9-]名校验 + 路径逃逸防护,workspace/global 双源);SubagentManager 状态机 S1~S6(并发槽默认 4 超限 FIFO 排队 / 级联取消 / TURN_MAX_ROUNDS_EXCEEDED → Stopped 超轮次截断保留已产出内容);事件镜像(tool_call.started → progress{tool} 等 02 §4.2 映射 + 500ms 惰性窗口合并去重,终态永不合并);ToolRegistry 白名单投影(闭包委托只读视图,子会话不含agent工具层级固定 2);agent工具(阻塞等待子会话终态、结果回传即完成通知注入主循环、ctx.signal abort 级联 stop);shared 协议 subagent 域 4 方法 + 3 事件;server 装配 SubagentRuntime(SubagentLoopHost 注入,model 覆盖经 llmForModel 按名匹配 Provider,modeOf 继承主会话);验收冒烟smoke:subagent(A 完成链路 / B 事件镜像 / C 双源 profiles / D 校验错误族 / E stop 幂等 / F 并发排队 queuePosition)并纳入 smoke:p0 回归。附:CLI chat 双 readline 双回显 bug 紧急修复(独立提交 d4090ac)。 - [2026-09-28] T2.2 mcp 包 — MCP 三 transport 接入(stdio 子进程 / Streamable HTTP / SSE,协议交互复用官方 SDK
@modelcontextprotocol/sdk@1.29.0);连接状态机 M1~M8(指数退避 1/2/4/8/16s,耗尽 5 次 → Failed);失败隔离(单 server 故障仅影响自身命名空间);mcp__<serverKey>__<toolName>命名空间工具(原始 inputSchema 直通 + 从严 metadata needsApproval=true);mcp.json 双层配置(global + project,冲突拒绝)与 add/remove 持久化;mcp 域 6 方法 +mcp.server_status_changed全局事件;验收冒烟smoke:mcp(手写 JSON-RPC fixture server 真实互操作:连接/命名空间/控制面直调/turn 内模型调用/进程崩溃重连/HTTP add-remove)并纳入 smoke:p0 回归。教训:Connected 事件与 listTools 完成存在竞态 → refreshTools 重试兜底。 - [2026-09-28] T2.1 auto-compact — CompactionService(阈值 80% 触发 / 异步不阻塞 / in-flight 去重锁 / 失败阈值上调 90% + 连续 3 次停机);提交协议 =
compaction.applied事件行(summary + summarizedCount)+ epoch+1 checkpoint,重放语义落地 storage(resume 后历史与内存态一致);协议新增session.compact方法与compact.started/completed事件(22+1 方法 / 14 事件);CLI/compact;NFR-6 专项冒烟smoke:compact(A auto 触发+不阻塞+resume 连续性 / B 失败保留原历史+阈值上调 / C 手动+幂等+INVALID_PARAMS)并纳入 smoke:p0 回归。
- [2026-09-28] 文档管理与进度持久化体系落地 — 新增
PROGRESS.md(进度唯一事实来源 + 更新协议)、根README.md(功能清单/快速开始/vibecoding 标注)、docs/testing.md(测试体系说明)、docs/README.md(文档索引)、LICENSE(MIT)、CONTRIBUTING.md(含文档更新协议)。提交94bad1d。
- [2026-09-28] 7 份设计文档定稿 —
docs/01-PRD.md~docs/07-dev-plan.md+ 4 份 UI mockup(docs/ui-mockups/)。提交c48964a。
- [2026-09-28] Wave 1 monorepo 脚手架 — pnpm workspace + tsconfig + shared/rpc 协议基座。提交
8d52409。 - [2026-09-28] Wave 2 llm + storage — OpenAI 兼容流式客户端(fixture 测试消化 Provider 差异)、JSONL 会话流 + checkpoint 恢复 + epoch 守卫。提交
a05e0d1。 - [2026-09-28] Wave 3 walking skeleton — agent-core turn 循环 + server 组装 + CLI(ping/run/chat)+ smoke-e2e。提交
e9c41db。 - [2026-09-28] Wave 4 工具调用系统 — 8 个内置工具 + 声明式权限元数据 + ToolSchedule/ToolExecution 状态接入。提交
3fa2006。 - [2026-09-28] Wave 5 命令权限控制 — 五级判定链 + bash argv 求值 + grantId 审批闭环 + 规则持久化 + 审计。提交
d44cfc4。 - [2026-09-28] Wave 6 P0 控制面补齐 — 22 方法 / 12 事件(steer/setMode/archive/config 域)+ 密钥引用制(apiKeyRef)。提交
26eb694。 - [2026-09-28] M1 收尾 — NFR 基准脚本五项达标(详见
docs/benchmarks/m1-2026-09-28.md)、architecture:check 与 oxlint 门禁。提交58c17fd。
格式:
[日期] 问题 → 根因 → 解决(归位 P-x / N-x,格式见 [docs/defensive-patterns.md](docs/defensive-patterns.md) §0)。同类问题复现时先查此表,再查防御式模式清单。
-
[2026-10-05] UI 异常态收口轮电脑控制验收首跑:真实 Web 工作台全部 RPC 返回
INTERNAL(面板白屏/无数据,产品路径看似全挂)→ 逐层排查定位根因:种子夹具config.json用 PowerShellSet-Content -Encoding utf8写入——该 cmdlet 的utf8实为带 BOM 的 UTF-8(首字节EF BB BF),ConfigStore解析到 BOM 首字符即判定「config.json is not valid JSON」并整链上抛;而仓库自身 shot/walkthrough 脚本用 Nodefs.writeFileSync(..., "utf8")(不写 BOM),故从未暴露此差异 → 夹具改用无 BOM UTF-8 写入后复验 12 项全过。非产品缺陷(真实用户路径经 GUI 保存配置不产生 BOM)。教训:跨工具(PowerShell ↔ Node ↔ JSON 解析器)对「utf8」的字节契约并不一致——写配置/夹具一律以无 BOM UTF-8 为准,解析失败先验字节头EF BB BF。归位 P-2 同族(对外部工具与序列化契约以实测字节行为为准,不得依赖参数名的字面承诺)。 -
[2026-10-04] smoke-ssh(L-02 真实连通)首跑 SshExecutor 双缺陷齐发:工具输出仅
sandbox: ssh无命令输出、loopback 服务端零 exec 记录 → 隔离探针定位双根因:SshExecutor.run/spawn 把 argv 数组裸 join 成 shell 命令串——① Windows 反斜杠路径(-i C:\Users\...)被 bash 当转义吃掉(Identity file C:Users15045... not accessible);② 远端命令内的&&被本地 shell 截断为本地命令链(ssh 只收到前半截且因非零退出短路)。m3 的 argv 级断言(buildArgv)验证的是 argv 世界,执行走的是 shell 字符串世界——L-02「从未真实连过服务端」正是这个盲区。修复:argv join 点统一 shell 单引号包装(bash 与 PowerShell 单引号均为字面语义;单引号转义习语两 shell 不同按 bash 处理,PS 回退属既有申报限制)+ 既有测试断言同步新不变量。教训:对断言面与执行面是两个世界的契约,必须至少真实执行一次。归位 N-5 新案例(argv 世界 ≠ shell 字符串世界);同族暴露面 DockerExecutor/WslExecutor(字符串投递契约)随 L-01 环境门控保留。另:smoke 侧 parseRemoteCommand 初版按 JSON.stringify 转义假设解析——实测本地 shell 传递会消耗一层转义(\→\、"→"),服务端(≡真实远端)须按线上实收形态解析。 -
[2026-10-04] L-15 样例首跑(CLI run 模式)所有 ask 类工具调用 0.0s 自动拒绝、预置审批应答全部落空 → 根因:
run不带--yes时审批策略为{kind:"deny"}(06 §2.10 非交互时序的显式语义),管道预置应答通道仅在 chat REPL(T4.9 B5 LineChannel)——模式语义非缺陷,改用 chat 模式(首行=任务提示,后续行=审批应答)复跑即通。附带:模型在未被告知工作区时臆造绝对路径(/Users/...),提示词补「工作区根即仓库根 + 用相对路径」后收敛——给模型的指令面必须显式声明环境事实。 -
[2026-10-04] T4.7 dist 打包链四连发(dev 树绿 ≠ 产物能用)→ ① better-sqlite3 双 ABI 世界:dev 树副本为系统 node 编译(CI/dev agent 走 node),packaged agent 以 ELECTRON_RUN_AS_NODE 运行(electron ABI)——NODE_MODULE_VERSION 失配即崩;② winCodeSign 7z 内 darwin 符号链接解包需管理员特权(「客户端没有所需的特权」),且对 Windows 未签名构建毫无用处;③
desktopRoot()的__dirname/../..算术在打包态解析进 app.asar(文件非目录)→ spawn agent ENOENT 且报错只指向 exe;④ electron zip / builder-binaries / prebuild 三条下载线 github 直连受限 → ① prepare-native.mjs 暂存 electron-ABI 副本(ABI 实测 + extraResources 分发 + NODE_PATH 回退注入 + 中性 cwd 探针自检——首版探针 cwd 在仓库内先命中 dev 树副本,假红/假绿两可,说明「自检探针必须声明自己验证的世界」);② dist.mjs 预填充 winCodeSign 缓存(容忍 darwin 两项失败 + Windows 侧校验);③ agent 目录 asarUnpack + app.asar.unpacked 孪生路径 + 安装根 cwd;④ 镜像 env 显式声明进脚本 → 安装冒烟 14/14 收口 L-04。归位 N-5(新增):宿主环境假设必须显式化并就地自检;修复锚点 apps/desktop/scripts/{prepare-native,dist}.mjs、src/main/main.ts、electron-builder.yml。 -
[2026-10-04] walkthrough-web 首跑「永远重连」假象:页面渲染正常、宿主侧零连接、node 同构探针(直连 ws + ws.auth)一切正常 → 逐层 CDP 抓证(/json/list 目标、Network.webSocket 握手事件、页内裸 WS)后定位:DevTools
/json/new?<url>端点把目标 URL 当 query 解析、在第一个&处截断(直拼与url=编码两形态实测一致)→ 带&ws=的工作台 URL 被静默剥参,页面回退默认端点ws://host:8787/ws(无服务)→ 永远重连。→ openTab 改为/json/new?about:blank建 tab + 按 targetId 连接 +Page.navigate导航完整 URL(CDP 通道不经 query 解析),两轮 19/19 稳定。归位 P-2(对外部接口的契约以实测行为为准,不得依赖文档想象的解析语义);另:emulateNetworkConditions(offline) 只拦新请求不掐既有 WebSocket,L-21 冻结复核改用 Page.setWebLifecycleState(语义即标签冻结)。 -
[2026-10-03] B5 修复首跑失败(复测仍超时 + ERR_USE_AFTER_CLOSE)→ 双根因叠加:① readline/promises
question()无挂起时到达的行被直接丢弃(预置审批应答丢失,LineChannel 队列修复此层);② 修复后复测仍失败——readline interface close 之后调用prompt(),其内部resume()对已关闭接口抛ERR_USE_AFTER_CLOSE('readline was closed')(管道 EOF 即刻到达,审批 next() 渲染提示即抛 → promptApproval reject → grant 悬空等 2 分钟服务端超时 → 主循环再抛 → exit 2),三份日志(两超时 + respond failed + exit 2)由此逐一对应 → LineChannel.next() 调整顺序:先消费队列 / 判定 EOF,仅在实际挂起等待(接口仍开放)时才 setPrompt+prompt()。教训:readline 非终端模式下close()后一切会触发resume()的调用(prompt/question)都带雷;行通道类封装必须在触碰 interface 前先判 EOF 与缓冲。最小复现:piped stdin 三行脚本对createInterface({input, output})关闭后调rl.prompt()即抛(queueLen>0 也不能幸免)。 -
[2026-10-03] B3 可视化复测出现真浏览器 stale(第二窗口完全不更新,协议层 smoke 全绿)→ 分层判别:node 第三连接探针(后连接、实时收齐 delta/completed/done)证明服务端扇出正常;node 客户端完整模拟窗口 2 路径(resume → setSeqBaseline → 订阅)同样实时收齐;CDP
Network.webSocketFrameReceived证实帧到达浏览器页面 → 服务端与 rpc 层均排除;结合第二窗口挂靠用户个人 Edge 配置(大量睡眠标签)、全程后台未聚焦、F5 唤醒后 resume 补偿立即拉平——最可能根因为 Edge 后台窗口标签冻结(JS 挂起),与原可视化测试报告「手动切换会话再切回才恢复」现象吻合。处置:L-21 观察项登记(挂 T4.7 CDP 真浏览器走查复核),协议层回归(smoke:web 用例 E + setSeqBaseline 防回退单测)先行锁定。附带教训:Stop-Process 按 MainWindowTitle 过滤 msedge 会连坐同一浏览器进程的全部窗口(含用户个人标签页)——杀 Edge 前必须确认 user-data-dir 维度。 -
[2026-10-03] smoke-memory case B(mtime 冲突确定性注入)复跑失败率 ~80%(T3.3 时 4/4 命中)→ 根因:Windows 文件时间戳有效粒度为系统时钟刻(实测本机 ~15.6ms tick)——「S1 stat → 注入外部 append → S2 stat」整个读-改-写窗口落在同一 tick 内时 mtime 完全不变(含亚毫秒位逐位相等),mtime 复检对同 tick 外部写天然盲视;T3.3 的 4/4 只是当时时序恰好跨刻,并非机制确定性 → 修复:FileSnapshot 增加
size参与变更判定(字节数精确无粒度,覆盖外部追加/改写主流场景),S2 复检与 rename 回退检查双路同口径,修复后 smoke-memory 6/6 确定性。教训:mtime 差分并发检测在 Windows 有时钟刻盲窗,双指标(mtime+size)才收敛。 -
[2026-10-03] 桌面走查发现 mcp.json 文档形态被拒载 + 损坏配置崩掉 agent → 双根因:① loadFile 直接用方法面 schema(serverKey 必填字段)校验文件形态,而文档/生态约定 serverKey 由 map 键承载,smoke 一直写冗余字段从未暴露;② McpRuntime.init() 的 MCP_CONFIG_INVALID 经 fire-and-forget
void init()成为未处理拒绝 → agent 进程崩溃 → 桌面守护 5 次放弃(「能跑通的门禁」≠「联调过的功能」再验证——mcp.json 用户路径从未被任何端到端走查覆盖)。修复:loadFile 按 map 键注入 serverKey(显式字段仅一致性校验,写回形态向后兼容)+ init 失败降级 stderr 诊断 + 域空转;生态形态与降级路径各以单测锁定。 -
[2026-10-03] 测试环境:机器负载下 web-client「服务未就绪」用例偶发失败 → 10ms 退避重连下「reconnecting」单点断言被 connecting 瞬态击穿(waitFor 命中后退避可能恰好翻转)→ 采样化:200ms 窗口内状态必须始终 ∈ {connecting, reconnecting} 且观测到过 reconnecting,意图不变消除刀口。另:当日多次发现昨日遗留 node 进程空转烧 CPU(挂起的测试子进程不退出,单测文件全部并行后连带时序用例失败)——复跑套件前先查杀孤儿 node 进程。
-
[2026-10-02] smoke:web 断线重连用例中「重连后回合事件丢失/误判缺口」→ 双根因:① delta 批量合并 × seq 缺口检测交互——服务端连续 delta(seq 5/6/7)在批量窗口内合并为一帧(seq 取最新=7),客户端 4→7 判缺口 → resync 丢弃 done(06 §3.4 与 §6.3 第 4 条叠加语义);② seq 基线只覆盖已订阅事件名——未订阅的 message.delta 不推进基线,下一事件 4→6 误判缺口。解决:缺口检测规则定为「message.delta 帧只推进基线不判定缺口(合并帧 seq=最新一条恰为后续事件前驱,天然桥接),其余会话事件逐帧投递跳变即真实丢帧」;web-client 连接期把 EVENT_SCHEMAS 全部已登记事件名挂上 ingestEvent(基线全见,未订阅事件也参与推进)。教训:传输层合并(§3.4)与端层丢帧检测(§6.3)在同一 seq 序列上共存时,检测必须以「永不合并的事件」为判定锚点、以合并帧为基线桥接。
-
[2026-09-29] smoke-memory case B(mtime 并发冲突)复跑偶发失败(冲突未命中或 INTERNAL)→ 双根因:① 真实竞态窗口 <1ms,固定次数 setImmediate 戳探在快机/负载波动下可能全部被读-改-写吸收(S1→S2 间隙未被覆盖);② 外部写落在 S2 复检与 rename 之间时,Windows 下 rename 因目标被短暂持有报 EPERM,未被归因直接冒泡为 INTERNAL → ② 在 project-file.ts 修复:rename 失败后复检 mtime,变化即归因 MEMORY_WRITE_CONFLICT(与 S1/S2 同口径)+ 临时文件清理;① 改为在途期间 setInterval(0) 持续外部写直至 promise 收敛 + 10 轮重放,复跑 6 次 5 过。残余时序敏感性已知:ESM 静态导入绑定原函数,进程内事后 patch fs.promises.stat 不传播(实测),确定性方案(prod 注入 stat 钩子)随 T3.3 记忆波次落地,暂不在 prod 加测试面。(2026-10-03 补注:T3.3 的注入缝方案在 Windows 同时钟刻下仍有 mtime 盲窗,最终修复见 2026-10-03 条目——FileSnapshot 增 size 判定。)
-
[2026-09-29] NFR-4 桌面端空载内存基准口径申报(T2.10 留存值 339.8MB 偏保守失真)→ 基准时 agent 子进程因 dev spawn 路径 bug(见 §3 场景 5 走查条目 a)处于崩溃循环放弃状态,进程树实际仅含 main+renderer/GPU,未计入 agent 子进程 → 修复后应复跑 bench:mem:desktop 留存新口径(M3 开工前补测)。
-
[2026-09-29] CLI
run回合收尾报failed to persist event "turn.phase_changed" EBADF→ done 事件后 CLI 立即关库,emitPersisted 的串行写队列中迟到的 phase 变更事件持久化失败(非致命,会话事实完整)→ 已知收尾竞态,暂不阻塞:Storage.close() 排空串行写队列列入 M3 内核小修。(2026-10-03 收口:T4.2 四层修复——流内写链排空 / Storage 关闭栅栏 / LoopEvents.flush / shutdownService 排空链,见 §3 T4.2 条目;legacy-items L-06 核销。) -
[2026-09-29] 电脑控制(computer-use)broker 在当前 ZCode 会话不可用(node_repl 桥 assertAvailable 报 unavailable)→ CUA 权限 broker 未随会话开通 → 以「electron --remote-debugging-port + CDP 真实输入事件 + PowerShell SendKeys 驱动原生对话框」等价替代完成 GUI 走查;原生对话框截图不可用 CDP(仅含页面栅格),以全屏 CopyFromScreen 兜底。
-
[2026-09-28] chat REPL 键盘输入双回显(键入 exit 显示 eexxiitt、退格只生效一次)→
rl与approvalRl两个 terminal=true 的 readline interface 挂同一 stdin,keypress 监听构造时常驻、按键被双消费各自回绘 → 删除 approvalRl,审批 prompt 复用主 rl(审批时主 question 已 resolve,无并发挂起)。教训:同一 stdin 只允许挂一个 readline interface(提交 d4090ac)。 -
[2026-09-28]
better-sqlite3安装脚本被 pnpm 拦截 → pnpm 默认禁止依赖运行构建脚本 →pnpm-workspace.yaml增加allowBuilds: { "better-sqlite3": true }。 -
[2026-09-28] llm 包类型错误(子类对只读
code重复赋值、cause缺override)→ 前代理遗留编译错误 → 修正子类继承结构。 -
[2026-09-28]
architecture-check行数误报 → EOF 换行导致文件行数 +1 → 修正计数逻辑,忽略 EOF 空行。 -
[2026-09-28] 跨包 import 越权 → 临时调试注入的跨包依赖不在
architecture/policy.yaml白名单 → 移除越权 import;新增占位包必须同步登记 policy。
取任务时必须回读
docs/07-dev-plan.md§12.2 对应任务行获取完整验收标准;遗留项全景见docs/legacy-items.md(当前:待收口 0 · 环境门控保留 2 · 申报性保留 5 · 运维保留 1——L-16 已于 T5.7 核销;申报性保留计数 2026-10-06 校准 4→5)。
M6「生态分发与治理收线」执行顺序(07 §12.2/§12.3,13 人日;T6.1/T6.2/T6.5 相互独立可穿插,T6.4 依赖 T6.3):
T6.1 插件 marketplace 分发基座✅ 2026-10-07(3 方法计划实做 4——增marketplace.add注册入口,additive 申报;逃逸防护/seed 双段校验/技能第三源/台账重装配全落地;smoke:marketplace 三用例 + 单测 +4 见 §3)T6.2 会话录制回放测试 lane✅ 2026-10-07(4 fixture 超验收 ≥3——plain-chat / tool-roundtrip / compaction / crash-seed 原字节归档;双路重放收敛 + 投影逐字段一致 + DB 级 resume 对账回写 + 崩溃种子残尾修复 + 凭据扫描 fail-closed;raincode replay子命令按 §12.3 顺延;单测 +3 见 §3)- T6.3 spill 溢出家族(2 人日)——超大工具结果落盘 locator + 消息引用替换 + read 回看 + 清理口径。验收:smoke 超大输出 → locator → read 回读一致 + microcompact 协同。
- T6.4
session.delete物理删除(1.5 人日,依赖 T6.3)——tombstone + vacuum 自设计(05-database 定案)+ 双端确认交互。验收:删除后不可见 / vacuum 回收无损 / 运行中拒绝。 - T6.5 Goal/Stop 判定 judge MVP(3 人日)——目标登记 + 独立 judge 三态 verdict(achieved/not_achieved/continue + evidence)+ 防早停续跑(有界)+ 审计落盘 + 判定证据化优先。验收:mock 四流程 + 真实 LLM 环境门控申报(不计门槛)。
- T6.6 工程收尾与遗留批次 D(1.5 人日)——knip 未用导出检测 / 架构
--changed增量 / L 批次复查(L-01/14/17/18/19/20)/ NFR 复跑 / M6 基准报告。
裁剪次序(07 §12.3):超支依次 T6.5 降设计 spike → T6.1 缩为最小分发 → T6.2 缩为纯 harness;不可裁 T6.3/T6.4/T6.6(治理主线与收尾纪律);质量门禁一律不裁。
M6 之后:M7+ 候选已沉淀 07 §12.5(守护/cron 四件套、jobs 后台任务、ACP 复议、动态工作流、PermissionRequest 动态权限、experimental 钩子区、MCP OAuth、checkpoint 晋升、Dream/Distill、Max Mode、FIFO 闸门、事件版本化、持久化 shell、rewind checkpoint 等)——排期前仍须先修订 01-PRD(07 风险 7 纪律)。环境门控项(L-01 Docker/WSL、L-14 其余 Provider 密钥与 ollama 模型、真 OpenSSH/Linux 远端)就绪即执行不计门槛:Provider 密钥到位 → 写入本地 config/remote-providers.local.json 跑 pnpm smoke:remote。开放 UI 线小项(未排期):沙箱 Tab(无 sandbox.* RPC 域,禁假 UI)、消息数徽章(session.list 无字段)、附件入口(L-24)、限流 429 横条。
| 触发事件 | 必须更新的文档 |
|---|---|
| 完成一个任务/波次 | §1 状态快照 + §3 追加日志(含提交号) |
| 解决一个技术问题 | §4 追加问题记录(复用价值高时另写入 docs/ 对应设计文档) |
| 完成一个里程碑 | §1 + §2 状态、docs/benchmarks/ 新增基准报告、README 功能清单 |
| 新增/变更用户可见功能 | README 功能特性节 |
| 新增/变更测试与门禁 | docs/testing.md |
| 方向性决策变更 | 对应设计文档(01~07)+ §3 记一笔 |
中断恢复三步:① 读本文件 §1/§5 → ② git log --oneline -10 核对最新提交 → ③ 读 07-dev-plan 对应任务行,继续开发。