Changelog

版本更新记录

站点与上游代码库的同步记录:每一轮 pull 后,哪些页面被修正了行号锚点,哪些页面的内容因上游语义变更而更新。行号锚定 master,版本号随上游 release 走。

§新新增卷三:AI 协同(2026-09-15)

新增一章 35 AI 协同:仓库如何与 agent 一起写代码。前 34 章读的是「dsh 是什么」,这一章读的是这个仓库本身怎么被写出来——它的 agent 协同基建。

覆盖内容(六个小节)

节主题关键事实
§1分层指令22 个 AGENTS.md;CLAUDE.md 是 git 符号链接(mode 120000,内容 9 字节 = AGENTS.md)
§2Agent Notes 决策记录1028 篇英文正本(implemented 355 / proposed 27 / rejected 14 / archived 629);两条轴编码进路径;verify-agent-note-format.ts(94 行)强制段落骨架;## Alternatives considered 必填;归档永久冻结
§312 个可复用 skill.claude/skills 也是符号链接 → ../.agents/skills;dsh-translate-docs 是唯一带 disable-model-invocation: true 的
§4把文档规则变成校验门226 个脚本 / 55 个 verify-*;doc-sync 聚合约 35 个 leaf gate;doc-budgets.manifest.json 约束常驻上下文长度
§5闭环:指令如何进入模型agent-instructions 读 AGENTS.md/CLAUDE.md → inbox;skill-filesystem:251 扫描 .agents/skills → tool-skill:226 渲染 <available_skills>。仓库用 dsh 的机制管理 dsh 自己的开发
§6取舍分析六组「得到 / 付出」对照;贯穿原则:把纪律变成可执行的断言

与 23 页的分工:23 页讲 skill 作为产品能力的加载机制;35 页讲这个仓库自己如何用这套机制。两者在 §5 会合——加载 .agents/skills/ 的正是 dsh 自己的 skill-filesystem 插件。

§1站点当前状态

项值
上游仓库D:\dev\sourcecode\deepseek-harness(master)
站点锚定版本0.1.7-rc.1(commit 46a7f68b09 Merge PR #5073)
覆盖范围36 页:卷零(00-04 入口与组装)+ 卷一(05-17 核心循环深读)+ 卷二(20-34 能力全景 15 章)+ 卷三(35 AI 协同)+ 总览 + 版本更新
锚点数量200+ 处文件:行号引用,均经上游源码逐行验证(_verify.py 自动比对,当前 0 差异)
显示版本0.1.6-alpha.2 → 0.1.7-rc.1:23 个页面 + assets/nav.js 的页脚
站点仓库D:\dev\sourcecode\dsh-reading(独立 git,推送到 coldingcode.github.io)

§00000000最新:0.1.6-alpha.2 → 0.1.7-rc.1 同步(2026-09-23)

本轮 pull 的变更量:1617 个提交、5142 个文件。这是站点历次同步里跨度最大的一次——四处破坏性 API 变更,15 个页面、159 处锚点漂移。

① 会话格式升到 V4:developer/message 与 forked—— 06 页新增 §1d

文件变更
packages/core/session/src/types.ts(500→523 行)SESSION_FORMAT_VERSION 3 → 4(89 行)。SurfaceEventType 从 4 个成员扩到 5 个——新增 'developer/message'(441 行)。该事件携带 headerSeq?: SessionSeq(316 行):有工具新增时必须指向定义它的 request/header,工具定义不在消息里重复。TurnEndReasonMap 新增 forked 变体(228 行)——fork 落在 open turn 内不再被拒绝,改由 buildForkSeed 合成 closers
packages/core/session/src/surface.ts(662→718 行)新增 assertDeveloperHeader()(373-401 行)——校验 developer 消息的 tool 增删能解析回既有 header。新增 validateSessionEventData 的 developer 分支(177-205 行)
packages/session/session-format-v3-to-v4/第三个迁移包(前两个是 v0→v1、v1→v2、v2→v3)
packages/core/session/src/index.ts(1317→1310 行)新增 firstLifecycleSeq 字段(492 行)区分「继承前缀」与「本生命周期」;MESSAGE_ROLE_BY_TYPE['tool/result'] 从 'user' 改为 'tool'(行为性变更);SessionForkErrorCode 删除 OPEN_TURN

② Shell 契约合并:run + start → execute—— 15/16/17 页

文件变更
packages/shell/shell/src/index.ts(104→96 行)破坏性:两个抽象方法合并为一个——abstract execute(spec): Promise<ShellExecution>(93 行)。前景还是背景由「await 什么」决定。SHELL_SETTINGS_NAMESPACE 删除(设置改由 schemastery .volatile() 承载)
packages/shell/bash-local/src/index.ts(370→404 行)run/runArgv/start/startArgv → execute(187 行)/ executeArgv(201 行)。新增 onExpiry 语义('none' 不设截止 / 'kill' 到期杀)、classify 首因分类闭包(218-221 行)、onStarted 钩子(204 行)、准备阶段也可超时(230 行)
packages/shell/tool-bash/src/index.ts(389→576 行)新增「前台超时转后台」:配置项 promoteOnTimeout(236 行,默认 true)——超时不再 kill,而是转为后台 job 并返回 jobId 与已产出输出。新增输出联合 kind: 'promoted'、ctx.tools.register 双形态注册(有 ctx.jobs 时替换)、startJob()/waitOnJob()/toolAborted() 三个 helper

③ 分辨率子系统收敛为单一路径—— 02/04 页

文件变更
packages/boot/app-boot/src/profile.ts(951→724 行,−227)整套 symlink/ESM-proxy 物化机制被删除(约 −420 行):healProfilesModuleFallback、healIsolatedProfileModuleFallback、createProfileResolutionGeneration、ProfileResolutionMode(三态 'link'|'dual'|'runtime')、ProfileResolutionEntry/Generation 全部不存在。取而代之:createRuntimeResolution()(406 行)+ RuntimeResolution(129)/ RuntimeResolutionEntry(104)/ LinkedRoot(121)。ProfileLayer.patchPath 改名 patchPaths(84 行);normalizeShippedProfile 去掉 export(566 行)
apps/cli/src/profile-boot.ts(337→324 行)composeProfile 里的 resolutionMode 三态判断删除——createRuntimeResolution 无条件执行(204 行)。runProfile 里的打包探测与 resolutionMode 计算也一并删除

④ CLI 新增 --dump-config-schema—— 00/01 页

文件变更
apps/cli/src/args.ts(196→211 行)新增第四个 invocation 类型 DumpConfigSchemaInvocation(44-50 行),DshInvocation 联合扩到 4 个成员(61 行)。新 flag 打印「声明的插件 JSON Schema,不挂载 profile」(171 行)。dump 互斥判断改为三选一数组(115-121 行),报错文案随之更新
apps/cli/src/bin.ts(75→68 行)本地 readVersion() 删除——版本改由 getDshRuntimeVersion()(从 dsh-app-boot 导入)提供(19 行)。新增 case 'dump-config-schema'(55 行)

⑤ 其他机制变更(站点已同步)

  • abortedCancelCause()(05 页新增 §6,agent.ts:79-94):取代裸的 signal.reason as AgentCancelCause 断言。重建一个干净的 { kind } 对象,丢掉 Node 附加的 stack——否则 Session.append 要么把它写进日志、要么因非 JSON 序列化而拒绝。这是 agent.ts 620→647 行的全部来源。
  • 新增 packages/boot/plugin-manager/(2227 行,12 文件):插件安装/卸载的完整生命周期,含 build-approval、install-spec、run-tree、registry。apps/cli/src/plugin.ts 因此大幅瘦身。
  • 新增 packages/boot/config-editor/;packages/boot/ 现为 5 个子包(app-boot / cmdline / config-editor / hmr / plugin-manager)。
  • 新增顶层分组:packages/code-runtime/、packages/e2b/、packages/examples/、packages/deliverables/、packages/document/。
  • 配置系统迁到 schemastery .volatile():bash-local 的 graceMs 等改为 this.config.graceMs.get() 访问器;agent-loop 的 maxParallelToolCalls 同理(tool-calls.ts:132)。
  • app-boot 新增模块:compatibility-preflight.ts、config-schema/(7 文件)、package-meta.ts、plugin-compatibility.ts、profile-compatibility.ts——profile.ts 的旧职责拆出。
  • tool 新增 projectContent 钩子(tools/src/index.ts:245):在 tools/post-execute 策略之前安装执行预备内容。
  • runtime-context 成为一等消息来源:新增 MessageSourceMap 增强声明,SOURCE 从 '@deepseek-ai/dsh-system-prompt' 改为 'runtime-context'。
  • session-persistence-jsonl(1647→1725 行):历史会话的 subagent 子会话目录迁移、corpus revision、listGenerations() 与 listArtifacts() 拆分。

⑥ 本轮同步的锚点工作

15 个页面、159 处锚点漂移。位移与语义变更交织:agent.ts +27、surface.ts +56、types.ts +23、app-boot/index.ts +53、profile.ts −227、args.ts +15、bin.ts −7、tool-bash +187、bash-local +34、shell/index.ts −8。_verify.py 全程用于定位与复验,最终 0 差异;结构检查同样 0 问题。

§00000000.1.6-alpha.1 → 0.1.6-alpha.2 同步(2026-09-16)

本轮 pull 的变更量:882 个提交、2548 个文件。核心是一次启动链的多重重构——热重载独立成包、CLI 参数模型更换、启动失败有了诊断落盘。站点 11 个页面受影响,66 处锚点漂移。

① 热重载独立成包:packages/boot/hmr/—— 04 页 §3 重写

文件变更
packages/boot/hmr/(3 个新文件 / 723 行)全新包。热重载从 launcher 里的一段胶水升级为 Cordis 服务:class Hmr extends Service(src/index.ts:88,super(ctx, 'hmr'))。watch-config.ts(92 行)从 app-boot 搬来,error.ts(41 行)新写
apps/cli/src/profile-boot.ts(413→337 行)整块 HMR 生命周期被删除:composeLive、watchUserPatches、suppressShutdownError、allPatches、cordis-plugin-timer/hmr 的按需挂载、patchReload === 'live' 判定——这些符号现在在整个仓库都不存在。取而代之:新增 profileContext 对象并在 prepare 回调里 provide 进树(308 行),HMR 服务自己去读
packages/boot/app-boot/src/index.ts(945→1011 行)新增 reconcileProfilePatches(251 行)——热重载时应用整代补丁的入口。watch-config.ts(89 行)被删除

② CLI 参数模型:web 子命令 → 通用前缀展开—— 00/01 页更新

文件变更
apps/cli/src/args.ts(211→196 行).command('web') 与 rejectParentOptions 双双删除。改为通用展开(186-188 行):第一个 token 不是选项也不是 plugin 时,前置 --profile。于是 dsh web、dsh tui、dsh rescue 全部等价于 dsh --profile <name>——零边际成本。新增 selectProfile 校验器(29-32 行)拒绝重复的 --profile、.helpCommand(false)(148 行)、.usage()(140 行)
apps/cli/src/bin.ts(66→75 行)新增启动失败诊断捕获(45-49 行);runPlugin 调用变 await(54 行);version 提升为局部变量(31 行)

③ 启动失败诊断—— 00 页新增 §5,03 页 §4 更新

文件变更
apps/cli/src/startup-diagnostics.ts(新文件 68 行)把完整诊断写进 $DSH_HOME/logs/ 下的唯一命名文件,终端只留摘要。刻意不收集环境变量值与插件配置(报告可能被贴进 issue);写失败时把完整报告也打到 stderr,不谎称「已保存」
packages/boot/app-boot/src/index.tsboot 新增启动日志收集器(925-934 行)——一个独立 Context 挂 logger exporter,只收 warn/error,必须活得比 root disposal 长(在 finally 里才 dispose);新增 internal/update 拦截(943-945 行)接住 Cordis 丢弃的 restart promise。StartupError 类(746 行)携带结构化 entries,boot 把 startup 日志挂上去(964-967 行)
auditStartupEntries(818→870 行)改为抛 StartupError 而非普通 Error;用单个 required Set 取代两个数组分拣;白名单从 9 项减到 7 项

④ 其他机制变更(站点已同步)

  • Inbox 投影注册移交(07 页):ReactLoopInbox 的构造器现在是空的 ) {}——注册职责移到 AgentLoop(agent-loop/src/index.ts:416-417,与 turnBoundary 一起注册)。inbox.ts 247→244 行。
  • Profile.patchReload 字段删除(02 页):profile 不再声明热重载策略——HMR 服务读 profileContext 就知道该观察什么。相关校验代码整段消失,PROFILE_TEMPLATES 条目从两行压成一行。
  • resolvedProfile / packageManager(04 页):RunProfileOptions 新增两个字段,让打包应用(Electron desktop)交来自己已加载的 profile,绕过 $DSH_HOME 命名查找。
  • 分辨率模式默认值翻转:resolutionMode 的默认从 'link' 改为 'runtime'——内存路由表成为常规路径,symlink 物化退化为可选。
  • app-boot 三个新模块:profile-context.ts(75 行,readProfilePatches 接手五层组装 + 遥测 patch)、profile-plugins.ts(127 行,插件清单读写)、profile-sanitize.ts(34 行,文件系统恢复)——内容分别从 profile-boot.ts 与 apps/cli/src/plugin.ts 搬出。
  • initProfile 签名简化:(dir, bundles, patchReload) → (dir, bundles)。
  • 新增 skill-office 包:内置 Word/PPT/Excel 工作流(3 个 SKILL.md + Python 结构检查脚本)。注意这是产品包(packages/skill/),与仓库自己的 .agents/skills/ 不同层。
  • llm 微调:discoverModels 透出 inputModalities(llm/src/index.ts:617)——模型发现时一并报告模态能力。

⑤ 卷三的数据刷新

本轮同步顺带更新了 35 页的统计:Agent Notes 1028 → 1105 篇(implemented 355→424、archived 629→635),scripts/*.ts 226 → 230 个。这本身就说明这套协同基建在持续运转——每轮同步看到的数字都在长。

⑥ 本轮同步的锚点工作

11 个页面、66 处锚点漂移。位移主要来自 app-boot/index.ts +66(新增日志收集与 StartupError)、profile-boot.ts −76(热重载迁出)、args.ts −15、inbox.ts −3、llm/index.ts +1。_verify.py 全程用于定位与复验,最终 0 差异;结构检查(内部链接、锚点、标签平衡、页脚版本)同样 0 问题。

§0000000.1.5-rc.2 → 0.1.6-alpha.1 同步(2026-09-15)

本轮 pull 的变更量:666 个提交、3123 个文件。核心语义变更三个主题,另有一次破坏性重命名。

① 插件消息投影:surface 的第三种变换—— 06 页更新

文件变更
packages/core/session/src/surface.ts(566→662 行)新增 SessionMessageProjection(35-48 行):纯解释型投影器——输入一个事件 + 它之前的历史,输出「哪些既有消息被改成了什么」(按原事件 seq 索引的新副本)。nodes 不变、事件序不变,只有 message 内容变,且可逆(移除投影器定义即还原)。planSurfaceEvent 新增三路分派(473-481):有投影器 → 交给它;类型属于「必须有投影器」集合但没找到 → 报错;否则走传统 surfaceOp。新增 foldSurface(544 行)
packages/core/session/src/known-event-types.ts新增 'image/offload' 事件与 MESSAGE_PROJECTION_EVENT_TYPES 运行时清单——0.1.6 首个投影用户是图片卸载(把历史里的大图替换成占位文本,日志原样保留)
packages/core/agent-loop/src/agent.ts(619→620 行)session.surface.replaceGeneration → contentGeneration(三处:102、368、562)。surface 现在有两个计数器:replaceGeneration 只统计位置性替换,contentGeneration 还统计投影改写。loop 关心「模型看到的内容变了吗」,必须用后者
packages/core/session/src/types.ts(495→500 行)tool/result 的 error 新增 reason?: string(363 行)——面向用户的原始失败原因,不进模型可见内容

② profile 分辨率子系统:内存路由表—— 04 页新增 §1c

文件变更
packages/boot/app-boot/src/profile-resolution/(4 个新文件 / 1178 行)新增子系统。resolver.ts(975 行)接管 Node 默认的 ESM + CJS 解析器,按 profile 包表做内存路由;service.ts(117 行)包成 PluginPackages extends Service;legacy-links.ts(73 行)收纳从 profile.ts 搬出的链接工具;worker-bootstrap.ts(13 行)让 Worker 线程装同一张表
packages/boot/app-boot/src/profile.ts(848→940 行)healProfilesModuleFallback 返回类型 Promise<void> → Promise<ProfileResolutionGeneration>(574 行);新增 createProfileResolutionGeneration(633 行,纯计算不落盘);ProfileResolutionMode = 'link' | 'dual' | 'runtime'(121 行);新增 sdk-minimal 模板(156 行)
apps/cli/src/profile-boot.ts(392→413 行)composeProfile 新增 resolutionMode 参数(235 行)并按模式选路径(240-242);runProfile 检测 process.pkg → 打包发行版强制 runtime 模式(304-305);boot 的 prepare 回调变 async,在任何条目挂载前 await hostCtx.plugin(PluginPackages, ...)(352-360)

③ 启动审计分级 + shell 后台执行支持—— 03/15/16 页更新

文件变更
packages/boot/app-boot/src/index.ts(862→945 行)assertEntriesActivated → auditStartupEntries(818 行)——不只是改名,行为变了:新增第三个参数 warn,并按 requiredStartupEntryIds 白名单(711-719:agent-loop / webserver / modules / connection / headless-runner / acp / sdk-jsonrpc-server)把失败分成必需与可选——必需失败抛错,可选失败只警告。旧的 assertEntriesLoaded 被删除,收集逻辑拆进 inactiveEntries(752 行)
packages/shell/shell/src/index.ts(102→104 行)破坏性变更:abstract start(spec): ShellProcess → Promise<ShellProcess>(101 行)。取消或准备失败时在发布句柄之前就 reject
packages/shell/bash-local/src/index.ts(342→370 行)runArgv 第二参数拓宽为 readonly string[] | ((signal) => Promise<readonly string[]>)(227 行),返回值改为 { result, spawnRequested }(228 行)——函数参数与同一个 deadline 赛跑,超时则不 spawn
packages/shell/tool-bash/src/background.ts(30→67 行)新增 processJob(36 行)——把异步的 shell 准备适配成同步的 JobHooks,作业的 done 现在跨越「准备 + 进程结算」两段

④ 其他机制变更(站点已同步)

  • runMaintenance 的 disposed 守卫(agent.ts:173-174):收敛时先查 abort 原因,disposed 不再重放唤醒。
  • AgentLoop.publish 变 async(agent-loop/src/index.ts:216):创建监听器现在会在 disposal 前被 await(publication promise),避免它们在 teardown 中途还持有 session。
  • system-prompt 的 interpolate: false:section 可声明不做变量插值(保留字面文本)。新增 TOOL_COMPUTER_USE: 3000 / MCP_SERVERS: 3100 两个 order 常量。
  • code-runtime 全线改名 ptc-runtime:packages/code-runtime/ → packages/ptc-runtime/,CodeRuntime → PtcRuntime,CodeSdkLanguage → PtcSdkLanguage。
  • workflow 引擎迁进 PTC 运行时:packages/workflow/workflow-worker-thread/(1987 行)整体删除,由 packages/workflow/workflow-ptc/(1321 行)取代——PtcWorkflowEngine 的 inject 变成 ['subagents', 'ptcRuntime', 'sandboxPolicy'],编排脚本从 worker 线程搬进沙箱(25 页已更新)。
  • mcp-client 精简:src/index.ts 188→203 行,重活拆到 connection.ts/tools.ts/transport.ts,新增 server-context.ts 与 maxInstructionBytes 选项。
  • 会话格式迁移器出现:新增 packages/session/session-format-v0-to-v1/、-v1-to-v2/、-v2-to-v3/ 三个迁移包——0.1.5 引入的 v3 断点现在有了显式升级路径。

⑤ 本轮同步的锚点工作

15 个页面、98 处锚点漂移。主要位移来源:agent.ts +1、session/index.ts +33、surface.ts +96、system-prompt/index.ts +8、tools/index.ts +19、app-boot/index.ts +83、profile.ts +92、profile-boot.ts +21、bash-local/index.ts +28。_verify.py 全程用于定位与复验,最终 0 差异;结构检查(内部链接、锚点、标签平衡、页脚版本)同样 0 问题。

§000000.1.3-alpha.2 → 0.1.5-rc.2 同步(2026-09-11)

跨两个 minor 版本(0.1.3 → 0.1.4 → 0.1.5)的一次同步。核心语义变更一个主题:system prompt 从请求头字段迁移为 surface 事件——它连带改了会话格式版本、step 的结构、以及适配器的一个能力位。

① system prompt 迁为 system/message surface 事件—— 05/06/08/09/11/12 页更新

文件变更
packages/core/session/src/types.ts(489→495 行)SESSION_FORMAT_VERSION 2 → 3(88 行)。SurfaceEventType 扩到 4 个成员——新增 'system/message'(310 行),形状 { turn: number; step: number; message: SystemMessage }。它是 surface 节点 0,排在所有 user/message 之前
packages/core/session/src/surface.ts(566 行)新增 validateSessionEventData(140 行)——字段级校验,其中 149 行拒绝带 system 字段的 request/header(「must omit header.system; use system/message」)。deriveEventMessage 增加 'system/message' 分支(113 行)
packages/core/agent-loop/src/runtime-context.ts(76→159 行)新增 SystemPromptProjection(60-106 行):project(rendered, input)(83 行)比较 surface 上现存的 system 节点与本次渲染结果,返回 SystemPromptCommit[]。in-history 能力位为真时追加新节点(96-97 行),否则 replace head(90-95 行)
packages/core/agent-loop/src/agent.ts(597→619 行)新增字段 systemPrompt: SystemPromptProjection(92 行,构造器 111 行)。requestSurfaceGeneration 改为构造时即赋值(102 行,不再 undefined 起步)——它现在同时服务 series 判定(367 行)。this.ctx = this.scope.ctx(105 行,不再 extend({agent}))。step 拆成 prepareRequest(501 行)+ buildRequest(553 行,同步纯函数)
packages/llm/llm/src/index.ts(1134→1147 行)prepareCall 新增能力位 systemPromptUpdate(942 行)——适配器声明「能否把 prompt 更新当作历史内的一条消息」。adapterStream 输入投影改为两段:文件投影(1045-1047)+ 图片投影(1048-1051)

② --from-default-profile:用模板初始化自定义 profile—— 00/01/04 页更新

文件变更
apps/cli/src/args.ts(199→211 行)新增 --from-default-profile <name>(注册 146 行),ProfileInvocation.fromDefaultProfile?(25 行)与 DumpConfigInvocation.fromDefaultProfile?(37 行)都要带上——预览树必须与真实启动同规则
apps/cli/src/profile-boot.ts(320→392 行)新增 initializeProfileFromDefault(104-154 行):用出厂模板建一个自定义名字的 profile。独占创建(127 行 mkdirSync 不带 recursive)、出货名保留(119-124 行)、失败即回滚(145 行)。prepareProfile(187 行)新增第三参数并在此调用
apps/cli/src/bin.ts(60→66 行)fromDefaultProfile 透传给 runProfile(37 行)与 runDumpConfig(54 行)

③ 其他机制变更(站点已同步)

  • turn 的提前收敛:agent.ts:294 新增 if (turnEnds && decision.messages.length === 0) break——终局已定且无新输入就不再空跑一次 step。
  • step 的 firstAttempt 标志(agent.ts:360):重试循环里 user/message 与 system/message 只在首次尝试落盘一次,避免重试时重复注入。
  • inbox 的 unban / splice 语义:determineStartOfRevertedRange 逐槽取 Math.max,负 startIndex 的钳制更精确。
  • session/end-seed 拆分:Session.fromRestore(530-544 行)成为静态工厂,私有构造器带 5 个参数(546-552 行)。

④ 站点级修正(本轮新发现的历史错误)

  • packages/host/apiproxy/ 不存在——32 页曾引用它。该包在 0.1.2-alpha 之前就被删除(4f00a8b82a refactor(api): remove ApiProxy package),任何发布标签里都查不到。已改指 packages/api/gateway/(11 文件 / 4391 行,TypertGatewayService @ src/index.ts:169)。
  • system-prompt/assemble 是连字符不是斜杠——12 页曾写作 systemPrompt/assemble,全仓库 0 命中。真实事件名声明在 system-prompt/src/index.ts:31,派发在 617-620 行。
  • 20 页的 static inject = ['sessions'] 在 jsonl 后端里并不存在——它靠基类 super(ctx, 'sessionPersistence') 注册(session-persistence-jsonl/src/index.ts:261)。已补上格式版本守卫(263-268 行)。
  • 03 页 boot 代码块缺 </code></pre> 闭合标签——预先存在的 HTML 结构错误,导致后续块边界错位。已修复。

⑤ 校验方式升级

本轮起站点带一个可执行的锚点校验器 _verify.py:扫描所有 HTML 里 <figcaption> 标明的文件路径与每个 <span class="ln"> 行号,去上游源码取对应行、按标识符集合做模糊比对(容忍折叠签名与中文尾注)。当前全站 0 差异。以后的同步只需重跑它即可定位所有漂移。

§00000.1.3-alpha.1 → 0.1.3-alpha.2 同步(2026-09-08)

本轮 pull 的变更量:4345 个文件、+90046/-19843(含 alpha.2 与大量 web/CI 合入)。站点锚定文件里的核心语义变更两处:

① Inbox 迁移为 session projection—— 07 页重写

文件变更
packages/core/agent-loop/src/inbox.ts(新增 247 行)
packages/core/agent/src/inbox.ts(删除 220 行)
文件从 core/agent 迁到 core/agent-loop,类改名 Inbox → ReactLoopInbox(implements InboxContract)。架构重构:不再是「构造器自己回放日志维护内存 state」,而是注册一个 session projection(inboxProjectionDefinition,key 'inbox',stateVersion: 1,apply 内做坐标与 id 唯一性校验);状态经 projections.stateOf(session, 'inbox') 读取。mutate 顺序变化:先 toSpliced 本地试算并校验,再 append 落盘
packages/core/agent/src/types.ts(95 行)InboxState/InboxWireState/InboxContract 契约类型留在 core/agent,实现迁走
packages/core/agent-loop/src/agent.ts(589→597 行)构造顺序变化:先建 dispatch/scope/ctx,再 new ReactLoopInbox(this.ctx.sessionProjections, session, this.dispatch)(103 行);inbox 类型为 ReactLoopInbox

② bin.ts 抽出 runCli—— 00 页更新

文件变更
apps/cli/src/bin.ts(50→60 行)dispatch 收进导出的 runCli()(28 行);末尾 if (import.meta.main) await runCli()(58-60 行)——测试 import 本模块不再触发进程自执行
apps/cli/src/args.ts(191→199 行)parseDshArgs 112→118、resolveBoot 83→89

③ 其余行号位移(站点已同步)

  • session/index.ts 1254→1248:Session 类 451→422、构造器 541→522、append 699→678、eventAt 618→597、ownEvents 645→624、deriveMessages 820→799;session/end-seed 新增 { inherited: true } 变体(583 行)。
  • session/types.ts 483→489:SessionEvent 447→453、assistant/attempt 313→319、RequestHeaderReason 252→258。
  • system-prompt/index.ts 614→630:assemble 536→552。
  • app-boot/profile.ts 861→853:PROFILE_TEMPLATES 137→110、新增 loadProfileDirectory(774 行)、manifest 类型迁到 @deepseek-ai/dsh-package-manifest。
  • app-boot/index.ts 862:boot 790→787、assertEntriesActivated 725→722。
  • tool-bash 393:apply 190→189、defineTool 242→241、execute 330→329。

§0000.1.2-rc.1 → 0.1.3-alpha.1 同步(2026-09-05)

本轮 pull 的变更量:1672 个文件、+43229/-14119。站点锚定文件里的核心语义变更:assistant-stream 机制重构(一处大主题)+ 文件引用投影:

① assistant-stream 机制(assistant/chunk 退役)—— 05/06/10/11 页更新

文件变更
packages/core/agent-loop/src/agent.ts(545→589 行)step 的流消费重构:AssistantStreamAttempt(新文件 assistant-stream.ts,140 行)取代 BlockAssembler——start/push/settle/abandon 三态;settle 时一次性落 assistant/attempt 或带内嵌 stream 的 assistant/message;未结算走 abandon(不落盘);结算失败抛 AggregateError
packages/llm/llm/src/assistant-stream.ts(新增,297 行)流帧/compact 编码/expandAssistantStream 恢复解压
packages/core/session/src/types.ts(483 行)SESSION_FORMAT_VERSION 0 → 2(86 行);assistant/chunk 从 SessionEventMap 移除;assistant/attempt(313 行,内嵌 stream);assistant/message 内嵌 stream、sourceEventSeqs 移除
packages/core/session/src/index.ts(1224→1254 行)恢复路径用 expandAssistantStream 校验内嵌流(295 行);chunk-rows.ts 删除(packChunkRuns/decodeStorageRecord 退役)
packages/core/agent/src/runtime-types.ts(299→347 行)新增 agent/assistant-stream live 帧事件(315 行)

② 文件引用投影—— 10 页更新

文件变更
packages/llm/llm/src/index.ts(1092→1134 行)新增 fileRequestText(ref)(673 行)与 fileReadPath:把持久文件引用(FileAttachmentRef)解析为每次 provider 请求的确定性文本(PR #3109 generic file upload);contentHasFile/projectFilesToText 加入投影

③ 其余影响面

  • agent.ts 行号位移(preStep 234→237、turn 255→258、kick 219→222、wakeDriver 181→184、send 122→125、setPhase 113→116、buildRequest 444→488)——05/08/09 页已全面重映射。
  • session/index.ts 行号位移(append 668→699、构造器 514→541、deriveMessages 790→820、firstLiveSeq 555→581)——06 页已重映射。
  • llm/index.ts 行号位移(prepareCall 890→904、adapterStream 964→998、streamWithRegistration 1055→1097、forAdapter 944→958)——09/10 页已重映射。
  • 06 页真实 fixture 行更新为 assistant/attempt 格式(v2)。

§000.1.2-alpha.3 → 0.1.2-rc.1 同步(2026-09-04)

本轮 pull 的变更量:2682 个文件、+46669/-33253。站点锚定文件里的实质语义变更集中在一处大主题(session 序列品牌化)与两处引导层变化:

① Session 序列品牌化(SessionSeq / SessionLogOffset)—— 06/07/13 页更新

文件变更
packages/core/session/src/types.ts(430→475 行)新增 SessionSeq = BrandedNumber<'SessionSeq'>(29 行,工厂拒绝 -0/负数/非整数)与 SessionLogOffset(44 行);header.seedLength 移除,换成 isSeeded: boolean(111 行)
packages/core/session/src/index.ts(1156→1224 行)append 的 seq: SessionSeq(this.log.length)(693 行);新增 eventAt(seq)(588)/ ownEvents()(615,由 inheritedEventCount 切出的自事件视图);firstLiveSeq 品牌化(555 行);create/fromRestore 增 inheritedEventCount 参数
packages/core/agent/src/inbox.ts构造器回放改 session.ownEvents()(32 行)——07 页已更新
packages/core/session/src/surface.ts(460→476 行)全部 seq 类型改为 SessionSeq(数值语义不变,类型层防错)

② HTTP 代理引导—— 03/04 页更新

文件变更
apps/cli/src/profile-boot.ts(307→320 行)runProfile 开头新增 installProxyFromEnvironment(215-218 行,@deepseek-ai/dsh-http-proxy,PR #3198)——Node fetch 不读代理环境变量,需从 launcher 快照手动装代理;shutdown 时 disposeProxy()(225 行)
packages/boot/app-boot/src/index.ts(846→864 行)boot 772→790、assertEntriesActivated 692→725(03 页行号位移);HOME_LAYER_PROXY_NAMES:Harness-home .env 允许设 HTTP(S)_PROXY/ALL_PROXY/NO_PROXY(其余 .env 层拒绝)

③ 其余影响面(站点未覆盖或行号位移)

  • packages/core/agent-loop/src/index.ts(713→915 行):AgentLoop 生命周期重构——StoredSession 写句柄与 storedCount、SessionPersistenceNotFoundError 判断「真缺失」、配置启动失败 trackStartup 追踪。
  • packages/core/agent-loop/src/{agent,tool-calls,runtime-context}.ts:仅 SessionSeq 类型化(chunkSeqs/callSeqs 等),行号未变;13 页 trace 里 167→168 已修。
  • packages/core/agent/src/index.ts(±21):AgentRegistry 细节调整。
  • 各包 invariant.ts 有删减(bash-local/shell/tool-bash/subprocess-local 的 invariant 移除)——站点未深入。

§00.1.1-rc.2 → 0.1.2-alpha.3 同步(2026-09-01)

本轮 pull 的变更量:7036 个文件、+355256/-144539(rc.2 之后两个 alpha 版本的全部合入)。站点锚定的核心文件有大批语义变更,逐页处理如下:

① request/header 的 series 维度—— 05/08/09/11 页更新

文件变更
packages/core/agent-loop/src/agent.ts(515→545 行)step/buildRequest 新增 startsRequestSeries 与 surfaceGeneration 参数;header 落盘三条路(initial/resume · change 附 startsSeries · 新增 reason:'series');构造器改从 sessionProjections.stateOf(session, 'turnBoundary') 恢复 lastTurn(不再 findLast 扫日志);AgentOptions 新增 reasoningEffort
packages/core/session/src/types.ts(430 行)RequestHeaderReason 扩为四值(+'series');request/header 数据新增 startsSeries?: true;CallId→ToolCallId;TodoItem 移入 dsh-todo;SessionId 改用 brandString
packages/core/agent/src/runtime-types.ts(292→299 行)Agent 接口迁至 types.ts(declaration merging);PreStepDecision 的 enter 新增 startsRequestSeries?: true

② LLM:TypertRemoteService 与 @Remote—— 09/10 页更新

文件变更
packages/llm/llm/src/index.ts(1026→1092 行)LlmRuntime extends TypertRemoteService(可被远程载波);discoverModels/remoteDiscoverModels 支持 signal;LlmAdapter 新增 imageRequestPricing(route 拥有的图片定价);deepFreeze 移入 dsh-util-values
packages/llm/llm/src/content.ts(202 行,+179)图片投影逻辑扩展;contentHasImage 递归检测保持唯一

③ 提示词 SECTION_ORDERS 中央分配表—— 12 页更新

文件变更
packages/core/system-prompt/src/index.ts(545→614 行)order 区间约定(-100 identity / 0 persona / 100-199 tools)替换为中央具名表 SECTION_ORDERS(121-155 行,HARNESS_IDENTITY:-1000 … STRUCTURED_OUTPUT:9900);排序比较器 comparePromptSections,平局按 code-unit 名字序

④ profile 层重构—— 02/03/04 页更新

文件变更
packages/boot/app-boot/src/profile.ts(420→861 行)PROFILE_TEMPLATES 变 ProfileTemplate 对象(可带 patchReload 等元数据);ProfilePatchReload = 'live' | 'startup' 控制用户层补丁的加载生命周期;healProfilesModuleFallback 重构为 async + 锁内更新(并发启动安全)
apps/cli/src/profile-boot.ts(300→307 行)composeProfile 变 async;新增 AppReady 就绪信号(boot + host setup 成功后才 commit);应用所选的 patch-reload 生命周期

⑤ 其余(站点未覆盖或无需改动)

  • apps/cli/src/bin.ts(53→50 行):头部 JSDoc 精简,代码未变——00 页行号重映射。
  • packages/core/tools/src/:code-mode.ts 改名 ptc.ts(PTC 传输);ts-types/py-types 同步调整——14 页提到 code-mode 的句子已随主链行号更新,未深挖改名细节。
  • packages/core/session/src/:json.ts 移除(无损 JSON 工具迁入 @deepseek-ai/dsh-util-values);新增 seq-ranges.ts(seq 区间编解码);chunk-rows.ts +56 行。
  • packages/subprocess/subprocess-local/:process-inspector.ts +275(重写)、windows-inspector.ts ±29、terminal.ts ±36——16 页「下层职责」描述仍成立。
  • packages/llm/llm/:never.ts / call-config.ts 部分删除(assertNever 等迁入工具包),brand.ts +28(ToolCallId 等新品牌类型)。

§2示例贯穿:全书配套真实轨迹(2026-08-23)

用户反馈:纯讲解难吃透,要带入示例看。新增「示例轨迹」组件(米色 .trace 块),全书 33 页每页一个「示例」节:

  • 卷零(00-04):用真实命令 pnpm dsh web 贯穿——真实 argv 分解、本机真实 profile 目录(~/.dsh)、真实 dump-config 输出(135 个条目)、真实 help 文本、五层补丁的真实内容。
  • 卷一(05-17):用一条消息「帮我列一下当前目录」贯穿——完整的 turn/step 事件序列(seq 0-16 逐条标注)、真实 fixture 的 JSONL 行格式(plain-turn)、inbox 三个 splice、preStep 四动作实况、请求折叠、流 chunk、压缩/取消/interrupted 分支。
  • 卷二(20-34):每章配该能力域的实况轨迹(持久化的崩溃恢复、压缩的 replace 事件、子代理的血缘头、审批的升级流程等),并与卷一的 seq 序列交叉引用。
  • 所有示例标注「来源」行(真实文件/真实行号/真实输出),与解读严格分离——轨迹是可复现的数据,不是叙事。

§3结构性重构:从叙事到全书(2026-08-23)

用户反馈:旧结构只讲了「叙事逻辑」(核心机制的故事),没有把整个项目线性地讲清。重构为三卷全书结构:

  • 卷零 · 入口与组装(00-04):从 bin.ts 到活插件树的完整启动链。
  • 卷一 · 核心循环深读(05-17):一条消息的一生 + shell 旁支。
  • 卷二 · 能力全景(20-34,新增 15 章):按 cordis.patch.yml 挂载顺序遍历每一个能力域——20 持久化、21 压缩、22 子代理、23 技能命令、24 目标计划、25 工作流任务、26 文件系统、27 终端 LSP、28 Web、29 审批沙箱、30 存储查询、31 设置凭据、32 SDK/API、33 客户端/Python/Native、34 工程基础设施。每章统一结构:挂载条目 → 包文件地图 → 机制 → 与卷一连接点 → 关键代码 → 易错点。
  • 导航改为三卷分组;新增 assets/nav.js 共享导航。

§4rc.7 → 0.1.1-rc.2:同步(2026-08-21)

本轮 pull 的变更量:3319 个文件、+83084/-21535(含两个 rc 版本的全部合入)。站点锚定的 18 个文件里有实质语义变更的集中在四处,均已更新:

① 取消时固化文本前缀(interrupted 锚点)—— 11 页更新

文件变更
packages/core/agent-loop/src/agent.ts(496→515 行)step() 的流消费包进 try/catch:取消时调 assembler.interruptedBlocks(),有内容则落一条 interrupted: true 的 assistant/message(固化已流出的 text/reasoning 前缀),然后无条件 rethrow——固化是善后,不是处理
packages/core/session/src/types.ts(436→440 行)'assistant/message' 新增 interrupted?: true 字段——无需从 turn 边界反推即可区分「取消前流出的前缀」;aborted 的 turn 无此事件 = 取消前没有可见内容
packages/llm/llm/src/assembler.ts(187→207 行)新增 interruptedBlocks():只保留非空白内容的 text/reasoning 块;tool-call 省略(中断先于派发,保留需伪造结果);打开的未知块省略

② LLM 调用代际绑定(adapter prepareCall)—— 09/10 页更新

文件变更
packages/llm/llm/src/index.ts(947→1026 行)新增 LlmAdapter.prepareCall(provider, model, signal)(247 行)返回 PreparedAdapterCall——模型解析与最终 stream 调用绑定到同一 adapter 代际;动态 adapter 可 override,防止设置变更发生在 prepare 与 dispatch 之间时拼错代际。普通路径(adapterStream 无 prepared 时)也走此绑定(910 行)。PreparedLlmCall 新增 inputModalities(代际捕获的精确模型模态)
packages/llm/llm/src/content.ts(新增,202 行)projectImagesForTextModel:模型模态不含 image 且消息含图片时,把图片块投影成文本模型可接受的形态(adapterStream 930-936 行接入)

③ DeepSeek 文件管理策略(站点未覆盖,仅记录)

文件变更
packages/llm/llm-deepseek/src/adapter.ts +442 行;新增 file-id.ts、file-store.ts(331 行)、files-api.ts(257 行)、upload-index.ts(225 行)——文件上传/引用管理(PR #2676 image-management-strategy)。站点目前未深入 llm-deepseek 内部,后续可开旁支页

④ 其余影响面(无需站点改动的记录)

  • packages/boot/app-boot/src/index.ts:环境剥离名单(BOOTSTRAP_NAMES)新增 BROWSER(100 行附近)——boot 链语义未变。
  • packages/core/session/src/known-event-types.ts:登记 team/member、team/message/delivered、team/message/queued、team/task 四个新事件类型(团队功能扩展了事件词汇表)。
  • packages/subprocess/subprocess-local/:新增 windows-inspector.ts(325 行)——Windows 进程表探测;terminal.ts +74 行(PTY 前台进程组)。旁支 16 页的「下层职责」描述仍成立。
  • packages/llm/llm/src/retry-policy.ts:±10 行调整,重试策略结构未变。

§5rc.5 → rc.7:首轮同步(2026-08-19)

首次同步时上游从 rc.5 升到 rc.7。当时站点精读的核心文件几乎没动,只有一处实质语义变更:

  • assembler.ts 的 max-tokens keep/drop 收敛(PR #2596 deepseek-maxToken-consistency):新增 assembled() 统一决策——blocks() 与 replayState 同源派生,max-tokens 截断丢弃无法安全执行的 tool-call 块;replay envelope 块数不对齐时 replayState 归 undefined。已写入 11 页。
  • 8 处文件行数修正(session/index.ts、surface.ts、tool-calls.ts、bash-local、subprocess-local、spawn.ts、tool-bash)。
  • code-mode 提示词文案微调(图片子工具结果 attach 到 run 之后)——站点未覆盖,未更新。

§6同步方法(供后续复用)

每轮 pull 后的标准流程:

  1. git pull --ff-only,记录新 HEAD 与 release 版本。
  2. 圈定影响面:git diff --stat <旧版本tag/commit> HEAD -- <站点锚定的目录>——只有站点引用的文件变更才需要动站点。
  3. 逐文件 diff:对每个有变更的锚定文件 git diff,判断是「行号位移」(只改行号)还是「语义变更」(重写内容)。
  4. 重验证锚点:对站点引用的每个 file:line,用 grep -n/sed -n 核对新位置的符号是否还是原来那个。
  5. 批量更新版本号:sed -i 's/0\.x\.y-rc\.N/新版本/g' *.html。
  6. 语义变更写进对应页 + 本页:凡上游改了行为,对应页的解读必须跟上,并在本页留档。
  7. 校验:残留旧版本号扫描、坏 SVG 属性扫描、内部链接检查。
  8. 提交:站点是独立 git 仓库(coldingcode.github.io),commit + push。