feat(onboard/parity): 写入汇 WriteSink 与写入前计划 plan_onboarding,处置独立审查(P8c) #36

Merged
lanrtop merged 6 commits from feat/agent-client-parity-p8c into master 2026-10-03 09:59:15 +08:00

6 Commits

Author SHA1 Message Date
lanrtop
7ef924127a docs(blueprint/agent-client-parity): P8c 补审查处置与 known_limits,P8d 记审查转入项(P8c)
All checks were successful
Push & PR Check / check (push) Successful in 1m3s
Push & PR Check / check (pull_request) Successful in 1m3s
- review:独立审查 9 条发现逐条处置(7 条已修并补测试,2 条信息项转入 known_limits / P8d)。
- 自查条目「任一目标文件变化 digest 就变 ✅」改为准确语义(只绑定计划会写入或核对的文件,
  update 另绑定写入前哈希);按纪律报备:改的是验收表述,断言只增不减。
- known_limits:onboard 反向依赖投影层(过渡态)、Codex 信任静态预判的边界、shim unavailable 不阻断、
  bypassPermissions 未单列、plan_machine_steps 组装未单测。
- P8d 卡新增「审查转入」:bypass_permissions 单列、machine_changes 补产品组与 buff、.git/hooks,待统筹决定是否并入 acceptance。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 10:54:04 +09:00
lanrtop
479f4ac2cd fix(onboard/parity): 处置 P8c 独立审查——Codex 信任改进 next_actions、存在即跳过只判存在、token 步区分 needs_repair(P8c)
- Codex 未信任不再并入 blocked:计划新增 codex_trust 与 next_actions 字段,未信任或读不出
  Codex 配置只进 next_actions,不阻断、不进 digest;「本机步骤 → 阻断项」抽成纯函数 machine_step_blocker。
- WriteSink 新增 exists():dispatch_one 只判存在,已存在的非 UTF-8 文件(UTF-16 lefthook.yml 等)
  恢复为 skipped(修复 apply_onboarding_pack 回归);全托管文件读不出仍记 failed。
- token 步改用只读 mcp_auth_token_state 区分 Present / Missing / NeedsRepair,needs_repair 记 needs_human,
  与 get_or_create_mcp_auth_token 的分支一一对应;is_project_injected 仍只作「已接入」判据。
- Codex 信任去掉未验证的祖先目录规则,候选为项目根 + git 主仓库根(worktree 继承主仓库信任);
  键解析按 TOML 规则处理字面量键、基本字符串转义、[projects] 内联表与点号键;删掉非法 TOML 的假阳性用例。
- 写入序列只留一份:抽出 write_project_identity_files_with,inject 与 plan 共用;删除 write_project_mcp_files_with。
- digest 绑定 update 文件的写入前哈希(before_sha256),模块文档写明准确语义。
- 新增 WriteFailure,阻断项指向真正出错的文件;本机 codex 步指向 .codex/config.toml,blocked 按(target, reason)去重。

cargo test 318 passed / 0 failed / 5 ignored(新增 7 条),cargo check 0 warning;两轮变异验证均被对应用例捕获。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 10:53:41 +09:00
lanrtop
04a0069363 docs(blueprint/agent-client-parity): P8c 标 🔵,补实现、验证、自查与有意偏差(P8c)
All checks were successful
Push & PR Check / check (push) Successful in 1m3s
- 实现:WriteSink/DiskSink、三处分发改经写入汇、onboard/plan.rs 记录汇与计划/digest、
  mcp_inject 本机侧预计动作;合并 master(PR #34)自动合并无冲突。
- 验证:合并后 cargo test 310 passed,补测试后 311 passed / 0 failed / 5 ignored;变异记录。
- 自查:acceptance 逐条对照;有意偏差为计划阶段完全不起 claude CLI(比「假 CLI 只收到 mcp get」更严)、
  文件动作只有 create/update/noop、DiskSink 读失败报错不覆盖。
- 自查发现留待独立审查:非 UTF-8 已存在文件由 skipped 变 failed;bypassPermissions 未在计划单列;
  Codex 信任解析不识别基本字符串转义段头。T1:plan_onboarding 尚无投影,project-context.yaml 由 P8e 补。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 10:09:04 +09:00
lanrtop
a3d1cc169b test(onboard/parity): 补「计划即实际写入」端到端测试,修正 plan_onboarding 只读注释(P8c 收尾)
- plan_predicts_exactly_what_apply_writes:空仓库先 plan 再经 DiskSink apply,逐文件比对计划内容哈希与
  实际写入,并核对 git status 的文件集合与计划一致。P8d 的 digest 复核依赖这条不变式;
  变异 PlanSink::read 忽略待写内容时,原有 plan 端到端测试仍通过,只有本测试与记录汇单元测试失败。
- mcp_inject::plan_onboarding 注释由「不起子进程」改为「不起客户端 CLI,混合文件预警会起只读 git」,
  与 has_uncommitted_outside_managed 的实际行为一致。

cargo test 311 passed / 0 failed / 5 ignored。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 10:08:43 +09:00
lanrtop
ea8ed26191 chore(merge): 合并 master(PR #34 重复登记修复 U1/U2)到 P8c 分支
自动合并,无冲突(mcp_inject.rs、commands/onboarding.rs、mcp_tools.rs 双方改动区域不重叠)。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 09:58:15 +09:00
lanrtop
ef2c7fd593 feat(onboard/parity): 写入汇 WriteSink 与写入前计划 plan_onboarding(P8c,待独立审查)
All checks were successful
Push & PR Check / check (push) Successful in 1m2s
一键接入改写子项目受版本管理的文件,人在确认前必须看得到改什么;计划与 apply 走同一段
分发代码、只换写入汇,所以「看到的」就是「将写的」。

- lib.rs:WriteSink trait(read/write,内容忽略行尾未变不写)与 DiskSink
- 接入包模板分发、蓝图规则同步、项目身份与 MCP 投影(context、settings 兼容条目、
  liangjing、Codex 托管块)全部改经写入汇;原入口改为 DiskSink 薄包装,行为不变
- onboard/plan.rs:PlanSink 只记录不落盘、后续步骤读到前面步骤的待写内容;
  write_project_files 为 plan 与 apply 共用的写入序列;plan_onboarding 给出逐文件
  create/update/noop、有上限的 diff、混合文件预警(P10 前移到写入前)、身份冲突、
  手写条目与共享项目键阻断项,并对计划算 digest
- mcp_inject:plan_onboarding 生产入口与本机侧预计动作(token、稳定入口、三端只读
  状态、Codex 信任),只读、不起子进程
- 新增测试:空仓库全 create 且目录快照字节不变、apply 后两次计划全 noop 且 digest
  相同、CRLF 判 noop、内容/本机状态变化 digest 变化、混合文件与身份冲突阻断、
  手写 Codex 条目与共享键阻断、记录汇覆盖与撤销、diff 截断、Codex 信任解析;
  cargo test 307 passed

Feature-Confirmed: true
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 09:35:24 +09:00