# Changelog 本项目遵循 [Semantic Versioning](https://semver.org/lang/zh-CN/)。 ## 0.2.0 — 2026-10-18 修的是朋友反馈的真问题:**「聊久了 chatterbox 就失效,模型重新变沉默」**。 - 新增:**长会话重申**。段落负责「一直在」,重申负责「一直在最近的地方」—— 触发时把一行极短的提醒作为 runtime-context 快照**追加到历史末尾**。 - `reassertAfterSilentSteps`(默认 6):连续多少步没出文字就重申。**为什么按步不按轮**: 本机实测交代密度从 80% 掉到 11% 的那一整段沉默发生在**同一个 user turn 里**(约 60 步), 按轮重申在那一段里一次都不会触发。 - `reassertOnCompaction`(默认 true):压缩刚改写上下文,最容易稀释。 - `reassertEveryTurns`(默认 0 = 关)。 - `reminder`:重申文本。 - 新增:诊断行 `kind:"reassert"`(重申了一次,带 trigger)与 `kind:"prompt-missing"` (某项系统提示里没有本段落)——后者是「模型没看到」与「模型看到了但不照做」的客观分界。 - 文档:README 增收「长会话里为什么会变淡,以及重申」,含实测数据与代码级结论。 - 排查结论(写进 README,供以后复用):**「压缩把段落吞掉」这个解释被证伪**。 `dsh-agent-loop/lib/index.js:264-282` 的投影保证「线上最新一条非空 system 消息 = 当前渲染提示词」; 压缩范围永远从 index ≥ 1 开始,node 0 不受遮蔽;能挡住已注册段落的只有 `complete: true` 段 (本机无人使用);in-history 路由的真实故障模式是抛错(`UNSUPPORTED_CONTENT`)而非静默。 - 测试:32 例(新增重申生命周期、沉默计数、`hasNarration`、`sessionKey` 等)。 ## 0.1.0 — 2026-10-17 首个版本(原名 `dsh-interaction-habits`,定名前改为 **`dsh-chatterbox`(话匣子)**)。 - 新增:`systemPrompt.section` 注入「互动习惯」协议,段落名 `plugin:chatterbox`, 默认 `order: 720`(落在 `dsh-methodology` 的 700 与 shipped `PTC_ONLY` 的 800 之间)。 五条分条:边做边说 / 需要人的时候开口说 / 提问的方式 / 验证要有预算 / 说人话。 - **语气**:五条全部按邀请式重写,不出现「失误」「悄悄」「自己拍」「废话」「不要省」这类纠错腔词; `node --test` 里有一条用例守这个约束。 - 新增:**默认对所有模型生效**(`modelPattern: ''`)。理由与证据见 README—— 「1017」是界面徽章不是 model id,按发布日期写死型号必然过时。 - 新增:`skipPresets`(默认 `['companion']`)。陪伴模式的人设明确要求「不解释自己打算怎么回应」 「不靠提问推进对话」,与协议第一条正面冲突,所以按会话 header 的 `agentPreset` 再拦一道。 - 新增:可选收窄(`modelPattern` 子串或 `/正则/`、`matchProvider`、`whenModelUnknown`), 模型身份取「assemble 瀑布观测到的 provider/model → `agent.options` → `agentDefaultModel`」三来源。 - 新增:`scope`(默认 `root`,不给子代理/队友注入)。 - 新增:诊断日志 `.state/diagnostics.jsonl`(每次求值一行:会话 / preset / 模型 / 是否注入 / 理由, 默认 500 行上限、硬上限 5000、超限丢前一半),可用来核对「到底生效了吗」。 - **修复(预备纠正线索发现)**: - 段落注册显式加 `interpolate: false`。默认的 `{{变量}}` 插值由宿主在渲染期严格解析, 未知/畸形引用会 throw,而该 throw 在 agent-loop 的 `renderPrompt()` 里、插件的 try/catch 拦不到, 会让每一轮根会话以 error 收尾(实测复现);现已由单测守住。 - `sectionText` 求值失败时补写一条 `kind: "error"` 诊断行——否则「按设计不注入」与「崩了」 在诊断文件里一模一样。 - `diagnosticsMaxLines` 加硬上限 5000(此前传 1e18 会让每步做 100 ms 级的读+截断)。 - `normalizeConfig` 对 getter/Proxy 取值抛错的病态输入也回落到默认配置(原先会抛)。 - 新增:`market/index.json`(format 1)生成器(`npm run build:index` / `check:index`)与 `dsh-plugin.naming.json`(已过 `validate-names.mjs`;`query-registry.mjs` 未在复核索引中发现同名坐标)。 - 新增:发布脚手架——`.github/workflows/{ci,release}.yml`(YAML 已过真实解析器校验), 以及 `tools/make-release.mjs`(产出 `dsh-chatterbox.tgz` + 「上传用」文件夹 + sha256)。 - 测试:23 例。其中一条专门守「单测不许污染插件自己的诊断文件」——此前没显式关掉 `diagnostics` 的用例会把行写进 `.state/diagnostics.jsonl`(真实踩到过,已修)。