# Changelog

All notable changes to this project are documented in this file.

## [1.25.1] - 2026-09-20

### Fixed — Windows CI 平台适配（v1.24.0 起的 validate-platforms 红灯）

- privacy-audit 的两个 POSIX mode 用例在 Windows 上 `skipIf`（chmod 只切只读位，任何文件都读回 0666；Windows 语义已由注入 platform 的用例覆盖）。
- m109 / skill-markdown-progressive 的临时目录清理改为 Windows 安全（`maxRetries`+`retryDelay`+best-effort）：运行时遗留的默认路径 sqlite 句柄会令立即 unlink EBUSY。**已知遗留**：`transport:"file"` 的工作区内仍会出现默认 `graphflow-out/graphflow-graph.sqlite` 且句柄未关——连接生命周期泄漏需产品级修复（161e2fe 曾修过一次，v1.24.0 回归）。

## [1.25.0] - 2026-09-20

### Fixed — 承诺验收全量收口（6 差距 + SoL-Pi 审计，live 实测驱动）

当天对 SKILL.md 承诺做三轮 live 验收（真 deepseek、真 MCP、无 LLM 桥接回路），发现并修复 12 个真实缺陷，全部有 live 复验证据：

- **graphflow_run 桥接 worker 3 连败 → 1 次过**：anchor 源码正文（≤8 个/24KB，单文件 6KB 头尾截断）内联进 worker prompt 与 executionDescriptor，附"已内联、勿请求文件"指示；worker 的最终答案以 `result` 字段外露（工具响应 + episode 记录双持久化，DAG 路径逐节点捕获），失败路径也保留最后输出。
- **plan 模板冒充 LLM → 真 LLM 优先 + 诚实降级**：有 LLM 时真调 `planTasksLlm`/`brainstormTaskLlm`；前置**完整凭证问候探测**（apikey+baseUrl+model 真往返；echo 占位/可达但 401 均判不通，4-10ms 桥接不再白等 15s）；探测超时 AbortSignal 真取消；模板回退永不自称 `final`（`suggested` + agent 桥接工作项 + 失败原因）。planner 默认档 smart→economy（pro 稳定超 15s 预算）；分解调用禁用 deepseek tool-loop（其确认信封 `{"ok":true,…}` 使解析必败）+ 一次立即重试 + brainstorm 解析兼容信封 summary。
- **CJK 低命中双缺陷**：低相关触发只认 anchorCount<3（永不达）→ 增加 top-5-by-score 均值 <0.25 维度（relevance 逐锚透传）；`estimatedRawTokens` 从全图模糊匹配改为按**交付 anchor 集**统计（live：338,869 → 522，垃圾检索诚实报 0% 节省）；低命中交付裁剪为仅 relevance>0 的锚（15→2）+ 中文 spine 说明行。
- **assistantReply 无 query 被拒**（文档称 optional）→ 合成占位轮落库，幂等重试，回复永不丢弃。
- **飞轮技能质量**：逐 atom 质量门（长度/结构停用词/逐 atom 符号证据/id ≤48 字符/总量 ≤4）+ `pruneLegacyNoiseSkills` 存量清理（名字即证据：路径片段/裸 token/连接词开头子句/未 seeded composite，hint 刷高的 uses 不豁免）接线进 reportOutcome；live 库存 8 条垃圾清零。
- **SoL-Pi 收口**：四机制默认全开语义核实无漂移，4 份 SKILL.md "off by default" 谎言改口（sync 门禁绿）；compaction 经济模型修正（重写成本按**压缩后摘要**计价 + 计入压缩后重放，-1,428,000 → -333,000，信号新增 replayCost/compactCost 与成本构成）；**Action Fusion 两个盲区修复**（中文动词关键词缺失 + 无 plan 桥接描述符不挂 steps → 任务文本子句回退，live：`fused:true`，"修改 X 并验证"折叠为单一动作）。
- **桥接描述符源码回退**：检索头被元节点占据时，任务文本**引用的文件路径**直接内联（`../`/node_modules 防护）。

### 验证

- 210 文件 / 1588 用例全绿；tsc/eslint/build/sync-surfaces 门禁全过。
- live 验收矩阵：英文检索 15 锚全中；plan simple/insight（六帽 + 5-Why 链）真 LLM 产出；run llm 模式 COMPLETED+result+语义验证；无 LLM 桥接回路全通（plan 委派→agent 分解→insight merge→run 描述符→outcome 闭环）；artifact 导出→导入 8616 节点回路；release-gate 真实拦截（proven-skills 0<1）。

## [1.24.1] - 2026-09-19

### Fixed — 收尾审计修复批次（promise-vs-reality 对账的五处缺口）

对外承诺审计（README/ROADMAP/CHANGELOG vs 代码/测试/基准实测）发现五类"承诺没有完全闭环"的缺口，本批全部收口：

- **`audit --privacy` 0600 从"显示"变"判定"**：`PrivacyAuditFacts` 新增 `warnings` 数组——全局配置存在且 POSIX mode ≠ 0600 时产出违规 finding（含 chmod 修复指引；Windows 无 POSIX 位、mode 不可读、文件不存在均不误报，`platform` 可注入测试）。此前审计只打印 mode 不做合规判定，本机 `~/.graphflow.config.json` 实际 0664（比修复前的 0644 还松）却零报警——README 承诺的"0600 检查"名不副实。CLI 输出把 warnings 逐行附在摘要后。
- **存量全局配置自动收紧**：`ensureGlobalGraphFlowConfig` 对已存在文件 best-effort `chmod 0600`（此前只在保存/迁移时收紧，v1.18.5 之前写入的旧文件可永远带错误权限）；`graphflow install` / `init` 路径即修复，`result.message` 注明 tightened。
- **R7-a skills-ref 校验门禁收口**：新增 `extractSkillReferences` / `validateSkillBundle`（`src/learning/skill-markdown.ts`）——渐进披露指针⇄`references/` 文件**双向完整性**：悬空指针（SKILL.md 指向缺失文件）、孤儿文件（打包了但从未被指向）、越权路径（`../`、非 `references/*.md`）均计 invalid；导出 CLI（`skill markdown export`）已从单文件校验切换到整包校验。ROADMAP R7-a 至此无剩余项。
- **检索基准再基线（v1.12→v1.24 语料漂移）**：`RETRIEVAL-EVAL-RESULTS.md` 停留在 2026-08-04 语料（MRR 0.836 / NDCG@5 0.671），自指语料随 src/ 增长已漂移。连跑两次确认**确定性**（仅时间戳/耗时不同）后在当前树再生成：**Hit@5=100% 保持，MRR=0.779，NDCG@5=0.638**；冻结声明目录 `flywheel-proof-claims.json`、README（×3 处）、`docs/flywheel-reproduction.md` 按"再测量→声明与报告同步更新"协议一并更新。顺带修正两处既有不一致：README NDCG 0.601 ≠ 目录权威 0.671（同为旧口径漂移）；README skill A/B 行"injection 100% / 25.6 tok"与已提交报告（噪声门后 0% hint injection / 100% episode recall / ~15 tok）矛盾。
- **文档漂移清理**：README 中英双语 "Register Skill + MCP" 小节嵌套损坏的 ```` ```bash ```` 代码块（渲染错乱）修复；README "98.2%" 单口径残留改为双臂口径（95.6% / 98.5%）；"961 tests / 142 files" 过期计数改 count-free 措辞（evergreen 政策）；ROADMAP 头部"最后更新 v1.19.0"更新至当前版本；`flywheel-reproduction.md` token 行 98.2%（274,434→4,928，旧一代口径）对齐当前双臂。
- **eslint 零警告**：`coverage/`（生成物，已 gitignore）加入 eslint ignores，此前 3 条 unused eslint-disable 警告来自该目录的 vendored 文件。
- **R9 orphan 检查器 dogfood 三修（误报根因）**：用本批未提交改动自证时发现孤儿检查在真实图上系统性误报——① **`calls` 边未计入**（v1.20.0 引入的真 bug）：跨文件函数调用在图中记为 `calls` 边而非 `references`，`countInboundEdges` 只数 references，纯函数模块（如 orphan-checker.ts 自己）一律被判 0 入边；现 references+calls 都计（单测用 stub 图回归锁定）。② **带源码扩展名的工具配置文件漏排除**：模块头注释承诺"配置文件天然排除"但实现只排除非源码扩展名，`eslint.config.js` / `vitest.config.ts` 被误报；补 `*.config.{js,cjs,mjs,ts,…}` 排除。③ **package.json 清单入口未排除**：`bin` / `main` / `module` / `exports` 指向的文件（含 dist→src 布局映射）是图根节点、设计上零入边；`src/surfaces/cli/index.ts`（bin 入口）被误报；读不到/解析失败 fail-open。修后 dogfood：22 文件脏树 `graphflow audit` 零 findings。
- **测试 203→203 文件 / 1498→1512 条全绿**：privacy-audit 2→5（非 0600 告警 / 0600 通过 / Windows 跳过）、m86 3→4（ensure 收紧存量文件）、skill-markdown-progressive 5→10（门禁 5 条：导出器自产 bundle 通过 / 指针提取 / 悬空 / 孤儿 / 越权路径）、m96 补 3 条（工具配置排除 / 清单入口排除 / 无 package.json fail-open）、m97 补 2 条（calls 边计数 / 真 孤儿仍报 0）。本机 dogfood：`audit --privacy` 先报警 0664 → chmod 600 → 复跑零 warning；`proof:flywheel` 8 项检查全 ok。

## [1.24.0] - 2026-09-19

### Added — R7 三件套首发：语义召回默认开 + Agent Skills 标准分发 + 可核验隐私

- **R7-b 零配置本地语义召回默认开**：`graphPolicy.embeddingProvider` 默认从 `"fnv"` 改为 `"transformers"`（resilient local 路径：优先 `Xenova/bge-base-zh-v1.5` 本地语义模型，任何失败——缺包/无缓存/超时/加载错误——透明降级 FNV-1a，保持零 Key、零云依赖）。此前语义召回是 opt-in（默认 FNV hash 词袋），开箱质量落后 Continue+Ollama 一档；现在 ONNX 运行时可用即自动走语义召回，`"fnv"` 显式配置仍可强制纯离线 hash（air-gapped 场景）。`embedding-factory.ts` 解析顺序不变：legacy openai key > 新开关 > legacy embeddingPolicy > 默认 resilient transformers。`tests/embedding-backend.test.ts` 更新为断言 transformers 默认健康路径（真实加载模型 305ms）+ fnv 显式 opt-out。
- **R7-a SKILL.md 对齐 agentskills.io 开放标准（导出侧）**：`src/learning/skill-markdown.ts` 导出 frontmatter 对齐规范——`name` 经 `toSpecName` 转为 1-64 小写连字符 slug（非 ASCII 名称罗马化回退）、必需 `description`（what+when 语义）、可选 `license` / `compatibility` / `metadata`（display name 经 `metadata.graphflow-name` 往返保留）；`validateSkillMarkdown` 全量校验导出文件（`invalid=0` 保证）；导出布局改为**每 skill 一个目录 + SKILL.md**（agentskills.io 约定），平面 `.md` 导出保留兼容。import 宽容：第三方 spec 文件与旧 display-name 文件均可入，导入一律保守 `correctable` 不继承 proven 信任。端到端：空工作区 `graphflow skill markdown export <path>` 优雅降级 `files=0; invalid=0`。
- **R7-d 隐私威胁模型 + 可执行审计面**：新增 `docs/threat-model.md`（信任边界 / 数据流 / 出网点枚举 / 密钥处理 / 落盘路径 / 剩余风险）+ `graphflow audit --privacy [--json]`（`src/audit/checkers/privacy-checker.ts`）：11 个落盘产物路径存在性、6 个出网端点及触发条件（5 家 LLM provider 仅在配置时触发；HuggingFace Hub 仅首次模型下载且 `HF_ENDPOINT` 可镜像）、全局配置文件权限（0600 检查）、provider key **布尔值**（检测变量名存在，值永不回显）。核心可核验断言：**零配置零 Key 时零必需出网（模型首下除外）**——把 local-first 从口号变成一条可执行命令。`tests/privacy-audit.test.ts` 2 条。
- **R7-a 渐进披露 + spec 目录布局（同版补完）**：`skillToSkillMarkdownBundle` 把超限 playbook/guidance 拆进 `references/guidance-*.md`（SKILL.md 保持紧凑指针 + 按需加载索引行，~5000 token 上限进入 `validateSkillMarkdown`）；导出布局定为 agentskills.io 约定的**每 skill 一目录 + SKILL.md**（目录名 = spec name，去重后缀 `-2`）。导入侧同步收紧：spec 布局强制**父目录名 = skill name**（violation 注明 agentskills.io）；拥有 SKILL.md 的目录只收 SKILL.md、不再下钻——`references/` 文件永不被误当 skill 导入；平面 `.md` 旧布局保持可导入（本轮还修复了目录扫描静默丢弃平面 `.md` 的回归）。
- **R7-h 效率证据公开 schema（导出侧）**：新增 `src/learning/efficiency-evidence.ts` + `graphflow efficiency export` → `graphflow-out/efficiency-evidence.json`：`schemaVersion=1` + `graphflowVersion` + `sources`（指回 efficiency.json / context-fidelity.json）+ 三源数据合订（配对比较 / 保真采样 / token-savings 累计）+ `tokenSavings.boundary` 固定边界文本随数发布（packaging ROI ≠ Hit@k ≠ body coverage ≠ lossless fidelity）。**诚实门禁**：零配对 / 零 qualifying / 能力回归 → `gate.allowed=false` 且原因内嵌文件——文件总可发布，省 token 声明被门禁（SoL-Pi capability floor 的工件级载体）。
- **token 基准外部语料模式（反自指）**：`benchmarks/run-token-benchmark.ts --corpus=<path> [--queries=a,b,c]` 把双臂测量指向另一个仓库（默认通用查询集 `EXTERNAL_CORPUS_DEFAULT_QUERIES`，可覆盖）；RESULTS.md 段落带 `Corpus (external, anti-self-referential)` 行、机器 JSON `inputs.corpus.kind: "external"` + 语料根路径。同时脚本改造为可编程入口 `runTokenBenchmark({corpusRoot?, resultsPath?})` + **import 不再自跑 main**（直接执行守卫 `import.meta.url === pathToFileURL(argv[1])`），并修复 corpus 模式缺 `existsSync` 导入的崩溃；`docs/benchmark-standards.md` §2.2 补外部语料条目。
- **Fixed — `audit --privacy` 双重打印**：分支内手动 `console.log` 与 `main()` 统一的 `formatCliResult(legacyText)` 打印路径叠加，summary 输出两遍。现合并为单一 `legacyText` 返回，JSON 模式交由 main 输出 `data`。
- **测试 199→203 文件 / 1480→1498 条全绿**：新增 privacy-audit（2 条）与 skill-markdown-interop 4→6（spec frontmatter 往返 + 非法 name 拒绝）、embedding-backend 默认语义断言（9 条）；本轮再增 skill-markdown-progressive（5 条：bundle 拆分/指针/常量/目录名/规格布局导入导出往返 + references 防误收）、token-benchmark（4 条：savings 数学/--corpus 解析/通用查询集/外部语料端到端含机器 JSON 出处）、efficiency-evidence（4 条：空态门禁/qualifying 开门/能力回归关门/写盘字段+boundary+gate）。端到端冒烟：`audit --privacy` 净空/含产物两态正确；空工作区 `efficiency export` 产出 gated 文件（版本号取自 GraphFlow 包自身而非工作区）。
- **已知边界**：R7-a 剩余 skills-ref 校验门禁（ROADMAP 标注）；R7-h 剩余随包发布管线与 mechanism 生命周期联动；独立复现破零仍需外部贡献者（外部语料模式已把工具备好）。语义召回默认开意味着首次查询可能触发一次模型下载（默认缓存于 `~/.cache/huggingface`，可经 `GRAPHFLOW_EMBEDDING_CACHE_DIR` / `embeddingPolicy.modelCacheDir` 重定向、`HF_ENDPOINT` 镜像；显式 `"fnv"` 可完全关闭下载）——已在 threat-model 与 README 标注。


## [1.23.2] - 2026-09-19

### Fixed — 健壮性双修：文件锁死锁 + 夜间学习崩溃（覆盖率深挖）

- **`src/utils/file-lock.ts` 陈旧锁死锁**：进程在 `openSync` 成功、`writeSync` 写入 pid **之前**崩溃会留下空 lock 文件；旧逻辑 `parseInt("")` 得 NaN 永远走不到清理分支，后续所有 `acquire` 只能空转到 30s 超时（且 `withFileLock` 直接抛错）。修复：空/非数字 pid 视为崩溃残留，文件年龄超过 10s 宽限窗口（避免与正在写 pid 的创建者竞态）即清理重试；`writeSync` 失败时不再泄漏 fd、不留半写锁文件。
- **`src/learning/learning-events.ts` 损坏行崩溃**：`readFeedbackEvents` 对每行裸 `JSON.parse`，崩溃残留的半行数据会让整个夜间学习任务挂掉。修复：fail-open 跳过无法解析/形状不符的行（写入方仅产 `{query, passed, tokenCost, retries}`，已核实无误伤）。
- **`src/routing/provider-executor.ts` skillHints 去重**：`formatPromptWithContext` 对重复 skill 提示不去重，重复词句白白消耗 prompt token；现保序去重后再截断。
- **测试 195→199 文件 / 1435→1480 条全绿**：新增 m101（file-lock 8 条：互斥/超时/ESRCH 死进程回收/陈旧空锁回收/新建竞态保护）、m102（learning-events + nightly-trainer 双签名 + reflector 聚类 12 条：损坏行跳过、10MB 轮转、lesson 节点与 improves 边）、m103（5 个 provider 适配器 stub fetch 13 条：无 key 降级、strict 抛错、HTTP 错误、abort 传播、thinking 模式请求体、usage 解析）、m104（provider-executor + deepseek 工具循环 15 条：重试预算、401 不重试、断路器开启短路、中止传播、上下文通道上限、工具结果回填、轮数耗尽强制终答）。

## [1.23.1] - 2026-09-18

### Fixed — 潜伏自 v1.19.1：完整 install 流程覆盖直连条目

- **legacy sweep 覆盖 bug**：`buildInstallReport` 在 HostAdapter 写完直连条目后，后续的全宿主 npx sweep 再写一遍，把直连覆盖回 npx——**zcode 直连在完整 `graphflow install` 里从未生效过**（单测全绿因为都绕过了完整流程；本机端到端复现定位）。修复：legacy sweep 加 `preferGlobalInstall: true` 与 adapter 一致。端到端验证：完整 install 后条目 = 稳定 node + 全局 server.js + cwd=包根。
- **新增 [docs/postmortem-windows-install.md](docs/postmortem-windows-install.md)**：v1.18.6→v1.23.1 六次安装故障的根因表 + **八条守则**（端到端冒烟非 existsSync / 配置只指向稳定目录 / 启动链优先级 / peer 显式声明 / install 带悬空修复 / 文档标 shell / 干净环境发版前演练 / registry 不可控自保）+ 支持排障速查表。

## [1.23.0] - 2026-09-18

### Fixed — Windows 双故障根因修复（v1.22.0 回归 + npx peer 丢失）

- **稳定 runtime 布局 bug（v1.22.0 引入，本次修复）**：v1.22.0 把 vendor **内容**铺到 `~/.graphflow/runtime/` 根，但 launcher 按 `__dirname/vendor/graphflow/...` 定位 → `server not found: ...\runtime\vendor\graphflow\...`。现统一镜像扩展布局（`runtime/vendor/graphflow/dist/...`），且 launcher 增加**双布局回退**（vendor 布局 → 扁平布局），CLI 稳定探测同时接受两种布局（兼容 v1.22.0 已写入的扁平副本）。
- **npx 缓存 `Cannot find module 'ajv'`（peer 丢失免疫）**：`ajv-formats`（SDK 传递依赖）的 peer `ajv` 在镜像残缺/npx 解析下会丢失（现场：缓存里 ajv-formats 在、ajv 不在）。现将 **ajv + ajv-formats 显式声明为直接依赖**——任何解析路径下都强制存在。
- launcher 冒烟测试（vendored 布局定位 server）；m100 更新双布局断言；全量 195 文件 / 1435 测试。

## [1.22.1] - 2026-09-18

### Fixed — 首次运行自动注册兜底（镜像残缺包 / ignore-scripts 环境的"一条命令"补洞）

Windows 实战：用户从 npm 镜像装到**旧版（1.20.1）且包内容残缺**（skills 资产缺失、postinstall 静默）——注册从未发生且用户零感知。新增兜底：`graphflow` 命令**首次执行**时检测到版本标记文件不存在（postinstall 从未成功跑过）→ 自动执行完整安装注册（含悬空修复）并写入标记，仅此一次；help/version 保持只读不触发。输出中若出现 `Skill source not found` 会明确提示镜像包不完整并给出官方源重装命令。CI/GRAPHFLOW_SKIP_POSTINSTALL 环境不触发。

## [1.22.0] - 2026-09-18

### Fixed — VSIX 安装同样一键完成，且条目永不因升级悬空（三平台）

「再好的项目，安装不上也是扯淡」——两种安装方式现在都是一条命令全自动，且写入的 MCP 条目在任何升级路径下都不会悬空：

- **稳定运行时目录 `~/.graphflow/runtime/`**：VSIX 激活时把自带 runtime + launcher 同步到该稳定目录（IDE 升级会删除带版本号的扩展目录——历史上所有 `Cannot find module mcp-launcher.cjs` 悬空报告的根源），MCP 条目全部指向稳定路径；每次激活刷新副本，升级 = 自动重写。同步失败 fail-open 回退扩展副本，下次激活重试。
- **CLI 直连候选链**：`preferGlobalInstall` 解析顺序变为 npm 全局包 → 稳定 runtime → npx 回退——只装 VSIX（没装 npm 包）的用户经 CLI 重装时也能拿到直连条目而非 npx。
- **三平台保证**：全部路径经 `os.homedir()` + `path.join`；`fs.cpSync` 跨平台复制；由既有 ubuntu(node20/22)/windows/macos CI 矩阵验证。npm 路径（v1.21.0 的 postinstall 全自动）不变。
- 测试 m100（3 条）：稳定根路径（隔离 HOME）、探测命中/未同步 fail-open、直连候选链永不悬空（直连条目引用文件必须存在）。

## [1.21.0] - 2026-09-18

### Fixed — 一条命令承诺：`npm install -g @roarpeng/graphflow` = 安装 + 注册 + 检测 + 修复

Windows 实战暴露的链路缺陷：postinstall 全局安装时走的是旧的手工组装流程（只装部分宿主 + 强制 npx 条目），既不覆盖 20 宿主三件套也不做全局直连，更不会修复悬空条目——用户一条命令后仍需手动折腾。彻底收敛：

- **postinstall 全局分支改为调用完整 CLI `install`**（单一事实来源）：20 宿主 HostAdapter 三件套注册 + 全局安装直连条目 + 悬空修复 + doctor 摘要，一条命令全部完成；本地安装/CI 行为不变。
- **悬空 MCP 条目检测 + 自动修复**：新增 `repairDanglingGraphflowMcpEntries`——扫描所有检测宿主的 `graphflow` 条目，`command`/`args` 中的绝对路径指向已不存在的文件（典型：IDE 升级删除了旧扩展目录的 `mcp-launcher.cjs`）→ `graphflow install` 开头自动重写为当前最佳形态（全局直连优先）。`install` 输出新增 `[REPAIRED]` 行。
- **doctor 悬空可见性**：MCP 检查对条目启动目标做存在性校验，悬空标 `missing (dangling entry)` 并给出死路径与修复指引（`graphflow install` 一键重写）；覆盖 legacy 与 HostAdapter 两条检查路径。
- 测试 m99（4 条）：死扩展 launcher 检测 + doctor 标记、健康条目不误报、修复重写为可启动形态、无悬空时 no-op。

## [1.20.1] - 2026-09-16

### Docs — R9/R9 文档收口

- 新增 **[docs/closing-audit.md](docs/closing-audit.md)**：R9 承诺账本 + 收尾审计完整文档——三个触点（CLI / outcome 前置 / 跨会话提醒）、内置检查器矩阵、`graphflow.audit.json` 声明式规则示例（驱动加载 / 容器注入）、基线策略、诚实边界。
- README（英文）core capabilities 新增 R9 与 R8 两行 + CLI quick reference 补 `challenge` / `audit` 两行；README（中文）「本版要点」升至 v1.20 并新增 R9/R8 行。

## [1.20.0] - 2026-09-15

### Added — R9 承诺账本 + 收尾审计（Promise Ledger / Closing Audit）

针对 dogfood 实证痛点：agent 长任务"干着干着就忘了"——新依赖忘安装、新文件忘接线/注入容器、驱动忘加载、文档忘更新。问题本质是**承诺没有账本**：义务在任务中段产生、收尾时无人清点。R9 从可观测副作用登记义务并在三个触点对账（不猜意图、只对账事实、质询不阻断）：

- **检查器矩阵**：依赖 lock 一致性（npm v1/v3、pip+poetry/Pipfile.lock）、孤儿文件接线（图 inbound 边数为零即未接线）、文档一致性（CLI 变更 vs README、版本徽章 vs package.json）。
- **声明式规则引擎**：容器引用/驱动加载等项目特定义务由 `graphflow.audit.json` 配置（`filePattern` + `mustBeReferencedBy` glob），内置零项目类型假设；glob 引擎零依赖自研（`**`/`*`/`?`/`{a,b}`）。
- **基线策略**：默认 git 未提交工作区（agent 会话的天然收尾窗口）；`--since <ref>` 扩大；无 git 降级为纯状态检查。
- **`graphflow audit` CLI** + **outcome 前置审计**：`report_outcome success` 前自动跑审计——默认温和（findings 附进 episode 证据并提醒）；`GRAPHFLOW_AUDIT_STRICT=1` 严格模式拒绝在有未决项时上报成功。
- **跨会话提醒**：会话结束未决项写入图上承诺账本（`promise-ledger:<sessionId>`）；下次会话首次 `graphflow_context` 附带"上次会话有 N 项未收尾"；审计清零自动 resolve。

## [1.19.2] - 2026-09-15

### Fixed — 跨平台加固（Windows / Linux / macOS）

- **全局安装探测容错（v1.19.1 引入路径的加固）**：`npm root -g` 的 stdout 在 Windows 上可能带 UTF-8 BOM、CRLF 或混入 banner 输出——原 `trim()` 实现会被污染导致探测失败（安全回退 npx 但直连失效）。现剥 BOM + 按 CRLF/LF 切分 + 取**最后一个非空行**（npm 的路径输出在 stdout 末尾）。测试覆盖 BOM / banner 前置 / 空行三种污染形态。
- **Windows 平台门控直连验证**：新增 win32-only 测试——真实全局安装存在时，注入的直连条目 `command` 必须是磁盘上存在的 node 二进制（短路径形态允许或裸 `node`）、`args[0]` 必须是存在的全局 `server.js`。由 `validate-platforms (windows-latest)` CI 矩阵执行。
- 既有跨平台矩阵确认覆盖：CI 已在 ubuntu(node 20/22) / windows-latest / macos-latest 三平台跑全量测试；直连条目的空格路径加固（短路径化 / 裸 `node` 回退）复用 `sanitizeMcpServerNodeForWindowsClients` 既有逻辑并有 m63 win32 门控测试。

## [1.19.1] - 2026-09-14

### Fixed

- **Windows ZCode「启动中」卡死（npx 冷启动超时）**：npx 条目首次需下载完整包及原生依赖（`onnxruntime-node`，Windows 上数百 MB），120s 连接超时内常无法完成。`install` 现对 ZCode 启用 `preferGlobalInstall`：探测到全局安装（`npm root -g` 下的 `@roarpeng/graphflow/dist/surfaces/mcp/server.js`）时自动写入 **node + server.js 直连条目**（`cwd`=包根，秒级启动、无网络依赖；复用既有 node-bundled 形状与 Windows 空格路径加固）；无全局安装回退现行 npx 条目。探测失败（无 npm/路径不存在/空输出）一律 fail-open 回退。README（中英）注册小节补充 Windows 首启慢的说明与解法。测试 m87 扩至 6 条（npx 回退锁定 / 直连条目 / 探测函数三态 fail-open / adapter 三件套）。

## [1.19.0] - 2026-09-14

### Added — R8「省钱与靠谱双主线」（五模块齐发）

核心洞察：agent 最大的 token 黑洞是"找东西的探索轮次"（每轮探索都是带全量历史的完整模型调用——压缩 prompt 省加法，消灭探索轮省乘法）；可靠性最便宜的形态是不跑测试的质量门。五项全部落地：

- **R8-1 Working set 预取**：`src/graph/working-set.ts`——以 touched 文件为活跃工作集，沿 references/calls 边扩展 caller/callee/test-for 相关文件生成预取包；诚实计数 `potentiallyAvoidedReads`，不乘臆测系数（tests/m89）。
- **R8-2 图 diff 质询清单**：`src/graph/diff-challenge.ts` + `graphflow challenge --files`——改完代码后图谱生成三类质询（external-caller / requirement-link / deleted-symbol）还给 agent 回答；近零成本质量门，激活 Engineering KG 存量；不声称检测签名变更，只质询图上可证事实（tests/m90）。
- **R8-3 subagent 出生证**：`src/graph/spawn-receipt.ts` + `graphflow spawn-receipt`——父 agent 发紧凑收据（任务 + 图锚点 + 取回指令）替代背景文本复制；subagent 用 `graphflow_context` 按需展开（tests/m91）。
- **R8-4 时点事实查询**：`src/graph/temporal-facts.ts` + `graphflow facts ask`——对话图 bi-temporal 语义产品化：按 asOf 返回仍有效结论（effective）与已被取代历史（supersededAtPoint）；白领"事实漂移"防线（tests/m92）。
- **R8-5 任务预算报价**：`src/learning/task-quote.ts` + `graphflow quote`——效率历史变事前决策工具；样本不足 confidence=insufficient-samples + 保守折半 + advisory 明说，绝不编造（tests/m93）。

## [1.18.8] - 2026-09-14

### Added

- **R6 收官：efficiency for efficiency（效率反哺搜索，SoL-Pi 闭环最后一块）**：新增 `src/learning/efficiency-reinvest.ts` + `graphflow mechanism reinvest [--apply]`。合格配对节省（仅 qualifying——被 `no-efficiency-gain` / 能力回退取消资格的比较**不得为其验证搜索出资**）按 `efficiencyPolicy.reinvest.ratio`（默认 0.5，`maxBudgetTokens` 默认 200k）折算为机制试验预算；收据指纹记账于 `graphflow-out/efficiency-reinvest.json`（每条 efficiency.json 记录只出资一次，重复 apply 幂等，损坏账本 fail-open）；输出下一步试验建议（`frozen`→held-out 优先、`in-trajectory`/`proposed` 次之，终态机制不再建议），**试验执行仍归操作者/宿主**（advisory 边界不变）。默认开启，可经设置页/配置关闭。测试 `tests/m88-efficiency-reinvest.test.ts`（7 条：预算推导/上限/disabled/建议排序/幂等 apply/dry-run 零写入/账本 fail-open）。至此 SoL-Pi 借鉴（R6）P0/P1/P2 全部 ✅。

## [1.18.7] - 2026-09-14

### Fixed

- **MCP stdio 握手时序（严格客户端启动失败）**：stdio 服务器曾在 `initialize` 响应之前把 `notifications/message`（文件监视器启动日志）写到 stdout，严格按序等待响应的客户端（实测 ZCode）握手失败。`sendLogNotification` / `sendProgress` 现在以 SDK `oninitialized` 回调（客户端 `initialized` 通知到达）为门，握手完成前一律抑制，日志仅走 stderr。端到端实测：stdout 首行即 initialize 响应，`initialized` → `tools/list` 全链路干净。
- **测试不再重写/删除真实宿主配置与技能**：`buildInstallReport` 会重写所有检测到的宿主配置、`uninstallAllSkillsAndRules` 会扫除真实 HOME 下全部技能目录——此前 4 个 install 测试与 1 个 uninstall 测试未隔离 HOME，本机跑一次全量测试即静默撤销手工修复的 `~/.zcode/cli/config.json` 并删除 `~/.zcode/skills/graphflow/`。五个测试全部改用临时 HOME/APPDATA 隔离（uninstall 测试跑后以 md5 校验真实技能完好）。

### Added

- **ROADMAP R7 演化方向（2026-09 横向调研版）**：基于对云端记忆 API（Mem0/Zep-Graphiti/Letta）、索引派（codebase-memory-mcp/Continue+Ollama）、反索引派（Cline）、Agent Skills 开放标准生态（~40 平台、AGENTS.md 在野 57k+）与**效率机制赛道（NVIDIA SoL-Pi：绑 Pi 单宿主）**的横向对比，确定演化主线：R7-a 学习飞轮产物以标准 Agent Skills 包分发、R7-b 零配置本地语义召回默认开、R7-c 跨仓库/monorepo 图谱、R7-d 隐私威胁模型 + 审计面、R7-e 业界记忆基准接入、R7-f 团队记忆企业化。（发布后补充：R7-g 效率机制投影面宿主泛化、R7-h 效率证据可审计公开格式——补入第五赛道调研后新增，见 ROADMAP。）

## [1.18.6] - 2026-09-14

### Added

- **ZCode 宿主支持**：新增 `zcode` HostAdapter（capabilities: `mcp-stdio` + `skills` + `rules`）。`graphflow install` 现在会检测 `~/.zcode` 并完成三件事：(1) 向 `~/.zcode/cli/config.json` 的 **`mcp.servers`**（ZCode 嵌套结构，新增 `configFormat: "zcode"`）注入 `graphflow` stdio MCP 服务器；(2) 将 `skills/graphflow/SKILL.md` 复制到 `~/.zcode/skills/graphflow/`；(3) 向 `~/.zcode/AGENTS.md` 写入受管指令块（append-with-markers，不动用户内容）。工作区级 `.zcode/config.json` 目标同步支持，`doctor` / `uninstall` 均已覆盖（注入/检测/移除均为幂等操作；卸载时清理 `mcp.servers` 条目但保留其它服务器与顶层键）。新增测试 `tests/m87-zcode-host.test.ts`（3 条：注册表形状 / 安装+状态+幂等 / 预存配置保留）。

## [1.18.5] - 2026-09-13

### Added

- **DSH 插件市场收录合规（按 [STANDARD](https://github.com/bradeGithub/DSH-Plugins-Marketplace/blob/main/STANDARD.md)）**：`package.json` 的 `dsh` 块补齐显式声明（`plugin: true` / `kind: "server"`，`bundle.patch` → `cordis.patch.yml`，市场据此判为 **cordis-plugin**）；补齐规范关键词（`dsh`、`dsh-plugins`、`deepseek-harness-plugin`、`cordis`、`cordis-plugin`）；新增 **disclosure 披露块**（D1 云端依赖 + 端点、D3 凭据处理、D4 权限声明，另含 `offline_mode`/`jurisdiction`）——本地索引/压缩/召回/图存储全离线，仅配置了 LLM provider 时才访问云端端点。
- **README（中英）**：新增 DSH 徽章、插件市场一键安装与 `dsh plugin --profile web add github:Roarpeng/GraphFlow` 两种路径，并按 STANDARD §6.4 明确「**只选一条注册路径**」（市场/`dsh plugin add` 与 `npx @roarpeng/graphflow install` 的 home overlay 不要叠加，否则重复加载）；披露摘要与市场类型说明（源码型 → 安装时询问并执行构建）。

### Security

- **全局配置以 0600 写入**：`~/.graphflow.config.json` 可能保存 `providers.<name>.apiKey`，现在创建/迁移/通过设置面板保存时都写为**属主可读写**，并会收紧已存在文件的权限（此前是 0600 &~ umask = 0644，同机其他用户可读）。这也是 disclosure 中 `api_keys[].storage: "file-0600"` 的依据；测试 `tests/m86-config-file-mode.test.ts`（新增 3 条）在 POSIX 上断言模式位。

## [1.18.4] - 2026-09-13

### Fixed

- **Windows 平台验证失败（v1.18.3 的回归）**：1.18.3 让 Windows CI 的 `Test` 步骤失败——(1) `m83` 测试用 `"/"` 拼相对路径，在 Windows 上拿到绝对路径（已改为 `path.relative` + 正斜杠归一化）；(2) 解析 worker 池在 TypeScript 源码（`tsx`/vitest）下用 `--import tsx` 启动 worker，Windows 上启动开销大且不稳定，拖慢到超时。现在 **worker 池只在编译产物（`file-parse-worker.js`）下启用**，源码/测试/`tsx` 运行一律走进程内解析（同一图，确定性）；worker 池仍由 m84 的注入式调度测试与 dist 端到端实测覆盖。
- **worker 池门槛改为按规模**：线程切换有固定成本（worker 启动 ≈4×150ms + 结果克隆），实测 1.2k 小文件仅打平、5.5k 文件 / 50MB 源码 1.68×。门槛改为 `文件数 ≥ 200 且总字节 ≥ 1MB`（`graphPolicy.indexWorkers` 显式指定时同样遵守该门槛）。
- `git ls-files` 扫描加 `-c core.quotepath=false`，避免非 ASCII 路径被 C 风格转义后与真实路径不匹配。

> 说明：v1.18.3 的 npm 包已发布成功，但 Marketplace 发布被 Windows 验证阻塞（`publish-marketplace` 依赖 `validate`，后者失败即跳过），因此以 1.18.4 重新发布；功能改动与 v1.18.3 相同。

## [1.18.3] - 2026-09-13

### Performance

- **大型项目索引提速 3.7–4×（实测 ragflow：5,492 文件 / 78,160 符号）**：首建 **34.7–37.6s → 9.5s**（4 workers）/ 16.2s（单线程），图存储 **855–860MB → 193MB**。三处改动叠加：
  - **reference 边预算**：跳过"定义文件数 > N"的通用名（DF 停用词，`graphPolicy.referenceEdgeMaxDefinitionFiles`，默认 10；0=不限）并限制每文件引用边数（`referenceEdgeMaxPerFile`，默认 500）。实测 575 万 → **99 万条** references（−83%）；此前 1.87 万个名字贡献了 575 万条边，`__init__` 一个名字就有 46.9 万条（定义于 414 个文件）。质量有验证：`ci-release-evidence` 三个 golden 探针 recall 保持 **1.00**，`fidelity-anchor-recall` 88 → **91**。
  - **worker 池并行解析**（`worker_threads`，默认 cores−1、上限 8；`graphPolicy.indexWorkers`、`GRAPHFLOW_INDEX_WORKERS=0` 可关）：解析阶段 fan-out，缓存/剪枝/写库仍在主线程；实测同仓库 **15.95s → 9.50s（1.68×）**，且图**逐项一致**（91,680 节点 / 1,113,739 边 / 989,218 refs）。worker 创建或单任务失败都会自动降级为进程内解析，绝不让索引失败。
  - **索引扫描更聪明**：尊重 `.gitignore`（`git ls-files --cached --others --exclude-standard`，精确语义；`graphPolicy.respectGitIgnore: false` 可关，非 git 仓库自动回退目录遍历），并跳过 lockfile / minified bundle / source map / 生成代码（`*_pb2.py`、`*.pb.go`、`*.g.dart`、`*.generated.*` …）。
- **增量保存不再重写整库**：file 传输新增**追加式 delta 段**（`graphflow-graph.json.delta.jsonl`）+ 阈值压缩（默认 8MB）。仅当 base 存储 ≥ 4MB 才启用，小/中型项目保持"单个自包含 JSON、字节级不变"的历史布局。实测 11.2MB 图库：**单文件保存 0.27s 且 base 未被重写**（delta 3.5KB），无变更重跑 0.04s；`vacuum()` 与重建会把 delta 压缩回单文件。所有内部读取路径（`loadGraphStore` 等）都会合并 base + delta。
- **机械优化（消除 O(store) 放大）**：`upsertGraph()` 让节点+边**一次读写**（此前 `upsertNodes` + `upsertEdges` = 两次整库重写）；**空批次完全不触碰存储**（watcher 空跑不再重写）；**边键集合缓存**（增量写入不再每次重建百万级 key 集合）；批量索引的 **per-file prune 合并为一次批量删除**（此前每个文件一次整库重写 —— 大型仓库增量索引会因此卡死；实测已修复：原先 >120s 卡死 → 13.1s）。

### Added

- **配置**：`graphPolicy.respectGitIgnore`（默认 true）、`referenceEdgeMaxDefinitionFiles`（默认 10）、`referenceEdgeMaxPerFile`（默认 500）、`indexWorkers`（默认 auto；0 = 关闭 worker 池）。
- **测试**：`m83-index-scan-budget`（DF 过滤、每文件上限、增量路径同预算、生成/锁文件识别、真实 git 仓库 `.gitignore` 生效与可关闭）、`m84-index-worker-pool`（worker 计数/门槛/入口解析、注入式调度与容错、共享解析核心）、`m85-incremental-store-delta`（追加不重写 base、阈值压缩、删除走 delta、vacuum、截断行容错、重建清理）、`m82` 扩到 10 条。

## [1.18.2] - 2026-09-13

### Fixed

- **VS Code 扩展「GraphFlow MCP 自动安装失败: Invalid string length」（已完整复现并定位）**：扩展的 MCP 自动安装（`runMcpBootstrap`）会调用 `getSettingsPanelStatus()`，而它经 `inspectGraph` **自动索引整个工作区**；文件传输随后把整张图当作**一个 JSON 字符串**序列化（`JSON.stringify(store, null, 2)`）。对文档密集型仓库，索引器会产出约 **590 万条** `references` 边（实测 ragflow：5,939,794 边 / 91,684 节点），pretty-print 后的 payload 超过 V8 单字符串上限（64 位约 512 MB）→ `JSON.stringify` 抛 `RangeError: Invalid string length`，用户看到的就是安装失败（且图存储长期只有节点、`edges: 0`，因为边写入每次都死在这一步）。修复分四层：
  - **面板/状态路径改为只读**：`inspectGraph` 新增 `autoIndex`（默认 `true`，CLI 行为不变），`getSettingsPanelStatus()` 传 `false` —— “安装 MCP”/面板刷新不再建图（实测：打开大型仓库时从"索引到崩溃"变为 12ms 返回，且不写盘）；建图仍由显式命令与激活后的自动索引负责。
  - **写盘不再物化单个巨串**：小图（≤20k 元素）仍美观打印；大图改为**紧凑 + 分块写入**（4MB 缓冲区，逐元素序列化），写入前不再构造完整 payload。实测同一仓库 901 MB 图存储写入成功。
  - **新增分块读取器**（`src/graph/graph-store-json-chunks.ts`）：超过单字符串上限的 store 逐元素增量解析，跨任意 chunk 边界可恢复（含跨边界的多字节 UTF-8，截断文档报错而非半读）。实测 901 MB / 5,939,794 边 20 秒读完；`readFileGraphStore` 与 `GraphifyFileClient` 均自动路由到它。
  - **扩展启动步骤互相隔离**：安装、探测、模型指南、面板统计各自捕获异常；面板统计失败不再被报成「MCP 安装失败」，失败时同时把 `err.stack` 写入 GraphFlow 输出通道（此前只有一行 `err.message`，本次 bug 正是因此难以定位）。

### Added

- **`tests/m82-graph-store-write-safety.test.ts`**：锁定四条保证——面板状态只读（不建图、不写盘）、`inspectGraph` 默认仍建图（CLI 行为不回退）、`autoIndex:false` 不触碰存储、小图美观打印 / 大图紧凑分块且可往返解析、超限存储走分块读取、跨 chunk 边界（含 1 字符 chunk 与多字节字符）解析一致、截断文档被拒绝。

## [1.18.1] - 2026-09-12

### Fixed

- **跨宿主 unsafe workspace root 加固（dsh / opencode glue）**：dsh glue 的工作区此前只读 `payload/agent/session.cwd`，dsh 从 `$HOME` 启动时宿主进程 cwd 胜出，首轮 hint 因此把 `rootDir=/home/<user>` 喂给模型（MCP 硬拒 → 整次调用失败）。现在优先取会话头 `session.header.cwd`（含 `subagent/*` 直接传入的裸 session 对象），遇到 home/AppData/未展开占位符会跳过；hint 自身也不再输出任何 unsafe `rootDir`——无法确定时直接省略，由服务端按 `GRAPHFLOW_WORKSPACE_ROOT` / 发现逻辑兜底。opencode 插件同理：改用宿主传入的 `{ directory, worktree }` 作为 CLI 子进程 cwd，不再继承宿主进程 cwd（此前在项目外启动会把回复记到错误工作区，被拒后静默丢弃）。
- **MCP 边界：unsafe workspace root 变成可恢复错误，不再 `-32603`**：显式 `rootDir` 或 cwd 落在 home/AppData 时，工具调用返回 `isError: true` 的结果，附 server cwd、当前 `GRAPHFLOW_WORKSPACE_ROOT` 与「改用项目绝对路径重试」的指引；此前作为协议错误抛出，整次调用对模型不可恢复。**安全策略未放宽：仍然拒绝 home/AppData，只是拒绝方式可操作。**
- **新增 `CLAUDE_PROJECT_DIR` 工作区发现提示**：Claude Code ≥2.1.157 会把它注入 MCP stdio 子进程；从家目录启动的 Claude Code 现在能自动解析出会话项目，而不是让每个工具调用失败（unsafe 取值仍会被跳过）。
- **`sync:surfaces` 镜像映射错误**：此前把 Trae 规则同时写进 `.agent/rules`（属 Antigravity）与 `.claude/rules`（属 Claude Code），`sync:surfaces --check` 在 v1.18.0 上一直是 DIRTY；现按安装器真实来源映射，并补上 `.cursor/rules`、`.trae`/`.agent` skills、`.windsurfrules`、`AGENTS.md`，`--check` 通过。
- **规则/技能写入 `rootDir` 契约**：4 个规则模板、规范 SKILL.md、根 `CLAUDE.md`/`AGENTS.md` 与托管指令块（GEMINI.md、`.windsurfrules` 等）统一说明——`rootDir` 必须是项目绝对路径，禁止 home/AppData/未展开 `${workspaceFolder}`；遇到 `unsafe workspace root` 就省略 `rootDir` 重试。
- **新增跨宿主安装守卫测试**（`tests/m81-host-install-workspace-guard.test.ts`）：沙箱 HOME 下安装全部已迁移宿主，断言任何写出的 `cwd` / `GRAPHFLOW_WORKSPACE_ROOT` 都不会指向安装者 cwd、HOME、AppData 或沙箱外路径（并校验 dsh 的 MCP 行保持 `!!js process.cwd()` 动态形式）。

### Added

- **插件 ON/OFF 配对效率 A/B harness**：新增 `benchmarks/plugin-ab-lib.ts`、`benchmark:plugin-ab`（DSH 插件开/关双臂，沿用 SoL-Pi 配对双臂 + 能力地板判据）与 `benchmark:real-task-ab`（离线、确定性、免 API Key 的真实任务「起步 token 成本」对比），并附设计文档 `docs/efficiency-ab-test-design.md` 与实测结果 `benchmarks/REAL-TASK-AB-RESULTS.md`。
- **`graphflow efficiency [show|reset]` CLI**：直接查看配对效率报告与能力地板判定（release-gate 读取同一份数据）。
- **机制试验写入效率报告**：`recordMechanismTrial` 新增 `onComparison` sink，配合新的 `appendEfficiencyRecord()` 把**已评估**的记录原样落进 `graphflow-out/efficiency.json`（不再被默认容差重算），机制 trial 因此对 release-gate 的能力地板可见，而不只存在于 mechanism Decision 节点里。

## [1.18.0] - 2026-09-12

### Added

- **统一效率机制开关 efficiencyPolicy（SoL-Pi 借鉴，P0 收口）**：新增顶层配置 efficiencyPolicy.{observations,contextPressure,actionFusion}，**默认全开（最佳配置）**；可在 graphflow-settings 页逐项关闭，或在此显式设 false。解析集中在纯函数 src/config/resolve.ts 的 resolveEfficiencyPolicy；数值非法回退安全默认，reduce.strategy="llm" 缺 provider+model 时降级为 fingerprint。显式调用（graphflow_context 传 content/handle、reduce:true）属于明确意图，不受开关限制。
- **GF-3 观测压力预算 + 压缩建议（Online Context Compact analog）**：graphflow_context 新增 contextPressure 入参（usedTokens/maxTokens/pressureRatio/remainingTurnsEstimate）。启用后打包预算由 deriveAdaptiveBudget("auto", observed) 决定（回退默认预算，绝不编造压力），结果新增 contextPressure 块：effectiveMaxContextTokens + 可选 compaction 经济性建议（cacheWriteReadRatio 默认 12.5，minSavingRatio 默认 0.2）。启用时绕过 context 缓存，避免跨压力复用陈旧预算。
- **GF-4 融合动作步骤（Action Fusion analog）**：graphflow_run bridge 模式的 executionDescriptor 新增 steps（fused: true）——plan 中 edit/write 紧跟的 run/test/validate 节点合并为一个动作单元（含 command 与 dependsOn），供宿主在一次调用内执行；执行权仍归宿主，GraphFlow 只做计划与证据。
- **GF-2 观测句柄策略来自配置**：graphflow_context 的 pack/recall/reduce 现按 efficiencyPolicy.observations 解析阈值、head/tail、TTL、脱敏与 reducer 路由（解析失败 fail-open 到内置默认）。SKILL.md 新增 Workflow 8，写明「归档大输出 → 保留 handle → 按页/区间精确召回 → reduce 出逐字核验收据」协议。

- **P1 配对效率报告 + 能力地板（SoL-Pi capability floor）**：新增 src/learning/efficiency-report.ts，按「基线臂 vs 打包臂」记录同一任务的 tokens/turns/toolCalls/responseCount/score 配对对比，落盘 graphflow-out/efficiency.json。token 未改善、或分数/响应数劣化超容差即判不合格——response-count 臂专门证明节省不是「少干活」。提供 evaluateEfficiencyFloor / evaluateFidelityFloor 供治理门禁使用。
- **P2 机制自动研究回路（SoL-Pi auto-research 方法论）**：新增 src/learning/mechanism-research.ts，把「候选机制」作为节点（mechanism:<slug>）走 proposed → in-trajectory → frozen → held-out → admitted|rejected。三条规则代码强制：准入必须有合格的 held-out 试验；冻结后不再接受 in-trajectory 试验（held-out 隔离）；终态不再接受试验。新增 graphflow mechanism propose|trial|freeze|admit|reject|list CLI，并在 graphflow diagnose 暴露 mechanisms 汇总。
- **P1 工具结果投影（自动省 context）落地 dsh**：dsh 具备 surface-replace 原语（与原生 dsh-compaction-tool-result-pruner 同一 API），dsh/plugin.mjs 新增观察投影：在 session/event 的 tool/result 上先把原文归档到观察库（新增 CLI `graphflow observe pack|recall`），再用 handle 投影替换模型可见的表面节点（保留首尾 + 召回指令），并带 surfaceOp replace + sourceEventSeqs。默认开启（GRAPHFLOW_D_DSH_PROJECTION=0 关闭），全程 fail-open（禁用/低于阈值/打包失败/表面 API 缺失/append 抛错都退回原文）。与原生 pruner 的本质差别：原文精确可召回且逐字核验，而不是有损 marker。src/observations/host-hook.ts 的 projectToolResult 为进程内宿主的同一契约；HOSTS_WITH_TOOL_RESULT_PROJECTION 现为 ["deepseek-harness"]。其余宿主（opencode/Cursor/Codex/Gemini）暂无结果重写面，继续走 SKILL.md 显式 handle 协议。

### Fixed

- **toContextPressure 不再伪造 token**：仅提供 maxTokens（或仅 usedTokens）时此前会以默认 0 补齐并得出可用的压力比；现在要求「显式 ratio」或「used+max 双双有限且 max>0」，否则返回 undefined。
- **远端 reducer 路由不得静默降级**：reduceObservation 在 strategy="llm" 且未传入 reducer 时返回 reducer-route-missing 的 fail-open 摘录，而不是悄悄退回本地 fingerprint 选择器；配置解析层同时把缺 provider/model 的 llm 策略降级为 fingerprint。

### Changed

- **governance release-gate 新增能力地板阈值**（均可选，保持向后兼容）：--min-efficiency-qualifying、--max-capability-regressions（默认 0）、--min-anchor-recall-percent、--min-body-coverage-percent。锚点召回/正文覆盖仅在存在样本时检查。

### Documentation

- 新增 docs/efficiency-mechanisms.md：SoL-Pi 借鉴的配置、四机制映射、效率/能力地板、机制自动研究 CLI、投影边界，以及「不要做」的负面清单。

## [1.17.1] - 2026-09-10

### Fixed

- **插件说明页版本停滞两个 minor**：`vscode-extension/README.md` 就是发布到 VS Code Marketplace 与 Open VSX 的**说明页正文**（随 VSIX 打包并对外展示），却仍停留在 **1.15.3**——含 `graphflow-1.15.3.vsix` 安装命令、`npx @roarpeng/graphflow@1.15.3 install`、"升级到 1.15.3+"，以及一整节 "v1.15.x 要点"。v1.16.0 与 v1.17.0 两次发版都没有更新它，用户看到的说明页因此落后两个 minor。已重写为 1.17.x 内容，并补上此前缺失的 v1.16.0（HostAdapter 全宿主、编排层拆分）与 v1.17.0（双口径 token 节省、对话图接入上下文引擎、对话密钥脱敏、provisional 准入）要点。
- **根 README 章节标题滞后**：`README.md` 的 `## Core capabilities (v1.15+)` 与 `README.zh.md` 的 `## 本版要点（v1.15）` 更新为 v1.17，并补上 v1.17 的能力行（打包后 token 记账、双口径节省、对话图注入位置与密钥脱敏）。

### Tests

- `tests/m48-doc-code-consistency.test.ts` 新增守卫，堵住这次漂移的根因——**插件说明页此前完全不在文档一致性检查范围内**：
  - `vscode-extension/README.md` 纳入 `DOC_FILES`（工具名一致性 + UTF-8 校验）；
  - 新增 `README_SURFACES` 断言**所有面向用户的 README**（根 EN / 根 ZH / 扩展）都引用当前版本；
  - 断言插件说明页里每个 `graphflow-<version>.vsix` 文件名与 `@roarpeng/graphflow@<version>` 都等于当前版本——此前正是"这个页面的版本号没人管"，用户才会照着 1.15.3 的命令去装。

## [1.17.0] - 2026-09-09

### Added

- **Token 节省的现实对照臂**：`benchmarks/run-token-benchmark.ts` 新增 Arm B `baselineTopKFilesFullText`——把**同一排序器**的 top-K 锚点解析到真实源文件并按全文计数（每文件上限 1500 行，`--anchor-top-k=N` 可调）。原 Arm A 更名 `baselineGrepTopFilesFullText` 并明确标注 "upper bound by construction"。实测：Arm A 410,725 → 6,044（98.5%）；**Arm B 136,265 → 6,044（95.6%）**。每查询的 `resolvedFiles` 落盘可复算。Arm B 无法自我膨胀——锚点越小它的节省率越低。
- **打包后 token 记账**：`src/surfaces/cli/runtime/graph.ts` 新增 `estimateSummaryLinesTokens` / `estimateUnbudgetedPayloadTokens` / `withPostPackageAccounting`。对话召回行、workbench `promptLines`、对话主线 `promptLines` 三处「打包后前插」现全部计入 `tokenEstimate` 与 `budgetUsedPercent`；`dialogueHits` 作为**不占 L1–L3 配额**的负载单独报在 `unbudgetedTokens`，并新增 `accountedTokens`（= 已预算 + 未预算）。`estimatedSavingsPercent` 改为对**真实总量**计算，`graphflow-out/token-savings.json` 的 ROI 不再系统性低报。
- **技能准入冷启动层**：`admitSkillToProvisional`（`src/learning/skill-admission.ts`）——`proven` 仍严格要求 `successCount >= 2` 的去重 pass episode；新增的 provisional 层要求名字像项目符号**或**至少 1 个成功 episode，且**无条件否决**结构性噪声（空名 / 纯停用词 / readme+update 融合）。文档明示：provisional 只是 hint，**绝不作为 proven 呈现、导出或同步**。
- **对话写入边界密钥脱敏**：`redactSecrets`（`src/learning/dialogue-thread.ts`）在**写盘前**清洗 `userQuery` / `assistantReply` / 派生 title+summary / 序列化的 `record` metadata / agent trace label。覆盖 PEM 私钥、含凭据的连接串（postgres/mysql/mongodb/redis/amqp/mssql）、Bearer 与 JWT、各家 API key 形态（sk-/ghp_/github_pat_/glpat-/xox[baprs]-/AKIA/AIza…）、以及 `KEY=value` 形式的凭据键。标记稳定可调试（`[REDACTED:api-key]` 等），幂等，默认开启，`GRAPHFLOW_DIALOGUE_REDACT=0` 可关闭（附团队同步风险警告）。误伤保护有 10 组反例测试（散文、路径、无凭据 URL、版本号、`process.env.X` 等原样通过）。

### Fixed

- **L3 对话打包在生产路径是死代码**：`injectDialogueTurns` 此前**只**被 `buildLayeredContextPackage` 调用，而生产路径 `previewContext`（MCP `graphflow_context`）走的是 `buildEnhancedContextPackage`——于是 v1.14.0 的头号能力「对话图进入上下文引擎 L3」对用户**从未生效**，而 5 个测试只覆盖非生产打包器所以 CI 全绿。现抽出共享阶段 `injectL3Stage`（`src/graph/context-package-core.ts`）：治理技能/pin 与对话轮在**同一 budget、同一 L3 配额**下打包，两个打包器共用，不再漂移。`tests/m-dialogue-l3-packing.test.ts` 改为对**两个**打包器同时断言。
- **CI 发布证据同义反复**：`scripts/ci-release-evidence.ts` 此前用 `returnedAnchorIds.filter(...)` 反推 `expectedAnchorIds`，而 recall 的定义使 `expected ⊆ returned` 时恒为 1.0——该门禁在数学上不可能因检索质量失败。现期望锚点**先于检索**从提交在案的 golden 数据集独立导出（缺失的探针用显式 ground-truth 常量并在 recall < 1.0 时失败）；同时传入 `expectedBodies`/`packagedBodies` 让唯一非同义反复的 `bodyCoverage`（LCS）**真正被度量**，为 0 即失败。
- **proven 技能证据可断言而非可观测**：`userConfirmed` 在 CI 场景改为 `false`（CI 不是人）；`testResult` 不再硬编码 `"pass"`，改为按 `GRAPHFLOW_CI_TEST_RESULT` 环境变量 → 流水线结果文件 → GitHub Actions 步骤顺序推断，**缺失即 unknown 并明确失败**，不回退到断言；DOGFOOD_LESSONS 里陈旧的 "(149 files)" 改为运行时统计真实测试文件数。
- **`wouldDegradeLibrary` 忽略真实成功证据**：它调用 `admitSkillToProven(name)` 时不传 options，`successCount` 恒为 0，永远走不到 "success-evidence" 快路径——有真实成功 episode 的技能会被误判为"会污染库"。现接受可选 `AdmitSkillOptions` 并转发（1 参调用点保持兼容）。审计确认生产晋升路径本就直连 `admitSkillToProven`，故无生产调用点在丢失证据；`admitSkillToProvisional` 已从 `src/index.ts` 导出。
- **安全审计工作流连续 3 周静默失败**：`scripts/security-audit.cjs` 第 10 行用了 `join` 却未 import `node:path`，`ReferenceError` 使 2026-08-24 / 08-31 / 09-07 三次定时运行在 `npm audit` 运行前即崩溃。修复含 `node:path` 导入、Windows `shell` 处理、报告路径按仓库根解析；新增 `tests/security-audit-script.test.ts`（静态断言 import + 端到端跑假 npm 断言无 ReferenceError），随 `npm test` 进入 CI——坏脚本从此无法隐藏。

### Changed

- **README 的 token 节省改为双口径并列**，不再只报膨胀分母的单一数字；两项分别标注其回答的问题与不可互换性。

## [1.16.0] - 2026-09-08

### Added

- **R4 集成层模块化收口（HostAdapter 全宿主）**：新增通用 profile 驱动切片 `src/integrations/profile-host-installer.ts`。`installViaHostAdapter` / `uninstallViaHostAdapter` / `getHostAdapterInstallStatus` 现覆盖全部 19 个注册宿主——4 个手写切片（DeepSeek Harness / Cursor / Claude Code / Kimi Code）+ 15 个 profile 宿主（Trae、VS Code、Windsurf、Cline、Roo Code、Kilo Code、PearAI、Gemini、Codex、Antigravity、Amazon Q、Zed、Continue、Qoder、Opencode）。
- **`skill-installer` 精确目标原语**：`installSkillToTargets` / `removeSkillFromTargets` / `installInstructionsToTargets` / `removeInstructionsFromTargets`——单宿主 install slice 只写自己的 `skills/graphflow/SKILL.md` 与受管指令块，不再顺带写其它已检测宿主。

### Changed

- **CLI 三处宿主硬编码改为注册表遍历**：`install` / `uninstall` / `doctor` 统一走 `HOST_ADAPTER_MIGRATED_IDS`；`uninstall` 先按宿主切片清理，再跑遗留清扫（工作区 MCP 条目、Trae 用户 Skill、项目级规则）。新增宿主不再需要改 `init.ts`。
- **`agent-profiles` 注册表并入 `buildAgentProfiles()`**：`opencode` 等仅在新注册表登记的宿主获得 MCP 安装/状态支持；遗留条目在同 id 时优先，已写入的 marker / target 路径不变。
- **`runOrchestration` 拆分**：新增 `src/core/orchestrator-phases.ts`，把 ~360 行大函数拆为 `runSimplePhase` / `resolvePlanPhase` / `runBridgePhase` / `runLlmDagPhase` + `makeDagNodeRunner`；`orchestrator.ts` 只保留模式解析、上下文装配与 triage。日志、图/技能同步顺序、`triageId` 传播（含 LLM 失败路径有意不带 `triageId`）逐字保持。

### Fixed

- **mcp-http 请求超时可配置**：新增 `GRAPHFLOW_MCP_TIMEOUT_MS`，`createGraphClient()` 据此设置 `GraphifyMcpClient.timeoutMs`（默认仍 15s）。当端点连接挂起（而非被拒绝）时，15s × 多次图操作会拖长单次运行；该开关让 CI / 测试可以快速失败。
- **临时目录残留图谱劫持工作区发现**：MCP 服务以 cwd 位于 `%TEMP%` 启动时会在那里写 `graphflow-out/graphflow-graph.json`，而 `hasProjectWorkspaceMarkers()` 把该文件当作项目标记，于是 `discoverWorkspaceRoot()` 对**所有**位于临时目录之下的项目都返回临时目录根，m49 工作区隔离用例随之失败。新增 `isSystemTempDirectory()` 作为向上遍历边界（不改动 `isUsableWorkspaceFallback`，保留显式 cwd 回退语义），并给 `discoverWorkspaceRoot()` 增加 `extraBoundaries` 测试钩子。
- **README.md / README.zh.md UTF-8 损坏**：v1.15.4 的版本号提交（`a8ae51d`）在改写两个 README 时把约 100 个多字节序列的第三字节替换成 `?`——中文、破折号、箭头、勾选全部变成乱码并随 npm 包发布。已按 `e7e429d`（v1.15.3 文档提交）逐行核对后重建，仅保留有意的版本号与 HostAdapter 文案改动；同时补齐 README.zh.md 落后一版的版本徽章（1.15.4 → 1.15.5）。

### Tests

- `tests/host-adapter-install.test.ts`：注册表完整性、通用切片 install / uninstall / status、未安装宿主零写入（+4 用例）。
- `tests/m-install-hooks-wiring.test.ts`：doctor hooks 检查改为按 agent 名匹配（DeepSeek Harness glue 与 Claude Code hooks 同属 `hooks` 类别，注册表顺序不是契约）。
- `tests/m48-doc-code-consistency.test.ts`：新增「文档必须是合法 UTF-8」与「README.zh.md 徽章与 package.json 一致」两个守卫（+2 用例）。
- `tests/m49-workspace-root-isolation.test.ts`：新增临时目录边界与「残留图谱不得捕获嵌套项目」回归用例（+2 用例）。

## [1.15.5] - 2026-09-08

### Added

- **Kimi Code HostAdapter**：`installViaHostAdapter("kimi-code")` 写入 `~/.kimi-code/mcp.json`、Skill 与 `AGENTS.md`；doctor / uninstall 同步走注册表。Kimi Code 不展开 `${workspaceFolder}`，MCP env 省略该占位符。工具前缀 `mcp__graphflow__`。

## [1.15.4] - 2026-09-06

### Fixed

- **DeepSeek Harness 安装不再弄挂 `dsh web`**：`graphflow install` 在 profile 未安装 `@roarpeng/graphflow` 时只写 MCP home overlay（不写 glue）；profile 已有包时清空 home overlay，由 bundle 独占 MCP+glue，避免 `ERR_MODULE_NOT_FOUND` 与 `duplicate loader entry id: mcp-graphflow`。空 `cordis.patch.yml` 改为删除文件（dsh 拒绝空 YAML）。FAQ 补充对应排障。

## [1.15.3] - 2026-09-05

### Changed

- **R4 context packaging 去重**：`buildLayeredContextPackage` / `buildEnhancedContextPackage` 抽出共享 `context-package-core`（keyword/vector 召回、L1–L3 配额打包、dialogue 与 neighbor expansion）。两条公开函数的签名与 MCP/CLI context preview 行为保持不变；enhanced 仍独占 adaptive budget、RepoMap、symbol boost、graph compression 与 same-file/import 扩展。

### Tests

- **m74/m75 测试隔离**：不再 `process.chdir()`，也不再向真实 `$HOME/.npm/_npx` 写文件。fake home 与项目根均落在 `os.tmpdir()`，通过 `fromDir` 注入与 `process.cwd` mock 覆盖 unsafe-cwd 路径。

## [1.15.2] - 2026-09-05

### Added

- **飞轮公开复现包（path A）**：`npm run proof:flywheel` 串起已有的检索 / skill A/B / memory A/B 离线基准，打印机器可读摘要 + 人类 checklist；`--dry-run` / `--help` 不重跑基准。冻结数字目录 [`benchmarks/flywheel-proof-claims.json`](benchmarks/flywheel-proof-claims.json)；第三方入口 [`docs/flywheel-reproduction.md`](docs/flywheel-reproduction.md)。不发明新数字，只接线仓库里已提交的自测 RESULTS。
- **GraphFlow + Serena 联合方案独立指南**：把 `docs/comparison.md` 里的 "better together" 提升为一等文档 [`docs/graphflow-serena.md`](docs/graphflow-serena.md) / [中文](docs/graphflow-serena.zh.md)——并列安装两个 MCP、谁做什么（context/plan → Serena 编辑 → `report_outcome`）、常见坑。README（EN/中文）与 comparison 互链；配置示例 [`examples/graphflow-serena.mcp.json`](examples/graphflow-serena.mcp.json)（仅 MCP 片段，不把 Serena 写入 `package.json`）。无运行时代码改动。

## [1.15.1] - 2026-09-05

### Changed

- Cursor and Claude Code install / uninstall / doctor now go through the HostAdapter registry (`installViaHostAdapter("cursor")` / `installViaHostAdapter("claude-code")`), including Claude Code hooks. Remaining hosts (Trae, VS Code, Windsurf, Codex, Gemini, and others) still use the legacy installers.

### Tests

- Extended `host-adapter-install` with Cursor / Claude Code install-uninstall-status slices and M16-style CLI doctor wiring.

## [1.15.0] - 2026-09-05

### Added

- **Team shared memory MVP (ROADMAP R3)**：`graphflow team serve` 提供带 tenant 隔离与 viewer/contributor/admin RBAC 的 Graphify JSON-RPC 团队图服务；非 loopback 默认强制认证。`graphflow team issue-token` / `team example-config` 覆盖发证与客户端配置。
- **HTTP RBAC**：JWT `role` / `memory:read|write|admin` scope 或 `--http-token role:token` bearer 角色表；写路径（图变更、skill sync push、artifact import、governance）对 viewer 失败关闭。MCP Streamable HTTP 在配置了凭据时对 `tools/call` 执行同一套角色。
- **客户端**：`graphPolicy.mcpTenant`；mcp-http 客户端发送 `X-GraphFlow-Tenant`；401/403 不再静默降级到本地文件。`skill sync push|pull` 在 MERGE 语义上复用既有 git 技能包。
- **Diagnose / doctor**：`graphflow diagnose`（`route diagnose` 别名）与 `graphflow_diagnose` 输出 team 连通、authMode、tenant、RBAC、degraded-to-local。
- **文档**：`docs/team-memory-security.md` 标为 shipped MVP，并附部署 / 发证 / 加入 / 同步 runbook。

### Tests

- 新增 team RBAC 单测与 team server 集成测：角色允许/拒绝、tenant 隔离、非 loopback 拒无认证启动、客户端鉴权失败。

## [1.14.1] - 2026-09-05

### Fixed

- **#28 DSH first-turn hint**: the glue extends the `agent/pre-step` enter decision's `messages` after `next()`, so the hint rides in the same step as the user's first message. `agent.inject()` is no longer used (it landed in the next-step inbox and spawned a trailing step the model refused). WeakSet gating and plugin source tagging are unchanged.
- **#26 `/gf/nodes` HTTP 405**: `/gf` RPC registration waits for the host `connection` service with `ctx.inject(["connection"])` (same pattern as DSH api-gateway) instead of a sync `ctx.get("connection")` that is often undefined at apply() time. Registration failures are logged instead of swallowed.

### Changed

- package.json `description` / keywords match the README positioning: GraphFlow is a local-first memory & context harness for coding agents, not an orchestrating executor.
- DSH home overlay install/uninstall goes through the HostAdapter registry (`installViaHostAdapter("deepseek-harness")`). Cursor and Claude Code installers are unchanged.

## [1.14.0] - 2026-09-02

### Added

- **W1 时间语义与类型化边**：dialogue-turn 新增 `supersedes` / `same_topic` 类型化边与 `validAt` / `invalidAt` 时间有效性（Graphiti 式）；`detectSupersession` 离线修正检测（更正标记 + 主题重叠阈值，pending 轮不可被取代，nearest-N 截断）；跨 session `same_topic` 语义连边；`effectiveTurns` 当前真值过滤与 `formatSupersessionLine` 修正链渲染。`GraphEdge.relation` 扩展 `same_topic` 并纳入 compression weights / snapshot 优先级。
- **W1 可选 LLM 轮蒸馏**：`distillTurnWithLlm`（economy tier 路由，严格 Title/Summary/Decision 标签输出，失败逐轮回退启发式）；`isDecisionTurn` 决策轮标记为飞轮提供 turn 粒度学习信号；`dialogue distill --llm` CLI 旗标（仅 `hasUsableLlmProvider` 时生效）。
- **W2 对话图进入上下文引擎**：`context-slicer` L3 打包命中有效对话轮（≤3）并附修正链标注行——同 token 预算与 L3 quota，绝不豁免；`graph-search` 新增 `searchDialogueTurns`（默认隐藏被取代轮、`includeSuperseded` 回看历史、修正链注解），对话命中纯增量、永不挤掉代码 Symbol/File 结果。
- **W2b 对话轮检索接入生产链路**：`previewContext` 附加 `dialogueHits`（跨 session 历史问答召回，≤3 条、默认隐藏被取代轮；命中修正链时在 summary 顶部加一行 `Dialogue recall: ...`，`recordDialogue: false` 的只读召回也生效）——MCP `graphflow_context` 结构化结果与 CLI `graphflow context` 同步获得该字段；新增 CLI `dialogue search "<query>" [--limit N] [--include-superseded]` 与 runtime `searchDialogueTurnsRuntime`，直接检索历史问答。
- **W3 多 Agent 轨迹**：dsh glue 监听 `subagent/start|end` 写 `agent-trace` Decision 节点（`GRAPHFLOW_CAPTURE_TRACE` 独立开关、kind+label+status+turn 哈希去重、in-process runtime 优先、缺失即静默 no-op、绝不抛入 harness 循环）。
- **W3 fork / 回放原语**：`forkDialogueSession` 显式分叉（跨 session `next_section` 主干边 + fork session↔源 session `same_topic` 溯源边 + seed parentTurnId）；`walkDialoguePath` 回放路径 walker（jump/fork 边界标注）；CLI `dialogue fork --from <turnId> [--name]`、`dialogue list --path <turnId>`、`dialogue traces [--session] [--limit]`。
- **W4 面板与导出**：`/gf` RPC `nodes` 通道与 web 面板 host half 新增 `dialogue traces` 快照；面板对话轮显示「跳转 / 修正过结论 / fork」徽章与「Agent 轨迹」区块（含启动/完成/失败状态）；`artifact export-memory` 新增 `dialogues.md`——按 session 分组的对话子图（修正链与 superseded 历史标注、Agent 轨迹列表）。
- **发布管线真正可发版**：新增 `scripts/ci-release-evidence.ts` flywheel 自证步骤——在 CI 上对本仓库做真实 dogfood（真实索引 + 检索探针写入 context-fidelity 样本 + 两个真实 pass episode 绑定 proven skill），并生成确定性 `graphflow-out/ci.config.json` 供 gate 审计；`publish-npm.yml` 在 gate 前执行该步骤。此前 release gate 在全新 checkout 上恒为 `proven-skills 0 < 1; fidelity-samples 0 < 1`，v1.13 接入门禁后 npm 实际从未发版成功。

### Fixed

- **Windows release gate**：`scripts/release-gates.cjs` 改为直接 `node + tsx` 运行 gate CLI——Node ≥ 18 出于安全拒绝 spawn `npx`/`npx.cmd` shim（EINVAL），旧写法在 Windows 上静默失败且无任何输出。

### Tests

- 新增 5 个测试文件 28 个用例：`m-dialogue-temporal`（8，时间边与修正链）、`m-dialogue-llm-distill`（6，LLM 蒸馏回退）、`m-dialogue-l3-packing`（5，L3 打包预算与修正标注）、`m-dialogue-retrieval`（5，检索命中与 superseded 过滤）、`m-dialogue-fork-replay`（6，fork/回放/轨迹）、`m-memory-pack-dialogues`（4，对话子图导出）；dsh glue 套件更新为 3 命令面板协议并新增 4 个轨迹用例（共 29）。
- 新增 `m-dialogue-search-recall`（2，preview 附加 `dialogueHits` 与 CLI runtime 检索回环）；修复 README 版本徽章落后于 package.json 导致的 doc-code consistency 用例失败。

## [1.13.0] - 2026-08-23

### Added

- **Evidence Runtime**：outcome report 支持 repository/commit/diff/test command/result/artifacts/user confirmation；episode 持久化 evidence package，并返回 `verified|partial|unverified` 结论。新增 `outcome backfill` 用 JSON/JSONL 证据批量关闭 pending episodes。
- **Governance Plane**：新增 ADR / Invariant / APIContract / Test 图节点、版本化 upsert、supersession、review queue 和 requirement traceability；artifact 支持三方合并、冲突队列、HMAC 签名验证、AES-256-GCM 加密、保留策略与 quarantine 传播。
- **Tamper-evident audit**：evidence 与 MCP HTTP 治理事件使用 sequence + prevHash + SHA-256 hash chain，可离线验证篡改。
- **Secure MCP HTTP**：Streamable HTTP 支持 bearer token、HS256/RS256 JWT、issuer/audience/scope 校验、tenant allowlist、per-tenant session key 和审计响应头。
- **Release gates**：`graphflow governance release-gate` 强制 proven skill、context fidelity sample 和 pending episode ratio；npm publish workflow 已接入该门禁。
- **Portable profiles & proof plane**：`governance profiles` 导出 Cursor/Claude/Codex/DSH 配置；`benchmarks/run-proof-plane.ts` 支持多仓库 fidelity/token 评测。
- **Host adapter registry**：新增 DSH/Cursor/Claude 能力模型，作为 installer 后续拆分的稳定接口。

### Changed

- 统一 canonical embedding model 为 `Xenova/bge-base-zh-v1.5`，消除 graphPolicy 默认值与 transformers loader 的模型 split-brain。
- Graph node 类型扩展 ADR / Invariant / APIContract / Test；edge 扩展 `supersedes` / `governed_by` 并纳入 compression weights。

### Tests

- 新增 P0-P2 governance foundation suite，覆盖 evidence verification、knowledge supersession、artifact merge/signing/retention、encrypted snapshot 与 JWT claims。全量回归随发布流水线执行。

## [1.12.2] - 2026-08-22

### Fixed

- **Windows release gate**：MCP structured-result 测试显式使用 file graph backend，避免 SQLite 连接仍在打开时清理临时目录导致 `EBUSY`。这是 v1.12.1 Windows validate 失败的直接根因；Linux/macOS 本地矩阵未暴露该平台锁差异。

## [1.12.1] - 2026-08-22

### Added

- **MCP Streamable HTTP transport**：新增 stateless JSON 与 stateful SSE 双模式；支持 MCP initialize、draft `server/discover`、ping、tools、resources 和 structured tool results。启动方式：`graphflow mcp serve --http` 或 `graphflow-mcp --http`
- **HTTP 生命周期与安全默认**：显式 DELETE 关闭 stateful session；默认仅绑定 loopback，Host 校验防止 rebinding，浏览器 Origin 默认拒绝并可用 allowlist 显式放行
- **端到端 transport 矩阵**：SDK Client 分别验证 HTTP JSON 与 stateful SSE；raw 请求验证 discovery、未知路径、非法 Origin、DELETE 后 stale session 和非 loopback 保护

### Changed

- `@modelcontextprotocol/sdk` 固定到 1.30 runtime 面；stdio legacy handshake 继续兼容

### Tests

- 新增 `tests/mcp-streamable-http.test.ts`；全量回归 141 文件 / 956 用例通过，扩展 bundled runtime 冒烟 7/7 通过

## [1.12.0] - 2026-08-22

### Added

- **dsh 知识节点面板静态化（R4 落地）**：新增预构建 CJS factory bundle `dsh/client.js`（`window.__ModuleLoader__.load({id:"@roarpeng/graphflow/dsh",factory})`，named 导出 apply+inject；注册 `conversation.session.header.utilities` 开关与 `shell.overlay` 面板两个 slot，PANEL_CSS 闭包内注入防重），随 bundle 层开机自动加载——**不再需要按会话手动激活动态插件**。数据通道走 Connection 通用 RPC：glue 注册 `/gf`（`ctx.connection.rpc.handle(…,{authority:"trusted-host"})`，自带 browser-trust fence），handler 返回 RpcResult 信封 `{ok,value:{workbench,dialogues}}`；浏览器端 `connection.rpc.call("/gf","nodes",{workspaceRoot})` 取数。package.json 叠加声明 `dsh.client{platform:"web"}` + `exports["./client"]`/`exports["./dsh/package.json"]`（后者让现有 glue 行原样成为 client 扫描条目，实测 Node 解析通过）
- **Context Fidelity 指标流（R1）**：新增 `graphflow-out/context-fidelity.json`、anchor recall@k、missing anchors 和基于归一化 LCS 的 body coverage；`FlywheelReport.fidelity` 增加 sample / recall / coverage 聚合。token savings 与信息保真度从此是两条可审计指标
- **SKILL.md 双向互操作（R2）**：新增 `skill markdown export|import`；导出只带 portable 元数据与 playbook，不带走 GraphFlow 本地信任决策；导入一律保守标记 `import/correctable`，不继承 proven 或 canary 证据
- **Engineering KG 抽取落地（R3）**：新增确定性中英文 Concept/Requirement 抽取器；CLI `knowledge extract [--all|--session] [--dry-run]` 与 MCP `graphflow_index({knowledgeExtract:true})` 可把对话结论写入图谱并保留 dialogue-turn `derived_from` 审计链
- **MCP structured results + stateless discovery**：全部工具结果继续保留 `content[0].text` 兼容层，同时返回 `structuredContent`；tool schema 声明 JSON Schema 2020-12；SDK 升级到 1.30，stdio 兼容握手之外支持 `server/discover`
- **O(1) 技能读路径 + 自适应遗忘**：`readSkillState` / `loadCompositeSkill` 优先 `getNodesByIds`；skill decay 改为陈旧度 × 失败压力 × 成功保持 × proven 保护的确定性曲线，只软衰减，不删除经验
- **学习飞轮真实证据链（R0）**：`proven` 准入从"原子出现次数 `uses>=2`"改为"成功 episode 绑定计数 `successCount>=阈值`"（默认 2，`GRAPHFLOW_SKILL_PROVEN_MIN_SUCCESS` 可覆盖；按 episodeId 去重，旧数据经 `linkedSuccess+provenance.episodeId` 自动迁移，已 proven 节点不降级）；删除 `FALLBACK_GOLDEN_TOKENS` 硬编码闭集，golden 词集动态生成（检索 golden 数据集 `expectAny` + 运行时 pass episode/symbol 证据叠加 `registerGoldenEvidenceTokens`）；golden-overlap/符号检查降为辅助条件，不再一票否决真实成功记录
- **dsh 对话 A 面真实回填**：修复 glue 监听器读错会话事件信封字段（assistant 消息在 `event.data.message`，旧代码读 `event.message` 恒为空）这一"回复永远待回复"的根因；重写为 `turn/end` 提交模型（`assistant/message` 按 step 只喂"本 turn 最后文本"缓冲；`turn/end` 按 (session, turn) 去重提交；interrupted/aborted 不填）；回填管线 = 进程内 runtime（`captureAssistantReply`；命中 workbench topic 时追加 dialogue turn 填充，保证 A 面必闭）→ CLI 兜底（`context preview --reply` + `dialogue record --reply` 双幂等 tip 填）；latest-wins 每 session 串行队列 + no-pending-turn 有界重试；`GRAPHFLOW_CAPTURE_REPLY=0` 一票关闭
- **对话节点噪声过滤扩展**：`SYSTEM_MESSAGE_SOURCE_KINDS` 黑名单新增 `subagent-settled`/`subagent-report`（子代理完成/汇报通知此前被记成用户提问的直接根因）及 `agent-instructions`/`session-reference`/`goal`/`skill-catalog`；`user` kind 白名单放行真人输入，未知来源维持 role 回退保守兜底
- **file 图存储进程内缓存（R1）**：`graphify-file-client` 按绝对路径缓存解析 store 与懒构建倒排索引（`queryByKeyword` 不再每次重建索引），mtime+size 校验失效、写路径 write-through（拷贝构建 + `readSnapshot` 浅拷贝防污染）、跨实例共享；导出测试钩子

### Fixed

- **MCP unsafe-cwd 下工具级 rootDir 被吞（工具全灭）**：`resolveConfig()` 内部无条件先执行 `bindRuntimeWorkspaceRoot`（只认配置文件 `workspaceRoot`），MCP 服务端 cwd=家目录时在调用方 rootDir 应用前就抛 `Refusing to index unsafe workspace root`——而服务端启动日志承诺 "Pass rootDir on tools"。现在 `resolveConfig(configPath, { rootDir })` 把 rootDir 传入内部绑定（优先级 rootDir > projectWorkspaceRoot > cwd 发现不变，unsafe 安全检查不放宽）；`src/surfaces/cli/runtime/{graph,dialogue,routing}.ts` 全部持有 rootDir 的调用点已接线；`resolveRuntimeWorkspaceRoot` 支持注入 `fromDir`（测试免 `process.chdir`）

### Tests

- `tests/resolve-config-rootdir.test.ts`（新增 6 用例）：unsafe cwd + rootDir 不抛错且绑定生效；不传 rootDir 保持抛错；显式 configPath 分支；`fromDir` 注入向上发现
- `tests/dsh-plugin-glue.test.ts`：reply 断言重写到 turn/end 提交模型（信封形状、按 turn 去重重放无副作用、aborted/interrupted 跳过、CLI 兜底双 spawn 参数与 cwd）
- `tests/graphify-file-client-cache.test.ts`（新增 9 用例）+ `auto-transport` / `auto-transport-fallback`（+5）：缓存命中/外部变更失效/仅 mtime 失效/写透三方一致/交错读写、sqlite 不可用与初始化失败静默回退
- `tests/m-learning-success-evidence.test.ts`（新增 9 用例）；更新 5 个编码旧 `uses>=2→proven` 规则的测试
- 全量回归：140 文件 / 953 用例全绿；`tsc --noEmit` 零错误
- v1.12 新增回归：context fidelity、SKILL.md round-trip、Engineering KG extraction、structuredContent/stateless discovery、O(1) skill read、adaptive decay

## [1.9.16] - 2026-08-21

### Added

- **dsh 对话自动闭环**：`dsh/plugin.mjs` 监听 `session/event` 的 `assistant/message`，自动把每轮回复填入 `dialogue-turn` 节点（`dialogue record --reply`），与 `agent/inbox/inserted` 提问记录配对；提问/回复均按 dsh 会话 id 隔离（`--session`），同工作区多会话不串
- **对话节点提炼**：新增 `src/learning/turn-distillation.ts`（离线启发式）——`deriveTurnTitle` 剥离问候/祈使前缀取首子句（30 字符），`deriveTurnSummary` 结论标记句优先/末段落回退（200 字符）；`DialogueTurnRecord` 增加可选 `title/summary`，记录/回填时自动生成
- **CLI `graphflow dialogue distill [--all] [--session]`**：批量回填遗留轮次的 title/summary（幂等）；`dialogue list` 输出 title/summary
- **对话记录噪声治理**：`isUserOriginatedMessage` 按 `message.source.kind` 过滤 harness 系统注入（job 完成/子代理/Cordis 通知不再入图），未知来源回退 role 判断
- **web 知识节点栏源码种子**：`web/plugin.mjs`（Host+Client 双半部参考实现）+ `web/README.md`；`docs/dsh-install-guide.md` 新 harness 安装启用指南
- **ROADMAP 进化方向**：R0-R4 深度调研版（真实证据链 / 性能收敛 / MCP 2.0 与 SKILL.md 对齐 / 概念层落地 / 工程治理）

### Fixed

- **CLI `dialogue record --reply` 解析 bug**：reply-only 填充此前被参数解析短路——`--reply` 的值被裸参数拼接当成 query，导致填充变成新建垃圾轮次；新增 `resolveDialogueRecordInput`（reply-only 优先、flag 值不泄漏进 query、兼容 `--flag=value`）+ 4 个回归用例
- **doctor 指令状态检查竞态**：`getAgentInstructionStatus` 的 `existsSync`+`readFileSync` 非原子，并行场景（测试/安装并发）下 ENOENT 会抛异常；读失败改为视为未安装

### Tests

- `tests/dsh-plugin-glue.test.ts`：回复补全（spawn 参数/三态跳过/session/event 接线去重）+ 消息来源过滤（plugin/tool/model 不入图）
- `tests/turn-distillation.test.ts`（新增 14 用例）：标题/摘要单元 + `dialogue distill` 端到端幂等
- `tests/dialogue-thread.test.ts`：`resolveDialogueRecordInput` 4 用例

## [1.9.15] - 2026-08-20

### Added

- **Experience v2**：噪声技能按名字清理（含 legacy `kind: evolution` / `readme+update` 融合）；held-out golden overlap 准入；ACE 式 playbook 增量计数；成功 DAG 蒸馏为 workflow skill；`forgetEpisode` 按 `provenance.episodeId` 软隐藏派生技能；L3 钉住 goal/alignment/deviation
- **DeepSeek Harness glue 收口**：MCP 行 `cwd: !!js process.cwd()`；bundle ESM `@roarpeng/graphflow/dsh`（`dsh/plugin.mjs` 打进 npm `files` + `exports`）；`dsh plugin add` 时 `ctx.skills.register`；`graphflow install` / `doctor` / `uninstall` 检测 home overlay、glue 行、`$DSH_HOME/skills/graphflow/SKILL.md`
- File expand 返回全文（上限 20 万字符）；`FlywheelReport.fidelity` 拆开 packaging ROI 与 `pendingRatio`

### Changed

- SessionEnd / dsh `agent/disposed` **不默认把 pending episode 标成成功**。Claude Code 空 `$2`、dsh 未设 `GRAPHFLOW_HOOK_SUCCESS` 时保持 pending；显式 `true`/`false` 才调用 `graphflow outcome report`
- Token savings 不再冒充信息保真度（`explainSavings()` / `kind: tokens-not-fidelity`）

### Docs

- README 诚实矩阵：dsh 上 MCP 10 工具 + skill + 会话结束捕获可用；VS Code/Cursor UI 与 Claude Code Session* 文件 hooks 不移植
- [docs/context-contract.md](docs/context-contract.md) 写明 preview 是指针，精确编辑要 expand File

### Tests

- `tests/dsh-plugin-glue.test.ts`：glue 不监听 `session/flush`；无 `GRAPHFLOW_HOOK_SUCCESS` 不默认 pass
- `tests/m-skill-admission.test.ts` / `m-playbook-delta.test.ts` / `m-workflow-skill.test.ts` / `m-skill-revoke.test.ts` / `m-context-fidelity.test.ts` / `m-l3-constraint-pin.test.ts`

## [1.9.14] - 2026-08-15

### Added

- **工作台脉络**：`graphflow_plan` 按计划 DAG 播种功能主题容器（`workbench.topics`），画布单位是功能而不是一轮一节点；偏离主线时 Fork 孤立旁支；点击 `topicId` 注入 Goal + 祖先标题 + 该节点原文
- 按需唤醒大纲（默认收起）：CLI `graphflow workbench tree`、VS Code 活动栏 **GraphFlow: Workbench Tree** / Chat `/tree`、MCP `graphflow_diagnose.graph.workbenchOutline`（不新增第 11 个工具）
- `graphflow_context` 支持 `topicId` / `assistantReply`（可省略 query）两拍入图：提问记 Q，答完回填原文 A；标题只用于显示，不写入下一轮必读上下文
- 无计划时仍将对话记为 `dialogue-turn`；有工作台则写入当前主题容器
- **DeepSeek Harness (`dsh`) plugin**：`@roarpeng/graphflow` 声明 `dsh.bundle` + 根目录 `cordis.patch.yml`，可通过 `dsh plugin --profile <name> add @roarpeng/graphflow` 装入 profile；MCP 经 in-box `@deepseek-ai/dsh-mcp-client` 暴露为 `mcp__graphflow__graphflow_*`
- 中文 README（[README.zh.md](README.zh.md)）与 `plugin.json` / Skill 写明 dsh 用法与 10 项能力
- `graphflow install` 在检测到 `$DSH_HOME` / `~/.dsh` 时写入 home 级 `cordis.patch.yml` overlay，并把 Skill 装到 `~/.dsh/skills/graphflow/SKILL.md`
- `graphflow uninstall` / `doctor` 同步清理与自检该 overlay

### Tests

- `tests/workbench-topic.test.ts`：主线 DAG 拓扑序、旁支嵌套、原文注入不含 Summary
- `tests/dialogue-thread.test.ts`：对话入图与 pending 回填
- `tests/m15-vscode-panel-observability.test.ts`：快照「工作台脉络」默认收起 + 在此继续
- `tests/m16-agent-integrations.test.ts`：MCP `topicId` / `workbench.outline` 描述

## [1.9.13] - 2026-08-13

### Changed

- **GraphFlow: Settings 收成一页**：文档解析（Markdown / Office·PDF）、anydoc 安装状态、语义召回、MCP、模型、建图与功能入口都在同一面板配置；不再依赖 VS Code Settings 里的 `graphflow.downloadAnydoc` 作为主入口
- Settings 去掉「本版亮点」长文，保留状态条 + 芯片入口（图谱 / 上下文 / 技能 / 规划 / 运行）

### Tests

- `tests/m53-include-extensions.test.ts`：Markdown / Office 索引开关
- `tests/m10-cli-runtime.test.ts`：settings 持久化 document flags + embeddingProvider
- `tests/m15-vscode-panel-observability.test.ts`：Settings 新布局断言

## [1.9.12] - 2026-08-12

### Added

- **Episode ↔ Engineering KG on outcome path**: `graphflow_report_outcome` / CLI `outcome report` accept optional `requirementIds` / `conceptIds` / `codeHints` and write episode → `derived_from` → eng nodes via `linkEpisodeToEngineeringNodes`
- **Document-semantic insight ↔ episode provenance**: when `episodeId` is passed with a document-semantic submit, the same eng links are written for experience↔eng consistency
- **ATP minimal producer atp-ir/1.2**: optional `memory-recall` / `memory-backfill` markers (host-managed); fixture + README updated; still runnable without GraphFlow MCP
- **P0 skill consolidate apply**：`graphflow skill consolidate` 默认 dry-run；`--apply` / `--execute` 安全调用 `applySkillConsolidation`（未知 id skip）
- **代码域检索评测公开数据集**：`benchmarks/datasets/retrieval-golden-v1.json`（+ `.jsonl`），含 schema / license / domainCounts / Hit@5·MRR·NDCG 映射说明；`npm run dataset:retrieval` 从 `benchmarks/retrieval-golden-data.ts` 再生，避免漂移
- **Agent Plugins 1.0** packaging at repo root: `plugin.json`, `mcp.json` (`type: stdio`), and canonical `skills/graphflow/SKILL.md`
- README section for local plugin install (`~/.cursor/plugins/local`) and Team Marketplace / Git discovery
- `npm run sync:surfaces` keeps `src/surfaces/trae-skill/graphflow/SKILL.md` aligned with the Agent Plugins skill source
- Conformance test `tests/agent-plugins-1.0.test.ts`
- **P1 Context Engineering contract**: [docs/context-contract.md](docs/context-contract.md) — budget fields, L0–L3 anchors/refill, positioning vs platform indexing / RL; links MCP `graphflow_context` and Agent Plugins
- **P1 Experience memory guide**: [docs/experience-memory.md](docs/experience-memory.md) — Storage → Reflection → Experience; artifact / memory-pack / skill-sync; Agent Plugin vs `install` matrix
- **Experience memory pack**: `exportExperienceMemoryPack` + CLI `graphflow artifact export-memory` → `graphflow-out/memory-pack/{README,skills,episodes}.md`
- README: Agent Plugins as **primary** install; `graphflow install` as Rules / multi-agent fallback; links to the two new docs
- **install/doctor 接入 Claude Code 飞轮 hooks**：`graphflow install` 在检测到 Claude Code home 时自动调用 `installClaudeCodeHooks`（SessionStart / SessionEnd / Stop）；`doctor --json` 新增 `hooks` 类别自检；InstallReport 增加 `claudeCodeHooks`；`GRAPHFLOW_CLAUDE_HOME` 便于测试覆盖

### Fixed

- **扩展升级后 MCP launcher 路径失效**：`repairStaleGraphFlowMcpLaunchers` 在扩展激活时扫描用户级与工作区 MCP 配置；若 `graphflow` 仍指向已删除的旧版 `mcp-launcher.cjs/.cmd`（如 `roarpeng.graphflow-1.9.6`），自动改写为当前扩展启动器。修复 Cursor Agents 依赖项目级 `.cursor/mcp.json` 而 IDE 仍可用的不一致。

### Changed

- ATP/IR spec status line marks **`atp-ir/1.2` Stable**; §5 / §8 document optional Engineering KG link fields on `report_outcome`
- ROADMAP P2 rows (ATP producer + Engineering KG episode chain; ATP/IR v1.2 protocol) → ✅
- **P0 Experience 飞轮可观测**：`getFlywheelReport` / `skill report` / `route diagnose` / `graphflow_diagnose` 的 `experience` 增加 dry-run `consolidation` 动作计数（UPDATE/DELETE/ADD）与建议 hint；ROADMAP P0 ✅
- Skill resolution (`resolveSkillSourcePath` / MCP `graphflow_skill_guide`) prefers `skills/graphflow` before legacy `trae-skill` paths
- `package.json` `files` publishes `plugin.json`, `mcp.json`, and `skills/`
- ROADMAP (2026-08-12): Experience-layer P0–P2 ✅ (skill consolidate --apply; retrieval golden dataset; ATP/IR v1.2 + episode↔eng KG)
- **`graphflow uninstall`** now removes **MCP + Skills + Rules + hooks** (user + workspace MCP). After removing an Agent Plugin in Cursor, run `uninstall` so leftover `~/.cursor/skills/graphflow` cannot keep steering the agent.

### Tests

- `tests/m-install-hooks-wiring.test.ts`：hooks status + install/doctor 接线
- `tests/m-stale-mcp-launcher-repair.test.ts`：失效 mcp-launcher 路径检测与改写
- `tests/atp-ir-v1.2-conformance.test.ts`：ATP/IR v1.2 memory markers + producer protocol
- `tests/report-outcome-engineering-links.test.ts`：outcome / insight eng-link wiring
- `tests/retrieval-dataset.test.ts`：公开检索数据集与 TS 真源条目数/内容一致

## [1.9.11] - 2026-08-08

### Added

- **VSIX 激活时按需下载 anydoc**：设置 `graphflow.downloadAnydoc`（默认 true）→ `npm install @firecrawl/anydoc` 到 `~/.graphflow/optional-deps`；MCP launcher / `document-convert` 经 `GRAPHFLOW_ANYDOC_NODE_MODULES` 加载。失败则跳过 Office/PDF，源码索引照常
- README / 扩展 README 说明 VSIX 不内置、可自动下载、可关闭
- **emilkowalski/skills**：项目安装 design-eng 等 skill；扩展 webview 面板统一 soft elevation、`:active` scale(0.97)、`--ease-out`、reduced-motion

## [1.9.10] - 2026-08-08

### Added

- **Engineering KG 跨层边**：`documents`（文档 File→Concept/Requirement）、`implements`（代码→Requirement）、`derived_from`（语义节点→来源 File/insight）
- **文档域一等节点**：`Concept` / `Requirement`；`document-semantic` insight submit 自动写入并尝试用 `relatedCodeHints` 链接已有 File/Symbol
- **说明**：VS Code/Cursor **VSIX 不打包** `@firecrawl/anydoc`；自 v1.9.11 起扩展激活时可自动下载到 `~/.graphflow/optional-deps`（`graphflow.downloadAnydoc`）。CLI/`npm i` 仍可通过 optionalDependency 安装。无 anydoc 时跳过 Office/PDF，源码索引不受影响

### Changed

- 逻辑三分（code / doc / experience）落在**单图 + type/domain + 跨层边**，不拆物理三库

## [1.9.9] - 2026-08-08

### Fixed

- **CI macOS ENAMETOOLONG**：`walkFiles` 深度目录测试从 400 段降至 80 段，保留迭代遍历断言，避免 APFS 路径过长导致 Action 失败

### Added

- **Office/PDF 文档建图**：可选依赖 `@firecrawl/anydoc`，将 PDF/DOCX/PPTX/XLSX 等转为 Markdown 后走既有 markdown 章节/链接图谱；缺省扩展名已包含办公文档；单文件上限约 5MB
- **Document semantic bridge**：索引成功后返回 optional `document-semantic-*` `agentWorkItems`，由宿主 Agent 抽取关键实体/主张并经 `graphflow_insight(mode=submit)` 回写

### Research note

文档→MD 选型：优先 Firecrawl **anydoc**（Node、多格式、本地）；备选 Microsoft MarkItDown（Python）、Pandoc（系统依赖）。npm 上无关的旧包 `anydoc` 勿用。

## [1.9.8] - 2026-08-08

### Added

- **P0 飞轮可观测性**：`getFlywheelReport` / `skill report` / `graphflow_diagnose` / `route diagnose` 暴露 `autoCaptureEnabled`、`sessionJournal`、`skills.byOutcomeKind`；`npm run backfill:episodes` 包装历史回填脚本
- **Skill-conditioned DAG**：plan 节点可选 `skillRefs` / `avoidPatterns`；bridge 指令要求执行前审阅 skills / 避开 anti-patterns
- **SkillOpt-lite**：无 LLM 的有界 skill guidance 编辑（最多 3 次，严格提升才接受）；接入 `applySkillLearning` lessons 路径
- **团队记忆 canary 门控**：`canary-gate.ts`——sync/import 技能须本地成功 N 次（或显式 validate）才可晋升 `proven`；anti-pattern 仅隔离
- **Codex Windows MCP**：安装写入 `NODE` / `NPX_CLI` 8.3 短路径，修复 Codex 注册失败

### Changed

- **图噪声**：引用边前缀 Trie 预过滤；子图 PageRank LRU 缓存键按节点集排序哈希
- **planAndBrainstorm** 异步化以在 flywheel 开启时注入 skill 条件

### Tests

- 新增 `tests/m81-skill-conditioned-dag.test.ts`、`tests/canary-gate.test.ts`；扩展 flywheel-report / graph-noise / mcp-resources / Codex MCP install

## [1.9.7] - 2026-08-03

### Added

- **综合能力 Benchmark（P1-P6 六维度）**：`benchmarks/run-comprehensive-bench.ts`，覆盖图谱索引、上下文压缩、规划与分诊、学习飞轮、Bridge 模式、端到端性能，总体得分 **92.9%**
- **CodeGraph 风格独立 Benchmark**：`benchmarks/run-independent-bench.ts`，5 域（core/graph/learning/config/integrations）评测，Hit@5 96%、Token 节省 96.6%、总体 **96.2%**
- **SWE-bench 风格上下文就绪评测**：`benchmarks/run-swe-bench-eval.ts`，12 实例（easy/medium/hard × bug-fix/feature/refactor/test），多查询策略下上下文就绪率 100%（非真实 SWE-bench，仅测量压缩上下文是否包含任务所需文件/符号）
- **检索质量 IR 指标评测**：`benchmarks/run-retrieval-eval.ts`，132 条 golden 查询，Hit@5=100%、MRR=0.836、NDCG@5=0.601
- **符号提取模块**：`src/graph/symbol-extract.ts`，从任务描述提取 camelCase/PascalCase 符号名，补充图查询提升召回
- **同文件符号提升 + 导入图扩展**：`buildEnhancedContextPackage` 新增 Step 5，自动从已锚定文件提取同文件 Symbol 节点，并通过 import 关系扩展跨文件召回
- **Bridge+DAG 混合执行模式**：`enableBridgeDagExecution` 选项，bridge 模式下可选择同时本地执行 DAG（`tests/m81-bridge-dag-execution.test.ts`，5 个用例）

### Changed

- **上下文压缩优化**：anchor 上限 15（`maxAnchors`）、L2 module 注入、L3 always-on 层；压缩得分 38.4% → 64.9%
- **DAG 并行度提升**：单 clause 任务拆分 4 节点（实现∥测试设计），并行度 1.2x → 1.40x
- **Skill hints 修复**：传入 evidence 通过 P0-2 质量门控，skill hints 从 0 恢复到正常生成

### Tests

- 99 测试文件 / 692 tests（+1 m81 bridge+DAG、m79 plan clause split 更新）

## [1.9.6] - 2026-08-03

### Fixed

- **Cursor/VS Code MCP 启动失败**：扩展 vendor 打包漏掉 `@modelcontextprotocol/sdk`，MCP launcher 加载 `vendor/graphflow/dist/surfaces/mcp/server.js` 时抛出 `Cannot find module '@modelcontextprotocol/sdk/server/index.js'`（Connection closed / -32000）。`sync-runtime.mjs` 已将 MCP SDK 纳入 `runtimeRoots`，并在同步后校验必选包存在；新增 `test:mcp` 烟雾测试防止回归

## [1.9.5] - 2026-08-01

### Fixed

- **图谱索引排除 Agent 工具目录（P1）**：`IGNORED_DIRS` 新增 `.agent` / `.claude` / `.cursor` / `.gemini` / `.joycode` / `.trae` / `Cursor`——`.claude/worktrees` 为每个 worktree 保存完整仓库副本，此前被当作源码索引进图（本地实测 1421 个 File 节点中 1076 个来自 worktrees，占 76%），污染检索锚点、PageRank 与存储；修复后 `graph rebuild` 扫描文件数从 ~1500+ 降至 326，旧图可在下次增量/全量索引时自动清理
- **增量索引剪枝批量删除（P1，读写放大修复的伴生问题）**：排除目录后首次增量索引需从缓存差集剪除大量过期节点，而 `pruneFileFromGraph` 逐节点 `deleteNode`（file 后端每次全量读写 JSON，实测 62MB 图 × 1000+ 节点 → 305s 挂起）；新增可选能力 `GraphClient.deleteNodes(ids)`（file 单次读+写、sqlite 单事务分块 IN、memory 批处理，均级联清理悬空边），剪枝改为单次快照读取 + 单次批量删除，mcp-http 试点保留逐节点回退路径
- **测试 95 文件 / 656**（+2 walker 排除、+1 剪枝批量删除、+1 file 批量删除用例）

## [1.9.4] - 2026-08-01

### Changed

- **扩展市场说明更新**：vscode-extension/README.md 重写为 v1.9.x 最新使用说明（记忆审计 CLI、飞轮归因面板、语义 embedding 配置、技能分类、skill sync、改名后市场身份 `roarpeng.graphflow` / `GraphFlow Context & Memory`）；扩展 description 改为版本无关描述（消除版本钉死导致的文档腐化）

## [1.9.3] - 2026-08-01

### Fixed

- **Marketplace 发布（二次）**：`GraphFlow` 显示名亦被第三方占用（不出现在公开搜索，疑似下架/保留名），改为 `GraphFlow Context & Memory`

## [1.9.2] - 2026-08-01

### Fixed

- **Marketplace 发布**：新身份 `roarpeng.graphflow` 的 displayName 改为 **`GraphFlow`**（`GraphFlow Tool` 被旧列表 `roarpeng.graphflow-tool` 持有，VS Marketplace 拒绝重复 displayName；经 Marketplace 搜索 API 验证 `GraphFlow` 未被占用）

## [1.9.1] - 2026-08-01

记忆透明化版本:让「跨会话记忆」可度量、可审计、可归因。

### Added

- **记忆 ROI 基准（正式化）**：`npm run benchmark:memory`（`benchmarks/run-memory-ab.ts`）——62 任务（26 golden + 36 hard：跨模块影响面/消歧/间接形态），记忆开 vs 关双臂，实测 **ON 100.0% vs OFF 56.5%**（救回 27 任务、0 受损，其中 hard 域 17 个）；**归因链**逐任务记录「哪条记忆救了哪个任务」（top episode + 相似度 + 注入文本），JSON 落 `benchmarks/.cache/memory-ab-results.json`
- **记忆审计 CLI**：`graphflow memory list [--outcome pass|fail|pending]`（证据记录：id/任务/结局/lessons/staleGoal）、`memory search "<query>"`（相似度排序命中）、`memory forget <id>`（物理删除，未知 id 干净 no-op）；runtime facade 暴露 `listEpisodes/searchEpisodes/forgetEpisode`
- **飞轮报告归因区块**：`getFlywheelReport` 新增 `memoryAttribution`（memoryHits / staleEpisodes / confidence 分布 / topContributingMemories 证据链 / deviationBreakdown），全字段增量兼容

### Changed

- **VS Code 扩展改名**：`graphflow-tool` → **`graphflow`**（Open VSX 名称可用已验证；新身份 `roarpeng.graphflow`，VSIX 产物 `graphflow-<version>.vsix`）；扩展包名、agent 标识、CI 工件、文档同步
- **测试 94 文件/646 → 95 文件/652**，全量通过

## [1.9.0] - 2026-08-01

技能质量与团队化版本:飞轮从「机制完整、效果未知」走向「A/B 实证 + 质量门禁 + 团队共享」。

### Added

- **语义 embedding 可选后端（P0）**：`graphPolicy.embeddingProvider: "fnv" | "transformers"`（默认 `fnv` 离线安全）；`transformers` 时经 `@huggingface/transformers` 懒加载 all-MiniLM-L6-v2，任何失败（缓存缺失/超时/加载错误）永久降级 FNV-1a 并告警；`graphflow_diagnose` 新增 `embeddingBackend: semantic | off` 上报活动后端
- **技能结果分类（P0）**：单一分数升级为 `proven / correctable / anti-pattern / noise` 四类——noise 提取即拒、装载时清理（`cleanupNoiseSkills`）；仅 anti-pattern 记负分（消灭「首次失败即 -20 下沉」）；proven 需 ≥2 次使用或链接成功结局
- **检索 golden set 26 → 132（P1）**：10 域覆盖（含 PLC），12 负样本断言 + 132 Top-K 位置断言（rank 稳定性门），每域 ≥8 查询护栏
- **技能飞轮端到端 A/B 基准（P1）**：`npm run benchmark:ab` 以 golden 查询为任务集、真实学习路径跑双臂——实测飞轮开 **100.0% vs 关 61.5%**（救回 10 任务、0 受损），开销 33 tok/任务
- **CI 版本一致性门禁（P1）**：`scripts/ci-version-check.cjs` 断言 package.json / CHANGELOG 最新条目 / README 徽章三源一致；CI 新增 skill A/B 基准 job（文件存在性守卫）
- **skill sync 双向 merge（P2）**：导入改为按技能 ID 合并——同 ID 取较新 `updatedAt`、平手保本地、本地独有保留；`--force` 恢复覆盖；包 schema 1.1 新增 `goldenQueries`，团队 golden 集随包同步（合并去重写 `.graphflow/team-golden.json`）
- **VS Code 飞轮贡献面板（P2）**：新增「Flywheel · 学习飞轮贡献」区块——技能正/中/负分布、topUsed、episodes pass/fail/pending 结果条；`runtime.getFlywheelReport()` 暴露数据
- **Graphify mcp-http 团队后端试点（P2）**：`GraphifyMcpClient` 补齐完整 `GraphClient` 接口，所有操作 `withFallback` 失败降级本地 file 存储；端点校验 + 15s 超时 + `readSnapshot`/`ping`/`isDegraded`；README 试点说明
- **PLC 索引器加固（P0）**：PLCopen XML POU `returnType`（嵌套/inline 双形态）提取为 `POU.return` 符号；ST 分析器 CASE 数值分支（`1:` / `1..10:`）不再被误判为跳转标签；45 测试 + 双 fixture

### Changed

- **测试 92 文件/489 用例 → 94 文件/646 用例**，全量 14.7s 通过
- `vitest.config.ts` 排除 `.claude/worktrees/**`，根治多 worktree 并行时测试互扫污染（m50 假失败）

### Fixed

- skill 节点全负分（-2/fail）根因：浅层 n-gram 技能（update/readme）被提取——现按符号证据门禁拒绝

## [1.8.0] - 2026-07-28

目标对齐（Goal Alignment）版本：让 Agent 在长时间、多步骤任务中始终记得为什么出发——治「需求理解不透」与「干着干着偏离」两大痛点。

### Added

- **Goal 锚点节点化（P0）**：`intent-analysis` / `simple-plan-intent` / `clarification` 提交自动把意图五元组（coreProblem / successDefinition / nonGoals…）固化为图一等公民节点（`goal:<hash(task)>`，metadata `kind:"goal"`）；`PromptContext.goalAnchors` 在每次打包时以最高优先级位置注入原始需求，orchestrate 各角色 prompt 全程可见
- **低置信度澄清门（P3）**：intent 载荷新增 `confidence`；有效置信度 < 0.6 时 merge 拒绝定稿（`complete=false` + `needsClarification=true` + `intentConfidence`），须先提交 `clarification` work item 澄清至 ≥ 0.6；无 confidence 字段的旧载荷按 1.0 处理（向后兼容）
- **alignment-check 执行期回检（P2）**：新 work item（`kind:"alignment"`，optional）——子任务/计划完成后回检「产出是否服务 successDefinition、是否触碰 nonGoals」，附 drift 分类；simple bridge 与 full ATP 的 agentInstructions 均加入执行期协议说明；永不阻塞 merge
- **deviation 偏离分类（P1）**：`report_outcome` / `outcome report --deviation` 接受 `none | misread-requirement | scope-creep | tech-drift`，持久化到 episode record；飞轮报告新增 `episodes.deviations` 聚合与 `goals`（active/superseded）统计；MCP `graphflow_report_outcome` schema 同步
- **Goal 版本链 + 变更 diff（P4）**：需求实质变更时旧记录快照为 `goal:<hash>:v<n>`（status `superseded`），active 节点版本 +1 并带 `changedFields` diff；同任务 pending episodes 自动标记 `staleGoal`；相同再提交仅刷新时间戳
- **ATP/IR 规范 v1.1**：`docs/atp-ir-spec-v1.md` 升级——§4.3 协议级 work items、§5.1 goal anchor / clarification gate / alignment check / deviation / goal versioning（纯增量，v1.0 兼容）

### Changed

- **测试**：新增 `tests/goal-anchor.test.ts`（12 用例覆盖 P0–P4）；m80 simple bridge 断言更新为「required 2 项 + optional alignment-check」；flywheel report 测试覆盖 deviation 聚合与 goal 统计；全套 **92 文件 / 455 tests** 通过

## [1.7.15] - 2026-07-28

### Added

- **检索 golden set 回归测试**：`tests/retrieval-golden.test.ts` 固定 26 条代表性查询（orchestrator / context / skill flywheel / planner 等），断言关键源文件召得回且命中率 ≥ 80%，检索质量从此有回归护栏
- **词干匹配**：`rankNodesForContextQuery` 对 ≥ 6 字符的查询 token 做前缀词干匹配（如 `routing` 命中 `route`），修复 "orchestrate task routing" 类查询召不回 orchestrator 的盲区
- **PageRank LRU 缓存**：`computePageRank` 以全图指纹（节点 + 边 + 参数）为键缓存结果（上限 8 条），重复上下文打包零重算；导出 `pageRankCacheStats` / `resetPageRankCache`
- **HNSW 向量索引持久化**：`getSharedVectorIndex(nodes, persistPath?)` 进程内 memo + 磁盘恢复（Float32 base64，上限 20k 向量）；`OrchestrateOptions.hnswIndexPath` / `embeddingPolicy.vectorStorePath` 派生 `.hnsw` 路径，跨进程复用向量召回索引
- **`transport: "auto"`**：图存储自动选择——sqlite 优先（FTS5 检索、避免大仓库全文件读写放大），better-sqlite3 不可用时透明降级 JSON 文件存储；`graphflow.config.example.json` 默认改为 auto
- **Skill A/B 基准**：`benchmarks/run-skill-ab-benchmark.ts`（`npm run benchmark:skills`）离线确定性度量 skill 飞轮价值——hint 注入率、episode 召回率、Jaccard 相关性代理、token 开销（实测注入 100% / 召回 100% / 25.6 tok 每任务）
- **技能包团队共享**：`graphflow skill sync export|import [--path]` 双向同步技能包到可进 git 的 JSON 文件（默认 `.graphflow/skills/team-skills.json`），幂等再导入
- **飞轮贡献报告**：`graphflow skill report` / `graphflow_diagnose` 新增 flywheel 字段——skills 正/中/负分分布、topUsed、episodes pass/fail/pending/withLessons、insight decisions 计数
- **ATP IR 公开规范**：`docs/atp-ir-spec-v1.md` 定义 `atp-ir/1.0`——角色、AgentWorkItem/TaskNode 载荷 schema、full ATP vs simple-plan bridge ID 注册表、submit/merge 契约、兼容性规则
- **测试基建**：`tests/helpers/no-llm-config.ts` 隔离配置工厂（providers 空 + budget/learning/embedding/graph policy 完整，防 `loadConfigSafe` 静默回退默认配置）；`tests/helpers/setup.ts` 注册进 vitest setupFiles，测试默认 2s provider/embedding 超时

### Changed

- **README 重写**：新定位「编码 Agent 的上下文与记忆层」，修复旧版中文乱码（0x3F 损坏）；30 秒上手、能力矩阵、10 MCP 工具表、CLI 速查、基准与 ATP 规范链接
- **Bridge 模式省一次 LLM 调用**：orchestrate 在 bridge（agent-delegated）模式下跳过 `plannerDraft` 的纯装饰性 LLM 调用（其结果仅用于 feedback 字符串，无下游引用）
- **引用边构建优化**：`file-indexer-edges` 改用 `matchAll` 流式扫描避免大中间数组，symbolIndex 为空时早退
- **测试环境隔离**：m7/m9/m10/m14/m16/m44/m48/m-bridge-cli-loop 全部改用显式隔离 configPath，本机 ambient 配置（真实 API key）不再把单测变成 30–60s 网络调用

### Fixed

- **sqlite FTS camelCase 盲区**：FTS5 不拆 camelCase，而查询侧经 `tokenizeForIndex` 拆成子词，后缀子词永远匹配不上；schema 升级 v2（`searchtext` 列 = 原文 + 拆分子词，含 ALTER/backfill/重建 FTS/trigger 迁移）
- **m16 环境敏感断言**：agent 集成测试改用 mkdtemp 临时 config，`agent-delegated` 断言在任意本机环境下确定性通过
- **m48 文档一致性**：README 版本徽章回归，与 package.json 单一事实源对齐
- **lint**：`client-factory` auto 降级分支未使用变量、golden set 测试冗余 eslint-disable

## [1.7.14] - 2026-07-28

### Fixed

- **CI / m16**：无 LLM 时 `graphflow_plan` 返回 `mode=agent-delegated`，更新集成测试断言（修复 v1.7.13 构建失败）

## [1.7.13] - 2026-07-28

### Changed

- **`graphflow_plan` 无 LLM 也 Bridge**：默认 simple 模式在未配置 GraphFlow LLM 时返回 `mode=agent-delegated`，下发 `simple-plan-intent` + `simple-plan-decomposition` work items，由连接的 coding agent 理解任务并拆 DAG；本地启发式结果以 `suggestedNodes`（`nodesStatus=suggested`）附带，不作终稿
- **merge 协议**：识别 simple-plan work item ID，两步 submit 后即可 merge 出最终 plan（不与 insight 全量帽子协议混淆）

## [1.7.12] - 2026-07-28

### Fixed

- **`graphflow_plan` 误拆分析维度**：冒号后的评价维度列表（如 assumptions、failure modes、validation gates）不再被 `,`/`、`/`，` 拆成独立并行任务节点；仅当各子句都像可执行任务时才弱分隔
- **brainstormer** 共用同一 `splitTaskClauses`，避免目标澄清变成名词碎片

## [1.7.11] - 2026-07-27

### Changed

- **Settings 工具页**：同步展示 v1.7.11 本版亮点（MCP home-cwd 修复、install/doctor JSON 自检、Bridge 飞轮、无需 LLM 能力）
- **扩展 README / marketplace description**：对齐最新版本与 FAQ

## [1.7.10] - 2026-07-27

### Fixed

- **MCP home-cwd discovery**：安装后 Cursor 常以 `cwd=/home/<user>` 启动 MCP；discovery 不再通过 IDE hint 把 home 当作工作区（修复 `Refusing to use unsafe workspace root from discovery: /home/...`）
- **读取 `WORKSPACE_FOLDER_PATHS`**：优先使用 Cursor 注入的工作区路径；忽略未展开的 `${workspaceFolder}` 占位符
- **npx MCP 安装**：写入 `GRAPHFLOW_WORKSPACE_ROOT=${workspaceFolder}`，由 Cursor/VS Code 插值到真实项目根

## [1.7.9] - 2026-07-22

### Added

- **Open VSX 自动发布**：`Build` workflow 在 `package-windows` 成功后幂等推送到 Open VSX（密钥 `open_vsx_token`，namespace `roarpeng`，与扩展 publisher 一致）
- **Opencode agent 支持**：自动检测 `~/.config/opencode/` 并安装 MCP（`mcp` 键/数组 `command`/`enabled`/`type: "local"` 格式）、Skill（`~/.config/opencode/skills/`）和 AGENTS.md 指令；workspace 级 MCP 注入支持 opencode 格式
- **embedding 超时**：`pipelines()` 模型下载 60s 超时（`GRAPHFLOW_EMBEDDING_TIMEOUT_MS`），超时自动降级 hash
- **HF 镜像**：`HF_ENDPOINT` / `GRAPHFLOW_HF_ENDPOINT` 环境变量配置 HuggingFace 镜像（如 hf-mirror.com）
- **fallback 标注**：`ResilientLocalEmbeddingProvider.getFallbackReason()`，diagnose 输出当前 backend 和降级原因
- **全面健康检查**：`graphflow_diagnose` 增加 workspaceRoot 解析、graphFreshness、modelCache、connectivitySummary
- **技能衰减**：`maybeDecaySkills`（七天内无活动分数向 0 衰减 ±1）、`resetSkillScore`、`pruneLowSkills`；CLI `skill decay/reset/prune`
- **Episode 隐私**：`forgetEpisodes()` + `learn forget`；artifact export 默认排除 episode（`--include-episodes` 可还原）
- **CI 矩阵**：`validate.yml` Node 20/22 矩阵 + `validate-platforms` job（win/mac Node 22）
- **Surface sync 脚本**：`scripts/sync-surfaces.cjs` + `--check` 模式 + `npm run sync:surfaces`
- **WASM 版本标记**：`wasm/.grammar-version` 版本校验，升级时强制重建

### Changed

- **迁移到 `@huggingface/transformers` v3**：`loadTransformersModule` 优先使用已在 `dependencies` 中的 v3，`@xenova/transformers` 保留为 legacy fallback
- **`pino-pretty` 移到 devDependencies**：减小生产安装体积
- **README 测试数**：59→72 文件、280+→357+ tests（脚本化生成，避免再次漂移）

### Fixed

- **macOS CI**：`m49-workspace-root-isolation` 测试通过 `realpathSync` 解析 `/var` → `/private/var` 符号链接
- **package-lock.json 同步**：与 `package.json` 依赖版本对齐
- **CI tsc 构建**：`@huggingface/transformers` 直接可解析，无需额外安装

## [1.7.8] - 2026-07-19

### Added

- **Dart / Flutter 索引器**：新增 `.dart` tree-sitter 索引器（class/mixin/extension/enum/typedef/function/import）；忽略 `.dart_tool`；`tree-sitter-wasms` 升至 0.1.13，`web-tree-sitter` 升至 0.25.10（支持 Dart ABI 15）

## [1.7.7] - 2026-07-19

### Added

- **npm 幂等发布**：`scripts/publish-npm-idempotent.mjs`，已发布版本不再因 E403 失败
- **技能飞轮卫生**：全 stopword 短语过滤、`pruneFailedSkills` 软隐藏毒技能、`reportOutcome` lessons 质量门
- **架构检索加权**：架构/CJK 查询优先 orchestrator / MCP / README，压低 types/errors/panels
- **安装指令块**：统一为 10 工具面 + `graphflow_context` + CallMcpTool 契约

### Changed

- CI / publish workflows 升级 Node **22**
- Marketplace：无密钥时 dispatch 跳过警告；tag 推送无密钥则明确失败；日志使用 GraphFlow Tool / `graphflow-tool`

## [1.7.6] - 2026-07-19

### Changed

- **VS Code 扩展更名**：`graphflow-vscode` → `graphflow-tool`，规避 Marketplace displayName 冲突；VSIX 文件名同步改为 `graphflow-tool`
- **扩展 displayName**：更新为 `GraphFlow Tool`

## [1.7.5] - 2026-07-18

### Added

- **Qoder MCP / Skill 支持**：自动检测用户级 `~/.qoder/mcp.json`（Windows `%APPDATA%/Qoder/User/mcp.json`）与项目级 `.qoder/mcp.json`；Skill 安装至 `~/.qoder/skills/graphflow/SKILL.md`
- **Agent Profile 模块化**：新建 `src/integrations/agent-profiles/` 目录与注册机制，各 IDE/Agent profile 独立成文件维护
- **统一错误类型**：新增标准化错误类型与处理函数
- **增量索引取消机制**：`file-indexer` 支持 `AbortController` 取消
- **Skill 健康检查**：新增 Skill 完整性检测
- **previewContext LRU 缓存**：新增 `src/graph/context-cache.ts`
- **VS Code Marketplace 自动发布**：新增 `publish-marketplace.yml` workflow

### Changed

- **自动执行模式**：LLM 仅在已配置且健康时启用，否则自动回退 bridge mode（`src/core/orchestrator.ts`）
- **安装体验优化**：无项目打开时由报错改为友好提示并提供打开文件夹按钮；npm 与插件安装后的项目引导提示统一

## [1.7.4] - 2026-07-13

### Added

- **DeepSeek 一等 provider**：`ProviderName` 新增 `deepseek`；默认模型 `deepseek-v4-pro` / `deepseek-v4-flash`；Settings 可选 deepseek
- **配置→env 桥接**：`resolveConfig` 将 `providers.*.apiKey/baseUrl` 注入 `DEEPSEEK_*` / `OPENAI_*` 等（不覆盖已有环境变量）
- **DeepSeek 能力**：思考模式（thinking + reasoning_effort）、JSON Output、`reasoning_content` 解析、KV cache usage 记录、可选只读 graph tool_calls

### Fixed

- **LLM 配置无法联通**：此前适配器只读环境变量，忽略配置文件中的 apiKey/baseUrl

## [1.7.3] - 2026-07-12

### Fixed

- **无痛 Windows MCP**：扩展激活时调用 `repairUnsafeWindowsMcpCommands`，自动扫描 Trae / Trae CN / TRAE SOLO 等已有 `mcp.json`，把含空格的 `command` 就地改成短路径或 `node`（无需手动 Install）
- **CI Test 挂死**：禁用 vitest/CI 下 embedding 后台预热（HuggingFace MiniLM 下载无超时可卡 30m+）；`validate.yml` 设置 `GRAPHFLOW_SKIP_EMBEDDING_WARMUP=1`

## [1.7.2] - 2026-07-12

### Fixed

- **Trae/Windows MCP install**：`buildMcpServerNode` / 写入配置时统一将含空格的 `command`（如 `C:\Program Files\nodejs\node.exe`）转为 8.3 短路径或回退 `node`，避免 Trae Solo 经 cmd 无引号启动时出现 `'C:\Program' 不是内部或外部命令`

## [1.7.1] - 2026-07-12

### Added

- **Resilient local embedding**：`@xenova/transformers` 缺失或加载失败时自动降级到 `fnv1a-384` hash；支持从 workspace `node_modules` 解析
- **可选全图向量召回**：`embeddingPolicy.enableFullGraphVectorRecall`（默认 `false`），开启后对带 embedding 的图节点做 HNSW + RRF
- **P2 transformers 离线缓存路径**：`embeddingPolicy.modelCacheDir` / `transformersCachePath` 或 `GRAPHFLOW_EMBEDDING_CACHE_DIR`
- **测试**：`m77-embedding-fallback`、`m78-full-graph-vector-recall`

### Changed

- **检索降噪**：架构查询提升 `src/graph`/`src/core` 等，降低 `vscode-extension`/`vendor`/`node_modules`/非 src `dist` 权重
- **Adaptive budget 日志**：`logger.info` → `logger.debug`，避免 MCP stderr 被 IDE 标成伪 error
- **Installer surface 冻结**：当前 IDE/Agent 安装目标保持维护，不再继续扩展新的 IDE 自动安装面
- **VSIX / 扩展说明**：`graphflow-vscode@1.7.1` 描述与 README 同步上述行为
- **Windows MCP launcher**：优先 spawn `.cjs`，避免 `.cmd` + `shell:false` 的 EINVAL

### Notes (VSIX)

- VSIX **仍不**捆绑 `@xenova/transformers`（体积与平台原生依赖）
- 默认 hash embedding 可用；真语义请预置缓存目录

## [1.7.0] - 2026-07-11

### Added

- **P0 向量召回修正**：引入 `@xenova/transformers` + `all-MiniLM-L6-v2`（384 维，约 22MB），实现真正的本地语义 embedding 召回
- **P2 ATP 自适应截断**：简单任务（低优先级、无约束、短描述）自动 short-circuit，跳过 First Principles / Decision Matrix / Reflection，节省 4-6 次 LLM 调用
- **P2 MCP 工具精简**：18 个工具合并为 10 个核心工具，降低 LLM 工具调用认知负荷

### Changed

- **embedding provider 默认改为 `transformers`**：替代原有的 FNV-1a hash embedding（伪语义）
- **MCP 工具合并**：
  - `graphflow_context` = `preview_context` + `expand_anchor`
  - `graphflow_plan` = `plan` + `plan_insight`（mode 参数区分）
  - `graphflow_index` = `index` + `index_file` + `rebuild`
  - `graphflow_insight` = `submit_insight` + `merge_insight`
  - `graphflow_diagnose` = `diagnose` + `inspect_graph` + `stats`
  - `graphflow_artifact` = `export_artifact` + `import_artifact`

### Removed

- **P1 移除 `hnswlib-node`**：彻底移除 C++ 编译依赖，向量召回统一使用纯线性扫描
- 移除 `graphPolicy.enableHnsw` 配置项及相关代码
- 移除 `hash` embedding provider 及相关函数

## [1.4.4] - 2026-07-05

### Added

- **Antigravity IDE 安装**：MCP 写入 `~/.gemini/antigravity/mcp_config.json`；全局 Skill、项目 `.agent/rules` / `.agent/skills`；项目 `GEMINI.md` 受管块
- **Gemini CLI**：共享 MCP 路径 `~/.gemini/config/mcp_config.json`
- **GitHub Copilot**：专用 `.github/copilot-instructions.md` 源文件（token-first，非 CLAUDE.md 副本）
- **Trae CN 项目安装**：`.trae/rules/graphflow.md`（alwaysApply）与项目 Skill；doctor 自检
- **测试**：`m62-trae-cn-install`、`m63-agents-install`

### Fixed

- **Antigravity MCP 路径错误**：不再写入 VS Code `Code/User/mcp.json`
- **用户级 MCP 污染**：`install` 不再向用户配置注入 `GRAPHFLOW_WORKSPACE_ROOT`；切换策略时自动清除 stale env

## [1.4.3] - 2026-07-05

### Added

- **PascalCase/camelCase 拆词**：`BattlePage` → `battle` + `page`，`EnergyShield` → `shield` 等，英文子词可命中代码符号
- **合并 englishQuery 重排**：RRF 子查询使用中文 + englishQuery + 子查询共同打分
- **UI 路径加权**：含 avatar/shield/battle/camera 等 UI 意图时优先 `src/pages/`、`src/components/`

### Fixed

- **TOKEN_SPLIT**：不再把大写字母误当分隔符（修复 `oldFunctionName` 等标识符被错误切碎）
- **SQLite FTS**：ASCII 单词前缀匹配（`battle*` → `BattlePage`），多词短语仍用 AND

### Changed

- **Agent 翻译提示 / Skill**：优先精确文件/类/组件名，避免泛化 `exercise` 误命中数据层

## [1.4.2] - 2026-07-05

### Added

- **CJK 查询支持**：中文/日文/韩文分词与双字切分；FTS 对 CJK 查询使用 OR 匹配
- **Agent 委托翻译**：`graphflow_preview_context` 新增 `englishQuery`；当 CJK 查询锚点不足时返回 `agentWorkItems`（`query-translate-en`），由连接的 Agent 翻译为英文符号关键词后重试
- **多查询 RRF**：`expandSearchQueries` 合并原始查询、Agent 英文翻译与工作区路径提示进行检索
- **索引增强**：Symbol 节点 content 附加 JSDoc 摘要（≤160 字符），提升中文意图对英文符号的命中

### Fixed

- **自动索引**：`preview_context` 在图存储为空时即使 workspace 缓存已 warm 也会触发索引

## [1.4.1] - 2026-07-05

### Fixed

- **CI Windows 构建**：`package-windows` 固定 `windows-2022`，修复 `windows-latest`（VS 2026）上 node-gyp 无法识别 VS 18 导致 `hnswlib-node` 编译失败
- **validate**：Linux CI 增加 `npm rebuild hnswlib-node`，确保 HNSW 原生模块在测试前就绪
- **文档一致性**：同步 MCP 工具列表（移除 v1.4 已删除的 `enrich_graph` / `model_download` / `metrics`；补充 `submit_insight` / `merge_insight` / `skill_guide`）

### Changed

- **README / 扩展 README**：补充 VSIX 安装步骤（VS Code / Cursor）、MCP `install` 命令、`hnswlib-node` 原生编译环境说明

## [1.4.0] - 2026-07-04

### Changed

- **奥卡姆剃刀精简**：移除未产生真实价值的模块，保留三条经过验证的闭环链路。
  - 移除 OpenBMB 本地部署（`provider-adapters/openbmb.ts`）
  - 移除语义压缩模型（`compression-model.ts`、`semantic-compression.ts`）
  - 移除语义增强器（`semantic-enricher.ts`）
  - 移除技能进化（`skill-evolution.ts`）
  - 移除金丝雀门控（`canary-gate.ts`）
  - 移除本地嵌入模型（`local-embedding.ts`，改为零成本 hash embedding）
  - 移除向量存储（`vector-store.ts`，HNSW 直接内嵌）
  - 移除 `@xenova/transformers` 和 `node-llama-cpp` 依赖
  - `hnswlib-node` 从 optionalDependencies 移到 dependencies
  - embedding 默认 provider 从 `"local"` 改为 `"hash"`

### Fixed

- **HNSW 向量召回完全打通**（P0）：`file-indexer` 现在为所有 File/Symbol/Module 节点附加 256 维 hash embedding（FNV-1a，零成本），HNSW 索引不再为空。
- **Orchestrator 向量召回激活**（P0）：`orchestrator-context.ts:maybeBuildNearLosslessContext` 现在传递 `embeddingProvider` + `enableVectorRecall` 到压缩管道，`graphflow_run` 路径的向量召回不再被跳过。
- **HNSW 索引持久化**（P1）：`buildEnhancedContextPackage` 现在从 `vectorStorePath` 派生 `.hnsw` 路径并传入 `HnswVectorIndex`，`save()`/`loadIndex()` 不再是空操作。
- **FileWatcher 接入 MCP 启动**（P0）：`startFileWatcherIfEnabled` 此前是死代码，现已接入 MCP 服务器启动路径，`autoIndexOnSave: true` 时自动监听文件变化并增量索引。
- **skillHints 解耦**（P1）：`buildPromptContext` 中 `skillHints` 不再依赖 `enableGraphContextInPrompt === true`，独立注入 worker prompt。
- **Dangling edges 修复**（P1）：`applySkillLearning` 现在先创建 Decision 节点再连 `improves` 边，不再产生指向不存在节点的悬空边。
- **buildPlanFromInsight null 安全**（P0）：`insight.ts` 异常时返回 `null` 而非 `[]`，orchestrator 正确检测并回退到 `planTasks`。

### Added

- **Agent MCP Installer 恢复并优化**：支持 15+ Agent 自动检测安装（Cursor、VS Code、Trae、Claude Code、Windsurf、Cline、Roo Code、Kilo Code、PearAI、Gemini、Codex、Antigravity、Amazon Q、Zed、Continue）；WSL 检测修复（`platform()` → `release()`）。
- **Reflector 恢复并优化**：`reflectOnEpisodes` 贪心聚类 + Lesson 提取；`getLessonsForEpisode` 提取到 `episodic-memory.ts`；Lesson 自动注入 planner prompt。
- **HNSW 恢复并优化**：`HnswVectorIndex` 支持持久化加载/保存；大仓库自动 ANN，小仓库线性扫描。
- **Kotlin / Swift 索引器**：新增 `.kt` 和 `.swift` tree-sitter 索引器。
- **hash embedding**：零成本 FNV-1a 256 维向量，无需模型推理，作为 embedding 默认 provider。

### Removed

- `src/graph/compression-model.ts`
- `src/graph/semantic-compression.ts`
- `src/graph/semantic-enricher.ts`
- `src/learning/canary-gate.ts`
- `src/learning/local-embedding.ts`
- `src/learning/skill-evolution.ts`
- `src/learning/vector-store.ts`
- `src/routing/provider-adapters/openbmb.ts`
- `src/types/node-llama-cpp.d.ts`
- 相关测试文件：m17、m17b、m17c、m20、m28、m29、m30、m31、m38、m47、m4m5

## [1.3.4] - 2026-07-03

### Fixed

- **MCP / Windows EPERM**：修复 MCP 在 `AppData\Local` 等系统目录启动时误将系统路径当作工作区并扫描 `ElevatedDiagnostics` 导致 `EPERM` 的问题。
  - 目录遍历对 `EPERM`/`EACCES` 静默跳过（`safe-fs`）
  - 忽略 `ElevatedDiagnostics` 等 Windows 受保护目录
  - `ensureMcpWorkspaceEnv` 不再将 `LOCALAPPDATA` 根目录当作隐式工作区；优先使用 IDE 环境变量（`VSCODE_CWD` 等）

## [1.3.3] - 2026-07-03

### Fixed

- **VS Code 扩展（WSL）**：激活时默认仅写入用户级 MCP（`~/.config/Code/User/mcp.json`），不再自动创建项目级 `.vscode/mcp.json` 与项目 Rules，避免 WSL 下 GUI 提交触发 git hook 时与 pyenv 环境冲突。项目级安装改为显式执行 **GraphFlow: Install MCP to Agents**。
- **MCP 启动**：仅在原生 Windows 传入 `electronExecPath`，Linux/WSL 不再写入 IDE 可执行路径。

## [1.3.1] - 2026-06-29

### Added

- **`graphflow_skill_guide` MCP 工具**：通过 MCP 协议直接提供 Skill 指南内容，不依赖外部文件安装，解决 C 盘权限不足导致 Skill 无法使用的问题。

### Changed

- **工作区级 Skill 回退安装**：当用户级目录（如 `~/.trae/User/skills/`）写入失败时，自动回退安装到项目目录 `.graphflow/skills/graphflow/SKILL.md`。
- **MCP 工具描述增强**：核心工具描述添加"Context First"原则：
  - `graphflow_preview_context`：强调"ALWAYS CALL THIS FIRST"
  - `graphflow_plan`：强调"USE AFTER graphflow_preview_context"
  - `graphflow_expand_anchor`：强调"USE THIS AFTER graphflow_preview_context"
  - `graphflow_index`：强调"CALL AFTER significant file changes"

### Fixed

- **C 盘权限不足导致 Skill 无法使用**：通过 `graphflow_skill_guide` 工具和工作区级回退安装双重保障，确保即使没有 C 盘编辑权限也能正常使用 GraphFlow。

## [1.3.0] - 2026-06-28

### Added

- **Agent Skill 安装**：`installAllSkills` 写入 Cursor / Claude Code / Codex 的 `skills/graphflow/SKILL.md`（非保留目录 `skills-cursor`）。
- **`graphflow doctor`**：自检各 agent 的 MCP 注册、指令文件与 Agent Skill 状态。
- **委托模式 5-Why**：`agentWorkItems` 新增 6 个可选 `five-whys` 项；merge 解析 `whyChain` 并填充 `rootCauses`。
- **Token benchmark**：`benchmarks/run-token-benchmark.ts` 与 `npm run benchmark`。
- **竞品分析**：`docs/comparison.md`。
- **测试**：`tests/m17b-agent-instructions.test.ts`（Claude MCP 路径 + 指令块安装）。

### Changed

- **启发式 `planTasks`**：支持中文连词拆分；单句任务生成分析→实现→测试三阶段 DAG。
- **`refinedTaskStatement`**：无 5-Why 根因时回退蓝帽综合，避免误显示「待探索」。
- **MCP 安装路径**：Claude Code → `~/.claude.json`；Gemini → `~/.gemini/settings.json`。
- **Windsurf / Codex / Gemini** 全局指令块（append-with-markers 安全写入）。
- **README** 快速上手与竞品对比表更新。

### Fixed

- Cursor 用户此前只能看到 Rule、看不到 Skill 的问题（现同时安装 Rule + Skill）。

## [1.0.9] - 2026-06-26

### Added

- **Agent-delegated LLM（无 API 模式）**：未配置 provider API 时，`graphflow_plan_insight` / complex `graphflow_run` 返回 `agentWorkItems`，由连接的 coding agent 用自己的模型回答 Six Hats prompts。
- **MCP 闭环工具**：`graphflow_submit_insight`（回传每条 work item 分析）、`graphflow_merge_insight`（合并为完整 insight + DAG plan）。
- **Skill 质量**：`extractSkillAtoms` 过滤 stopwords / 路径噪声，保留短语与 head token。
- **Adaptive budget**：complex 任务默认启用自适应 token 预算；配置默认 `enableAdaptiveBudget: true`。
- **Calls 边增强**：caller 缺失时按行号回退解析；Snapshot 优先展示 `calls` / `defines` 边。
- **L2/L3 锚点**：Module 父节点与架构类查询的 Skill/Decision 注入。
- **Monorepo**：`discoverWorkspacePackages` + Snapshot `workspacePackage` 元数据。
- **语言索引**：Kotlin（`.kt`/`.kts`）、Swift（`.swift`）tree-sitter 索引器。
- **MCP 模块化**：拆分 `tool-definitions.ts` / `tool-handlers.ts` / `version.ts`。
- **VS Code**：Agent Work Items 面板、`graphflow.planInsight` 命令；Chat `/insight` 与 agent-delegated 闭环指引。

### Changed

- Bridge 文档强化：`report_outcome` / `submit_insight` 为必做步骤（AGENTS.md、Cursor rules）。
- `graphflow_inspect_graph` 支持 monorepo 包分组。

### Fixed

- `parseAgentInsightResponse` 优先解析 JSON 数组（plan-refinement）。
- Skill 融合测试与 stopword 过滤的平衡（m20 回归）。

## [1.0.3] - 2026-06-24

### Fixed

- **CI**：`m17` 测试不再硬编码 `/usr/bin/node`，兼容 GitHub Actions hosted Node 路径。
- **图谱存储**：`graphify-file-client` 原子写入（temp + rename）；损坏 JSON 时优雅降级为空 store 并提示 rebuild。
- **上下文检索**：`rankNodesForContextQuery` 降低 `.cursor/mcp.json`、`docs/integrations` 等配置噪声，优先 `src/` 与 Symbol 节点。
- **MCP metrics**：`graphflow_metrics` 支持 `rootDir` 并绑定工作区。

## [1.0.2] - 2026-06-24

### Fixed

- **MCP ENOENT（fnm 临时路径）**：安装 MCP 时不再写入 fnm multishell 临时 `node` 绝对路径；优先使用 IDE 自带 Electron（`ELECTRON_RUN_AS_NODE`），否则回退稳定 `node`。
- **Trae CN 支持**：安装器识别 `~/.trae-cn` 并写入 `~/.config/Trae CN/User/mcp.json`。

## [1.0.1] - 2026-06-24

### Fixed

- **多项目工作区隔离**：MCP / 扩展 / npm 包不再把图谱绑定到 vendor 目录或全局配置里的陈旧 `workspaceRoot`。
- **自动发现工作区**：新增 `discover-workspace`，从 cwd 向上查找项目根；仅在 runtime 目录（vendor、extensions）时回退到 IDE 环境变量。
- **MCP launcher**：子进程 `cwd` 与 `GRAPHFLOW_WORKSPACE_ROOT` 指向用户打开的项目，不再固定在扩展 vendor。
- **MCP 安装器**：默认写入 `GRAPHFLOW_WORKSPACE_ROOT: "${workspaceFolder}"`，merge 已有 env，扩展有工作区时同时写用户级与项目级配置。
- **MCP 工具**：`preview_context`、`inspect_graph`、`skill_insights`、`stats` 支持可选 `rootDir` 覆盖。

## [1.0.0] - 2026-06-19

首个正式版本。在 0.6.x 基础上完成「诚实执行语义」收敛与「上下文压缩」体系，所有新增能力均端到端接线到 CLI / MCP / orchestrator。

### Added

- **混合压缩模型策略（compressor role）**：新增 `compressor` 角色，默认复用 economy tier（`backend: "inherit"`）——配置了外部 provider（OpenAI/Anthropic/百炼）就用其 economy 模型，纯离线则回退内嵌 minicpm。零额外配置。
- **内嵌模型首次自动下载**：无外部 LLM 时，`resolveCompressionModel` 复用既有断点续传下载器，首次按需拉取 minicpm GGUF 到 `~/.graphflow/models/`（类似 Playwright 浏览器下载）。
- **图结构压缩（零成本，默认开启）**：`graph-compression.ts` 提供边权重加权连通子图（`extractConnectedSubgraph`）、加权 PageRank 中心性（`computePageRank`）、检索序与中心性融合重排（`blendWithCentrality`）。preview / orchestrator 默认启用。
- **语义压缩（opt-in）**：`semantic-compression.ts` 通过 minicpm/economy LLM 对相似节点聚类合并（`clusterSimilarNodes` + `summarizeCluster`）、长节点改写（`densifyNodeContent`），由 `graphPolicy.compression.enabled` 开启。
- **RepoMap 概览模式（opt-in）**：`repo-map.ts` 在 token 预算紧张时返回模块级地图（每模块一行 exports 摘要），由 `compression.enableRepoMapFallback` 开启。
- **自适应 Token 预算（opt-in）**：`adaptive-budget.ts` 的 `estimateContextBudget` 按任务复杂度（refactor/多文件/架构/局部修复/加测试）动态调整预算，由 `compression.enableAdaptiveBudget` 开启。
- **HNSW 向量索引（可选依赖）**：`hnsw-index.ts` 在候选集 ≥200 节点时使用 hnswlib-node ANN 加速（10~100x），未安装时优雅降级线性扫描。`hnswlib-node` 列为 optionalDependency。
- **`buildEnhancedContextPackage`**：统一六步压缩 pipeline（RepoMap fallback → 关键词+向量召回 → 图压缩 → 语义压缩 → 分层配额 → 边扩展），preview 与 orchestrator 共用。
- **压缩诊断**：`route diagnose` 输出新增 `compression=<backend>:<provider>/<model>` 行，可查当前压缩模型来源。
- 测试 m43（bridge 模式）、m44（增强压缩）、m45（真机 benchmark）。

### Changed

- **执行语义诚实化（bridge 模式）**：`graphflow_run` 默认进入 bridge 模式——规划 + 压缩上下文后输出 `executionDescriptor` 移交外部 coding agent 执行，状态为 `HUMAN_REVIEW_REQUIRED` 并标注 `[DELEGATED]`，不再伪造 `COMPLETED`。
- **校验启发式标注**：规则校验结果统一标注 `[heuristic]` 与 `heuristic_validation` riskTag；检测并拒绝 provider 占位符回显（`[openai:model] ...`）。
- `graphPolicy.compression` 配置项扩展：`enableGraphCompression` / `enableRepoMapFallback` / `enableAdaptiveBudget` / `enableHnsw`。

### Fixed

- worker 兜底分支不再返回 `"Simulated change..."` 伪造输出，无可用执行模式时抛出明确错误。
- README 版本号、测试数与失效文档引用同步至 1.0。


### Added

- MCP server 优雅停机：监听 `SIGTERM`/`SIGINT`，停止接收新的 stdin 输入并给在途请求短暂 flush 窗口后退出，避免长驻进程被硬杀导致状态丢失。
- `VectorStore.close()`：释放底层 SQLite 句柄，与 `SqliteClient.close()` 对齐，避免长驻进程文件描述符泄漏。
- MCP 工具入参长度上限（`MAX_STRING_FIELD_LENGTH`），防止超大 payload / prompt injection 风险。

### Changed

- `provider-executor` 改用结构化 `logger` 替换裸 `console.warn/error`，确保生产环境日志可被聚合采集。
- `orchestrate()` 增加顶层错误边界：上下文构建 / DAG 执行 / 图同步的未捕获异常统一收敛为结构化 `HUMAN_REVIEW_REQUIRED` 结果，不再裸抛给调用方。

### Fixed

- DAG 执行 timeout 定时器在任务成功路径未被清除，长驻进程下存在 timer 泄漏；改为 `finally` 中 `clearTimeout`。
- `m12-dynamic-routing` 测试不再依赖对 `api.anthropic.com` 的外网可达性：将 anthropic `baseUrl` 指向本地立即拒绝连接的地址，确定性触发非 strict 降级路径。

## [0.6.13] - 2026-06-14

### Fixed

- 知识图谱面板力导向布局在大量节点时坐标爆炸，导致 viewBox 过大、画布仅显示角落小点；布局后归一化到画布并收紧力模拟参数。

## [0.6.12] - 2026-06-14

### Added

- `snapshot-view` 模块：图谱样本的可读标签（`displayLabel`、`displayPath`、`folderGroup`）、分层视图（代码层 / 学习层）、按目录多样性采样。
- 知识图谱面板：暗色主题、分层 Tab、目录聚类着色、关系线型区分、双击/按钮跳转源文件。

### Changed

- `inspectGraph` 默认样本上限提升至 96 节点 / 160 边；VS Code「查看图谱」命令使用 120 / 200。
- 节点摘要预览长度由 96 提升至 160 字符。

## [0.6.11] - 2026-06-14

### Changed

- 默认开启 `autoIndexOnSave`：保存/变更文件后 debounce 增量索引，实现项目更新时持续静默建图。
- 路由就绪校验要求开启 Auto index on file save。
- 旧配置中遗留的 `maxContextTokens: 400` 自动升级到 1500。
- `graphflow.config.example.json` 同步 `autoIndexOnSave` 与 `maxContextTokens: 1500`。

## [0.6.10] - 2026-06-14

### Added

- `runtime/` 子模块：`env`、`settings`、`graph`、`routing`、`panel`、`helpers`、`facade`。
- `GraphFlowRuntimeModule` 与 `assertGraphFlowRuntime()`：扩展动态加载时使用统一类型校验。
- VS Code 扩展 esbuild 单文件打包（`dist/extension.js`）。

### Changed

- `runtime.ts` 改为薄 re-export 层；业务逻辑拆分到子模块。
- 扩展移除手写 `GraphFlowRuntime` 接口，改用 core 导出的类型。

## [0.6.9] - 2026-06-14

### Added

- `loadConfigSafe`：损坏/缺失配置文件时回退默认配置并记录告警。
- `hasPendingGraphIndexWork`：无文件变更时跳过 preview/run 的自动索引。
- `runtime/types.ts`：CLI/MCP 公共类型集中导出。
- `vscode-extension/src/workspace.ts`：可测试的工作区 cwd 解析。
- 测试 `m41-optimization-hardening`。

### Changed

- `postinstall` 默认不再自动 init/MCP 注入；需 `GRAPHFLOW_ENABLE_POSTINSTALL=1` 显式开启。
- CI 根依赖安装改为 `npm ci`，提升可复现构建。
- 默认 `maxContextTokens` 从 400 提升到 1500，避免宽查询预览为空。
- 文件索引器合并 stat 遍历，减少重复 I/O。
- VSIX `.vscodeignore` 裁剪 vendor 中的 map/d.ts/tests/docs。

### Fixed

- 损坏的全局/项目 JSON 不再导致 GraphFlow 启动失败。

## [0.6.8] - 2026-06-14

### Fixed

- 扩展在无工作区文件夹时也可打开 Settings 并保存全局模型配置；首次安装自动弹出 Settings 面板。
- `showSetupGuide` 不再因未打开项目而失败；图谱建立/路由测试在无工作区时给出中文提示。

## [0.6.7] - 2026-06-14

### Added

- 全局配置优先：`resolveWritableConfigPath` 默认将 Settings 保存到 `~/.graphflow.config.json`。
- MCP 安装范围：`installScope: "user" | "all"`，默认仅写入用户级 Agent 配置（如 `~/.cursor/mcp.json`）。
- 测试 `m40-config-global-first`：覆盖全局读取/写入与 MCP 用户级默认行为。

### Changed

- 扩展首次安装只 scaffold 全局 `~/.graphflow.config.json`，不再自动创建 `.graphflow/config.json` 工作区覆盖层。
- `resolveConfig` 以全局配置为底，项目 `graphflow.config.json` / `.graphflow/config.json` 作为可选覆盖层合并。
- `npm postinstall` / `graphflow init` 改为全局配置 + 用户级 MCP；README 说明更新为一次配置、所有项目可用。
- 配置指南（`formatModelConfigGuide`）优先展示全局配置路径。

### Fixed

- `saveGraphFlowSettings` 补全 `resolveGlobalConfigPath` 导入，修复扩展打包 TypeScript 编译错误。

## [0.6.6] - 2026-06-11

### Added

- Settings 面板：**建立图谱（无需 LLM）** — 仅需图谱存储路径即可扫描工作区并生成结构图谱（文件、符号、依赖）。
- Settings 面板：**路由连通性测试（可选）** — LLM 配置就绪后探测 Smart / Economy 路由，连通通过后自动索引并可运行语义提取。
- Runtime API：`indexGraphFromSettings`、`testRoutingAndIndexGraph`、`validateSettingsForGraphIndex`、`validateSettingsForRouting`。

### Changed

- 配置指南明确双路径：无 LLM 结构索引与可选 LLM 路由验证并存；语义提取失败时仍保留结构图谱。

## [0.6.5] - 2026-06-11

### Added

- Settings 面板：图谱状态（节点/边数、上次索引时间）、配置覆盖层 diff、一键路由诊断。
- `graphPolicy.autoIndexOnSave`：保存文件后 debounce 增量索引（Extension 可选开关）。
- `getSettingsPanelStatus` / `listConfigOverlayKeys`：Settings 与 CLI 共用状态 API。
- Husky pre-push：`lint-staged` 在推送前自动跑 ESLint。
- CI：`validate.yml` 可复用工作流；PR 与 main 发布分离；`v*` tag 触发 Build / npm publish。
- `postinstall` 完成后轻量 bootstrap `indexGraph`（非 CI 环境）。

### Fixed

- Settings 面板 HTML 模板中反引号导致 ESLint 解析失败，阻断 0.6.5 GitHub Actions 与 Release。

### Changed

- 收紧多处 `any` 类型；提交 `vitest.config.ts` 排除 extension 测试。
- README 更新至 v0.6.5，补充 Release 与本地 `npm run ci` 说明。

## [0.6.4] - 2026-06-10

### Added

- `graphPolicy.semanticEnrichment.backend`: `inherit` | `network` | `local`，明确区分网络模型与本地 OpenBMB。
- 语义提取可单独配置网络 API Key / Base URL（`semanticEnrichment.apiKey` / `baseUrl`）。
- Settings 面板「语义提取后端」：继承 Economy（网络）/ 自定义网络模型 / 本地 OpenBMB。

### Changed

- 语义富化运行时注入独立网络凭证（`applyEnrichmentProviderEnv`）；任务编排后增量富化同步应用。
- MCP `graphflow_enrich_graph` 描述更新为支持云端或本地后端。

## [0.6.3] - 2026-06-10

### Added

- `src/config/secrets.ts`: API Key 支持环境变量名、`${VAR}` 占位符、或直接 `sk-...` 明文；运行时按类型自动解析。
- Settings 面板新增 **Graph Semantic Enrichment**（知识图谱语义提取）：可单独配置 provider/model，或留空继承 Economy 层。
- `graphPolicy.semanticEnrichment.provider` 可选字段，允许语义提取使用与 Worker 不同的 provider。

### Changed

- Smart / Economy 模型改为可选；未配置时由 `model-router` 默认表按 provider 回退。
- 语义提取模型不再默认 `minicpm5-1b`；可配置 DeepSeek（`openai` + `baseUrl` + 模型名）或其它云端/本地模型，也可留空。
- OpenBMB 设置与语义提取解耦；OpenBMB 区块仅用于本地 MiniCPM。
- `formatModelConfigGuide` 与初始化文档补充 API Key 规则与图谱更新说明。

## [0.6.2] - 2026-06-10

### Fixed

- MCP install on Windows now uses `mcp-launcher.cmd` / `mcp-launcher.cjs` so `server.js` is never the MCP `command` (fixes Cursor opening the file as an editor tab).
- Vendor bundle skips Linux-only `onnxruntime-node`; GitHub Release VSIX is built on `windows-latest`.
- CI: Ubuntu runs full tests; Windows job only packages the VSIX. SQLite tests skip when optional `better-sqlite3` is unavailable.

## [0.6.1] - 2026-06-10

### Fixed

- MCP auto-install now uses system `node` (or Cursor/Electron with `ELECTRON_RUN_AS_NODE`) instead of writing `process.execPath` from the extension host, which broke MCP stdio on other machines.
- MCP server logs are redirected to stderr so JSON-RPC on stdout is not corrupted.
- Bundled MCP `cwd` points at the extension vendor runtime root for reliable module resolution.
- Extension first-install now scaffolds `~/.graphflow.config.json` (global) and workspace `.graphflow/config.json` when a folder is open.

## [0.6.0] - 2026-06-09

### Added

- Agent MCP auto-installer: sniffs Cursor, VS Code, Trae, Claude Code, and Windsurf; writes GraphFlow MCP to user and workspace config (creates missing files).
- VS Code extension auto-installs bundled MCP on first install/upgrade (`onStartupFinished`).
- New extension commands: `GraphFlow: Install MCP to Agents`, `GraphFlow: Model Setup Guide`.
- Post-install model configuration guide in Output panel and `.graphflow/README.md`.

## [0.4.2] - 2026-06-01

### Fixed

- VS Code extension host `Cannot find module 'typescript'`: `typescriptIndexer` now loads `typescript` via `createRequire` lazily and falls back to the regex extractor when unavailable.
- `sync-runtime.mjs` now bundles `typescript` and `gpt-tokenizer` into `vendor/graphflow/node_modules/` so the extension runtime can resolve them; `.vscodeignore` explicitly whitelists `vendor/**`.

## [0.4.1] - 2026-06-01

### Fixed

- VS Code extension host `Cannot find module 'better-sqlite3'`: `sqlite-client` switched to dynamic `createRequire`; `client-factory` catches the load failure and degrades the `sqlite` transport to `GraphifyFileClient` with a single warning instead of crashing.
- Moved `better-sqlite3` from `dependencies` to `optionalDependencies` so installs without native build tooling still succeed.

## [0.4.0] - 2026-05-31

### Added

- StdIO MCP server entrypoint (`graphflow-mcp`) for Cursor, Claude Code, and other MCP-capable agents.
- JSON CLI mode for all primary commands via `--json`.
- Agent guidance files: `AGENTS.md`, `CLAUDE.md`, and `.cursor/rules/graphflow.mdc`.
- Integration config samples under `docs/integrations/`.
- CLI help/version entrypoints (`--help`, `--version`).
- AST-based workspace indexer (TypeScript Compiler API) emitting real Symbol nodes (function/class/interface/type/enum/variable/method) and cross-file `references` edges, with regex fallback on parse errors.
- LLM-driven agent variants: `planTasksLlm`, `brainstormTaskLlm`, `validateTaskResultLlm`, each with deterministic JSON fallback.
- Orchestrator options `enableLlmAgents`, `enableDriftReplan`, `maxReplanRounds` — failed DAG triggers a planner re-plan loop with `previousPlan` + `failureFeedback` before HUMAN_REVIEW.
- Skill fusion: composite Skill nodes synthesized when `coOccurCount >= 2 && successCount >= 2`; `prerequisite` edges A→C and B→C; `suggestSkillHints` prioritizes composite skills when both parents match.
- Prompt context injection: `executeRolePrompt` accepts `PromptContext`; orchestrator option `enableGraphContextInPrompt` threads `summaryChannel` + `skillHints` into planner / brainstormer / worker / validator prompts; `TaskRunResult.promptContextLines` records actual injected lines.
- Node content compression: Symbol content is a signature line (`function planTasks (exported) @src/agents/planner.ts:14`), File content adds `# exports: ...` suffix, raw JSON moved to optional `GraphNode.metadata` (~1.76× byte reduction per Symbol).
- Real tokenizer (`gpt-tokenizer` / o200k_base, lazy-loaded with graceful fallback) replaces `length/4` token estimate.
- Inverted-index keyword lookup + adjacency lists on memory and file graph clients; new `getNodesByIds` and `getNeighbors` (optional on MCP client).
- `expandSubgraph` BFS along `references / imports / depends_on / prerequisite` edges; `buildLayeredContextPackage` pulls 1-hop neighbors of top hits into the same token budget (opt-out via `LayeredPackageOptions.enableEdgeExpansion=false`).
- SQLite + FTS5 graph backend (`transport: "sqlite"`) via `better-sqlite3`: WAL mode, idempotent CREATE schema, FTS5 sync triggers, edges PK + from/to/relation indexes; implements `getNodesByIds` and `getNeighbors`.
- Vector recall with reciprocal-rank fusion: `src/learning/embeddings.ts` provides deterministic `hashEmbedding` + `createOpenAiEmbeddingProvider` + `reciprocalRankFusion`; `buildLayeredContextPackage` accepts `enableVectorRecall` / `embeddingProvider` / `vectorTopK` / `vectorMinSimilarity` for semantic+keyword fusion.
- Episodic Memory + Reflection: `src/learning/episodic-memory.ts` persists Episode nodes per task run; `src/learning/reflector.ts` clusters similar episodes and synthesizes Lesson nodes with `improves` edges; orchestrator `enableEpisodicMemory` injects past keyDecisions into PromptContext.extraInstructions; nightly-trainer optionally runs reflection when given a graph client.
- Cross-language workspace indexer: TypeScript / JavaScript (AST via TS Compiler API) + Python / Rust / Go / C / C++ (regex-based) via dispatch in `src/graph/language-indexers/`; uniform Symbol / Module / defines / imports / references output across all languages.
- Tests: m16 agent integrations, m17 release readiness, m18 AST indexer, m19 LLM agents + drift, m20 skill fusion, m21 prompt context injection, m22 node compression, m23 graph retrieval, m24 SQLite backend, m25 vector recall, m26 episodic memory, m27 multi-language indexer.

### Changed

- Root package metadata now matches Apache-2.0 and publishes `graphflow` / `graphflow-mcp` binaries.
- Default router and example config models now use `gpt-4.1` and `gpt-4.1-mini`.
- Config loader now resolves `${ENV_VAR}` placeholders from the process environment.
- Failed `runTask` executions now append negative feedback events for the learning flywheel.
- File indexer skips symbolic links while crawling a workspace.
- `GraphClient` interface extended with optional `getNodesByIds` / `getNeighbors`; MCP client degrades to `[]` on unsupported endpoints.
- `graphPolicy.transport` accepts `"sqlite"` in addition to `"memory" | "file" | "mcp-http"`.

### Verified

- `npm run ci`
- `npx vitest run` — 25 test files / 95 tests passing

## [0.3.0] - 2026-05-28

GraphFlow 在 `0.3.0` 完成了从“可跑的多智能体原型”到“可安装、可观测、可分发产品版”的收敛：
- CLI、VS Code 命令面板、`@graphflow` chat 三个入口全部打通
- 图谱存储切到本地持久化默认路径，支持观测与复用
- 学习飞轮、动态路由、夜跑训练、扩展打包与 CI 已形成闭环
- 正式使用测试已沉淀到 `docs/testing/2026-05-28-formal-usage-test-report.md`

### Added

- Core orchestration pipeline with simple/complex routing and DAG execution.
- Validator retry loop with human review fallback state.
- Criteria-based validation with matched/missing requirement reporting.
- Model tier routing and provider fallback path (OpenAI, Anthropic, 百炼, 豆包).
- Graph client factory with file, memory and Graphify MCP HTTP transports.
- Automatic graph sync after successful run.
- Near-lossless context packaging:
  - summary + anchor dual channel
  - L1/L2/L3 quotas
  - dynamic refill manager with de-dup anchors
- Workspace file indexer for File/Symbol graph nodes.
- CLI commands:
  - `run`
  - `plan`
  - `context preview`
  - `graph index`
  - `graph inspect`
  - `skill insights`
- Learning flywheel baseline:
  - feedback collector
  - sample builder
  - learning dataset exporter
  - canary gate
- VS Code extension scaffold integrated with GraphFlow runtime.
- VS Code extension command added: `GraphFlow: Plan & Brainstorm`.
- VS Code chat participant added: `@graphflow` with `/run`, `/plan`, `/history`.
- Dynamic routing health evaluation and configurable provider priority (`routingPolicy`).
- GitHub Actions CI workflow for lint/build/test/extension-build.
- CLI routing diagnostics command: `graphflow route diagnose`.
- CLI nightly learning command: `graphflow learn nightly`.
- Learning event persistence and nightly summary generation.
- File indexer now captures `Module` nodes and `imports/defines` graph edges.
- Skill flywheel module with skill extraction, skill scoring, and skill co-occurrence graph updates.
- Orchestrator integration for learned skill hints in planning and execution feedback.
- New chat slash commands: `@graphflow /diagnose` and `@graphflow /learn`.
- New chat slash commands: `@graphflow /graph` and `@graphflow /skills`.
- VS Code extension now bundles GraphFlow runtime, removing dependency on workspace `npm run start`.
- VS Code extension interactive observability panels:
  - Graph Snapshot with search, type filter, node focus, relation highlight
  - Skill Insights with search, outcome filter, and score/uses/time sorting
- Config template: `graphflow.config.example.json`.
- Formal usage test plan and final pass report under `docs/testing/`.

### Changed

- README updated to match implemented features and runnable commands.
- Release notes updated to reflect bundled runtime, observability panels, and formal validation artifacts.
- Config schema expanded with graph and near-lossless controls.
- Default graph transport updated to `file` for persistent local usage testing.
- Config schema expanded with `skillPolicy` controls.

### Verified

- `npm run lint`
- `npm run build`
- `npm test` (40 tests passing)
- CLI smoke checks for `graph index` and `context preview`
- CLI smoke check for `plan`
- CLI smoke checks for `route diagnose` and `learn nightly`
- CLI smoke checks for `graph inspect` and `skill insights`
- VS Code extension build
- VS Code extension package (`artifacts/graphflow-vscode-0.3.0.vsix`)
