PactKit

格式遵循 Keep a Changelog。

4.1.0 — 2026-10-02

增强旧项目兼容诊断与安全迁移能力。 策略有歧义的项目会被要求裁定—— 而不是被替你裁定。

这一版不承诺所有老项目自动迁移,也不承诺行为完全不变。它承诺的是: 支持范围内有证据、范围外有明确提示、任何情况下不静默改变项目策略。

升级编排(必读)

四包共享 major.minor,lockstep 发布。 每个 adapter 钉 pactkit>=4.1.0,<4.2.0,且 doctor.check_adapter_compat 要求 adapter 的 major.minor 等于 core 的。core 4.1.0 与 4.0.0 的 adapter 是明确不允许的组合 ——部署会被 skew guard 拒绝。

升级 CLI 会立即改变旧 hook 的行为,但不会迁移项目。 旧 Git wrapper 执行的是 PATH 上的 pactkit,所以 pip/pipx 升级后下一次 git push 就跑新版本;而项目的 配置形态、hook 链、.gitignore 都不会被改写。要在项目里换链,跑 pactkit commit-gate --install --migrate。

升级前核对三样,不能只看版本号:版本(pactkit version)、安装来源 (pip show / direct_url.json)、产物完整 sha256。本机历史上存在多个不同构建 都报同一个版本号的情况。

新增

  • 项目形态盘点。 init / update / upgrade 与 commit-gate --install 会先打印一张逐入口表——同一形态在不同宿主信号下各读到什么——并明确说明 不会替你改配置。只读、只报、不阻断。
  • 配置三层事实(发现 / 选择 / 解析)。doctor --json 给出候选、选定层、 解析状态与比较完整性。"多份副本且无共享层"与"没有配置"现在是两个不同的状态。

修复

  • Copilot 适配器不认 -C。 pactkit -C <别的项目> update --format copilot 会把 44 个生成物写进调用方 cwd:分派器对「签名里没有 project_root」的 deployer 静默丢弃该参数,而 copilot 的部署根是项目相对的 .github/,于是退回 Path.cwd()。现在明确拒绝而不是丢弃;三个 adapter 都接收并使用项目根。
  • doctor 把同一批分歧打印两遍。 逐键详情现在文本里只留一次摘要,完整内容 在 doctor --json 的 config_source.divergence 里——而那份 JSON 此前一条都 没有。

说明

支持范围——哪些可兼容读取、副本如何选择、update 保护什么、以及未覆盖什么 ——见 migration-support-scope-4.1.md。一句话版本:无宿主信号的进程会兼容读取 恰好一份宿主副本(至 5.0.0 到期);两份以上且无共享层则一份都不选, 有效值全部来自默认。

4.0.0 — 2026-09-26

Kernelization + Repository Coherence。 宿主归属彻底移出 core;生成的配置 写到哪里,不再靠猜。

自 3.1.0 起全部是契约边界变更——这是 major 而不是 minor 的原因。即使不拆 任何包,4.0 仍改变 spec lifecycle / story 状态机 / evidence contract / prompt 生成模型 / truth hierarchy / 迁移行为 / artifact 元数据 / garden 语义。

升级编排(必读)

四包共享 major.minor,lockstep 发布。 两条独立的锁表达同一件事:每个 adapter 钉 pactkit>=4.0.0,<4.1.0,且 doctor.check_adapter_compat 要求 adapter 的 major.minor 与 core 相同。

core 4.0.0 与 3.x 的 adapter 是明确不允许的组合——部署会被 skew guard 拒绝:

✗ Adapter pactkit-codex 3.1.0 incompatible with core 4.0.0 (major/minor mismatch)

这是刻意选择的更轻失败模式:import 正常、注册正常,只有部署被拦下,可用 --allow-adapter-skew 显式放行。请四包一起装:

pip install -U "pactkit==4.0.0" "pactkit-opencode==4.0.0" \
              "pactkit-codex==4.0.0" "pactkit-copilot==4.0.0"

移除

  • core 不再为任何外部宿主声明任何东西(SPEC-4.0-22 Step 7)。profile、能力、 pre-tool 面、部署声明、安全事实、线格式,全部由各自 adapter 自带并经 entry-point discovery 注册。core 只保留它自己随包发布的 classic。
  • resolve_pactkit_yaml_dir 的目录存在性回退(Step 8)。写入目标不再由 「哪个目录碰巧存在」决定——实测 mkdir .opencode && pactkit init --format classic 会把 classic 的配置写进 .opencode/pactkit.yaml。规则改为: 读取可以发现已有层;写入必须知道自己正在为哪个 format 写。
  • adapter 的内联 pactkit.yaml 模板(Step 8 R-②-1)。它们写出的 stack: unknown 不在 core 的 VALID_STACKS 里,且没有 schema_version—— adapter 在写 core 校验器会拒绝的值,而没有人读回来看。

变更

  • 所有宿主的 pactkit.yaml 由同一个 canonical format-aware generator 产生。 adapter 只声明位置(profile.pactkit_yaml_path)与是否需要,不再发明格式。
  • opencode 现在真的生成 .opencode/pactkit.yaml。 此前它被声明、被搜索、 从不被生产者创建——却能被别的宿主创建。「声明 + 搜索 + 不生产」会让后续判断 把一个不存在的状态当成正常候选。
  • register_adapter 的重注册保留 input_translation。 它是第五个声明成员, 此前漏了 carry-forward:重注册会静默撤回线格式声明,translate_host_payload 随即认不出该宿主,整条通道 fail-open。

说明

  • 四宿主在 fresh init 下生成的配置逐字节相同。已存在任意 pactkit.yaml 的项目不自动增殖宿主副本——它继续复用现有层(已知行为,非缺陷)。
  • 本段在 v4.0.0 tag 之后补写,因此不包含在 tag 指向的那棵树里。

3.1.0 — 2026-09-25

宿主归属移出 core。这是契约边界变更,不是内部重构——所以是 minor 而不是 patch。

移除

  • core 不再为 opencode / codex / copilot 声明任何东西;过渡期的 API 与状态整体删除。

变更

  • 宿主从「core 预置」变成「adapter 装上才出现」。未安装的宿主无法注册,所以 format: all 不会为一个从未部署过的宿主安装通道。

说明

  • 升级顺序有讲究。 core 与 adapter 必须共享 major.minor。本版要求 adapter 先升; 把新 adapter 装到旧 core 上会让 pip 为满足钉版而静默降级 core。

3.0.4 — 2026-09-24

为 adapter 解锁的 core 依赖发布。宿主描述数据从 core 的硬编码表迁进可注册的 AdapterRegistration,并落地三个 adapter 自带声明所需的类型与 API。

这不是 PactKit 4.0 的最终发布——4.0 的 lifecycle closure 还在后面。本版的 定位是让 adapter 能站起来,不是宣布内核化完成。

升级

新 adapter + 旧 core 是不兼容组合,不是运行时回归。 三个 adapter 钉 pactkit>=3.0.1,<3.1.0,所以升级到新 adapter 时 pip 会同时把 core 升到本版; 只升 core 不升 adapter 是安全的。反过来,手工把新 adapter 装到 core 3.0.3 上 会得到 ModuleNotFoundError: No module named 'pactkit.capability',注册表退化成 只剩 classic——这是安装组合的问题,不是缺陷,重装 core 即可恢复。

新增

  • pactkit.capability —— 四级能力解析与多维保证模型(SPEC-4.0-04)。
  • AdapterRegistration 与声明类型 —— InputTranslation、DeploymentClaim、 SecurityDeclaration、SecurityFacts。宿主描述(能力、pre-tool 面、部署声明、 安全事实)现在由 adapter 自带,complete_registration 负责采集 (SPEC-4.0-22 Phase B / Step 6)。
  • Adapter SPI 公开面冻结 + 宿主分派棘轮(SPEC-4.0-03)。

变更

  • 未登记的宿主不再伪造一整套 Degraded 能力。 unknown host 如实报 unknown_host,而不是给出一张看起来像测量结果的能力表。
  • 需要 tamper_guard 授权的写操作,在安全事实声明不完整时不再放行。 三态模型 区分 missing(宿主没说话 → 我们不知道)与 empty(宿主说了它没有 → 这是一次 测量)。missing 归为授权未决,fail closed 并点名不完整的类别;补齐声明后回到 正常的细粒度裁决(普通编辑放行、绕过仍拦)。
  • doctor 的宿主枚举只来自 registry,路径从 profile 派生。
  • 路径值改派生 —— 禁写路径模式由 7 条增至 12 条,覆盖全部已登记宿主的 config 目录。

修复

  • --overlay 只接受 complexity schema,不支持的输入显式失败。
  • blast_radius 的 resolver 只认 exact path;shorthand 需显式开启,歧义不任选。 四种空结果拆开:resolved / not_found / out_of_scope / truncated。
  • analyzer 能表达「读不了」——四份复制的契约收敛为一份。
  • query 的空结果不再被当成 absence 的证明。
  • done-verify 不再把 blockquote 里的路径当成磁盘路径。
  • report / visualize 的扫描器按 ownership metadata 排除 PactKit 部署产物。
  • Story 生命周期成为契约——状态机由数据定义,归档不再冒充完成。

3.0.3 — 2026-09-21

证据链路的三个边界修复。其中一处会销毁已有记录。升级即可,无需迁移。

修复

  • 已提交的越界改动会从范围检查里消失。 范围完整性只比对 git diff HEAD (工作区状态),committed diff 那半没有实现——于是提交一次,越界文件就 从测量范围里消失,completion_ready 从 false 翻成 true。多次提交的 Story、提交后的 Check、会话恢复后的检查都会得到错误结论。

    起点现在绑定在 Act 的 preflight receipt 上(代码触点,不靠人记),检查起点 到工作区的完整变化。起点是粘性的:重跑 preflight 不会前移。找不到可信 起点时如实报 not-measured,而不是报「无越界」。

  • 「未测量」能生成 green 记录。 pactkit evidence-measure --record 调 record_verification() 时不传 outcome,取了默认值 "green"——一个测试 都没跑也记成「回归通过」。更深一层:判定函数只比对内容指纹,从不检查记录里 有没有回归证据,所以那条记录会发放 reuse 许可,下游据此真的跳过回归。

    现在 outcome 必填、测量走独立入口、复用要求 outcome == "green";失败的 记录路由到全量重验而不是最轻的分类路径。

  • 不同证据写入同一 Story 记录会互相覆盖。 写入整文件替换:写完负向控制 再写回归记录,前者消失;反之亦然。记录现在按证据类型分节 (regression / measurement),各自绑定自己测得时的代码状态。

  • 升级路径上的记录不会被销毁。 上一版之前写出的记录是扁平形状(回归 字段在顶层、测量块叫 evidence)——只认新形状的合并逻辑会让这类记录在 一次写入后静默丢失一半。合并现在同时认两种形状。

3.0.2 — 2026-09-21

两条 CRITICAL 门禁修复。 如果你用 PactKit 发过版,或者照着拦截文案 尝试过人工旁路,这一版值得升级。

修复

  • 发布门禁可以在一个测试都没跑的情况下报 PASS。 Pre-Tag Gate 的 "Run tests" 那行指向的是 pactkit regression——它是个分类器, 在 SKIP / IMPACT 两条路径上都 exit 0。于是紧跟其后的 "If either fails" 永远不会因为测试而触发。现在该行指向真正的测试运行器,并显式标注 pactkit regression 只做分类。

  • 人工旁路文案给出的形式做不到。 拦截消息曾建议 PACTKIT_ALLOW_SECRET=1 <command> 这类内联前缀。实测:旁路判据读的是 钩子进程自己的环境变量,而 PreToolUse 钩子在命令执行之前由宿主 以会话环境启动——内联变量只作用于子进程,结构性到不了。照文案做会 被继续拦下,命令一次都没跑起来。

    现在全部出口经由单一渲染器 bypass_message.human_channel() 产出,按 「面」分别说清:PreToolUse 面(内联做不到,请在会话外终端执行、或会话 启动前 export)与 git hook 面(终端里 VAR=1 git <cmd> 可以,git 会把它传给自己的 hook)。

  • pactkit doctor 的两个表面会对同一棵树给出相反结论。 text 模式 exit 1、JSON 模式 exit 0。现在两处共用同一个 verdict 来源。

  • done-verify 把通配符当成声明文件。 _real_path 只挡花括号是它自己 规则的不完整实现。

  • audit 的「有测试吗」判定靠猜文件名,产生 40 个假阴性与一批垃圾任务。 现在改用图证据(调用边 ∪ 导入边 ∪ 命名约定)。

新增

  • pactkit evidence-measure:把「范围完整性」与「变异验证(negative control)」从散文变成可执行的测量。negative control 同时控住三件事—— 变异前基线必须绿、每个文件跑完必须还原、只把退出码 1 算抓到——缺任何 一件都会产出 false pass。
  • R8/R9 两条 MUST 接上 delivery_evidence,从散文变成 code touchpoint。

3.0.1 — 2026-09-19

分发收口 + 门禁修复。plugin/marketplace 通道退役——现在所有安装都走 pip; OpenCode 补上 pre-tool 门禁通道。

迁移(3.0.0 → 3.0.1)

  • plugin / marketplace 分发通道已移除。 pactkit init --format plugin 与 --format marketplace 不再存在。如果你是通过 Claude Code 的 /plugin marketplace add pactkit/claude-code-plugin 安装的,那个仓库已归档、 不会再更新——卸载后改用 pip:

    claude plugin uninstall pactkit    # 在 Claude Code 中
    pip install pactkit && pactkit init
  • 四个宿主现在各自只有一条通道:Claude Code 由核心包自带;OpenCode、Codex、 Copilot 各装自己的 adapter(pactkit[opencode]、pactkit[codex]、 pactkit-copilot)。

  • 已有 pip 安装无需任何动作,pactkit update 照常。

新增

  • OpenCode pre-tool 门禁通道。 门禁插件全局部署,靠激活标记按项目生效、 fail-closed。负载翻译下沉到 Python,core 的绕过回归用例现在覆盖所有宿主通道。
  • 组织基线 GPG 分离签名——来源可验证,缺签名则 fail-closed。

修复

  • 门禁矩阵按「层 × 门」陈述事实,且部分覆盖现在一定会被说出来——把「覆盖 一半」读成「检查过了」正是它要防的事。
  • 未知可写工具改为拒绝,不再半判。 拿不到完整负载却给出确定结论,会把 「没检查」读成「检查通过」。
  • OpenCode edit 的 replaceAll 未映射——门禁按单次替换模拟,一次弱化 全部匹配的编辑在 OpenCode 放行、在原生 Claude 被拦下。
  • 项目级 agent 指令不再 @import 一个没有东西在生成的文件——三个 adapter 模板都受影响。
  • secrets_baseline 同一行的多个条目不再互相覆盖,且工具不再掩蔽自身的损坏。

3.0.0 — 2026-09-18

架构瘦身收口版本。Git hook 层换成 pre-commit(唯一调度器),凭据引擎换成 detect-secrets(上游),代码关系统一到 Codegraph(MMD 文件变为渲染视图), pactkit.yaml 改为按终端分层读。这是主版本变更:旧 Git hook 需要显式迁移, 升级前请先读迁移说明。

迁移(2.27.0 → 3.0.0)

  • 新增标准依赖:pre-commit 与 detect-secrets 随基础安装发布, pip install --upgrade pactkit 即得。detect-secrets-hook 经 PactKit 转发, 不需要出现在 PATH 上。
  • 旧 PactKit Git hook 显式迁移,绝不自动切换:每个项目先跑 pactkit commit-gate --install --check(只读预检),再跑 --install --migrate。 可确认未被修改的旧 wrapper 备份到 .pre-pactkit-migration 后由 pre-commit shim 替换;你自己改过的 hook 一律不碰——迁移会停下并列出它们。
  • .pre-commit-config.yaml 不再记录机器本地绝对路径:entry 只写 PATH 上的 pactkit,因此同一份进版本库的配置对每个开发者、对 Linux CI 都成立。迁移会把 旧版写下的绝对路径改写为共享形态;pactkit doctor 会点名仍存在的那些。
  • 配置按终端读:仓库根的 pactkit.yaml 是共享层,适用于所有宿主,以及一切 没有宿主信号的进程(裸终端、CI、以及 Git hook——pre-commit/pre-push 是宿主无关的, 没有终端可问)。.claude/、.codex/ 等宿主副本按键覆盖它。必须处处生效的策略 (尤其 enforcement.*)写共享层。pactkit schema config 会打印宿主、层与每个键的来源。
  • 回滚:pip install pactkit==2.27.0(适配器在同一条命令里钉同窗口), 然后 pactkit update。要一并撤掉 Git hook,用 pactkit commit-gate --uninstall-chain——它只删 PactKit 自己的条目与 shim, 你自己的检查与 baseline 原样保留。

新增

  • Codegraph 是代码事实的唯一源,MMD 是渲染视图:pactkit sync 建索引, pactkit visualize 从索引渲染 docs/architecture/graphs/*.mmd,审计洞察读同一份 索引。自研扫描器永久退役——没有索引时 visualize 明确失败,不回退去猜。
  • 首次运行检查:安装或升级后,项目里第一条 pactkit 命令会跑一次只读的、 每版本一次的项目级检查(配置漂移 / 图视图 / 门禁链),每条发现都给出精确的下一步 命令。报告走 stderr,不改任何文件。
  • pre-push 能力边界写入 pactkit doctor 与支持矩阵:一次 push 携带多个 refspec 时只有第一个 ref 到达策略;删除远端 ref 完全不触发 pre-push。这是 pre-commit 自身的边界——没有为此再造第二个调度器,受保护分支的删除防护属于服务端。

变更

  • 配置副本不再自动抹平:按终端读之后,把一个宿主的内容覆盖到其他宿主,抹掉的 正是这套解析要保住的终端差异。要统一现在是显式选择: pactkit update --sync-config-copies。
  • spec_edit 授权 token 移除:Act 中途改 Spec 只走人工通道 (! 前缀 + PACTKIT_ALLOW_SPEC_EDIT=1)。

修复

  • 卸载不再删除用户配置:旧的按行删除用一个只有 repos: 行才能清除的标志来跟踪 "正在跳过",于是排在我们最后一个 hook 之后的顶层键(fail_fast:)被一起吃掉; 更糟的是解析失败的配置被当成空配置然后删掉文件。读不了不等于没有——解析失败现在 原样停下。
  • 首次安装部分失败可完整回滚:旧回滚只恢复自己移除过的 wrapper;一个原本没有 hook 的项目可能被留下一个新建的 shim 而没有配置——一个每次提交都失败的 hook。 现在本次运行新建的文件也会被移除。
  • 合并路径尊重既有 baseline:generate_config 会写 args: [--baseline, .secrets.baseline],但"合并进已有配置"这条路径手写了自己的 凭据块并丢掉了这一行——已复核的 baseline 留在磁盘上却不被使用,此前放行的测试数据 又重新挡住提交。两条路径现在渲染自同一份 hook 定义。
  • 发布门禁不再可能选中日常验收:同一个 commit 现在同时有日常(单版本)与发布 (四版本)两条验收,只按 SHA 选等于"API 先列出哪条"。现在匹配本 tag 的 push 事件 与 SHA。

2.27.0 — 2026-09-17

安全加固版本:六轮对抗评审修复 34 条门禁缺陷 + 项目契约生命周期 (adopt / reconcile / project-preflight)。包含行为变更,升级前请阅读 Migration。

Migration (2.26.1 → 2.27.0)

  • spec_guard:内容漂移从「解锁」改为「锁定」——live receipt 哈希与 Spec 不符 意味着 Spec 被改过,这正是该门禁存在的理由。已授权修改通道不变。
  • secrets_gate / auth_gate 审计不再回显命令文本——清洗只覆盖已知凭据形态, 同一条命令里未命中的凭据会随之进入审计记录。
  • tamper_guard 保护面扩大:.pactkit/ 整目录、settings.local.json(宿主 会把 settings 的 env 注入 hook 进程且会话内热加载——一次 Write 即可关掉全部 门禁)、全部四份 pactkit.yaml 候选。agent 确需编辑时走 PACTKIT_ALLOW_CONFIG_EDIT=1 人工通道。
  • core 与 adapter 一起升级:pip install -U pactkit pactkit-codex pactkit-opencode (双向钉版 2.27.x)。

Added

  • 项目契约生命周期(#13):pactkit adopt(最小本地契约)、pactkit reconcile (安全迁移——行级插入保注释、写前回读验证)、pactkit project-preflight(四态 检查)。项目采用纯本地:无注册表、无扫描、无跨项目变更。
  • 支持矩阵 docs/guides/support-matrix.md:宿主 × 门禁 × Python × OS,从安装器 事实派生并有守卫测试。OpenCode / Copilot 只有 git-hook 层——四个 pre-tool 门禁 在该层不存在,矩阵如实写明。

Fixed — 六轮对抗评审(34 条)

  • push_gate:带引号 refspec 与强推标记曾放行受保护分支并写入假保证;$VAR refspec 改判不可解析(WARN + DEGRADED);pre-push hook 改用 git 传入的 refspec (feature 分支推 main 曾真实放行);git -C 决定被检查的仓库。
  • commit_gate:git -c core.hooksPath=/dev/null commit 曾使 RED 代码零验证落地 (含大小写变体与 GIT_CONFIG_* 注入);分派锚定命令位置(伪装成 git 命令的 printf 写受保护文件曾整体绕过);审计写失败不再把 BLOCK 翻成崩溃。
  • tamper_guard:复合命令回归;配置弱化跨四份候选拦截;settings env 旁路通道; touch .pactkit 状态目录替换;符号链接与大小写拼写(Edit + Bash 两面);replace_all 模拟。
  • secrets_gate:补齐 curl -u / Authorization 头 / sk-proj- / AWS secret / URL 凭据 / sshpass·docker·redis·openssl 内联口令;私钥正文整段清洗(此前只清 BEGIN 行——防泄露门禁自己在把密钥正文写进审计记录)。
  • auth_gate:子命令前置全局旗标(跨仓库 -R 形态);审计不回显命令。
  • 基础设施:原子写统一单一临时名实现;gate 名路径逃逸守卫;YAML 异常不再逃出 hook;clean 对符号链接不崩溃不跟随。

2.26.1 — 2026-09-15

Fixed

  • deploy 不再因扫描根下的不可读目录崩溃——Path.exists() 只吞 ENOENT/ENOTDIR/ELOOP,EACCES 会直接抛出;GitHub runner 的 /tmp 含 root 属主 0750 的 systemd-private-* 目录,中性 cwd 下 deploy 的子目录 marker 检查抛 PermissionError。所有 marker 检查改为 OSError 安全版。

2.26.0 — 2026-09-15

产品重定位版本:PactKit 收敛为轻量开发赋能脚手架——无管理员、无集中控制、无自建服务。

Migration (2.25.2 → 2.26.0)

  • 自建 MCP server 已退役:pactkit mcp 变为兼容说明入口;Codex gate 通道从 MCP 迁移到原生 hooks;新部署默认零 MCP 注入。
  • 配置入口统一:load_effective_config 是唯一配置解析入口(候选优先级 + 基线合并 + tighten-only)。
  • 验证决策是结构化数据(ADR-0004):Done 按 decision.verdict 路由。
  • 规则语料为 CI 不变量(ADR-0005):改规则必带语料案例。

Added

  • 轻量脚手架重定位落地:候选清理限定受管范围;统一有效配置与门禁语义;三宿主 prompt 正文摘要 golden(删改必被检出);真 wheel 组合验收。
  • 提交路径收敛:worktree/core.hooksPath 单次测试执行者(不再双跑);被改测试文件直接映射自身;映射为空走快速层而非静默全量;多语言仓跑全部检测到的原生套件;gate 计划先行 + 流式输出 + 每步耗时入记录;暂存区为准。
  • 验证事实与治理收敛:验证记录以内容指纹为主键(跨 Story 复用);无新鲜无歧义 receipt 时盖章为无归属;PreCompact 单次生成;spec guard 指纹失效解锁;遥测可关。
  • 工程指导按缺口加载:复用四判断集中于共享 capsule;Act 缺口驱动(空结果≠无风险、0 篇有效、超三篇仍读);Plan 关键词降为候选信号;Check 独立复用审查。
  • 结构化验证决策接口(ADR-0004/0006);固定语料规则评估(ADR-0005);codegraph 集成(ADR-0008,pactkit query CLI 路由)。

Fixed

  • gate -qq 误报(junitxml 权威计数);流式 pytest 输出保住超时上限;done-verify 占位符缺陷;pactkit risk 输出对齐软预算语义。

Changed

  • Spec 编辑锁定从"有 receipt 即锁"改为指纹失效制;验证记录无归属时不再猜 Story;PreCompact 不再全量刷新。

2.25.2 — 2026-09-02

修复

  • commit-gate 计数不再受仓库 addopts 干扰 —— gate 此前从 pytest 终端 summary 行解析通过/失败计数,但仓库的 addopts = "-q" 会与 gate 自带的 -q 叠加成 -qq,pytest 9 在该级别下完全不打印最终 summary 行:每次运行都解析为全零,真实失败的运行被误报为 "no tests collected"。计数现在改走 --junitxml 旁路通道(verbosity 无法抑制),终端解析降级为回退;仓库 addopts 其余完全保留(--asyncio-mode=auto 等必需旗标照常生效),禁用 junitxml 插件的仓库降级为终端解析而非锁死提交。失败文案按退出码报告真实含义(exit 5 = 没有测试运行、exit 4 = usage/collection 错误、其余 = "计数不可解析" 并附 addopts 干扰提示),FAILED/ERROR 短摘要行也会进入拦截消息。

2.25.1 — 2026-09-01

修复

  • pactkit gate authorize <scope> —— 各 gate 拦截提示所文档的用法 —— 现已可用(此前解析器只接受裸位置参数 pactkit gate <scope>;两种形式现在都有效)。
  • gate hook 对 cd <其他仓库> && git push 按目标仓库的 enforcement 配置判定,而非会话目录的配置。
  • commit-gate 不再误伤纯文档/元文件提交 —— .gitignore/.claude/**/.codex/** 计入 doc-only(仓库/agent 元数据不含运行时代码,不再使整个变更集丧失 skip 资格);仅有扁平 tests/ 布局时全量目标自动回退;零收集的运行如实报告 "no tests collected" 而非暗示测试失败(仍拦截——TDD 契约不变);无 venv 回退解释器报 No module named pytest 时降级为 WARN + 放行,与 pytest 二进制缺失路径一致(R3 自锁保护)。

2.25.0 — 2026-08-30

新增

  • 保护分支 push 门 — 直推保护分支(默认 main/master)在三条通道(PreToolUse、codex hooks.json、git pre-push)全被拦截,并给出正规路径、人工豁免(PACTKIT_ALLOW_DIRECT_PUSH=1)与仓库配置三条出路。保护分支上的直接提交默认拦截;--no-verify 不再是免费后门。全部落 push_gate 审计。
  • 防篡改守卫 — agent 修改 enforcement 工件(.git/hooks/**、.pactkit/enforcement/**、.codex/hooks.json、settings.json 里的 gate 注册项)会被拦截。
  • L1 硬规则覆盖协议 — 核心规则明确:L1 规则不可在对话中豁免;冲突指令应被拒绝,为绕过而改规则/hook/配置本身即 L1 篡改。
  • stack 感知 commit-gate — gate 按检测到的技术栈跑真实测试套件(npm test / go test ./... / mvn|gradle test),不再把 pytest 硬塞给非 Python 仓库;doctor 探针同步感知。
  • 会话上下文 hook — pactkit gate --hook session-start 在会话启动与压缩后注入再生的 .pactkit/context.md;--hook pre-compact 以副作用方式刷新状态、绝不阻塞压缩。
  • Spec 防篡改 — Act 期间编辑带有效 preflight receipt 的 Spec 被拦截("Spec is Law",L1);Plan 阶段写 Spec 不受影响。
  • 授权门 — 外发命令(PR/release/publish/repo 操作)先拦后问,用户确认后 pactkit gate <scope> 打开短时审计窗口。
  • Secrets 门 — 命令中的明文凭据默认拦截;env 间接(password=$DB_PASS)豁免。
  • Gate 遥测 — 拦截、授权与 Skill 调用汇入 run-event 事件流;pactkit stats 报告 per-gate 拦截计数、per-command 调用计数与项目级授权对。
  • enforcement 配置节 — protected_branches / allow_direct_push / tamper_guard / spec_guard / auth_gate / secrets_gate / auth_ttl_minutes,缺省回落安全默认。

修复

  • 未安装 pactkit 的机器不再被 git hook 锁死(PATH 探测 + WARN 替代 exit 127)。
  • 审计记录不再持久化凭据 — 源自命令的文本落盘前一律脱敏;pactkit clean 一次性擦洗历史记录。

变更

  • main/master 上的直接提交默认拦截(此前仅跑全量测试)——可用 enforcement.allow_direct_push 关闭。

2.24.2 — 2026-08-27

修复

  • --format all 安装 codex hooks 通道(此前仅显式 --format codex)。

2.24.1 — 2026-08-27

修复

  • enforcement 探针解析项目 venv 的 pytest(pipx 安装的 CLI 不再误报 gate 不可用)。

2.24.0 — 2026-08-27

新增

  • Run 事件流(append-only、崩溃容忍);pactkit stats friction 指标;gate enforcement 完整性上报(full/degraded/unavailable + pactkit doctor --json enforcement 节);Codex 原生 hooks 薄注册;授权审计(asked/granted/denied 事件 + pactkit continuation deny);outcome_unknown 崩溃恢复(带 pid 的尝试围栏);command manifest v2 reference 摘要。

2.23.0 — 2026-08-27

取代已撤回的 2.21.0/2.22.0——两版本因重大缺陷在发布后不久从 PyPI 下架。

新增

  • Spec 预检 + 原生会话——/project-act Phase 0.7 在任何源码编辑前,确定性地内联 Spec 引用的实现输入与约束(附 receipts)。
  • 渐进式 PDCA 规则加载——16 条按需规则按触发加载,每条规则声明具体触发条件与证据。
  • 统一部署所有权安全——manifest 哈希所有权证明扩展到 skills、命令提示、agents、CLAUDE.md 与回滚:用户修改过的文件保留为 .pactkit-new 候选,删除需要 manifest 证明。
  • 机器校验的 prompt-to-CLI 一致性——prompt 引用未注册的 CLI 子命令会在 CI 失败,而不是让 AI 在会话中翻车。
  • Legacy 引擎用量计数器——pactkit doctor 显示冻结 legacy 包的调用计数(删除闸门的决策依据)。

修复

  • 门禁 fail closed——pip-audit 判定、coverage 阻断、commit-gate 收集失败不再伪装成通过。
  • 不再卡死 run——消失的 artifact 以 artifact_vanished 可恢复地失败,损坏的无关 run 文件安全跳过,Windows 引擎变更修复。
  • pactkit.yaml 多副本同步——从实际加载的副本同步,写入原子化。
  • Prompt 脱离 legacy 表面——Act/Plan prompt 不再调用弃用的 continuation/checkpoint 命令。

移除 / 弃用

  • 移除 preflight guard 钩子(执行价值近乎为零、产生会话噪音);preflight loader 完整保留。
  • Legacy workflow engine 冻结入 pactkit.legacy——删除候选,以一个发布周期零显式调用为闸门。

2.22.0 — 2026-08-24

新增

  • 非标准目录布局的统一 WorkUnit scope 派生——WorkUnit 读写 scope 不再是硬编码的 src/**/tests/** 白名单。resolve_scope SSoT 在每个单元的冻结模板 floor 之上并集项目声明的 write_scope 根(source_roots/test_roots/docs_roots)与 Spec 的 Touches,使 frontend/src/、backend/、directus-extensions/ 等布局不再阻塞 project-act/project-hotfix。取并集而非交集:Spec(Tier-1 律法)永不被 mutable config 裁剪。

修复

  • 已完成 run 在跨 workflow 的合法 projection 演化中存活——Plan → Act 之后,project-check/project-done 启动与 pactkit work-unit status <plan-run> 不再以 invalid_workflow_state 崩溃。前置查找以宽松方式扫描 sibling journal,finalize-workflow 将 context.md 重生成到 post-completion canonical。执行读取保持严格,篡改仍被检测。

2.21.0 — 2026-08-24

新增

  • 完整的 Core 生命周期——全部 12 个 project-* 命令都通过有边界、可版本化的 WorkUnit 执行。Core 负责证据校验、调度与日志化完成判定,模型的一次 final 回复不再等于 workflow 完成。
  • 可恢复的 Codex 集成——官方 App Server bridge 为每个 run 持久化单一 thread,支持跨进程恢复、schema 约束输出,并把格式错误或 lease 故障转为持久化 retry。

变更

  • Act 真正关闭 Story——RED → GREEN、回归、lint 和覆盖率门禁通过后,由可崩溃恢复的 Core 事务完成 canonical Story tasks 并重建 Sprint Board。
  • 副作用必须显式授权——commit、push、PR、tag、publish、release 和 Sprint orchestration 在授权前暂停,不会先执行。
  • 分布式 ID——移除顺序式 next-id,统一使用 pactkit generate-id。

修复

  • 流程提前停止——finish guard、持久化 attempt、幂等 finalizer 和跨进程 thread resume 使中断后的 Codex workflow 可继续恢复。
  • 宿主能力诚实报告——Doctor 正确显示已验证的 Codex resumable 能力,同时保留每个宿主的独立保证等级。

2.20.0 — 2026-08-22

新增

  • 可验证、可恢复的 Act checkpoint——Story 级 continuation 会在跨进程恢复时验证 Spec、Board、聚焦测试、回归和 lint 证据。

修复

  • Adapter 安全渲染与部署门禁——跨宿主保留 CLI 语义,并阻止不兼容的 Core/adapter 组合。

2.19.0 — 2026-08-17

新增

  • Spec 依赖声明(Dependency Surface)(STORY-slim-143)——每个脚手架生成的 Spec 现在都带机器可读的 ## Dependency Surface 表(Depends on / Provides / Touches / Conflict risk)。Story 先后顺序和文件级冲突面从脑内知识变成可计算的数据。
  • pactkit spec-graph(STORY-slim-143)——确定性的 story 依赖 DAG:拓扑执行波次(同波次 story 可并行)、文件重叠冲突矩阵、循环依赖检测、Mermaid 图输出。仅用标准库,零新依赖。
  • Sprint Wave 模式(STORY-slim-144)——无参数的 /project-sprint 扫描 backlog,消费 spec-graph --json,将无冲突的同波次 story 作为并行 worktree subagent 运行(上限 sprint.max_parallel,默认 3)。有冲突或未声明 Touches 的 story 一律串行(safe-by-default);wave N+1 必须等 wave N 全部合并通过。单 story 模式行为不变。
  • Linter 规则 E010/W011(STORY-slim-143)——悬空的 Depends on 引用会阻断 Act;缺少 Dependency Surface 给出警告。

2.18.0 — 2026-08-17

新增

  • 部署清单内容哈希(STORY-slim-141)——部署时在 .pactkit-deployed.json 记录逐文件 sha256;pactkit doctor 一致性检查下沉到内容级,"版本戳新、文件旧"的静默漂移变为显式报告。用户可改文件(CLAUDE.md、配置文件)结构性排除——你自己的追加内容零误报。
  • adapter 版本偏斜告警(STORY-slim-142)——doctor 检测已装 adapter 包(如 pactkit-opencode)落后于 core 时给出 warning 和 pipx inject 升级提示。

修复

  • 预览/测试部署不再覆盖线上 adapter(STORY-slim-142)——deploy(format="all", target=...) 此前会以真实 home 目录调用 adapter deployer,静默覆盖 ~/.config/opencode 等目录。现在带 -t 时跳过 adapter 并提示。
  • CI 模板升级到 checkout@v7 / setup-python@v7——重新生成 workflow 不再回退 dependabot 更新。

2.17.0 — 2026-08-13

新增

  • pactkit done-verify(STORY-slim-136)——/project-done 的归档诚实性机械核验:需求→测试证据链、勾选↔case 一致性、零调用方检测、Spec/Board/归档状态机一致性。FAIL 即阻止归档。
  • pactkit commit-gate(STORY-slim-138/140)——提交前测试门禁,skip≠pass 透明化(跳过项显式列出)。Claude Code 走 PreToolUse hook 自动安装;非 Claude 格式自动兜底 git pre-commit。内置自锁防护。
  • pactkit deps(STORY-slim-137)——外部依赖注册表(node/codegraph/gh),deps check 检测 + deps install 引导安装。/project-init Phase 1.5 询问后才安装;CLI init 只报告。
  • pactkit schema config(STORY-slim-135)——列出全部配置键的默认值、生效值与来源。
  • doctor 部署一致性检查(STORY-slim-139)——每次部署落盘 .pactkit-deployed.json,跨格式漂移显式报告。

变更

  • pactkit.yaml schema 化(STORY-slim-135)——CONFIG_SCHEMA 单一事实源;新 init 只写 stack+developer 极简配置;多副本同步 + 漂移检测。
  • Skill 部署清单化(STORY-slim-139)——codex/copilot adapter 改为消费 core 清单,补回被静默丢弃的 garden/audit/report。

修复

  • Codex adapter config.toml 策略——两次清空事故后,已存在的文件永不修改(仅不存在时创建)。
  • OpenCode 全局 instructions——合并后的宪法不再被从 always-load 层剥离。

2.16.1 — 2026-07-23

修复

  • Bedrock VS Code 插件模型兼容性 (STORY-slim-134) — 从所有 /project-* 命令 frontmatter 中移除 model: 字段。Claude Code 会将 model: sonnet/opus 解析为 Anthropic 官方最新 model ID,绕过 VS Code 插件环境中的 ANTHROPIC_DEFAULT_SONNET_MODEL 环境变量设置。现在命令会继承用户 provider 环境变量所设定的 session 默认模型。

2.16.0 — 2026-07-13

新增

  • /project-debug 命令 (STORY-slim-133) — 假设驱动的结构化排查。循环流程:症状 → 假设(≤3 个)→ 验证(可执行命令)→ 缩小范围 → 定位根因。强制"证据门控"文件访问(不允许漫无目的地读文件),3 轮不收敛自动升级到 /project-plan。使用 sonnet 模型 + 结构化协议。

2.15.2 — 2026-07-02

变更

  • Codegraph 命令与 prompt 解耦 (STORY-slim-132) — 将硬编码的 codegraph CLI 命令列表替换为运行时 codegraph --help 动态发现。codegraph 升级时 PactKit 无需同步修改。

修复

  • Act Phase 0.6 挪卡命令 (HOTFIX-slim-132) — 在 playbook 中写明 board.py move_story 完整命令模板,避免 AI 每次猜错语法。
  • Prompt deployer (HOTFIX-slim-131) — @ 引用插入到 YAML frontmatter 之后,确保 model: 字段被正确解析。
  • Skill frontmatter (HOTFIX-slim-130) — 将 @ 引用移至 YAML frontmatter 下方。

重构

  • 大型 rules 从 @inject 改为按需 Read,减少初始上下文体积。

2.15.1 — 2026-06-10

新增

  • 工程关注点引导系统 (STORY-slim-128) — 按需加载 NFR 引导文件。Plan 阶段扫描需求关键词并在 Spec 中包含 NFR 决策;Act 阶段加载匹配的引导文件(最多 1-3 个)。初始 13 个关注点覆盖并发、异步、数据库、缓存、API 集成、事件驱动、弹性、内存管理、可观测性、配置、模块设计、代码审查优先、组件复用。
  • 新增 6 个工程引导 (STORY-slim-129) — error-recovery(错误恢复与重试)、data-consistency(数据一致性)、backwards-compatibility(向后兼容)、performance-antipatterns(性能反模式)、graceful-shutdown(优雅关闭)、testing-strategy(测试策略)。总计 19 个引导文件。
  • lint 可选依赖组 — pip install pactkit[lint] 现包含 ruff。

修复

  • Spec linter 接受 Security Scope 标题格式的 SEC-* 条目。
  • CI 中 tree-sitter 测试在未安装时优雅跳过。

2.14.2 — 2026-06-01

新增

  • 项目 CLAUDE.md 管理块更新 (STORY-slim-127) — pactkit update 现使用 <!-- pactkit:start --> / <!-- pactkit:end --> 标记。管理块外的用户内容在每次更新时被完整保留。
  • Codegraph sync 代码强制执行 (STORY-slim-126) — pactkit visualize --lazy 和 pactkit sync 在检测到 .codegraph/ 目录时自动运行 codegraph sync。
  • 生成的 CLAUDE.md 中 Codegraph 优先指令 — 存在 .codegraph/ 的项目会在生成的 CLAUDE.md 中包含 "Code Intelligence" 段落,指导 AI 优先使用 codegraph 而非 grep/find。

变更

  • MCP 策略精简为 Context7 + Memory — 从 MCP 推荐列表移除 Playwright、Chrome DevTools、Draw.io 和 shadcn。更少噪音,同等价值。
  • 配置回填移除 — pactkit update 不再向 pactkit.yaml 回写默认段落。缺失的 key = 接受默认值。

修复

  • 过期规则警告 — 移除 .opencode/pactkit.yaml 中的过时规则名称。

2.14.0 — 2026-05-26

新增

  • Codegraph 集成 (STORY-slim-124) — 配置 visualize.graph_provider: codegraph 后,pactkit query 从 .codegraph/codegraph.db(由 @colbymchenry/codegraph 生成)读取数据。比 pactkit 自身的后缀匹配多 2.6 倍边数,支持完全限定名、行号和类型感知解析。
  • Codegraph 自动初始化 — 当 graph_provider: codegraph 已设置但 .codegraph/codegraph.db 不存在时,pactkit query 自动运行 codegraph init -i。
  • Graph Query Protocol 双模式 — PDCA 命令现支持 Codegraph 模式(pactkit query + codegraph CLI)和 Grep 模式(回退到 .mmd 文件)。
  • 所有 PDCA skill 添加 model frontmatter (STORY-slim-125) — 全部 11 个命令/技能 prompt 添加了显式 model: frontmatter。(已在 2.16.1 回退 — 见 STORY-slim-134)

移除

  • _write_sqlite_db() — PactKit 不再生成自己的 call_graph.db。上游 codegraph 工具通过 tree-sitter + import 感知解析生成更优质的调用图。
  • visualize.sqlite_output 配置 — 被 visualize.graph_provider: codegraph 替代。

变更

  • pactkit query — 从 .codegraph/codegraph.db(codegraph schema,hash ID + JOIN edges/nodes)读取,替代 pactkit 自有的 call_graph.db。
  • PDCA prompt 更新 — Plan、Act、Check、Done、Hotfix、Trace 技能中所有对 call_graph.db / "SQLite Mode" 的引用已移除。

2.13.0 — 2026-05-07

新增

  • pactkit interface-summary CLI — 基于 AST 的接口摘要提取,物理输出仅包含签名、类型和 docstring。为 Act Phase 1 分层加载实现 "Code Enforces, Prompt Instructs" 原则——AI 收到的内容在物理层面就是精简的。
  • Act Phase 4 Journey Sync — 条件步骤,当 Story 修改了 journey 相关步骤时自动更新 docs/e2e/journey.md。补全了 create→consume→update 生命周期闭环。
  • Plan Phase 3.2a Journey Segment — 条件性 Spec 标注,将 Story 与 journey 步骤关联,使 Act Phase 4 能自动检测是否需要同步。

2.12.0 — 2026-05-06

变更

  • Rules 架构重构 — 将 6 个全局核心 rules 合并为单个 pactkit.md;按需规则重新编号为 01-06,移至 ~/.claude/skills/_rules/。每次对话减少约 60% 的 context window 消耗。
  • 版本不匹配自动部署 — pipx upgrade pactkit 后,下一条 CLI 命令自动同步已部署文件,无需手动执行 pactkit init。

修复

  • deployer 中的硬编码路径 — _build_command_rules_header() 现在使用 FormatProfile.rules_dir / skills_dir 替代硬编码的 ~/.claude/ 路径。
  • 过期文件名引用 — 更新了 visualize.py、commands.py、lazy_visualize.py 和测试文件中的交叉引用,匹配新的规则文件名。

2.11.0 — 2026-04-25

新增

  • Lateral Scan(横向扫描) — Plan Phase 1 在写 Spec 前扫描重复模式。若与已有实现重叠 > 30%,Spec 必须包含 R0: 提取共享抽象 或明确声明技术债务。
  • DEFERRED 注释机制 — 跳过 SHOULD 要求时,代码中必须包含 # DEFERRED(SHOULD): R{N} — 原因 注释。Check 阶段新增覆盖率表格输出,追踪延迟项。

修复

  • pactkit.yaml 残留版本操作 — 移除 board.py 中的 update_version() 函数和 CLI 子命令,清理 prompts、agents、skills 文档中的所有过期引用。版本现在仅由 pyproject.toml + __init__.py 管理,部署标记位于 ~/.claude/.pactkit-version。
  • CI tree-sitter 依赖 — 在 CI workflow 中单独安装 tree-sitter 可选依赖。

2.10.6 — 2026-04-22

修复

  • L3 SHOULD 语义调整 — Signal Strength Convention L3 Recommended 从"违反=警告,非阻塞"改为"默认必须执行——跳过需说明理由"(RFC 2119)。防止 AI 系统性地延迟 SHOULD 任务。

2.10.5 — 2026-04-21

新增

  • Solution Design Protocol — 新增规则 12-solution-design.md,要求在实现前进行能力增量评估(框架原生 + 项目已有)。防止框架盲区、项目盲区和硬编码耦合。包含实现约束(禁止魔术值、开闭原则、单一职责、依赖方向)。集成到 Plan Phase 1 和 Act Phase 1。

变更

  • 全局版本追踪 — 版本追踪从项目级 pactkit.yaml 迁移至全局 ~/.claude/.pactkit-version 标记文件。消除通过 pipx 升级 PactKit 后的跨项目版本不同步问题。pactkit update --if-needed 现在检查全局标记而非项目 yaml。

2.10.4 — 2026-04-20

新增

  • Hotfix 影响检查 — /project-hotfix 新增 Phase 0.5,修复前读取已有的 .mmd 调用图文件。当目标函数有 3+ 调用者时发出警告。建议性(L3),非阻塞,无调用图时静默跳过。

2.10.3 — 2026-04-20

修复

  • pactkit clean 保护父级目录 — rglob("dist") 会匹配 node_modules/*/dist,破坏 npm 依赖内部文件。新增 _inside_protected() 守卫,保护 node_modules/ 和 .git/;含路径的模式改用直接匹配。
  • CI tree-sitter 测试 — CI workflow 现安装 [visualize] extras,Java/TS 分析器测试在 GitHub Actions 中通过。

2.10.2 — 2026-04-20

新增

  • PDCA 推荐协议 — AI 在自由对话中分析出可执行结论时,主动推荐合适的 PDCA 命令。触发矩阵映射信号到命令;抑制规则防止噪音。
  • 双维度 Harness 审计 — 审计现评分两个维度:Config(项目 + 全局配置,50 分)和 Code(测试、lint、复杂度、git 卫生,50 分)。JSON 输出包含 dimensions 拆分字段。
  • 统一 HTML 报告仪表盘 — 单页 report.html,包含标签切换、D3 力导向图、harness 分数环、层级条和热点面板。

修复

  • Shared Protocols Context.md 引用 — 补充 Context.md Canonical Format "Referenced by" 行中缺失的 Act Phase 4,确保 context.md 反映 Act 阶段进展。
  • 语义版本比较 — 版本不匹配警告现使用元组比较替代字符串相等,正确给出升级/降级方向。
  • Focus 调用图空输出 — 修复 focus 解析使用 LANG_PROFILES[stack].source_dirs 替代硬编码 src/ 前缀。

2.9.13 — 2026-04-15

修复

  • 精简核心依赖 — 将适配器包(pactkit-opencode、pactkit-codex)和 tree-sitter 绑定移至 [project.optional-dependencies]。核心 pip install pactkit 现在仅需 pyyaml。按需安装:pactkit[all]、pactkit[visualize]、pactkit[opencode]、pactkit[codex]。
  • Spec-lint CLI 回退 — Playbook 现包含 python3 -m pactkit spec-lint 回退路径,适用于 pactkit 不在 $PATH 的环境。
  • Board add_story 签名 — Plan playbook Phase 3.3 现显示完整的 add_story 调用签名,包含所有必需参数。

2.9.12 — 2026-04-02

新增

  • Copilot 部署适配器 — pactkit-copilot 适配器包通过 entry_points 注册。pactkit update --format copilot 部署 skills、commands、agents 和 copilot-instructions.md 到 .github/。
  • OCP 规则头分发 — _build_command_rules_header() 基于 profile.rules_import_style 分发,不再硬编码 profile 名称。
  • 多栈自动检测 — pactkit init 自动检测多栈并写入 stack: [python, typescript] 列表语法。
  • 两层模块图 — visualize --mode module 生成维度子图。
  • Prompt 模板同步 — 所有部署格式统一使用规范 prompt 模板渲染。

修复

  • OpenCode rules_import_style — 从 "instructions" 改为 "inline",匹配实际行为。

2.9.11 — 2026-04-01

修复

  • Rules 模板变量 — _deploy_rules() 现通过 _render_prompt() 渲染 {PROJECT_CONFIG_DIR} 等模板变量。此前 Codex/OpenCode 部署的 rules 包含原始模板字符串。
  • Copilot Agent YAML 损坏 — Agent tools: 字段被逐字符迭代([R, e, a, d, ...] → [Read, Write, ...])。
  • Copilot 重复注解 — (terminal only) (terminal only) 修复为单次注解。
  • Skill CLI 引用 — 所有 SKILL.md 文件现经过 _replace_slash_commands() 处理。

2.9.10 — 2026-04-01

修复

  • Skill 脚本 __future__ 导入 — load_script() 现将 from __future__ import annotations 提升到 _SHARED_HEADER 之前,修复部署的 spec_linter.py SyntaxError。
  • Lessons 表格自动修复 — append_lesson() 追加前调用 _repair_table_structure(),修复:缺失表头、错误表头格式、数据行在表头之前。

2.9.9 — 2026-04-01

新增

  • GitHub Copilot 适配器支持 — 新增 copilot FormatProfile。pactkit init --format copilot 部署到项目 .github/ 目录。
  • 动态 --format CLI 选项 — init、update、upgrade 命令从 VALID_FORMATS 动态派生选项,无需硬编码。

修复

  • 排除命令引用清理 — strip_excluded_command_references() 清理所有渲染 prompt 中被排除格式的 /project-sprint 引用。

2.9.4 — 2026-03-31

修复

  • Init playbook DIP 违规 — 消除 DETECTED_ENV 运行时 IDE 检测;所有硬编码路径替换为模板变量。
  • 全量 DIP 审计 — 修复 doctor skill、core-protocol 规则和 done 命令中的硬编码 IDE 路径。
  • tree-sitter 升级为核心依赖 — 不再可选;CI 安装已更新。
  • --focus 扫描优化 — _scan_files 现仅扫描聚焦子目录,不再扫描整个项目根目录。
  • SCAN_EXCLUDES 扩展 — 从 13 扩展到 30+ 条目,覆盖 Go、Java、Node、IDE 和 VCS 目录。

2.9.3 — 2026-03-31

新增

  • 多语言调用链修复(STORY-slim-069)— dispatch hint 注释解析(pactkit-trace: dispatches_to)和继承边链接从 Python 扩展到 Go(struct embedding)、Java(extends/implements)、TypeScript(class extends)的 tree-sitter 分析器。
  • CLI 可视化参数暴露(HOTFIX-slim-070)— --entry、--focus、--reverse、--depth、--max-nodes 现可通过 pactkit visualize CLI 访问。

修复

  • 4 类调用链断链(STORY-slim-068)— dict.update 扫描冲突、动态分发提示、抽象方法孤立节点、跨包 stub 边。
  • 嵌套子图 call graph(STORY-slim-067)— 支持 fan-in/fan-out 分析和子图分组。
  • 边去重 + 环修复(HOTFIX-slim-069)— 重复边使用 ×N 标签,消除假阳性环检测。

2.9.2 — 2026-03-30

修复

  • FormatProfile.excluded_commands — OpenCode/Codex 排除 project-sprint(需要子代理团队,仅 Claude Code 支持)。Doctor check_config_drift 现尊重格式级排除。
  • 冗余 pactkit.yaml 组件列表 — 移除 .opencode/pactkit.yaml 中的显式 agents/commands/skills/rules 列表(缺省 = 部署全部)。
  • 孤立 Spec 清理 — 移除 7 个已归档的旧前缀 Spec 文件。

2.9.1 — 2026-03-30

新增

  • 拓扑感知追踪 — ApiCallParser(tree-sitter-typescript)和 AgentParser(LangGraph/YAML/MCP)实现多拓扑代码追踪。Plan/Act 阶段新增拓扑门禁。

修复

  • Monorepo 子目录检测 — TopologyParser.detect() 现扫描直接子目录,修复 monorepo 布局的误判。
  • Doctor 误报漂移警告 — check_config_drift() 现搜索全局部署目录,而非仅项目本地路径。
  • 规范 lessons.md 表头 — Init 强制 | Date | Lesson | Context | 表头,防止 AI 自创列名。

2.9.0 — 2026-03-28

新增

  • pactkit init 默认部署所有 IDE 配置 — CLI 默认 --format all,一次性部署 Claude Code + OpenCode + Codex 配置,无需逐个指定 --format。

修复

  • 入口点部署器循环导入 — 延迟加载 entry_point 部署器,修复 pipx 环境下 pactkit init 的 ValueError。

2.8.0 — 2026-03-27

新增

  • 3-IDE 默认安装 — pip install pactkit 现在自动安装所有三个 IDE 适配器(Claude Code + OpenCode + Codex)。

修复

  • OpenCode 命令架构 — 将 OpenCode 从纯 skills 模式恢复为 commands/ + skills/ 双重架构。OpenCode 从 commands/*.md 自动发现命令,而 skills/ 中的嵌入式技能由 AI 代理按需加载。
  • Spec 版本混淆 — /project-plan 不再从 pactkit.yaml(工具版本)读取版本号。现在明确从项目清单(pyproject.toml、package.json)读取。

变更

  • 跨 IDE 命令架构:
    • Claude Code:纯 skills(skills/project-*/SKILL.md),前缀 /
    • OpenCode:commands + skills(commands/project-*.md + skills/pactkit-*/SKILL.md),前缀 /
    • Codex:纯 skills(skills/project-*/SKILL.md),前缀 $

2.7.0 — 2026-03-27

新增

  • Commands → Skills 迁移(STORY-slim-063)— 11 个 PDCA 命令现以 skills/{name}/SKILL.md 子目录格式部署(Claude Code 格式)。VALID_SKILLS 从 10 扩展至 21 项。
  • 旧版命令清理 — 升级时自动移除 commands/ 中的旧版 project-*.md 文件。
  • Codex FormatProfile(STORY-slim-060)— 在核心中重新添加 codex profile 以支持薄适配器模式。pactkit-codex 首次发布至 PyPI。
  • 3 包协调发布 — 首次同时发布 pactkit、pactkit-opencode 和 pactkit-codex。

修复

  • board.py update_task(HOTFIX-slim-061)— 现可识别项目符号格式的 Done 区域条目。
  • visualize --lazy focus(HOTFIX-slim-062)— 移除硬编码的 focus 刷新;新增文件名匹配。

变更

  • 统一部署摘要显示 Skills (embedded + commands) 计数。
  • 跨格式隔离:Skills 迁移不影响 OpenCode 和 Codex。

2.6.0 — 2026-03-26

新增

  • DeployerProtocol & DeployerBase(STORY-slim-057)— 提取 deployer 接口和共享基类,采用注册表模式实现基于适配器的插件架构。
  • pactkit-opencode 适配器包(STORY-slim-058)— 将所有 8 个 OpenCode 专属函数提取为独立包,通过 entry_points 自动注册。
  • 入口点自动发现 — 导入时扫描 pactkit.deployers 入口点组,实现零配置适配器注册。

移除

  • Codex Profile(STORY-slim-059)— 移除废弃的 codex FormatProfile 及所有引用。VALID_FORMATS 通过 FORMAT_PROFILES.keys() 自动收缩。
  • 核心中的 OpenCode 函数 — 8 个函数(约 300 行)迁移至 pactkit-opencode 适配器。deployer.py 体积减少 17%。

变更

  • deploy() 通过注册表分发,替代 if/elif 链。新格式只需调用 register_deployer()。

2.5.0 — 2026-03-26

新增

  • E2E CLI 覆盖率 100% — 60 个基于子进程的 E2E 测试,覆盖全部 25 个 CLI 子命令
  • python -m pactkit — 包支持模块调用方式作为替代入口

修复

  • Mermaid 引号注入 — 文件/函数名包含 " 不再破坏 .mmd 图表渲染
  • O(N×E) 被调用者解析 — _resolve_callee() 使用预建后缀索引实现 O(1) 查找
  • 模块索引冲突 — 不同目录下同名文件不再导致节点静默丢失
  • Focus 子串误匹配 — --focus auth.py 不再匹配 oauth.py
  • BFS O(N²) Pop — 所有 BFS 位置改用 deque.popleft() 替代 list.pop(0)
  • 非原子写入 — pactkit.yaml、.mmd 文件和 atomic_write() 均使用 tmp+rename 模式
  • Deployer 编码 — 3 处裸 read_text() 调用指定 encoding='utf-8'
  • 大文件 OOM — MAX_FILE_BYTES=1MB 防护避免自动生成的超大文件导致 OOM
  • Sprint 冗余操作 — 消除重复的 visualize/clean/context 运行

2.4.1 — 2026-03-26

修复

  • CI 模板覆盖 — pactkit update 不再覆盖 pactkit.yaml 中自定义的 ci.install_cmd
  • Board ID 验证 — 现支持开发者前缀 ID(HOTFIX-slim-052、STORY-alice-001)

新增

  • Board move_story 命令 — 通过 CLI 在看板分区间移动 Story
  • PyPI 自动发布 — Tag 触发 CI 通过可信发布者(OIDC)自动发布到 PyPI

变更

  • 闭源迁移 — 源码仓库转为私有;公共入口移至 pactkit-public

2.4.0 — 2026-03-25

新增

  • 多架构拓扑分析 — pactkit visualize 现在理解代码结构之外的 3 种项目拓扑:
    • PDCA 拓扑 — 工作流图中的 Plan→Act→Check→Done 序列边
    • 服务拓扑 — 解析 docker-compose.yml、openapi.yaml、*.proto 生成服务依赖图
    • 前端拓扑 — 解析 Next.js(App/Pages Router)、Vue Router 生成 page→component→hook→store 链
    • 跨拓扑影响 — 回归分析横跨所有拓扑类型
    • 统一分层图 — 将代码 + 拓扑维度合并为一张可视化图

修复

  • 拓扑自动检测可靠性提升
  • CI 多语言测试覆盖的依赖配置
  • Spec/PRD 交叉引用一致性(4 处问题)

2.3.0 — 2026-03-22

新增

  • 25 个确定性 CLI 子命令 — 核心操作现在以 Python 代码运行,而非 prompt:clean、regression、context、lint、test-map、coverage-gate、doctor、spec-lint、spec-status 等
  • 覆盖率门禁 — pactkit coverage-gate 执行三级阈值(≥80% 通过、50-79% 警告、<50% 阻止)
  • 自动版本同步 — pactkit update --if-needed 版本匹配时跳过重部署
  • E2E 测试框架 — pactkit.yaml 中的配置驱动 E2E 策略
  • Spec Linter 增强 — W007 需求-AC 覆盖检查、W008 占位符检测、E007 按子节验证

修复

  • Plan 阶段大型 Spec 生成卡顿(拆分为子步骤)
  • Explore 子代理无界搜索(有界委托模式)
  • 25+ 处 CLI 与 prompt 交叉引用完整性缺口

2.2.0 — 2026-03-20

新增

  • 上下文感知规则加载 — 每个命令只加载所需规则,token 使用量减少 20-83%
  • 栈感知 CI 流水线 — 支持 Python、Node.js、Go、Java,配置正确的 setup 和测试运行器
  • GitHub Enterprise (GHE) 支持 — ci.github_host 和 ci.actions_ref 配置

2.1.0 — 2026-03-17

新增

  • 多格式部署 — 新增 AI 工具格式只需一个注册表条目,所有下游代码自动适配
  • 模板变量 — 48 个硬编码路径替换为部署时解析的命名占位符
  • 文档 Schema 注册表 — pactkit schema [type] CLI 查看文档结构规则
  • 懒加载规则 — 每轮系统 prompt 开销减少 62%

修复

  • /project-init 环境检测改进
  • 配置合并时保留用户条目(不再覆盖)

早期版本

  • 1.5.0 — PDCA 质量门禁、基于影响的回归、Done/Release/PR 命令拆分、社区标准
  • 1.4.0 — Spec Linter(14 条规则)、主动澄清门禁、Act 前一致性检查、自动 PR
  • 1.3.0 — CI/CD 流水线生成、Issue 追踪集成、Hook 模板、Doctor 诊断
  • 1.0.0 — 首次公开发布。9 个 Agent、13 个命令、3 个 Skill、6 条宪章规则

目录

4.1.0 — 2026-10-02升级编排(必读)新增修复说明4.0.0 — 2026-09-26升级编排(必读)移除变更说明3.1.0 — 2026-09-25移除变更说明3.0.4 — 2026-09-24升级新增变更修复3.0.3 — 2026-09-21修复3.0.2 — 2026-09-21修复新增3.0.1 — 2026-09-19迁移(3.0.0 → 3.0.1)新增修复3.0.0 — 2026-09-18迁移(2.27.0 → 3.0.0)新增变更修复2.27.0 — 2026-09-17Migration (2.26.1 → 2.27.0)AddedFixed — 六轮对抗评审(34 条)2.26.1 — 2026-09-15Fixed2.26.0 — 2026-09-15Migration (2.25.2 → 2.26.0)AddedFixedChanged2.25.2 — 2026-09-02修复2.25.1 — 2026-09-01修复2.25.0 — 2026-08-30新增修复变更2.24.2 — 2026-08-27修复2.24.1 — 2026-08-27修复2.24.0 — 2026-08-27新增2.23.0 — 2026-08-27新增修复移除 / 弃用2.22.0 — 2026-08-24新增修复2.21.0 — 2026-08-24新增变更修复2.20.0 — 2026-08-22新增修复2.19.0 — 2026-08-17新增2.18.0 — 2026-08-17新增修复2.17.0 — 2026-08-13新增变更修复2.16.1 — 2026-07-23修复2.16.0 — 2026-07-13新增2.15.2 — 2026-07-02变更修复重构2.15.1 — 2026-06-10新增修复2.14.2 — 2026-06-01新增变更修复2.14.0 — 2026-05-26新增移除变更2.13.0 — 2026-05-07新增2.12.0 — 2026-05-06变更修复2.11.0 — 2026-04-25新增修复2.10.6 — 2026-04-22修复2.10.5 — 2026-04-21新增变更2.10.4 — 2026-04-20新增2.10.3 — 2026-04-20修复2.10.2 — 2026-04-20新增修复2.9.13 — 2026-04-15修复2.9.12 — 2026-04-02新增修复2.9.11 — 2026-04-01修复2.9.10 — 2026-04-01修复2.9.9 — 2026-04-01新增修复2.9.4 — 2026-03-31修复2.9.3 — 2026-03-31新增修复2.9.2 — 2026-03-30修复2.9.1 — 2026-03-30新增修复2.9.0 — 2026-03-28新增修复2.8.0 — 2026-03-27新增修复变更2.7.0 — 2026-03-27新增修复变更2.6.0 — 2026-03-26新增移除变更2.5.0 — 2026-03-26新增修复2.4.1 — 2026-03-26修复新增变更2.4.0 — 2026-03-25新增修复2.3.0 — 2026-03-22新增修复2.2.0 — 2026-03-20新增2.1.0 — 2026-03-17新增修复早期版本