DeepSeek Harness · 最早的 1000 个提交

1000 个提交 · 40 组 · 从旧到新 · 第一个 b67e81ac97 → 第 1000 个 a7b569850b

提交总结(g-00,共 25 个,从旧到新)25

b67e81ac97#1

仓库初始化:README、AGENTS.md 与 CLAUDE.md 符号链接

改动

新增 .gitignore、LICENSE、README.md、AGENTS.md,以及 CLAUDE.md(指向 AGENTS.md 的符号链接)。

目的

建立仓库骨架与基本的 agent 协作约定入口。

804eede9eb#2

在 AGENTS.md 中链接 MVP 需求分析与微内核架构文档

改动

AGENTS.md 追加 5 行,引入 MVP 需求分析与微内核架构设计文档的链接。

目的

把早期设计思路纳入仓库说明,为后续开发对齐方向。

ae2e08b4d6#3

搭建 monorepo 基础设施:Yarn 4 workspaces、tsc -b + dumble 构建、vitest

改动

新增 package.json、.yarnrc.yml、yarn.lock、tsconfig.base/build/test.json、scripts/build.ts、vitest.config.ts。

目的

确立 vendor/*(Cordis 源码)与 packages/*(dsh-* harness 包)两类 workspace;开发用 tsx + paths 直跑源码,构建用 tsc -b(声明)+ dumble(JS 包),测试用 vitest。

72688a3888#4

以源码形式 vendoring Cordis 框架包

改动

在 vendor/ 下扁平化放入 cordis 4.0.0-rc.6、plugin-loader、-include、-group、-timer、-hmr、-logger-console、cosmokit 1.8.1、schemastery 3.18.0;新增 vendor/README.md 作为清单(上游仓库 + SHA、本地改动日志、同步流程)。

目的

把 Cordis 作为源码而非依赖 vendoring 进来,保留原 npm 名、private: true;本地裁掉 hmr 的 locale YAML 引用避免运行时 YAML 钩子。

d5a1d9bb75#5

新增抽象 service 接口包

改动

新增 @deepseek-ai/dsh-llm(provider-neutral 内容块词汇表、StreamChunk 协议、ToolSchema、LlmAdapter、LlmService 注册表、BlockAssembler)、dsh-session(事件溯源 Session、SessionStore、session/flush 持久化缝)、dsh-system-prompt(有序 section + 工具 schema 提供者、assemble waterfall)、dsh-tools(工具注册表 + execute waterfall,沙箱/权限/钩子的单一缝)、dsh-agent(Agent 接口、AgentRegistry、agent/* 事件分类)。

目的

定义产品 API 主干的抽象接口(capability seam),让具体实现和循环彼此解耦。

43f4258277#6

实现 agent loop 插件

改动

新增 dsh-agent-loop:LoopAgent(带 queued + steering FIFO 的 inbox、per-step AbortController)与流式优先的 session/turn/step 循环;扩展缝含 agent/request、agent/step-result、agent/turn-continuation waterfall;附 16 个脚本化 mock 测试。

目的

给出唯一可替换的具体 agent 循环,验证整条主干能否端到端跑通(生命周期、工具往返、steering、inject、continuation 覆盖/否决、中止、回放等价、HMR 安全销毁)。

53d1ef4a74#7

新增可运行的 echo-agent 示例

改动

examples/echo-agent/ 下用 cordis.yml 串联 mock-echo LlmAdapter(流式文本 + "echo" 工具调用)、echo 工具、stdio 聊天 UI 插件、JSONL 持久化插件(演示 write-behind + session/flush checkpoint)。

目的

用最小可运行 demo 端到端验证整套架构(loader、include、HMR 热重载全部活跃,通过 yarn demo 直接跑源码)。

#8

`cacfae3cae** 架构文档落地并重写 AGENTS.md

改动

新增 docs/architecture.md(分层、service map、事件分类、session/turn/step 生命周期、Cordis waterfall 语义、扩展 cookbook、MVP-到-扩展点对照表、延期 TODO);重写 AGENTS.md(仓库布局、命令、约定、vendoring 政策)。

目的

把已经成型的设计写下来,对齐 agent 与人类贡献者。

217b8ec0e2#9

修复架构评审发现的问题(loop 与 service 包)

改动

高优先级(loop 流水线):agent/step-result 移到追加 assistant message 之前;中止在工具调用之间也生效;step 起点排空 steering、pending steering 可覆盖负向 continuation 决定、残余 steering 作为 queued 消息重入队;turn-continuation 与 session/flush 异常被圈在 turn 内(error 事件 + agent/error)。中低优先级:disposal 发 agent/status('disposed')、重复 LLM adapter 抛错、SessionEvent 变真 discriminated union、无模型 agent 报清晰错误、流严格按序 yield、BlockAssembler 在 block-end 冻结、turn 号从日志种子起算、stop disposer 不可抛等。附 21 个回归测试。

目的

落实评审意见,把若干隐性不变量改对并固化测试。

#10

`7f024a1a9d** 全面补文档并收紧类型安全

改动

为 packages/、examples/、examples/echo-agent/ 等每个目录补 README 与 AGENTS.md(+ CLAUDE.md 符号链接);为每个 packages/*/src 文件加模块级注释、为导出 API 加更完整 JSDoc;根 AGENTS.md 新增 "Type Safety and Documentation" 政策。类型:从 tsconfig.base.json 移除 noImplicitAny: false,清掉所有 : any / as any(catch 用 unknown + CodedError 收窄)。新增 dsh-tools schema DSL:SchemaSpec + InferArgs<S> + 转 JSON Schema + defineTool()(首方工具零 cast 拿到类型化 execute)。

目的

把仓库拉到"严格类型 + 充分文档"的基线,工具 schema 直接面向 JSON Schema 生成(弃用 schemastery)。

ef45ca823a#11

修复 schema DSL 在第二轮 Codex 评审中的问题

改动

InferArgs 真正产出 optional 键(RequiredKeys + 映射 ?);数组元素递归推断对象形状;工具执行对非 Error 抛出(如 throw { message })能正确报 message;schema 字面量用 satisfies SchemaSpec;新增 tsconfig.typecheck.json 把"测试与示例也类型检查"纳入 yarn typecheck。+4 回归测试。

目的

修掉类型层与运行层不一致的若干漏洞,新增 tests/examples 的类型门。

2b447625fa#12

文档与 defineTool DSL / demo 实际代码对齐

改动

docs/architecture.md 的 cookbook 工具插件示例改用 defineTool + 类型化 args,并注明原始 JSON Schema 仍是 MCP 互操作路径;echo-agent README 的 mock-llm / echo-tool 行与代码对齐。

目的

消除文档与代码漂移(前一提交的原始 JSON Schema + args: any 示例与紧邻的类型安全政策自相矛盾)。

d2fb352f3e#13

在自有包中开启最严格 TypeScript

改动

tsconfig.base.json 叠加 noUncheckedIndexedAccess、exactOptionalPropertyTypes、noImplicitOverride、noFallthroughCasesInSwitch、noUnusedLocals、noUnusedParameters;vendor 包本地 opt-out 以便上游同步。相应修复:index 访问承认 undefined、optional 属性省略而非置 undefined、Session.onAppend 显式 (…) => void | undefined 等。

目的

在不影响 vendor 同步友好度的前提下,把自有代码顶到最严类型档。

cb6bee3d03#14

引入 ESLint:typescript-eslint strict-type-checked + 风格化格式

改动

flat config 两层——正确性(no-floating-promises/no-misused-promises 是 agent loop 的主要 bug 类、switch-exhaustiveness、no-unnecessary-condition、require-await、no-explicit-any);风格(@stylistic:2 空格、无分号、单引号、尾逗号、max-len 140)。vendor 排除、测试放松若干。代码相应调整(registry disposer 包同步 () => void、BlockAssembler 用 mustGet 代替非空断言、waterfall tail 返回 Promise.resolve 等),新增 yarn lint / lint:fix。

目的

把既有 house style 从"agent 间漂移"变为机械强制。

bfb034830f#15

对 packages/*/src 强制 100% 单文件测试覆盖率

改动

vitest coverage(v8 provider)+ per-file 100% 阈值(statements/branches/functions/lines);范围限定运行时源码(types-only 文件、vendor、examples 排除)。新增 59 个测试补齐所有缺口(llm generate-waterfall/adapter 销毁、assembler 边缘协议、整个 Inbox 含 wakeup-overwrite 竞态、LoopAgent disposed 态、config 驱动 agent 创建、loop backstop、system-prompt 动态 section、tools schema 矩阵等);真正不可达的防御守卫带 /* v8 ignore */ 注释。

目的

用机械覆盖率门把"测试覆盖"从口号变成 CI 门。

6796a3922d#16

新增仓库卫生门:knip、publint、yarn constraints

改动

knip(workspace-aware,检未用文件/导出/依赖,vendor 排除,允许 default+named 双导出);scripts/publint-all.ts 检每个 packages/* 的发布正确性;yarn.config.cjs 用 constraints 机械化 AGENTS.md 包规则(全部 private、dsh-* 包 cordis 同时作为 peer+dev、统一 0.0.1 版本、ESM)。yarn hygiene 一键跑。

目的

把包规约从文档约束变成机械检查。

9d20a36cc4#17

引入 lefthook git hooks,带 vendor manifest 守卫

改动

lefthook.yml 配置 pre-commit(staged 文件 ESLint --fix、增量 typecheck、vendor manifest 守卫——vendor/*/src 改动必须同 commit 改 vendor/README.md)与 pre-push(测试 + hygiene);hooks 复用 package.json 脚本(单一真实源);postinstall 自动安装。

目的

把本地修改日志纪律和提交前质量检查机械强制到每个提交。

86955b96a4#18

新增 CI workflow:node 24 与 26 全量门矩阵

改动

.github/workflows/ci.yml(push/PR 触发):不可变安装、constraints、lint、typecheck(src + tests + examples)、带 per-file 100% 覆盖门的测试、knip + publint、完整 build、echo-agent demo 烟测(脚本化 stdin,断言工具调用往返与 JSONL 会话 dump)。

目的

把本地脚本和 git hooks 跑的同一组命令纳入 CI 矩阵。

#19

`225ed051b1** 新增 branded ID 类型:CallId、SessionId、AgentId

改动

用 unique-symbol brand 实现零运行时成本的 nominal string 类型(packages/llm/src/brand.ts);CallId 在 dsh-llm(跨 block/chunk/session 事件/执行结果关联工具调用)、SessionId 在 dsh-session、AgentId 在 dsh-agent;对外 string-in API(sessions.create、agentLoop.create)仍接 plain string 并内部 brand。

目的

阻止跨包 ID 误传(AgentId 不能塞进要 CallId 的位置),但只 brand 跨包 ID 而非每个 string。

370b5d3aab#20

新增 assertNever,区分 closed vs extensible union 的穷尽性

改动

dsh-llm 新增 assertNever(packages/llm/src/never.ts),用于 CLOSED union 的不可达 default——新增 StreamChunk 变体会在 BlockAssembler.push 处编译失败;模块文档 + AGENTS.md 约定明确:merge-extensible union(SessionEventMap、ContentBlockMap 等)禁止用 assertNever,应处理已知 case 后 fall through 并注释。

目的

在不误伤插件可扩展 union 的前提下,让闭合 union 的穷尽性由编译器守护。

#21

`9b8fccc6f9** 回填架构决策记录(ADR)

改动

docs/adr/ 下 7 条 ADR:vendoring Cordis(含 manifest 守卫)、微内核事件分类(单一可替换 loop)、事件溯源 session(派生历史 + append-before-emit)、自有 content-block 词汇表(为何不用 OpenAI/Anthropic 形状)、自定义 schema DSL(弃 schemastery)、工具 schema 进 prompt 装配、机械质量门(agent 写代码的理由)。

目的

把已做决策的"为什么"固化下来。

#22

`4dafad4db6** 为剩余质量提案新增 RFC

改动

docs/rfc/ 下 8 条提案(property-based testing、mutation testing、确定性测试 + 通用回放不变量 fixture + 夜间竞态压测、architectural conformance(dependency-cruiser + LlmAdapter conformance kit)、模型边界运行时参数校验 + 结构化错误分类、doc-sync(类型化代码片段、API 报告)、供应链检查 + 夜间 vendor-drift 验证、deep-readonly 公共面);AGENTS.md 指向 docs/adr 与 docs/rfc。

目的

把尚未落地的质量改进思路写成可评审提案。

#23

`630bbddf9a** 用 tsdown 替换 dumble 做 JS 打包

改动

删除 scripts/build.ts(dumble 编排),新增 tsdown.config.ts(workspace globs ['vendor/*', 'packages/*'],显式排除 examples),两个 per-package override 在 vendor/(schemastery 双 .mjs/.cjs、logger-console node+browser);yarn build = tsc -b && tsdown(tsc 仍管声明,dts: false、clean: false);输出与 dumble 快照 diff 完全一致(17 JS bundle、externals、双入口保持)。新增 ADR 0008。

目的

消除 dumble(0.2.x、~530 dl/wk、单维护者)的 bus-factor 风险,换到 rolldown-based、~2.5M dl/wk、活跃维护的 tsdown。

fa91bbac54#24

修 CI:按产物依赖排序步骤,解决 fresh-clone 构建

改动

CI 在 Lint 阶段爆 1519 个 no-unsafe-* 错误(本地因 lib/ 残留看不出来)。修复:把 Lint 移到 Typecheck 之后(type-aware ESLint 经 tsconfig.typecheck.json 解析 vendor 的 built 声明,需 Typecheck 先 emit);把源码级 paths 从根 tsconfig.json(dev-only、不被 package build 继承)移进 tsconfig.base.json,使整张 build 图源码优先解析(tsconfig.typecheck.json 仍整体覆盖为 lib 解析);Hygiene 的 publint 移到 Build 之后;checkout/setup-node v4 → v6;AGENTS.md 记录"fresh clone 需先 yarn typecheck 再 yarn lint"。

目的

让 CI 在干净 checkout 上也能通过。

#25

`5202da1581** 说明 vite-tsconfig-paths 为何不能用 resolve.tsconfigPaths 替代

改动

vitest.config.ts 加 15 行注释解释:Vite >=8 警告该插件可用原生实验性 resolve.tsconfigPaths 替代,但本仓库不行——原生选项按每个导入文件最近的 tsconfig.json 的 paths 解析,而我们的 paths 只在根 tsconfig,packages/* 和 vendor/* 的 workspace tsconfig 没有 paths,原生解析会 fall through 到 package.json exports(lib/,未 build 前不存在),所有未构建的测试导入都会失败(在 vite 8.0.16 / vitest 4.1.8 上验证)。

目的

把"为什么保留这个插件"的依据留在代码里,避免被未来的升级误删。

提交总结(g-01,共 25 个,从旧到新)25

0a122e5b8b#26

合并 PR #1:记录 vite-tsconfig-paths 无法被替代的原因

改动

vitest.config.ts 新增 15 行注释/配置说明

目的

文档化为什么 vite-tsconfig-paths 插件不能用 vite 原生 resolve.tsconfigPaths 替换,避免后续误删

e12d66e9dd#27

chore: 更新 gitignore

改动

.gitignore 新增 2 条忽略规则

目的

补充仓库需要忽略的产物/文件

353b0170c7#28

合并 PR #2:codex/update-gitignore

改动

合并 codex/update-gitignore 分支,内容同上一条 gitignore 更新

目的

将 gitignore 更新通过 PR 流程合入主线

8b5a3ef730#29

新增 bash 执行能力:dsh-bash / dsh-bash-local / dsh-tool-bash

改动

按 capability-seam 模式新增三包——dsh-bash(抽象 BashExecutor 服务 + 词汇类型)、dsh-bash-local(本地子进程实现:bash -c + 进程组 SIGTERM→SIGKILL、截断+溢出文件、后台任务注册表)、dsh-tool-bash(bash/bash_output/bash_kill 工具 schema + 运行时参数校验 + 通过 agent.inject() 发后台完成通知;非零退出上报而非报错);同时更新 docs/architecture.md、tsconfig、AGENTS.md、publint 脚本

目的

交付首个完整的 bash 执行 capability seam(接口/实现/消费者三件套),参考 Claude Code、OpenCode、Codex、pi 的 bash 工具设计

ab19fed77c#30

新增两个 DeepSeek LLM 适配器:dsh-llm-deepseek 和 dsh-llm-pi-ai

改动

新增首批真正的 LlmAdapter 实现——dsh-llm-deepseek(手写 fetch + SSE 解析 + chunk 翻译状态机,处理 thinking 模式、空串 reasoning_content 首块、usage 归并、reasoning_content 回传、cache token 计数)和 dsh-llm-pi-ai(经 @earendil-works/pi-ai 走同一端点);agent-loop 现在识别流末尾的 finish {error|aborted} 并转为 step error;新增 yarn test:e2e(带 key 门控、自跳过)跑 V4 Flash/Pro 全档位矩阵;更新 architecture.md 与 StreamChunk 文档

目的

用一对"同模型同协议、不同实现"的适配器交叉验证 StreamChunk 协议,并把 in-band error 路径落到实处

e98c1c5d42#31

新增 examples/coding-agent 与 docs/cookbook

改动

新增首个真实 agent 接线示例 examples/coding-agent(cordis.yml 组合 llm-deepseek + bash-local/tool-bash,bash 专用系统提示,max-steps 守护插件,stdio UI 带暗色 reasoning、pipe stdin 退出),swebench 风格 e2e(coding-task.e2e.ts 让测试自己重跑 add.test.js 验证而非信任 agent),以及三篇 cookbook(adding-a-package / adding-a-tool / adding-an-llm-adapter);修正文档中 !js 应为 !!js

目的

交付首个可运行端到端 demo,并把"加包/加工具/加适配器"的校验清单沉淀为文档

066f94c7e0#32

docs: 取消 Markdown 硬换行,每段一行

改动

对所有非 vendor 的 Markdown(加 vendor/AGENTS.md)做 reflow,每段散文压成单行;保留代码块、表格、列表结构

目的

消除段中硬换行,让一处改词不再触发整段 reflow 和 diff 噪音;约定写入 AGENTS.md

39b3db4b9c#33

docs: 准确性扫荡、architecture 重构、两条 ADR、review skill

改动

修正 AGENTS.md Commands(typecheck/build 描述、补全 lint/test:coverage/knip/publint/hygiene);用 demo:echo + demo:coding 取代裸 yarn demo;新增 cookbook adding-a-vendored-package.md;architecture.md 加目录、抽出 extension-cookbook;新增 ADR 0009(capability seams)+ 0010(双 LLM 适配器);提交 dsh-code-review skill 并通过 .claude/skills 符号链接暴露给 Claude Code

目的

补齐命令文档、补齐 vendor 包添加流程、固化两条架构决策、引入代码评审 skill

36a30180b8#34

feat(tools): 在边界校验模型生成的工具参数(RFC 005 pt 1)

改动

defineTool 在 execute 前对 SchemaSpec 跑 validateArgs,畸形调用返回可自纠的 isError 而非穿透到类型体;校验语义与 schemaSpecToJsonSchema 完全一致(required 仅来自 required:true、允许额外键、不应用 default 等);tool-bash 去掉手写类型/required 检查,只保留 DSL 表达不了的值约束;RFC 005 pt 1 升格为 ADR 0011

目的

在工具执行边界挡住模型畸形调用,避免"名义有类型、实际无类型"

11f85b4f88#35

fix(tools): 按 Codex 评审修正参数校验(PR 1)

改动

enum 成员检查对所有 SchemaTypes 统一生效(原先只查 string);checkValue switch 以 assertNever 收尾;同步 cookbook;弱化 ADR 0011 关于属性测试的措辞

目的

修正首轮评审发现的 enum 漏检和闭联合收尾问题

11a29fdefe#36

feat(invariants): dev 模式事件契约断言 + session log 冻结(RFC 005 pt 3、RFC 008)

改动

新增 dsh-invariants 插件(纯监听器,prod 关闭),在运行时断言事件分类——seq 单调、turn/step 嵌套、tool/result 必须有前置 tool/call(反向不要求)、合法 agent/status 转移;并对已记录事件数据做 deepFreeze;session/created 时检查并冻结 seeded 会话;真正常态修复是 deriveMessages 改为 structured-clone,使 loop/adapter 的 sanctioned 变更无法回写 append-only log;新增 ADR 0012(dev invariants 优于 DeepReadonly);两个 demo 都接入

目的

在开发期以运行时断言守住事件契约和日志不可变,常态路径用 clone 彻底切断回写

89e63f1436#37

fix(invariants): 按 Codex 评审修正 dev invariants(PR 2)

改动

HMR 状态正确性——inject 会话、按重放已有 session log 重建每会话 trace,reload 不再误报;收紧嵌套(turn/end 拒绝未闭合 step、chunk/message/tool 事件必须命名当前 turn+step、pendingCalls 在 step/end 清空避免跨步污染);去掉默认导出(会丢 inject 元数据,改用具名导出对齐 tool-bash);文档化 deepFreeze 自顶向下前提

目的

修正 HMR 重载误报、收紧嵌套规则、修复导出形式

2f6d3b8539#38

test: 为协议形状代码加属性测试(RFC 001)

改动

引入 fast-check,为 llm/BlockAssembler、session、tools/schema DSL、agent-loop 调度各加 properties.spec.ts;tools 套件覆盖 RFC 001↔005 组合属性(满足 spec 的生成参数必过 validateArgs),堵住 ADR 0011 提到的 validator/InferArgs 漂移;loop 属性确定性(不依赖 sleep);首次运行即发现 BlockAssembler 真实 bug(同 index 重复 block-end 覆盖已 flush 的块),修复并加回归;RFC 001 升格为 ADR 0013

目的

用基于属性的测试覆盖协议形状代码,并顺手暴露 assembler 的重复块 bug

7b07b70750#39

test: 按 Codex 评审修正属性测试(PR 3)

改动

llm 生成器补发 finish 块(原先 finish-defaults 属性恒绿)并加流式/一次性装配一致性属性;agent-loop 断言同步突发只合成一个 turn、加 mixed-schedule 属性、recordStatus 返回 disposer、每 run 独立超时;session 随机化 noise/message 交错;tools 生成数值参数排除非有限 double

目的

补齐评审指出的属性覆盖空洞,让属性测试真正有意义

6a528be569#40

build: doc-sync 门禁——typecheck 文档代码块 + 校验事件分类(RFC 006 pts 1-2)

改动

新增两个 tsx CI 门禁——doc-typecheck(抽取 README/docs/package README 的 fenced ts 块,用 tsc --noEmit 编译,允许 ts ignore-check 退出并设上限)和 verify-event-taxonomy(断言 architecture.md 分类表的事件名与 interface Events 块完全一致;这次顺手补了三个漏表事件 tools/change、llm/adapter-change、system-prompt/change);为代码片段补 stub 声明使其可编译;接入 CI;RFC 006 pts 1-2 升格 ADR 0014

目的

让文档与代码漂移在 CI 早期失败

7a39616a06#41

fix(scripts): 加固 event-taxonomy 大括号遍历以应对 JSDoc 大括号(PR 4)

改动

verify-event-taxonomy.ts 在 interface-Events 大括号遍历前先剥注释,避免 Events 块内 {@link} 或 // { 行打乱深度计数

目的

消除评审指出的潜在计数失衡风险(事件名只在代码不在注释,剥注释无损)

825b57aff9#42

feat(llm): 带 HarnessError 基类的结构化错误分类(RFC 005 pt 2)

改动

在叶包 dsh-llm 引入 HarnessError——稳定可机器路由的 code、cause 链、子类名即 name、isHarnessError;LlmError/ToolArgsError/InvariantError 均改为其子类;ToolExecutionResult 增 error: {name, code}(由抛出的 HarnessError 填充),loop 将其转发到 tool/result 事件(同字段可选),toError 把非 Error 抛出包成 HarnessError(code: UNKNOWN, cause);RFC 005 pt 2 升格 ADR 0015,RFC 005 至此全部落地

目的

用统一的结构化错误基类让工具失败信息端到端可路由,替换先前 PR 的裸 Error+code

a45bc8da67#43

fix(invariants): deepFreeze 遍历已冻结对象的子孙

改动

deepFreeze 去掉 Object.isFrozen 提前返回,始终向下递归并用 WeakSet 记录已访问对象以做循环终止与幂等

目的

修正 PR 评审发现——调用方传入浅冻结对象时旧逻辑会跳过整棵树,留下可变子孙,违背 ADR 0012 的历史不可变承诺

fa7d1df6f2#44

build: 在本地 pre-push hook 也跑 doc-sync 门禁

改动

新增共享 doc-sync package.json 脚本(doc-typecheck + verify-event-taxonomy)接入 lefthook pre-push,CI 步骤也指向同一脚本

目的

原先 doc-sync 仅在 CI,本地推完才发现;统一脚本一处真相、本地提前拦截(对齐 ADR 0007)

bed91b46d5#45

fix(tools): 给 unknown-tool 失败补结构化错误码

改动

注册表的 unknown-tool 分支原先只返回 isError 文本、无 {name, code};现引入 ToolNotFoundError(HarnessError,code UNKNOWN_TOOL)并把 unknown-tool 走与工具抛错相同的 catch 路径,两类失败都从同一出口暴露结构化元数据

目的

堵上本 PR 引入的分类法缺口,让 unknown tool 也产出可路由错误

1c61efccf8#46

合并 feat/rfc005-dev-invariants 到 feat/rfc001-property-tests

改动

把 dev-invariants(含 a45bc8da67 的 deepFreeze 修复)合进 property-tests 分支

目的

在 property-tests 分支上叠加 dev-invariants 的最新结果,为后续链式合并做准备

75044c9711#47

合并 feat/rfc001-property-tests 到 feat/rfc006-doc-sync

改动

把 property-tests(含上一步并入的 dev-invariants)合进 doc-sync 分支

目的

继续把 RFC 链向 doc-sync 分支汇聚

58627f075d#48

合并 feat/rfc006-doc-sync 到 feat/rfc005-error-taxonomy

改动

把 doc-sync 分支(已含前面两条 RFC 的累积改动)合进 error-taxonomy 分支;CI、lefthook、ADR 0014、invariants 包一起带入

目的

将四条 RFC 分支汇总到 error-taxonomy 分支,准备统一出 PR

91d7515fd8#49

docs: 新增开发环境搭建指南

改动

新增 docs/development.md(97 行),README.md 加入对应入口

目的

补齐"如何从零搭起本地开发环境"的文档

c3a3b6ae41#50

docs: 厘清 CI 与 hook 门禁

改动

docs/development.md 增补 19 行,澄清 CI 与本地 hook 各自跑哪些门禁

目的

让贡献者明确本地 hook 与 CI 的分工边界

提交总结(g-02,共 25 个,从旧到新)25

40298c2847#51

精简 README 指引

改动

README.md,删除 3 行冗余指引文字。

目的

压缩 README 中的指导内容,为后续按受众拆分做准备。

0853f52f49#52

按受众拆分 README 指引

改动

README.md,将指引按读者类型分条。

目的

让不同受众(用户/贡献者)各取所需,提升可读性。

f2524e9c45#53

同步开发指南与分层 gate

改动

docs/development.md,补充分层(stacked)gate 的描述。

目的

让开发文档与实际 CI/lefthook 中分层执行的 gate 保持一致。

7586caf2dd#54

澄清 Node CI 矩阵

改动

docs/development.md,修正 Node 版本 CI 矩阵表述。

目的

准确说明 CI 测试覆盖的 Node 版本范围。

9b1507a2b7#55

合并 PR #12:RFC 005 第 1 部分 — 运行时工具参数校验

改动

合并 feat/rfc005-arg-validation 分支。新增 ADR 0011;在 packages/tools/src/schema.ts 中实现工具参数运行时校验(+119 行),packages/tools/src/index.ts 暴露校验入口;tool-bash 适配;补全 tools/tool-bash 测试;更新 cookbook 与 RFC 005 状态。

目的

落实 RFC 005 第一阶段,在工具调用入口对模型传入的参数做 schema 校验。

751403bd1a#56

合并 PR #14:RFC 001 — 面向协议形状代码的 property-based testing

改动

合并 feat/rfc001-property-tests 分支。新增 packages/invariants(240 行实现 + 331 行测试 + README/package.json/tsconfig),引入 fast-check(yarn.lock + package.json);为 agent-loop/llm/session/tools 各加 properties.spec.ts;新增 ADR 0012、0013;更新多份 tsconfig 与 example cordis.yml。

目的

为协议形状(protocol-shaped)代码引入 property-based 测试与不可变性/invariant 检查基础设施。

204c36ed76#57

合并 PR #15:RFC 006 第 1-2 部分 — doc-sync gate

改动

合并 feat/rfc006-doc-sync 分支。新增 scripts/doc-typecheck.ts(校验 markdown 中可编译 ts 代码块,151 行)和 scripts/verify-event-taxonomy.ts(校验事件分类表,114 行);接入 CI(.github/workflows/ci.yml)、lefthook 与 package.json scripts;新增 ADR 0014;更新多份 README/architecture/cookbook。

目的

建立文档同步门禁,防止文档中的代码示例和事件分类表与实现脱节。

d82b4e0d88#58

合并 PR #17:RFC 005 第 2 部分 — 结构化错误分类(HarnessError)

改动

合并 feat/rfc005-error-taxonomy 分支。新增 packages/llm/src/error.ts(HarnessError 基类,33 行);packages/tools 重构错误抛出(schema.ts/index.ts);agent-loop/src/loop.ts 调整错误处理;invariants 适配;补全各包测试;新增 ADR 0015。

目的

统一全 harness 的错误模型,用结构化 HarnessError 取代裸 Error,配合运行时校验产出可分类错误。

87608f3c32#59

合并 PR #16:文档 — 新增开发环境搭建指南

改动

合并 codex/dev-guide 分支。新增 docs/development.md(118 行开发环境搭建说明),更新 README.md 指向。

目的

补齐新贡献者上手所需的本地环境与工具链说明。

a44f7f3486#60

新增 RFC 009-011(会话持久化 + ACP 支持)

改动

新增三份 RFC:009 抽象 append-only 的 SessionPersistence 服务(基于现有 SessionEvent log,JSONL 实现,SessionMeta 头,异步 resume 路径);010 ACP(Agent Client Protocol)支持作为 dsh-acp 客户端驱动插件;011 在单连接上多路复用并发 ACP 会话;更新 docs/rfc/README.md。

目的

为会话可恢复性与 ACP 接入做设计铺垫,依赖顺序 009→010→011。

64ce7caedc#61

修订 RFC 009-011 的评审反馈

改动

修改 009/010/011 三份 RFC。009:dsh-session 拥有 SessionMeta(持久化层 re-export)以避免包循环;将可变摘要拆到 sidecar 以保持事件 log append-only;确定 load-repair 规则。010:去掉"零运行时依赖"说法(SDK 有 zod peer);session/new 需要 create seam;dsh-agent 提供抽象 create/resume 工厂;明确 TurnEndReason→ACP StopReason 映射;MVP 拒绝非空 additionalDirectories。011:用真实 per-session disposer scope 取代 ctx.extend()。

目的

根据 PR #18 评审意见修正设计,使其与代码库、@agentclientprotocol/sdk@0.25.1 和 Cordis 语义自洽。

de73afbe39#62

修复 RFC 009-010 自洽性问题

改动

009 将"crash-tail overwrite"重新定义为一次性 truncation-repair(ftruncate+fsync 到上一个完整 turn/end 字节偏移),只删除从未提交的崩溃尾部,明确不重写已提交事件;010 移除剩余的 concrete-loop 引用,session/new 与 session/load 改指向 dsh-agent 工厂,Risks 中的 disposal 用接口级 settle 信号(agent/status)替代 LoopAgent 专属的 agent.done。

目的

消除 append-only 契约与崩溃恢复措辞间的矛盾,去除对具体 loop 实现的耦合。

5cec4c2f65#63

合并 PR #18:RFCs 009-011 — 会话持久化 + ACP 支持

改动

合并 feat/rfc009-011-acp-and-persistence 分支,落地上述三份 RFC(含前两次修订)。

目的

正式采纳 009/010/011 设计。

b8d4790e98#64

同步高权威文档与 doc-sync gate(P1-16)

改动

AGENTS.md:Repository Layout 加入 invariants/,Commands 加入 doc-typecheck/verify-event-taxonomy/doc-sync,重写"CI 无 doc-sync gate"的错误表述为 gate 实际覆盖范围;packages/AGENTS.md 修正同一过时表述;packages/README.md 在依赖图与包表中加入 dsh-invariants。

目的

doc-sync gate 与 dsh-invariants 已落地但指令文档未跟上,且 gate 的 markdown 范围不覆盖 AGENTS.md 导致静默漂移;此次同步纠正。

bcfff6f1ee#65

修正 code-review skill 中关于 doc-sync gate 的表述(PR1 review)

改动

.agents/skills/dsh-code-review/SKILL.md,将"doc-sync 规则没有 gate"改为准确表述(gate 确实校验可编译 ts 块和事件分类表,只有 prose 漂移未被 gate 覆盖)。

目的

code-review 发现 P1-16 同类过时表述存在于第三处文件,一并修正;ADR 0014 已确认正确无需改动。

9d5b3ab832#66

fix(agent-loop):在 emit agent/step-start 前先 append step/start(P1-6)

改动

packages/agent-loop/src/loop.ts,交换两行顺序使 session.append('step/start') 先于 emit;同步修正 runLoop JSDoc 伪代码和 docs/architecture.md 中同样的顺序错误;新增回归测试。

目的

所有 loop 边界都遵循 ADR 0003 的 append-before-emit 规则,唯独 step/start 反了,导致 agent/step-start 监听器看不到刚被告知开始的 step。

22e9152d8b#67

fix(agent-loop):出错时始终关闭已开始的 turn 和任何打开的 step(P1-5)

改动

packages/agent-loop/src/loop.ts(+212/-71)重构 runTurn 为基于幂等 finalizer 的结构:closeStep()/closeTurn() 受 stepOpen/turnEnded 守卫至多执行一次;failTurn() 用 errorReported 守卫保证错误事件和 agent/error 只发一次;catch 中先关 step 再关 turn(invariants 拒绝 step 开着时的 turn/end),仅 pre-turn 抛出时 rethrow;disposal precedence 规则改为 reason 在 disposed 且无错误时报 disposed。新增 review-fixes.spec.ts(248 行,6 个场景,以 dsh-invariants 作 balance oracle);agent-loop 增加 dsh-invariants devDependency(仅测试用)。

目的

turn/start 之后任何 throw 都无法保证 turn/end,留下不平衡 turn,破坏 replay/telemetry/invariants 的基本假设;此次补全所有错误路径下的 turn/step 闭合。

37576ade6a#68

fix(agent-loop):tool/result 记录在原始 call.id 下(P1-7)

改动

packages/agent-loop/src/loop.ts,将 tool/result 的 callId 从 result.callId(tools/execute waterfall listener 返回值)改为 call.id(loop 的权威 id);新增测试验证监听器返回错误 callId 时仍记录正确 id,且 deriveMessages() 产出的 tool-result block 的 toolCallId 配对正确。

目的

callId 是模型转写关联 id,deriveMessages() 用它生成 tool-result block 的 toolCallId 必须与 assistant tool-call block 配对;错配会在下一次模型请求中孤立该配对。

2df41ee1d3#69

fix:六个注册方法在 change-listener 抛错时保持原子性(P1-1)

改动

packages/llm/src/index.ts、packages/agent/src/index.ts、packages/session/src/index.ts、packages/system-prompt/src/index.ts、packages/tools/src/index.ts,将 registerAdapter/register/create/section/tools/register 六个方法改为 generator-effect 模式(mutate → yield disposer → emit change),与 AgentLoop.create 已验证模式一致;为每个方法新增 listener-throw 回滚测试。

目的

Cordis 中 effect 返回 disposer 前同步抛错会让 fiber 无可收集对象,导致注册项永久泄漏(HMR/dispose 无法清理,duplicate-name 检查卡死直到重启);generator-effect 保证后续步骤抛错时已 mutate 的状态能被回滚。

1cc6e1caf7#70

新增 RFC 012(所有工具可选的 Code Mode)

改动

新增 docs/rfc/012-optional-code-mode.md(84 行)与 README 条目。提出可选 Code Mode:模型编写 TypeScript 程序调用生成出的 SDK(包装所有注册工具),而非每步发一个原生 tool-call;按 Cordis capability-seam 三件套实现(code-runtime 接口 / node:vm 参考桩 / code-mode consumer 插件),零核心包改动;硬化的执行底座延后到后续 RFC。

目的

为工具组合与减少往返提供新的执行模型设计。

6d9934103d#71

修订 RFC 012 的 PR 评审(并发、vm guard、prompt 预算)

改动

docs/rfc/012-optional-code-mode.md。并发:改为强制 serialize-by-default(SDK binding 中 per-run dispatch queue,非重叠为硬性验收标准);node:vm guard:改为可执行的(CodeRuntime 暴露 safe:boolean,VM stub 除非 { unsafe:true } 构造否则抛错,code-mode 在不安全 runtime 上拒绝注册 run_code 除非 allowUnsafeRuntime,测试覆盖拒绝路径);prompt 预算:撤回"零 prompt token"说法(SDK .d.ts 注入 system prompt 会消耗上下文),补充 budget/caching tradeoff(Code Mode 节省的是输出/往返而非输入侧工具描述)。

目的

根据 PR 评审把模糊建议变成可执行、可测试的硬约束。

1b7c376aec#72

修订 RFC 012 第二轮 PR 评审(备选方案、表述)

改动

docs/rfc/012-optional-code-mode.md。新增 Alternatives 段:对比更窄的原生 tool-calling 上的 result-elision/summarization(解决 context-bloat 但不解决组合/往返)和 parallel native dispatch(核心 loop 改动仍缺组合),说明为何选 Code Mode 及其代价;修正 Problem 段表述,把"模型可并发运行独立调用"改为"表达 fan-out,在有并发安全元数据前先序列化"。

目的

消除与 serialize-by-default 决策的矛盾,讲清早期收益是组合 + 更少往返而非并行。

2638ec9f3f#73

合并 PR #19:RFC 012 — 可选 Code Mode

改动

合并 worktree-rfc-012-code-mode 分支,落地 RFC 012(含两轮评审修订,共 102 行)。

目的

正式采纳 Code Mode 设计提案。

a1eea4d36e#74

在 RFC 012 中标注多语言 Code Mode 后端

改动

docs/rfc/012-optional-code-mode.md,补充 CodeRuntime seam 可承载按语言/运行时不同的后端(如天然沙箱化的 AssemblyScript/WASM 后端、基于 CPython 或可嵌入解释器的 Python 后端);执行契约语言无关,但 SDK codegen/prompt 呈现按语言定制;将这些后端列入延后 follow-up。

目的

澄清 seam 不限于按信任级别区分后端。

76602a0844#75

合并 PR #26:文档 — RFC 012 多语言后端说明

改动

合并 worktree-docs+rfc012-multi-backend 分支,落地上一条 RFC 012 多后端说明。

目的

正式并入多语言 Code Mode 后端的补充说明。

提交总结(g-03,共 25 个,从旧到新)25

3783f3e178#76

agent-loop:把 step-end 监听器抛错升级为 turn 错误

改动

packages/agent-loop/src/loop.ts 的 closeStep() 原先 catch 后静默吞掉 agent/step-end 监听器抛出的异常,导致 runTurn 仍以 completed 收尾,session 记录一个零错误事件的"成功"轮次;改为调用 failTurn(toError(error)) 追加单一错误事件并将 reason 置为 error。新增 review-fixes.spec.ts 回归测试。

目的

兑现"抛错的插件必须被收敛为 turn 错误而非静默成功"的契约。

0731ed374b#77

session:新增 metadata seam 并强制 JSON 可序列化不变量

改动

packages/session 新增 SessionHeader/SessionSummary/SessionMeta/CreateSessionOptions,Session 暴露 readonly header,SessionStore.create 接受 { seed, meta } 并校验 cwd/父会话血缘;新增 json.ts 的 isJsonValue(拒绝 BigInt/函数/symbol/undefined/非有限数/稀疏数组/循环引用/exotic 对象);Session.append 与构造器对 seed 事件做可序列化与 seq 连续性校验。迁移约 3 处内部 create(id, seed) 调用点,调整 invariants 测试。

目的

在源头保证日志可被任意持久化后端无丢失地序列化,为后续 durable backend 打底。

b0bc0b5792#78

agent-loop:turn-enclosure 不变量 + turn 后错误模型

改动

要求所有 session 事件必须落在某个 turn/start…turn/end 之间;循环在 turn/start 之后入队 user/message 事件,idle agent.inject() 用一次性 injection turn 包裹上下文/消息;turn 关闭后的失败(session/flush 拒绝、agent/turn-end 监听器抛错)只能经 agent/error + logger 上报。dsh-invariants 通过 default 分支强制该不变量;新增 ADR 0017 与 architecture.md 更新;agent/loop 大量测试。

目的

把 turn 作为唯一的 durability/replay 边界,使持久化后端可安全截断最后的 crash tail。

df4b7d3d9a#79

session-persistence:抽象 seam + JSONL 后端 + 接线

改动

新增 dsh-session-persistence(抽象 SessionPersistence 服务,ctx.sessionPersistence,定义 create/append/load/list/has/delete/update,复用现有 SessionEvent)和 dsh-session-persistence-jsonl(每会话 append-only JSONL 日志、原子写、未提交 tail 截断修复、replay 路径,SessionMeta 走 session.header);提供共享 runPersistenceContract 套件。examples 移除手写 session-jsonl.ts 改由 cordis.yml 加载 JSONL 后端;config-driven create 改用 ${id}-session-<uuid> 避免命名冲突。ADR 0016。

目的

建立可插拔持久化能力 seam,并给出第一份实现以验证抽象。

9a4006cb2b#80

agent:create/resume 工厂 seam

改动

packages/agent 新增 AgentRegistry(ctx.agents:setFactory/create/resume)与 AgentFactory/CreateAgentOptions/ResumeAgentOptions;AgentLoop 实现该接口并自注册。create 接受调用方提供的 sessionId,resume 经 ctx.sessionPersistence 载入后恢复(turn 编号与历史延续),sessionPersistence 不做硬注入(无后端 demo 仍可跑),缺失时 resume 以带类型错误拒绝;assertAgentIdFree 在建会话前后各跑一次防孤儿会话。新增 resume.spec.ts。

目的

让插件经接口而非具体 loop 包创建/恢复 agent。

9126697d87#81

session-persistence-sqlite:第二个后端验证抽象

改动

新增 dsh-session-persistence-sqlite(基于 node:sqlite),每条 SessionEvent 1:1 映射到 events 行(session_id/seq/type/time/data),append 为事务内 INSERT 且断言连续 seq;可变 SessionSummary 落在 sessions 元数据行。满足与 JSONL 相同的契约语义(延迟物化、crash-tail 裁剪、事务回滚),并跑共享 runPersistenceContract + SQLite 专属测试。文档将所有"SQLite 待办"改为"已实现"。

目的

用第二份实现证明抽象 seam 与共享契约确实后端无关。

4e3524f859#82

Merge PR #20:docs/sync-doc-sync-gate-and-invariants

改动

合并 docs/sync-doc-sync-gate-and-invariants 分支,同步 .agents/skills/dsh-code-review/SKILL.md、AGENTS.md、packages/AGENTS.md、packages/README.md。

目的

让 doc-sync gate 与 dsh-invariants 相关的高权威文档与代码对齐。

247c408e75#83

Merge PR #21:agent-loop step-start 顺序修正

改动

合并 fix/agent-loop-step-start-order,loop.ts 调整为先 append step/start 再 emit agent/step-start,并在 review-fixes.spec.ts 增测;architecture.md 同步。

目的

保证监听器触发时 step/start 已落日志,避免监听器看到无对应事件的 step-start。

c0257dafcb#84

Merge PR #22:agent-loop turn/step 平衡修正

改动

合并 fix/agent-loop-turn-step-balance,loop.ts(约 215 行变更)重写错误路径,确保任何已开启的 turn 与未关 step 在出错时都被关闭;review-fixes.spec.ts 新增 288 行回归。

目的

任何错误路径下边界事件都必须配对,符合 turn-enclosure 不变量。

328863e458#85

Merge PR #23:tool/result 记录到原 call.id

改动

合并 fix/agent-loop-tool-result-callid,loop.ts 让 tool/result 以发起调用的 call.id 写入日志;review-fixes.spec.ts 加测。

目的

保证 tool 调用与结果在日志中的调用 id 对齐,便于重放与关联。

30765bd6d5#86

Merge PR #24:六处注册方法的原子性

改动

合并 fix/registration-atomicity,对 agent/llm/session/system-prompt/tools 五个包(六个注册方法)调整注册逻辑使其原子化,并各自补测。

目的

注册失败时不会留下半注册状态,保证注册副作用可回滚。

611791ba7f#87

Merge origin/master into split/session-meta

改动

把 origin/master 合入 split/session-meta,带来 docs/rfc/012-optional-code-mode.md、loop.ts 的 9 行修正与对应 review-fixes 测试。

目的

把 master 的最新进展并入 session-meta 分支以便继续栈式开发。

3cc074ba5c#88

Merge split/session-meta into split/turn-enclosure

改动

把 split/session-meta 合入 split/turn-enclosure(解决 review-fixes.spec.ts 冲突),内容同 611791ba7f。

目的

栈式 PR 的 merge-forward,保持下游分支基于最新基。

5f3a1e4d60#89

Merge split/turn-enclosure into split/session-persistence

改动

把 split/turn-enclosure 合入 split/session-persistence,内容同前。

目的

沿 PR 栈继续 merge-forward。

6455a1600d#90

Merge split/session-persistence into split/agent-factory

改动

把 split/session-persistence 合入 split/agent-factory,内容同前。

目的

栈式 merge-forward。

bc670e69f3#91

Merge split/agent-factory into split/session-persistence-sqlite

改动

把 split/agent-factory 合入 split/session-persistence-sqlite,内容同前。

目的

栈顶分支对齐,准备最终合入。

ccbc4f533f#92

session-persistence-sqlite:append 快照与 corrupt-tail 加载的 JSONL 一致性

改动

src/index.ts 让 append() 在入链等待前同步做可序列化校验并 structuredClone 整批,避免调用方事后修改持久化副本/游标;load() 仅用 seq+type 列计算 cutAtLastTurnEnd,只对已提交前缀解析 data,crash tail 中的坏 data 丢弃而非整体不可加载。新增两类回归测试。

目的

与 JSONL 后端行为对齐,修复 review 中发现的两处一致性缺口。

5299e43bed#93

session:边界处对 seed 与 append 数据做快照(review #31)

改动

packages/session/src/index.ts 构造器在校验后深拷贝每个 seed 事件(原先只复制数组、对象仍共享),append() 存储 structuredClone(data) 并让返回事件携带同一快照;json.ts 补充 isJsonValue 范围说明;README 同步 create() 签名与 meta.createdAt。新增事后修改 seed/append 对象的回归测试。

目的

把可序列化不变量从"预检"升级为真正的不变量,避免事后修改污染日志。

da81709a31#94

Merge split/session-meta into split/turn-enclosure

改动

把 split/session-meta(含 #31 修复)合入 split/turn-enclosure。

目的

将 review #31 的修复 merge-forward 到下游分支。

4535bfab75#95

agent-loop:基于日志判定 turn 平衡与 idle 注入 flush(review #32)

改动

loop.ts 的 outer catch 不再依赖 turnStarted 标志(turn/start 监听器抛错会让标志为 false 而漏写 turn/end),改为从日志读取本 turn 的 turn/start 是否存在;agent.ts inject() 的 idle 一次性 turn flush 同样改为从日志判定;throwing turn/end 监听器与 idle flush 失败统一经 agent/error + logger 上报。重写编码旧错误的测试并补回归。

目的

消除"监听器抛错 → 永久开 turn / 丢失持久化检查点"的竞态,兑现 ADR 0017。

b4785e598b#96

Merge split/turn-enclosure into split/session-persistence

改动

把 split/turn-enclosure(含 #32 修复)合入 split/session-persistence。

目的

栈式 merge-forward。

01621d38b6#97

session-persistence-jsonl:暴露非 ENOENT 存储错误并加固 sidecar(review #33)

改动

新增 isENOENT() 助手;listCwdDirs() 与 exists() 仅对 ENOENT 返回空/缺失,其他错误(EACCES/ENOTDIR/瞬时 IO)重新抛出;writeSidecar() 改用排他 owner-only 临时文件('wx', 0o600),避免可预测路径被跟随;共享 runPersistenceContract 的可序列化用例覆盖 isJsonValue 拒绝的全部值,MemoryPersistence 改用规范 isJsonValue 校验。

目的

持久化后端绝不能把存储故障误判为"无会话"。

06d5f60bac#98

Merge split/session-persistence into split/agent-factory

改动

把 split/session-persistence(含 #33 修复)合入 split/agent-factory。

目的

栈式 merge-forward。

5284ed4806#99

docs(agent):同步 inject 与 resume 错误措辞(review #34)

改动

packages/agent/README.md 的 inject() 行由"不触发 turn"还原为 idle 注入包裹一次性 injection turn 的表述(对齐 ADR 0017 与 JSDoc);packages/agent-loop/src/index.ts 的 resume() JSDoc 由"throws a typed error"软化为"rejects with a clear error"(代码本就抛普通 Error)。

目的

纯文档/注释同步,使措辞与当前代码行为一致。

ca4e1c3a1c#100

Merge split/agent-factory into split/session-persistence-sqlite

改动

把 split/agent-factory(含 #34 文档修订)合入 split/session-persistence-sqlite,是栈顶最后一次 merge-forward。

目的

使栈顶分支包含整条栈的全部修复,准备整体合入主线。

提交总结(g-04,共 25 个,从旧到新)25

f1dac1b1ed#101

修复 SQLite 持久化的崩溃尾处理、all-tail 标志与 schema 版本

改动

packages/session-persistence-sqlite 的 index.ts/schema.ts 与测试。load() 不再删除崩溃尾事件,改为记录 repairFrom,下一次 append 在自身事务里执行 DELETE;all-tail 场景把元数据行的 materialized 置 0;openDatabase 在新建库时把 SCHEMA_VERSION 写入 PRAGMA user_version,并拒绝打开比本构建更新的 schema。

目的

让 SQLite backend 与 JSONL 共享同一"load 非变异"契约,使 has()/list() 在崩溃后立即一致,并防止旧构建误开未来不兼容布局。

3e1ca8a425#102

容错 agent-loop finalizer 的 append-listener 抛错

改动

packages/agent-loop/src/loop.ts 与 tests/review-fixes.spec.ts。failTurn() 先设 reason 再 append error 事件并对监听器抛错容错;closeStep()/closeTurn() 对 step/end、turn/end 的 append 与 emit 都包了 try/catch。

目的

防止会话/事件监听器在 finalizer 路径上抛错时把 turn 卡在打开状态或漏发 turn/end,保持 turn 平衡、loop 存活。

091dd12531#103

Merge split/turn-enclosure 到 split/session-persistence

改动

合并提交,把 split/turn-enclosure(含 #32 finalizer 容错修复)并入 split/session-persistence。

目的

在 session-persistence 分支上带入 turn-enclosure 的 agent-loop 修复。

9838fdb626#104

ADR 0016 把 "typed error" 改为 "clear error"

改动

docs/adr/0016-session-persistence.md 一行文案。

目的

resume seam 故意抛普通 Error,ADR 措辞与 JSDoc/#34 评审对齐;纯文档无行为变化。

d76d02b666#105

Merge split/session-persistence 到 split/agent-factory

改动

合并提交,带入 #32 finalizer 修复与 ADR 文案;冲突在 docs/adr/0016-session-persistence.md。

目的

把 session-persistence 的修复同步到 agent-factory 分支。

1b1385e4f7#106

修复 JSONL 持久化在 temp 清理失败时卡死已发布日志

改动

packages/session-persistence-jsonl/src/index.ts。重构 materialize():先标记 link() 是否成功,失败时只删 temp 再抛;成功后 fsync 目录、置 materialized、再 best-effort 删冗余 temp 链接。

目的

避免 temp 硬链接删除失败导致 state.materialized 保持 false,使后续每次重试都撞 "already exists" 把会话卡死。

b218e027d5#107

Merge split/session-persistence 到 split/agent-factory

改动

合并提交,带入 #33 JSONL 修复。

目的

把 JSONL materialize 修复同步到 agent-factory 分支。

11e166db71#108

Merge split/agent-factory 到 split/session-persistence-sqlite

改动

合并提交,带入 #32、#33 修复与 ADR 文案。

目的

在 sqlite 分支上汇集 agent-factory 的累积修复。

add59a3336#109

agent-loop 新增 max-tokens 作为独立的 turn-end reason

改动

packages/agent-loop(loop.ts/README/tests/mock-adapter)、packages/session(types.ts/tests)、AGENTS.md、docs/architecture.md。在 TurnEndReasonMap 加 max-tokens 变体,把模型 finish reason 从 runStep 透传到 runTurn(turn 内任一 step 命中即标记,disposed/aborted/error 仍优先)。

目的

让消费者区分干净停止与被截断的 turn,为 RFC 010 ACP bridge 映射到 max_tokens stop reason 提供契约。

dabc2ff411#110

从 Yarn 迁移到 pnpm

改动

全仓库切换包管理器——根 package.json、新增 pnpm-workspace.yaml/pnpm-lock.yaml、删除 yarn.lock/yarn.config.cjs/.yarnrc.yml,更新 CI/lefthook/各包 package.json 与众多 docs,新增 scripts/check-workspace-constraints.ts。

目的

生态对齐、用严格 linker 消除幽灵依赖、引入 build 脚本 allowlist 与包管理器无关的约束脚本。

49e74ed8d0#111

为 pnpm 迁移新增 ADR 0016

改动

新增 docs/adr/0016-pnpm-over-yarn.md 并登记到 docs/adr/README.md。

目的

记录 Yarn 4 → pnpm 的动机(生态、严格 linker、allowlist、约束脚本)、迁移时基准与 gate 套件无变化。

ce484c0e2d#112

拒绝未使用的 pi-ai 传递依赖的 build 脚本

改动

pnpm-workspace.yaml 的 allowBuilds。把 @google/genai 和 protobufjs(dsh-llm-pi-ai 的传递依赖)从 true 改为 false 并加注释。

目的

这些包是 prebuilt 消费的,其 lifecycle 脚本是 no-op,禁用以避免不必要的安装时代码执行。

6c931b8869#113

收紧 allowBuilds 注释

改动

pnpm-workspace.yaml,精简各条目的注释。

目的

文档清晰,无行为变化。

5e36f990ab#114

Merge PR #39 (feat/pnpm) 进 master

改动

合并提交,把 pnpm 迁移整批(含 ADR 0016、allowBuilds、约束脚本)并入 master。

目的

在主干上落地 pnpm 迁移。

a7fbd93f4f#115

Merge origin/master 到 split/session-meta

改动

合并提交,把 master(含已落地的 pnpm 迁移)拉进 split/session-meta 分支。

目的

让 session-meta 分支与 master 的包管理器变更同步。

3a6ebd1954#116

把 session-persistence ADR 编号由 0016 改为 0018

改动

packages/session/src/json.ts 一处引用。

目的

master 的 pnpm 迁移占了 ADR 0016,与本栈的 session-persistence ADR 编号冲突,故把后者重编号为 0018(turn-enclosure 保持 0017)。

c4fd22f0fa#117

Merge split/session-meta 到 split/turn-enclosure

改动

合并提交,带入 master 同步与 ADR 重编号;冲突在 docs/adr/README.md。

目的

把 session-meta 的同步结果并入 turn-enclosure 分支。

96331432b8#118

Merge split/turn-enclosure 到 split/session-persistence

改动

合并提交;冲突在 docs/adr/README.md、packages/agent-loop/package.json、yarn.lock。同时把 0016-session-persistence.md 重命名为 0018-session-persistence.md。

目的

在 session-persistence 分支汇集 turn-enclosure 与 master 的 pnpm 同步。

f40dcb5f7b#119

Merge split/session-persistence 到 split/agent-factory

改动

合并提交;冲突在 docs/adr/README.md、packages/agent-loop/package.json、yarn.lock。

目的

把累积的 session-persistence 变更(含 pnpm 迁移、ADR 重编号)带入 agent-factory 分支。

c27b1bba6e#120

Merge split/agent-factory 到 split/session-persistence-sqlite

改动

合并提交;冲突在 yarn.lock。

目的

把 agent-factory 的全部变更同步到 sqlite 分支,完成 pnpm 迁移在整条栈上的对齐。

fb9636db44#121

新增 dsh-acp 包:通过 JSON-RPC stdio 把 agent 桥接到 ACP 编辑器

改动

新增 packages/acp(AgentSideConnection 接线、initialize/newSession/loadSession/prompt/cancel、TurnEndReason→StopReason codec、settle-once 回退链、单 session 守卫、cwd 校验、session/load 从事件日志重放);packages/agent 加 whenIdle() 静默信号(LoopAgent 实现);抽出 examples/base.yml,新增 examples/acp-agent;48 个 bridge 测试,100% 单文件覆盖,含子进程 e2e。

目的

实现 RFC 010 MVP,让 Zed 等 ACP 编辑器可流式渲染、显示 tool-call、通过 session/load 恢复会话地驱动 coding agent。

b3ea13749c#122

ACP 支持单连接多 session 复用 + bash 任务归属

改动

packages/acp/src/index.ts 用 Map<sessionId, SessionRecord> + agent→sessionId 反向 WeakMap,让 agent/* 事件 O(1) 路由到所属 session,并发 session 互不串扰;session/cancel/load 按 id 隔离,销毁时并行 drain 到静默。packages/tool-bash 在 spawn 时记录后台任务所属 agent 并保留终身,bash_output/bash_kill 拒绝跨 agent 访问;新增多 session 与跨 agent 测试。

目的

解除 RFC 010 单 session/连接限制;防止一个 session 的 agent 读/杀另一个 session 的后台任务(RFC 011)。

f06259928f#123

Merge PR #31 (split/session-meta) 进 master

改动

合并提交,把 packages/session 的 metadata seam 与 JSON 可序列化不变量(src/index.ts/json.ts/types.ts/README/tests,及 invariants 测试)并入 master。

目的

在主干落地 5 段 split 中的第一段——session metadata 接缝与 JSON 序列化不变量。

3bef6b38c7#124

重构 SQLite 持久化:删掉 materialized 列,用行存在性作为信号

改动

packages/session-persistence-sqlite 的 index.ts/schema.ts/README/测试。移除 materialized INTEGER 列,改用 sessions 行的存在性作为 materialization 信号;all-tail 会话保留行(与 JSONL 一致),孤儿尾部行仍由下次 append 的延迟修复删除。补充 cordis db service 的 TODO,修正 README 的 Node 版本表述。

目的

该列原本只是为 all-tail 场景强行让 has()/list() 为 false,反而与 JSONL backend 分歧;删除后简化代码并与 JSONL 的"文件存在 ⇔ materialized"对齐(#35 评审)。

4c8c1da8b3#125

新增模块依赖图生成器与新鲜度 gate

改动

新增 scripts/gen-module-graph.ts,从每个包的 @deepseek-ai/dsh-* peerDependencies 推导包间依赖图,渲染 docs/module-graph.md(GitHub 原生 Mermaid 图 + 依赖表),输出确定性;在 ci.yml、lefthook.yml、package.json、AGENTS.md 接入 verify-module-graph gate。

目的

让包依赖图可视化,并在 pre-push 与 CI 上检测提交的图与生成器输出是否漂移。

提交总结(g-05,共 25 个,从旧到新)25

b33668ef05#126

模块依赖图表格按拓扑序排序

改动

scripts/gen-module-graph.ts 把模块图表格/图列表的排序从字母序改为 Kahn 风格拓扑排序(同层按字母序保证确定性),docs/module-graph.md 重新生成。

目的

让表格先列叶子接口、依赖方在后,读起来更贴合依赖层级。

8e6fd91e15#127

文档化 module-graph gate 并展开生成 prose

改动

docs/development.md 把 verify-module-graph 加入 pre-push/CI gate 列表和日常命令;gen-module-graph.ts/module-graph.md 把 intro 段落输出为单行。

目的

Codex review 跟进——让贡献者指南与新新鲜度 gate 一致,并遵守「每段一行」的 Markdown 约定(重新生成时不会再次引入硬换行)。

efee449cfe#128

崩溃时保留中断 turn 不截断(review #33)

改动

packages/session 新增 TurnEndReason {kind:'interrupted'} 和 interruptedTurnClosers() 修复助手;JSONL backend(format.ts/index.ts)保留最长连续前缀、丢弃撕裂尾部、持久写入合成边界事件关闭孤儿 turn;session-persistence 契约/测试加崩溃恢复用例;新增 ADR 0017/0018、RFC 013。

目的

旧实现截断最后一个未关闭的 turn,但单个 turn 在长任务中可能极大,静默截断会丢失已持久化的真实工作——改为「保留事件 + 合成边界关闭」让恢复的会话立即可用。

19518ebfd9#129

Merge PR #43:生成的模块依赖图 + 新鲜度 gate

改动

合并 worktree-module-graph 分支:新增 scripts/gen-module-graph.ts、docs/module-graph.md,并把新鲜度 gate 接入 CI(ci.yml)、lefthook、package.json、AGENTS.md。

目的

提供自动生成且可校验新鲜度的模块依赖图。

67447fcdc3#130

强制 merge-commit 策略 + Markdown wrap 约定

改动

AGENTS.md 要求 PR 用 gh pr merge --merge 合并(禁止 squash/rebase);新增 scripts/verify-md-wrap.ts(检测硬换行段落,带代码块/表格/列表等豁免),并入 doc-sync gate,覆盖 README、docs、AGENTS.md。

目的

保留每 PR 的有意提交历史;统一「每段一行」的散文约定并用 gate 强制。

8511b9639c#131

Merge:session-persistence 合入 agent-factory

改动

把 split/session-persistence(中断 turn 保留 + ADR/RFC)合入 split/agent-factory,冲突在 docs/adr/0017、docs/architecture.md。

目的

在 agent-factory 分支上同步崩溃恢复改动。

0000cdb2c2#132

配置驱动的会话恢复(RESUME_SESSION_ID)

改动

packages/agent-loop/src/index.ts 支持 resumeSessionId:从 cordis.yml 的 env 读取,等持久化 backend load 后(ctx.inject)续接已有会话;不可读时仅告警不启动;新增 examples/coding-agent 的 resume e2e 与单测。

目的

让 coding-agent demo 无需改代码即可恢复先前对话,验证跨进程续接。

f0d9383f49#133

Merge:agent-factory 合入 session-persistence-sqlite

改动

把 split/agent-factory(含会话恢复 + 崩溃恢复)合入 split/session-persistence-sqlite,冲突在 docs/adr/0018、docs/architecture.md。

目的

在 sqlite 分支上汇集上述改动。

326b026ab3#134

文档化 FIXME/TODO/XXX 标记语义

改动

docs/development.md 定义三种紧急度标记:FIXME(发布阻塞)、TODO(近期修)、XXX( someday/maybe)。

目的

让贡献者一致地用标记标注不同紧急度的待处理项。

ce4b32ace9#135

sqlite backend 镜像中断 turn 的保留-关闭语义

改动

packages/session-persistence-sqlite 的 load() 改为保留中断 turn 的真实事件,在单个事务内合成 step/end + turn/end {interrupted} 关闭孤儿 turn 并删除撕裂尾行;用 scanRows 替换 cutAtLastTurnEnd;更新测试与 README;共享 runPersistenceContract 现对两个 backend 起相同断言。

目的

与 JSONL backend 契约一致——不再截断大 turn,改为持久化关闭孤儿 turn。

53b37b39c5#136

AGENTS.md 指向 TODO 标记语义

改动

AGENTS.md 增加一行,指向 docs/development.md 中的 FIXME/TODO/XXX 语义说明。

目的

把仓库约定与详细说明挂上钩。

c2dc63f2ea#137

Merge PR #46:turn-enclosure 不变量 + post-turn 错误模型

改动

合并 split/turn-enclosure(re-land,split 2/5):新增 ADR 0017;agent-loop 的 agent.ts/loop.ts 强化 turn-enclosure 不变量与 turn 后错误模型;packages/invariants 扩展;大量测试扩充。

目的

固化「每个 turn 必须闭合」的不变量并定义 turn 结束后的错误处理模型。

16e75c2631#138

Merge:origin/master 合入 split/session-persistence

改动

把 master(含 module-graph 生成器、gate、lefthook 等)合入 split/session-persistence。

目的

在 session-persistence 分支上同步 master 的文档/工具改动。

16e7bbc7c6#139

Merge:session-persistence 合入 agent-factory

改动

把 origin/split/session-persistence(已含 master 改动)合入 split/agent-factory。

目的

在 agent-factory 分支上同步上述合并结果。

9fb12740c7#140

Merge:agent-factory 合入 session-persistence-sqlite

改动

把 origin/split/agent-factory 合入 split/session-persistence-sqlite。

目的

在 sqlite 分支上同步 master 与各 split 的累积改动。

973399e03c#141

Merge PR #45:FIXME/TODO/XXX 标记文档

改动

合并 worktree-docs+todo-markers:docs/development.md 定义三种标记语义,AGENTS.md 加指向链接。

目的

正式把 TODO 标记约定并入主线。

ddf121320b#142

Merge:session-persistence-sqlite 合入 acp-1

改动

把 origin/split/session-persistence-sqlite 合入 feat/acp-1-max-tokens-turn-end,冲突在 packages/session/src/types.ts;带入大量累积改动(pnpm 迁移、ADR 0016/0017/0018、RFC 013、agent-loop 会话恢复、各包 README 等)。

目的

在 ACP 功能分支上汇集 split 链与 master 的全部工作。

63425a2b87#143

用 mdast AST 检测 Markdown 硬换行

改动

按 review 反馈重写 scripts/verify-md-wrap.ts,改用 mdast-util-from-markdown(+GFM)解析,对跨多行的 paragraph 节点报错;修复正则版两个 bug(现在能抓到列表/引用块内换行段落,不再误报长 fence 包裹短 fence);顺手展开 architecture.md、adding-a-tool.md 里两处既有硬换行;新增依赖与 lock。

目的

用真正的 Markdown 解析器(带源位置)替代脆弱的正则,提升 gate 准确性。

840dfbab84#144

Merge:origin/master 合入 worktree-md-wrap-guard

改动

把 master(含 PR #45/#46 的 turn-enclosure、TODO 标记等)合入 worktree-md-wrap-guard,冲突在 AGENTS.md。

目的

在 md-wrap guard 分支上同步 master,准备合并。

c2f8af30da#145

Merge:acp-1 合入 acp-2-bridge

改动

把 feat/acp-1-max-tokens-turn-end 合入 feat/acp-2-bridge,冲突在 AGENTS.md、docs/cookbook/extension-cookbook.md、yarn.lock;带入 ACP 包、pnpm 迁移等大量累积改动。

目的

ACP 多阶段特性栈的向前合并。

5e3df1b2f5#146

Merge:acp-2-bridge 合入 acp-3-multi-session

改动

把 feat/acp-2-bridge 合入 feat/acp-3-multi-session,带入与上一次合并相同的累积改动集合。

目的

ACP 特性栈继续向前合并到多会话阶段。

2bae18f811#147

崩溃恢复时为中断的 tool call 合成 tool result(review #33)

改动

packages/session/src/repair.ts 的 interruptedTurnClosers 现在扫描中断 turn 中无匹配 tool/result 的 tool-call 块,为每个合成一个 error tool/result(放在 step/end 之前);新增 packages/session/tests/repair.spec.ts 和共享契约用例;更新 ADR 0018 与各 README、load() JSDoc;修正 echo-agent README 的 session 清理路径。

目的

循环在运行工具前就持久化了 assistant 消息,崩溃会留下悬空 tool-call,恢复后 deriveMessages() 重放出非法 transcript 被所有 provider 拒绝——合成错误 result 让重水化历史成为合法 transcript。

d3c9f6ca1e#148

Merge:session-persistence 合入 agent-factory

改动

把 origin/split/session-persistence(含 2bae18f811 的 tool-result 合成修复)合入 split/agent-factory。

目的

在 agent-factory 分支上同步 tool-result 合成修复。

dbaef018cc#149

Merge:agent-factory 合入 session-persistence-sqlite

改动

把 origin/split/agent-factory 合入 split/session-persistence-sqlite,冲突在 docs/adr/0018-session-persistence.md。

目的

在 sqlite 分支上同步 tool-result 合成修复。

e31e19d99b#150

删除 AGENTS.md 中重复的 Conventions 条目

改动

AGENTS.md 删除两行——origin/master 合并解决时意外重复的「Symmetry」和「Tests」Conventions 条目,各保留一份。

目的

消除合并引入的重复约定文字。

提交总结(g-06,共 25 个,从旧到新)25

ffc107aa57#151

同步 verify-md-wrap 门禁到 doc-sync 权威文档

改动

更新 .github/workflows/ci.yml 的 CI 步骤标签/注释,并在 docs/adr/0014-doc-sync-enforcement.md 补日期修订(去掉"两类可检查项"措辞,记录第三个门禁)。

目的

新增 verify-md-wrap 门禁后,定义该门禁的 ADR 与 CI 注释已过时,需同步保持单一事实源。

f3906af225#152

ACP 支持每会话独立 cwd

改动

packages/acp 去掉 cwd === process.cwd() 守卫及 session/load 中持久化 cwd 与启动目录的比对;packages/tool-bash 新增 resolveWorkdir,默认从 exec.agent.session.header.cwd 取 bash workdir(显式 workdir 仍优先,相对路径相对会话 cwd 解析);测试、README、RFC 010 同步。

目的

解除 RFC 010 "服务器须在 workspace 启动" 的限制,编辑器可打开任意项目目录,同一连接上 N 个并发会话可各自指向不同目录。

36d3e1def4#153

合并 PR #44:merge-commit 策略 + markdown 硬换行门禁

改动

合并 worktree-md-wrap-guard 分支,引入 scripts/verify-md-wrap.ts 门禁、package.json 合并提交策略、AGENTS.md/docs/architecture.md/development.md 等文档与 pnpm-lock 更新。

目的

强制 merge-commit 策略并新增 markdown 硬换行检查门禁。

edd6eb28dd#154

合并 PR #33:session-persistence 抽象 + JSONL 后端(split 3/5)

改动

合并 split/session-persistence 分支——新增 packages/session-persistence(抽象 Service Definition + 契约测试)、packages/session-persistence-jsonl(首个后端实现)、packages/session/src/repair.ts(崩溃修复合成 tool-result closer);新增 ADR 0018、RFC 013;coding-agent/echo-agent 改用新服务;agent-loop 加 config-session-id。

目的

引入可插拔的会话持久化抽象层并提供首个 JSONL 后端,奠定会话可恢复性基础。

cae1517407#155

将 origin/master 合并进 split/agent-factory

改动

把 master 的 md-wrap 门禁等改动同步进 split/agent-factory 特性分支。

目的

在 agent-factory 特性分支上对齐 master 最新状态。

c870c8fcb1#156

将 split/agent-factory 合并进 split/session-persistence-sqlite

改动

把 split/agent-factory 的进度同步进 split/session-persistence-sqlite 分支。

目的

sqlite 持久化分支继承 agent-factory 的工厂接缝改动。

1d1ce8143c#157

合并 PR #34:agent create/resume 工厂接缝(split 4/5)

改动

合并 split/agent-factory 分支——packages/agent 新增工厂方法,packages/agent-loop 加 resume 逻辑与 config-session-id,新增 coding-agent resume e2e 与 agent-loop resume 测试。

目的

为 agent 提供创建与恢复的工厂接缝,支撑会话恢复。

d8e009d63e#158

将 origin/master 合并进 split/session-persistence-sqlite

改动

把 master 最新改动同步进 split/session-persistence-sqlite(merge message 为空)。

目的

sqlite 持久化分支再次同步 master。

df8db218a9#159

合并 PR #35:session-persistence-sqlite 第二后端(split 5/5)

改动

合并 split/session-persistence-sqlite 分支——新增 packages/session-persistence-sqlite(schema.ts + index.ts + 测试),session-persistence 抽象小调整,tsconfig/publint 接线。

目的

用第二个后端(SQLite)验证持久化抽象的通用性,结束 5 步拆分。

977c23d31f#160

将 origin/master 合并进 feat/acp-1-max-tokens-turn-end

改动

把 master(md-wrap 门禁、session-persistence 等)同步进 ACP max-tokens 特性分支,解决 AGENTS.md 冲突。

目的

ACP max-tokens 特性分支同步 master 最新进度。

a9d5a5ba68#161

将 feat/acp-1 合并进 feat/acp-2-bridge

改动

把 feat/acp-1-max-tokens-turn-end 合并进 feat/acp-2-bridge。

目的

ACP bridge 分支继承 max-tokens 改动。

ff82254fca#162

将 feat/acp-2-bridge 合并进 feat/acp-3-multi-session

改动

把 feat/acp-2-bridge 合并进 feat/acp-3-multi-session。

目的

multi-session 分支继承 bridge 改动。

f860474f8b#163

将 feat/acp-3-multi-session 合并进 feat/acp-4-session-cwd

改动

把 feat/acp-3-multi-session 合并进 feat/acp-4-session-cwd。

目的

session-cwd 分支继承 multi-session 改动,构成 ACP 四步特性栈。

c5a1c494e7#164

引入 session surface(消息派生的派生链表)

改动

新增 ADR 0019 与 packages/session/src/surface.ts(SurfaceManager,基于 surfaceOp 标记增量维护的缓存链表);SessionEvent 新增可选字段 sourceEventSeqs/surfaceOp;Session.append 加 SurfaceAppendOpts 第三参;deriveMessages 优先走 surface 路径并保留 legacy 线性扫描回退;sqlite schema v1→v2 迁移(两列);invariants 加 surface 校验。

目的

为 compaction、tool-result 剪枝等会话历史操作插件提供中央 hub——带溯源的派生链表,避免每个插件各自包装 agent/request 造成监听器顺序脆弱与无持久记录。

6fdd048123#165

加固 agent-loop 生命周期边界

改动

agent.ts 把 emit('agent/status') 包进 try/catch 防监听器抛出挂起;whenIdle 增加 inbox.hasQueued 检查(有排队工作时不立即 resolve);loop.ts 的 closeStep 返回是否有失败、有失败则 break;max-tokens 步骤不再派发或记录 tool-call 块。

目的

隔离监听器异常、避免排队 turn 被忽略、失败步骤立即终止、防止 max-tokens 截断的不完整 tool-call 被误执行。

922e2f913e#166

保持 llm-pi-ai adapter 的 harness 契约

改动

adapter.ts 新增 patchPayload,统一经 pi-ai 的 onPayload 钩子修补 provider payload——回填原始 tool-call arguments、per-tool strict、stop 序列、省略 reasoning_effort;convert.ts 把 error finish 细分为 AUTH/RATE_LIMIT/INVALID_REQUEST/SERVER 码,流未正常结束抛 STREAM_CLOSED。

目的

让 pi-ai 后端产出与 dsh-llm 契约一致(原始 JSON arguments、分类错误码),不因 provider 库的表达力限制破坏 adapter 契约。

87df09e3c3#167

隔离工具 schema 与 waterfall 失败

改动

system-prompt 的 assemble() 对 sections 与 tool parameters 做 structuredClone 快照;tools 的 schemas() 对 parameters 做 structuredClone;ToolRegistry.execute 的 waterfall 失败用 .catch 转成 isError 结果而非向上抛出。

目的

防止下游修改污染注册表中的 schema,并让单个 waterfall 监听器抛出不致整体工具执行失败。

2b36620e55#168

收紧崩溃修复与 dispose 语义

改动

invariants 加 turn/step 序号连续性校验(nextTurn/nextStep)并豁免 interrupted 合成结果;jsonl/sqlite 后端 dispose 改用 settledErrors 聚合错误并以 AggregateError 抛出(不再静默 allSettled);jsonl materialize 加父目录 mkdir+syncDir;sidecar 读取区分 ENOENT 与损坏(损坏即抛);repair 在 mutating load 期间持久化合成 closer。

目的

序号不连续即报错、dispose 失败不再静默吞掉、损坏 sidecar 不被当成缺失,提升持久化健壮性。

b920239389#169

对齐 ACP prompt 与 workspace 契约

改动

acp codec.ts 支持 resource_link 块(渲染为显式文本引用而非丢弃);session/load 要求请求 cwd 与持久化 cwd 一致,否则 invalidParams;validateWorkspaceParams 增加 mcpServers 非空拒绝;user/message 在 live prompt 时不回显(仅 load replay 时发 user_message_chunk);RFC 010 文案对齐。

目的

支持 baseline 的 resource_link、防止 cwd 不匹配导致编辑器与 bash 执行器工作区不一致、避免静默丢弃或重复回显内容。

513e16f9dc#170

让开发期 hook 与 bash 接缝更安全

改动

package.json postinstall 从直接 lefthook install 改为 scripts/install-lefthook.mjs(非 git 仓库或缺 lefthook 时安全退出);bash-local 加 assertPositiveFinite 校验 timeoutMs/maxTimeoutMs/maxOutputBytes(配置级与请求级)。

目的

让 hook 安装在缺 git/lefthook 时不报错,并防止 bash 配置传入非正有限数导致静默错误。

7a5886da2d#171

记录后续清理接缝的 RFC

改动

新增 RFC 014(agent lifecycle and ownership seams)与 RFC 015(shared persistence write coordinator);更新 ADR 0002/0014、architecture、RFC 009/011、packages README。

目的

把前述修复暴露出的后续清理工作(agent 生命周期/所有权、共享持久化写协调器)记录为 RFC 追踪。

0b036d808c#172

为新增防御分支补测试

改动

llm-pi-ai/adapter.ts 给 patchPayload 的防御性分支加 /* v8 ignore next */ 注释,并补 400→INVALID_REQUEST 用例;jsonl 测试加"损坏 sidecar 应拒绝而非视为缺失";tools 测试加 tools/execute 抛 HarnessError 时结构化 error 信息保留。

目的

为前述修复引入的新防御分支补充测试覆盖并标注忽略以维持覆盖率门禁。

1ad4615fab#173

dsh-code-review skill 重新定位为"指导而非权威清单"

改动

.agents/skills/dsh-code-review/SKILL.md 重写定位,新增 "How to think about a review" 章节——强调独立从代码推理、覆盖所有方面(正确性/并发/安全/设计/测试/文档…)、验证后再标记、校准置信度抑制噪声、以严重性为首;加 receiving-review 注意事项。

目的

避免 skill 被误读为完整审查清单,明确它是降低启动成本的指引,审查者仍需独立全面推理。

5c0f24d59a#174

合并 PR #37:max-tokens 作为独立 turn-end 原因

改动

合并 feat/acp-1-max-tokens-turn-end 分支——agent-loop/loop.ts 把 max-tokens 上浮为独立的 TurnEndReason,session types 新增对应类型,新增 mock-adapter 与 loop 测试。

目的

将 max-tokens 作为独立的 turn 结束原因上浮,与 ACP 的 max_tokens stop reason 对齐。

5f6ccf91ec#175

限定 dsh-code-review 的独立判断范围

改动

SKILL.md 限定"独立判断"仅适用于"看什么"和"如何应用规则",而非"文档化要求是否成立";把检查项拆为 "Hard blockers(文档化要求:doc-sync/HMR-safety/ADR 0007 门禁)" 与 "Reviewer-only checks(判断)" 两类。

目的

修正上一提交"指导而非权威"的过度修正——避免被读成可放弃真正阻塞性的文档化检查,AGENTS.md/packages ADR 0007 仍具权威性。

提交总结(g-07,共 25 个,从旧到新)25

c58bbf22eb#176

补全代码审查技能的硬阻断门列表

改动

.agents/skills/dsh-code-review/SKILL.md,在质量门硬阻断清单中加入 doc-sync 与 module-graph 新鲜度检查

目的

补上 Codex 第二轮审查发现的遗漏,避免文档类门失败被误判为阻断清单之外

9a30c46d63#177

合并 PR #51:将 dsh-code-review 技能定位为指引而非权威

改动

合并 worktree-improve-dsh-code-review-skill 分支,重写 dsh-code-review/SKILL.md(+34/-11)

目的

把该技能明确定位为审阅指引而非裁决权威

7c400e9c02#178

统一 ADR/RFC 文档树为按生命周期组织的单一 RFC 树

改动

将 docs/adr/ 与 docs/rfc/ 合并为 docs/rfc/{proposed,implemented,rejected}/,所有文件按 yyyy-mm-dd-topic.md 重命名;新增 scripts/verify-md-links.ts 交叉链接校验门;新增 docs/AGENTS.md 交叉链接规范;同步 ~40 处文档链接

目的

消除两套并行文档树,用机器可校验的相对链接替代散乱的 "ADR NNNN"/"RFC NNN" 文字引用

27f5f84e3b#179

修正 RFC 重组的 Codex 审查意见

改动

修正两条根 AGENTS.md 指错文档的交叉链接;扩展 verify-md-links 覆盖 .agents/skills/**/*.md;支持路径百分号解码;删除属性测试 RFC 中未实现的 "nightly 100x" 表述

目的

补齐重组遗留的链接错指与门覆盖盲区

abe49367a4#180

合并 PR #53:统一 ADR/RFC 文档树

改动

合并 worktree-rfc-naming-overhaul 分支到 master,含 78 文件改动

目的

将上述 RFC 重组落地到主干

6d37b6c33d#181

修复 ACP 服务器连接即崩溃

改动

packages/acp/src/index.ts 删除多余的 export default apply(它让 Loader 丢弃 inject 等命名导出);packages/agent-loop/src/index.ts 将 this.ctx.sessionPersistence 改为 this.ctx.get('sessionPersistence', false);新增 docs/postmortem/0001-acp-default-export-drops-inject.md;新增无 key 的 session/new e2e

目的

修复编辑器(Zed)连接时 session/new、session/load 双崩溃;178 个单元测试 100% 覆盖却未覆盖到,因为测试手工挂载插件绕过了 Loader

86ec067bff#182

合并 origin/master 到 feat/acp-2-bridge

改动

将 master(含 RFC 重组、ACP 崩溃修复、postmortem 0001)合入 feat/acp-2-bridge;解决 SKILL.md、AGENTS.md、ACP RFC 三处冲突

目的

让 ACP bridge 特性分支跟上主干变更

7c168fca34#183

修复 Codex 审查:严格 ctx.get + 修正 fiber 归属文档与测试

改动

AgentLoop.resume 改用严格 ctx.get('sessionPersistence');修正 bridge teardown 注释(ACP 创建 agent 的注册项绑定在 BRIDGE fiber 而非 AgentLoop fiber);新增对应回归测试;同步 postmortem/packages AGENTS/review skill

目的

保证非激活后端读作 undefined 而非 teardown 中途被返回,并钉死 fiber 归属语义

c6a7a4e462#184

合并 feat/acp-2-bridge 到 feat/acp-3-multi-session

改动

合并 bridge 特性到 multi-session 分支,解决 ACP RFC 与 packages/acp/src/index.ts 冲突

目的

多会话特性分支继承已落地的 bridge 修复

49bec650b8#185

合并 feat/acp-3-multi-session 到 feat/acp-4-session-cwd

改动

合并 multi-session 到 session-cwd 分支,解决 ACP RFC 与 acp 入口冲突

目的

session-cwd 特性分支继承 multi-session 与 bridge 的全部修复

00bf3968ee#186

新增 marker 分类报告

改动

新增 MARKERS.md(161 行),按 docs/development.md 标准统计 FIXME(2)/TODO(30+)/XXX(28)分布

目的

对仓库内所有 FIXME/TODO/XXX 标记做一次完整分类盘点

7b978be836#187

按仓库标准修正 marker 分类

改动

将 vendor/cordis/src/reflect.ts、packages/bash-local/src/run.ts 的 TODO 改为 XXX;vendor/loader/src/index.ts、vendor/cordis/src/fiber.ts 的 FIXME 改为 TODO;删除 MARKERS.md

目的

使 4 处标记与其真实紧迫度匹配

b4a5c9da40#188

按仓库标准将 4 个 TODO 降级为 XXX

改动

将 packages/bash-local/src/run.ts、packages/tool-bash/src/index.ts 及其测试中的 4 个 TODO(tool-bash-owner-hmr)/TODO(stateful-shell) 改为 XXX;恢复 vendor 文件;保留其余 TODO(demo/sub-agents/permissions 等)

目的

明确这些项为 someday-maybe,无落地承诺

2cb3866126#189

同步 README 中的 marker 引用

改动

packages/bash-local/README.md 与 packages/tool-bash/README.md 将 TODO(...) 改为 XXX(...),与源码保持一致

目的

修复 Codex CLI 审查发现的 README 与源码标记不一致

7803c38824#190

ACP 工具调用 UI 由工具自身负责(title/command/output)

改动

packages/tools/src/index.ts 在 ToolDefinition/defineTool 上新增 presentCall/presentResult 两阶段展示接缝(含中性 ToolCallKind/ToolCallPresentation 词汇);packages/tool-bash/src/index.ts 为 bash/bash_output/bash_kill 声明展示函数;packages/acp/src/index.ts 注入 tools、引入 ToolPresenter 把中性展示映射到 ACP wire 形态

目的

修复 Zed 工具卡片只显示 "bash" 的问题,让每个工具自管其渲染而非 bridge 硬编码

8fde0c4c25#191

合并 split/session-persistence-sqlite 到 session-surface

改动

将 sqlite 持久化分支合入 session-surface;带来 scripts/verify-md-wrap.ts、CI、AGENTS、架构文档与 pnpm-lock 更新

目的

session-surface 特性分支吸收 sqlite 持久化与 doc-wrap 门

72564204fb#192

合并 origin/master 到 session-surface

改动

将 master(含 RFC 重组、code-review skill、verify-md-links 门、loop.ts 与多个会话包改动)合入 session-surface 分支

目的

让 session-surface 分支与主干同步

e5d8263194#193

修复失效的交叉链接

改动

修正 docs/rfc/implemented/2026-06-18-session-surface.md 中 3 处链接与 packages/session-persistence-sqlite/README.md 中 1 处链接

目的

修复合并引入的失效文档链接

8a92338d2f#194

修复 Codex 对 tool-call UI 接缝的审查意见

改动

packages/tools/src/index.ts 的 schemas() 改用显式 allowlist 构建 ToolSchema(不再剥离 execute,避免 presentCall/presentResult 泄漏到模型请求);packages/acp/src/index.ts 的 session/load 重放改用一次性 ToolPresenter,ToolPresenter.call/result 含抛错的展示回调并通过 onError 兜底;补充多组回归测试

目的

堵住展示函数泄漏到模型请求、历史中断 turn 污染活跃 presenter、以及展示回调抛错拖垮在线 turn 三类风险

8acafe918f#195

ACP execute 标题显示命令;用真实 bash 工具测试;新增终端渲染 RFC

改动

packages/tool-bash/src/index.ts 将 presentCall 标题改为 "description — command";重写 acp 测试用真实 dsh-tool-bash+dsh-bash-local 跑 echo;新增 makeBridgeHarness({ withBash });AGENTS.md 增加 "测试优先用真实实现而非 mock" 原则;新增 docs/rfc/proposed/2026-06-18-acp-terminal-and-tool-rendering.md

目的

让 execute 卡片(Zed 隐藏 rawInput)可见命令,并使测试覆盖真实展示路径

0279cf09d6#196

session 强制 SurfaceEvent 类型

改动

packages/session/src/types.ts、surface.ts、index.ts 引入并强制 SurfaceEvent 类型;packages/invariants 与 session-persistence-sqlite 同步调整;更新相关测试

目的

把 session 对外投影事件收敛为受类型约束的 SurfaceEvent,由 invariants 门把关

386ee14af3#197

ACP 终端卡片渲染 RFC(已实现设计)

改动

将原 proposed RFC 改写为 implemented 版(docs/rfc/implemented/2026-06-18-acp-terminal-and-tool-rendering.md):保留 dsh-bash agent 侧执行,经 _meta(terminal_info/terminal_output/terminal_exit)渲染 Zed 终端卡片,capability 门控;拒绝 spec 的 client-side terminal/create

目的

在实现前固化已验证的 wire 设计,记录为何不走 spec 的客户端终端路径

149ab1bba4#198

ACP 经 _meta 约定把 bash 渲染为终端卡片

改动

packages/tools/src/index.ts 新增 provider 中立的 ToolTerminal 形态;packages/tool-bash/src/index.ts 在 presentCall/presentResult 标记 terminal;packages/acp/src/index.ts 读取 clientCapabilities._meta.terminal_output 能力,capability 开启时映射到 content:[{type:'terminal',...}]+_meta.terminal_info/output,否则走文本路径;新增 e2e 与单测

目的

Zed 客户端声明能力时把 bash 渲染为真实终端卡片(cwd 头+命令+输出),无能力时回退到 ```console 文本块

c8dbe6567a#199

文档澄清 _meta 是 spec 扩展点,终端键为 Zed 约定

改动

docs/rfc/implemented/2026-06-18-acp-terminal-and-tool-rendering.md 与 packages/acp/README.md 措辞调整

目的

说明 _meta 是 ACP spec 的扩展机制,而 terminal_info 等键是 Zed 的约定而非规范要求

e51dabbb8b#200

ACP bash 终端卡片对齐参考适配器(命令标题、描述块、退出状态 pill)

改动

packages/acp/src/index.ts 与 packages/tool-bash/src/index.ts:execute 卡片标题改为命令本身、模型描述作为 content 文本块置于卡片上方、完成卡片经 _meta.terminal_exit 携带退出状态;修复 terminal 模式下 tool_call_update.content 省略、保留原始换行、相对 workdir 按 session cwd 解析、结果侧终端输出门控;packages/tools 新增 exitCode/signal 与 content 块字段;含往返测试与真实模型 e2e

目的

使 bash 终端卡片外观与 claude-agent-acp/codex-acp 一致,并修复上一终端卡片提交的多个 bridge 问题

提交总结(g-08,共 25 个,从旧到新)25

9f6b96c5#201

fix(acp): terminal-card 对齐评审修复(退出码解析、后台/错误、能力快照)

改动

packages/acp/src/index.ts、packages/tool-bash/src/index.ts 及对应测试,agent note 一处。

目的

修复三处真实缺陷——parseExitStatus 把末尾恰好是 marker 文本的 exit 0 误判为失败(改为锚定前导换行);后台启动和 isError 结果被错误渲染成 exit-0 终端卡片(改为不再标记 terminal);结果路径上 live 重读 terminal 能力会因第二次 initialize 而错位(改为在 SessionRecord 创建时快照 terminalEnabled)。

21855d42#202

docs(tool-bash): 标注 parseExitStatus 残留也适用于 signal marker

改动

packages/tool-bash/src/index.ts 一处注释。

目的

评审细节——KNOWN RESIDUAL 注释原本只提到 [exit code: N] 末尾欺骗,同样问题对 [killed by signal: SIG] marker 也成立,措辞改为覆盖两种 marker。

f31a0fad#203

Merge PR #41 — feat/acp-2-bridge(ACP 桥,编辑器经 JSON-RPC stdio 驱动 coding agent)

改动

合并 feat/acp-2-bridge 分支。新增 packages/acp/(codec.ts、index.ts ~750 行 + 8 个测试文件、harness)、examples/acp-agent/(含 e2e 与 cordis.yml)、examples/base.yml,并改 agent-loop/agent 暴露所需钩子。

目的

引入 Agent Client Protocol 桥,让外部编辑器通过 JSON-RPC over stdio 驱动整个 coding agent;附带 postmortem 0001(默认导出丢失 inject 的事故)。

dfc11d22#204

Merge PR #42 — feat/acp-3-multi-session(N 个并发 ACP 会话 + bash 任务归属,RFC 011)

改动

合并 feat/acp-3-multi-session。改 packages/acp/src/index.ts、packages/tool-bash(任务归属)并新增 multi-session.spec.ts,新增 docs/rfc/proposed/2026-06-14-acp-multi-session.md。

目的

单条 stdio 连接上多路复用 N 个并发 ACP 会话,并将 bash 工具调用与发起会话绑定(任务归属)。

5bfd84c80#205

Merge PR #48 — feat/acp-4-session-cwd(每个 ACP 会话在各自工作区运行)

改动

合并 feat/acp-4-session-cwd。改 packages/acp/src/index.ts、packages/tool-bash 接受每会话 cwd,更新 acp-agent e2e 和 README。

目的

让每个 ACP 会话使用独立的 cwd,在各自工作区内运行 bash 与工具调用。

9d433f53#206

Merge master → feat/acp-5-tool-call-ui

改动

合并提交(无 body)。把 master 上 PR #41/#42/#48 三次合并(ACP bridge、multi-session、session-cwd)合入 feat/acp-5-tool-call-ui 特性分支。

目的

在 tool-call UI 特性分支上同步已落地的 ACP 主线进展,准备后续 PR。

b7cf735e#207

Merge feat/acp-5-tool-call-ui → feat/acp-6-terminal-rendering

改动

合并提交(无 body)。把 feat/acp-5-tool-call-ui(连同其刚合入的 master)合入 feat/acp-6-terminal-rendering 特性分支。

目的

让 terminal-rendering 分支基于已更新的 tool-call-ui 分支,保证后续 terminal 卡片工作建立在统一基线上。

a009b1e9#208

docs(tools): FIXME 重新设计 ToolPresentation 类型形状

改动

packages/tools/src/index.ts 新增一段 FIXME 注释(12 行)。

目的

ToolCallPresentation/ToolResultPresentation/ToolTerminal 随增量演进职责已模糊(call/result 终端字段重叠、桥接需拼接 content/terminal/rawInput)。标记为发布前阻断性 FIXME,要求围绕工具渲染 INTENT(按卡片类型的 tagged union)重设计,并在更多工具/UI 依赖当前 optionals 集合前先落地 RFC。

6e754788#209

Merge PR #56 — feat/acp-5-tool-call-ui(工具自有的 tool-call UI 呈现:title/command/output)

改动

合并 feat/acp-5-tool-call-ui。改 packages/acp/src/index.ts、packages/tools(新增 schema.ts 扩展、Presentation 类型)、packages/tool-bash 暴露 title/command/output,新增 RFC 2026-06-18-acp-terminal-and-tool-rendering.md,扩展 stream-update/turns/load 测试与 e2e。

目的

把 tool-call 的 UI 呈现职责交还给工具自身(title、command、output),ACP 桥据此渲染,统一工具呈现契约。

1116f257#210

Merge PR #58 — feat/acp-6-terminal-rendering(bash terminal 工具调用卡片:cwd 头 + 经 _meta 传输出)

改动

合并 feat/acp-6-terminal-rendering。改 packages/acp/src/index.ts、packages/tool-bash(terminal 输出经 _meta 传递、含 cwd 头)、packages/tools,更新对应 RFC(移到 implemented),扩 e2e 与测试。

目的

为 bash 工具提供 terminal 风格的调用卡片,显示 cwd 头并通过 _meta 通道携带输出,对齐 claude-agent-acp 的终端渲染形态。

d397d0da#211

Merge master → chore/classify-markers

改动

合并提交,把 master(含 PR #56/#58 的 ACP terminal & tool rendering 全套改动)合入 chore/classify-markers 分支。

目的

在 marker 分类特性分支上同步 master 已合入的 tool-rendering/terminal 主线,便于后续分类改动可基于最新基线。

ede9c1bb#212

fix: 按仓库标准把 4 个 TODO 降级为 XXX

改动

packages/bash-local(README + run.ts)、packages/tool-bash(README + index.ts + 测试)共 5 处。

目的

4 个非 vendor 的 TODO 被标得过重,按仓库 FIXME/TODO/XXX 分级语义降级——stateful-shell(设计参考,当前 spawn-per-call 工作正常)与 tool-bash-owner-hmr(仅 HMR 开发问题,当前可接受)改为 XXX;其余 TODO 保持不变。

7fa113be#213

Merge master → codex/pr48-repo-hardening-rfcs(含冲突)

改动

合并提交(带多处冲突解决)。把 master 合入 codex/pr48-repo-hardening-rfcs,冲突覆盖 docs/adr、docs/rfc/ 多个 RFC、packages/acp/src/index.ts、packages/agent-loop/src/loop.ts、packages/tools/src/index.ts 等。本合并汇集了 acp/tool-rendering/terminal/session-persistence 大量重构与 RFC 目录重组(RFC 迁移到 implemented/proposed 子目录)。

目的

将仓库硬化 RFC 工作分支与已演进的 master 对齐,使后续 PR 能基于统一目录结构和最新 ACP 实现。

bef93865#214

docs(rfc): 新增 ACP snapshot 测试 RFC(record-once / replay-deterministic)

改动

新增 docs/rfc/implemented/2026-06-19-acp-snapshot-tests.md,docs/rfc/README.md 加链接。

目的

记录新增的第三测试层级——通过 cordis Loader 启动真实 acp-agent 子进程,record-once 录制真实 LLM 流响应,后续在 CI 中确定性地回放,对完整 stdout 转录做 golden diff,实现无 key 运行。固化 Codex (xhigh) 评审得出的设计(provider 中性的 llm/stream 录制点、discriminated fixture schema、positional replay、per-stream 原子 flush、replay 用 providerless 配置)。

4a3f3af2#215

Address Claude review follow-ups

改动

examples/acp-agent/start.ts、packages/acp/src/index.ts、packages/agent-loop/src/loop.ts、packages/session-persistence-sqlite/src/index.ts、packages/system-prompt/src/index.ts、packages/tools/src/index.ts 及相关测试。

目的

处理 Claude code review 的若干跟进项(acp-agent start、ACP 主流程、agent-loop、sqlite 持久化、system-prompt、tools 各处小修与对应单测补全)。

1a1ce734#216

feat(acp-example): 为 snapshot 测试新增 record/replay llm/stream 插件

改动

新增 examples/acp-agent/src/llm-replay.ts(function/namespace 插件)及 tests/llm-replay.spec.ts,扩展 vitest.config.ts 和 knip.json。

目的

在 llm/stream waterfall 上挂监听器——record 模式把真实流按每个 stream 原子写入 llm.json(子进程被 SIGKILL,无 dispose 路径),replay 模式短路 waterfall 按位置回放第 N 个 stream() 调用,使 snapshot 测试无需 key 即可驱动真实 agent。fixture entry 为 discriminated {chunks|throw|hang},能同时表达两种 LLM 失败分支(stream 抛错 vs finish-error chunk)与取消;缺/耗尽 fixture 时 fail-loud。

71124582#217

Handle corrupt JSONL sidecars during list

改动

packages/invariants/src/index.ts、packages/session-persistence-jsonl/src/index.ts 及其测试。

目的

list 会话时若 JSONL sidecar 文件损坏应被妥善处理(而非让列举整个失败),新增对应容错与单测。

a9c36ad5#218

fix(bash-local): 隔离 spill close 失败

改动

packages/bash-local/src/run.ts 及 run.spec.ts。

目的

spill(溢出文件/管道)关闭时若失败不应扩散影响外层执行,做隔离处理并加测试。

deeb3c9e#219

refactor(acp): 提取回合结束的 prompt settlement 公共逻辑

改动

packages/acp/src/index.ts(28 行,+15/-13)。

目的

把回合结束时 prompt 结算(settlement)的重复逻辑抽取为共用实现,消除重复、便于后续一致修改。

914c7e98#220

refactor(persistence): 提取纯后端守卫为公共逻辑

改动

packages/session-persistence/src/index.ts 新增公共守卫,session-persistence-jsonl、session-persistence-sqlite 删除各自的重复拷贝并改调用,persistence.spec.ts 扩展。

目的

把 jsonl 与 sqlite 两个后端里相同的纯守卫抽到 session-persistence 基类,消除重复(净删 ~69 行)。

0334b4ad#221

chore: 清理过期注释与重复字符串

改动

packages/agent-loop/src/loop.ts、packages/agent/src/index.ts、packages/agent/src/types.ts、packages/session/src/index.ts。

目的

删除已过期的注释和重复字符串字面量,做小幅清理。

49bb6a88#222

fix(tool-bash): 处理不可用的 spill 路径

改动

packages/tool-bash/src/index.ts 及 README、测试,packages/bash/src/types.ts、packages/bash-local/README.md 及两处 RFC 措辞。

目的

spill 路径不可用时(如能力未提供/被禁用)应正确处理而非崩溃,补测试与文档。

350e66982#223

Merge master → codex/pr48-repo-hardening-rfcs

改动

合并提交(无 body)。把 master 上 marker 分类相关改动(ede9c1bb 的 4 处 TODO→XXX 降级、d397d0da 的 marker 分支合并、以及若干 classify-markers 跟进)合入 codex/pr48-repo-hardening-rfcs。

目的

在仓库硬化 RFC 分支上同步 master 的 marker 分类结果,保持基线一致。

c182543d#224

refactor(acp-example): 由 session JSONL 派生 llm-replay 脚本

改动

重写 examples/acp-agent/src/llm-replay.ts(移除 record tee,改 replay-only 派生器)与 tests/llm-replay.spec.ts,更新示例 README 与 RFC 措辞(2026-06-19-acp-snapshot-tests.md)。

目的

按设计修订,snapshot fixture 直接复用已持久化的 session JSONL(<scenario>/session.jsonl)而非手写 llm.json——日志已含全部 LLM 行为(assistant/chunk)与 harness 行为(tool/call、tool/result、turn/*、usage),一份产物同时驱动回放兼作行为 golden。deriveReplayScript 按 (turn,step) 分组;不含 finish 终结的组即 stream() 抛错的指纹,fail-loud 而非当作正常停止;两种日志无法表达的情形(抛错、取消/hang)通过可选 replay.override.json sidecar 补充。

81d43489#225

feat(acp-example): snapshot harness、normalizers、接线与 handshake 场景

改动

新增 snapshot-harness.ts、snapshot-normalize.ts(+ spec)、acp.snapshot.ts、两个 cordis.snapshot*.yml、handshake 场景 fixture(input.json/session.jsonl/stdout.golden.txt)、vitest.snapshot.config.ts,并改 start.ts、lefthook.yml、knip.json、package.json(新增 test:snapshot/test:snapshot:record 脚本)。

目的

把无 key 的 snapshot 回放管线端到端打通:harness 经 cordis Loader 启动真实 acp-agent 子进程、把原始 stdout 喂入 SDK ClientSideConnection、解释 input.json DSL、关 stdin 触发优雅关闭、采集 session.jsonl(finally 中 SIGKILL 并清理临时目录);两个纯 normalizer 规整 cwd/sessionId/UUID/JSON-RPC id/时间但保留 seq,stdout 出现非 JSON 行即抛(purity 检查);start.ts 按 DSH_SNAPSHOT 选 replay/record 配置并在 stdin 结束时 dispose 以保证持久化先 flush;handshake 场景作为首个 golden。

提交总结(g-09,共 25 个,从旧到新)25

c94f1563f5#226

ACP 示例首批快照场景与取消/错误输入操作

改动

在 examples/acp-agent/tests/ 新增 5 个快照场景——text-turn、tool-call-turn、multi-turn(真实 API 录制)、error-finish、cancel(用 replay.override.json 模拟 401/中途取消);在 snapshot-harness.ts 增加 promptExpectError、promptAndCancel 两个输入 DSL 操作。

目的

建立可重放、无 key、确定性的 ACP 快照测试基线。

f09cc81c03#227

文档要求 transcript/UX 改动附带快照测试

改动

AGENTS.md 补充 test:snapshot/test:snapshot:record 命令并修正 pnpm run test 注释;新增约定条目(影响 editor transcript 或端到端 UX 的改动必须带快照测试);dsh-code-review SKILL 增加 reviewer 对 golden diff 的检查。

目的

把快照测试确立为仓库约定。

9a5a3835c8#228

CI 跑快照测试并仅在录制时加载 .env

改动

.github/workflows/ci.yml 新增 test:snapshot 步骤;vitest.snapshot.config.ts 改为仅当 DSH_SNAPSHOT=record 时加载 .env,非 ENOENT 的加载错误不再吞掉;修正 start.ts 优雅退出注释;docs/development.md 同步。

目的

补齐 CI 真实闸门并修正 replay 不应触网的安全语义。

b3caabb05d#229

修正快照过滤语法文档

改动

AGENTS.md 把 pnpm run test:snapshot -- -t <name> 改为不带 -- 的形式(pnpm 透传 --,vitest 会把后续当作文件名过滤导致 -t 失效)。

目的

修正会让命令静默跑全部场景的文档错误。

4a1c64663b#230

移除已完成的 tagged-envelope review TODO

改动

清理 docs/rfc/implemented/2026-06-11-content-block-vocabulary.md 中已完成的 review TODO,以及 packages/agent/src/types.ts、packages/session/src/index.ts 里对应注释。

目的

清理过时 TODO。

ec73e11c9b#231

快照 golden 改为 JSONL 而非 pretty-printed .txt

改动

所有 *.golden.txt 重命名为 *.golden.jsonl,normalizer 去掉 2 空格缩进;11 个 golden 全部重生成;normalizer spec 断言紧凑形式。

目的

让 golden 忠实对应 NDJSON stdout 与 JSONL session log 的实际形态,保持 grep/jq 友好。

c5049d1c3f#232

Merge PR #50 codex/pr48-repo-hardening-rfcs

改动

合并仓库范围的"生命周期、持久化与契约加固"分支,涉及 acp/agent-loop/agent/bash/session-persistence(jsonl/sqlite)/system-prompt/tool-bash/invariants/llm-pi-ai 等大量包,并新增两份 RFC(agent 生命周期/归属、共享持久化写协调)。

目的

合入 repo-hardening 改动。

679aaacfc4#233

DRY acp-agent 配置为 base-core.yml + acp-tail.yml

改动

抽出 examples/base-core.yml(无 provider 的 provider/tool 核心)与 examples/acp-agent/acp-tail.yml(agent-loop + 持久化 + ACP bridge);base.yml = base-core + llm-deepseek,replay 配置 = base-core + llm-replay;删除 cordis.snapshot-record.yml,录制改复用 cordis.yml。

目的

消除三个 acp-agent 配置间的复制粘贴,避免漂移。

5189c99543#234

修复 demo readline 终端编辑

改动

修 examples/coding-agent 与 examples/echo-agent 的 src/stdio-chat.ts readline 编辑问题,并为两者新增 stdio-chat.spec.ts;.gitignore/vitest.config.ts 小调整。

目的

修复 demo 输入行编辑 bug。

76fceae5b3#235

快照场景支持 workspace 种子与真实文件编辑场景

改动

harness 支持可选的 <scenario>/workspace/ 目录,record/replay 前拷入临时 cwd,cwd 在 golden 中被归一化;新增 workspace-edit 场景(种子 greeting.txt,prompt 让 agent 追加 WORLD 并 cat 回读);snapshot-harness.ts 把种子/spawn 纳入同一 try/finally 防泄漏。

目的

让快照能基于非空工作区跑完整的读→写→验证循环。

7731bc80c3#236

Merge origin/master into feat/acp-snapshot-tests

改动

把 master(已含 PR #50 repo-hardening)合入 feat/acp-snapshot-tests 分支。

目的

特性分支与 master 同步。

72df4d2e16#237

合并 master 后重新录制快照 golden

改动

master 的 "fix(acp): align prompt and workspace contracts" 改变了 transcript(live prompt 不再回显 user/message),6 个 golden 漂移;重新录制 4 个真实 API 场景、重接受 2 个 authored golden。

目的

让快照反映合并后的行为,验证快照机制按设计工作。

6d02059f9f#238

快照 session/new 拒绝额外目录的场景

改动

新增 reject-extra-dirs 场景与 newSessionExpectError 输入操作,固定 bridge 对非空 additionalDirectories 返回 -32602 Invalid params 的契约。

目的

用快照钉住 editor-facing 的 workspace-scope 拒绝行为。

224c6f029a#239

重命名 LoopAgent 为 ReactLoopAgent

改动

把 packages/agent-loop 的具体 Agent 类改名 ReactLoopAgent,更新 README/docs/examples/tests;包名、AgentLoop 默认导出与 ctx.agentLoop service key 保持不变。

目的

让类名显式表达 ReAct 风格推理循环。

e6260ffefe#240

Merge PR #59 feat/acp-snapshot-tests

改动

合并 ACP 快照测试特性(record-once / replay-deterministic),含 llm-replay、snapshot-harness、normalizer、各场景 golden、CI 接入、vitest.snapshot.config.ts 等。

目的

合入快照测试特性。

eee80f4746#241

Merge origin/master into worktree-rename-react-loop-agent

改动

把 master(已含 PR #59 快照测试)合入 worktree-rename-react-loop-agent 分支。

目的

rename 分支与 master 同步。

1e09ab7204#242

Merge PR #62 worktree-rename-react-loop-agent

改动

合并把 LoopAgent 重命名为 ReactLoopAgent 的重构 PR。

目的

合入重命名改动。

072f97c184#243

把 examples 中的可复用逻辑抽到受测包

改动

新增 packages/ui-stdio(统一两份发散的 stdio-chat.ts,带测试 I/O 缝隙)、packages/llm-replay(把 examples/acp-agent/src/llm-replay.ts 及其 spec 移入并补测到 100%);echo/coding 改用新包并删除旧 src;为 echo/coding 增加 keyless Loader-path e2e smoke;examples/AGENTS.md 写入 smoke 约定;AGENTS.md 加入 scoped、可移除的 pre-release stance。

目的

让原属 examples/、落在覆盖率闸门外的逻辑进入 100% 覆盖 gate 并去重。

9caaa6c95e#244

新增对外部 DeepSeek API 的 real-API e2e 工作流

改动

新增 .github/workflows/e2e.yml,用 repo secret 跑 pnpm run test:e2e 对 https://api.deepseek.com;触发含 workflow_dispatch、push、nightly、pull_request;job 级 if: 跳过 fork/Dependabot 等 untrusted PR;缺 secret 时 preflight 硬失败;permissions: contents: read,超时 45m。

目的

填补 CI 没有任何 with-key 套件的空白,同时保持 ci.yml 仍 keyless/可 fork。

4f291953ea#245

ui-stdio dispose 取消 EOF-exit 定时器并加固默认值

改动

跟踪 200ms EOF-exit setTimeout 句柄并在 disposer 中清除,重入 maybeExit() 合并到一个挂起定时器,新增两条回归测试;README/Config JSDoc 更正"渲染是全局而非按 agent scoped";createStdioChat 在 helper 内默认 welcome/agent(不再依赖 cast);快照 RFC 补注 replay 插件已移入包。

目的

修复 dispose 竞态与文档过claim,Codex 审查 round 1。

5bccda19d3#246

RFC 文档保持 implemented 现状并原地重写 llm-replay 段

改动

原地重写快照 RFC 的 replay 插件段为当前事实;新增 docs/rfc/implemented/AGENTS.md(+ CLAUDE.md symlink)要求"已实现 RFC 必须随代码改动就地更新路径/名称/结构,不得 append-only 记录漂移";调整 docs/rfc/README.md 区分"追踪决策落点(必需)"与"翻转决策(禁止)"。

目的

让 implemented RFC 与实际 shipped 代码保持一致。

759ef04692#247

e2e 从 DEEPSEEK_API_KEY_EXTERNAL secret 取 key

改动

.github/workflows/e2e.yml 把名为 DEEPSEEK_API_KEY_EXTERNAL 的 repo secret 映射到 e2e 套件读取的 DEEPSEEK_API_KEY 环境变量。

目的

修正 secret 名与套件期望的环境变量不一致。

c4d0e07488#248

e2e nightly 调度改到北京时间 08:17

改动

.github/workflows/e2e.yml cron 从原时间改为 00:17 UTC(北京 08:17)。

目的

把夜间跑的时间调到更合适的窗口。

6306239e6d#249

Merge PR #63 worktree-extract-examples-logic

改动

合并把 examples 可复用逻辑抽成受测包(ui-stdio、llm-replay)的重构 PR,含 round-1 审查修复与 RFC 同步。

目的

合入抽取改动。

27721f9f45#250

记录 real-API e2e CI 决策与安全模型

改动

新增 docs/rfc/implemented/2026-06-19-real-api-e2e-ci.md,覆盖独立 secret 消费工作流的理由、fork/Dependabot/secret 威胁模型、pull_request 触发的残余暴露与公开后的变化,并索引到 RFC README;在 e2e.yml 的 pull_request 触发处加 SECURITY 注释,禁止改用 pull_request_target。

目的

沉淀该 CI 决策的依据与安全边界,防止后续引入 untrusted-code-with-secrets 泄漏。

提交总结(g-10,共 25 个,从旧到新)25

0561fb47b6#251

新增对 DeepSeek 外部 API 的 real-API e2e CI 工作流

改动

合并 PR #64(分支 worktree-e2e-real-api-workflow)。新增 .github/workflows/e2e.yml、对应 RFC 文档 docs/rfc/implemented/2026-06-19-real-api-e2e-ci.md,并在 docs/rfc/README.md 登记。

目的

在 CI 中跑真实 DeepSeek 外部 API 的端到端测试,保障 provider 行为。

20773e12bd#252

新增 ADR:TSC-first Build 与 One TSConfig

改动

新增 docs/rfc/implemented/2026-06-20-ts-build-config.md,并登记到 RFC 索引。

目的

以 ADR 形式记录"先 TSC 构建、统一 tsconfig"的构建配置决策,为后续一系列 tsconfig 重构奠基。

6f6e0517d4#253

packages 源码改为无扩展名 TS 导入

改动

packages/ 下 22 个文件,把相对导入中的 .ts/.js 后缀去掉。

目的

统一为 extensionless 导入,配合新的 TS 构建配置。

29e674bfea#254

vendor 源码改为无扩展名 TS 导入

改动

vendor/ 下 8 个文件(hmr、loader、logger-console 等)去掉相对导入后缀。

目的

vendored 包与 packages 保持一致的 extensionless 导入风格。

6b15b606d7#255

packages 的 tsconfig 输出子目录改为 lib/typings/

改动

36 个 package.json + tsconfig.json,把 TS 声明输出指向 lib/typings 子目录,并相应调整 files/导出。

目的

分离 TS 中间产物(lib/typings)与 tsdown 最终发布的 lib/ 运行时产物,避免互相污染。

99db549708#256

vendor 的 tsconfig 输出子目录改为 lib/typings/

改动

18 个 vendor 包的 package.json + tsconfig.json,同步上述 typings 子目录调整。

目的

vendored 包与 packages 构建产物布局保持一致。

846ea4dd60#257

更新 vendor README 的本地改动清单

改动

vendor/README.md,补充 package.json/tsconfig.json 的重生规则、新增 loader/src/config/isolate.ts 的 declaration merge 去 .ts 后缀改动、并说明 tsdown 配置读取 lib/typings 下产物。

目的

把上一组 typings/lib 布局变更如实登记到 vendored 包的修改日志,保持 sync 记录可追溯。

279e9f17eb#258

packages 的测试改为无扩展名导入

改动

packages/*/tests 下 24 个测试文件去掉相对导入后缀。

目的

测试侧同样统一 extensionless 导入。

ec9b093cb0#259

引入两步式 packages/vendor 构建并更新文档

改动

package.json、tsconfig.base.json、tsdown.config.ts、vendor 的 tsdown 配置、若干文档与 pnpm-lock.yaml;说明先 TSC 再 tsdown 的两步构建流程。

目的

实现 ADR 中提出的"TSC 先生成声明到 lib/typings,tsdown 再打包到 lib/"的两步构建。

dc04fea749#260

统一为单一 tsconfig.json 并区分规则

改动

删除 tsconfig.test.json、tsconfig.typecheck.json,合并进根 tsconfig.json;调整 eslint.config.mjs、scripts/doc-typecheck.ts、各 vitest 配置与 examples 测试。

目的

用一份 tsconfig 配合不同规则替代三份分散配置,简化构建矩阵。

c7e55fc0b1#261

修正 ADR 历史以匹配当前 tsconfig 行为

改动

docs/rfc/implemented/2026-06-11-doc-sync-enforcement.md、2026-06-11-quality-gates.md。

目的

把旧 ADR 中关于 tsconfig 的过时描述更新为当前统一 tsconfig 的真实行为。

ed94daed9e#262

修复构建配置 review findings

改动

CI yml、cookbook、RFC 文件改名(2026-06-20-ts-build-config.md → 2026-06-17-ts-build-config.md)、为所有 packages/vendor 的 package.json 增加字段,新增 scripts/check-workspace-constraints.ts,调整 scripts/doc-typecheck.ts。

目的

落实代码 review 的构建配置整改项,并加一个工作区约束检查脚本。

7f131dd4d8#263

将 typings 输出目录改名为 types

改动

所有 packages/vendor 的 package.json、tsconfig.json、tsdown 配置、cookbook、check-workspace-constraints.ts 等共 65 个文件,把 lib/typings 重命名为 lib/types。

目的

统一术语,发布目录命名更直观。

815bac7de9#264

删除死代码 mutable SessionSummary

改动

移除 SessionSummary(updatedAt/title/firstPrompt)及 SessionPersistence.update();删除 JSONL .summary.json sidecar 机制、SQLite 的 title/first_prompt/updated_at 列与每次 append 的 updated_at bump;SQLite SCHEMA_VERSION 1→2 且拒绝任何非当前 user_version(不做迁移);新增 RFC 与 AGENTS.md 的"Tests document behavior"一节。净 -400 行。

目的

这些字段在生产中无读取者、update() 无生产调用方(ACP 标题来自 tool-call presenter 而非存储),属纯死代码;删除同时消除 JSONL sidecar 与 SQLite 列的持久化分歧,为后续 write coordinator 铺路。

31af23b4fe#265

修正删除 summary 后残留的 sidecar/migration 引用

改动

拟议的 write-coordinator RFC、JSONL README 的格式版本说明、findLog 中一条遗留 sidecar 注释。

目的

根据 Codex review 修正上一提交删除后留下的三处与现状不符的描述(明确无迁移策略)。

ab02e9acec#266

抽取共享的持久化 write coordinator

改动

新增 packages/session-persistence/src/coordinator.ts(PersistenceCoordinator + PersistenceBackend hook 接口),JSONL/SQLite 两个 backend 改为组合它并只实现存储原语;把原本重复的编排测试合并为 runCoordinatorContract 套件(memory/jsonl/sqlite 各跑一遍)。净 -112 行,backends 缩减约 1200 行重复代码;RFC 由 proposed 迁到 implemented。

目的

JSONL 与 SQLite 的写路径编排(四张 map、installWritePath、flush、drain、adopt 等)完全相同,每个修复都要改两遍,抽出共享 coordinator 去重并固化崩溃修复语义。

3d67a98291#267

JSONL loadLive 改为 cwd 严格匹配

改动

session-persistence-jsonl/src/index.ts 的 loadLive 直接走 logPath(cwd, id)(undefined 视为确定的 no-cwd 桶而非"未知"),不再扫所有 cwd 桶;findLog 退化为纯全桶扫描;coordinator 的 has() 改为对未跟踪 id 用 loadStored、对已跟踪 session 才用 loadLive;新增跨-cwd 回归测试。

目的

Codex review 发现的 HMR live-adoption 漏洞——一个 no-cwd 的 live session 会误采纳来自真实 cwd 桶的同 id 日志,导致 cwd 被污染。

c4bc6e0e38#268

新增 queue-aware 的 Agent.cancel() 原语

改动

agent-loop/src/agent.ts 新增 cancel(),清空 queued/steering FIFO 并 abort 进行中的 step;loop.ts 加 turn 级 marker,在每个 turn 可能启动/继续的四个窗口(idle 等待后、setStatus running 后、step 启动前、continuation gate)检查;ACP session/cancel 改用 agent.cancel();新增 cancel.spec.ts(279 行)。关闭 TODO(rfc010-cancel-prestep)。

目的

原 abort() 只能杀进行中的 step,已排队但未启动的 prompt 仍会跑完,且紧接着的新 prompt 会被并入被取消的 turn;cancel() 提供独立的取消动词关闭该竞态窗口。

9ee22bc6f6#269

修复 pre-step cancel + requeue 时 whenIdle() 提前 resolve

改动

agent-loop/src/loop.ts 的 window-1 cancel 分支,仅当没有新任务入队时才 settleIdle(),否则清掉旧 marker 继续跑新 prompt 的 turn;新增精确复现该交错(send A → whenIdle → cancel → send B)的回归测试。

目的

Codex review 发现:cancel() 清掉 A 后若有 B 在 loop 恢复前入队,原代码无条件 settleIdle() 会让 A 的 whenIdle waiter 在 B 还没跑时就 resolve(零事件返回)。

2a4d89a4bd#270

Agent 工厂改为返回带异步 disposer 的 AgentHandle

改动

AgentFactory/ctx.agents.create/resume 返回 AgentHandle = { agent; dispose(): Promise<void> };dispose() 按序执行:注册+启动 effect disposer → await agent.done(loop 退出并捕获最终 flush)→ session disposer(detach onAppend + 删 store);新增 SessionStore.createOwned() 与 AgentLoop.startOwned;ctx.agents.get(id) 仍返回裸 Agent。

目的

把"销毁这一个 agent"做成一种 capability——只有持有 handle 的 owner 能精确停掉它的 loop、等待真正 quiescence、注销并清理 session,且 teardown 顺序对持久化是 load-bearing 的(最终 turn/end 与 session/flush 必须在 onAppend 仍 attach 时产生)。

ee4cad3ada#271

ACP 在 disconnect/teardown 时 dispose 每个 session 的 agent

改动

ACP bridge 在 SessionRecord 中持有该 session 的 AgentHandle disposer,teardown(client 断连或 fiber dispose)时执行它,替换旧的 abort()+whenIdle() drain;session/load 与 teardown 竞态时把刚 resume 出来的 handle 先 dispose 再抛;新增断言 agent 已注销 + session 已移除断开、重载日志验证 closing turn/end 落盘、兄弟隔离等测试;更新各 README。

目的

裸断连后不再残留"已 idle 但仍注册"的 agent 与 store 条目;handle disposer 内的 queue-aware cancel 同时关掉了 pre-step best-effort 窗口,使 teardown 达到真正 quiescence。

a53a56ff48#272

把 session 生命周期折进 agent effect 以实现有序 teardown

改动

SessionStore 用 prepare(校验+构造不入库)/enter(attach onAppend+入库存)/announce(emit session/created)替代 createOwned 的兄弟 effect 模式;AgentLoop.start 构建单个复合 effect,按序 yield:session-detach → register → stop-and-await agent.done;LIFO disposal 以有序链方式运行每个 disposer 的 promise。新增 mid-turn dispose + 重载断言 closing 事件为真实 disposed 而非恢复的 interrupted 的耐久性测试。

目的

更强的耐久性测试发现原双兄弟 effect 设计在裸 fiber-unload 路径上会丢掉 loop 的 closing turn/end——fiber 用 Promise.all 并发 dispose 兄弟 effect,session-create 的 detach 与 loop 最终 flush 竞争。折叠为单 effect 后无论走 handle dispose 还是 fiber unload 都保证有序 teardown。

7a94d36c46#273

dsh-code-review:强调测试充分性而非仅 100% 覆盖

改动

.agents/skills/dsh-code-review/SKILL.md 的"Test quality"检查项扩展。

目的

明确 100% 覆盖只证明行被执行,不代表功能按发布形态工作;reviewer 应从"回归是否会失败""是否驱动真实路径而非伪造输入"两个轴评估,并点名 happy-path 测试覆盖了本应为 mid-flight/error 场景代码的陷阱。

5a5b7d19c3#274

在 register disposer 中隔离抛异常的 agent/disposed listener

改动

packages/agent/src/index.ts 把 agent/disposed 的 emit 包进 try/catch + logger.warn(store 条目在 emit 前已删,状态已捕获,继续即可);新增注册 throwing listener 后断言 session 仍被移除的回归测试;并在 dsh-session README 记录新的 prepare/enter/announce 有序 teardown 原语。agent/created 的 emit 故意保持不隔离(其抛出用于回滚注册)。

目的

Codex review 发现的 teardown 泄漏——复合 effect 的 disposers 以 .then() 链运行,register disposer 内未隔离的 agent/disposed emit 若被 throwing listener reject,会跳过后续 session-detach disposer,导致 session 残留且 onAppend 仍 attach。

d1b7c3bf95#275

bash executor seam 新增不透明 owner token

改动

BashExecRequest 加可选 owner?: string,解析后的 BashExecSpec 加必填可空 owner: string | undefined(像 workdir/timeoutMs 一样在 spec 上必填,忘传会显式 undefined 而非被忽略);resolve() 透传;新增 BashExecutor.ownerOf(id) 单一读取 seam;bash-local 在 TrackedTask 上存 owner 并实现 ownerOf;更新 StubExecutor 测试与 README;删除旧的所有权 RFC 文件。

目的

后台任务的所有权需要能在 consumer HMR 重载后存活;所有权存在 executor 的 task 上(随 dsh-bash fiber dispose),因而能扛 tool-bash 的 HMR 重载,访问策略留给 consumer(dsh-tool-bash)。

提交总结(g-11,共 25 个,从旧到新)25

b58f1dd5c8#276

tool-bash 后台任务改用 session token 标记 owner

改动

删除 packages/tool-bash 中 plugin-local 的 taskOwner: Map<string, Agent>;owner 改为在 spawn 时通过 resolve({ …, owner }) 盖到 executor 的 task 上(key 为 session.header.id);bash_output/bash_kill 的访问控制和完成通知都改读 token;新增 RFC 2026-06-18-agent-lifecycle-and-ownership-seams.md;更新 README 与测试。

目的

让 ownership 在 tool-bash HMR 重载后存活(关闭 XXX(tool-bash-owner-hmr) 缺口),并修正原本测试 fake 因只填 header.id 而通过错误路径的问题。

be6cf4510b#277

测试 fake 的 agentId 与 session token 区分开

改动

packages/tool-bash/tests/tools.spec.ts 给完成通知的 fake 注册一个 agent-<sessionId> 的 agentId,与 session token 不同。

目的

Codex review 指出原 fake agent.id === session.header.id,无法区分代码按 agentId 还是 session token 匹配;修正后测试真正钉住「按 session.header.id 匹配」这一区分性行为。

6a1e381e38#278

cancel(reason) 贯穿 marker-only 窗口

改动

packages/agent-loop/src/agent.ts 在 arming marker 时捕获 reason ?? 'cancelled' 并通过 LoopHandle.cancelReason() 暴露;loop.ts 两个 marker 分支改用它;更新 packages/acp/src/codec.ts 与 index.ts 的 session/cancel 映射注释;改 cancel.spec.ts 断言 caller reason。

目的

原本 marker-only 窗口(step-start、continuation gate)硬编码 reason: 'cancelled',丢了 caller 传入的 reason;修复后 turn 提前结束时记录的 reason 与中段路径一致。

15335f74ba#279

合并 worktree-cancel-primitive 到 worktree-agent-handle

改动

将 origin/worktree-cancel-primitive 合入 worktree-agent-handle,带入上面 cancel(reason) 的代码与测试。

目的

把 cancel primitive 的修复向上合到 agent-handle 分支。

de0c4605bd#280

修正 ACP teardown 文档:dispose 走 disposed 路径,不走 cancel()

改动

packages/acp/README.md 与 src/index.ts 中 quiesce() 注释把「queue-aware cancel」措辞改为实际的 disposed 路径描述。

目的

review 指出 AgentHandle.dispose() 实际委托给 start-disposer 的 stop(); await agent.done(设置 disposed 并 abort 当前 controller),并不调用 agent.cancel(),turn 中段以 disposed 结束而非 aborted;文档需对齐实际机制。

e8634a0495#281

合并 worktree-agent-handle 到 worktree-bash-owner-token

改动

将 origin/worktree-agent-handle 合入 worktree-bash-owner-token,带入 ACP/agent-loop/session 的 cancel、dispose、文档修正。

目的

把 agent-handle 分支的修复整合到 bash-owner-token 分支。

1bb201365d#282

AGENTS 增加 doc-current-state 约定 + 修正 summary 例子

改动

AGENTS.md § Type Safety and Documentation 增加一条:文档写当前状态(what + why),不写 process/history(禁用 previously/now/used-to/replaces 等措辞);并修正「tests document behavior」例子中对 summary 审计的夸大表述(后端其实写过 JSONL sidecar 和 SQLite updated_at,只是没有 consumer 和 update() 调用)。

目的

review 发现两处问题:缺少明确的「当前状态」文档约定;worked example 与历史事实不符。

a3e90bb31c#283

合并 worktree-drop-session-summary 到 worktree-persistence-coordinator

改动

将 origin/worktree-drop-session-summary 合入 worktree-persistence-coordinator,带入 AGENTS.md 文档约定更新。

目的

把 drop-session-summary 分支(含文档约定)整合到 persistence-coordinator 分支。

301a3d1233#284

ownerless-state claim 增加 cwd 一致性校验

改动

packages/session-persistence/src/coordinator.ts 在 ownerless-claim 分支 seed 检查之前加 cwd 相等性检查;共享 coordinator-contract 测试新增三个用例(跨 cwd 不能 claim cursor-0、不能 claim loaded-prefix、no-cwd 不能被 cwd'd session claim);补 materialized flag 由来的说明,并把模块文档改写为当前状态。

目的

review 发现跨 cwd 漏洞:原本只校验 seed 前缀,未比对 tracked header 的 cwd 与 live session 的 cwd,导致 /b 的 live session 能 claim /a 的 ownerless artifact 并把事件追加到错误 header 下;此为 coordinator 级不变式,对两个后端都适用。

7507ca0c70#285

合并 worktree-persistence-coordinator 到 worktree-cancel-primitive

改动

将 origin/worktree-persistence-coordinator 合入 worktree-cancel-primitive,带入 cwd 校验和 AGENTS 文档。

目的

把 persistence-coordinator 分支的修复整合到 cancel-primitive 分支。

f58b031465#286

修复 window-2 早期 whenIdle 竞态 + 同步 cancel RFC 文档

改动

packages/agent-loop/src/loop.ts window 2(同步 agent/status('running') listener 的 cancel)镜像 window 1 的处理:清 marker 后只有无新排队时才 setStatus('idle'),否则继续跑 queued replacement;新增回归测试复现该交错;更新两份 ACP RFC 把 session/cancel 描述从 agent.abort() 改为 queue-aware agent.cancel()。

目的

review 指出 window 2 无条件 setStatus('idle') 会让 whenIdle() waiter 在 replacement 还排队未跑时就 resolve,caller 观察到错误的 quiescence;修复后 waiter 只在 replacement turn 的 running→idle 时 resolve。

3814ffc5b0#287

合并 worktree-cancel-primitive 到 worktree-agent-handle

改动

将 origin/worktree-cancel-primitive 合入 worktree-agent-handle,带入 window-2 竞态修复、cwd 校验、AGENTS 文档。

目的

cancel-primitive 分支向上合到 agent-handle 分支。

083a6fc990#288

SessionStore.enter() 重新检查 id + AgentHandle.dispose() memoize

改动

packages/session/src/index.ts 的 SessionStore.enter() 重新加上 duplicate-id throw 并补 prepare/enter/announce 生命周期测试;packages/agent-loop/src/index.ts 的 startOwned memoize disposal promise;packages/acp/tests/dispose.spec.ts 和 packages/session/tests/session.spec.ts 新增回归测试。

目的

deep review 的两个阻塞性 lifecycle 问题:(1) enter() 是跨包 public primitive,caller 可在 prepare() 与 enter() 间插入任意工作,必须重新检查 id 以防 stale prepared session 覆盖 live 同 id entry;(2) AgentHandle.dispose() 直接返回 cordis effect disposer,第二次调用会立即返回而不等在飞 teardown,违反所有 caller 共享同一 quiescence 边界的契约。

b9725e8602#289

合并 worktree-agent-handle 到 worktree-bash-owner-token

改动

将 origin/worktree-agent-handle 合入 worktree-bash-owner-token,带入 enter() id 检查、dispose memoize、cancel/persistence 修复。

目的

把 agent-handle 分支全部修复整合到 bash-owner-token 分支。

90a19f072d#290

修正 stale ownership 文档 + 提议统一 agent/session id

改动

packages/acp/README.md 把任务隔离描述从 object-identity 改写为 session-token 模型;packages/tool-bash/src/index.ts 模块文档按当前状态重写;新增 proposed RFC 2026-06-20-unify-agent-and-session-id.md(提议 agent 即其 session、一个 id),并从 agent-lifecycle RFC 的 precondition 处交叉链接。

目的

review 指出 README 仍是旧的对象身份叙述;同时 notice 按 session.header.id 路由但 registry 只强制 agent.id 唯一,存在理论上的误路由(ACP 不可达),与其加 invariant 不如用 RFC 从构造上消除该 precondition。

329e5c3e2e#291

coordinator-contract 模块文档改为当前状态

改动

packages/session-persistence/tests/coordinator-contract.ts 模块文档改写为描述「每个 scenario 在此定义一次、经 fixture 按 backend 运行」,而非叙述「以前在 per-backend specs 里重复」。

目的

遵循 repo 的 doc-current-state 约定,不在注释中写 process/history。

16304872e1#292

去掉 cancel 测试 header 里的 PR-letter 引用

改动

packages/agent-loop/tests/cancel.spec.ts 模块文档去掉「PR C」字样,只描述测试套件测什么。

目的

遵循 doc-current-state 约定,当前树里没有 PR C 可锚定。

44762efbd7#293

去掉 dispose 测试注释里的 PR-letter 引用

改动

packages/acp/tests/dispose.spec.ts 的 disconnect-mid-prompt 测试注释去掉「PR D's per-agent AgentHandle teardown」中的 PR 字样。

目的

同上,描述机制本身而非引入它的 PR。

8597cc2c58#294

tool-bash ownership 测试改为当前状态描述

改动

packages/tool-bash/tests/tools.spec.ts 两条 ownership 测试去掉「the old design fenced by Agent object identity」「closing the old XXX(tool-bash-owner-hmr) gap」等历史叙述,改为陈述当前契约(按 session.header.id 隔离;token 在 executor task 上,tool-bash 重载后保留)。

目的

遵循 doc-current-state 约定。

38cc62b644#295

AGENTS 明确禁止在注释/测试名中引用 PR 或 commit

改动

AGENTS.md 的 doc-current-state 约定增加显式条款:永远不要在 comment、JSDoc、test name 中命名不可见的 change unit(PR/commit/stack position),要描述机制本身。

目的

review 发现既有约定虽禁了 process-narration 措辞,但没显式覆盖「(PR D's teardown)」「(PR C)」「identity no longer matters」这类引用,需补一条明确条款。

d06c75d68f#296

合并 worktree-drop-session-summary 到 worktree-persistence-coordinator

改动

将 origin/worktree-drop-session-summary 合入 worktree-persistence-coordinator,带入 AGENTS.md 的 change-unit 禁令。

目的

把 drop-session-summary 的文档约定更新整合到 persistence-coordinator 分支。

d2b26325e2#297

合并 worktree-persistence-coordinator 到 worktree-cancel-primitive

改动

将 origin/worktree-persistence-coordinator 合入 worktree-cancel-primitive,带入 coordinator-contract 文档当前状态化与 AGENTS change-unit 禁令。

目的

persistence-coordinator 分支向上合到 cancel-primitive 分支。

29ce64b8bd#298

合并 worktree-cancel-primitive 到 worktree-agent-handle

改动

将 origin/worktree-cancel-primitive 合入 worktree-agent-handle,带入 cancel.spec.ts header 修正与 coordinator-contract 文档修正。

目的

cancel-primitive 分支向上合到 agent-handle 分支。

fd9ecdce40#299

合并 worktree-agent-handle 到 worktree-bash-owner-token

改动

将 origin/worktree-agent-handle 合入 worktree-bash-owner-token,带入 cancel/dispose 测试中 PR-letter 引用的清除和 coordinator-contract 文档修正。

目的

把 agent-handle 分支的文档清理整合到 bash-owner-token 分支,使整条 stack 对齐 doc-current-state 约定。

1017ebbc74#300

Merge PR #66:删除 dead mutable SessionSummary

改动

合并 PR #66 worktree-drop-session-summary。移除 packages/session/src/types.ts 中的 SessionSummary 类型,删除 jsonl/sqlite 两个后端中相关的写入/更新字段与 schema、format 代码;瘦身 contract、persistence、ACP load 测试;更新 architecture.md、各 README;新增 RFC 2026-06-19-drop-mutable-session-summary.md。

目的

SessionSummary(mutable、由后端写入但无 consumer 也无 update() 调用)是 dead state,整体移除以简化持久化层。

提交总结(g-12,共 25 个,从旧到新)25

8927691eb8#301

合并 origin/master 到 persistence-coordinator 分支

改动

无内容合并,仅将 origin/master 同步进 worktree-persistence-coordinator。

目的

开 PR #67 前先把 feature 分支与主干对齐。

265b6ceb19#302

合并 PR #67:抽取共享的 session 持久化写入协调器

改动

从 session-persistence-jsonl 和 session-persistence-sqlite 两个后端抽出一个共用的 coordinator.ts(新增约 578 行 + 契约测试 786 行),大幅瘦身两个后端实现与测试;新增 RFC、废弃旧的 mutable-session-summary 计划。

目的

消除 jsonl/sqlite 后端重复的写入编排逻辑,统一到一处。

05ef69f253#303

合并 origin/master 到 cancel-primitive 分支

改动

无内容合并,同步主干到 worktree-cancel-primitive。

目的

开 PR #68 前对齐主干。

3556f3bb4f#304

合并 PR #68:新增 queue-aware 的 Agent.cancel() 原语

改动

agent-loop 的 agent.ts/inbox.ts/loop.ts 加入取消原语(感知队列状态),新增 cancel.spec.ts(337 行);更新 agent 类型、ACP 入口与 turns 测试、architecture.md。

目的

为 agent 提供可正确取消在途/排队任务的公开能力。

5f355fbc7c#305

合并 origin/master 到 agent-handle 分支

改动

无内容合并,同步主干到 worktree-agent-handle。

目的

开 PR #69 前对齐主干。

5e3f0f6d18#306

合并 PR #69:AgentHandle 异步 per-agent disposer

改动

agent-loop/src/index.ts、agent/src/index.ts、session/src/index.ts 引入 AgentHandle(每个 agent 的异步释放句柄);ACP index 与 dispose 测试大改;resume/resume.e2e 适配。

目的

让多 agent 场景下每个 agent 能独立、异步地释放资源。

5314f7cbda#307

合并 origin/master 到 bash-owner-token 分支

改动

无内容合并,同步主干到 worktree-bash-owner-token。

目的

开 PR #70 前对齐主干。

0b0486796b#308

合并 PR #70:在 bash executor seam 中加入 owner token

改动

bash、bash-local、tool-bash 的 types/src/index 注入 owner token;tool-bash 测试大改(+152/-);新增 agent-lifecycle-and-ownership-seams RFC 与 unify-agent-and-session-id RFC。

目的

bash 执行链路上携带调用者身份(owner token),为多 agent/多会话下的归属与生命周期打基础。

07048983e0#309

新增 verify-type-equiv 门禁(文档中逐字粘贴的类型定义漂移检测)

改动

新增 scripts/verify-type-equiv.ts(208 行)与 scripts/type-equiv.manifest.json(中心化的 provenance 表);doc-typecheck 识别 ts type-equiv fence 并跳过编译、不计入 opt-out 比例;接入 doc-sync 链。

目的

让文档里逐字粘贴的类型定义能被 TypeScript parser 与源符号比对,防止文档与源码漂移。

0f7abc9808#310

新增 core-data-structures 目录(核心数据结构目录)

改动

新增 docs/core-data-structures/(core.md 定义"核心"边界 + llm-streaming/session/persistence/tools/bash 各 seam 子页),类型定义用 ts type-equiv 块逐字粘贴并漂移检测;从 architecture.md 交叉链接,development.md 记录机制。

目的

系统梳理 agent-loop 脊椎及其周边 seam 的核心数据结构,作为单一权威参考。

ea5697e354#311

评审规则:核心数据结构目录必须同步

改动

AGENTS.md 加一条常驻规则;dsh-code-review skill 加硬阻断检查。

目的

凡是新增/删除/重塑目录中记录的类型,必须在同一 diff 内更新目录(prose + verbatim 块 + manifest);verify-type-equiv 只能查漂移,查不到"新类型未文档化"。

cc47f76cea#312

提出 simplification RFC 系列

改动

在 docs/rfc/proposed/ 下新增 20 个简化 RFC(assembled-assistant-messages-only、classify-support-packages、collapse-trace-only-session-events、drop-acp-session-load、drop-bash-output-spill-files、generic-tool-rendering、retire-mid-turn-steering 等),更新 RFC README。

目的

集中提出一批"可删/可合并"的候选简化项,供评审排程。

c3278e9660#313

新增 ACP feature support checklist

改动

新增 docs/acp-feature-support.md(163 行),盘点 ACP v1 面(stable schema 1.14.0 + claude-agent-acp/codex-acp 参考适配器的不稳定特性),逐项标注 dsh-acp 桥的进度,并给出排序的 gap 摘要。

目的

明确 ACP 桥相对参考适配器的覆盖与缺口。

ea3f138ae9#314

回应 simplification RFC 的评审意见

改动

对前述 20 个 RFC 逐篇修订(措辞、范围、结论),顺带修 publint-all.ts。

目的

根据评审反馈定稿这批 RFC。

5a6243900d#315

修复 verify-type-equiv 扫描漏洞并修正 persistence 文案

改动

verify-type-equiv 改为扫描整个 markdown glob 范围(原先只扫 manifest 已命名的文档,孤儿块会被静默跳过),并支持 abstract class;persistence.md 补全 has/delete;AGENTS.md doc-sync 概要补回两个门禁。

目的

堵上 1:1 保证的漏洞,让任何文档里的未登记 type-equiv 块都能被捕获。

2d6bb4c8ce#316

合并 PR #71:core data structures 目录 + verify-type-equiv 门禁

改动

汇总 PR #71 内容(前述 core-data-structures 文档 + verify-type-equiv 门禁 + AGENTS/code-review 规则)到主干。

目的

将文档脊柱与漂移检测门禁正式落地。

bcf255fc57#317

修正 ACP checklist 的评审发现

改动

docs/acp-feature-support.md 调整若干状态标记(session/close ⚠️→❌、Codex plan ⚠️→✅、Codex elicitation ✅→⚠️),限定"两个适配器都发货"的措辞,删除末尾多余的 </content> sentinel。

目的

按评审核对修正 checklist 的状态与措辞。

f5e61417ee#318

把 ACP checklist 移到 packages/acp

改动

将 checklist 从 docs/ 迁到 packages/acp/acp-feature-support.md 并重写相对链接深度;doc-typecheck/verify-md-wrap/verify-md-links 的 glob 从 packages/*/README.md 放宽到 packages/*/*.md,AGENTS.md 同步描述。

目的

让 checklist 与其所属桥包同处;并使包级非 README 文档也纳入 drift 门禁。

0e73a45dc9#319

合并 origin/master 到 acp-feature-checklist 分支

改动

同步主干到 worktree-acp-feature-checklist(有 AGENTS.md 冲突已解决)。

目的

开 PR #73 前对齐主干(此时主干已含 PR #71 的文档/门禁)。

9949f4f2ea#320

合并 PR #73:ACP feature support checklist

改动

汇总 ACP checklist(迁移到 packages/acp、修订状态、放宽 doc-sync glob)到主干。

目的

将 ACP 桥特性清单正式落地。

ee494969af#321

为 harness 事件声明加 @mode 标签并补 JSDoc

改动

在 agent/llm/session/system-prompt/tools 五个声明事件的包里,给全部 24 个 harness 事件加 @mode emit|waterfall|parallel 标签并补自包含 JSDoc。

目的

让生成的 cordis 目录能直接从源码渲染每个事件的模式与说明。

552612622c#322

整理 PR #74 中有价值的 simplification RFC

改动

新增 3 个 RFC(drop-unconsumed-llm-block-views、drop-unconsumed-registry-change-events、prune-dead-seam-methods),修订 public-agent-stop-surface;顺带在 acp/bash-local/tools 的实现里做配套小改(标记未消费视图/事件)。

目的

把评审中产出的有价值简化项归档进 RFC 体系。

4e5c08ef82#323

生成 cordis 事件与服务目录

改动

新增 scripts/gen-cordis-catalog.ts(458 行)生成 docs/cordis-catalog/events-and-services.md(482 行),覆盖每个 cordis 事件(含 @mode)与 ctx.<key> 服务接口;带 --write/--check 新鲜度门禁;硬性校验缺失 @mode 或标签与签名矛盾(trailing next 即 waterfall);删除旧的 verify-event-taxonomy,由 verify-cordis-catalog 接入 doc-sync;新增 RFC 与 ci/AGENTS/architecture 配套。

目的

用生成器替代手维护的事件分类表,保证事件/服务目录与源码一致。

d324b06e74#324

修正 cordis 目录的 Codex 评审发现

改动

生成器的方法过滤器改为排除 private/protected/static(protected 是子类钩子,非公开 ctx 表面);BashTaskRead 加入类型交叉链接映射;改写生成器模块注释与 AGENTS @mode 规则措辞(不再叙述已退役的 verifier)。

目的

让生成的服务接口只反映插件作者实际可调用的公开表面。

99a203f445#325

新增 simplification 发现 skill

改动

新增 .agents/skills/dsh-find-simplifications/SKILL.md(106 行)及 agents/openai.yaml 配置。

目的

提供一个可调用的 skill,用于主动发现仓库中可删/可合并的简化项。

提交总结(g-13,共 25 个,从旧到新)25

80179a5#326

文档:响应简化评审反馈

改动

调整 docs/rfc/ 下简化候选清单——删除 drop-unconsumed-llm-block-views、drop-unconsumed-registry-change-events、foreground-only-bash 等提案,新增 drop-unconsumed-llm-adapter-change-event、drop-unconsumed-llm-assembled-surfaces、generic-long-running-tool-runtime;更新 dsh-find-simplifications/agents/openai.yaml 与 RFC README 索引、若干 RFC 标题/分类。

目的

根据简化评审意见收拢候选 RFC 列表。

7f2769c#327

文档:响应最新一轮简化评审

改动

新增 classify-packages-by-aspect.md 提案;更新 RFC README 索引、discover-package-inventory、remove-redundant-snapshot-log-goldens 等若干 RFC 的分类与交叉引用。

目的

处理最新一轮简化评审反馈。

800e08e#328

文档:精炼 package hierarchy RFC

改动

新增 proposed/2026-06-20-package-hierarchy.md;删除被取代的 classify-packages-by-aspect 与 classify-support-packages;调整 publint-all.ts 与 discover-package-inventory。

目的

把分散的"包分类"思路统一收敛为单一 package-hierarchy RFC。

d614f3a#329

文档(rfc):补记 core-data-structures 目录 + type-equiv 决策

改动

新增 implemented/2026-06-20-core-data-structures-catalog.md,回溯记录 PR #71 已落地但漏写 RFC 的 core-data-structures 目录与 verify-type-equiv drift gate——spine-vs-seam 范围规则、verbatim-match-over-assignability 选择、含 Codex 抓到的 scan-gap bug 修复过程;交叉链接到 generated-cordis-catalog RFC。

目的

补齐缺失的已实现 RFC,使两份 catalog RFC 对称记录。

c079b74#330

文档:澄清 package hierarchy 示例

改动

微调 proposed/2026-06-20-package-hierarchy.md 的示例措辞(9+/7-)。

目的

澄清 hierarchy 示例表达。

f995d14#331

合并 PR #75:生成 Cordis 事件/服务目录

改动

合并 cordis-catalog 分支。新增 docs/cordis-catalog/events-and-services.md(481 行)与 scripts/gen-cordis-catalog.ts(464 行)源码生成器及其测试;新增 core-data-structures-catalog 与 generated-cordis-catalog 两份 RFC;删除旧 verify-event-taxonomy.ts;更新 agent/llm/session/system-prompt/tools 的类型导出与 CI/AGENTS 文档。

目的

用源码生成的方式产出 Cordis 事件/服务目录文档,替换手工 taxonomy 校验。

f593f33#332

合并 origin/master 进 codex/rfc-simplify-candidates

改动

Merge commit,把 master(含 PR #75 cordis-catalog、core-data-structures 目录、type-equiv gate、acp-feature-support 等)合入简化候选分支。

目的

让 simplify-candidates 分支与最新 master 同步。

906705e#333

合并 PR #72:批量提出简化 RFC

改动

合并 codex/rfc-simplify-candidates 分支。新增 dsh-find-simplifications skill;批量新增/移动 20+ 份简化候选 RFC(drop-*、prune-dead-seam-methods、retire-mid-turn-steering、collapse-trace-only-session-events、discover-package-inventory、package-hierarchy、providerless-example-base 等);packages/acp、bash-local、tools 做了支撑分类的小改动。

目的

集中提交一批架构简化候选 RFC。

605587e#334

文档(rfc):用路径编码子目录对 RFC 分类

改动

在 docs/rfc/{lifecycle}/ 下加第二维 class 子目录(feature/bug-fix/simplification/architecture/process/testing),目录即标签;把全部已有 RFC 迁移到对应 class 目录;新增 verify-rfc-classification.ts(校验 RFC 落在合法 class 目录且 README 索引匹配)和 verify-doc-refs.ts(校验 TS 注释引用的 docs/*.md 路径真实存在)两个 doc-sync gate;README 增加分类说明;新增 process/2026-06-20-rfc-classification.md 记录该方案。

目的

用目录结构强制封闭分类集,替代解析式字段。

8c16524#335

chore(knip):删除失效入口模式并在配置 hint 上失败

改动

删除 knip.json 中无匹配的 examples/acp-agent/src/*.ts 入口;package.json 给 hygiene 加 --treat-config-hints-as-errors。

目的

消除 knip 配置漂移,让未来 stale 入口直接 fail gate 而非退化成静默 hint。

b2d4e0a#336

合并 PR #76:按类型分类 RFC

改动

合并 rfc-classification 分支(即 605587e + 8c16524 的结果)。

目的

引入 RFC 分类目录结构与配套校验 gate。

ae5a908#337

文档(rfc):提议在合适处统一使用 branded IDs

改动

新增 proposed/architecture/2026-06-20-branded-ids.md:把现有 Branded<B>(CallId/SessionId/AgentId)扩展到未加 brand 的跨边界 id(主要是 BashTask.id 的 bash-N 计数器、独立的 OwnerToken brand),并修复现有 brand 在 Map key/方法参数处退化为 string 的侵蚀;ModelId/ToolName/数字序号等明确列为延后项。

目的

加强跨边界 id 的类型安全。

d02e9f1#338

把包重组为模块化层级

改动

把 18 个 packages/<name> 迁入按职责分组的目录 core/、llm/、bash/、session-persistence/、ui/、support/;组目录是纯容器,包名保持 @deepseek-ai/dsh-*;把每包独立的 tsconfig paths 合并成 @deepseek-ai/dsh-* 通配符;更新所有深度耦合配置(workspace、tsdown、vitest、eslint、knip、tsconfig includes/refs、生成器、type-equiv manifest)和测试中跨包相对导入;修复 doc-typecheck 用 regex 解析 JSONC 的 bug(改用 TS API 正确解析含注释的通配路径)。标注 WIP:doc 交叉链接和包/RFC 文档待更新。

目的

落地 package-hierarchy RFC,把扁平包按职责分组。

08f6f17#339

合并 origin/master 进 worktree-package-hierarchy

改动

Merge commit,把 master(含 PR #76 rfc-classification)合入 package-hierarchy 分支。

目的

分支同步最新 master。

034779d#340

文档(rfc):提议把 example 应用提取为 package

改动

新增 proposed/architecture/2026-06-20-extract-example-app-packages.md:让 examples 目录变薄——每个 example 主要调用一个 app package;共享 dsh-agent-core bundle 拥有 providerless spine;dsh-stdio-agent、dsh-acp-agent app package 内置各自 front-door cluster(UI + logger/hmr policy + agent 预创建),把 ACP stdout 纯度 footgun 变成 artifact 属性;leaf cordis.yml 缩到 backends + config,start.ts 由 package bin 取代。取代 providerless-example-base RFC。

目的

提出 example 提取为 app package 的架构方案。

bf3cfe8#341

文档(rfc):修正 branded-IDs RFC 的 Codex review 问题

改动

修正 branded-ids.md 三处——SessionStore.get(id: string) 非可选(仅 create/prepare 接受可选 id);ACP brand-erosion 描述扩展到 bySession WeakMap、loadingIds Set、streamSessionEventUpdate(sessionId) 签名;代码路径用 bare inline code span 而非 markdown 链接,符合其它架构 RFC 的 house style。

目的

修正 Codex review 指出的不准确之处。

ca2207e#342

修复 hierarchy 的文档交叉链接;新增 package-path + shape gate

改动

合并 RFC-classification 重组后,批量改写所有漂移的 packages/<name> 交叉链接(Markdown 链接目标、移动后 README 相对深度、.ts 注释/字符串中的路径)到 grouped 路径;新增两个 gate——verify-package-paths.ts(标记指向已 MOVED 包的 stale packages/<path> 引用,但放过指向不存在包的前瞻性提案)和扩展 check-workspace-constraints(断言 packages/<group>/<pkg> 深度-2 形状、组目录无 package.json)。

目的

修复重组带来的链接漂移,把这次的人工检查自动化为 gate。

cf8007c#343

合并 PR #77:提议 branded IDs

改动

合并 worktree-branded-ids-rfc 分支(即 ae5a908 + bf3cfe8 的结果)。

目的

合入 branded IDs RFC。

d9c9c5d#344

文档(rfc):精确化 agent-loop、timer、leaf-config 表述

改动

对 extract-example-app-packages RFC 自审后修正三处——agent-loop 放置(core bundle 转发 agents 列表为自身 config 默认 [],而非硬编码 [],反驳了 base-core.yml 当初把 loop 排除出 core 的理由);timer 通用且 stdout 安全,应进共享 spine(只有 logger + hmr 是 app-specific);model/systemPrompt 落点因 app 而异(stdio 落到预创建 agent、acp 落到 bridge plugin),由各 app package 自己的 Config 路由。

目的

让 RFC 与实际源码严格一致。

5024cd5#345

文档化 package hierarchy 并定稿 RFC

改动

给每个组目录(core/llm/bash/session-persistence/ui/support)加 README 说明角色和 product-vs-support 分类;重写 packages/README.md 围绕 hierarchy(组表、grouped "what goes where",删除 package-hierarchy FIXME);把 package-hierarchy RFC 移到 implemented/architecture/ 并改写为已发布描述(放置理由、paths 通配符与 publint 去重、两个新 guardrail gate);把剩余 tsconfig.build.json references 去重并入 discover-package-inventory 提案;更新 AGENTS.md(重组 repo-layout map、depth-2 globs、新增 verify-package-paths gate、agentic-coding 时代倾向更严 lint 的说明)。

目的

最终落实 package hierarchy 并把 RFC 标记为已实现。

21a2807#346

合并 origin/master 进 worktree-rfc-extract-example-app-packages

改动

Merge commit,把 master(含 PR #77 branded-ids RFC)合入该分支;docs/rfc/README.md 有冲突。

目的

分支同步最新 master。

94a7626#347

文档(rfc):拒绝被取代的 providerless-example-base RFC

改动

git mv 把 providerless-example-base.md 从 proposed/ 移到 rejected/architecture/(保留历史);把 supersede 注记折叠成一行 rejected Status——extract-example-app-packages RFC 取代它(spine 移到 dsh-agent-core、base*.yml 删除后无共享 base YAML 可重命名);更新 README 行与交叉链接。

目的

正式拒绝被新方案取代的旧 RFC。

eb16025#348

合并 PR #78:提议把 example 应用提取为 package

改动

合并 worktree-rfc-extract-example-app-packages 分支(即 034779d + d9c9c5d + 94a7626 等的结果)。

目的

合入 example-app-packages RFC 系列。

184066e#349

自审后收紧已实现 RFC

改动

自审 implemented/architecture/2026-06-20-package-hierarchy.md 每个事实声明与已发布分支对照(hierarchy tree、无组 manifest、两个 tsconfig 的 dsh-* 通配符、publint glob、显式 build references、两个新 gate);把 paths-wildcard bullet 措辞改为当前状态;记录 doc-typecheck JSONC 解析微妙点(通配符引入的),防止未来编辑重新引入 regex 注释剥离 bug。

目的

让已实现 RFC 描述与事实严格对齐。

d1eb087#350

合并 origin/master 进 worktree-package-hierarchy

改动

Merge commit,把 master(含 branded-ids RFC、extract-example-app-packages RFC、providerless-example-base rejected)合入 package-hierarchy 分支;docs/rfc/README.md 有冲突。

目的

分支同步最新 master。

提交总结(g-14,共 25 个,从旧到新)25

e42493b7a7#351

修复合并后 master 新 RFC 中的包路径漂移

改动

两个 RFC(branded-ids.md、extract-example-app-packages.md)的包路径由旧的扁平 packages/<name> 改写为分组布局,并修正交叉链接指向 implemented/architecture/。

目的

#79 合并带入的两个 RFC 仍引用旧路径,verify-package-paths 和 verify-md-links gate 报错。

18f1c010ca#352

Merge PR #79:包结构重组为模块化分层

改动

将扁平 packages/<name> 大规模重组为 packages/<group>/<pkg>/ 分组结构(232 文件,+1357/−877)。新增 verify-package-paths.ts gate,更新 tsconfig、scripts、catalog、knip、AGENTS.md 等。新增 2026-06-20-package-hierarchy.md RFC。

目的

把 packages 按模块域(core/llm/bash/session-persistence/ui/support 等)分组,建立可扩展的模块层级。

11773170f0#353

提出 LLM API 不稳定恢复 RFC

改动

新增 docs/rfc/proposed/architecture/2026-06-21-unstable-llm-api-recovery.md(154 行)并在 README 索引登记。

目的

为 LLM provider API 不稳定(限流、抖动、瞬时错误)场景提出恢复策略 RFC。

3ab12acfe3#354

提出强制 app 归属 header RFC

改动

新增 docs/rfc/proposed/policy/2026-06-21-mandatory-app-attribution-headers.md(81 行)并在 README 索引登记。

目的

提出要求所有 app 请求携带归属 header 的策略 RFC。

30cd67b8a1#355

精简 LLM:删除未被消费的 adapter-change 事件与 assembled 调用面

改动

删除 LlmService.streamBlocks()/generate()、llm/generate waterfall、GenerateResult、llm/adapter-change 事件(含声明和 emit)、以及 BlockAssembler 的 flushReady/flushRemaining/result 切片;adapter 测试改用 stream()+BlockAssembler 的 assemble.ts helper;落地 AGENTS.md「RFC 是提案而非金科玉律」原则;两个 RFC 移到 implemented。

目的

生产唯一消费者(agent loop)只用 stream(),其余是投机便捷面;无人监听的 registry-change 事件无价值。

584349f881#356

review 修复:陈旧的 service 文案 + catalog 清理

改动

修正 LlmService 类 JSDoc 为单 streaming 面;从 gen-cordis-catalog.ts 的 LINK_MAP 删除已移除的 GenerateResult;adapter-change RFC 验收条件改指 verify-cordis-catalog;删除已同义反复的「streaming/one-shot 一致」property test。

目的

PR1 review 发现的文档/catalog 漂移。

7792347c4f#357

精简 seam:删除 persistence 与 bash seam 的死方法

改动

删除 SessionPersistence.has()/delete()、coordinator 的 has/delete/deleteCore、PersistenceBackend.deleteStored hook(含 jsonl/sqlite/in-spec 实现);删除 BashExecutor.get(id)/list();测试改用基于 onTaskDone 的 doneFor(id) helper;更新 seam README 为 4 方法持久化面。

目的

无消费者编程的抽象方法不是 seam,而是每个实现都得提供的投机性 surface。

5f9d10c587#358

review 修复:陈旧 seam 文档 + 无竞争 doneFor helper

改动

更新 core-data-structures/{persistence,bash}.md、sqlite README 与源注释(移除 has/delete/get/list);doneFor 懒挂监听器替换为 trackCompletions——setup 中预先挂载一个监听器记录所有完成,已完成的任务立即 resolve。

目的

doc-sync gate 不覆盖的文档漂移;原 helper 在任务已结束后才挂监听会错过完成事件而挂起。

6ca8c3b99a#359

review 修复:proposed RFC 中陈旧的 get/list + doneFor 二次等待

改动

从 branded-ids.md 和 generic-long-running-tool-runtime.md 两个 proposed RFC 的 BashExecutor seam 描述中去掉 get/list(保留 resolve/run/start/ownerOf/readOutput/kill/onTaskDone);trackCompletions 改为无条件记录每次完成并唤醒等待者,第二次 doneFor(id) 也能 resolve。

目的

二轮 review 防止 prune 落地后这些 RFC 读起来过时;修复 helper 边缘。

24168aee70#360

回退 bash get()/list() 删除——只保留 persistence 精简

改动

恢复 BashExecutor.get()/list() 及其 LocalBashExecutor 实现、bash 测试用例,删除 doneFor/trackCompletions 脚手架;persistence 的 has()/delete()/deleteStored 删除保留;RFC 重命名为 persistence-only 并加实现说明记录 bash 回退理由。

目的

bash get/list 各是一行 accessor,移除后需 ~35 行 onTaskDone 跟踪脚手架替代一行 ctx.bash.get(id);按「RFC 是提案」原则,测试 harness 本身就是 seam 消费者,迁移成本不合理。

d6a2ab30c8#361

类型:brand bash id + 遏制 brand 侵蚀;提取 Branded 到 dsh-brand

改动

新建零依赖类型包 @deepseek-ai/dsh-brand(packages/util/brand);mint BashTaskId/OwnerToken 并贯穿 BashTask.id、get/ownerOf/list/readOutput/kill seam、bash-local 生成点、tool-bash 校验面;agent-loop Config 在源点 brand(agents[].id: AgentId、resumeSessionId: SessionId);将 CallId/SessionId/AgentId 传播到 registry/store Map key、公开参数、ACP 表面、persistence coordinator 等。

目的

类型层修复 branded-id policy 两个 gap,并修正依赖方向——通用 capability 包不得耦合 LLM/session 词汇;dsh-bash 只依赖 dsh-brand。

f6bd1468f2#362

精简 agent:删除未用的公开 Agent.abort(),保留 whenIdle()

改动

从接口与 ReactLoopAgent 实现移除 Agent.abort();空队列 abort 测试改用 cancel(reason),两处 review-fixes 测试直接驱动私有 currentAbort 字段;保留 whenIdle()。公开停止面收敛为 cancel() + whenIdle()。

目的

无生产消费者用 abort()(ACP 用 cancel(),owner 用 dispose(),loop 内部直接 abort per-step controller);实现发现 whenIdle() 是 load-bearing 的 quiescence primitive(有 ACP 测试消费者、有替换-turn race 契约),RFC 提案移除它是错的。

c6ed980d6f#363

review 修复:陈旧 abort() 文档 + RFC 移到 implemented

改动

docs/architecture.md 删除公开 abort() 行;cancel.spec.ts 模块注释、acp/src/index.ts 的 resume-leak 注释把 abort() 改为 cancel();public-agent-stop-surface RFC 移到 implemented/simplification 并加实现说明(记录 whenIdle() 保留理由);AGENTS.md 添加 abort/whenIdle 作为「RFC 是提案」的具体例证;重新生成 catalog。

目的

Codex no-ship 是文档/完整性 gap 而非 loop 行为问题。

436305b1c2#364

review 修复:teardown 表述纠正(dispose,而非 cancel+whenIdle)

改动

docs/architecture.md、extension-cookbook.md(正文 + ts 注释)、acp-agent-client-protocol.md 的 lifecycle 段:teardown 表述改为 await AgentHandle.dispose(),明确 whenIdle() 只是观察 quiescence 而非 teardown。

目的

之前的 doc fix 把一个错误 primitive 换成另一个;真正的 teardown 是 disposer 的 stop(); await agent.done + 注销,cancel()+whenIdle() 会重新引入孤儿 agent/session 泄漏。

2be60b9a22#365

精简 session:将 trace-only usage/error 事件折叠进 load-bearing 事件

改动

token usage 改挂在 assistant/message 的可选 usage 字段;max-tokens 截断路径改为空内容 assistant/message { content: [], usage }(deriveMessages 跳过空内容);operational error 的 step 号挂到 turn/end.reason 的 kind:'error';failTurn 直接设置 reason;未 bump format version(pre-release v1 不变);重录 ACP fixtures/goldens;RFC 移到 implemented。

目的

两个独立 trace-only 事件不是 load-bearing 记录,事实应折进邻近的 load-bearing 事件以减少事件词汇膨胀。

e141ffa27f#366

收紧 LLM recovery RFC 范围

改动

仅修改 2026-06-21-unstable-llm-api-recovery.md(+86/−37)。

目的

收紧该 RFC 的适用范围,避免过度触及无关面。

c44ae5570c#367

review 修复:whenIdle() 是观察,不是 teardown 的 await

改动

修正 whenIdle() 自身 JSDoc(agent/src/types.ts、agent-loop/src/agent.ts)、agent/README.md、core-data-structures/core.md、ACP RFC 两处:disposer 不调 whenIdle(),而是 stop(); await agent.done;非 owner 观察用接口级 agent.whenIdle();重新生成 catalog。

目的

teardown 表述错误比之前三处更深——whenIdle() 的契约文档本身错误地声称 teardown 会 await 它。

9e2833d15a#368

review 修复:删除虚假的「关闭 ACP 连接」whenIdle() 示例

改动

whenIdle() JSDoc(types.ts)、core.md、catalog:删除「closing ACP connection」的引用,替换为真实的非 owner 观察者(await 一轮 settle 的测试、monitor),并明确 owner 不需要 whenIdle()(dispose 已 await loop-exit)。

目的

review 发现 JSDoc 引用的 ACP 例子与代码不符——ACP 实际 own handle 并通过 dispose teardown,从不调用 whenIdle();只有测试是真实消费者。

133f37584f#369

协调 LLM recovery RFC 与 sibling PR

改动

仅修改 2026-06-21-unstable-llm-api-recovery.md(+12/−4)。

目的

与并行的 sibling PR 保持 RFC 描述一致。

5716fab2c5#370

文档:在 RFC 中标注 in-flight 实现栈

改动

仅修改 2026-06-21-unstable-llm-api-recovery.md(+4)。

目的

在 RFC 中说明正在并行进行的实现栈,便于评审跟踪。

4209e4af3f#371

测试快照:session.jsonl 作为唯一 session-log 产物(删除 golden)

改动

删除所有 session.golden.jsonl;每个 model 场景至多保留一个 session.jsonl,既作 replay 源又作期望日志;新增 fixtureContext helper 对 fixture 自身做归一化(避免录制的 stale cwd 泄漏);快照比较两侧各自归一化后用 normalized-string toEqual 而非 toMatchFileSnapshot(不会覆写);authored 场景(error-finish、cancel)的期望日志放 session.jsonl;required-fixture guard 改为按 kind;ACP-snapshot-tests RFC 更新为缩减后的 fixture 集并移到 implemented。

目的

录制场景下 session.jsonl 与 golden 字节相同,纯重复;减少 fixture 维护面。

ddfb6573ee#372

review 修复:修正 property-suite 不变量描述

改动

仅修改 2026-06-11-property-based-testing.md(+1/−1)。

目的

ordered-prefix 契约和 streaming/one-shot usage 一致性早已随 flush/generate API 一并消失;改为枚举 property suite 实际断言的内容(blocks() 数 ≤ distinct index、幂等重组、blocks 不抛并产出合法 tag、finish 反映最后 finish chunk)。

83e97ed222#373

review 修复:文档化 util/ group + 对齐 branded-ids RFC 与 dsh-brand

改动

新增 packages/util/README.md(group README);packages/README.md 添加 util/ group、dsh-brand 包与依赖图节点,并修正「无 harness 依赖」的过时声明(dsh-llm/dsh-bash/dsh-session/dsh-agent 均依赖 dsh-brand);根 AGENTS.md Repository Layout 加 util/brand;branded-ids RFC 对齐实际 shipped 状态(Branded 在 dsh-brand,dsh-bash 只依赖该 util 包)。

目的

新建 packages/util/brand/ 后产生的顶层 util/ group 此前未被任何层级文档枚举。

00d7646558#374

review 修复:prune-seam RFC 与索引对齐 persistence-only shipped 范围

改动

docs/rfc/README.md 索引行从「persistence and bash seams」改为「Prune dead methods from the persistence seam」;重写 prune-dead-seam-methods.md 正文为持久化决策记录形态(Problem/Proposal/criteria/risks 仅描述 has/delete 移除,bash reasoning 折进顶部「considered and deliberately kept」决策说明);删除陈旧 bash 源行引用,保留指向当前代码的 persistence 消费者链接。

目的

bash 回退后 RFC 仍以 both-seams 框架描述,与实际 shipped scope 不符(verify-rfc-classification 只校验路径被索引,文案漂移逃过 gate)。

b0422f2a50#375

review 修复:bump session format version + 恢复 late turn-end warn

改动

集中 SESSION_FORMAT_VERSION 常量(dsh-session,pin 0),由 Session 构造默认值、SessionStore.prepare 头部两处写入点和 coordinator 的 load-time assertVersion 共同读取;非 0 log 在 load 时被拒绝(不迁移);所有测试/fixture/doc 中当前写入的 header 改为引用该常量,版本拒绝测试的 bad 值改为 99;AGENTS.md 记录 monotonic(SQLite SCHEMA_VERSION)与 pinned-0(session log)两种 pre-release 立场;failTurn 在 turn 已关闭后用 ctx.logger.warn 记录 late throw(而非无效赋值),并加回归测试;normal-step assistant/message append 加 content-or-usage guard(与 max-tokens 分支一致)。

目的

trace-event 折叠改变了持久化 SessionEventMap shape,按 policy 必须 bump 版本并由 backend 拒绝旧 log(pre-release 下保持 v0、任何非 0 即拒绝);late turn-end throw 不能消失到无效赋值;空内容空 usage 的 step 不应留 trace-only 行。

提交总结(g-15,共 25 个,从旧到新)25

655206848d#376

合并 PR5(trace-event 折叠 + v0 格式锁定)进入 PR6

改动

把 trace-only session event 折叠(agent-loop/loop.ts、session types/index、各类 session.jsonl snapshot、相关测试)合并进 PR6 分支;带冲突解决(多个 snapshot golden/jsonl)

目的

将"折叠 trace-only 会话事件 + 锁定 SESSION_FORMAT_VERSION=0"的工作向下传递到 PR6

2eb6ad3260#377

修复评审意见:同步陈旧的 v1/已删除事件文档引用

改动

session index.ts/README、agent-loop loop.ts JSDoc、persistence/collapse-trace RFC、acp-feature-support.md 等多处文档与注释

目的

上一修复遗漏的文档/注释漂移——版本号实为 0 非 1、独立的 usage/error 事件已不存在、措辞需对齐 pinned-v0 立场

ed2e230f20#378

合并 PR5 文档同步修复(b4471e5)进入 PR6

改动

把上一条文档同步修复合并进 PR6

目的

使 PR6 也带上 PR5 的 doc-sync 修正

e2bde2902c#379

refactor(examples):把 app 主干抽取为 dsh-agent-core + app 包

改动

新增三个包——dsh-agent-core(加载无 provider/executor/UI 的主干 bundle)、dsh-stdio-agent(终端聊天 APP + bin)、dsh-acp-agent(ACP server APP + bin,无 stdout logger);删除各 example 的 start.ts 与 base.yml/base-core.yml/acp-tail.yml;boot glue 移入各 app bin;新增 keyless 真实加载路径测试;更新 RFC/文档/模块图

目的

消除每个 example 的厚模板(手写 start.ts、infra 前导、嵌套 include、靠散文维系的前门集群),让每个 example 变成薄叶子 cordis.yml;将 stdout-purity footgun 在结构上从 ACP 叶子中隔离

47afcb297f#380

合并 PR6(移除 snapshot golden + PR5 trace-events)进入 PR7

改动

把 trace-event 折叠 + agent-loop/session 相关改动一并合并进 PR7

目的

将 PR6 的工作向下传递到 PR7

66e56bd395#381

修复评审意见:陈旧的 coding-agent README、export-shape 守卫、过度断言措辞

改动

重写 coding-agent README 插件表为当前四个叶子条目;为 agent-core/stdio-agent/acp-agent 三个新包加显式 export-shape 守卫(断言无 default 导出且 Loader.unwrapExports 不破坏 name/Config/apply);软化 agent-core/acp-agent README 与 RFC 中"结构上不可达"的过度断言

目的

修复抽取重构 PR #88 评审发现的三类问题——文档陈旧、缺少对缺 inject 时 export default 会静默丢导出的守卫、措辞夸大

bfc5a9097d#382

修复评审意见:软化 acp-agent 模块文档中最后一条 stdout-purity 过度断言

改动

acp-agent/src/index.ts 模块注释把"footgun 从叶子结构上不可达"改为"app 不给默认前门留 logger 条目"

目的

叶子仍可能加 sibling logger 条目,原措辞不实;改写为准确表述

9e86fd995c#383

fix(ci):把 demo smoke 测试指向 dsh-stdio-agent bin

改动

.github/workflows/ci.yml 把 "Demo smoke test" 从已删除的 examples/echo-agent/start.ts 改为调用 pnpm run demo:echo,断言不变

目的

抽取重构删除了 echo-agent/start.ts,导致 CI 在 node 24/26 失败;通过 canonical demo 脚本避免再次漂移

3567808171#384

修复评审意见:加固 app bin + built-bin smoke、架构例外文档、snapshot fixture 守卫

改动

两 bin(stdio/acp)在 loader.create() 后加 await ctx.loader.await() 等整树就绪、传 config 的绝对 file:// URL;boot() 加 assertEntriesLoaded() 让 fiber-less 条目 fail loud;main() 加 unhandledRejection guard(installFailLoud);新增 built-bin.e2e.ts(用真实 lib/bin.js 在临时消费目录跑 node,验证 echo/ACP + stdout 纯度 + 缺目录/缺文件 fail-loud);架构文档为 dsh-agent-core 依赖具体 loop 开 COMPOSITION 例外;snapshot fixture 守卫要求所有场景都有 session.jsonl

目的

BLOCKER——发布的 lib/bin.js 之前只经 tsx 验证,未在 plain node 下被守护;修正 boot settle race、配置路径鲁棒性、静默 load 失败,并把"真实入口路径=已发布 artifact"纳入测试

e04ca55374#385

修复评审意见:每个 snapshot 场景都要求 session.jsonl

改动

examples/acp-agent/tests/acp.snapshot.ts 的 per-kind fixture 守卫及注释

目的

no-model 场景其实也需要 session.jsonl(harness 无条件传给 llm-replay,缺失则 loadReplayScript 抛错);守卫与注释对齐现实

e63641bcfd#386

合并 worktree-simplify-snapshot-goldens 进 worktree-simplify-extract-examples

改动

把 snapshot-goldens 分支合并进 extract-examples 分支(空合并)

目的

把移除 snapshot golden 的工作并入 extract-examples 链

a96b1e3ae7#387

docs(agents):记录 stacked-PR 编排 + 更尖锐的真实入口路径教训

改动

AGENTS.md 新增 "## Orchestrating review feedback across a stacked PR chain" 章节(一 worktree 一分支、修复落在引入 PR 再向下流、review-fix 独立提交不 amend、委托工作须 trust-but-verify);"## Conventions" 加 "Never rewrite a pushed branch" 规则;扩展 "Line coverage is not behavior coverage" 两条推论(export-shape 守卫需断言坏形状会失败;真实入口路径指已发布 artifact 而非 tsx dev runtime)

目的

把 7-PR 简化栈两轮评审中习得的教训固化为文档

b7d018580e#388

修复评审意见:verify-package-paths 跳过 lib/ 引用;acp built-bin 的 npm 依赖从声明包解析

改动

scripts/verify-package-paths.ts 跳过任何含 lib/ 段的引用(doc-sync 在 build 前跑,无 lib/);acp built-bin smoke 改为从 ui/acp 包 URL 解析 zod/@agentclientprotocol/sdk(acp-agent 不声明它们)

目的

新 built-bin smoke 的 lib/bin.js 引用被误判为陈旧源漂移;pnpm 严格布局下 acp-agent 解析不到 zod,导致 CI built-bin 步骤失败

d0e1b02a7f#389

修复评审意见:修正 stop-surface RFC 中 whenIdle 活跃消费者的说法

改动

public-agent-stop-surface RFC 把"活跃消费者(ACP bridge 的 settle 点)"改为 ACP/agent 测试通过公共 seam 等待结算

目的

packages/ui/acp/src 实际没有 whenIdle() 调用(bridge 走 AgentHandle.dispose),原说法不实

2903f96548#390

修复评审意见:RFC 说明每个 snapshot 场景都需要 session.jsonl

改动

docs/rfc/implemented/testing/2026-06-19-acp-snapshot-tests.md 措辞

目的

harness 无条件把 session.jsonl 传给 llm-replay,no-model 场景也必需;代码已如此,对齐 RFC 文字

f09a88ecee#391

合并 worktree-simplify-agent-stop 进 worktree-simplify-trace-events

改动

把 agent-stop 分支(agent.ts、agent types.ts、agent stop-surface RFC 等)合并进 trace-events

目的

把"公开 agent stop 表面"工作并入 trace-events 链

ebe8c8e21f#392

合并 worktree-simplify-trace-events 进 worktree-simplify-snapshot-goldens

改动

把 trace-events + agent-stop 一并合并进 snapshot-goldens(同 f09a88ecee 的改动集合)

目的

把 trace-event 折叠 + agent-stop 向下流入 snapshot-goldens 链

9f5e2b352c#393

合并 worktree-simplify-snapshot-goldens 进 worktree-simplify-extract-examples

改动

进一步把 snapshot-goldens(含 trace-events/agent-stop)合并进 extract-examples

目的

把累积的简化分支汇入 extract-examples 链

64976df216#394

合并 worktree-simplify-extract-examples 进 worktree-lessons-learned

改动

把 extract-examples(及其已合并的 snapshot-goldens/trace-events/agent-stop + built-bin/verify-package-paths 修复)汇入 lessons-learned 汇总分支

目的

把整条简化栈汇总到 lessons-learned 分支

4d7726ecd3#395

修复评审意见:不要把 disabled 条目当 load 失败;verify-package-paths 的 lib 跳过限定到真实包根

改动

两 app bin 的 assertEntriesLoaded() 改为过滤 fiber === undefined && !entry.disabled(disabled 条目按设计无 fiber);stdio built-bin smoke 加 disabled 条目配置仍能 boot 的用例;verify-package-paths 的 lib 跳过限定为 packages/<group>/<pkg> 之后段,避免误放过陈旧无 group 的 packages/acp-agent/lib/bin.js

目的

disabled:true 条目是合法"插件关闭"而非坏导入;lib 无条件跳过会漏掉真正漂移

5c0597e9de#396

合并 worktree-simplify-extract-examples 进 worktree-lessons-learned

改动

把上一条修复(disabled/lib-scope)合并进 lessons-learned

目的

把评审修复带入汇总分支

4661905714#397

合并 origin/worktree-simplify-prune-seam 进 worktree-simplify-branded-ids

改动

合并 prune-seam 分支(prune-dead-seam-methods RFC),解决 RFC 文档冲突

目的

把"修剪死 seam 方法"工作并入 branded-ids 链

a6a5892e8a#398

合并 origin/worktree-simplify-branded-ids 进 worktree-simplify-agent-stop

改动

合并 branded-ids(含 prune-seam)——branded-ids RFC、AGENTS.md Branded 规则、packages/util/README、prune-seam RFC

目的

把 branded-ids + prune-seam 向下流入 agent-stop 链

fd76791c6b#399

合并 origin/worktree-simplify-agent-stop 进 worktree-simplify-trace-events

改动

把 agent-stop(及其已合并的 branded-ids/prune-seam)合并进 trace-events

目的

累积简化栈继续向下游 trace-events 流转

56a2351e08#400

合并 origin/worktree-simplify-trace-events 进 worktree-simplify-snapshot-goldens

改动

把 trace-events(含 agent-stop/branded-ids/prune-seam)合并进 snapshot-goldens

目的

完成整条 prune-seam → branded-ids → agent-stop → trace-events → snapshot-goldens 的 merge-forward 链

提交总结(g-16,共 25 个,从旧到新)25

6cb8f35a#401

将 snapshot-goldens 分支合并进 extract-examples

改动

Merge worktree-simplify-snapshot-goldens → worktree-simplify-extract-examples;解决 AGENTS.md 冲突,带入 branded-ids / prune-dead-seam-methods 两条 RFC 笔记与新增的 packages/util/README.md。

目的

在 extract-examples 特性分支上同步相关简化工作的结果。

df4f8a4d#402

将 extract-examples 分支合并进 lessons-learned

改动

Merge worktree-simplify-extract-examples → worktree-lessons-learned;带入同一批 AGENTS.md / RFC / packages/util 文档更新。

目的

在 lessons-learned 分支上累积前面一串 simplify 工作的成果。

89d9a667#403

PR #82 简化 LLM:删除未被消费的 adapter-change 事件与 assembled call 表面

改动

删除 packages/llm/llm 中 assembler/index/types 的死代码(净减约 277 行),同步 llm-deepseek / llm-pi-ai 的 assemble 测试拆分,更新 catalog、architecture、README。

目的

清理 LLM seam 上无人消费的 adapter-change 事件和 assembled 调用表面,收敛公共表面积。

fa5cf0af#404

将 master 回合并到 simplify-prune-seam

改动

常规回合并,仅更新 docs/rfc/.../2026-06-11-property-based-testing.md 一行。

目的

让特性分支跟上 master。

2d4c367e#405

PR #83 简化 seam:修剪 persistence seam 的死方法

改动

从 session-persistence / jsonl / sqlite 的接口和 coordinator 中删除不再使用的方法,新增 RFC 2026-06-20-prune-dead-seam-methods.md,更新 contract 测试。

目的

移除持久化能力 seam 上未被调用的方法,保持 seam 精简。

74344a8bd4#406

将 master 回合并到 simplify-branded-ids

改动

回合并,仅更新 property-based-testing RFC 一行。

目的

让特性分支跟上 master。

8f50008d#407

PR #84 类型:为 bash id 加 brand 并阻止 brand 侵蚀

改动

新增 packages/util/brand 工具包;在 bash / bash-local / tool-bash / core (agent-loop、agent、session) / llm / ui-acp 等多处把裸 string id 改为 branded 类型,并补 tsconfig 引用与 type-equiv manifest。

目的

让跨边界 id 成为 Branded<B> 不透明类型,防止 brand 在传递中被悄悄丢失。

4ead67c0#408

将 master 回合并到 simplify-agent-stop

改动

回合并,仅更新 property-based-testing RFC 一行。

目的

让特性分支跟上 master。

9f13dd02#409

PR #85 简化 agent:删除未用的公共 Agent.abort(),保留 whenIdle()

改动

从 packages/core/agent 类型与 agent-loop 实现中移除未被调用的 Agent.abort(),保留 whenIdle();更新 architecture、core-data-structures、cookbook 及对应测试,新增 RFC 2026-06-20-public-agent-stop-surface.md。

目的

收敛 Agent 的公共停止表面,只暴露实际被消费的 API。

5d7af3be#410

将 master 回合并到 simplify-trace-events

改动

回合并,仅更新 property-based-testing RFC 一行。

目的

让特性分支跟上 master。

e770e224#411

PR #86 简化 session:把仅用于 trace 的 usage/error 事件折叠进承载事件

改动

在 packages/core/session 与 agent-loop 中合并冗余的 trace-only 事件类型,重写相关 spec,重新生成所有 ACP 快照(multi-turn、tool-call-turn、workspace-edit 等的 session.jsonl/golden)。

目的

去除只为 trace 存在的事件,把 usage / error 信息并入真正承载功能的事件流。

c85713d1#412

将 master 回合并到 simplify-snapshot-goldens

改动

回合并,仅更新 property-based-testing RFC 一行。

目的

让特性分支跟上 master。

73739414#413

PR #87 测试:用 session.jsonl 作为唯一的 session-log 产物

改动

删除各 snapshot 目录下冗余的 session.golden.jsonl,改由 session.jsonl 单独承担;扩展 acp.snapshot.ts 比较逻辑,更新 RFC 与快照 normalize。

目的

去掉重复的 golden 副本,简化快照产物。

0b75598c#414

将 master 回合并到 simplify-extract-examples

改动

回合并,仅更新 property-based-testing RFC 一行。

目的

让特性分支跟上 master。

5d3e7dd5#415

PR #88 重构:把 app 主干抽到 dsh-agent-core + 应用包

改动

新增 packages/core/agent-core、packages/ui/acp-agent、packages/ui/stdio-agent 三个包承载原 examples 中的应用主干与 bin;删除 examples 下散落的 start.ts / base*.yml,改造 acp-agent / coding-agent / echo-agent 的 cordis.yml 与 e2e,新增 verify-package-paths.ts。

目的

把 example 中重复的应用装配逻辑提炼为可复用包,examples 回归为薄壳。

a20e3b70#416

将 master 回合并到 lessons-learned

改动

回合并,仅更新 property-based-testing RFC 一行。

目的

让特性分支跟上 master。

6b4dc48f#417

PR #89 文档:补充 stacked-PR 编排与 real-entry-path 教训

改动

仅改 AGENTS.md,新增 14 行关于 stacked-PR 编排流程和真实入口路径选择的教训。

目的

把 lessons-learned 分支的踩坑经验沉淀进 AGENTS.md。

1a81f2cc#418

新增 subagent 能力 seam:接口、mock 后端、模型面向工具

改动

新增 packages/subagent/ 组(dsh-subagent 提供 SubagentService 注册表 + Provider/Run 词汇 + start/end 事件,dsh-tool-subagent 提供模型可见的 subagent 工具)、packages/support/subagent-mock 脚本化测试 provider;写 RFC 2026-06-21-subagent-capability-seam.md,接入 tsconfig、catalog、module-graph。

目的

为「agent 委托子 agent」建立命名 provider 注册表 seam,使 in-process / ACP / 未来 A2A 等多种传输能共存。

25eccdae#419

修复 review 发现:生命周期收容、工具名可配置、覆盖率、类型目录

改动

对 subagent start|end 事件加 emitContainedStart/End(避免抛错泄露子 agent),把 dsh-tool-subagent 工具名改为可配置(Config.toolName,默认 subagent),补齐 per-file 100% 覆盖率用例,新增 docs/core-data-structures/subagent.md 并登记 type-equiv。

目的

处理首轮 Codex review 的四项问题:泄露、重名、覆盖率缺口、文档缺失。

861791d2#420

subagent 生命周期监听器改为按监听器收容而非按 emit 收容

改动

把 subagent start/end 事件的异常容错从「整个 emit 一个 try/catch」改为通过 ctx.events.dispatch 逐个 listener 调用并各自收容;测试改为注册两个 listener(第一个抛错)验证第二个仍能收到事件。

目的

遵循 AGENTS.md 的 callback-boundary 规则,避免一个坏订阅者饿死后面的监听器。

fd55d205#421

revert:移除 rebase 期间引入的非本分支改动

改动

撤销 AGENTS.md、docs/development.md、2026-06-11-doc-sync-enforcement.md 和 pnpm-lock.yaml 上 rebase 误带入的改动。

目的

让分支只保留属于自己的改动,剔除 rebase 串入的内容。

74cdd9a2#422

将 master 合并到 feat/adr0016-type-build-check

改动

Merge master → feat/adr0016-type-build-check,巨大合并(365 文件):带入 master 上 packages 按 group(bash/core/llm/ui/session-persistence/support 等)重组、examples 抽包、大量 RFC 重新分类归档以及新增 verify-type-equiv.ts / verify-rfc-classification.ts / verify-doc-refs.ts / gen-cordis-catalog.ts 等脚本。

目的

把 type-build-check 特性分支 rebase 到当前 master 形态,以便后续基于新包结构落地 ts 构建配置。

88b75181#423

修复:给新包应用 ts-build-config 调整

改动

调整 agent-core / acp-agent / stdio-agent / brand / bash 等新包的 package.json 与 tsconfig.json、tsdown 配置,统一根 tsconfig.json 的构建引用。

目的

让前一合并带入的新包符合 adr0016 的 ts 构建配置约定。

732e121f#424

修复:让 workspace constraints、lint 和 md-links 检查通过

改动

把 2026-06-17-ts-build-config.md 移到 rfc/implemented/process/,微调 adding-a-package.md、eslint 配置,扩展 check-workspace-constraints.ts。

目的

修复合并后遗留的约束 / lint / 死链问题,让门禁恢复绿色。

94e73554#425

文档:更新 packages 层级 RFC 到当前形态

改动

仅改 docs/rfc/implemented/process/2026-06-17-ts-build-config.md,把其中描述的 packages 层级对齐到当前 RFC。

目的

让该 RFC 与实际的 packages 分组结构保持一致。

提交总结(g-17,共 25 个,从旧到新)25

7aabd2a3df#426

新增进程内 subagent 后端:spawn(全新)与 fork(带种子)

改动

新增 dsh-subagent-spawn(通过 ctx.agents.create 造全新子 agent,独立 session,默认继承父 model)与 dsh-subagent-fork(以父 agent 已完成 turn 的前缀作为 seed 造子 agent,继承上下文);扩展 CreateAgentOptions.seed、AgentOptions.subagentDepth;在 coding-agent 示例接入 spawn 后端与 subagent 工具。

目的

落实 subagent 能力缝(capability seam)的第二条 PR,让同一 cordis context 上可运行父子 agent,复用 agent factory 的 quiescent teardown。

07f4047ff0#427

为声明使用显式 ts 扩展符

改动

恢复源码中相对导入的显式 .ts 扩展符;启用 rewriteRelativeImportExtensions 让产物 JS 用 .js、声明保留显式 .ts;全仓 vendored/loader/llm/core 各包源文件批量调整扩展符;新增 scripts/verify-node-next-types.ts(160 行)作为 NodeNext 声明消费方闸门;CI 与 build 配置同步。

目的

解决 NodeNext 下声明文件相对导入扩展符缺失的回归,建立可机械检查的闸门。

b82c310db3#428

修复 subagent 进程内结果作用域(Codex review round 1)

改动

subagent-spawn/src/in-process.ts 的 readResult 改为只扫描子 agent 自身事件(seed 前缀之后),取消队列前映射为 aborted;修正 SubagentRun.id 文档(是 agent id 非 session id);刷新 coding-agent welcome 串与 TODO(sub-agents) 旧文;补两条红→绿回归测试。

目的

修两个合并阻断 bug:pre-turn cancel 被误判为 error、fork 子无消息时返回了父 seed 的最后一条 assistant/message。

9c1048f2b5#429

在 subagent 驱动中尊重已 abort 的 request signal(Codex review round 2)

改动

in-process.ts 在结果路径开头检查 request.signal?.aborted,已 abort 则直接 settle aborted 不跑子 agent;补回归测试;更新 subagent RFC 与 unify-id RFC 中已过时的 "deferred" 措辞。

目的

request signal 在 run 开始前就 abort 时 addEventListener 不会触发,后端 bridge 会漏掉而把子 agent 跑到 completed。

e68496fd79#430

为嵌套 agent 增加按 session 的快照重放(PR2.5)

改动

GenerateOptions.sessionId(Branded)打在模型请求上,由 agent loop 设置;dsh-llm-replay 按 session 加载父日志 + 每个子日志、按首次调用顺序绑定 live session↔recorded script;快照 harness 收集所有 .jsonl 并以 session.jsonl/session.<n>.jsonl 写回;acp-agent 示例接入 subagent seam,新增 subagent-spawn、subagent-multi 两组真实 API 录制的无密钥快照场景;新增 testing RFC。

目的

原快照层是单 session 单游标,无法确定性重放或收割子 session 日志;解决 TODO(subagent-snapshots)。

413db68008#431

厘清子 agent 排序不变量(Codex review follow-up)

改动

仅注释/RFC 文本——把 replay sort 与 harvest sort 的 "tie-safe" 注释改为真实不变量陈述:当前同步场景下 sibling 的 createdAt 严格递增、与首次调用顺序一致;id tiebreak 仅让退化碰撞确定性;XXX(concurrent-subagents) 标注未来并发场景需要真正的 first-call 序号。

目的

修正 review 指出的过度声称,记录已知限制;无行为变更。

6731793859#432

revert:用 rewriteRelativeImportExtensions 解决 NextNode .d.ts resolve

改动

39 个测试/源文件的导入扩展符批量调整(恢复/对齐到本仓当前约定)。

目的

对 07f4047ff0 路线的回退或对齐——按当前 RFC 重新落地 .d.ts 解析策略。提交标题以 "revert:" 标注,由 imccyu 提交。

fa9438bf16#433

docs:将 rewriteRelativeImportExtensions 更新到当前 RFC

改动

改 docs/rfc/implemented/process/2026-06-17-ts-build-config.md、scripts/verify-node-next-types.ts、tsconfig.json 三处文档/配置。

目的

让 RFC 文本、验证脚本与 tsconfig 与当前 rewriteRelativeImportExtensions 实际行为一致。

0298f5c6f0#434

Merge origin/master 到 session-surface

改动

大合并(docs/architecture、cordis-catalog、core-data-structures、postmortem、RFC 大量重排)。关键实质:采用 master 的折叠 usage 字段(assistant/message.usage)并重新挂载 surface metadata;surface opts 接到 master 新的 max-tokens append;surface 列表移植到 coordinator 重构后的 SQLite 新路径,丢弃 v1→v2 migration(按 pre-release bump-and-reject);session-surface RFC 移到 implemented/architecture/;重生成 cordis catalog;重新收割 ACP 快照 fixture 带 surface 元数据。

目的

让 session-surface 特性分支与 master 的包重组、折叠 usage、persistence coordinator 等改动对齐。

f393043b03#435

新增 ACP subagent 后端:进程外委托(PR3)

改动

新增 dsh-subagent-acp——每次 run spawn 子进程,harness 作为 ACP client(与 dsh-acp server 方向相反)走 initialize/newSession/prompt,dispose kill 子进程并等退出;最小 client stub(无 fs/terminal capability、累积 agent_message_chunk、按策略自动答 permission);StopReason→结果映射;credential 形态的环境变量被 scrub,子 agent key 仅经显式 config.env 透传;ENOENT spawn 错误被捕获与 ACP drive 竞速。测试:mock ACP server 子进程的无密钥集成(含 cancel 竞态、permission、非消息更新、spawn 失败、HMR)+ 真实 acp-agent 进程的 with-key e2e。

目的

证明 subagent seam 能推广到进程外后端,完成 PR1→PR2→PR2.5→PR3 的 seam stack;留在 @agentclientprotocol/sdk 0.25.1(0.28.x 只 deprecate 当前 API,本后端无需其新特性)。

5e01564afb#436

新增 filesystem 能力缝与工具

改动

新增 packages/fs/ 下四个包——fs(Service Definition)、fs-local(fsio.ts + 本地 provider)、tool-fs(read/write/edit 三个工具)、相应 README/tsconfig/pnpm-lock;新增 filesystem 能力缝 RFC 与 filesystem tool schemas RFC;docs/module-graph、cordis-catalog、architecture 同步。

目的

按 Service Definition/Provider/Consumer 角色补齐文件系统能力缝并提供模型可见工具。

0efd65b10b#437

Merge PR #93(codex/pr36-ts-specifier-declarations)

改动

合并 07f4047ff0 那条 "Use explicit ts specifiers for NodeNext-safe declarations" 到主干,即统一全仓 .ts 扩展符 + NodeNext 声明闸门。

目的

通过 GitHub PR #93 落地显式 ts 扩展符约定。

475c68cbe8#438

docs:同步包 cookbook 与 build 配置

改动

改 docs/cookbook/adding-a-package.md(22 行)与 docs/rfc/.../2026-06-20-package-hierarchy.md(2 行)。

目的

让 "添加一个包" cookbook 与当前 ts-build-config(lib/types 产物布局)一致。

6801130f8c#439

为 ACP dispose 加 SIGKILL 升级;pre-aborted 时跳过 spawn(Codex review round 1)

改动

subagent-acp/src/run.ts dispose 改为:关 stdin(graceful ACP close)→ SIGTERM → grace 内未退则 SIGKILL,并 await 确定 exit(grace 经 spec.disposeGraceMs 可调,镜像 bash executor 的有界 teardown);startAcpRun 在 request 已 abort 时返回 inert already-aborted run 不 spawn;mock 加 trap-ready 信号;cancelled flag 移到 holder 对象避免 TS 控制流窄化。

目的

修两个生命周期问题——dispose 只发 SIGTERM 可能永久挂起(孤儿化子 agent 持有的 bash 等);已取消的请求仍去 spawn 配置的二进制。

4565161c64#440

给 ACP 子进程一个 EOF 静默窗口再 SIGTERM(Codex review round 2)

改动

dispose 改为三级阶梯——stdin EOF 后先等子进程自然退出(tier 1),再 SIGTERM(grace),再 SIGKILL;新增 exitsWithin helper;mock 新增 MOCK_FLUSH_ON_EOF(异步 flush marker 后自退)与 MOCK_IGNORE_EOF 模式,tier-1 测试 proven RED on same-tick SIGTERM。

目的

原 dispose 同 tick 关 stdin + 发 SIGTERM,子进程 EOF 驱动的 quiesce(含持久化 flush、停子 bash)来不及跑,导致中途被杀、flush 丢失、孤儿 bash。

3a67d0a882#441

docs:同步开发 CI gate 文档

改动

仅 docs/development.md(2 行)。

目的

让开发文档中 CI gate 描述与实际 gate 列表一致。

2ff112962b#442

把 dispose EOF grace 调到大于嵌套 teardown 余量;证明 SIGTERM 档(Codex review round 3)

改动

(A) 拆出独立 disposeEofGraceMs(默认 6000ms)——因为子 acp-agent 的 EOF teardown 会停它自己持有的 bash,而 SIGTERM-trapping 的 bash 孙子进程能占满 ~3s 才被自己的 SIGKILL,原 3000ms 与 dsh-bash-local 的 SIGTERM→SIGKILL grace 相等导致父 SIGTERM 正好撞上子的 SIGKILL+flush;tier-1 测试用超过 SIGTERM grace 但在 EOF grace 内的 flush(proven RED 当 tier 1 复用小 grace)。(B) 中档 SIGTERM 测试原来只断言 dispose 返回及时,无法区分 EOF→SIGKILL(跳过 SIGTERM 档)——mock 的 MOCK_IGNORE_EOF 现装 SIGTERM handler 并 touch marker 后退出,SIGKILL 不可捕获故移除 SIGTERM 档会缺 marker(proven RED)。

目的

让有界 dispose 真正覆盖任意 ACP 子进程的嵌套 teardown 时长,并加固中档测试使其能区分阶梯被删。

98f272de25#443

Merge PR #36(feat/adr0016-type-build-check)

改动

合并 "Unified TypeScript Build and Config" RFC——declaration 产物移到 lib/types,types/exports/files 指向那里;全仓包 package.json/tsconfig.json 批量对齐;新增 scripts/check-workspace-constraints.ts(51 行)与 verify-node-next-types.ts;tsconfig.base/test/typecheck 重构;vendored 包同步。

目的

统一全仓 TypeScript 构建与产物布局约定(ADR0016)。

0c9ea3145f#444

把共享进程内 driver 抽到 dsh-subagent-inprocess(review feedback)

改动

新增纯库包 dsh-subagent-inprocess,把 startInProcessRun/depthOf/SubagentDepthError/InProcessRunOptions 从 dsh-subagent-spawn 搬过去(spawn 不再 re-export,fork 不再从 spawn 反向依赖);coding-agent/cordis.yml 同时挂 spawn + fork + 两个 tool-subagent 实例(subagent→spawn、subagent_fork→fork)演示多 transport 纯配置即可。

目的

让两个进程内后端互相独立——spawn 原本携带 fork-aware seeding 逻辑,fork 反向依赖 spawn。

8d111161de#445

Merge origin/master 到 worktree-subagent-seam-pr1

改动

把 #36(ADR0016 ts-build-config)的包级改动(package.json/tsconfig.json/产物布局)并入 subagent seam 分支;tsconfig.typecheck.json 冲突已解。

目的

在 subagent seam 分支上同步 master 的统一 ts 构建配置。

398b4f2ccf#446

Merge worktree-subagent-seam-pr1 到 pr2

改动

把 pr1(含 pr1 之上已合并的 master 改动)并入 pr2 分支;同样主要是 package.json/tsconfig.json/tsdown 等 ts-build-config 对齐。

目的

pr2 分支获取 pr1 + #36 的基线,便于后续在统一 ts 配置上继续工作。

67c7ef791f#447

把 ts-build-config(lib/types)约定套到新增的 subagent 包

改动

subagent-inprocess、subagent-spawn、subagent-fork 三个包的 package.json(产物/exports 指向 lib/types)与 tsconfig.json 对齐新约定;加入顶层 typecheck tsconfig 的 references。

目的

merge 把既有包迁到 lib/types,但这三个新包还是旧 lib/ 布局,需补齐到统一约定。

e46ebcec89#448

Merge worktree-subagent-seam-pr2 到 pr2.5

改动

并入 pr2 的全部(含 inprocess 拆分、多 backend cordis 配置、ts-build-config)。

目的

pr2.5(快照重放)分支获取 pr2 最新基线,包括拆出的 inprocess 包与统一构建配置。

ac28e1a1d3#449

docs:新增 filesystem 数据结构目录

改动

新增 docs/core-data-structures/filesystem.md(145 行);更新 docs/cordis-catalog/events-and-services.md、core-data-structures/core.md;scripts/gen-cordis-catalog.ts 与 type-equiv.manifest.json 同步以纳入 fs 类型。

目的

为 5e01564afb 引入的 filesystem 能力缝补齐核心数据结构目录文档。

2086804b7e#450

Merge worktree-subagent-seam-pr2.5 到 pr3

改动

把 pr2.5(含 inprocess 拆分、按 session 快照重放、统一 ts 配置)并入 pr3(ACP 后端)分支;docs/module-graph.md 与 packages/subagent/README.md 冲突已解。

目的

pr3 分支获取 pr2.5 基线,使 ACP 后端 PR 建立在已统一构建配置与快照基础设施之上。

提交总结(g-18,共 25 个,从旧到新)25

e45053f0f5#451

新增 compaction 能力 seam 的抽象接口

改动

新增 @deepseek-ai/dsh-compact 接口包,定义抽象 CompactService(ctx.compact,含 compactIfNeeded/compactRegion),通过 SessionEventMap 声明合并加入 compact/* 会话事件类型,并附 RFC;接入三个根 tsconfig 与 cordis catalog。

目的

建立 compaction 能力 seam 的服务定义层,后端实现后续单独落地。

8723186398#452

在 subagent 工具桥中处理已 abort 的信号

改动

packages/subagent/tool-subagent 在注册 addEventListener('abort') 后立即复查 exec.signal.aborted 并显式 cancel;新增只对 cancel() 反应的 spy provider 回归测试。

目的

abort 监听器对已 abort 信号不会触发,导致父步骤在工具运行前取消时子 agent 永远收不到取消,修复该边界(评审反馈)。

083af62785#453

ACP 取消不再依赖子进程协作,并保留扁平化错误

改动

packages/subagent/subagent-acp 的 result 路径将 ACP drive 与 cancelSettled promise 竞速,请求 cancel 即令 result 置为 aborted;原先空的 broad catch 改为绑定并扁平化错误,经新 AcpRunSpec.onError 由 provider 上报到 ctx.logger.warn;新增 MOCK_IGNORE_CANCEL mock 模式与回归测试。

目的

阻塞 bug——子进程忽略 cancel 或卡住 prompt 时父侧 result 永久挂起、子进程不退出,违反 SubagentRun.cancel() 契约(评审反馈)。

34f6f28716#454

让 acp-agent demo 中的 fork 后端可被模型触达

改动

examples/acp-agent 的 cordis.yml 与 cordis.snapshot.yml 中再注册一个绑定 fork 的 dsh-tool-subagent,工具名 subagent_fork。

目的

原先 demo 只把唯一的 tool-subagent 绑定到 spawn,fork 虽加载却对模型不可达,注释声称的「两种传输并用」并不成立(评审反馈)。

4e87a533a7#455

合并 worktree-subagent-seam-pr1 到 pr2

改动

将 PR1(subagent 接口 + 工具桥 fix)合入 pr2 分支。

目的

把 subagent 能力 seam 的第一层叠入后续 PR 的工作分支。

8dc211beed#456

合并 worktree-subagent-seam-pr2 到 pr2.5

改动

把 pr2 的内容合入 pr2.5 分支。

目的

继续在子分支间合并前置 PR,维持堆栈链路。

c4ba1bd65a#457

合并 worktree-subagent-seam-pr2.5 到 pr3

改动

把 pr2.5(含 acp-agent demo fork 修复与工具桥 fix)合入 pr3 分支。

目的

把前两层叠进第三层 PR 分支,准备后续 fork/spawn 后端工作。

c7a197fb5f#458

fs-local 拒绝不安全的文本观测

改动

packages/fs/fs-local/src/fsio.ts 重写观测处理(约 105 行变动),更新 README、filesystem capability seam RFC 及 fsio/filesystem 测试。

目的

对文本观测做安全校验,拒绝不安全的输入。

b3d40d427e#459

持久化 seed 边界,让 fork 子会话重放路由正确

改动

SessionHeader 新增可选 seedLength(继承自父日志的前缀长度),贯穿 CreateSessionOptions/CreateAgentOptions meta 并由 fork 后端打戳;JSONL header 行与 SQLite 新增 seed_length 列(SCHEMA_VERSION 2→3,按预发布策略拒绝旧版无迁移);llm-replay 读取 seedLength 并在生成子脚本时跳过继承前缀。

目的

fork 子会话的 .jsonl 以父事件开头,快照重放会把父的 recorded 响应当成子的模型调用而静默错路由;显式记录边界并跳过前缀修复此正确性缺口。

78d60366ec#460

录制 fork 与 spawn+fork 混合快照场景

改动

新增 subagent-fork(父完成一轮后 fork 一个子)与 subagent-mixed(同一 transcript 中 spawn + fork 各一次)两组真实 fork 子场景的 input/session.jsonl/stdout.golden;两个场景均要求 turn-1 完成以使 seed 前缀非空;更新 RFC。

目的

seed-boundary 改动此前只在单元/持久化层验证,补齐端到端快照层的覆盖,且 subagent-mixed 首次在一个 transcript 内同时驱动两种 subagent 后端。

30805e1983#461

SQLite 为新的 surface 列把 SCHEMA_VERSION 提升到 3

改动

packages/session-persistence/session-persistence-sqlite 的 schema.ts 与对应测试改 SCHEMA_VERSION 至 3。

目的

为即将到来的 session-surface 新列预留版本号(预发布期不接受旧格式)。

09d497d5c5#462

文档:澄清 compaction 搭载现有事件类型的 replace 操作

改动

docs/rfc/implemented/architecture/2026-06-18-session-surface.md 单行措辞调整。

目的

澄清 compaction 是在既有事件类型上走 replace 操作,而非新事件类型。

6089e226bc#463

refactor:让 surface 成为唯一派生路径,移除遗留 fallback

改动

packages/core/session 的 index.ts、surface.ts、types.ts、README 与测试;更新 jsonl coordinator-contract、invariants 测试与 catalog 文档。

目的

移除遗留派生回退,确立 surface 为唯一派生路径,简化并收敛语义。

1ec8c40d0d#464

refactor:在 _replace 中用 nodeBySeq map 查找,移除无用参数

改动

packages/core/session/src/surface.ts 用 nodeBySeq map 替换原有查找并删除死参数;扩写 docs/core-data-structures/session.md;scripts/type-equiv.manifest.json 加条目。

目的

提升 replace 路径的查找效率与清晰度,去掉遗留冗余参数。

358ae02c56#465

invariants:强制 replace 溯源——sourceEventSeqs 须覆盖所有被遮蔽的 surface 节点

改动

packages/support/invariants/src/index.ts 新增校验:replace 的 sourceEventSeqs 必须覆盖它所遮蔽的每个 surface 节点;新增 90 行测试;更新 RFC 文档。

目的

把 replace 的来源约束设为可执行的不变量,防止遮蔽了未被来源覆盖的 surface 节点。

bdaf9f651d#466

合并 session-surface 分支到 compact-interface

改动

把 session-surface(surface 唯一派生、replace 溯源不变量、SCHEMA_VERSION 3 等)合入 compact-interface 分支。

目的

让 compaction 工作基于已收敛的 surface 派生路径。

f4180bd764#467

compact seam 方法新增可选取消信号

改动

packages/compact/compact/src/index.ts 的 seam 方法加上可选 cancellation signal;README、catalog 文档与 compact 测试同步更新(+33 行测试)。

目的

使 compaction 支持中途取消,对齐其它能力 seam 的取消语义。

bb013e934e#468

文档:把 surface 变更框在 compaction 锁内

改动

compaction capability-seam RFC 与 packages/compact/compact/README.md。

目的

明确 compaction 对 surface 的变更必须在 compaction 锁保护下进行,避免并发竞争。

01dea07922#469

合并 origin/master 到 codex/fix-stdio-readline-terminal

改动

大型 merge,带入 master 上大量重构(包目录按 group 重组、agent-core/session-persistence coordinator、acp-agent/stdio-agent bundle、snapshot 测试体系、cordis-catalog 生成器、各类 RFC 重分类等)。

目的

将 stdio/readline terminal 修复分支与上游 master 同步。

58d798492a#470

文档:在 core-data-structures 目录编目 compaction seam

改动

新增 docs/core-data-structures/compaction.md(46 行);core.md 加索引、session.md 微调;scripts/type-equiv.manifest.json 加条目。

目的

把 compaction 能力 seam 纳入 core-data-structures 目录编目,便于查阅。

894653763e#471

文档:在 package 与 architecture 文档中加入 compact group/service

改动

docs/architecture.md、packages/README.md、packages/compact/README.md。

目的

把 compact 包组与服务补进架构图与包清单,保持文档与代码同步。

442f85469e#472

refactor:统一 compact/summary 与 CompactionResult 用 shadowed* 命名

改动

packages/compact/compact/src/types.ts、测试、README、RFC 与 docs/core-data-structures/compaction.md 对齐为 shadowed* 命名。

目的

让 compaction 的 summary 与 CompactionResult 字段命名一致(shadowed*),消除不对称。

4a9449463b#473

合并 PR #90:subagent 能力 seam(PR1)——接口、mock 后端与模型工具

改动

合并 PR #90(worktree-subagent-seam-pr1)。新增 subagent(Service Definition)、tool-subagent(模型可见工具)、subagent-mock(测试后端)三个包及其文档/测试/catalog/RFC。

目的

落地 subagent 能力 seam 的第一层:接口、mock 实现与面向模型的委托工具。

921362364c#474

合并 origin/master 到 worktree-subagent-seam-pr2

改动

将上游 master 同步进 PR2 分支。

目的

让 PR2(in-process spawn + fork 后端)与上游 master 保持一致,便于后续合并。

e945219df4#475

合并 PR #92:subagent seam(PR2)——in-process spawn + fork 后端

改动

合并 PR #92(worktree-subagent-seam-pr2)。新增 subagent-inprocess、subagent-spawn、subagent-fork 三个后端实现及其文档/测试;更新 coding-agent/cordis.yml、agent-loop/agent 类型、llm-replay、knip 等。

目的

在 PR1 的接口之上落地三种 subagent 后端实现(进程内、spawn 子进程、fork 父日志前缀子会话)。

提交总结(g-19,共 25 个,从旧到新)25

7152184342#476

合并 origin/master 到 worktree-subagent-seam-pr2.5

改动

将 origin/master 同步进 subagent seam PR2.5 分支,无内容冲突。

目的

在 PR2.5 落地前把分支与主干对齐,便于后续 review/合入。

3e2b90fe7d#477

合并 PR #94 — Subagent seam (PR2.5):嵌套 agent 的 per-session 快照回放

改动

扩展 dsh-llm-replay 支持按 session 路由回放(packages/support/llm-replay),llm/types.ts 增加 session 维度,agent-loop 传入 sessionId;新增 subagent-spawn/subagent-multi 快照 fixture,更新 acp-agent snapshot harness。

目的

让嵌套(in-process)subagent 的快照回放能区分父子 session,保证测试可重放。

18a56f041d#478

合并 origin/master 到 worktree-subagent-seam-pr3

改动

将 origin/master 同步进 subagent seam PR3 分支。

目的

PR3 落地前与主干对齐。

91d9b5e415#479

合并 PR #95 — Subagent seam (PR3):ACP 后端(进程外委托)

改动

新增 packages/subagent/subagent-acp(含 README、run.ts、mock ACP server、e2e + spec),把 subagent 委托给外部 ACP 服务;更新 subagent README、knip/tsconfig、module-graph 等。

目的

为 subagent 能力 seam 补上 out-of-process 后端,使 agent 可把子任务委托给独立 ACP 进程。

cdfbf6f631#480

合并 origin/master 到 worktree-subagent-fork-replay

改动

将 origin/master 同步进 subagent fork replay 分支。

目的

fork replay 后续 PR 前与主干对齐。

ddb240f3b1#481

合并 PR #100 — Subagent seam 后续:持久化 fork 种子边界,使 fork 子回放正确路由

改动

session/types.ts 新增 seed 边界字段,session-persistence-jsonl/format.ts、session-persistence-sqlite/schema.ts(含 SCHEMA 调整)落盘;agent/agent-loop/subagent-inprocess/llm-replay 配合使用种子边界;新增 coordinator contract 测试与 RFC 笔记。

目的

fork 出的子 session 需要在持久化层记住种子边界,恢复/回放时才能正确从父 session 切片重建。

e6de8d1e9d#482

合并 origin/master 到 worktree-subagent-fork-scenario

改动

将 origin/master 同步进 subagent fork scenario 分支。

目的

fork 场景 PR 前与主干对齐。

4cfa22f997#483

合并 PR #101 — Subagent seam 后续:补 fork + mixed spawn/fork 快照场景

改动

在 acp-agent snapshot harness 新增 subagent-fork 与 subagent-mixed 两套 fixture(input/session.jsonl/stdout.golden),并补对应 RFC 测试笔记。

目的

覆盖 fork 单独场景与 spawn/fork 混用场景,固化可重放输出。

9cc8dc371e#484

合并 origin/master 到 session-surface(大合并,含语义调和)

改动

将 session-surface(surfaceOp/sourceEventSeqs 作为唯一派生路径)与 master 的 worktree-subagent 系列(fork 种子边界 + ACP 后端)合并;解决 SQLite SCHEMA_VERSION 冲突(两侧都 2→3,合并为单一 v3 同时携带 seed_length、source_event_seqs、surface_op),agent-loop runStep 同时带 sessionId 与每-append 的 surfaceOp;subagent 快照 fixture 用无 key 确定性回放重新补充 surfaceOp。

目的

两条并行主线(session surface 派生模型 + 子 agent 持久化)首次合流,保证两侧的字段与语义共存且测试全绿。

828c3f85c9#485

修复 review 发现:跳过冲突的 SCHEMA_VERSION 3;拒绝无 marker 的 surface 事件

改动

SQLite SCHEMA_VERSION 从 3 跳到 4(合并布局)以拒绝两个语义不同的 v3;session 在 append() 与 seed 构造处运行时守卫 surface 事件必须带 surfaceOp,导出 isSurfaceEligibleType;fixture 显式带 surfaceOp,补三类回归测试。

目的

上一合并留下的两个隐患——版本号冲突误接受、无 marker 的 surface 事件会从 deriveMessages() 静默丢失——必须以严格版本号 + 运行时守卫堵住。

329371a529#486

合并 PR #61 — fix(examples):示例 agent 启用终端行编辑

改动

ui-stdio 开启 readline 终端行编辑能力,更新 .gitignore;bash-local/tool-bash 的测试与新增 readline.spec.ts 跟进。

目的

让 demo agent 在终端里可正常行编辑(方向键、退格等),修复 codex 分支发现的 stdio readline terminal 问题。

cf70141486#487

合并 session-surface 到 compact-interface(含冲突解决)

改动

把 session-surface 的全部工作(含上一条 SCHEMA v4 与 marker 守卫)并入 compact-interface;手工解决 docs/core-data-structures/core.md、packages/README.md、scripts/type-equiv.manifest.json、tsconfig.base.json、tsconfig.typecheck.json 冲突。

目的

在 compact-interface 分支上承载 session-surface 的最新语义,让后续 compaction 改造基于 surface 派生模型。

b955c7d18d#488

合并 origin/master 到 session-surface

改动

将 origin/master(PR #61 的终端行编辑改动)同步进 session-surface 分支。

目的

session-surface 落地前与主干对齐。

4c1b7191f3#489

合并 session-surface 到 compact-interface

改动

再次把 session-surface(已含 #61 改动)并入 compact-interface,无冲突。

目的

把主干最新进度同步到 compact-interface,准备 compaction 基线落地。

d091946fc4#490

新增项目指令文件加载

改动

新增 packages/core/project-instructions(index.ts + 单元/e2e 测试,共 ~360 行实现 + ~440 行 spec),agent-core 接入加载逻辑,更新 stdio/acp-agent bin、knip、tsconfig、module-graph,新增 RFC 笔记。

目的

让 agent 启动时按层级加载项目指令文件(如 AGENTS.md/CLAUDE.md),把仓库约定注入 system prompt。

aa9afcefc7#491

feat(compact-basic):基线 compaction 后端(squashed from compact-basic)

改动

新增 packages/compact/compact-basic(index.ts 753 行 + 1361 行测试),定义 compaction Service Provider 基线实现;dsh-session 新增 step-boundary.ts(97 行)支持 step 对齐判定;更新 compact Service Definition、architecture/docs、coding-agent 接线。

目的

把 compact-basic 分支多轮 review churn 压成一条干净基线,使后续 retention 重构以新历史起始而非叠加在修复之上。

08fc8467bc#492

新增 ask_user_question 交互工具

改动

新增 packages/core/tool-ask-user 与 packages/core/user-interaction(Service Definition + 实现 + 测试),ui-stdio 扩展交互能力(+146 行实现、+231 行测试),stdio-agent 接线;更新 architecture/module-graph/catalog。

目的

提供 agent 主动向用户提问的交互工具与底层 user-interaction 能力 seam。

45be662e85#493

新增 skill 发现与加载

改动

新增 packages/core/skill(425 行实现 + 342 行测试,skill 注册/加载/catalog)与 packages/core/tool-skill(skill 调用工具),agent-core/agent-loop/stdio-agent 接线;更新 docs。

目的

让 agent 能发现并加载本地 skill(可复用提示/工作流),并提供模型可调用的 skill 工具。

6cd446da2f#494

合并 PR #49 — feat(session):新增 session surface(事件日志上的链表用于消息派生)

改动

新增 packages/core/session/src/surface.ts(159 行)与 surface 类型/测试;session/src/index.ts 改写消息派生为 surface 驱动;agent-loop 在每 append 带 surfaceOp;SQLite/jsonl persistence 与 invariants 测试跟进;重录大量 snapshot(multi-turn/tool-call/workspace-edit 等)。

目的

把消息派生从直接扫日志改为基于 surface 链表的唯一派生路径,解决 replace/compact 等结构变更下的消息一致性。

cec32faa4e#495

refactor(compact):与 turn 无关的 retention + 独立的 agent/pre-request seam

改动

compact-basic 重写(228 行净变化)——删除 in-flight-turn 保护,retention 改为统一的 tail→head 整单元扫描,唯一结构守卫是 step 对齐;auto-compaction 从 agent/request waterfall 迁到新的 agent/pre-request loop seam(在历史派生前触发);resolveConfig 强制单次收敛不变量;新增 coding-agent compaction e2e;RFC 重写并移到 implemented/。

目的

消除"单个超长 turn 撑爆窗口"的失败模式,并让 compaction 在 surface 派生前一次性生效,避免 listener 读到未派生消息。

32462f42bd#496

合并 PR #97 — feat(compact):compaction 能力 seam — 抽象 CompactService 接口

改动

新增 packages/compact/compact(Service Definition + types + 107 行 spec),定义抽象 CompactService;新增 core-data-structures/compaction.md、compact README、catalog 项、RFC 笔记。

目的

为 compaction 建立能力 seam(Service Definition),使 compact-basic 等具体后端可按统一接口插拔。

f962fda8c1#497

docs:新增中文术语对照表

改动

新增 docs/i18n/terminology.md(110 行)。

目的

为中英双语文档建立统一的术语翻译对照表,规范后续文档翻译。

d6da8ca29a#498

fix(compact):由 surface tool-pairing 决定 step 对齐,pre-step 触发 compaction(CBR-001)

改动

把 step-boundary.ts 重命名为 tool-pairing.ts,用基于 surface 的 isToolPairingBalanced 替代按日志 seq 的 isStepAlignedStart/End;compaction seam 从 in-step 迁到新的 agent/pre-step(在 turn/start 后、step/start 前),dispatch 由并行改串行(@mode serial),catalog 生成器支持 @mode serial;新增 compact-loop-repro.spec.ts 与多组回归测试。

目的

修复头锚定 compaction checkpoint 被按日志位置的 step 扫描误判为 mid-step、导致二次自动 compaction 静默失败的问题;并让 compact 记录落在任何 step 之外以满足崩溃安全。

6cac3e6476#499

fix(compact):拒绝阈值相等配置以保持 compaction 收敛(CBR-002)

改动

compact-basic/src/types.ts 的 resolveConfig 把收敛边界从严格大于改为 >= 即拒绝(原先允许 summarizationMaxTokens + retainTokens == threshold),更新边界测试并新增"刚好低于阈值被接受"用例。

目的

消除 compactIfNeeded 仅在 < threshold 时才 decline 与配置允许相等边界共同导致的"压实后历史正好卡在阈值、下一步立刻再触发"死循环。

b13586ff8e#500

docs(compact):对齐 pre-step seam 文档并记录 session/invariants 变更(CBR-003)

改动

更新 agent/agent-loop/system-prompt/compact/compact-basic 的 README 与 JSDoc、architecture.md、core-data-structures/compaction.md、已实现的 compaction RFC:统一表述为 serial agent/pre-step seam、tool-pairing balance 对齐判定、严格收敛边界;纠正原 RFC 关于"不改 dsh-session/dsh-invariants"的错误声明(dsh-session 新增 tool-pairing 谓词,dsh-invariants 移除 start <= end 的 replace 断言)。

目的

使文档与上一对 CBR 修复(pre-step seam、严格边界、tool-pairing)实际代码一致,消除 review 发现的文档漂移。

提交总结(g-20,共 25 个,从旧到新)25

6de5e3a2#501

docs(compact): 修正 coding-agent cordis.yml 中过时的 agent/pre-request 注释

改动

examples/coding-agent/cordis.yml 一处注释,把旧的 agent/pre-request seam 名改成已发布的 agent/pre-step。

目的

CBR-004 评审意见,对齐示例配置与实际发布的 seam 命名。

f4ace256#502

fix(compact): 修正 _extractText 的 surface-order JSDoc,并为 HMR-safety 测试套件补充 disposal 用例

改动

packages/compact/compact-basic/src/index.ts(修正 JSDoc,明确按 surface 顺序而非 log 顺序遍历)及对应 compact-basic.spec.ts(在 HMR-safety 套件里增加 mount/dispose/断言 ctx.get('compact') 为 undefined 的测试)。

目的

CBR-005/006,纠正文档与 replace 后高 seq checkpoint 在 surface 头部这一事实的不一致,并补齐按名字才找得到的 disposal 测试。

05c1bb62#503

新增 GitHub Actions 工作流:镜像到 GitLab

改动

新增 .github/workflows/mirror-to-gitlab.yml(33 行)。

目的

把仓库自动镜像到 GitLab。

c76b7042#504

fix(compact): 把 compaction e2e 调到真正能触发阈值,并同步过时文档

改动

examples/coding-agent/tests/compaction.e2e.ts(缩小 contextWindow 到 2400、retainTokens 500、summarizationMaxTokens 300,fixture 扩到 6 个文件);并同步 README、session types、core-data-structures 等处的文档(加入真实的 compact/start、compact/summary、compact/end 事件名,替换假设性的 compaction/marker 命名)。

目的

CBR-007,原 e2e 峰值仅约 1389 tokens,始终低于 4000 阈值,从未真正触发 compaction;修正后能稳定命中并收敛。

c13f2558#505

Merge remote-tracking branch 'origin/master' into compact-basic-refactor

改动

合并入 origin/master(带入上一个 mirror-to-gitlab workflow)。

目的

把 compact-basic-refactor 分支与 master 同步。

ef37ce3b#506

refactor(fs): 将 filesystem seam 拆分为 provider ctx.fs + 策略 ctx.fileContext

改动

新增 RFC 与 dsh-file-context 包(types/window/policy),dsh-fs 收窄为带 branded FsTargetKey/FsVersion、FsWriteExpectation 的文本存储 provider seam;fs-local、tool-fs 全部适配;更新 architecture、cordis-catalog、type-equiv manifest、tsconfig.build。

目的

实现 split-the-filesystem-seam RFC。授权改为基于 freshness:窗口化读取记录版本,文件未变时允许后续 edit,消除“读了大文件 100-150 行却无法编辑 120 行”的死路;editText 保持为 provider 原语以做 version guard + 字面量匹配 + 原子重写。

1409e2ed#507

fix: 处理 codex review round 1(fs)

改动

fs-local/src/fsio.ts 的 readWholeText/readForEdit 把读取中途的 AbortError 转成结构化 FsError('FS_ABORTED');socket 类型探测测试在监听错误时 reject 而非挂起。

目的

补齐读路径与流/写路径一致的 abort 错误处理,修复 unix-domain socket 不可用时测试 hang。

b8029120#508

fix: 处理 codex review round 2(fs)

改动

fs-local/src/fsio.ts 的 targetKey 解析改为 realpath 最近的已存在祖先再拼回缺失后缀;socket 探测测试在沙箱禁用时改为 skip。

目的

让 symlinked 祖先下尚未创建的文件在创建前后拿到同一 key,保持 observed-state 在 write→edit 周期内一致。

d612ebae#509

fix: 处理 codex review round 3(fs)

改动

file-context/src/index.ts 读取后再次 stat 记录 freshness token(文件消失则回退到 routing stat);后端无 size 时改为流式读取;同步 cordis-catalog 链接到当前 filesystem API 符号。

目的

使返回的 version 与返回的 bytes 一致,防止 routing-stat 与 read 之间的写竞争让后续 edit 误判 stale;size-less 后端不再整缓冲大文件。

a4091daa#510

docs: 提议 web capability seam

改动

新增 RFC docs/rfc/proposed/architecture/2026-06-24-web-capability-seam.md(385 行)及 README 索引。

目的

提出把 web 访问做成一等 capability seam 的设计。

d01f5f73#511

新增 web capability seam:ctx.web、search/fetch provider、web 工具

改动

新增 dsh-web(ctx.web provider 注册表 + WebError 分类 + 注册序无关选择)、dsh-web-search-exa、dsh-web-search-perplexity、dsh-web-fetch-local、dsh-tool-web(仅拥有 model-facing web_search/web_fetch schema、prompt 段、HTML→markdown 呈现);更新 architecture、knip、tsconfig.build、pnpm-lock;把 RFC 移到 implemented/。

目的

把 web 访问做成 capability seam,工具 schema 稳定而后端可换;search/fetch 合为一个 seam,provider 按 namespace 插件注册(类比 LlmAdapter),工具注册跟随产品启用而非后端可用性。示例/应用配置此时尚未接线。

56751918#512

fix: 处理 codex review round 1(web)

改动

web-fetch-local 的 policy/provider——重定向目标在跟随前经 validateFetchUrl 复检;只有真正被丢弃的字节才算 truncation;按 Content-Type 声明的 charset 解码(不支持则 WEB_UNSUPPORTED_CONTENT_TYPE);新增 docs/core-data-structures/web.md 与 type-equiv manifest 条目。

目的

堵住重定向 URL 绕过传输卫生的口子,修正恰好等于 maxResponseBytes 时的假截断,正确处理非 UTF-8 编码。

0930e483#513

fix: 处理 codex review round 2(web)

改动

Exa 与 Perplexity provider——在解析搜索响应体时保留 abort 错误,信号触发后 surface WEB_ABORTED 而非包装成 WEB_PROVIDER_ERROR;status() 用 URL.canParse 把畸形 baseURL 报为 misconfigured。

目的

避免把 agent cancel/dispose 误报为 provider 故障,并让 selection 诊断与执行一致地提前发现配置错误。

a1624530#514

fix: 处理 codex review round 3(web)

改动

web-fetch-local/src/provider.ts——body 读期间触发的 timeout 归类为 WEB_FETCH_TIMEOUT(通过 signal.reason 恢复);每条被阻断的重定向 throw 路径(跨源、非法目标、缺 Location)先 cancel body;charset 校验失败也 cancel body。

目的

兑现 WEB_FETCH_TIMEOUT 对停滞响应体的契约,避免被拒重定向的大/流式 body 泄漏 socket。

1cd3a454#515

fix: 移除 translateAbortOrNetwork 上过时的重复 JSDoc

改动

web-fetch-local/src/provider.ts 删除连续两块 JSDoc 中过时的那块,保留含 timeout-recovery 契约的准确版本。

目的

清理重复且不准确的文档。

caef2529#516

chore: 让 web seam 适配 master 的 tsconfig 并重新生成 catalog

改动

在根 tsconfig.json 注册五个 web 包(master 已改为 tsc -b tsconfig.json,弃用独立 tsconfig.typecheck.json),重新生成 module-graph 与 cordis-catalog。

目的

把 web 包纳入 master 的项目图,让 catalog 反映这些包。

f843ea770#517

fix: 让 web 包对齐 master 的两阶段构建布局

改动

所有 web 包的 tsconfig.json 把 outDir 指向 lib/types,package.json 的 types/exports/files 改为 lib/types 声明 + lib/ bundle 形态(对齐 dsh-bash/dsh-tool-bash);tool-web 的 subpath 从 lib/types/*.js 打包。

目的

web 包原本按旧的 tsc 直出 lib/ 的单阶段布局编写,需迁到 master 的 tsc 声明到 lib/types + tsdown 打 JS 到 lib/ 的两阶段布局。

8d1f86fc#518

empty

改动

无 diff 的空提交。

目的

占位/标记用提交,无实际内容。

3e2f9578#519

Merge branch 'master' into compact-basic-refactor

改动

把 master 合入 compact-basic-refactor 分支(无冲突文件列出)。

目的

同步 compact-basic-refactor 与 master。

0619ce62#520

ci: 为 type-aware ESLint lint 步骤提高 Node 堆上限

改动

.github/workflows/ci.yml 给 Lint 步骤加 NODE_OPTIONS 8GB old-space 上限。

目的

type-aware ESLint 通过 project service 加载所有包 tsconfig,峰值约 3.4GB RSS,默认 ~2GB V8 上限会 OOM(exit 134);提高上限到 8GB。

489a26e8#521

test(session): 覆盖 isSurfaceEvent / isSurfaceEligibleType 守卫

改动

packages/core/session/tests/surface.spec.ts 新增 39 行,直接测试 type-only 合格性检查、positive narrowing、非合格类型,以及 markerless-but-eligible 分支(surface.ts 第 46 行)。

目的

满足 per-file 100% 覆盖率门对该分支的要求。

185c09d6#522

Merge pull request #115 from deepseek-harness/worktree-ci-lint-heap

改动

合并 PR #115,带入上一条 CI heap 提升 + surface.ts 覆盖率补齐。

目的

修复 lint OOM 与覆盖率缺口,重新启用 CI。

b995b4f7#523

Merge branch 'master' into compact-basic-refactor

改动

把 master 合入 compact-basic-refactor,packages/core/session/tests/surface.spec.ts 有冲突并解决。

目的

再次同步分支与 master(含 PR #115 的改动)。

90dceea0#524

refactor(fs): 把 dsh-file-context 改为 event-gate 插件而非 method service

改动

按 file-context event-gate RFC 反转控制流——dsh-tool-fs 成为执行者,直接经 ctx.fs 读写、自己拥有 read windowing,并派发 fs/write-expectation、fs/edit-expectation(单槽 waterfall)加一次 fs/observed 发射;dsh-file-context 去掉 ctx.fileContext 服务,变成纯 event-gate 插件;provider 的 version guard 变为可选(window.ts 从 file-context 迁到 tool-fs);新增 RFC、更新 architecture、catalog、type-equiv、README。

目的

移除 tool↔policy 的 service-injection 耦合;仅加载 ctx.fs 即为完整的无约束文本存储 seam,移除策略插件只会优雅丢失策略而非在注入边界上崩溃。

f9f475cb#525

fix: 处理 codex review round 1(file-context event-gate)

改动

修正 architecture、core-data-structures/filesystem、RFC、packages/fs/README、tool-fs/README 中的措辞。

目的

纠正文档不实陈述——当前没有任何默认/示例配置接线 fs 工具(demo agent 通过 bash 做文件操作),文档不再声称“默认产品配置加载 dsh-file-context”,改为陈述“加载 fs 工具的部署应同时加载 dsh-file-context 以获得 read-before-write/edit”这一预期姿态。

提交总结(g-21,共 25 个,从旧到新)25

1059166cb1#526

修复 codex 第二轮评审意见(edit 工具提示与 RFC 勘误)

改动

packages/fs/tool-fs/src/edit.ts 在 model-facing prompt 中补入"编辑前需先读"的要求(含本会话已建/已编辑例外),与 write 工具一致;修订两份 RFC(fsspec-style-fs-seam、filesystem-tool-schemas),纠正过时的 ctx.fileContext 与"需完整文件状态"措辞,改为版本新鲜度表述。

目的

避免模型仅通过 FS_NOT_OBSERVED 失败才学到读前置条件;同步 RFC 与已落地设计。

70a8b57738#527

精简 tool-web 为单入口,对齐 tool-bash 形态

改动

删除 packages/web/tool-web 的 ./search、./fetch 子路径导出及其 lib/*.js、tsdown 单独 override、search.ts/fetch.ts 中 plugin 形态导出,统一由根插件组合(重命名为 applyWeb{Search,Fetch}Tool)。更新 README/package.json。

目的

无人消费的多入口是多余定制,还触发 workspace constraints 门禁;与同级 dsh-tool-bash 保持单入口一致,按 config 选择启用。

89b27ad442#528

合并 origin/master 到 fs-tool-clean

改动

将 master 合入 fs-tool-clean 分支,含大量文件冲突解决(docs、tsconfig、catalog、subagent/compact 等新增包)。

目的

把 fs 工具清理分支同步到最新 master,承接单 tsconfig 构建规范及 subagent/compact 等新引入的包。

4a1177093a#529

重构 tool-fs:去掉每工具子路径插件,改用单 tsconfig 构建

改动

packages/fs/tool-fs 适配 master 的单 tsconfig 构建约定(lib/types outDir + types path + files allowlist);删除 /read、/write、/edit 子路径插件、bespoke tsdown、subpaths.spec.ts,改为根插件注册三工具,镜像 dsh-tool-bash。修订两份 file-context RFC 记录收窄后的范围。

目的

消除唯一子路径导出包带来的特殊配置负担;统一构建形态,聚焦部署用例已无消费者需要。

22a89847ac#530

session 新增 TodoItem 类型与 todo/write 事件词汇

改动

packages/core/session/src/types.ts 增加 TodoItem 类型与 todo/write SessionEventMap 变体(整表快照、last-write-wins);明确非 SurfaceEventType,不产生 LLM 消息。新增快照克隆、replay round-trip 等测试;docs/session.md、core.md(变体数到十二)、type-equiv manifest 同步。

目的

为持久化、可重放的 UI 状态(待办列表)建立 session 事件基础,先于工具实现。

4f09157612#531

收窄 todo/write 的 JSDoc 到事件自身契约

改动

packages/core/session/src/types.ts 与 docs/core-data-structures/session.md 删除描述 Phase 2 消费者(todo_write 工具、stdio 打印、ACP plan 映射)的当前态表述,去掉错误的 @mode 标签(该事件走 session/event,非一等 Cordis Events)。

目的

Codex Phase 1 评审修正——JSDoc 只描述事件自身契约,不预示未实现消费。

b62cf1a31c#532

合并 master 到 web-capability-seam

改动

master 合入 web-capability-seam 分支;CI 增加 5 行,packages/core/session/tests/surface.spec.ts 增 40 行。

目的

将 web 能力线分支与 master 同步,承接 surface 测试与 CI 更新。

46e31d8481#533

新增 model-facing todo_write 工具

改动

新增 packages/todo/ 组与 @deepseek-ai/dsh-tool-todo:todo_write(todos:[{content,status}]) 整表替换语义,每次调用把完整列表作为 todo/write 事件追加到当前 agent 会话日志;单 owner(非 agent 调用被拒);execute 在 schema 之外拒绝空/重复 content 和多个 in_progress。stdio UI 打印 glyphed 清单;ACP 桥映射为 plan sessionUpdate(todosToPlan 合成 priority)。接入 coding-agent、acp-agent、snapshot 配置与 system-prompt 提示。配套单元/集成测试、RFC、doc-inventory 扫描、TS 接线。

目的

为模型提供结构化任务跟踪工具,复用既有 session/event 持久化与双端 UI 渲染路径。

f8e99b8740#534

重构 tool-fs:合并 read 渲染,去掉 fs/observed try-catch

改动

packages/fs/tool-fs 将 window.ts+types.ts+formatReadOutput 合并为单一 read-render.ts(line windowing、FileReadOutcome、输出格式同属读渲染关注点);删除 observe.ts,改用 ctx.emit 直接发 fs/observed(该事件契约上是同步、无副作用记录器,per-call try/catch 是为不可能场景做的防御)。read.ts 仅剩 schema + I/O。更新 fs 事件契约 JSDoc/README/RFC 为 fire-and-forget。

目的

内聚清理——拆三文件无价值;删除针对已发布监听器不可能违约的防御代码。

51700d4685#535

修复 ask_user_question 评审意见

改动

把 tool-ask-user 从 packages/core/ 移到 packages/ui/;新增 docs/core-data-structures/user-interaction.md、docs/rfc/feature/2026-06-25-ask-user-question.md;扩展 packages/ui/acp/src/index.ts(+156 行)及 bridge.spec;acp-agent、stdio-agent 的 tsconfig/package 接线;catalog、module-graph、type-equiv 同步。

目的

根据评审重组 ask-user 工具归属(移入 ui 组)并补齐 user-interaction 数据结构与文档。

e17c4b748d#536

重构 tool-todo:存储 trimmed content 以匹配去重键

改动

packages/todo/tool-todo/src/index.ts 单行修改——toTodoList 之前按 trimmed 内容去重却存储原始 item.content,现改为存储 trimmed 后的 content。

目的

保证持久化值与唯一性键一致,避免首尾空白导致去重与存储不一致。

215b70fdff#537

合并 origin/master 到 codex/ask-user-question

改动

master 合入 codex/ask-user-question 分支(解决 packages/README.md 冲突);带入 session surface、compact 包、subagent 快照格式更新等大量内容。

目的

将 ask-user-question 分支同步到最新 master。

86519889c5#538

合并 origin/master 到 codex/project-instruction-files

改动

master 合入 codex/project-instruction-files 分支;带入 compact 包、session surface、invariants/sqlite 测试扩展等。

目的

将 project-instruction-files 分支同步到最新 master。

93a6dc6716#539

新增 todo-plan ACP 快照场景与 with-key e2e

改动

录制 examples/acp-agent/tests/snapshots/todo-plan/ 快照(真实 prompt 驱动模型调用 todo_write,golden 校验三条 priority=medium、status 1:1 的 plan sessionUpdate 及持久化 todo/write 事件),注册到 SCENARIOS 可无 key 重放;新增 examples/coding-agent/tests/todo-write.e2e.ts(真实模型调用落事件、校验单 in_progress 列表),并把 tool-todo 接入 e2e harness。

目的

为 todo_write 提供端到端 transcript 快照与真实 API 验证,覆盖模型可观察行为。

2b99d8f5c2#540

补 project instruction 配置分支测试

改动

packages/core/project-instructions 增 spec(+50 行覆盖配置分支),并在 agent-core、acp-agent、stdio-agent 的 spec 中各加用例;源码加 1 行(覆盖一分支)。

目的

补齐 project-instructions 各配置分支的测试覆盖。

5f744e4fa6#541

测试 tool-todo:守护存储内容已 trim

改动

packages/todo/tool-todo/tests/tool-todo.spec.ts 加 10 行测试,断言输入 " plan the work " 被存为 "plan the work";已验证对修复前代码会红。

目的

为上一提交 e17c4b748d 的 trim 修复补回归测试(既有断言都用已 trimmed 的 todo,无法捕获回退)。

234ffe4604#542

重构:将 project instructions 移到 prompt 组

改动

把 packages/core/project-instructions 整体迁移到 packages/prompt/project-instructions(包内容不变,调整 README、tsconfig.base/build、knip、AGENTS、architecture、RFC 中的路径引用);spec 中 12 行测试相应调整。

目的

按"prompt 组"归类重组,让 project-instructions 与其它 prompt 相关包同组。

b92a3c531a#543

新增 DeepSeek 支持的 web search provider

改动

新增 @deepseek-ai/dsh-web-search-deepseek(packages/web/web-search-deepseek/):调用 DeepSeek 的 Anthropic-兼容 Messages API + 原生 web_search_20250305 server tool,解析结构化 web_search_tool_result 块为 ctx.web 的 WebSearchResult。命名空间插件(inject:['web'])无默认导出;严格模式——无 search 结果块则抛 WEB_PROVIDER_ERROR;复用 $DEEPSEEK_API_KEY,baseURL 默认 anthropic 兼容 base(不复用 $DEEPSEEK_BASE_URL);snippet 来自 text-block citations,url 去重。两阶段 outDir 构建;接入 tsconfig/knip/module-graph;含 spec 与 with-key e2e。

目的

为 ctx.web 能力线补上 DeepSeek 原生 web 搜索 provider。

5269d2ac3d#544

修复 tool-todo:删除破坏覆盖率门禁的不可达 status 再检查

改动

packages/todo/tool-todo/src/index.ts 重排 14 行——registry 的 validateArgs 已在 execute 前拒绝非法 status,函数体内 status !== 'pending' && … → throw 为不可达死代码(第 70 行未覆盖,使 per-file 100% 门禁失败)。改为用 status as TodoItem['status'] 收窄 registry 保证的值,镜像 tool-bash(只查 DSL 无法表达的部分)。malformed-status 测试仍通过(走 registry 拒绝路径)。

目的

消除不可达代码以恢复 100% 覆盖率门禁。

f05717e1ac#545

文档:处理术语评审意见

改动

docs/i18n/terminology.md 重写——歧义术语保留英文(Cordis、fork、harness、schema、spawn、manifest、transcript、compaction、dispose);CLI/Function Calling/HMR/fiber 首次出现加注;inference/reasoning 括注英文;memory 区分 记忆(agent 记忆)vs 内存(资源);plugin→插件,新增 mod→模组 行;补充中英搭配说明(wire format、adapter contract)。

目的

根据评审统一 i18n 术语表,澄清而非纯翻译歧义词。

55088d1cfc#546

文档:要求标记 PR ready 前本地跑 CI 门禁

改动

AGENTS.md 新增"Run the CI gates locally BEFORE marking a PR ready"小节——给出 CI 等价的本地命令行,明确 pnpm run test:coverage(per-file 100%,CI 强制)而非 pnpm run test 才是门禁测试命令,并配 hygiene/snapshot/doc-sync。

目的

纠正"test 通过即等于 CI 通过"的误解——未覆盖行(通常是死代码)会让 CI 失败。

1f35a4446d#547

修复 compact:处理 PR 110 评审意见

改动

packages/compact/compact-basic、agent-loop/src/loop.ts:在 loop 开 step 或调模型前,尊重异步 pre-step setup 的取消与 dispose;将 compaction summarization 改走 agent/request(让 router agent 可选模型),删除 agent/pre-step 中过时的 model 参数。文档化串行事件与近似收敛界,重生成 Cordis catalog;新增 router compaction、HMR cleanup、assembly/pre-step 中断的回归测试。

目的

补齐 compact 能力在取消/中断路径的正确性,并让 router 路由覆盖 compaction 模型选择。

1808570933#548

修复 compact:加固 summarization 收敛

改动

packages/compact/compact-basic:用 maxTokens 作为 provider 生成上限,移除令人困惑的 stored-summary max 配置;存储 summary 前剥离 reasoning block;拒绝非收缩 summary;surface 仍超阈值时有界重试 re-compaction。新增数值/类型 config 校验,及 reasoning-capable summarization 的单元与真实 API e2e。

目的

保证 compaction summary 真正收缩、可收敛,避免 reasoning 污染存储内容。

277bbf85fb#549

合并 origin/compact-basic-refactor 到 compact-basic-refactor

改动

将 origin/compact-basic-refactor 合入本地 compact-basic-refactor 分支;CI +5 行,packages/core/session/tests/surface.spec.ts +40 行。

目的

同步 compact 重构分支的远端更新。

8395722db5#550

修复 web seam 上的 codex 评审意见

改动

search providers(exa/perplexity/deepseek)在 parse try 内部映射解析响应,使"格式正确但形状错"的 body 报为 WEB_PROVIDER_ERROR 而非裸 TypeError(刻意抛的 WebError 原样再抛);web-fetch-local 在插件构造时校验数值限制(正有限 cap、非负整数 maxRedirects);在解析每跳前执行 redirect 预算,使 maxRedirects:N 恰好跟 N 跳、超额报"exceeded the maximum";删除已废弃的 dsh-tool-web/search、/fetch 路径别名;清掉 git diff --check 标出的尾部 EOF 空行。每项修复带回归测试。

目的

按评审修复 web 能力线的错误归类、配置校验与 redirect 边界一致性。

提交总结(g-22,共 25 个,从旧到新)25

bb8f7799ce#551

删除 exa/perplexity 搜索中不可达的 WebError 重抛

改动

packages/web/web-search-exa/src/provider.ts、web-search-perplexity/src/provider.ts 各删一行。

目的

这两个 provider 的 mapper 从不抛 WebError,if (error instanceof WebError) throw error 是死代码,触发 per-file 100% 覆盖率门禁;deepseek provider 因 mapper 确实会抛而保留。

4bda95b589#552

移除 GitLab 镜像工作流

改动

删除 .github/workflows/mirror-to-gitlab.yml(33 行)。

目的

不再维护向 GitLab 的镜像。

170643ec9b#553

恢复 compact-basic 的覆盖率门禁

改动

packages/compact/compact-basic 的 README、src/index.ts、测试,重构并补充用例。

目的

补齐此前丢失的覆盖率,满足 CI 门禁。

9f1caf7c5b#554

根据 review 反馈调整 todo_write 工具

改动

tool-todo/src/index.ts 及多个 example(acp-agent/coding-agent)的 cordis.yml、e2e、harness,更新 RFC 与 architecture.md。

目的

落实 todo_write 工具评审意见(行为与示例同步)。

21ae734839#555

收紧 project-instruction 路径处理

改动

新增 packages/util/paths(路径工具及测试),project-instructions/src/index.ts 改用之;更新 AGENTS.md、knip.json、tsconfig、module-graph 等。

目的

抽出统一的路径解析逻辑,加强 project instruction 文件路径处理的健壮性与测试覆盖。

08522c2c3f#556

Merge PR #116:引入 todo_write 工具

改动

合并 worktree-todo-write-tool 分支。新增 packages/todo/tool-todo(工具实现 + 三套测试),扩展 session 类型、ui-stdio/acp、coding-agent/acp-agent 示例与 snapshot,补充 RFC、architecture 与 core-data-structures 文档。

目的

把模型的任务列表作为会话状态(todo_write 工具)合入主干。

f5bb544ded#557

Merge origin/master 进入 codex/project-instruction-files

改动

将主干(含 todo_write 等)合并进 codex/project-instruction-files 特性分支。

目的

特性分支同步最新主干,为后续合并做准备。

dcf8e10e5a#558

从 cordis-catalog 文档中去掉易冲突的数量句子

改动

scripts/gen-cordis-catalog.ts 与生成的 events-and-services.md,删除 Events/Services 段落里嵌入的「N events across M scopes」「N services」计数语句。

目的

这些计数由生成器重算,任一新增 event/service 的分支都要改这一行,必然冲突且无信息增益;移除后 freshness gate 仍绿。

3f85f522ea#559

Merge PR #117:catalog 去除计数语句

改动

合并 drop-catalog-count-prose 分支(同上的 catalog 修改)。

目的

把上一提交的文档清理合入主干。

0c4059fc84#560

Merge origin/master 进入 compact-basic-refactor

改动

将主干合并进 compact-basic-refactor;解决了 events-and-services.md、examples/AGENTS.md、coding-agent/cordis.yml、harness.ts、gen-cordis-catalog.ts 的冲突。

目的

compact-basic 重构分支同步主干(todo_write + catalog 调整)。

6ae1e229fd#561

文档:澄清 Cordis 串行 bail 语义

改动

agent/src/types.ts、AGENTS.md、catalog、compaction RFC、gen-cordis-catalog.ts 文档措辞。

目的

明确 waterfall 监听器串行执行时的 bail(短路)语义。

7637721696#562

Merge master 进入 codex/project-instruction-files

改动

合并 catalog 计数语句去除相关的 4 行变更。

目的

特性分支再次同步主干(catalog 清理)。

05b75abbca#563

重构 events:确立事件三域语义,删除 step 边界镜像 emit

改动

core/agent/src/types.ts、agent-loop/src/loop.ts 及测试、architecture.md、catalog;新增 2026-06-30-event-domain-semantics.md RFC。

目的

确立「session=持久事实日志、agent=运行时表面、tools=注册/执行」三域规则;删除无生产消费者的 agent/step-start、agent/step-end 镜像事件(消费者读持久 step/start、step/end),保留 agent/turn-start/end;为 Hooks 子系统奠定规范事件表面。

b0eae94fc8#564

修复 pre-step 取消与 compaction 收敛

改动

agent-loop/src/loop.ts、agent/src/types.ts、compact-basic 源码与测试、review-fixes.spec.ts。

目的

修复步骤开始前的取消路径,以及 compaction 不收敛的问题,并加测试。

ed5d8550ae#565

测试 agent-loop 的 step-start 释放

改动

packages/core/agent-loop/tests/cancel.spec.ts 增加 38 行。

目的

覆盖 step-start 监听器释放/销毁路径。

1a5302dbcf#566

compaction 标注 summarization 的 session id

改动

compact-basic/src/index.ts 及测试。

目的

为摘要生成的会话打上正确的 session id。

8df89d8e33#567

应对 Codex 评审:step/start 抛错时平衡 step,恢复 /goal 守卫

改动

agent-loop/src/loop.ts、review-fixes.spec.ts、agent/README.md。

目的

当 step/start 会话事件监听器抛错时,日志会出现不平衡(缺 step/end)。根因修复:在 Session.append 之前先把 step 标记为 open,使外层 catch 的 closeStep() 能补上配对的 step/end;并把上一提交删掉的 /goal 模式守卫迁回 step/end 会话事件监听器。

a821dcbe0d#568

应对 Codex 复核:强化 /goal 守卫,修文档漂移

改动

architecture.md、catalog、event-domain RFC、review-fixes.spec.ts、agent/src/types.ts。

目的

二轮评审发现的四项问题:原 /goal 守卫只能证明 steered 内容到达 requests[1],无法区分同回合 override;改为断言同回合「1 turn / 2 steps / steering 在 step 2 前记录」。同时修 RFC(step 先于 append 标记 open)、architecture 伪代码(step/end 监听器也驱动 continuation)、删掉不存在的 rejected TurnEndReason 文档。

da94bfd37c#569

新增 session fork 服务

改动

新增 packages/session-fork/session-fork(实现 128 行 + 209 行测试 + README + tsconfig + package.json),更新 architecture、core-data-structures、module-graph、catalog,新增 RFC。

目的

提供会话分叉(fork)能力作为新能力。

b8d0da9f8c#570

文档:澄清 /goal steering 注释指向 step/end session 事件

改动

packages/core/agent-loop/src/loop.ts 注释(4 行)。

目的

把「step-end/continuation listeners」改为「step/end session-event/continuation listeners」,避免暗示已删除的 agent/step-end 镜像。仅注释,无行为变化。

088860b80b#571

对 session fork 错误进行分类

改动

session-fork/src/index.ts、README、测试、catalog、RFC。

目的

把 fork 过程中的错误按类型分类上报。

680a41f43c#572

稳定 session fork 重复 id 错误

改动

session-fork/src/index.ts、README、测试。

目的

让重复 fork id 的错误表现稳定可测。

13c6e847a2#573

bash 执行器 seam 增加 stdin + 额外 env(受信插件表面)

改动

packages/bash/bash/src/types.ts、bash-local/src/run.ts 及 index.ts、tool-bash 测试、新增 RFC 与 docs/core-data-structures/bash.md。

目的

Hooks 子系统按 Claude Code/Codex 方式运行外部 hook 命令(stdin JSON + CLAUDE_PROJECT_DIR/CLAUDE_PLUGIN_ROOT env),需要复用 ctx.bash。新增 stdin/env 作为受信插件表面:env 在凭据清洗之后合并(受信调用方优先),面向模型的 tool-bash 永不转发 model 输入到 stdin/env,并有对抗式回归守护。

b44066d544#574

应对 Codex 评审:RFC 陈述当前事实,修文档引用

改动

bash stdin/env RFC(去掉 PR-A…PR-F 等堆栈位置命名,改为描述 hooks 子系统/hook bridge 作为现存动机)、bash-local/src/run.ts 的 childEnv 注释指向 README「Trusted-plugin boundary」。

目的

让 implemented RFC 描述当前真相而非命名变更单元;修正注释中的文档引用。

dc95a7881d#575

拦截 seam:为 hooks 引入类型化 Decision 表面

改动

大幅扩展 core/agent/src/types.ts、core/tools/src/index.ts、agent-loop/src/loop.ts 及 README;新增 agent/session-start、agent/prompt-submit(PromptDecision)、重塑 agent/turn-continuation 为 ContinuationDecision、tools/pre-execute(PreToolDecision allow/deny/ask)与 tools/post-execute(PostToolDecision accept/block);session 新增 rejected TurnEndReason;ACP codec 映射 rejected→cancelled;新增 interception.spec.ts 端到端示例与 RFC(reshape + 提议的 input rewrite)。

目的

重塑 agent 拦截表面,每个 seam 返回小型类型化 Decision 联合,覆盖 CC/Codex 桥(及原生插件)所需的 hook 点。「原生 hook」即挂在这些规范事件上的 cordis 插件,不是独立包;桥(后续 PR)只是把外部协议翻译到同一表面。

提交总结(g-23,共 25 个,从旧到新)25

483e0e5edf#576

修复 events:保护 post-execute 结果并清理过时 tools/execute 文档

改动

packages/core/tools(snapshot 关键字段、按快照重建返回值)、agent-loop/src/loop.ts(流程图补充 prompt-submit/session-start)、tools 回归测试;批量更新 docs/JSDoc/README 中残留的 tools/execute waterfall 描述为 tools/pre-execute + tools/post-execute。

目的

解决 Codex PR-C review 的两个 blocker——postExecute 把可变 result 透传给监听器导致决策通道可被污染;以及文档仍在宣传已删除的 tools/execute。

60418a5779#577

文档:清理剩余的单 waterfall 表述(Codex round-2)

改动

仅注释/文档——tools/src/index.ts 的 ToolExecution JSDoc、tools/src/schema.ts 的 ToolArgsError JSDoc、根 AGENTS.md 中 tools/ 目录描述,把「execution waterfall」改为「pre-execute → dispatch → post-execute pipeline」。

目的

第一轮遗漏的非字面 tools/execute 表述的兜底清理。

7cc7b9cf7f#578

subagent:丰富 subagent/start 与 subagent/end 生命周期事件(observe-only)

改动

packages/subagent/subagent(types/index/tests)新增 agentType(透传 CC 的 subagent_type)和 lastAssistantMessage(子 agent 最终输出,仅 settle 路径);tool-subagent 增 Config.agentType;新增 RFC 与文档。

目的

让 hooks 桥接知道跑了哪种 subagent 及其产出,保持纯 observe(事件不 await 监听器),为后续 background/steering 重设计留 FIXME。

93106b87b4#579

subagent:对 lastAssistantMessage 深拷贝(observe-only 修复)

改动

subagent/src/index.ts 在 detached .then 发 subagent/end 前用 structuredClone() 复制 result.output;新增变异回归测试;更新 RFC/README 注明 clone 是 observe-only 的关键。

目的

监听器若变异事件数组会污染调用方 SubagentResult.output(emit 先于调用方 await result),克隆使其成为只读快照。

65165b5d54#580

hooks:新增 dsh-hook-protocol 共享线协议核心库

改动

新建 packages/hooks/hook-protocol(非插件库):matcher(claude/codex 两种模式)、codec(exit/stdout → 中立 HookOutput)、runner(经 ctx.bash 跑命令 hook,含超时/注入时钟)、merge(最严格折叠 deny>ask>allow)、hook/* session 事件 + helper;47 个单测;RFC + module-graph + tsconfig。

目的

两个 hook 桥接共享 Claude Code / Codex 协议中真正相同的原语,各自只保留差异部分。

c658f4d155#581

hooks:按参考 schema 收紧 codec 并保留 stdout(Codex review)

改动

hook-protocol/src/codec.ts + types.ts:拆分 topLevelDecisionOf(仅 approve/block)与 permissionDecisionOf(allow/deny/ask);HookOutput 新增 hookEventName 与 stdout(trimmed verbatim);session.md 补事件表;51 测试。

目的

对照 ~/repos/refs 修正三处协议保真度问题——顶层 decision 不能接受 allow/deny/ask;hookSpecificOutput 需带 hookEventName 判别;原始 stdout 需保留以复现 CC/Codex 的 plain-stdout 渲染。

c28d6b837b#582

hooks:merge 暴露 WINNING 决策的 reason

改动

hook-protocol/src/merge.ts 改为按 rank 收集 reason,输出与获胜决策对应的 reason(deny 胜出给 deny 理由,ask 胜出给 ask 理由);新增 merge 测试。

目的

原先只从 rank-3 收集 reason,导致 ask 胜出时桥接映射 PreToolDecision 丢失理由。

8adcbceeed#583

hooks:新增 dsh-hooks-claude + dsh-hooks-codex 桥接插件(PR-F)

改动

新建两个桥接插件——hooks-claude(7 个 hook 点、CC 载荷、env/路径替换、literal-or-regex)与 hooks-codex(5 个 hook 点、子集、always-regex、snake_case、block-only);将中立合并结果映射到 seam 的 typed Decision,注入 {kind:'plugin'} 来源;per-file 100% 测试 + ACP keyless 快照(hook-prompt-block)+ 带 key e2e(PreToolUse 阻断真实 bash);RFC + AGENTS.md + module-graph。

目的

让用户原封不动跑现有 CC/Codex hook 配置——桥接是「保真适配器」,不是更强大的本地方案。

643b77dabf#584

文档:同步实现文档与文档门

改动

批量更新 AGENTS.md、architecture.md、development.md、各 package/example README、compact/session/session-persistence 源码注释、verify-md-links.ts 等 15 个文件。

目的

使文档与实现现状对齐,过文档门校验。

24e9c0fa70#585

hook-protocol:丢弃 hookEventName 不匹配的 hookSpecificOutput 块

改动

codec.ts 的 parseHookOutput 增加可选 expectedEventName,不匹配时丢弃该块的事件作用域字段(permissionDecision/additionalContext/updatedInput 等),保留顶层与判别字段;runner.ts 经 RunHookOptions.expectedEventName 透传;新增 codec/runner 测试。

目的

参考 schema 按 hookEventName 索引 block——一个在 Stop 事件上发 PreToolUse deny 的 hook 不应阻断 Stop;修复点放在拥有字段来源信息的 codec 层。

8870da4313#586

hooks:Codex review 修复——Stop 强制 continue、Codex tool_name、plain-stdout context、continue:false 延后

改动

两个桥接的 index.ts——空 stderr 的阻断 Stop hook 之前会误停 turn,改为强制 continue + 兜底 steering 文案;Codex 载荷的 tool_name 从硬编码 "Bash" 改为 exec.name(与 matcher 主体一致);SessionStart/UserPromptSubmit 的 plain stdout 在 JSON 门控下折入 additionalContext;continue:false 标 TODO 延后(sems 无 hard-halt 原语),测试改为同时断言「日志记录 halt」与「运行未被阻断」;README 改并发为「serially」。

目的

round-1 Codex review 指出的行为正确性问题与误导性测试断言。

5304d4ef29#587

合并:worktree-hooks-e-protocol → worktree-hooks-f-bridges

改动

将 protocol 层(hookEventName 判别修复)合并进 bridges 分支,stat 即 24e9c0fa70 的文件。

目的

把 codec 修复带入 bridges 工作分支。

253eded47b#588

hooks:桥接传入 expectedEventName 以丢弃不匹配 block

改动

hooks-claude/src/index.ts 与 hooks-codex/src/index.ts 调 runHook 时传当前 point 作 expectedEventName;hooks-claude 新增桥接级守卫测试(PreToolUse hook 发 UserPromptSubmit 标签的 deny 不再阻断工具)。

目的

把上层(24e9c0fa70)的 codec 判别检查接到两个桥接,跨层闭环。

a72ebda723#589

测试:用轮询替代固定 sleep 修复 detached-hook 测试 flake

改动

hooks-claude 与 hooks-codex 的 bridge/coverage 测试中,针对 detached .then 触发的 observe-only 事件(session-start/subagent start/end),把固定 50–80ms sleep 换成 5s deadline 的 waitFor(predicate) 轮询。

目的

在 test:coverage 重并发(transform ~400s)下 sleep 会早于异步 hook 完成而 flake;改为等待真正信号而非猜测时长。

4da2b99bc3#590

hooks-codex:plain-stdout→context 门控 clean exit;硬化 HMR 与缺席测试

改动

hooks-codex/src/index.ts 的 plain-stdout→additionalContext 折叠加 exitCode === 0 门(与 codec 结构化 stdout 规则一致),覆盖 emit 与 non-blocking error 两条路径;Codex 的 SessionStart no-context 缺席测试改为 touch marker + waitFor;两个 HMR 测试改用阻断性(exit 2)UserPromptSubmit hook,断言 dispose 后不再阻断且无 hook/invoked 日志。

目的

round-2 Codex review——非 clean exit 的 stdout 不应被注入;原 absence/HMR 测试不健全(无法证伪泄漏监听器)。

0478f5965a#591

文档:处理 review sync 缺口

改动

更新 AGENTS.md、development.md、persistence.md、examples README、acp-agent/coding-agent 的 cordis.yml 与 README、core/session 与 session-persistence 源码注释、ui/acp-agent/stdio-agent 源码、verify-md-links.ts 等 15 个文件。

目的

补齐 review 指出的文档与实现不同步之处。

2fa16c16a4#592

合并 PR #126:codex/sync-docs-with-implementation

改动

合并 codex/sync-docs-with-implementation 分支,stat 即 643b77dabf + 0478f5965a 两轮文档同步的累积结果(25 文件)。

目的

将通过 review 的文档同步合入主线。

3e26102baf#593

合并:origin/master → worktree-hooks-a-taxonomy

改动

把 master(含 PR #126 文档同步)合并进 hooks 分类工作分支;stat 与文档同步一致。

目的

让 hooks-a-taxonomy 分支跟上主线文档/实现进度。

bd2de151bd#594

合并:worktree-hooks-a-taxonomy → worktree-hooks-b-bash-seam

改动

把已同步 master 的 a-taxonomy 分支合并进 bash-seam 工作分支;stat 同上。

目的

bash-seam 分支继承 a-taxonomy 的最新基线。

7097e4fb50#595

文档:澄清 bash-local stdin error handler 吞掉任意写入错误

改动

仅 packages/bash/bash-local/src/run.ts 注释——从「EPIPE」扩写为说明吞掉任意 stdin 写错误是正确的(写是 best-effort,命令权威结果是 exit+output,罕见的非 EPIPE 故障由命令自身 exit/output 暴露)。

目的

review 指出注释以偏概全;澄清而非改行为。

c93ed006e2#596

合并:master → docs/chinese-terminology(大合并)

改动

把 master 合进中文术语文档分支,带入大量主线变更——新增 todo/tool-todo 包、compact 包、session surface/repair、invariants 扩展、sqlite schema、ACP todo-plan 快照、多个 RFC 等(105 文件)。

目的

中文术语分支与主线对齐,便于在其上继续术语工作。

5bdb40ff34#597

合并:worktree-hooks-b-bash-seam → worktree-hooks-c-interception

改动

把 bash-seam 合并进 interception 工作分支,含 bash-local/src/run.ts 与 2026-06-30-bash-stdin-env-trusted-plugin-surface.md 等;解决 docs/architecture.md 与 agent-loop/README.md 冲突。

目的

interception 分支继承 bash-seam(含 stdin 错误处理与受信插件面)基线。

3712f67bc6#598

events:review 修复——core.md turn-only 分类、RFC 机制名、post-execute content 快照

改动

docs/core-data-structures/core.md 把 agent/* 分类从「turn/step boundaries」收窄为「turn-only」(step 边界已是 step/start/step/end 事件);interception-seams RFC 把 stack-position 措辞换为机制/RFC 名;tools/src/index.ts 把 dispatched.content 复制成新数组防止监听器原地 push/splice 泄漏,注释改为声明非深度不可变;扩展回归测试。

目的

review 指出的分类误导、冻结式措辞、content 快照保护过度声明三处问题。

198ad2ef0f#599

合并:worktree-hooks-c-interception → worktree-hooks-d-subagent

改动

把 interception(含 3712f67bc6 与 bash-seam 基线)合并进 subagent 工作分支;stat 含 tools/index.ts、core.md、bash-local/run.ts 等 31 文件。

目的

subagent 分支继承 interception 最新基线,为 subagent 相关改动铺路。

826fda3f57#600

subagent:在 detached subagent/end 路径上容纳 structuredClone 失败

改动

subagent/src/index.ts 把深拷贝包进 try/catch——失败时 ctx.logger.warn 并发不带 lastAssistantMessage 的 subagent/end(保留 stopReason/agentType);新增回归测试证明未修代码会产生 unhandled rejection。

目的

review 指出 clone 在 onFulfilled 内、位于 emitLifecycle 的每监听器容纳之外,且 .then 被 void——不可克隆输出会变成 unhandled rejection,违反「任何 throw 都被容纳」的承诺。

提交总结(g-24,共 25 个,从旧到新)25

09531a4e1b#601

合并 worktree-hooks-d-subagent 到 hook-protocol 分支

改动

合并 origin/worktree-hooks-d-subagent 到 worktree-hooks-e-protocol。推进 worktree-hooks 工作流:subagent 服务增加子代理相关代码(subagent/src/index.ts +16、新增 service.spec.ts +35),bash-local 的 run.ts 调整 stdin/env 处理,并同步大量 README/cordis.yml 文档与命名更新。

目的

把 subagent 分支的改动并入正在进行的 hook-protocol 分支。

8f2ef9dc9b#602

纠正 matcher 非法正则处理的文档(实为静默)

改动

仅改 packages/hooks/hook-protocol/src/matcher.ts。原文档称非法正则会被 bridge 记录,但 matchesMatcher 只返回 false,调用方无法区分编译失败与真正不匹配——文档改为显式说明该静默行为,并标 TODO(matcher-diagnostics)。

目的

让文档与实际行为一致,指出坏配置会被静默吞掉。无行为变更。

f011699e43#603

合并 hook-protocol 到 bridges 分支

改动

合并 origin/worktree-hooks-e-protocol 到 worktree-hooks-f-bridges,把上一条的 matcher 文档修正带入 bridges 分支。

目的

继续推进 worktree-hooks 工作流的分支链。

09c8e549b0#604

修复 hooks 桥接四项评审问题

改动

① 两个桥接(hooks-claude/hooks-codex)把 session header.cwd 作为 hook workdir 传入,使 hook 在 session cwd 而非 ACP 启动目录运行;② 文档诚实化:./hooks.json 是在进程 cwd 一次性加载(非每会话发现),标 TODO(per-session-hook-config);③ session-start 同步发射、hook 在 detached .then 上跑,注入是 best-effort 而非首请求前保证,相应降级代码注释/README/RFC,标 TODO(session-start-gating);④ 合并收集到的 systemMessage 此前两桥接都没上浮,改为每 hook 警告并文档化为 deferred。两桥接各加 coverage 回归测试。

目的

修正 hook 在错误工作目录运行、配置时序被夸大、systemMessage 丢失等评审发现的行为与文档不符。

29ce2df315#605

合并 master 到 web-capability-seam

改动

合并 origin/master 到 web-capability-seam,解决 architecture.md / catalog / module-graph / packages/README 等冲突,带入 master 的 todo_write 工具、session types、ui-stdio 等改动。

目的

让 web 能力 seam 分支跟上 master。

cf71c0b215#606

修复 web 能力 seam 评审问题

改动

web-search-deepseek 新增 provider.ts 与 deepseek.spec.ts 测试,调整 src/index.ts;同步 architecture/web 数据结构/RFC 文档与 packages/web README。

目的

落实 web seam 的代码评审反馈。

0691048e47#607

合并 master 到 codex/project-instruction-files

改动

合并 origin/master 到 codex/project-instruction-files,带入 master 上的文档/README 更名与整理。

目的

让 project-instruction-files 分支跟上 master。

03e3c430be#608

合并 master 到 codex/ask-user-question

改动

合并 origin/master 到 codex/ask-user-question,解决 catalog / module-graph / rfc README / packages/ui README / ui harness 等冲突。

目的

让 ask-user-question 分支跟上 master。

e23a6902e7#609

修复 project-instruction 评审问题

改动

project-instructions/src/index.ts 调整(+35/-),util/paths 加路径处理(+11),新增 107 行测试,更新 packages/README。

目的

落实 project-instructions 能力的评审反馈。

d181e6ba33#610

合并 master 到 codex/skill-system

改动

合并 origin/master 到 codex/skill-system,带入 compaction capability、session surface、todo tool、ui-stdio 等大量 master 改动(105 文件,+3850/-700),含多份 ACP 快照 session.jsonl 的格式同步。

目的

让 skill-system 分支跟上 master。

ca4ebb67dc#611

修复 CI demo smoke 的会话断言

改动

改 .github/workflows/ci.yml。JSONL 后端现按 process.cwd 存到 cwd-* bucket(而非旧的 _no-cwd),断言从 ls .sessions/_no-cwd/main-session-*.jsonl 改为 find .sessions/cwd-*/main-session-*.jsonl。

目的

让 CI smoke 断言匹配新的会话存储路径。

2943d0303c#612

修复 skill 评审问题(变体 A)

改动

packages/core/skill/src/index.ts 三处修复:① collectCache 加 128 条上限的 LRU 驱逐(用 undefined narrowing 取最旧 key);② parseFrontmatter body 切片 bug 修复(改用 end+4 切片而非 indexOf('\n'));③ promptLine 新增 escapeText 对 < > & 做 XML 转义。新增 66 行测试。

目的

落实 skill 系统评审发现的无界缓存、frontmatter body 解析、XML 转义缺失。

c276b246b4#613

修复 skill 评审问题(变体 B)

改动

与上一条相同的三个修复(cache LRU、frontmatter body、escapeText),但 cache 驱逐用 IteratorYieldResult<string> 类型断言写法;新增 95 行测试(更全)。

目的

同上,另一份 skill 评审修复变体。

cce3c2a43b#614

合并 origin/codex/skill-system 到本地 skill-system

改动

自合并(同分支远端同步),仅 packages/core/skill/src/index.ts 冲突。

目的

同步上述两份 skill 修复变体。

5252477bc9#615

compact 配置显式化并标记两处代码异味

改动

落实 PR #110 的小修评审:① BasicCompactConfig 除 auto(默认 true)外所有字段改为必填——无数据支撑默认阈值,消费方显式声明;删除 DEFAULTS 导出与构造的 = {} 默认;example cordis.yml、compaction e2e、README、所有测试构造点(经 cfg() helper)全改;② estimateContentTokens 的 char/4 估算加 TODO(待真实 tokenizer 或 usage 反馈);③ agent/pre-step 的 fullSystemPrompt 参数加 // 注释(generic per-step seam 上仅为 compaction 服务的 smell)。

目的

去除无依据的默认值,记录待改进的估算与 seam 异味。

57900f9cbd#616

术语表第二轮评审修订

改动

改 docs/i18n/terminology.md:ACP/SSE 首次出现加英文全称括号;fixture 去掉"测试夹具"译法保留描述性注释;manifest 保留英文并删除"首次出现可写"条款。

目的

落实中文术语表的第二轮评审反馈。

fd692eff19#617

合并 PR #111:新增中文术语表

改动

合并 PR #111,新增 docs/i18n/terminology.md(113 行)。

目的

引入项目的中文术语对照表。

8a8b88b0a7#618

合并 master 到 compact-basic-refactor

改动

合并 origin/master 到 compact-basic-refactor,解决 architecture.md / coding-agent README / session README 冲突,带入 master 的文档整理。

目的

让 compact-basic-refactor 分支跟上 master。

b115b2b4ac#619

再次合并 master 到 compact-basic-refactor

改动

再次合并 origin/master 到 compact-basic-refactor,带入上一条 PR #111 的术语表。

目的

把刚落地的术语表并入 compact 分支。

58b86839af#620

标记 compaction 缺失快照覆盖

改动

在 examples/coding-agent/tests/compaction.e2e.ts 加 FIXME:runaway compaction 只有 e2e 覆盖、无 keyless 全量 transcript 快照。原因:dsh-llm-replay 按 (turn, step) 从 assistant/chunk 事件重建单次模型调用,而 summarize() 本地拼装流且不 append 任何事件,因此交织的摘要调用在 replay harness 能服务它之前不可重放。

目的

记录快照覆盖缺口及其根因。

88d4d6227e#621

合并 PR #110:pre-step compaction on tool-pairing-balanced surface

改动

合并 PR #110。新增 compact-basic 包(746 行实现 + 1707 行测试 + 156 行 repro 测试)、session 的 tool-pairing.ts(+100)、agent-loop 的 pre-step seam(loop.ts 改 94 行)、agent types 扩展;重生成 cordis catalog/module-graph;加 compaction e2e、RFC,更新 compact/compact 契约。

目的

在工具调用配对平衡的会话面上落地 pre-step 压缩能力。

e4b4eaaf38#622

合并 master 到 fs-tool-clean

改动

合并 origin/master 到 fs-tool-clean,解决 architecture / catalog / module-graph / packages README 冲突,带入 compact-basic、todo、术语表等全部 master 改动(90 文件)。

目的

让 fs-tool-clean 分支跟上 master。

bdf390679b#623

合并 master 到 event-taxonomy 分支

改动

合并 origin/master 到 worktree-hooks-a-taxonomy。关键调和在 agent loop:master 加了 agent/pre-step 串行 seam(compaction 的面变更检查点,system-prompt 组装移到 step/start 之前,每步单次 deriveMessages()),而本分支已删除 agent/step-start/step-end mirror emits。合并结果保留 master 的 pre-step 顺序与双重 cancel/dispose 窗口(组装后和 step-start 后),无 step mirror emits;原先从 step-start 监听 cancel/dispose 的两个 master 测试改为经 session/event 观察 step/start。重生成 catalog 与 module-graph。typecheck 干净,agent-loop + compact 套件绿(226 测试)。

目的

把 event-taxonomy 分支与 master 的 compaction 工作对齐,消除两者在 step 事件模型上的冲突。

df0e7bd5f2#624

新增 tool-schema 生成目录(启动工具插件读取)

改动

新增第三份生成目录 docs/tool-catalog/tools.md:每个 packages/*/tool-* 插件贡献的模型可见工具(name/description/JSON-Schema 参数)。与 cordis catalog(纯源 AST)不同,本生成器 scripts/gen-tool-catalog.ts(229 行)在真实 cordis Context 上 BOOT 每个工具插件并读 ctx.tools.schemas()——因为 schema 非静态可知(todo_write 运行时 spread enum、描述为字符串拼接、subagent 名 config 驱动、MCP 工具不经 defineTool 注册原始 JSON Schema)。加 completeness guard:glob on-disk tool-* 包,任何缺失即失败;verify-tool-catalog 进 doc-sync。新增 process RFC 与 105 行测试。

目的

补齐第三类生成参考目录,并保证它不会与实际工具插件漂移。

30c1863755#625

修复 fs 能力评审:重命名为 dsh-fs-policy、intent 事件、RFC 现金化、ENOTDIR

改动

① 重命名包 dsh-file-context → dsh-fs-policy(含 dir、package/plugin 名、tsconfig refs、importers、type-equiv manifest、生成 catalog 与 module-graph 全部引用);② 事件 fs/write-expectation → fs/write-intent、fs/edit-expectation → fs/edit-intent(fs/observed 不变),类型 FsWriteExpectation → FsWriteIntent,全文 "expectation" → "intent";③ 导出 FileContextExec → FsPolicyExec;④ 已实现 RFC 改为描述实际发布内容(非过时的 ctx.fs/全-部分视图授权/ctx.fileContext 设计),并明确 AGENTS.md:重命名应就地修正,"新 RFC" 逃生口只用于宏观决策反转;⑤ 代码修复:fsio.ts 的 resolveLocalTarget/probe 把 ENOTDIR(父段是文件)翻译进结构化 FsError 分类(resolve→FS_NOT_FOUND、probe→absent)而非泄漏 Node 原始错误;tool-fs HMR 测试改为断言 prompt sections(不仅 tool schemas)在 dispose 时撤回;fs/observed 是普通无守 ctx.emit——纠正 fs-policy/filesystem.md/tool-fs 错误声称工具"包含"抛出 listener;删除若干虚假/重复/陈旧文档声明。

目的

统一命名与文档,让已实现 RFC 反映真实发布行为,并修复 ENOTDIR 错误泄漏等评审问题。

提交总结(g-25,共 25 个,从旧到新)25

eda2983b00#626

修 Codex 审查:tool-schema catalog 记录 subagent_fork 别名并硬化 dispose

改动

scripts/gen-tool-catalog.ts、docs/tool-catalog/tools.md、Agent Note、gen-tool-catalog.spec.ts。

目的

coding/acp-agent 配置会把 dsh-tool-subagent 同时加载成 subagent 和 subagent_fork,catalog 没提别名属于过度声明;改为 per-package note 记录别名。同时把 collectToolCatalog 的 ctx.fiber.dispose() 移入 finally,避免 mount/schemas 抛错时泄漏 fiber。

140f818a42#627

refactor:移除 turn 边界镜像事件

改动

agent-loop/src/loop.ts 删除 agent/turn-start/agent/turn-end 两个 emit 并简化 closeTurn;ui-stdio、acp 改从持久化 session/event 渲染边界;大量测试、文档、catalog 同步;RFC promote 到 implemented。

目的

完成 step 镜像移除后最后一环,turn/step 边界统一只从 session/event(turn/start/turn/end/step/*)读取,消除所有 agent/* 边界镜像。

9e575a2a2c#628

docs:清理 turn-mirror 残留引用

改动

docs/architecture.md、event-domain-semantics RFC、core-data-structures/core.md、ACP RFC、loop.ts 外层 catch 注释;重生成 catalog。

目的

上一提交移除镜像后,文档/注释里仍残留 "agent/turn-start/end" 表述,按审查意见统一修正。

318a3fd036#629

Merge:worktree-hooks-a-taxonomy → worktree-hooks-b-bash-seam

改动

将 A 分支(事件分类/turn-mirror 移除、compaction capability seam、bash stdin/env 等)合入 bash-seam 分支。

目的

把 B 分支带到 master 当前进度(A→B)。

bb9ae2ba99#630

docs(bash):重新定位 stdin/env —— scrub 才是安全控制

改动

docs/core-data-structures/bash.md、bash-stdin-env RFC、三个 bash 包 README、bash/src/types.ts JSDoc、tool-bash 守卫测试。

目的

原 "trusted-plugin 边界" 措辞夸大了安全模型;model 本就可用 shell 语法设 env/stdin,真正控制是 dsh-bash-local 对 *KEY*/*SECRET*/*TOKEN* 的 scrub。改写为 scrub-is-the-control 框架,无代码/行为变更。

5533bb783a#631

docs(bash):清除剩余 trusted-plugin 措辞

改动

docs/rfc/README.md 索引标题、bash-local/src/run.ts 与 index.ts 的 JSDoc/注释、两个 bash-local 测试描述符、tool-bash 守卫测试 call id(boundary-*→no-forward-*)。

目的

上一轮漏掉的 trusted-plugin 表述清理,统一到中性或 scrub-is-the-control 措辞(文件名保持稳定 id 不动)。

1323366da3#632

Merge:worktree-hooks-b-bash-seam → worktree-hooks-c-interception

改动

合并 B 到 C(interception seams)。核心调和:types.ts 同时保留 master 的 agent/pre-step 和 C 新增的 interception 事件(prompt-submit/session-start/ContinuationDecision),删除 turn-mirror;loop.ts 固化每轮顺序(prompt-submit → pre-step → step);文档/catalog 同步;新增跨测试验证 prompt-submit 重写对 pre-step 可见。

目的

把拦截 seam 分支带到更新后的 stack(master via A→B),固化合并后的 seam 顺序。

d3be934a17#633

docs(events):清理 turn-mirror / tools-execute 过时表述

改动

packages/core/agent/src/types.ts 模块文档、interception-seams RFC、ACP RFC、optional-code-mode RFC;重生成 catalog。

目的

interception merge 后仍有文档把 turn 边界当成 agent/* emit、把拆分后的 tools/pre-execute/post-execute 写成旧的 tools/execute,按审查修正。

8514bddd82#634

Merge:worktree-hooks-c-interception → worktree-hooks-d-subagent

改动

将 C 合入 subagent 分支。

目的

把 D 分支带到更新后的 stack(master via A→B→C)。

84f3019310#635

refactor(subagent):移除 agentType 生命周期字段

改动

SubagentStartRequest/SubagentRunInfo/SubagentRunEndInfo 及 dsh-tool-subagent 的 Config.agentType 与 plumbing 全部删除;测试重写/删除;subagent-observe-enrich RFC 重写;README、catalog、subagent.md 更新。

目的

agentType 是 Claude-Code(subagent_type)概念,harness 不解释它,唯一消费者是 CC 方言 hook 桥;外来概念不应停在核心 seam 上。CC 桥(PR-F)改为自填常量。

9c60fa83f9#636

Merge:worktree-hooks-d-subagent → worktree-hooks-e-protocol

改动

合并 D 到 E(hook-protocol)。唯一冲突在 docs/rfc/README.md:保留 D 修正后的 subagent RFC 标题,加上 E 自己的 hook-protocol 行。

目的

把 hook-protocol 库分支带到 stack 当前进度(master via A→…→D);E 本身无审查修复。

8572fba886#637

Merge:worktree-hooks-e-protocol → worktree-hooks-f-bridges

改动

合并 E 到 F(bridges)。冲突仅 examples/AGENTS.md,同时保留 master 的 compaction e2e 行和 F 的 hook snapshot/e2e 行。D 移除 agentType 导致 hooks-claude 类型错误,留到后续提交修。

目的

把 bridges 分支带到 stack 当前进度;gpg-sign 跳过让 merge 先落地,下一提交修类型错误并重跑 gate。

bae6141398#638

fix(hooks-claude):subagent payload 走 base()、SubagentStop 在 child cwd 跑、移除 agentType

改动

packages/hooks/hooks-claude/src/index.ts、bridge/coverage 测试、hooks.e2e.ts 注释、README。

目的

修上一合并引入的 agentType 类型错误 + #124 审查两点:原 subagentStart/StopPayload 绕过 base() 丢了 CC 承诺的 session_id/cwd,改为基于 base(child) 的统一 subagentPayload();SubagentStop 原在 server cwd 跑,改为查 child 后在 child workspace 跑(新增 pwd 回归测试);agent_type 用常量 general-purpose。

8e8c791eb0#639

docs(hooks-claude):审查抓到的注释措辞修正

改动

hooks-claude/src/index.ts、coverage.spec.ts 注释。

目的

纯注释。把 SubagentStop-cwd 回归测试注释从 "bug 历史" 改为陈述所验证的不变量;把 listener "no session is passed" 改为 "no turn is passed"(有 child 时其实有 session)。

33bc374038#640

Merge PR #127:生成 tool-schema catalog

改动

新增 scripts/gen-tool-catalog.ts(启动各 tool-* 插件采集 schema)、docs/tool-catalog/tools.md、gen-tool-catalog.spec.ts、Agent Note、package.json 脚本。

目的

把 worktree-tool-schema-catalog 特性(启动插件采集模型可见的工具 schema 并生成文档)合入 master。

114efbc1f0#641

Merge:origin/master → fs-tool-clean

改动

把 master(含 tool-schema catalog)合入 fs-tool-clean 分支。

目的

让 fs-tool-clean 分支跟上 master。

6c88b380ea#642

docs(tool-catalog):在 boot manifest 注册 dsh-tool-fs

改动

scripts/gen-tool-catalog.ts、docs/tool-catalog/tools.md、gen-tool-catalog.spec.ts 期望集。

目的

新 catalog 启动所有 tool-* 包,缺项会硬报错;补 dsh-tool-fs 条目(boot dsh-fs-local 注入 fs,采集 read/write/edit,fs-policy 加 read-before-write 闸门不改 schema)。

b06f1bb60d#643

fix(acp):demo 启用 filesystem 工具

改动

examples/acp-agent/cordis.yml、cordis.snapshot.yml、README.md。

目的

ACP demo 加载 dsh-fs-local/dsh-fs-policy/dsh-tool-fs,系统提示改为用 read/write/edit 做文件读写、bash 仅用于 shell/搜索等,取代原来一律走 heredoc/sed 的工作流。

1e87b6fea4#644

fix(ui-stdio):从注册表播种 turn 标签;删过时 taxonomy 行

改动

packages/support/ui-stdio/src/index.ts、packages/core/agent/src/types.ts、catalog、README、ui-stdio.spec.ts。

目的

修 bug——turn 标签 map 只从 live agent/created 事件构建,预创建的 main agent 或 HMR 重载后会漏,渲染成原始 session id;改为安装时用 ctx.agents.list() 播种再保持 live。附带删掉 "turn boundaries 属于 agent/* transient emit" 的过时行。

40488e29e5#645

fix(bash-local):无 stdin 时保留 /dev/null

改动

packages/bash/bash-local/src/run.ts、README、bash-stdin-env RFC、run.spec.ts。

目的

修 spawn stdin bug——seam 之后每次调用都把 stdin 设为 'pipe',无 stdin 时关成空管道,与 seam 前 'ignore' 不等价(node pipe 是 AF_UNIX socket,test -c /dev/stdin 对每次 bash 调用都翻)。改为仅当传入 bytes 时用 'pipe',否则 'ignore'(fd 0 → /dev/null)。

a35362bdd6#646

style:session fork 私有 helper 加前缀

改动

packages/session-fork/session-fork/src/index.ts(resolve→_resolve、assertTurnBoundary→_assertTurnBoundary)。

目的

给 SessionForkService 的私有 helper 加 _ 前缀以标记私有。

abe80cec68#647

fix(loop):为每个被否决的 prompt 记录持久 prompt/blocked

改动

agent-loop/src/loop.ts、session/src/types.ts、agent/src/types.ts、interception.spec.ts、相关文档/catalog。

目的

修 bug——PromptDecision.reason 本应是 blocked 的持久记录,但 loop 只在全批 rejected 的 turn/end 暴露;混合批次(一个被拦一个放行)下被拦的 prompt 及其 reason 完全消失。新增非 surface、turn 内含的 prompt/blocked SessionEvent,在否决点就地追加。

9428acdc96#648

fix(hook-protocol):丢弃无 discriminator 的 hookSpecificOutput 块

改动

packages/hooks/hook-protocol/src/codec.ts、README、codec.spec.ts。

目的

修 guard 漏判——原 guard 只拦 hookEventName 与当前事件名不符的块,缺 hookEventName 的块会滑过并把其 permission 字段套到任意正在触发的事件上。在 CC keyed schema 下缺失 discriminator 与不匹配一样 malformed;删除 eventName !== undefined 子句,使 guard 在不匹配和缺失两种情况都触发。

09e81f4179#649

Merge:origin/master → session-fork

改动

把 master 合入 session-fork 分支;冲突在 docs/architecture.md、packages/README.md、tsconfig.build.json、tsconfig.json。

目的

让 session-fork 分支跟上 master(含 compaction、tool-catalog 等已合入的特性)。

743eb9ea09#650

fix(fs):按调用方 session cwd 解析路径

改动

FileSystem.resolve 加 opts?: { cwd?: string };dsh-fs-local 相对路径基于 opts.cwd ?? config.cwd;tool-fs read/write/edit 经新增 session-cwd.ts 的 sessionCwd(exec) 派生;测试、RFC、README。

目的

ACP 每会话独立 workspace(SessionHeader.cwd),dsh-tool-bash 已按其解析 workdir,但 ctx.fs.resolve 不接 caller context、dsh-fs-local 只用固定的 config.cwd,导致 write foo.txt 与 bash cat foo.txt 落在不同目录。把 session cwd 透传进解析(与 dsh-tool-bash 对称),向后兼容。

提交总结(g-26,共 25 个,从旧到新)25

9bc4df28c1#651

修复 hook 桥接:context-only 钩子委托 + 默认 CLAUDE_PROJECT_DIR

改动

packages/hooks/hooks-claude、hooks-codex 两个桥接插件及其测试、coverage 用例,并更新 hook-bridges RFC。

目的

修复两个组合性/兼容性 bug——只附加 additionalContext 的钩子原本未调用 next() 短路了后续监听器,现改为委托并合并 context;ACP 默认未配 projectDir 导致 $CLAUDE_PROJECT_DIR 为空,现按运行默认指向 session 工作区。

ef24ebf97c#652

合并 worktree-hooks-a-taxonomy 到 worktree-hooks-b-bash-seam

改动

将 hooks 分类(taxonomy)分支合并入 bash-seam 分支;带入了 ui-stdio 的相关改动和 cordis-catalog 的事件/服务文档。

目的

在 hooks 多分支 stack 中把分类基础并到 bash 受信插件面(bash-seam)上继续开发。

3422f8fa5c#653

合并 worktree-hooks-b-bash-seam 到 worktree-hooks-c-interception

改动

合并入 interception 分支,冲突点为 cordis-catalog 与 agent/src/types.ts;带入 bash-local 的 run.ts 改动。

目的

把 bash stdin/env 受信面并入 interception(拦截 seam)分支推进 stack。

8b701605b3#654

合并 worktree-hooks-c-interception 到 worktree-hooks-d-subagent

改动

带入 agent-loop 拦截测试、session 类型新增字段、core-data-structures 文档更新。

目的

把拦截 seam 并入 subagent 分支,继续向 protocol 层推进。

d72ceffd04#655

合并 worktree-hooks-d-subagent 到 worktree-hooks-e-protocol

改动

与上一 merge 内容一致(同一 stack 内容滚动)。

目的

把 subagent 分支并入 protocol 分支。

4fc0d4833c#656

合并 worktree-hooks-e-protocol 到 worktree-hooks-f-bridges

改动

额外带入 packages/hooks/hook-protocol 的 codec 实现/测试与一个 hook-prompt-block 快照。

目的

把 protocol 分支并入 bridges 分支,完成 hooks stack 的六级合并链。

bd7fb31ae3#657

fs 工具加入面向编辑器的 read/write/edit 呈现

改动

packages/core/tools 新增 locations 字段;packages/fs/tool-fs 的 read/write/edit 增加呈现(标题、kind、rawInput);ACP 桥接转发 locations 到 wire;新增 ACP bridge 测试与 withFs 测试 harness。

目的

让 fs 工具像 bash/subagent 一样拥有工具自有的编辑器呈现(Read/Write/Edit <path> 标题),并让编辑器能跳转到对应文件,点亮 ACP feature matrix 的 locations 单元。

a334395f0c#658

coding-agent demo 接入文件系统工具

改动

examples/coding-agent/cordis.yml 加载 dsh-fs-local + dsh-fs-policy + dsh-tool-fs,更新系统提示词偏向 fs 工具;同步 architecture/RFC/examples README 文档。

目的

让 coding-agent demo 像 acp-agent 一样用 read/write/edit 做文件操作而非 bash;seam 按会话级 cwd 解析后移除启动目录限制。

2a66b7c4e0#659

文档修正:fold 描述与去除叙述历史的测试注释

改动

修正 hook-bridges RFC 关于 block 是否携带 context 的 per-seam 差异;重写两处 "Before the fix…" 的测试注释;在两桥的 concatContext 上补充 provenance 说明。

目的

Codex convergence 发现的纯文档/注释漂移——代码本就正确,只让 prose 准确描述当前行为而非历史。

94cbec8162#660

为 fs 工具录制 ACP 快照场景

改动

在 examples/acp-agent/tests/snapshots/ 新增 fs-read、fs-write、fs-edit、fs-write-overwrite、fs-read-window 五个端到端场景(input/session/golden workspace)。

目的

在 CI 中无 key 回放验证 read/write/edit 端到端呈现(标题、kind、locations)并确认提示词确实引导模型走 fs 工具而非 bash。

b3f8b4c9c6#661

补齐 fs 的 abort/并发/observed 覆盖与 with-key e2e

改动

fs-local/fs-policy/tool-fs 多个 spec 补行为用例;新增 packages/fs/tool-fs/tests/fs-tools.e2e.ts(真模型驱动)+ harness;新增 dsh-agent-loop、dsh-llm-deepseek devDeps。

目的

关闭覆盖审计发现的行为空白(pre-abort、并发写竞态、throwing listener、参数校验等),并用真实 API e2e 验证相对路径按会话级 cwd 解析。

3aa6b3c77a#662

knip 注册 tool-fs e2e 入口

改动

knip.json 新增 4 行 entry 配置。

目的

让 knip 跟踪新增的 *.e2e.ts 与 harness,避免把文件及其新 devDeps 误判为未使用。

490fe002a1#663

为 fs-policy 拒绝卡录制快照

改动

新增 fs-policy-reject 快照场景(input/session/golden + workspace 种子文件)。

目的

固定 "模型未读就改" 被 FS_NOT_OBSERVED 拒绝时的失败卡呈现,防止回归时该卡片丢失或渲染错误而所有 gate 仍绿。

b84d4828a8#664

移除 agent/stream-chunk 这一对 assistant/chunk 的冗余镜像

改动

删除 agent/stream-chunk 声明与 emit;迁移 ui-stdio 改为在 session/event 监听器内渲染 assistant/chunk;调整 agent-loop/ui-stdio 测试;新增 simplification RFC 并更新 boundary RFC 交叉链接、architecture、cookbook、cordis-catalog。

目的

loop 原本把同一 token delta 同时记为 durable assistant/chunk 又 emit 一个内容完全相同的 live agent/stream-chunk——后者纯冗余。统一到 authoritative 的 session/event 流,顺带让 ui-stdio 的 reasoning dim 标志在 chunk/boundary 间确定性一致。

e100c52154#665

清理两个 package README 中的 stream-chunk 残留

改动

packages/core/agent/README.md、agent-loop/README.md。

目的

Codex convergence 发现 doc-sync gate 扫不到的过时 prose——README 仍让 UI 插件监听已删除的 agent/stream-chunk,改为指向 session/event assistant/chunk。

5481887cd3#666

在 agent README 指明流式读取入口

改动

packages/core/agent/README.md emit 小节重命名为 "Live control notifications" 并补一行指向 durable session/event assistant/chunk。

目的

上一提交把 streaming 条目删掉后留下空标题,补回 token 流当前所在位置。

d942204759#667

提炼 hooks stack(#118-#129)的流程经验到 AGENTS.md

改动

AGENTS.md 新增 15 行——"Landing changes cleanly: gates, Codex, and scope" 小节与两条 defensive patterns(spawn stdout/stderr 收窄、AgentLoop.create() 丢 meta)。

目的

整个 stacked-PR 努力的复盘,提炼出:回归测试要先证 RED、跑全量 test:coverage、Codex 限定单一关注点、超出 scope 的清理另起 stack、生成产物随改动一并再生、读清失败再反应(ENOSPC 是环境问题)。

665c10ff19#668

新增生成的文档图谱集(documentation atlas)

改动

新增 docs/graphs/ 下 11 张 mermaid 图与 README、scripts/gen-doc-graphs.ts(851 行生成器)、对应 RFC,并把生成步骤接入 package.json。

目的

用生成器把架构图(agent 生命周期、能力 seam、包拓扑、事件生产/消费、快照回放等)从代码事实投射成文档,避免手画图漂移。

907c8d3871#669

修正 AGENTS.md 中两处被 Codex 查出的事实不准

改动

AGENTS.md 改 2 行。

目的

复盘文档里说错的两点——meta 串线的是同步的 ctx.agents.create()(createAgent)而非 "async factory"(async 的是 resume);生成物条目混淆了 gen-cordis-catalog(读 interface Events/Context 成员 JSDoc)、gen-module-graph(由 peerDependencies 驱动)及其各自的 freshness gate。

8caf923196#670

校验 mermaid 语法

改动

新增 scripts/verify-mermaid.ts 并接入 package.json 和 CI workflow;调整 gen-doc-graphs.ts 与两张图(agent-lifecycle、tool-execution-pipeline)以通过校验。

目的

给上一提交引入的 mermaid 图加一个语法 gate,防止坏语法图进入 CI。

1a57d67058#671

用带 tag 的 render-intent 判别联合重构工具调用呈现

改动

packages/core/tools 把 ToolCallPresentation/ToolResultPresentation/ToolTerminal 从 "可选字段袋" 改为 card-tagged 判别联合(call: generic|terminal|diff,result: generic|terminal);迁移 tool-fs/tool-bash/tool-todo 三个生产者与 ACP 桥接消费者;新增 diff 卡让 fs write/edit 发 ACP {type:'diff'};read 加 window-in-title 与 location line;重录 fs goldens;新增 RFC 与 fs-terminal-card 快照。

目的

解决长期 FIXME——让工具声明每次调用/结果的渲染意图并由桥接 switch,表达力更强(新 diff 卡)、与 claude-agent-acp 参考实现对齐字段。

af79ceea1c#672

ACP:穷尽 result-card switch + 收紧 display-path 守卫

改动

packages/ui/acp/src/index.ts 与 stream-update 测试。

目的

回应 render-intent-union 的 review——toolResultUpdate 原来用 if (card === 'terminal') + 兜底,改为穷尽 switch 以 assertNever 收尾,新增结果卡时编译期报错;displayTitle 的 rel.startsWith('..') 会误伤 ..cache/x 这类合法同级名,改为按 .. 段判断。

d8ea99756d#673

合并 PR #96(fs-tool-clean):新增文件系统能力 seam 与工具

改动

Merge PR #96,把整条 fs 能力 seam(dsh-fs 服务定义、fs-local provider、fs-policy 守门、tool-fs 的 read/write/edit 工具)并入 master,含 RFC、core-data-structures/filesystem.md、tool-catalog、acp-agent/coding-agent 接线与五个 ACP 快照。

目的

正式落地文件系统能力 seam 与配套工具,点亮 fs 这一类能力。

19abd0a357#674

合并 origin/master 到 codex/project-instruction-files

改动

把 master(含 fs seam、compact-basic、tool-pairing、gen-tool-catalog 等大量内容)合并进 project-instruction-files 分支。

目的

在该分支继续开发 project-instructions 前,先与 master 同步以拿到 fs 能力等基础。

a52cac00b1#675

修复 project-instructions:通过 fs service 加载文件

改动

packages/prompt/project-instructions/src/index.ts 重写为经 fs 服务读取文件;补 e2e/spec 测试与 tsconfig/package.json 依赖;echo-agent cordis.yml、architecture.md、module-graph.md 同步。

目的

让 project-instructions 加载走 fs 能力 seam(而非直接读盘),与文件系统能力统一,并补齐对应测试。

提交总结(g-27,共 25 个,从旧到新)25

077a5fe382#676

合并 origin/master 到 codex/ask-user-question 分支

改动

Merge 提交,将 master 上的 fs 能力 seam、compaction、tool catalog、i18n 等进展合并进 codex/ask-user-question 特性分支;解决了 packages/README.md、packages/ui/acp/README.md、pnpm-lock.yaml 的冲突。

目的

让 ask-user-question 分支跟上主干,便于后续合并。

5870bc2e1a#677

合并 origin/master 到 skill system 分支

改动

Merge 提交,合并 master;额外让 skill 包在 ctx.fs 可用时改走新的 filesystem seam 读写技能文件,并把 skill tool 纳入生成的 tool catalog。

目的

skill system 分支与主干对齐,并复用新的 fs 能力。

4d89bb3e74#678

建立 EN→ZH 双语文档契约、翻译技能与配对 gate

改动

新增 docs/i18n/README.md(配对契约 foo.md ↔ foo.zh.md,blob-hash 指纹)、docs/i18n/translation-rules.md(翻译规则)、dsh-translate-docs agent 技能、verify-translation-pairing.ts gate 与 manifest;并 dogfood 翻译了 README.zh.md 和两份 i18n 文档;附 RFC。

目的

确立仓库的双语文档机制与可执行的配对/新鲜度校验。

803ed4bd95#679

feat(fs): 新增目录列表 seam

改动

在 fs 能力上新增 listDir(packages/fs/fs、fs-local 实现 + 类型 + 测试),更新 catalog/RFC 与 type-equiv 清单。

目的

补齐 filesystem 能力的目录列举能力。

6fc2cee837#680

fix(fs): 翻译 listDir 的元数据失败

改动

调整 fs-local 的 fsio.ts/index.ts,让 listDir 的元数据失败走统一的错误翻译路径,新增 RFC 记录该决定。

目的

让 listDir 错误与其他 fs 操作一致地映射到 capability 错误。

7441307251#681

fix(web): WebError.code 改为开放 string,对齐其他 seam

改动

移除 WebErrorCode 闭合联合,WebError.code 改为开放 string(与 LlmError/SubagentError 一致),按 owner 分组文档化各 code。

目的

避免把 fetch 传输细节(redirect、too-large、content-type)泄漏进共享 seam 词汇。

580496b72a#682

feat(web): 把 exa/perplexity 的搜索调优暴露为配置

改动

Exa 增加 searchType/numResults/highlightsPerResult,Perplexity 增加 maxTokens/可选 searchRecency;各自配套 DEFAULT_* 常量与 status() 校验;调用级 maxResults 仍优先于配置默认值。

目的

让部署可在默认值尚未稳定时通过 config 调节请求参数。

cd9d559805#683

docs: 将 development.md 翻译为中文

改动

新增 docs/development.zh.md(按术语表翻译、锁定 11 个标题与 10 个字节相同的代码块),加入 manifest 的 required 列表。

目的

作为 dsh-translate-docs 技能的第一个真实 backlog 翻译实践。

005db3c610#684

合并 origin/master 到 web-capability-seam 分支

改动

Merge 提交,将主干上的 fs/compaction/tool-catalog/i18n 等进展合并进 web-capability-seam;解决 docs/architecture.md、module-graph.md、packages/README.md、tsconfig 等冲突。

目的

让 web 分支与主干对齐以便 PR。

0a595aea78#685

test(web): 覆盖 exa/perplexity apply 的 config-present 分支

改动

为 exa 的 numResults 与 perplexity 的 searchRecency 条件展开补充插件注册测试,断言配置确实进入请求体。

目的

补齐 100% per-file 分支覆盖缺口。

a899226397#686

docs: 按评审意见加固配对 gate —— 结构签名而非计数

改动

verify-translation-pairing.ts 由比较标题/代码块数量升级为比较有序结构签名(标题深度、fenced 代码块逐字、表格列数、列表类型、除语言切换行外的所有链接目标);明示 gate 的边界(green = 新鲜且结构健全,非已验证);修复首行抽取丢字符、文档化 isExcluded 边界不变量。

目的

让配对 gate 真正表达其声称的契约,而不仅是粗粒度计数。

d8fd3225af#687

feat(tool-fs): write/edit 在结果阶段发送 applied-hunk diff

改动

新增持久化的 tool-private meta 通道({content, meta},meta 携带于 tool/result 事件并回传 presentResult,可事件回放);后端在 FsWriteOutcome/FsEditOutcome 返回原始 before/after,工具用 npm diff 的 structuredPatch 生成 ±3 行上下文 hunk;ToolResultView 增加 DiffResultView,ACP 桥渲染为 {type:'diff'};全部 fs 快照重录;附 RFC。

目的

让编辑器(如 Zed)在结果阶段原地渲染已应用的变更,与 claude-agent-acp 行为一致。

50a32cdcb1#688

docs: 扩充术语表,加入 i18n 机制相关条目

改动

docs/i18n/terminology.md 增加 orphan→孤立、info string→信息字符串、fenced code block→围栏代码块、staged→暂存、event-sourced→事件溯源、smoke test/fail-fast,以及本仓库自创术语(语言切换行、结构签名、强制边界)和一批保持英文的条目(backlog、blob hash、CI、doc-sync、e2e、monorepo、PR、worktree);修正 i18n README 译文中的 orphan/info string。

目的

为双语工作的术语一致性提供权威依据。

f508ff2bf5#689

docs: 按 MDN HTTP 缓存中文先例确定 freshness/stale 译法

改动

依据 MDN 中文 HTTP 缓存文档确认 freshness→新鲜度、stale→陈旧(过期保留给 expired),更新术语表与 i18n README 译文。

目的

让 freshness/stale 译法有可引用的权威先例。

0282778126#690

docs: i18n README 译文中再修一处 stale 语义 过期 → 陈旧

改动

docs/i18n/README.zh.md 中遗漏的一处 stale 语义改为陈旧。

目的

与上一条译法保持完全一致。

bb10931478#691

docs: 按翻译评审意见修订四个中文文档

改动

对 README/development/i18n/translation-rules 四个 .zh.md 做双人交叉评审并修订:术语(stale→陈旧、GitHub 工作流、CI 门禁、分类体系)、逐字 span(恢复 <current-blob>)、标点(全角破折号两侧无空格、顿号→逗号)、措辞(不得、本地环境搭建、强制执行、受验证的范围)等。

目的

落实评审发现,使四个中文文档与各自英文源严格对齐并符合排版规则。

dee2dee402#692

fix(tool-fs): CRLF 安全的 write diff、opaque meta、文档同步

改动

修复 CRLF 写入因 LF 归一化基准不一致而把每行都判为变更的 bug(写入 after 也归一化为 LF,附回归测试);将 meta 在所有 seam 改为 unknown(去掉仅为类型命名而存在的 dsh-tools → dsh-session 依赖与 FileDiff 索引签名,运行时仍由 Session.append 的 isJsonValue 守卫);同步 tools.md/session.md/adding-a-tool cookbook 等文档与 catalog、module graph。

目的

修复结果 diff 的 CRLF 回归,并让 meta 通道在边界上真正保持 opaque。

a928a5a47a#693

docs(acp): presenter 备注不再枚举 tool/result 字段

改动

packages/ui/acp/README.md 中 callId→args 映射备注不再穷举 { callId, content, isError },改为陈述承载事实(事件省略 tool name/args,故桥按 callId 记忆)。

目的

避免随事件字段增长而漂移的易腐枚举。

f86e0bedec#694

docs(tools): 将 ToolExecutionResult.meta 注释同步为 unknown

改动

docs/core-data-structures/tools.md 中粘贴的 type-equiv 块 JSDoc 由 {@link JsonValue} 改为 unknown(verify-type-equiv 不比对注释,故此前漂移未被发现)。

目的

让文档注释与源码实际类型一致。

ce4036addb#695

合并 fs-acp-render-intent-union 到 fs-acp-applied-hunk-diffs

改动

Merge 提交,将 render-intent-union 分支合入 applied-hunk-diffs;带入 ACP README 的一行修订。

目的

整合两条相关 fs/acp 特性分支。

4d36c0466b#696

docs(acp): ToolPresenter 注释去掉 tool/result 字段枚举

改动

packages/ui/acp/src/index.ts 中 ToolPresenter JSDoc 去掉「只携带 { callId, content, isError }」的易腐枚举,改陈述承载事实(事件省略 tool name/args)。

目的

与 a928a5a47a 同源,避免字段枚举随演进漂移。

57923c68ee#697

再次合并 fs-acp-render-intent-union 到 fs-acp-applied-hunk-diffs

改动

Merge 提交,render-intent-union 分支后续更新(ToolPresenter JSDoc 修订)再次合入 applied-hunk-diffs。

目的

同步 render-intent-union 在上一次合并之后的增量改动。

d24f3ffef0#698

Merge PR #114:合入 web 能力 seam

改动

Merge 提交,合并 deepseek-harness/web-capability-seam。新增 ctx.web 能力、search/fetch providers(deepseek/exa/perplexity 搜索 + local fetch)、tool-web 工具,配套 catalog/RFC/文档/tsconfig/knip 与全套测试,约 +5562 行。

目的

正式落地 web 能力 seam。

f0ae253670#699

合并 master 到 codex/fs-directory-listing

改动

Merge 提交,将刚合入的 web 能力 seam 等主干进展合入 codex/fs-directory-listing 分支。

目的

让 fs 目录列表分支跟上主干(含 web seam)。

53b215c646#700

fix(tool-fs): write 在完成更新时始终渲染 diff 卡片

改动

修复 Write CREATE 在完成的 tool_call_update 中以 model-facing 结果文本(<path>…</path>…Created file)替换了 pending 阶段安装的新文件 diff(ACP content-replace 会覆盖)。presentResult 现在对成功写入始终返回 diff 卡片:有 hunk 时用 meta 中的应用 hunk(overwrite),否则用 args 推导的整文件 diff(oldText: null,create 或无变更 overwrite),与 claude-agent-acp 一致;错误仍走 generic 渲染。重录 fs-write / fs-write-overwrite 快照。

目的

修复新建文件在 Zed 等客户端中被结果文本冲掉 diff 的回归。

提交总结(g-28,共 25 个,从旧到新)25

da1d7f28#701

DiffResultView.diffs 可能是整文件 diff,而非仅 hunk

改动

packages/core/tools/src/index.ts、packages/fs/tool-fs/src/write.ts、docs/core-data-structures/tools.md、packages/core/tools/README.md、docs/cookbook/adding-a-tool.md、packages/ui/acp/acp-feature-support.md、docs/cordis-catalog/events-and-services.md。修正 DiffResultView.diffs 的类型 JSDoc、write 执行侧注释和四处镜像文档。

目的

write 在 create/无 before-image 时 presentResult 返回 oldText:null 的整文件 diff,旧契约称 diffs 始终是 applied hunk,纠正成"通常是 applied hunk,无 before-image 时是整文件 diff",并说明 mutation 必须返回 diff 以免被 model-facing 文本覆盖。

86457689#702

ACP presentResult 列表补充整文件 diff 的 create 情形

改动

packages/ui/acp/README.md 一处描述。

目的

让 ACP README 与其他镜像保持一致,限定 diff 在 create 时为整文件 diff,并强调 mutation 总会返回它。

d753660d#703

fs-local:null before-image 仍渲染整文件 diff 卡片

改动

packages/fs/fs-local/src/index.ts 中 writeText 的注释。

目的

原注释称 null before 表示"只渲染 call-time 卡片"已过时;修正为 null before 时回退到整文件 diff,工具仍会渲染 result-time diff 卡片。

e0788659#704

完成跨注释与 RFC 的整文件 diff 文档清扫

改动

packages/core/tools/src/index.ts(DiffCallView JSDoc)、packages/ui/acp/src/index.ts(acp 桥 diff-arm 注释)、packages/fs/fs-local/src/fsio.ts、packages/fs/fs/src/types.ts(FsWriteOutcome.before / readTextForDiff JSDoc)、三处 RFC 文件,以及重新生成的 catalog。

目的

Codex stale-prose 扫描发现七处仍称 result diff 始终是 applied hunk 或 create 仅渲染 call-time 卡片,统一修正为"有 before-image 时是 contextual hunk,否则是整文件 diff,mutation 总会返回"。

e09852f5#705

修正另外三处 result-diff 注释到整文件情形

改动

packages/ui/acp/src/index.ts(toolResultUpdate JSDoc)、packages/ui/acp/tests/stream-update.spec.ts(空 diffs 测试注释)、packages/fs/tool-fs/src/diff.ts(diffsFromMeta JSDoc)。

目的

toolResultUpdate 的"emits applied-hunk blocks"注释、空 diffs 测试"空写返回 undefined"、diffsFromMeta 的"bad meta 无 diff card"都仅对 edit 成立;各自补上 write 的整文件 diff 回退。

5dfe0995#706

fix(fs):listDir 子项 key 在稳定父级下解析

改动

packages/fs/fs-local/src/fsio.ts 新增 resolveListedChildTarget(parent, name),在 displayPath 之下用 join(parent.displayPath, name) 解析子项 displayPath,同时从 resolveLocalTarget(parent.targetKey, name) 获取稳定的 targetKey;对应单测 fsio.spec.ts 增加 28 行。

目的

原实现用 resolveLocalTarget(target.displayPath, entry.name) 重新解析 displayPath,可能得到漂移的 targetKey;改为以父级稳定 targetKey 为锚,保证子项解析与父级一致。

f28cb6b1#707

合并 origin/master 到 fs-acp-policy-reject-snapshot

改动

合并提交,将 master 上新增的 web capability(packages/web/* 一整套 web/web-fetch-local/web-search-deepseek/exa/perplexity/tool-web)、对应文档与配置一并带入此分支。

目的

把分支与 master 同步,为后续 PR #128 提供最新基线。

97b5b550#708

合并 PR #128(fs-acp-policy-reject-snapshot)

改动

在 examples/acp-agent/tests/snapshots/fs-policy-reject/ 下新增 input.json、session.jsonl、stdout.golden.jsonl(共约 330 行)和 workspace/settings.txt,并在 acp.snapshot.ts 注册场景。

目的

为 fs-policy 拒绝卡片增加 ACP 全链路 snapshot 回放基线。

53ebf6fc#709

合并 origin/master 到 fs-acp-render-intent-union

改动

合并提交,与 f28cb6b1 同样把 web capability 全量引入此分支。

目的

render-intent union 分支与 master 同步,准备 PR #132。

ec05295a#710

docs:等权威配对 + sidecar 一致性记录

改动

重写 scripts/verify-translation-pairing.ts(203 行)、docs/i18n/README.md、docs/i18n/translation-rules.md 及其中文版、AGENTS.md、skill dsh-translate-docs/SKILL.md、RFC 2026-07-02-bilingual-docs-and-pairing-gate.md 与中文版,新增 .i18n.yaml sidecar、scripts/translation-pairing.manifest.json、scripts/verify-rfc-classification.ts 跳过 .zh.md。

目的

确立中英文都不是 canonical——一个文档对由 foo.md/foo.zh.md/foo.i18n.yaml 三兄弟构成,sidecar 记录两侧完整 git blob hash;任意一侧改动未经重新确认就变红,配对完整性由 union 锚点强制。

8ca82d03#711

refactor(tool-web):web 工具迁移到 render-intent union

改动

packages/web/tool-web/src/fetch.ts、src/search.ts、tests/tool-web.spec.ts。

目的

master 上的 web_search/web_fetch 仍基于旧的 ToolCallPresentation bag,迁移到 card-tagged 判别联合;两者都是简单 generic 卡片,显式声明 card:'generic'。

97de62a0#712

合并 PR #132(fs-acp-render-intent-union)

改动

packages/core/tools/src/index.ts、src/schema.ts、packages/ui/acp/src/index.ts(370 行重写)、packages/bash/tool-bash、packages/fs/tool-fs、packages/web/tool-web、packages/todo/tool-todo 以及 tools.md 文档、各 snapshot golden、RFC 2026-07-02-tool-render-intent-union.md。

目的

用 card-tagged 判别联合替换旧的 ToolCallPresentation bag 作为 tool-call presentation 的 render-intent 模型,新增 fs-terminal-card snapshot 场景。

9c6e09c0#713

合并 origin/master 到 fs-acp-applied-hunk-diffs

改动

合并提交,再次把 web capability 全量带入此分支。

目的

applied-hunk diffs 分支与 master 同步,准备 PR #135。

497ea15b#714

fix(acp):相对化 completed diff 卡片标题

改动

packages/ui/acp/src/index.ts(对 result diff 分支应用 displayTitle)、packages/ui/acp/tests/stream-update.spec.ts(26 行回归测试)、packages/fs/fs-local/src/index.ts、RFC 2026-07-02-result-time-applied-hunk-diffs.md(新增 TODO(overwrite-diff-bound))。

目的

result-time diff 卡片原样发送 view.title,对 workspace 内绝对路径会从相对化的 Edit src/b.ts 翻回绝对路径;对齐 call-side 卡片对 diff 路径调用 displayTitle。并把大文件覆盖为 UI diff 预读全文的内存成本记为有界后续。

5702f624#715

合并 PR #135(fs-acp-applied-hunk-diffs)

改动

新增 packages/fs/tool-fs/src/diff.ts(93 行)与测试,改 edit.ts/write.ts/read.ts、packages/fs/fs-local/src/fsio.ts/index.ts、packages/core/agent-loop/src/loop.ts、packages/core/session/src/{index,json,types}.ts、packages/core/tools/src/{index,schema}.ts、packages/ui/acp/src/index.ts,以及 RFC 与全套 fs snapshot golden。

目的

为 write/edit 增加 result-time applied-hunk diff 卡片——会话日志结构、工具 schema、ACP 桥渲染、agent-loop 都对应更新,snapshot 全量重录。

c699e948#716

docs(AGENTS):修正 review 意见——resume 异步、删除 stack-locked lessons

改动

AGENTS.md(+7 -10)。

目的

回应 #131 上 ds-review-bot 的意见:resume 是异步的(ctx.agents.resume/AgentLoop.resume 返回 Promise),原文称"both synchronous"错误;去锚定章节,删除与具体 PR/#118/ENOSVC 相关的引用,删除与既有 AGENTS.md 重复的 bullet,把幸存条目泛化为可迁移规则。

19db3aa2#717

合并 master 到 docs/i18n-translate-skill

改动

合并提交,把 master 上 web capability、render-intent union、result-time diffs、fs-policy snapshot 等全部带入 i18n 分支。

目的

i18n 翻译 skill 分支与 master 同步,准备 PR #133。

9e71c886#718

合并 PR #133(docs/i18n-translate-skill)

改动

新增 .agents/skills/dsh-translate-docs/SKILL.md、docs/i18n/{README,translation-rules,terminology}.{md,zh.md}、docs/development.zh.md、README.zh.md、README.i18n.yaml、docs/development.i18n.yaml、RFC 2026-07-02-bilingual-docs-and-pairing-gate.md 及中文版、scripts/verify-translation-pairing.ts、scripts/translation-pairing.manifest.json 等。

目的

落地双语文档契约、翻译 skill 与配对门——确立术语表、翻译规则、sidecar 一致性记录与 verify-translation-pairing 门。

4e70489c#719

docs(AGENTS):将章节收敛为主题,删除两处 Defensive-patterns 补充

改动

AGENTS.md(+2 -10)。

目的

bulleted lessons 与两处 Defensive-patterns 陷阱没有立足之地,把新章节压缩为一句核心——"门证明的是行执行,不是语义/文档准确性/测试是否守护了什么",删除 spawn-narrowing 与 AgentLoop.create-meta bullet。

539051b2#720

refactor(tools):把 render-intent 词汇搬到 presentation.ts

改动

新增 packages/core/tools/src/presentation.ts(206 行,承载 ToolCallView/ToolResultView、FileLocation、FileDiff、ToolCallKind),packages/core/tools/src/index.ts 瘦身 203 行仅保留 registry + execute waterfall,schema.ts 与 catalog/tools.md 对应更新。

目的

把 UI-facing 的 render-intent 词汇从 index.ts 拆出,presentation.ts 只依赖自身、不引用执行类型,index.ts 单向依赖 presentation.ts;公开面不变(index.ts 重新导出,消费方零改动),snapshot golden 不变。

fb78a844#721

docs(tools):修复跨模块 JSDoc 链接与 catalog 源文件清单

改动

packages/core/tools/src/presentation.ts(三处 {@link ToolDefinition...} 降级为纯代码文本)、docs/core-data-structures/tools.md(源文件清单补 presentation.ts)。

目的

Codex 复审发现 presentation.ts 故意不 import index.ts,TypeScript 无法解析 {@link ToolDefinition...};改为纯代码文本。tools.md 原只列 index.ts/schema.ts,补上现在承载 presentation 词汇的 presentation.ts。

74f61c89#722

test(hooks):CC + Codex hook 矩阵端到端 snapshot

改动

examples/acp-agent/cordis.{yml,snapshot.yml} 同时挂载 dsh-hooks-claude(./hooks.json)和 dsh-hooks-codex(./codex-hooks.json);新增 RFC 2026-07-04-hook-snapshot-matrix.md;按 hook 点 × 关键 Decision 结果(PreToolUse deny/ask、PostToolUse block/context、Stop force-continue、UserPromptSubmit block/context)新增 CC 与 Codex 两套 snapshot 场景与 golden。

目的

让全链路 snapshot 层能针对真实 app 跑两套 hook 方言;缺失配置文件为 silent no-op,故单场景只带自己需要的 hook 文件。SessionStart/SubagentStart(注入竞速)与 SubagentStop(零 transcript 痕迹)刻意排除。

ed022780#723

docs:README 改为 DeepSeek Harness SDK 品牌

改动

README.md、README.zh.md、README.i18n.yaml。

目的

把过时的 "DeepSeek Code" 改为正确产品名 "DeepSeek Harness SDK",并把 demo 命令更新为 SDK 形态(demo:agent、demo:acp)。

39cdb3ea#724

docs:补充翻译 review 指引

改动

.agents/skills/dsh-code-review/SKILL.md(+2 行)。

目的

在 code-review skill 的"必读"清单中加入 docs/i18n/translation-rules.md 与 terminology.md,并在"reviewer 重点"中加入"双语 docs:审翻译质量,不只审配对"一条,要求按术语表核对、待定术语走 待定术语 流程。

26f8d1b9#725

合并 PR #136(tool-presentation-submodule)

改动

合并 539051b2 + fb78a844——新增 packages/core/tools/src/presentation.ts、瘦身 index.ts、更新 schema.ts、tools.md 与 catalog。

目的

将 render-intent 词汇搬到独立 presentation.ts 子模块的 refactor 合入 master。

提交总结(g-29,共 25 个,从旧到新)25

bae8bf4990#726

publint 仅扫描真实包目录

改动

scripts/publint-all.ts 在遍历 packages/<group>/<pkg> 时增加一道过滤——只保留含 package.json 的子目录。

目的

跳过本地残留的空目录/非包目录,避免 publint 误报。

bf1966326e#727

合并 master 到 codex/fs-directory-listing

改动

将 origin/master 合入 codex/fs-directory-listing 特性分支(冲突涉及 docs/rfc/README.md、packages/fs/fs-local/src/index.ts);此合入带入大量 master 上已落地的改动(fs/web 能力、双语文档、tool presentation 拆分、ACP 快照等)。

目的

在合并 fs 目录列表特性之前,先把分支与主线对齐。

ca91d7c2da#728

工作区约束检查忽略本地产物

改动

scripts/check-workspace-constraints.ts 引入 localArtifactDirs = {'node_modules'} 集合,在包目录遍历与层级校验中跳过它,并要求目录存在 package.json 才视为包。

目的

让约束检查在存在 node_modules 等本地目录时仍能正常运行。

4cf2ade4ba#729

澄清顶层 demos 描述

改动

README.md/README.zh.md 及其 i18n 配置中关于顶层 demos 的措辞调整。

目的

让 README 中 demos 段落的表述更准确。

51640362b5#730

将 coding demo 更名为 repl

改动

跨 README、AGENTS.md、development 文档、examples/coding-agent(README/cordis.yml/package/e2e)、packages/ui/stdio-agent、根 package.json 等约 20 个文件,统一把 coding demo 叫法改为 "repl"。

目的

统一该示例的命名,避免 "coding" 与 "repl" 混用。

db885271ed#731

润色中文 README 摘要

改动

README.zh.md 开头一句由"是一个基于插件的 SDK,用于构建 agent harness"改为"是用于构建 agent harness 的 SDK,采取基于插件的设计",并同步 i18n 配对哈希。

目的

使中文摘要表达更自然。

571f5b383a#732

合并 master 到 docs/update-readme-for-sdk

改动

将 master 合入 docs/update-readme-for-sdk;顺带带入 master 上 packages/core/tools 的拆分(presentation.ts 从 index.ts 中抽出)及相关文档更新。

目的

在 SDK README 更新合入前与主线对齐。

43ab04d944#733

合并 PR #137(SDK README 刷新 + demo 命名)

改动

合入 docs/update-readme-for-sdk。聚合了前面若干文档改动(demos 澄清、coding→repl 重命名、publint 与约束脚本的小修),统一刷新 SDK README 与示例命名。

目的

把 SDK README 刷新与 demo 命名规范化一次性合入 master。

ecd5ca6ce6#734

再次合并 master 到 codex/fs-directory-listing

改动

PR #137 落地后,再次把 master 合入 codex/fs-directory-listing,带入上述 README/demo 命名与脚本改动。

目的

在 fs 目录列表特性 PR 合入前再次同步主线。

b735c766c6#735

合并 PR #134(fs 目录列表能力)

改动

合入 feat(fs): add directory listing seam。在 fs 能力缝中新增目录列举:fs/src/types.ts 加 directory listing 类型,fs-local 实现(fsio.ts/index.ts),更新 fs/tool-fs,补充 docs/core-data-structures/filesystem.md、catalog、RFC note 与测试。

目的

补齐文件系统能力中缺失的目录列举操作。

c5ed5ff490#736

合并 origin/master 到 worktree-hooks-a-taxonomy

改动

把 origin/master 合入 hooks 栈的 a 分支(冲突在 docs/rfc/README.md)。带入 master 上全部已落地内容:fs 能力全套(fs/fs-local/fs-policy/tool-fs)、web 能力全套(web/tool-web 及 deepseek/exa/perplexity 搜索 provider、fetch-local)、knip、tool-catalog 生成器、双语文档与翻译配对门禁等约 207 文件。

目的

让即将开始的 hooks 特性栈站在最新主线上。

89f3c484c1#737

合并 a-taxonomy 到 b-bash-seam

改动

把 worktree-hooks-a-taxonomy 合入 worktree-hooks-b-bash-seam(冲突在 docs/rfc/README.md 等);延续将 a 分支(含全部 master 内容)向前传递。

目的

stacked hooks PR 链中 b 分支继承 a 的基线。

955e8d2913#738

提出四项简化 RFC

改动

在 docs/rfc/proposed/simplification/ 下新增四份 RFC:drop-idle-registry-observation-surfaces、narrow-subagent-synchronous-collect、prune-bash-task-roster、remove-tool-schema-defaults;并在 docs/rfc/README.md 登记。

目的

记录一批待裁剪的冗余表面,作为后续简化 PR 的依据。

9033837081#739

合并 b-bash-seam 到 c-interception

改动

把 worktree-hooks-b-bash-seam 合入 worktree-hooks-c-interception(冲突在 docs/architecture.md、cordis-catalog、tools 文档/源码)。

目的

stacked hooks PR 链中 c 分支继承 b 基线。

92be2724bd#740

合并 c-interception 到 d-subagent

改动

把 worktree-hooks-c-interception 合入 worktree-hooks-d-subagent。

目的

stacked hooks PR 链中 d 分支继承 c 基线。

e13bbcb5d5#741

基于五域调研提出九项简化 RFC

改动

新增九份 RFC(drop-image-content-block、drop-inert-request-knobs、drop-web-providers-change-event、prune-dead-core-spine-surface、prune-producerless-vocabulary-variants、prune-unimplemented-subagent-vocabulary、prune-write-only-fs-surface、share-app-bin-boot-glue、trim-acp-bridge-unreachable-surface),并为既有的 generic-long-running-tool-runtime / discover-package-inventory / unify-agent-and-session-id 三份补充调研证据;共 13 文件。

目的

系统化记录 master 上"仅被测试/文档消费"的死面与可裁剪词汇,作为后续大扫除的依据。

7d69d759f6#742

合并 d-subagent 到 e-protocol

改动

把 worktree-hooks-d-subagent 合入 worktree-hooks-e-protocol(冲突在 docs/module-graph.md、pnpm-lock.yaml)。

目的

stacked hooks PR 链中 e 分支继承 d 基线。

38cd1a150c#743

合并 e-protocol 到 f-bridges

改动

把 worktree-hooks-e-protocol 合入 worktree-hooks-f-bridges(冲突在 acp-agent 的 cordis.snapshot.yml/cordis.yml)。

目的

stacked hooks PR 链中 f 分支继承 e 基线。

81c27bed36#744

合并 f-bridges 到 g-stream-chunk

改动

把 worktree-hooks-f-bridges 合入 worktree-hooks-g-stream-chunk(冲突在 docs/rfc/README.md)。

目的

stacked hooks PR 链中 g 分支继承 f 基线。

f63ca8f00f#745

合并 g-stream-chunk 到 h-retro

改动

把 worktree-hooks-g-stream-chunk 合入 worktree-hooks-h-retro。

目的

stacked hooks PR 链中 h 分支继承 g 基线。

1546c6060a#746

合并 h-retro 到 i-snapshots

改动

把 worktree-hooks-h-retro 合入 worktree-hooks-i-snapshots(至此 a→i 全栈基线对齐)。

目的

stacked hooks PR 链中 i 分支继承 h 基线,准备整体合入。

9389c5df19#747

根据 Codex review 修订 RFC 批次

改动

修正两处过度断言:prune-dead-core-spine-surface 中 runLoop 死面是"公共 re-export"而非函数本身(函数包内仍被 agent.ts 使用);generic-long-running-tool-runtime 中 BashTask.done 仅是"公共完成面单消费者"(包内 disposal 仍依赖它)。并把若干文档位点(pi-ai/compact-basic README、tools.md、type-equiv manifest、session-surface 等)纳入对应 RFC 的移除集。

目的

让 RFC 的证据陈述精确到事实,便于实现 PR 直接对照。

f04b25478e#748

校正 core-spine RFC 的验收标准并补 image 文档位点

改动

prune-dead-core-spine-surface 的验收标准从"三个表面只在本 RFC 出现"改为"runLoop/Inbox 保留为包内符号,仅移除公共 re-export";drop-image-content-block 再补 deepseek README 与 compact-basic 的 image 占位行。

目的

使验收标准与上一条对 runLoop 范围的更正保持一致。

cf550f3feb#749

合并 PR #138(hooks 能力栈)到简化 RFC sweep

改动

合入 hooks 特性栈(冲突在 docs/rfc/README.md)。新增 packages/hooks/hook-protocol(codec/events/matcher/merge/runner/types 线协议库)、hooks-claude 与 hooks-codex 两套 bridge;在 agent-loop 加拦截缝(pre/post-tool、prompt-submit、stop)与 cancellation/resume 改造,agent/tools/session 类型扩展;bash-local/tool-bash、subagent、ui-stdio、ACP 适配;配套大量 ACP hook 快照与 implemented/proposed RFC notes(约 171 文件)。

目的

把 Claude Code / Codex hook 桥接与 wire-protocol 能力一次性合入主线。

7774d427de#750

合并 worktree-hooks-i-snapshots 到简化 RFC 分支

改动

把 origin/worktree-hooks-i-snapshots 合入 worktree-simplification-rfcs-0704(冲突在 docs/rfc/README.md),内容即上一条 PR #138 的全套 hooks 改动。

目的

让"简化 RFC sweep"分支也拿到 hooks 栈的完整基线,便于后续基于最新代码继续裁剪。

提交总结(g-30,共 25 个,从旧到新)25

34ae0f9d#751

event-domain 语义 + 移除 step-boundary 镜像事件(hooks 栈 PR-A)

改动

agent-loop/loop.ts 与 agent/types.ts 的事件定义、ui-stdio/ui/acp 的消费逻辑,以及事件目录与 RFC 笔记(新增 event-domain-semantics、删除 remove-agent-boundary-mirror-events 的 proposed 版)

目的

合并 PR #118,按事件域语义重构事件总线,清除 turn/step 边界镜像事件,为后续 hooks 栈奠基

e8d01f68#752

将 origin/master 合并进 bash-seam 分支

改动

纯合并提交,无 diff

目的

在 worktree-hooks-b-bash-seam 上同步 master(PR #120 的前置 sync)

a935de73#753

bash executor 接口增加 stdin + 额外 env(hooks 栈 PR-B)

改动

bash-local/run.ts 的 executor 接口扩展 stdin 与 extraEnv 字段,bash/src/types.ts 暴露受信插件面,补充 docs/core-data-structures/bash.md 与测试

目的

合并 PR #120,为 hooks 进程的 stdin/env 注入提供统一 seam

152a8322#754

将 origin/master 合并进 interception 分支

改动

纯合并提交

目的

在 worktree-hooks-c-interception 上同步 master(PR #121 的前置 sync)

9cedc2d1#755

拦截 seam —— 面向 hooks 的 typed-Decision 面(hooks 栈 PR-C)

改动

tools/src/index.ts 新增 pre/post-execute 分发管线,agent-loop/loop.ts 接入拦截,agent/src/types.ts 与 session/types.ts 引入 Decision 类型;新增 interception-seams、pre-tool-input-rewrite 两个 RFC;同步大量文档

目的

合并 PR #121,建立工具调用前后的拦截点(deny/ask/rewrite),供 hooks 决策

f7412d74#756

将 origin/master 合并进 subagent 分支

改动

纯合并提交

目的

在 worktree-hooks-d-subagent 上同步 master(PR #122 的前置 sync)

2610fddf#757

丰富 subagent 生命周期事件(hooks 栈 PR-D)

改动

subagent/src/index.ts 在生命周期事件中追加 lastAssistantMessage 等观察字段,补充 service.spec.ts 与 RFC

目的

合并 PR #122,让 hooks 能观察子 agent 的最近助手消息(observe-only,原始 agentType 在 review 中被删除)

74c34d63#758

将 origin/master 合并进 protocol 分支

改动

纯合并提交

目的

在 worktree-hooks-e-protocol 上同步 master(PR #123 的前置 sync)

ff21a788#759

新增 dsh-hook-protocol 共享 wire-protocol 核心库(hooks 栈 PR-E)

改动

新建 packages/hooks/hook-protocol/ 包,含 codec/events/matcher/merge/runner/types 模块与完整测试;登记到 module-graph、tsconfig、pnpm-lock

目的

合并 PR #123,提供 Claude Code 与 Codex hooks 共用的 wire-protocol 核心库

536c208a#760

将 origin/master 合并进 bridges 分支

改动

纯合并提交

目的

在 worktree-hooks-f-bridges 上同步 master(PR #124 的前置 sync)

bffb209d#761

新增 dsh-hooks-claude + dsh-hooks-codex bridge(hooks 栈 PR-F)

改动

新建 hooks/hooks-claude 与 hooks/hooks-codex 两个 bridge 包(config + index + 覆盖性测试),在 examples/acp-agent 加入 hook-prompt-block 快照示例与 e2e

目的

合并 PR #124,基于 PR-E 的协议核心实现 Claude Code 与 Codex 的 hook 桥接

2e7688c9#762

将 origin/master 合并进 stream-chunk 分支

改动

纯合并提交

目的

在 worktree-hooks-g-stream-chunk 上同步 master(PR #129 的前置 sync)

6a8adf9c#763

移除 agent/stream-chunk 镜像事件(hooks 栈 PR-G)

改动

删除 agent/src/types.ts 的 stream-chunk 事件,ui-stdio 改走原始流,更新 architecture、事件目录与测试;新增 remove-stream-chunk-mirror RFC

目的

合并 PR #129,清理最后一批边界镜像事件,完成事件域收敛

4377fa98#764

将 origin/master 合并进 retro 分支

改动

纯合并提交

目的

在 worktree-hooks-h-retro 上同步 master(PR #131 的前置 sync)

5278ee3d#765

AGENTS 增补 "gates and judgment" 笔记

改动

仅 AGENTS.md +4 行

目的

合并 PR #131,把 hooks 栈过程中的「闸门与判断」经验沉淀进 AGENTS.md

9a0dda64#766

将 origin/master 合并进 snapshots 分支

改动

纯合并提交

目的

在 worktree-hooks-i-snapshots 上同步 master(PR #138 的前置 sync)

af584e5d#767

为 CC + Codex hook 矩阵补充端到端快照

改动

在 examples/acp-agent/tests/snapshots/ 下批量新增 hook-cc-* / hook-codex-* 的 input/session.jsonl/stdout.golden/hooks.json 快照(含一个空基线),更新 acp.snapshot.ts 与 cordis.snapshot.yml

目的

合并 PR #138,用真实可运行示例锁定 hooks 行为(pretool/posttool/promptsubmit/stop 各路径的 CC 与 Codex 方言)

95b9ac0d#768

docs: 刷新简化 RFC 扫描

改动

docs/rfc/README.md 与 docs/rfc/proposed/simplification/*(新增 generate-rfc-index-tables、fold-stdio-ui-helper、narrow-pre-tool-gate、trim-hook-protocol-surface;删除 prune-bash-task-roster;调整另两篇),并微调示例测试与 gen-cordis-catalog.ts

目的

基于已落地的 hooks 栈,刷新一轮简化类 RFC 提案

9ebc38ba#769

docs(rfc): 修订 hooks-栈 基线并新增三篇栈后 RFC

改动

重写九篇旧 RFC + 三篇补充,使其基于已合并的 PR #138 树核对;新增 remove-agent-steering-mirror、tighten-hook-protocol-contract、single-source-acp-replay-config 三篇

目的

把所有 RFC 的论据从「in-flight」改为「现状」,并扫描出栈后新暴露的简化机会

de108925#770

将 origin/master 合并进 simplification-rfcs-0704 分支

改动

纯合并提交

目的

在 worktree-simplification-rfcs-0704 上同步 master

e6418398#771

docs(rfc): 修正 Codex 轮评审意见 —— 无时间性表述 + 收窄 fs 验收

改动

调整 hook-protocol、steering、replay-config、subagent-vocabulary、vocabulary、fs 六篇 RFC

目的

把「刚落地/几天前/几周前」等相对时间措辞改为锚定已记录 RFC 的无时间性证据;fs RFC 的验收改为精确列出被移除的面而非笼统说「拼写消失」

8f0d9242#772

将 origin/master 合并进 codex/exhaustive-simplification-rfcs 分支

改动

纯合并提交

目的

在 codex/exhaustive-simplification-rfcs 上同步 master

76887628#773

将 codex/exhaustive-simplification-rfcs 合并进 simplification-rfcs-0704

改动

合并并解决 docs/rfc/README.md 冲突;带入 Codex 那轮并行的 RFC(drop-idle-registry-observation-surfaces、fold-stdio-ui-helper、narrow-pre-tool-gate、narrow-subagent-synchronous-collect、remove-tool-schema-defaults、trim-hook-protocol-surface、generate-rfc-index-tables)

目的

把 Codex 的并行简化扫描并入本分支,供后续按价值去重

d30f42dd#774

合并 origin/master 并刷新文档图

改动

大量文档同步——新增 filesystem.md、web.md、i18n 目录、development.zh.md、多张 docs/graphs/*、若干 implemented 架构笔记与 SKILL(dsh-translate-docs);AGENTS/README 也更新

目的

在合并 master 的同时,把能力 seam(fs/web)、工具管线、i18n 规则等文档图全部刷新到当前树

09f131f7#775

docs(rfc): 把 PR #139 的简化扫描并入本批

改动

docs/rfc/README.md 与若干 RFC(generate-rfc-index-tables 精简、drop-idle-registry-observation-surfaces 删除、pre-tool-input-rewrite 增注),逐条说明哪些条目被采纳、并入既有 owner、或不采纳及理由

目的

对 Codex 那轮并行扫描逐条去重并按本批证据标准重写,给出明确的 ported / consolidated / not-ported 决定

提交总结(g-31,共 25 个,从旧到新)25

3395d463fd#776

修正 fold-stdio/web RFC 的评审意见

改动

两份 simplification RFC 文档(fold-stdio-ui-helper、drop-unconsumed-web-observation-surface)小幅修订。

目的

修正 fold-round 评审发现——fold-stdio RFC 关于"唯一非运行时引用"的说法应限定到运行时导入者普查,机械引用(module graph、tsconfig)并入更新清单;web RFC 的 status-caller 表述改为"web 包自有测试"。

aa36b3b36b#777

引入文档分层、预算与 ceiling gate

改动

新增 docs/AGENTS.md 文档标准(tier 分类、目标字数预算、slop 检查清单);新增 verify-doc-budgets 脚本及 manifest 加入 doc-sync;新增 dsh-doc-standards skill;新增决策 RFC。

目的

常驻文档随每个 PR 堆积段落而无人收紧(AGENTS.md 50 提交涨到 8130 词,同一规则被重复两三次),建立反向约束力。Gate 首次就抓到标准自身超标(1057>1000),压缩到 984 词发布。

fa139c88b7#778

驳回 prune-unimplemented-subagent-vocabulary RFC

改动

将该 RFC 从 proposed/ 移到 rejected/,更新 README 行。

目的

维护者决定——subagent seam 未实现的 capability 词表(outputSchema/structured、toolFilter、sendMessage/resume)是故意预留的,seam 提前公布完整契约让 provider/consumer 成长到稳定形状,不应裁剪。consumer-evidence 分析作为当前未实现面的事实记录保留。

049e04f4a2#779

Merge PR #140:简化 RFC 提案批次

改动

合并 worktree-simplification-rfcs-0704 分支,新增约 16 份 simplification/testing RFC 提案及若干小改动(acp e2e 测试、catalog 脚本)。

目的

一次性提出裁剪死代码面、speculative capabilities、重复脚手架的提案批次,作为后续重构工作的输入。

7702a33531#780

重写根 AGENTS.md 至 1500 词预算

改动

根 AGENTS.md 从 ~8130 词压缩到 1495 词;situational 规则外迁到 docs/testing.md、docs/defensive-patterns.md、docs/cookbook/responding-to-pr-review-on-a-stack.md;packages/README.md 砍到 600 词;packages/AGENTS.md 降到 450 词;预算 manifest 同步 rattset。

目的

把文档标准应用到最大的违规者——每条规则保留 1-3 行加链接,去掉故事、重复表述、再叙述。

65690d8cf1#781

修正 doc-budgets 的 Codex 评审意见

改动

doc-budgets.manifest.json 中每个文档冻结到精确当前 wc -w 计数(去掉与"冻结"说法矛盾的余量);verify-doc-budgets 的 --list 模式对缺失文件/非法 ceiling 渲染 MISS/BAD 行。

目的

让初始冻结与文档化策略一致——ceiling 从文档当前大小起,报告模式不再漏报。

65f28580f0#782

Merge a-standard 到 b-agents

改动

将 worktree-docs-overhaul-a-standard 合入 worktree-docs-overhaul-b-agents,冲突在 doc-budgets.manifest.json。

目的

worktree 栈的前两段合并,推进文档改造工作链。

6227cfd03d#783

重写 architecture.md 至 1800 词预算

改动

docs/architecture.md 从 3897 词压到 1797 词;seam 叙述压缩并链接到 RFC/type-catalog;MVP feature→mechanism 检查表搬到 extension-cookbook;layering 图改为按家族描述而非枚举包;预算 ratchet。

目的

architecture.md 是行为地图(分层、服务图、seam 模式、loop),其他细节都让位给各自归属的 tier。循环伪代码、三个外部引用锚点、文件名保持不变。

5f21d4bf6c#784

在 AGENTS.md 的 doc-sync 枚举中加入 verify-doc-budgets

改动

AGENTS.md 中两处 doc-sync 链枚举补上 verify-doc-budgets;冻结 ceiling 重记录精确新计数(8134)。

目的

gate 在本 PR 加入 doc-sync 链,根文件的两处链枚举必须同步点名,避免遗漏。

5611f772b1#785

从目录树生成 RFC 索引表

改动

新增 scripts/rfc-index.ts(walker + renderer)、gen-rfc-index.ts(写入 CLI);重写 verify-rfc-classification.ts 使其断言提交区与新鲜渲染字节一致;docs/rfc/README.md 的生命周期表改为由 marker 间生成;RFC 移到 implemented/。

目的

每波提案都要编辑、每个并发分支都会冲突的 RFC 索引区,变成从磁盘派生的状态。H1 标题成为标题来源(load-bearing)。

b11f6ca0a4#786

Merge a-standard 到 b-agents(再次)

改动

再次将 worktree-docs-overhaul-a-standard 合入 worktree-docs-overhaul-b-agents,冲突在 AGENTS.md 和 doc-budgets.manifest.json。

目的

worktree 栈合并,同步 a 段后续变更。

fa816b866b#787

Merge b-agents 到 c-architecture

改动

将 worktree-docs-overhaul-b-agents 合入 worktree-docs-overhaul-c-architecture。

目的

worktree 栈第二段合入第三段。

5477d5fb5b#788

rfc-index 模块内部不导出

改动

scripts/rfc-index.ts 把 walker/renderer 内部(closed set、heading/marker helper、per-lifecycle renderer)改为不导出。

目的

满足 knip——这些内部无外部引用者,公共面只有 rfcRoot、walkRfcTree、spliceReadme 三个被 CLI 和 gate 消费的名字。

226a8b5e4c#789

强化 RFC 索引 gate 所声称的不变量

改动

scripts/rfc-index.ts 加三条强制(生成区必须直接位于其 ## {Lifecycle} 标题下;lifecycle 集合是 closed,未知目录报结构错;index-shaped 表行不得手工链接到生成区外的 lifecycle 文件夹)。每条先有失败探针证明再修复。

目的

补齐 Codex 评审发现的三处文档契约与实际强制之间的缺口。

c3424e5487#790

修正 AGENTS.md 重写的 Codex 评审第一轮

改动

恢复被重写丢掉的通用 JSDoc 规则;重指 6 处遗漏的已迁移内容引用(agent-loop、acp、Exa e2e、real-api-e2e RFC 等);修 docs/testing.md 两处夸大;位移裁剪保持根 AGENTS.md 在 1498/1500。

目的

补齐 AGENTS.md 重写引入的规则丢失与失效引用。

5c6c0a34c9#791

Merge b-agents 到 c-architecture(带评审修正)

改动

将 worktree-docs-overhaul-b-agents 合入 worktree-docs-overhaul-c-architecture,带入上一条 AGENTS.md 评审修正。

目的

把第一轮评审修正并入 architecture 段。

c6d2eeea6b#792

移除 agent/steering 镜像事件

改动

删除 agent/steering 事件声明(dsh-agent types + JSDoc + README)、drainSteering 中的 emit(连带 ctx 参数)、loop.ts 与 architecture.md 的伪代码 emit 行;重生成 cordis catalog;回归测试改为在持久 steering/message 事件上断言 source 保留;RFC 移到 implemented/ 并修订三份曾声称保留的 implemented RFC。

目的

agent/steering 是最后一个持久会话事件的瞬态镜像——drainSteering 先 append 持久事件、下一行又 emit 同一事实,零生产监听者(所有 steering 消费者读持久事件),属于该删的冗余面。

e64623ebfd#793

裁剪 fs seam 的只写字段与死路由旋钮

改动

dsh-fs-local 删除未被读取的 STREAM_MIN_SIZE/streamMinSize 旋钮;FsTarget.inputPath、FsEditOutcome.replacements/.replaceAll、FileReadOutcome.limit/.version 删除;后端、测试 fake、文档随之收缩;RFC 移到 implemented/ 并按 shipped 形态修订(FsEditSpec→FsEditRequest)。

目的

fs seam 拆分后残留 4 处每次调用都填充却无人读的面,后端减少 4 项捏造义务、不新增任何。发射文本两分支都不变(无快照扰动)。

205f7cd04d#794

将 stdio UI helper 折入 stdio app

改动

删除 packages/support/ui-stdio 包;createStdioChat、StdioRuntime 测试缝、两个单测原样移到 packages/ui/stdio-agent/src/stdio-chat.ts;导入改本地路径;manifest/module-graph/tsconfig/lockfile 收缩;RFC 移到 implemented/。

目的

readline UI 本就住在 dsh-stdio-agent 内作为 in-package 的 stdio-chat 模块,app 前门永远只挂这个 UI、无他人复用,独立包边界只带来 manifest/tsconfig/README/publint 负担且不可独立替换——产品 app 也不应依赖标注为非产品面的 support 包。

de79553d4f#795

移除 web 的未被消费 observation 面

改动

删除 web/providers-change 事件声明与两处 emit、回滚先于 emit 的机制(保留普通 ctx.effect disposer);删除 searchStatus()/fetchStatus()/resolveStatus()/WebCapabilityStatus;保留 provider-private status();所有事件/状态断言改写为调用方可观察行为(成功的 search/fetch 或结构化 WEB_* 错误码);重生成 catalog;更新 web/tool-web README、architecture.md、core-data-structures/web.md、type-equiv manifest;修订 web seam RFC。

目的

WebService 暴露的 observation 面无人观察——事件声明后被 emit 但无生产监听者,聚合状态查询的 README 描述已与调用点漂移。遵循 llm/adapter-change 先例:boot-time 后端注册信号与可用性探针属于 keep/cut 判据的 cut 侧。

26339144e3#796

修正 Codex 评审第二轮——重指所有遗漏的迁移策略引用

改动

最终扫描(packages/、docs/、examples/、scripts/ 中所有 AGENTS.md 提及)发现 13 处迁移策略引用 + 2 处从未存在的引用:with-key 注释、real-over-mock 注释、defensive-pattern 引用重指;md-tier 重指若干 RFC/cookbook/postmortem;删除两处伪归属(tool-todo、bash-stdin-env RFC),改为自洽推理。

目的

把 AGENTS.md 重写导致的策略迁移波及的所有失效引用一次性扫净。附记 ui-stdio readline TTY spec 在重载机器上 flake(本栈未触及)。

cd49670f4e#797

收紧 hook-protocol 契约面

改动

实现 tighten-hook-protocol-contract RFC:HookDialect 收窄为 'claude'|'codex'(删除无生产者的 native);删 HookOutput.suppressOutput;删 hook/result.durationMs(连带 runHook 的注入 now clock 和单字段 wrapper,直接返回 HookOutput);defaultTimeoutMs 双默认旋钮改为 lib 导出的 DEFAULT_HOOK_TIMEOUT_MS 常量;HookResultRecord 承载解码后 HookOutput,appendHookResult 派生 decision 与 stderrSummary,两桥删除字节相同的私有副本;BLOCKING_EXIT_CODE 回归 codec-internal。提交的 hook 快照机械剥离 durationMs 字段;修订两份 RFC、session.md 事件表、lib/bridge README;新增 lib 层派生规则覆盖。

目的

删除无读者的协议字段与重复逻辑,把语义集中到声明事件的 lib,保持快照派生值不变。

4036300353#798

裁剪 acp 桥不可达面(branding 旋钮、kind 嗅探回退)

改动

删除 AcpConfig.agentName/agentVersion(cordis.yml 永远只能传 {model, systemPrompt},仅单测可达)及 schema 默认、?? 回退、TODO(double-default),在 initialize 处硬编码 agentInfo(握手 wire 值字节不变);toolKindFor 的 bash*/read*/write/edit* 名字嗅探回退改为中性 kind 'other',因违反"桥不针对工具名特例"的设计规则;触及一份 golden(hook-codex-posttool-block 的 3 个 kind cell 由 execute→other);空参数分支单独 pin;RFC 移到 implemented/ 并修订(fallback 可达性含 schema 非法参数)。

目的

两块 dsh-acp 面从任何已发布 config 都不可达——branding 旋钮无法由叶子 cordis.yml 设置,kind 嗅探违反桥自身设计规则。

71944ef1f8#799

Merge b-agents 到 c-architecture(带第二轮评审修正)

改动

将 worktree-docs-overhaul-b-agents 合入 worktree-docs-overhaul-c-architecture,带入 26339144e3 的第二轮评审修正。

目的

把第二轮评审修正并入 architecture 段。

74261b0e21#800

完成 web seam RFC 的 status 层描述修订

改动

docs/rfc/implemented/architecture/2026-06-24-web-capability-seam.md 一行修订。

目的

包拓扑段落仍把 ctx.web 描述为"带一层小的 selection-status 层",与已 shipped 面(无聚合状态查询、执行时 WebError 解释选择失败)矛盾,改为说明当前形态:两种 capability kind 与一个更丰富的、失败由抛错解释的选择策略。

提交总结(g-32,共 25 个,从旧到新)25

e9589b523f#801

文档评审修复:support-group 汇总行与 smoke-prose 导出形态说法

改动

packages/README.md(更正 support 组描述)、keyless-smoke.e2e.ts/echo.e2e.ts(去掉对 smoke 守护导出形态的错误说法)、一条 simplification note。

目的

纠正评审指出的事实错误——无 inject 的 smoke 只证明组合树能启动,真正的导出形态由 stdio-agent 单测的 unwrapExports 断言锁定。

b049aa7a8a#802

从 hook-protocol-lib RFC 中删去 change-unit 引用

改动

docs/rfc/implemented/feature/2026-06-30-hook-protocol-lib.md 单行修改。

目的

Execution 条目原引用了一个读者在当前树上无法看到的 "bash-seam PR",改为陈述固定事实,与 runner 模块文档措辞一致。

e5120d2193#803

文档评审第 3 轮:最后三处迁移策略引用

改动

vitest.config.ts(覆盖率注释指向 docs/testing.md 与 quality-gates RFC)、packages/ui/acp/tests/bridge.spec.ts(资源所有权注释)、postmortem 0001 汇总。

目的

把迁出 AGENTS.md 的策略规则引用更新到正确归宿(docs/testing.md、quality-gates RFC、packages/AGENTS.md)。

e38fa91638#804

合并 worktree-docs-overhaul-b-agents 到 c-architecture

改动

将 b-agents 分支并入 worktree-docs-overhaul-c-architecture,仅带入上面那条评审修复的三处文件改动。

目的

把文档修订的 b-agents 工作同步到 c-architecture 重写分支。

6df70c2079#805

修复 stdio 模块两处相同的 smoke-vs-shape 说法

改动

packages/ui/stdio-agent/src/index.ts 模块文档、stdio-agent.spec.ts 测试文档。

目的

将此前已在他处更正的 "smoke 守护导出形态" 说法同步修正:无 inject 的 smoke 只证明组合树可运行,形态由单测 unwrapExports 断言锁定。

c4d637300d#806

架构重写的 Codex 评审修复

改动

docs/core-data-structures/session.md(补全 TurnEndReasonMap 优先级规则——max-tokens 仅在 completed 之上,disposed/aborted/error 更优先)、docs/cookbook/extension-cookbook.md(澄清 compaction 行——目前是手动触发,未发布模型可见工具)。

目的

修正架构重写文档中两处不完整/误导的事实描述。

4a0941fb4b#807

feat(ui): 将 app bin 启动胶水收敛到 @deepseek-ai/dsh-app-boot

改动

新建 packages/ui/app-boot 包(src/index.ts 的 loadEnv/installFailLoud/assertEntriesLoaded/boot 四个公共帮助器);acp-agent/src/bin.ts 与 stdio-agent/src/bin.ts 瘦身为自执行组合 + 应用特有生命周期;新增 app-boot 单测覆盖所有分支;新增 RFC 实现 note 并更新 AGENTS.md、module-graph、tsconfig;同步更新 built-bin smoke(改用 symlink ui/app-boot)。

目的

消除两个发布 bin 中近重复的启动样板,使每个分支纳入 per-file 100% 覆盖门;实现 2026-07-04 share-app-bin-boot-glue RFC。

64ba09fda6#808

文档修复:e2e 层不只限于 DeepSeek

改动

docs/testing.md 单行。

目的

澄清 real-API 层按各 provider 的 key 各自 self-skip(EXA_API_KEY、PERPLEXITY_API_KEY 等),仅有 DEEPSEEK_API_KEY 的运行并未覆盖其它 provider smoke。

860a774b5a#809

合并 worktree-docs-overhaul-b-agents 到 c-architecture

改动

并入 b-agents 分支,仅带入上一条 testing.md 修复。

目的

把 b-agents 的文档修复同步到 c-architecture 重写分支。

4aaf7d848c#810

app-boot 文档评审修复:退出语义精确化、依赖行、组合措辞

改动

packages/ui/app-boot/src/index.ts(精确化两处 guard 覆盖的失败类——只有 failed-IMPORT 才会原本退出 0)、packages/README.md 依赖行(loader/include,include 为 peer)、packages/ui/app-boot/README.md(bin 是自执行组合而非 main 包装)。

目的

修正 app-boot 模块/README 文档中的过强说法与措辞,与代码实际语义对齐。

695e64a978#811

fix(stdio-agent): 声明被迁移 spec 用到的 dsh-llm 依赖

改动

packages/ui/stdio-agent/package.json 增 peer+dev 依赖 @deepseek-ai/dsh-llm,pnpm-lock.yaml 同步。

目的

stdio-chat.spec.ts 通过 import ContentBlock/StreamChunk 类型用到了 dsh-llm,而该 manifest 项此前留在被折叠的包上未随测试迁移——补齐缺失依赖。

6fc33da960#812

重新生成 dsh-llm 依赖边的 module graph 与依赖行

改动

docs/module-graph.md、packages/README.md。

目的

把上一条新增的 dsh-llm 依赖边同步到自动生成的模块图与依赖表中。

cada16c701#813

文档:预算上限至少保留 5% 工作余量

改动

四处策略归宿(docs/AGENTS.md § Budgets、doc-tiers RFC、verify-doc-budgets.ts 模块注释、dsh-doc-standards skill 的 ratchet 规则)+ scripts/doc-budgets.manifest.json 限值 + verify-doc-budgets.ts 实现。

目的

精确尺寸上限让每个两词措辞修订都触发门;改为上限至少高于当前尺寸 5%,使常规编辑通过、真正增长仍触发。

d5a3e2c492#814

合并 origin/simpl-b1-fold-ui-stdio 到 simpl-b2-app-boot

改动

合并 simpl-b1 分支(fold-stdio-ui 相关:module-graph、packages/README、stdio-agent package.json、pnpm-lock),有冲突并已解决。

目的

把 simpl-b1 的 stdio UI 折叠工作并入 simpl-b2 app-boot 分支以同步基础。

2745879132#815

refactor(llm): 删除无生产者路径的 image content block

改动

从 packages/llm/llm/src/types.ts 移除 ImageBlock 及其 ContentBlockMap 项(连带 cache?: CacheHint 字段随之移除);compact-basic 删除图片 85-token 估算与占位分支(由 default 分支吸收);deepseek serializer、pi-ai converter、ACP codec 仅改注释;删除/重定向 pinning 已删分支的测试;更新文档并把 content-block-vocabulary RFC 移到 implemented/。

目的

ImageBlock 没有生产者,所有 consumer 都丢弃它(serializer 跳过、converter 跳过、ACP 不声明 image 能力、compact 只占位),构造出的块在 wire 上静默消失——这正是 defensive patterns 警告的静默数据丢失形态;真正的多模态特性将来应通过 declaration merging 连同 adapter 映射、ACP 声明、compact 定价一起引入。

d6f280c19b#816

合并 worktree-docs-overhaul-a-standard 到 b-agents

改动

合并 a-standard 分支(doc 预算策略),冲突在 docs/AGENTS.md、doc-tiers RFC、doc-budgets.manifest.json,已解决。

目的

把 a-standard(文档分级与预算门)的工作并入 b-agents。

4ce702f9f9#817

合并 worktree-docs-overhaul-b-agents 到 c-architecture

改动

合并 b-agents 到 c-architecture,冲突在 doc-budgets.manifest.json,已解决。

目的

把 b-agents 的文档修订同步到 c-architecture 重写分支。

5a450af738#818

test(acp): 从 live config 派生回放配置

改动

examples/acp-agent/cordis.snapshot.yml 从 125 行手写镜像缩减为 26 行声明式 overlay(单个 entry 通过 @cordisjs/plugin-include 装载 ./cordis.yml,按 id disable llm-deepseek 并 insert llm-replay);新增 RFC 实现 note 并修订相关 RFC 的事实陈述。

目的

回放 tier 现在精确测试生产树(应用形态变更只落一处),消除手写镜像带来的静默漂移风险;所有 snapshot 场景输出字节不变。

bee8132a7f#819

新增 no-hardcoded-tunables 约定与对应的 review 检查

改动

AGENTS.md § Conventions 新增规则条目,.agents/skills/dsh-code-review/SKILL.md 新增对应 reviewer-only 检查。

目的

明确两个部署可能想设不同值的数字/字符串(超时、grace、输出上限、结果数、模型名、base URL)应作为插件 schemastery Config 字段、以默认值交付;DEFAULT_* 常量或测试注入缝不算可配置。协议/wire/语义常量、外部规格固定值、安全不变量保持硬编码。无可机械检测的门,故作为代码评审检查。

774d460889#820

将审计出的硬编码 tunables 暴露为插件 config

改动

扫遍 packages/*/*,为每个新约定违例添加带默认值与校验的 Config 字段——tool-fs(readLimit/readMaxLineLength/readMaxBytes/readStreamMinSize)、tool-web(searchMaxResults,修 GREP_LIMIT 误引)、bash-local(graceMs,移除 RunInternals 测试缝)、subagent-acp(disposeEofGraceMs/disposeGraceMs)、session-persistence-sqlite(journalMode 默认 WAL)、hooks-claude/codex(stderrSummaryMaxChars,合并重复 summarize 到 hook-protocol)、compact-basic(charsPerToken 默认 4)、fs-local(删死代码 STREAM_MIN_SIZE/FsIoInternals.streamMinSize);每字段加范围校验、README 行、覆盖配置行为/schema 默认/加载时拒绝的测试。

目的

执行新增的 no-hardcoded-tunables 约定;默认值全部等于原硬编码值,所以无部署或 golden 变化。

3567d000c4#821

refactor(vocab): 删除无生产者的词汇变体

改动

packages/llm/llm/src/types.ts(删 CacheHint 及 TextBlock/ToolResultBlock 的 cache? 字段——DeepSeek prompt caching 自动,hints 只 map OUT 不 map IN)、packages/core/session/src/types.ts(删 MessageSourceMap.agent)、TurnTriggerMap.continuation(loop 结构上无法发射,其唯一写入是 llm-replay 测试 fixture,改用 injection trigger);更新 core.md/session.md 的类型粘贴,把 content-block vocabulary RFC 移到 implemented/ 并修正 cache-hints 后果行。

目的

通过 declaration merging 增长的词汇表准入策略是"变体与其首个发射者同时落地"——这三项既无生产者也无消费者,删除无副作用的死代码,等将来有真实生产者时再通过同样的 merge 扩展地图加回。

9db3ce7313#822

test(acp): 断言 patch 目标名;记录 overlay 真实失败模式

改动

examples/acp-agent/cordis.snapshot.yml(disable patch 加 name: dsh-llm-deepseek 断言)、single-source-acp-replay-config RFC 修正措辞。

目的

Codex 评审通过子进程 probe 指出 RFC 过度声称——id rename 并非 fail-loud(skipped patch 的 warning 需 logger 而回放 app 故意没有,最终在 fiber 内失败且不触达 unhandled-rejection guard)。改为对 patch 名字做断言(复用 id 不会 disable 错插件),RFC 记录诚实残留:id rename 退化为 config rot 但回放输出仍正确(llm-replay 拥有 stream 短路)。

b3e3157ccb#823

合并 PR #142:文档分级、预算与上限门

改动

合并 worktree-docs-overhaul-a-standard 分支——新增 dsh-doc-standards skill、docs/AGENTS.md 文档分级与预算章节、verify-doc-budgets.ts 门 + doc-budgets.manifest.json、doc-tiers-and-budgets RFC。

目的

建立文档分层(tiers)、字数预算与机械执行的上限门,作为根 AGENTS.md 重写的前置基础。

c073a3bd61#824

合并 origin/master 到 worktree-docs-overhaul-b-agents

改动

把 master 同步到 b-agents,带来一批 RFC index 条目、新增 RFC 文件(drop-image、fold-stdio-ui-helper、prune-producerless-vocabulary、share-app-bin-boot-glue、single-source-acp-replay-config 等)、以及 gen-cordis-catalog.ts 与若干 e2e/snapshot 测试小改。

目的

让 b-agents 分支与 master 上的最新 RFC 与 catalog 变更同步,避免后续合并冲突。

8768373345#825

合并 PR #143:将根 AGENTS.md 重写到 1500 词预算,簇内容迁回各自归宿

改动

合并 worktree-docs-overhaul-b-agents——根 AGENTS.md 从 ~333 行大幅缩减到预算内、packages/README.md 缩减 113 行、docs/testing.md/docs/defensive-patterns.md/docs/cookbook/responding-to-pr-review-on-a-stack.md 新增章节吸收迁出内容、多处 packages 与 RFC 引用同步更新、doc-budgets manifest 与 vitest.config 同步。

目的

按新文档分级把根 AGENTS.md 收敛到 1500 词预算,把成簇的细则迁到各自的文档归宿,建立 one-home-per-fact 的文档结构。

提交总结(g-33,共 25 个,从旧到新)25

6c68b62ede#826

合并主干到 docs-overhaul 分支

改动

将 origin/master 合并进 worktree-docs-overhaul-c-architecture;带入 docs/rfc/README.md 索引更新、一批 2026-07-04 新 RFC 草案(drop-image、drop-inert-request-knobs、prune-write-only-fs-surface、prune-producerless-vocabulary 等)、gen-cordis-catalog 微调及 acp-agent 测试快照。

目的

让文档大修分支跟上主干,避免后续冲突。

734ffcc8a2#827

合并 PR #144:重写 architecture.md 至 1800 字预算

改动

合并 PR #144,将 docs/architecture.md 压缩重写到 1800 字预算内,把功能映射移入 cookbook;调整 doc-budgets.manifest.json、session 数据结构文档与一条已实现 RFC 标注。

目的

让架构文档聚焦核心,符合文档分层与字数预算。

75b97e7463#828

pruned-vocabulary RFC 改写为现行事实

改动

把已实现的 prune-producerless-vocabulary RFC 的 Decision/Risks 段落从"相对补丁的描述"改写为"既存真相";同时误带入一份 verdict 临时文件。

目的

已实现 RFC 应表述为当前事实而非改动叙述。

2825aa6fdc#829

删除遗留的评审草稿文件

改动

删除根目录 verdict(18 行),即上一提交被 git add 误带入的评审工作笔记。

目的

清理误入库的临时草稿。

48d25cdd44#830

修复评审发现:校验与文档缺口

改动

hooks-claude/codex 为 stderrSummaryMaxChars 增加正整数校验(apply() 顶部,加载期即报错)+ 拒绝测试;tool-fs 四个读上限改为正整数;修正 tool-web README、compact-basic README/RFC 中 charsPerToken 的文档漂移;subagent-acp 补 provider 路径下贯穿 plugin config 的 trap-escalation 测试。

目的

补齐评审发现的校验、文档与测试缺口。

7e6edb7474#831

合并主干到 app-attribution-rfc 分支

改动

将 origin/master 合并进 codex/app-attribution-rfc;带入大量既有改动(hooks、fs、subagent、compact、web、ui 等包、示例快照与 bilingual 文档体系),解决 docs/rfc/README.md 冲突。

目的

让 app-attribution RFC 分支跟上主干。

0ebb86e70f#832

实现强制 app-attribution 请求头(RFC)

改动

dsh-llm 新增 attribution.ts(AppIdentity + userAgent + attributionHeaders,OpenRouter 为闭集 AttributionTarget 之一);llm-deepseek 在 fetch 头、llm-pi-ai 通过 StreamOptions.headers 发送;由显式 attributionTarget 配置驱动(不从 baseURL 推断),mock-server 断言头部到达;RFC 移至 implemented/ 并补定 identity 与 OpenRouter 决策。

目的

满足上游对应用归属标识的强制要求。

cc15ef54ef#833

同步概览 README 中残留的 chars-per-token 措辞

改动

修正 packages/README.md(两处)、compact 组与接口 README、compact-basic package.json description 中仍把估算器描述为 char/4 的措辞,统一为 charsPerToken 默认值。

目的

消除概览文档与实际实现间的措辞漂移。

3da966a52a#834

合并主干到 plugin-config-guideline 分支

改动

将 origin/master(含 #142–#144 文档大修栈)合并进 worktree-plugin-config-guideline;AGENTS.md 取主干重写版并把"禁止硬编码调参"作为一条简洁要点重新加入;dsh-code-review SKILL.md 取主干引用并叠加 tunables 检查;packages/README.md 取主干生成的模块图指针。

目的

让"插件配置准则"分支跟上主干并解决冲突。

ac42c46a65#835

合并 master 到 app-attribution-rfc 分支

改动

将 master 合并进 codex/app-attribution-rfc(再次传播 #142–#144 文档大修栈)。

目的

app-attribution 分支二次跟上主干。

5a8234643a#836

删除 LLM 闲置请求旋钮 prefill 与 strict

改动

端到端移除 GenerateOptions.prefill(无生产 setter,两适配器均抛 UNSUPPORTED)与 ToolSchema.strict(贯穿 defineTool/schemas/双适配器/catalog 但无工具使用);删除词汇、适配器分支、测试与文档;pi-ai 仍无条件清除 strict:false 以保持连线一致;RFC 移至 implemented/,更新 content-block RFC 后果记录。

目的

清理无生产者的死代码,留待真正生产者回归。

a29bbe1453#837

为 cordis 接口增加 JSDoc 完整性门禁

改动

gen-cordis-catalog 在事件缺描述/缺 payload @param、服务方法缺 JSDoc/@param/@returns/返回类型时聚合硬报错;this receiver 与 waterfall next 豁免;parseJsdoc 在首个块标签处截断;补齐约 139 处缺口(15 个 surface 文件),扩展负路径测试与一条 implemented process RFC,更新 AGENTS.md。

目的

把 cordis 接口的 JSDoc 完整性纳入 CI/doc-sync 门禁。

d752eed88b#838

为剩余门禁分支补聚焦测试

改动

为上一提交遗漏的绑定模式 guard(事件+服务)、service 无 prose 分支、空 @param/@returns 描述分支补 5 个聚焦测试 fixture。

目的

让生成器每个违规分支都有对应测试。

63ce39ae10#839

合并 PR #159:JSDoc 完整性门禁

改动

合并 PR #159(worktree-jsdoc-completeness-gate),引入上一条 JSDoc 完整性门禁;涉及 bash、compact、core(agent/session/system-prompt/tools/agent-loop)、fs、llm、session-persistence、subagent、web 等 surface 的 JSDoc 补全与 gen-cordis-catalog 强化。

目的

将 JSDoc 完整性门禁并入主干。

d67836f0d3#840

合并主干到 plugin-config-guideline 分支

改动

再次将 origin/master(含 #159 JSDoc 门禁)合并进 worktree-plugin-config-guideline。

目的

让"插件配置准则"分支跟上主干。

3a66b336a2#841

合并主干到 simpl-0-rfc-index 分支

改动

将 origin/master 合并进 simpl-0-rfc-index(解决 AGENTS.md、docs/rfc/README.md 冲突)。

目的

RFC 索引生成分支跟上主干。

6c7bbe0e6a#842

合并 PR #145:从目录树生成 RFC 索引表

改动

合并 PR #145,新增 gen-rfc-index 脚本从目录树自动生成 RFC 索引表,重写 docs/rfc/README.md,精简 verify-rfc-classification;development 文档补一行并新增 RFC 记录。

目的

用生成器替代手维护的 RFC 索引表。

0c5eadf9de#843

合并主干到 plugin-config-guideline 分支

改动

将 origin/master(含 #145 RFC 索引生成)合并进 worktree-plugin-config-guideline。

目的

让分支继续跟上主干。

ef86a36ef6#844

合并主干到 simpl-b1-fold-ui-stdio 分支

改动

将 origin/master 合并进 simpl-b1-fold-ui-stdio(解决 AGENTS.md、packages/README.md 冲突)。

目的

fold-ui-stdio 简化分支跟上主干。

f5774a2a26#845

feat(i18n):新文档须双语合并 —— requiredSince 日期前沿

改动

翻译配对门禁新增"日期前沿"规则——文件名日期在 manifest 的 requiredSince(2026-07-05)及之后的 RFC 必须双语配对合并,2026-07-04 那批被 grandfather 进批量待办;日期取自文件名(纯内容判定,不依赖 git 历史);更新 verify-translation-pairing、manifest 与 i18n README/RFC 中英文。

目的

防止新文档扩大翻译积压,使新文档自诞生即双语。

c2c13529cd#846

合并 PR #156:插件禁止硬编码可调参数

改动

合并 PR #156,确立"插件禁止硬编码可调参数"约定 + 评审检查 + 审计修复;bash-local(MAX_OUTPUT 等改为配置)、compact-basic(charsPerToken 等迁移为 Config 字段并校验)、tool-fs(读上限)、hooks-claude/codex(stderrSummaryMaxChars 校验)、session-persistence-sqlite、subagent-acp(plugin config 贯穿)、tool-web(MAX_RESULTS 配置化)均改造并补测试与 README。

目的

把可调参数全部提升为校验过的 cordis.yml Config 字段。

582caee90a#847

合并主干到 simpl-f-steering-mirror 分支

改动

将 origin/master(含 #145、#156 等)合并进 simpl-f-steering-mirror(解决 events-and-services.md、agent types.ts 冲突)。

目的

agent steering mirror 简化分支跟上主干。

52addacf66#848

合并主干到 simpl-d-fs-write-only 分支

改动

将 origin/master 合并进 simpl-d-fs-write-only(解决 RFC 记录与 fs-local/src/fsio.ts 冲突)。

目的

fs write-only 简化分支跟上主干。

0bccb483a5#849

docs(i18n):显式说明 requiredSince grandfather 语义

改动

在 docs/i18n README(中英)明确:cutoff 之前日期的文件按定义属于 grandfathered 积压(含 cutoff 前夜创建);倒填日期是 RFC 约定的可见违规而非漏洞。

目的

澄清上一条 i18n 规则的边界语义。

1905c809e3#850

合并主干到 simpl-c-web-observation 分支

改动

将 origin/master(含 #156 等大批改动)合并进 simpl-c-web-observation(解决 docs/architecture.md、packages/web/web/src/index.ts 冲突)。

目的

web observation 简化分支跟上主干。

提交总结(g-34,共 25 个,从旧到新)25

19ae955009#851

合并 origin/master 到 simpl-g-hook-contract

改动

将 master 同步进 hook-protocol 契约精简分支,解决了 hook-protocol events、hooks-claude/codex 的 README 与 src 等冲突;带入大量文档/包结构调整(AGENTS.md、docs、packages/*)。

目的

在 hook 协议精简分支上同步主干,继续后续改写。

e2cd7379ed#852

合并 origin/master 到 simpl-e-acp-trim

改动

将 master 同步进 ACP 裁剪分支,带入文档分层与预算、JSDoc 完整性门禁、doc-sync 等改动。

目的

ACP surface 裁剪分支追平主干。

456cb3b532#853

合并 origin/master 到 simpl-a1-drop-image

改动

将 master 同步进删除 image content block 分支,解决 docs/architecture.md、compact-basic README 冲突。

目的

drop-image 分支与主干同步。

7ab322909f#854

合并 simpl-a1-drop-image 到 simpl-a2-vocab

改动

把 a1(drop-image)成果合入 a2(词汇表精简)分支,叠加 fs/tool-fs 与 hooks/hook-protocol 等改动。

目的

在 a2 上叠加 a1 的删改,作为系列 simpl 工作的链式合并。

5441665585#855

合并 simpl-b1-fold-ui-stdio 到 simpl-b2-app-boot

改动

把 b1(折叠 stdio UI helper)合入 b2(app 启动)分支,解决 AGENTS.md、packages/README.md 冲突;带入 doc-budgets 门禁、gen-cordis-catalog 增量等。

目的

app-boot 分支接续 stdio UI 折叠成果。

060f272093#856

合并 simpl-b2-app-boot 到 simpl-b3-replay

改动

把 b2(app 启动)成果合入 b3(replay)分支,文件改动与上一合并一致。

目的

replay 分支叠加 b1+b2 的简化成果。

663e57c6d6#857

合并 simpl-a2-vocab 到 simpl-a3-knobs

改动

把 a2 词汇表精简合入 a3(删除 inert request knobs)分支,解决 core/tools/src/index.ts 冲突。

目的

a3 旋钮裁剪分支接续 a2 词汇表成果。

0b97b2f7c1#858

恢复 hook/result 的 durationMs 字段

改动

撤回 tighten-hook-protocol-contract RFC 第 3 项裁剪;hook-protocol 的 events/types/runner、claude/codex bridge、快照归一化器与 hook 快照 fixture 重新保留 durationMs。

目的

审查认为 wall-clock 时长是审计信号(哪个 hook 拖慢了 turn),需在持久化日志中保留;其余三项裁剪不变。

1891cb52d5#859

推迟 OpenRouter 专属 attribution 头

改动

修改 RFC 2026-06-21-mandatory-app-attribution-headers.md,将 OpenRouter 专属 attribution 头的实现延后,只保留强制 User-Agent。

目的

缩小 attribution 强制范围,避免为单一 provider 增加耦合。

8d4153d5fa#860

合并 master 到 simpl-f-steering-mirror

改动

主干同步进 agent steering mirror 删除分支,带入 bash-local、compact-basic、fs/tool-fs、hooks、subagent-acp、tool-web、session-persistence-sqlite 等多个包的改动。

目的

steering-mirror 分支追平主干。

c0349051c6#861

合并 PR #149 simpl-b1-fold-ui-stdio

改动

把 packages/support/ui-stdio 折叠进 packages/ui/stdio-agent(stdio-chat.ts 内联),删除独立 ui-stdio 包与 tsconfig;调整 echo/coding-agent e2e 与 todo README。

目的

消除只服务单一 stdio 应用的辅助包,降低包数量。

3977f1d63c#862

合并 origin/master 到 codex/docs-graph-brainstorm

改动

文档 graph 头脑风暴分支同步主干,解决 docs/architecture.md、development*.md、rfc/README.md、package.json 冲突;带入一批 RFC 索引表与 RFC draft。

目的

docs 分支与主干对齐,便于继续 RFC 图表整理。

80609cca11#863

合并 origin/master 到 simpl-c-web-observation

改动

主干同步进 web observation 删除分支,主要带入 PR #149 的 stdio UI 折叠成果。

目的

web-observation 裁剪分支接续主干。

5ace60e12d#864

再次合并 origin/master 到 codex/docs-graph-brainstorm

改动

与 80609cca11 类似,把 stdio UI 折叠等新主干改动同步进 docs 分支。

目的

docs 分支在合并 PR #149 后再次追平。

fc6b7ccf1e#865

刷新 graph atlas

改动

更新 docs/graphs/event-producer-consumer.md 与 package-topology.md。

目的

主干合并后让包拓扑/事件生产消费图与现状一致。

e72aa84eb3#866

合并 PR #150 simpl-c-web-observation

改动

删除 web capability 中未被消费的 observation surface(providers-change 事件、status 方法);精简 web/src/index.ts、types.ts、web.spec.ts 与各 provider 测试;更新 web 数据结构文档与 RFC。

目的

移除无消费者的 web 观察接口,收窄 capability 表面。

1ddd6a9eea#867

合并 origin/master 到 simpl-a1-drop-image

改动

把 PR #149/#150 的成果同步进 drop-image 分支,解决 rfc/README.md 冲突。

目的

drop-image 分支与主干对齐后再发 PR。

544cc0439e#868

合并 remote app attribution 分支

改动

将 app attribution 分支合入主干,落实「推迟 OpenRouter 专属头、只保留强制 User-Agent」的 RFC 决议;带入大量文档(i18n、core-data-structures、RFC 全集)与 CI/ignore/translate skill 调整。

目的

了结 attribution 头的范围决议,合并相关文档与实现。

5d6b1fd24a#869

合并 PR #154 simpl-a1-drop-image

改动

从 LLM content block 词汇表中移除 image block;改 llm/src/types.ts、llm-deepseek/serialize.ts、llm-pi-ai/convert.ts、compact-basic、ui/acp codec 与对应测试;新增/迁移 RFC 与文档。

目的

在没有端到端通路前先删除 image content block,避免词汇表里存在无人消费的变体。

5f295de096#870

合并 origin/master 到 simpl-f-steering-mirror

改动

把 drop-image、web-observation、stdio 折叠等主干成果同步进 steering-mirror 分支,解决 rfc/README.md 冲突。

目的

steering-mirror 分支发 PR 前的最后同步。

a6feec6d04#871

合并 origin/simpl-f-steering-mirror 到本地 simpl-f-steering-mirror

改动

空合并,无文件差异(远端分支同步回本地)。

目的

把远端同名分支对齐到本地,继续后续工作。

31c2f49725#872

合并 PR #147 simpl-f-steering-mirror

改动

移除 agent-loop 中 agent/steering 的 mirror emit;删 core/agent types、loop.ts 相关字段与 review-fixes 测试;更新事件目录与 RFC。

目的

删除用于镜像 agent 转向的事件,这些事件没有真正消费者,减少冗余事件发射。

8f62086feb#873

合并 origin/master 到 simpl-b2-app-boot

改动

把 drop-image、web-observation、steering-mirror、stdio 折叠等主干成果同步进 app-boot 分支,解决 rfc/README.md 冲突。

目的

app-boot 分支发 PR 前追平主干。

232f314c3a#874

新增生成的持久化日志事件目录及新鲜度/完整性门禁

改动

新增 docs/persistence-catalog/log-events.md,枚举每个 SessionEventMap 成员(含 dsh-compact、dsh-hook-protocol 声明合并),附 payload、surface/log-only 标记、JSDoc、声明位置;新增 scripts/gen-persistence-catalog.ts(AST 纯函数)与 verify-persistence-catalog(--check)加入 doc-sync;补齐 5 个 core 事件的 JSDoc,移除 hook/* 上的 @mode;用链接替换 session/compact/hook-protocol README 中的手写事件表。

目的

让持久化事件目录从源码自动生成并通过门禁保证不漂移,消除多处手写易漂移的事件枚举。

c961850302#875

压缩 AGENTS.md 中 ui/ 树行以符合字数上限

改动

仅 AGENTS.md 一行,精简 ui/ 目录的描述。

目的

让 ui/ 条目满足 verify-doc-budgets 的字数上限。

提交总结(g-35,共 25 个,从旧到新)25

2bd155291a#876

抽出 dsh-app-boot 统一各 app bin 的启动胶水

改动

新增 packages/ui/app-boot(index.ts、测试、README),acp-agent 与 stdio-agent 的 bin.ts 大幅瘦身改为复用;更新 module-graph、tsconfig、AGENTS.md,并补充 Agent Note。

目的

消除两个 app bin 中重复的启动样板,把启动序列收敛到单一可测包(PR #153,simpl-b2-app-boot)。

e13217ef49#877

将 origin/master 合并进 simpl-b3-replay

改动

把 master 上的若干简化(剪除 producer-less 词表变体、删除 image content block、移除 agent steering 镜像、折叠 stdio UI helper、app-boot 胶水、web 观测面收窄、hook 事件、compact-basic 调整、tool-fs 读写改动等)并入 replay 分支。

目的

在合并 PR 前同步 master,避免后续冲突。

daa737fe9c#878

ACP replay 配置改为从 live 配置派生

改动

重写 examples/acp-agent/cordis.snapshot.yml(大量删减),将单独维护的快照配置替换为基于 live 配置的派生;更新 RFC 与 hook-snapshot-matrix、ACP snapshot-tests 引用,新增 single-source-acp-replay-config Agent Note。

目的

消除 live 与 replay 两份配置的漂移,单一数据源(PR #155,simpl-b3-replay)。

9862eae898#879

将 origin/master 合并进 simpl-a2-vocab(含 README 冲突)

改动

合并 master 的 app-boot、stdio helper 折叠、agent-steering 删除、ACP replay 单源化等改动;解决 docs/rfc/README.md 冲突。

目的

分支合并前对齐 master。

53dc3c8a28#880

加固 persistence catalog 生成器(Codex review 发现)

改动

scripts/gen-persistence-catalog.ts:非「带显式 payload 类型的属性签名」的 SessionEventMap 成员由静默跳过改为硬错误;包外同名顶层 SessionEventMap 改为硬错误;JSDoc 标签检测改在裁剪行上执行以防越缩进绕过。补 4 个 spec 与 RFC/模块文档。

目的

堵住 review 发现的 keyof-join 漏洞,让 gate 强制而非假设这些不变量。

9cce15919f#881

剪除 producer-less 词表变体(cache hints、agent source、continuation trigger)

改动

删除 session/types.ts 中 cache hints、llm/types.ts 中 agent source、TurnTriggerMap 中 continuation 等无人产生的变体;更新 core/session 词表文档、RFC、Agent Note、replay 测试。

目的

移除仅存在于类型但无任何产生方的词表变体(PR #157,simpl-a2-vocab)。

c64cfbbe5d#882

将 origin/master 合并进 simpl-a3-knobs(含 README 冲突)

改动

把 master 的 app-boot、stdio 折叠、agent-steering 删除、ACP replay 单源等改动并入 knobs 分支;解决 docs/rfc/README.md 冲突。

目的

分支合并前对齐 master。

a8b6fb6989#883

删除 LLM 请求中无实际作用的 prefill 与 strict 旋钮

改动

从 core/tools、llm-deepseek、llm-pi-ai、llm/types.ts、tool-catalog 生成器中移除 prefill 与 strict 字段及其测试;更新 cookbook 与 RFC。

目的

删除从未被任何 provider 实际读取的请求旋钮(PR #158,simpl-a3-knobs)。

2728e3bd5b#884

关闭 review 验证发现的剩余 keyof-join 漏洞

改动

gen-persistence-catalog.ts:要求 SessionEventMap 是 dsh-session 包内唯一导出声明(非导出/重复导出为硬错误);任何带 extends 的 SessionEventMap 声明为硬错误。补 3 个 spec,更新 RFC 与模块文档。

目的

堵住同包内局部同名接口与继承键带来的静默漏目录漏洞。

54fc3d65ab#885

将 origin/master 合并进 simpl-d-fs-write-only(含 README 冲突)

改动

把 master 的简化批次(image content block、inert knobs、producerless 词表、stdio 折叠、app-boot、ACP replay 单源等)并入 fs-write-only 分支;解决 docs/rfc/README.md 冲突。

目的

分支合并前对齐 master。

c01d8c0dfc#886

将 origin/master 合并进 simpl-g-hook-contract(含 README 冲突)

改动

同上批次的 master 简化并入 hook-contract 分支;解决 docs/rfc/README.md 冲突。

目的

分支合并前对齐 master。

f90f1c358e#887

将 origin/master 合并进 simpl-e-acp-trim(含 README 冲突)

改动

同上批次的 master 简化并入 acp-trim 分支;解决 docs/rfc/README.md 冲突。

目的

分支合并前对齐 master。

b46e805207#888

剪除 FS seam 的只写字段与无用的路由旋钮

改动

从 fs/types.ts、fs-local、tool-fs(edit、read、read-render)中删除只写但无消费的字段及无用的 routing 参数;同步 README、fs 文档、policy/service 测试、Agent Note。

目的

清理 fs capability seam 上无下游消费者的冗余字段(PR #148,simpl-d-fs-write-only)。

9857bb0c07#889

将 origin/master 合并进 simpl-g-hook-contract

改动

把 master 上刚合入的 fs-write-only 剪除结果并入 hook-contract 分支;解决 docs/rfc/README.md 冲突。

目的

分支合并前对齐 master。

2c9e5ee756#890

将 origin/master 合并进 persistence-log-catalog

改动

把 master 的整批简化(image block、inert knobs、producerless 词表、fs-write-only、stdio 折叠、app-boot、ACP replay 单源、hook 事件、web 收窄等)并入 persistence-log-catalog 分支。

目的

分支合并前对齐 master。

f56b09c5ce#891

收紧 hook-protocol 契约表面

改动

hook-protocol 的 events.ts、codec.ts、runner.ts、types.ts、index.ts 重构(新增 dispatch 模式语义等),hooks-claude/hooks-codex 跟随适配;补/更新 codec、events、runner、coverage 测试与 README、Agent Note。

目的

收窄 hook-protocol 对外契约,把 dispatch 模式与事件语义显式化(PR #151,simpl-g-hook-contract)。

a23982b30a#892

合并后重生成 catalog 并清理 turn/start JSDoc 中的过期 continuation trigger

改动

重新生成 docs/persistence-catalog/log-events.md 修复行号偏移;从 core/session/src/types.ts 中 turn/start 的 JSDoc 删除已剪除的 continuation 变体引用。

目的

修复 master 合并带来的目录行号漂移与 JSDoc 过期引用(staleness CI 捕获)。

021dae58e2#893

将 origin/master 合并进 simpl-e-acp-trim(含 README 冲突)

改动

把 master 上刚合入的 fs-write-only 剪除与 hook-protocol 契约收紧结果并入 acp-trim 分支;解决 docs/rfc/README.md 冲突。

目的

分支合并前对齐 master。

d91b82ea61#894

裁剪 ACP 桥接的不可达表面(branding 旋钮、kind 探测 fallback)

改动

packages/ui/acp/src/index.ts 删除无消费者的 branding 旋钮与 kind-sniffing fallback;更新 README、feature-support 文档、bridge/stream-update/turns 测试与 posttool-block golden 输出、Agent Note。

目的

移除 ACP 桥接层中无下游消费者或运行时不可达的代码路径(PR #152,simpl-e-acp-trim)。

a52c27ee07#895

将 origin/master 合并进 persistence-log-catalog(含 hook-protocol 冲突)

改动

把 master 上刚合入的 hook-protocol 契约收紧与 ACP 桥接裁剪结果并入 persistence-log-catalog 分支;解决 hook-protocol/README.md 与 src/types.ts 冲突。

目的

分支合并前对齐 master。

34f9d00227#896

自动生成持久化日志事件目录

改动

新增 scripts/gen-persistence-catalog.ts(456 行)及对应 spec;产出 docs/persistence-catalog/log-events.md(240 行);在 core/session/src/types.ts 标注事件归属,doc-typecheck.ts、package.json、translation manifest 跟随;新增 RFC 与 Agent Note。

目的

把 SessionEventMap 的磁盘词表变成生成式单一数据源目录,防止漂移(PR #161,persistence-log-catalog)。

25e02ae9a8#897

将 cordis 目录拆分为独立的 events 与 services 两份文档

改动

gen-cordis-catalog.ts 改为输出 docs/cordis-catalog/events.md 与 services.md(取代合并版 events-and-services.md),标题升一级、dispatch-mode 图例移到 events 页、--check 校验两者;architecture.md、AGENTS.md、docs/AGENTS.md、filesystem/subagent core-data-structures、fs README、4 个 RFC、tool/persistence 目录生成器、双语 development.md 等引用一并更新。

目的

让「要监听什么事件」与「要调用什么服务」两个独立阅读轴各自成页、可深链。

b9e2d7ed85#898

将 master 合并进 app attribution RFC 分支

改动

把 master 的全部简化与文档变更(JSDoc completeness gate、RFC index 生成、cordis 目录拆分等)并入 codex/app-attribution-rfc 分支。

目的

RFC 分支合并前对齐 master。

f8e06fd5d7#899

将 origin/master 合并进 split-cordis-catalog

改动

空 diff 合并,仅把 master 的 cordis 目录拆分等最新改动带入 split-cordis-catalog 分支。

目的

分支合并前对齐 master。

e06807ce0e#900

将 origin/master 合并进 codex/app-attribution-rfc

改动

把 master 上刚合入的 persistence-log-catalog(生成器、log-events.md、session/types.ts、doc-typecheck 等)并入 app-attribution-rfc 分支。

目的

分支合并前对齐 master。

提交总结(g-36,共 25 个,从旧到新)25

1e2efc861e#901

合并 PR #81:为 provider 请求强制注入 User-Agent 归属

改动

新增 packages/llm/llm/src/attribution.ts(归属工具)、对应测试与 RFC;llm-deepseek、llm-pi-ai adapter 接入归属头;更新 catalog/README/type-equiv。

目的

让所有 LLM provider 请求带上强制 User-Agent 标识,满足归属 RFC 的可追溯要求。

816a9f15f6#902

合并 origin/master 到 split-cordis-catalog

改动

将 master 的 attribution 改动并入 split-cordis-catalog 分支,冲突仅在 docs/cordis-catalog/events.md,手动解决。

目的

分支同步上游的归属头实现。

8dd8ce21db#903

docs:让 service map 成为 architecture.md 的入口

改动

docs/architecture.md 删除 Layering ASCII 图,拆分 Service map 为 spine(core/)与可替换 capability seam,将 Cordis 瀑布语义、事件分类提升为顶级章节;同步 AGENTS.md、catalog 生成器与 anchor。

目的

原先 Layering 图杂乱、遗漏 dsh-agent-core 与 app 包,作为 README 链接首屏不称职,重整为以 Service map 为入口。

1316022cc8#904

docs:按评审修订图文档

改动

拆解 docs/graphs/ 目录,新增 graph-atlas.md、capability-seams.md、tool-execution-pipeline.md 及多个 composition 文档;重写 gen-doc-graphs.ts、gen-module-graph.ts,新增示例 composition 与 tool catalog 输出。

目的

按评审意见将图文档从集中目录拆分为可索引的独立主题文档。

cc59aede96#905

docs:修复 Layering 删除后遗留的两处引用

改动

docs/AGENTS.md 与 extract-example-app-packages RFC 中仍指向已删除的「§ Layering」,改为「§ Service map」。

目的

消除 Layering 章节移除后的失链引用。

2bad139ece#906

合并 PR #163:将 cordis catalog 拆分为独立的 events 与 services 文档

改动

docs/cordis-catalog/events-and-services.md 拆为 events.md 与新增 services.md,gen-cordis-catalog.ts 重写为双输出;扫描替换所有引用点。

目的

让 catalog 的 events 与 services 各自独立、便于维护与索引。

5d97374a59#907

合并 origin/master 到 codex/docs-graph-brainstorm

改动

并入 master 的 catalog 拆分、attribution 头等改动,冲突在 docs/module-graph.md、package.json、gen-tool-catalog.spec.ts,手动解决。

目的

图文档分支同步上游。

f256f3961d#908

feat(system-prompt):prompt 变量、persona-as-section、工具指引归属

改动

dsh-system-prompt 引入 merge-extensible AssembleContext、variable(name, provider) 注册表、{{name}} 严格插值(未知/畸形引用抛错);dsh-agent-loop 注册 agent:persona 段(order 0)与 model/cwd 变量;工具指引下沉到各自 owner(bash/read 段,todo/subagent 用 description);SubagentProvider.inheritsParentContext 与 per-provider 文案;新增 RFC 与 CONTEXT.md。

目的

贯彻「prompt 中每个事实有唯一 owner」原则,消除各部署 persona 中重复的工具枚举与变量硬编码。

a1a660823f#909

合并 origin/master 到 worktree-arch-doc-drop-layering

改动

master 在 review 期间拆分了 catalog,本合并保留本分支的 Service map 重整,采用 master 的拆分 catalog 链接目标(events.md/services.md)并重生成。

目的

架构文档分支同步上游 catalog 拆分。

8e70efcfcc#910

合并 origin/master 到 codex/docs-graph-brainstorm

改动

并入 master 的 catalog 拆分与 Service map 入口重整,冲突在 architecture.md 与 development 三件套,手动解决。

目的

图文档分支二次同步上游。

60b097c829#911

docs:移除所有 Feishu 引用

改动

AGENTS.md、docs/architecture.md、microkernel-event-taxonomy RFC 中删除指向公司内部 Feishu wiki 的两条设计文档链接。

目的

外部读者与 agent 访问不到公司 wiki,外链属死重;被装饰的原则已就地说明,无需迁移内容。

e85e21c8b0#912

fix(review):修补插值严格性漏洞;tool-subagent 镜像 provider 生命周期

改动

renderPrompt 改用 Object.hasOwn(防 {{constructor}} 走原型链注入),畸形 {{ 组抛错;tool-subagent 改为监听 subagent/provider-added/-removed 事件、随 provider 上线/下线挂载/卸载,移除对 loader 加载顺序的假设;loop.spec 增设 live continuation 遏制测试。

目的

修复 Codex round-1 评审发现的插值安全漏洞与 tool-subagent 对兄弟插件并发启动顺序的隐式依赖。

54a3c8b2a4#913

docs:按评审调整图文档落位

改动

graph-atlas.md 及各 composition/capability-seams.md/tool-execution-pipeline.md 等微调落点;gen-doc-graphs.ts 调整生成位置。

目的

按评审意见修正图文档在站点中的放置。

99540e6a94#914

合并 PR #164:docs:让 service map 成为 architecture.md 的入口

改动

合入 worktree-arch-doc-drop-layering 分支——删除 Layering 章节、Service map 拆为 spine/seam、Feishu 引用清理、catalog 重生成。

目的

架构文档入口重整的 PR 落地。

a06e5f1c87#915

合并 origin/master 到 codex/docs-graph-brainstorm

改动

并入 master 的 PR #164(Service map 入口重整 + Feishu 清理),冲突在 architecture.md,手动解决。

目的

图文档分支三次同步上游。

57fd914f95#916

合并 PR #130:docs:新增 graph atlas 与 Mermaid 校验

改动

新增 scripts/gen-doc-graphs.ts(生成图集)、scripts/verify-mermaid.ts(CI 校验 Mermaid 语法)、docs/graph-atlas.md、docs/capability-seams.md、docs/tool-execution-pipeline.md、各 example 的 composition.md、docs/module-graph.md 重写;CI 接入 Mermaid 校验。

目的

建立可校验的文档图集,让架构关系可视化且受 CI 门控。

96055d1763#917

docs:重写架构引言

改动

docs/architecture.md 引言重写(194 行变更,净减词),doc-budgets.manifest.json 调整预算。

目的

精炼架构文档开篇,使其更聚焦。

e890a3373e#918

test(review):钉死 tool-subagent 插件 fiber 的生命周期归属;文档修补

改动

新增测试证明真正挂载的 plugin fiber(而非直接 apply)拥有 provider 生命周期监听器——dispose fiber 卸载 tool 但保留 provider;fiber 在 WAITING 期被 dispose 后绝不僵尸挂载;记录 TODO(subagent-dup-toolname) 关于同名 fiber 的回滚影响;RFC 验收清单改为已 shipped 现在时。

目的

补齐 Codex round-2 评审要求,固化 fiber 生命周期不变式。

2f191cc72b#919

docs(agent):在 JSDoc 中写明 persona 的模板契约

改动

AgentOptions.systemPrompt 的 JSDoc 补充:每个完整 {{...}} 组都会被严格解释,目前没有字面 {{...}} 的转义语法(RFC 中记录的延期项);同步 catalog。

目的

persona 作者最先读这条注释,应明确严格插值契约与无转义的现状。

dafb81be7b#920

subagent:为进程内 backend 实现结构化输出

改动

dsh-tools 新增 JSON-Schema 子集(json-schema.ts:StructuredOutputSchema、assertSupportedOutputSchema、validateStructuredValue);dsh-subagent-inprocess 新增共享 structured 运行时(全局 capture tool + FINAL-REQUEST 强制监听 + turn-continuation veto + 引用计数生命周期),spawn/fork 翻转 outputSchema: true 并注入 tools;startInProcessRun 驱动捕获与 clean-finish nudge;新增完整测试。

目的

补齐 seam 词表中存在但无 in-process backend 兑现的 outputSchema/result.structured 半边,让 spawn/fork 支持结构化输出。

00cf8b693a#921

feat(agent-loop):每个 prompt 以 harness 身份段开头

改动

dsh-agent-loop 新增静态 harness:identity 段(order -100,负值带首个),在部署 persona 之前声明由 DeepSeek Harness SDK 驱动;五处 order-band 文档同步。

目的

harness 归属是 harness 事实,应放在 loop 插件而非每个 persona,确保所有 agent(含 subagent)都携带且 YAML 不会遗漏。

1d43ea3cd5#922

workflow:动态工作流——脚本驱动的多 agent 编排

改动

新增 packages/workflow/ 能力族:dsh-workflow(抽象 WorkflowService + run 词表 + observe-only workflow/* 事件)、dsh-workflow-vm(node:vm 引擎、meta 扫描器、realm 边界、parallel/pipeline/phase 组合子、确定性禁令、caps/timeout Config)、dsh-tool-workflow(同步模型工具);接入 examples,新增完整 tier 覆盖测试与 ACP 快照场景;新增 RFC,AGENTS.md 增加分组布局行。

目的

对标 Claude Code 的 dynamic workflows,让模型编写 JS 编排脚本,由脚本而非会话持有循环、分支与中间结果。

dca7a436e4#923

docs:更新产品名称

改动

AGENTS.md、architecture.md、attribution RFC、vendor-cordis RFC、acp-agent README、acp package.json、system-prompt 测试与三个 web-search e2e 中统一产品名。

目的

统一全仓产品名表述。

a4cabe8485#924

合并 origin/master 到 codex/project-instruction-files

改动

大合并,并入 master 的 catalog 拆分、graph atlas、Mermaid 校验、web/hooks/fs/bash 等大量能力包、文档分层与预算门控、i18n/translation-pairing 门、persistence/tool catalog 生成器等;冲突在 AGENTS.md、architecture.md、module-graph.md、knip.json、packages/README.md、pnpm-lock.yaml,手动解决。

目的

project-instruction-files 分支同步上游累积的文档与能力重构。

83dfc3887e#925

合并 origin/master 到 skill system 分支

改动

解决 master 的文档拆分、tool presentation、生成 catalog 变更,同时保留 skill 系统集成;涉及与上一提交基本一致的庞大体量(skill 包 dsh-skill、tool-skill 相关除外,本分支保留 skill 部分)。

目的

skill system 分支同步上游文档与生成器重构,保持 skill 集成不冲突。

提交总结(g-37,共 25 个,从旧到新)25

f626e569a4#926

文档:记录 skill 系统设计

改动

新增 skill-system RFC(docs/rfc/implemented/feature/2026-07-05-skill-system.md)、核心数据结构页 docs/core-data-structures/skills.md,并为 packages/core/skill 公开词汇补充 JSDoc;更新 catalog 与 type-equiv manifest

目的

让生成的 catalog 与 review 文档描述新的 skill 服务/工具契约

ff8d38a9a8#927

合并 origin/master 到 codex/ask-user-question

改动

将 origin/master 合并入 codex/ask-user-question;解决 22 个冲突文件(含 docs/architecture.md、cordis catalog、stdio-agent、acp 等),并带回大量 master 上的文档/Hook/web 包变更

目的

在 ask-user-question 分支上同步主线进展,承接文档拆分、Hook 桥、web capability 等已合并工作

0bf50d3469#928

测试:在 stdio readline spec 接入用户交互

改动

packages/ui/stdio-agent/tests/readline.spec.ts 增加一行测试接线

目的

为 readline 测试补上用户交互接入

87c5b55122#929

新增动态项目指令加载

改动

packages/prompt/project-instructions 在原有静态加载基础上新增动态加载(src/index.ts +114 行、tsconfig、spec/e2e、README),更新架构/module-graph 与 RFC

目的

支持在运行时动态发现并加载项目指令文件

dca2cc257d#930

修复:加固 skill 发现

改动

packages/core/skill 与 agent-core 重构 skill 发现路径,新增 acp-agent/coding-agent/echo-agent 的 smoke 与 snapshot(skill-load 快照),补充 vitest 配置与 tsconfig

目的

让 skill 发现更稳健,覆盖示例与测试

77ab82a94c#931

修复:通过 fs seam 列出 skills

改动

packages/core/skill/src/index.ts 改为走 fs capability seam 列举 skills,更新对应 spec

目的

让 skill 列表读取经过 fs 服务边界,保持 capability 分层

fdd65269f9#932

文档:综合重写架构文档

改动

重写 docs/architecture.md(+150/-...),连带调整 bash-local、tool-bash、doc-budgets、verify-doc-refs

目的

合成一版更清晰的架构总览

e264a106fd#933

workflow、subagent:修复 Codex 代码评审第 1 轮阻塞项

改动

workflow-vm 修复 6 个 A 类问题:parallel/pipeline 返回宿主数组改为 realm-built、materializeFromRealm 拒绝 Proxy 避免触发 trap、已 abort 信号不再误报 completed、dispose 等待 stray agent() 子任务结束、workflow 事件 payload 改为按 listener 克隆、structured-output 续轮 veto 改为 prepend;附回归测试与文档/RFC/catalog

目的

堵住 realm 边界泄漏与生命周期缺陷,保证 vm 隔离正确性

d899333cde#934

文档:从架构图中拆分出 Cordis 入门

改动

新建 docs/cordis-primer.md(+38),从 architecture.md 拆分内容;调整 doc-budgets、verify-doc-refs、catalog 生成器

目的

将 Cordis 基础概念与架构扩展图分离,便于维护

57b9910339#935

workflow:完整且受控地渲染恶意抛出值

改动

workflow-vm/realm.ts 新增 describeThrown——绝不抛错、proxy 标记前置、只读 own descriptor、原始类型才用 String()、含 CONTAINED stack getter;runtime/meta 改用该渲染器;新增 hostile thrown values 表回归测试

目的

防止脚本通过带恶意 getter/toString 的抛出值在 drive() 的宿主 catch 中执行 realm 代码导致进程级 unhandledRejection

e154396612#936

文档:精炼架构扩展图

改动

仅 docs/architecture.md(+9/-10)

目的

微调架构扩展图的措辞与结构

d5cb3297ad#937

合并 PR #167(codex/architecture-intro-rewrite)

改动

合并「docs: rewrite architecture intro」PR,包含 architecture.md 重写、cordis-primer 拆分、catalog 与多包 README 跟随调整

目的

将架构介绍重写并入主线

fff2e1f33d#938

workflow:在 realm 执行窗口内渲染抛出值

改动

在编译 body 与 meta 字面量外包 realm 侧 catch,预渲染抛出值为字符串(REALM_THROWN_RENDERER_SOURCE);宿主 catch 只读取预渲染 thrownRendering 或回退 describeThrown;补 hostile 表、getter 隐藏 spin、hostile thenable 等回归测试

目的

第 2 轮「容器化 stack getter」仍可被 throw {get stack(){while(true){}}} 绕过 vm 超时;将渲染迁入 realm 使恶意访问器受 sync-slice 超时约束

2304f7a245#939

合并 origin/master:采用 DeepSeek Harness SDK 产品名

改动

合并 master 并采用产品重命名(DeepSeek Code -> DeepSeek Harness SDK);调和冲突:将重命名应用于 PR 新增的 system-prompt 断言、在 master 重写的 architecture.md 中以新风格补回本 PR 的 prompt-assembly 语义、catalog 重新生成进拆分后的 events.md/services.md、module graph 与 doc graphs 重新生成

目的

在分支上同步产品改名与文档结构变更

95c8c878e1#940

workflow:将 thenable 返回语义固化为文档化的 async-JS 行为

改动

经真机验证后判定第 4 轮评审指出的 thenable 返回是标准 JS 行为而非缺陷;补引擎测试(未 await 的 return agent()、自定义 thenable、thenable 解析为非 JSON 则 RESULT_UNSERIALIZABLE),并更新 README/RFC/模块文档中「超时局限」措辞为「越过初始同步切片」

目的

钉住该行为并明确其边界,避免后续误判

b92795a731#941

修复嵌套项目指令的评审发现

改动

packages/prompt/project-instructions/src/index.ts 调整嵌套跟踪逻辑(+80 行),扩 spec(+103),更新 README 与 RFC

目的

处理嵌套项目指令在评审中发现的问题

abb145d99f#942

文档(i18n):翻译能力——风格样本、语气规则、两遍翻译 skill

改动

新增人工标注金对照 docs/i18n/style-samples.md(双语自带、不参与配对)并令其凌驾语气规则;translation-rules 增加 Voice 段;skill 的 translate 步骤改为两遍(母语写作 + 逐句保真);术语裁定 hash→哈希、HMR/fiber 列入待定表

目的

让翻译优化为自然中文,同时保留术语一致

c7a833a893#943

修复:简化 skill 配置接线

改动

packages/core/skill/src/index.ts 与 agent-core 重构,移除 skill 在 agent-core/acp-agent/stdio-agent 中的冗余接线,删除 vitest.config 中的相关条目与一处依赖;补 spec 与 README

目的

简化 skill 的配置装配路径

4f85274237#944

文档(i18n):吸收 with-key-testing 金样本;mock/real-API 术语表

改动

style-samples 增补 with-key-testing 金样本(按表取胜规则校正:agent 留英文、cancellation 渲染为「取消」);terminology 新增 mock→模拟、attributive 时 real-API→真实接口

目的

将真实 API 测试语境下的术语裁定落入样本与术语表

74699d25ba#945

文档(i18n):按裁定 mock 保留英文;样本同步更正

改动

style-samples.md 与 terminology.md 微调,使 mock 在样本中保持英文

目的

纠正上一次提交中 mock 渲染与裁定不一致

7234d41b91#946

workflow:hook promise 与 hook 失败也改为 realm-built

改动

workflow-vm 第 5 轮评审修复——agent()/parallel()/pipeline() 的 hook promise 用 realm 的 Promise.resolve 同化宿主 promise,使脚本可见 promise 带 realm 原型;hook 失败(拒绝与 phase/log 同步抛出)在边界翻译为 realm-built 克隆(name/code/message/fatal);组合子通过 isFatalWorkflowErrorClone 结构性识别 FATAL 克隆,drive() 按 run 状态把取消后失败映射为 'cancelled';补大量 realm 标识/克隆/组合子回归测试

目的

堵住 hook 返回值与失败通道上的 realm 原型泄漏,保持 fatal-vs-null 纪律跨边界成立

daaddcaaf3#947

文档(i18n):吸收第 4 轮金样本并校正术语

改动

style-samples 增补架构指针段、两条 defensive patterns 与 prefer-real-over-mock 规则的样本;按表胜规则记录 agent/mock/LLM 留英文、registry→注册表、code-span 标识符原样保留;orphan→孤儿进程

目的

将更多真实文档段落的术语裁定沉淀进样本

706b9c95b1#948

加固嵌套项目指令跟踪

改动

packages/prompt/project-instructions/src/index.ts 重写跟踪逻辑(+70/-30),agent-loop/loop.ts 接入,新增 294 行 spec 与 RFC 补充

目的

进一步加固对嵌套(被引用)项目指令文件的跟踪

60cfec6073#949

文档(i18n):将样本摘录链接重定向至 docs/i18n 可解析

改动

docs/i18n/style-samples.md 修正两处相对链接

目的

摘录复制后链接应从摘录所在目录解析,修复 verify-md-links 抓到的断链

c2b0278185#950

合并 origin/master 到 codex/skill-system

改动

将 origin/master 合并入 codex/skill-system(解决 docs/architecture.md 冲突),带入 master 上的架构重写、产品改名、catalog 拆分、doc graphs 与 mermaid 校验等

目的

在 skill-system 分支上同步主线进展

提交总结(g-38,共 25 个,从旧到新)25

b43a9e9ab1#951

i18n 术语表补充 package 条目

改动

docs/i18n/terminology.md 新增一行,把 package(npm 包 @deepseek-ai/dsh-*)登记为保留英文。

目的

落实"package 保持英文"的术语裁决,统一文档用词。

ad14b210bf#952

为 skill 配置默认值补测试

改动

在 agent-core、skill、acp-agent、stdio-agent 四个包的 spec 中新增针对 skill 配置默认值的覆盖;agent-core 新增 withIsolatedSkillHomes 辅助函数隔离 DSH_HOME/DSH_AGENTS_HOME。

目的

覆盖 skill 配置在没有显式设置时的默认行为。

532abbc754#953

合并 origin/master 到 project-instruction-files 分支

改动

Merge commit,把 origin/master 合入 codex/project-instruction-files;解决了 AGENTS.md 与 docs/architecture.md 的冲突,同步大量目录/文档归一化改动。

目的

在 project-instruction-files 特性分支上跟进主线进度。

5ad483d120#954

稳定 bash kill 升级测试

改动

packages/bash/bash-local/tests/executor.spec.ts 中 TERM-trap 任务加上 echo trap-ready,并用 readUntil 等到该信号再发 kill,取代原来的固定 setTimeout(100)。

目的

消除竞态——确保 kill 发生前 trap 已真正安装,测试不再偶发误判。

f8f270c13e#955

让 project instruction 候选可配置

改动

packages/prompt/project-instructions 把候选文件名列表从硬编码改为通过 Config 字段配置;同步 README、RFC、package.json 和测试。

目的

遵循"No hardcoded tunables"约定,把候选文件名外化成可从 cordis.yml 修改的配置。

e6fad266a6#956

定义并推行统一 RFC 格式

改动

在 docs/rfc/README.md 写定 RFC 文件契约(Status 头、按生命周期的正文骨架、必备 Alternatives considered 段);新增 scripts/verify-rfc-format.ts doc-sync gate;把全部 112 个 RFC 规范化(合并 15 种 Status 拼写、29 个 Context 改为 Problem、清除 39 处 XXX debt、为 implemented 改写为完成态);把索引表移到生成的 docs/rfc/INDEX.md;新增 2026-07-05-uniform-rfc-format.md 作为首例。

目的

给 RFC 语料建立统一可机检的格式,并用 gate 防止回退。

3f83a4ee96#957

persona 改由 system-prompt 插件的部署配置承载

改动

第二轮审阅调整——dsh-system-prompt 自身注册 harness:identity(-100) 与 deployment:persona(0) 两节;删除 AgentOptions.systemPrompt 及相关转发,app config 的 systemPrompt 键改为通过 dsh-agent-core 路由的 persona;ACP 桥与 tool-subagent 不再携带 persona;删除根 CONTEXT.md;更新大量 README、RFC、catalog 与测试,新增 loop 测试钉住"空 assembly 不发 system 字段"。

目的

让 persona 在 loop 插件被替换时也能存活,归属到 system-prompt 插件,runtime 事实(model/cwd)留在 loop。

6bca9cbeb3#958

把 subagent provider 生命周期事件单独写成 RFC

改动

把原本埋在 prompt-variables RFC 一节里的 subagent/provider-added、provider-removed 事件决策(反应式注册而非 Loader 顺序保证)抽出来,新建 2026-07-05-subagent-provider-lifecycle-events.md,原 RFC 改为指向它;重新生成索引。

目的

让该决策有独立的归属和被引用入口。

0e29de459e#959

修审阅意见:RFC 格式 gate 识别围栏、订正语料计数

改动

scripts/verify-rfc-format.ts 的内容扫描改为忽略 fenced code block(位置性头块检查仍按原文),避免引用 Status/标题/祖父注释被误判;配套 RFC 把 corpus 计数订正为精确值(27 种 Status、19 个 implemented 文件含 30 处 proposal 式标题、3 个英文文件无 Status 等)。

目的

修复合并前审阅发现的两处缺陷,让 gate 正确。

b38d751e42#960

对齐 no-Status-line 备选方案的文件计数

改动

docs/rfc/implemented/process/2026-07-05-uniform-rfc-format.md 改一行,把备选方案描述里的文件数改为实测值。

目的

订正 RFC 文中的小计数偏差。

d10d94a640#961

合并 PR #174(worktree-rfc-uniform-format)

改动

Merge commit,把 worktree-rfc-uniform-format 分支(即上面几条统一 RFC 格式工作)合入主线。

目的

正式落地统一 RFC 格式契约、gate 与全语料迁移。

bffdee88e4#962

合并 origin/master,让本分支采纳统一 RFC 格式

改动

Merge commit,把 master(已含统一 RFC 格式)合入当前分支;本分支的两篇 RFC(prompt-variables、provider-lifecycle events)在同一合并里改成新契约(Status 头改为 implemented 无日期、Rejected alternatives 改为 Alternatives considered、What we give up 并入 Consequences),INDEX.md 重新生成,README 取 master 版本。

目的

让特性分支跟上刚落地的 RFC 格式,避免分叉。

80358aed9f#963

CI workflow 并行化

改动

.github/workflows/ci.yml 大改(+238/-71),.github/workflows/e2e.yml 小改,把 GitHub Actions 拆成多个可并行运行的 job。

目的

缩短 CI 总时长,让各检查并发跑。

3633cf90c8#964

修审阅:隔离 provider-removed 监听失败、钉住 model-via-request 路径

改动

subagent/provider-removed 改走 emitLifecycle(逐监听器隔离,参照 subagent/start|end 先例),不再用原始 ctx.emit,防止一个抛错的订阅者饿死后面的镜像或破坏 teardown;provider-added 故意保持传播(注册期回滚语义),该非对称性记入 JSDoc 与 RFC。新增 loop 测试钉住"模型晚到时由 agent/request 在 system-prompt/assemble 瀑布上声明 {{model}}"的端到端路径;subagent 服务/测试同步更新。

目的

消除 ds-review-bot 第二轮发现的两个风险——一个抛错订阅者拖垮整个 fiber,以及 model 变量供应路径缺回归保护。

bb4cc0ff60#965

新增 dsh-merging-stacked-prs 技能

改动

新增 .agents/skills/dsh-merging-stacked-prs/SKILL.md,把 stacked-PR 的落地流程(自底向上合并、逐个 retarget+刷新、整栈落地前不删分支)固化成仓库技能;cookbook 的 stack review 指南链接到它。

目的

让每个协作者的 agent 都能发现并遵循统一的 stack 合并流程。

8e649792b7#966

合并 master 到 codex/parallelize-ci

改动

Merge commit,把 master(含统一 RFC 格式等)合入 codex/parallelize-ci 分支。

目的

CI 并行化分支跟进主线,准备后续 PR。

dd44402871#967

修 stacked-PR 技能的审阅发现

改动

.agents/skills/dsh-merging-stacked-prs/SKILL.md 三处修正——dependent 检查从 gh pr list 改为 --state open --limit 1000(默认分页会漏开着的 dependent),刷新步骤改为 fetch+merge origin/master(gh pr merge 后本地 master 已过期),快速清单补上"本地合并后要 push dependent"。

目的

堵住流程里的三个会误删分支或漏推的缺陷。

2accf85714#968

workflow 引擎简化为信任前提,取消时 result 必结算

改动

两处合在一起的审阅回应。(1) 删除针对敌意脚本值的防御(trap-free proxy 拒绝、descriptor 不触发 getter 的 walk、realm 预渲染抛出值、realm 构造的 Promise/Array/Error 克隆等)——脚本与模型同信任级,且计划中的硬化引擎本就靠序列化做隔离;保留 benign 路径(result 永不 reject、dropped hook Promise 不成 unhandled rejection、JSON 不能携带的值在边界大声失败改为递归 walk、__proto__ 作为 data property 复制、host instanceof 判定);realm.ts 从 289 行降到 173 行,删除敌意值测试表。(2) 契约改为:run 被取消后,即使脚本不结算(await new Promise(()=>{})、Promise.race([])、返回永不结算的 thenable),result 也必须在实现的有界 grace 内结算;vm 引擎在 cancel() 拉起 abandon channel,drive() 让脚本与它竞速;翻转旧的"result 保持 pending"测试为新契约,补真实 registry+tool+vm engine 的回归。

目的

把防御对准真实威胁;修复一个能让整个 agent turn 卡死、且原测试恰好掩盖的 cancel-不结算 bug。

ed3972a9c6#969

workflow meta 前缀扫描改线性(正则指数回溯)

改动

packages/workflow/workflow-vm/src/meta.ts 把 leading-trivia 前缀正则(^\s*(?:comment|comment|\s+)*export …,在 \s* 与 \s+ 间歧义划分导致近失配时指数回溯——35 空格约 19ms、38 空格约 174ms、每字符 ×2.2,真实近失配 10 秒不结束)替换为手写线性 trivia 扫描(空白 + ////* */ 注释),再对剩余部分用锚定正则 ^export\s+const\s+meta\s*=\s* 匹配;语句前出现未闭合块注释给独立 SCRIPT_PARSE 信息。补回归:近失配形状必须在 1 秒内拒绝、未闭合前导注释与"注释到 EOF"边界。

目的

消除同步 start() 路径上的 ReDoS——一个良性 typo 会卡死整个进程而非走到设计好的 SCRIPT_PARSE 恢复。

72c83c771a#970

并行化 pre-push gates

改动

lefthook.yml(+58)、scripts/publint-all.ts(重写为并行)、docs/development*.md 配套说明,让 pre-push 各 gate 并行运行。

目的

缩短本地 pre-push 检查耗时。

5caceee380#971

把 ACP snapshot replay 文档移进包内

改动

把 docs/acp/snapshot-replay.md 迁到 packages/ui/acp/snapshot-replay.md;更新 docs/graph-atlas.md、对应 RFC 和 scripts/gen-doc-graphs.ts 的引用。

目的

让该文档与其描述的包同处一处,符合"文档随代码归属"。

8cb5e15544#972

回退 knip.json 的格式化噪声

改动

knip.json 恢复到 master 的格式,只保留唯一语义改动(workflow-vm workspace 条目);与 master 的 diff 从约 110 行机械展开变回有意义的 4 行。

目的

清除审阅指出的 reformat 噪声,让真实改动可见。

2ba4964aba#973

重新生成 services catalog

改动

docs/cordis-catalog/services.md 由生成器刷新两行。

目的

让 services catalog 反映最新的 seam 契约 JSDoc。

1c05c41f47#974

stack 流程要求等 MERGED 再推进

改动

.agents/skills/dsh-merging-stacked-prs/SKILL.md 要求每次 gh pr merge 后用 gh pr view <n> --json state 确认报 MERGED 再 retarget 下一个 PR;更新流程与清单。

目的

避免在仅启用 auto-merge 或队列未跑完时 master 尚未真正包含父 PR 就推进子 PR。

89303ae656#975

合并 PR #165(worktree-system-prompt-variables)

改动

Merge commit,把 worktree-system-prompt-variables 分支(system-prompt 变量、persona-as-section、tool-guidance 归属、provider-lifecycle events、agent-loop 改造、各 example/测试/catalog 更新)合入主线。

目的

正式落地 system-prompt 的变量与归属重构。

提交总结(g-39,共 25 个,从旧到新)25

7cdf8676dd#976

合并 master 进 move-acp-snapshot-replay-doc 分支

改动

将 master 上 system-prompt 归属、subagent provider 生命周期事件、ACP 桥接裁剪等改动合入 codex/move-acp-snapshot-replay-doc 分支(76 文件)。

目的

让文档搬迁分支跟上 master,准备 PR #177。

d64fe7b8b3#977

合并 origin/master 进 codex/parallelize-ci

改动

将 master 合入 codex/parallelize-ci(197 文件),含 RFC 目录重建、verify-rfc-format 新脚本、prompt 归属与 subagent 生命周期事件等。

目的

让 CI 并行化分支与最新的 RFC 改造保持同步。

dc8bf36400#978

合并 origin/master 进 codex/parallelize-pre-push

改动

将 master 合入 codex/parallelize-pre-push,内容同 7cdf8676dd(prompt 归属、subagent 生命周期、tsconfig 调整等,76 文件)。

目的

并行化 pre-push 分支跟进 master。

aa866e377b#979

合并 origin/codex/parallelize-ci 回自身

改动

空合并(无文件差异),把远程同名分支合并回 codex/parallelize-ci。

目的

同步远端与本地并行化分支状态。

f9cd84286f#980

合并 PR #177:将 ACP snapshot replay 文档移入包内

改动

把 docs/acp/snapshot-replay.md 移到 packages/ui/acp/,并更新 graph-atlas 与文档图脚本中的引用。

目的

让该文档与其所属代码同包,符合文档就近维护的约定。

60f7a592b3#981

合并 origin/master 进 worktree-add-merging-stacked-prs-skill

改动

将 master 合入 worktree 分支(76 文件),内容同 7cdf8676dd。

目的

让新 skill 分支跟进 master。

08e09217bf#982

记录 GitHub CI 并行化门禁 RFC

改动

新增 docs/rfc/process/2026-07-06-parallel-github-ci-gates.md,并在 ci.yml 加两行、INDEX 注册。

目的

沉淀 CI 并行门禁决策为 RFC。

c0af59f804#983

记录并行 pre-push 门禁 RFC

改动

新增 docs/rfc/process/2026-07-06-parallel-pre-push-gates.md,注册 INDEX,并在 lefthook.yml 加配置。

目的

记录 pre-push 并行化方案。

6ea7d7af53#984

CI 按文件并行化 real-api e2e

改动

调整 e2e.yml 与 vitest.e2e.config.ts 让 e2e 按文件拆分并行;更新几个 e2e 用例以适配并行执行。

目的

缩短 real-api e2e 的 CI 耗时。

3b145bff5c#985

文档:用 --base 按分支查依赖,而非带上限的全量扫描

改动

改 dsh-merging-stacked-prs skill 与 cookbook 中的 dependent 检查写法,统一为 gh pr list --base <branch> --json number --jq length。

目的

避免 --limit 截断带来的不精确计数与上下文浪费,得到精确的分支级依赖数。

42bdf4f8fa#986

合并 master 进 worktree-add-merging-stacked-prs-skill

改动

合入 ACP snapshot 文档搬迁的改动(4 文件)。

目的

skill 分支跟进 master 的文档移动。

89e7005cfd#987

文档:把 dependent 检查的语义说成 0 与非 0

改动

修改 SKILL.md 一行,澄清打印的数字是 min(actual, limit),只有 0 才能安全删除。

目的

修正被 --limit 截断的计数语义,避免误用作 auto-close 数。

282215f3fa#988

合并同名远端分支进 worktree-add-merging-stacked-prs-skill

改动

再次合入远端同名分支(4 文件,内容同 42bdf4f8fa)。

目的

同步远端 worktree 分支状态。

9c0cd392b9#989

合并 PR #176:新增 dsh-merging-stacked-prs skill

改动

新增 .agents/skills/dsh-merging-stacked-prs/SKILL.md(52 行),并改 cookbook 一处引用。

目的

引入处理堆叠 PR 合并的技能文档。

706691a7df#990

workflow:获取 slot 后重新检查取消状态

改动

在 workflow-vm/runtime.ts 的 agent() 中,acquireSlot() 之后立即复查 isCancelled(),并新增确定性回归测试;同步对齐 RFC 的并发公式。

目的

堵住 acquire 与 start 之间的微任务窗口,避免带着已 abort 的信号启动子 agent 造成泄漏。

0452261b5b#991

将并行 pre-push 门禁并入 CI scheduler

改动

新增 scripts/run-gates.ts(340 行)作为统一门禁调度器,大幅精简 .github/workflows/ci.yml,并扩展 publint-all、lefthook、package.json 脚本与文档。

目的

用一个可复用的调度器统一 pre-push 与 CI 的并行门禁。

80250a8f2e#992

workflow:删除 drive() finally 中无用的 abandon-timer 守卫

改动

workflow-vm/runtime.ts 删除 !== undefined 的条件分支,直接无条件 clearTimeout。

目的

移除因 finally 总先 cancel 而不可达的死代码。

44664551cf#993

测试:在 e2e 并行下等待 ACP stdout 帧

改动

扩展 examples/acp-agent/tests/acp.e2e.ts(+48 行),增加对 stdout 帧的显式等待。

目的

修复并行化带来的时序抖动,稳定 ACP e2e。

d9c401d27a#994

合并 origin/master 进 codex/parallelize-ci

改动

将 master 上的 skill 新增与文档移动合入 codex/parallelize-ci(6 文件)。

目的

CI 并行化分支跟进最新 master。

c64eca451c#995

CI:lint 忽略 doc-typecheck 的临时目录

改动

在 eslint.config.mjs 加一行忽略规则。

目的

避免 doc-typecheck 工作产物触发 lint 报错。

8510986909#996

compact:summarize 改为直接一次性的 llm/stream 调用,不再是 loop step

改动

compact-basic 不再走 agent/request 派发,改为直接 llm/stream;删除 compact seam 上的 turn/step 参数;更新 catalog 与测试。

目的

为「每个请求均可由会话日志重建」铺路,把一次性调用的拦截面收敛到 llm/stream。

7cd4868056#997

CI:将主要门禁拆分为宽车道

改动

扩展 scripts/run-gates.ts(+56 行)与 ci.yml,把门禁分成若干并行 lane,并更新 package.json 与文档。

目的

进一步并行化主门禁,缩短 CI 时长。

3f09159ab8#998

llm:引入 LlmCallConfig / callConfigEquals / deepFreeze 作为无状态请求词汇

改动

在 dsh-llm 新增 call-config.ts(含 LlmCallConfig 类型、callConfigEquals、deepFreeze)及对应测试,并导出。

目的

把调用配置(model + 采样参数)命名为独立词汇,供会话日志记录请求 header 并做变更检测,dsh-llm 保持无状态。

2d80d868be#999

CI:隔离 lint 并调优 coverage 车道

改动

ci.yml 加 lint 独立 lane;扩展 run-gates.ts(+48 行);更新 package.json 与文档。

目的

让 lint 单独运行、调整 coverage lane 的配置以优化 CI 并行度。

a7b569850b#1000

session:请求 header 成为日志状态——request/header 事件 + fold/diff/apply

改动

在 dsh-session 新增 request-header.ts(172 行)与 EpochHeader 类型,定义 request/header 快照与 request/header-delta 事件,以及 foldRequestHeader/diffHeader/applyHeaderDelta 三个纯函数;更新 session 文档、log-events catalog、type-equiv manifest 及测试(+491 行)。

目的

把每次对话请求的非内容部分(system prompt、tool schema、call config)记录进会话日志,使其可由日志单独重建,作为 reconstructability RFC 的核心地基。