From 91d25a3ed1b674eb34f6a3ed0b5e590af228eef1 Mon Sep 17 00:00:00 2001 From: weichen Date: Mon, 5 Oct 2026 15:00:20 +0000 Subject: [PATCH] Fix two finish-guard false positives: IDE locks and remote-only refs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Why: 2026-10-05 两次实测踩到——①rglob("*.lock") 把 .git/cursor/ IDE 产物当 Git 锁 (五天陈锁阻断 worktree 回收);②pinned-history 用 --all --reflog 把 refs/remotes 计入,pin 在 feature 顶端的子仓永远无法 finish(被迫删远端引用+清 reflog 损害现场)。 Evidence: FinishGuardFixTests 四例全绿(误报修复+真实锁仍拦+独有提交仍保); 全套治理回归 91 例 OK;make test 全链证据入卡。 Impact: 仅 finish 模式两处判定;IDE 产物与远端引用不再误伤,本地独有工作保全语义不变。 Refs: 本仓 governance 收尾实录(EXT-1 与 governance-reliability 两轮)。 --- .task/feature-finish-guard-fixes.md | 82 ++++++++++++++- scripts/check-worktree.py | 33 +++++- tests/test_task.py | 150 ++++++++++++++++++++++++++++ 3 files changed, 258 insertions(+), 7 deletions(-) diff --git a/.task/feature-finish-guard-fixes.md b/.task/feature-finish-guard-fixes.md index b6b06787..b78d52f1 100644 --- a/.task/feature-finish-guard-fixes.md +++ b/.task/feature-finish-guard-fixes.md @@ -29,9 +29,9 @@ ## 结果与验证(完成后填写) -- 结果: -- 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表> -- 影响与剩余项: +- 结果:两处 finish 守卫修复——①锁扫描收窄为 Git 真实锁语义(common 的 config.lock/shallow.lock + git-path 锁/活动操作标记清单,含 gc.pid),`.git/cursor/` 等 IDE 产物不再误报;②子仓 pinned-history 改为 `local_work_outside`:仅本地分支(--branches)+ stash + HEAD reflog 的独有提交,refs/remotes 一律不算(远端有副本即已保全)——pin 在 feature 顶端的子仓不再永久卡死。 +- 验证:新增 FinishGuardFixTests 四例全绿(IDE 产物锁不阻且文件原样保留 / 真实 config.lock 仍拦 / 远端跟踪引用+克隆 reflog 不阻且 worktree 回收 / 本地独有提交仍保全分支);全套治理回归 91 例 OK;make test 全链见证据表。 +- 影响与剩余项:仅 scripts/check-worktree.py 两处 + tests/test_task.py 追加;verify/before-sync 等其他模式语义不变。 ```json @@ -70,3 +70,79 @@ "receipt_sha256": "51f697c4c69d8d2e9768f23b6a9728909f8d42464c3fda92f7bbd397873fa2e2" } ``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-05T14:58:54.101012+00:00", + "command": "make test-governance", + "command_sha256": "9776a8dfcfb8f4c95abc94c40cae3a2c0e91e8f4b91fe95d98085c290e929158", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-finish-guard-fixes", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "df23fcab5624e506e53bcd7186ad86d9b243c9f5", + "branch": "feature/finish-guard-fixes", + "target_branch": "main", + "target_head": "4edec763fff1b8239e203dc9106f16a241ca343d", + "status": " M scripts/check-worktree.py\n M tests/test_task.py\n", + "tracked_diff_sha256": "a2db2799f92ea1de54e4f55e541b290488959f7f79c564091aa46121220734e2", + "untracked": {}, + "submodules": " cc1ad7749816afe129f81bcf0732d0ca7c789d10 deps/agent-command (remotes/origin/feature/core-v0-1-gcc1ad77)\n ed2af3e6048928b1fd0ba6da1f9d0c1bafec82d4 deps/agent-command/deps/development-guidelines (remotes/origin/feature/delivery-mechanism-5-ged2af3e)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 3a110a728cf520cfbbbafc0c4c75f14bf78bec3f deps/agent-native (remotes/origin/feature/agent-harness-p1-27-g3a110a7)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf deps/agent-native/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-native/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-native/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-native/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-native/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 5a57636cc0b8426a86a72bbbdd5b7f30e4fcac88 deps/agent-squad (remotes/origin/feature/agent-harness-p1-27-g5a57636)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf deps/agent-squad/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 3a110a728cf520cfbbbafc0c4c75f14bf78bec3f deps/agent-squad/deps/agent-native (remotes/origin/feature/agent-harness-p1-27-g3a110a7)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf deps/agent-squad/deps/agent-native/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/agent-native/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/agent-native/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/logging-system/deps/development-guidelines (26b562d)\n af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cb26e4c9473f75ad015a83e3bba8137a08ff56f9 modules/backend (remotes/origin/feature/ext-1-inproc-handler)\n cc1ad7749816afe129f81bcf0732d0ca7c789d10 modules/backend/deps/agent-command (remotes/origin/feature/core-v0-1-gcc1ad77)\n ed2af3e6048928b1fd0ba6da1f9d0c1bafec82d4 modules/backend/deps/agent-command/deps/development-guidelines (remotes/origin/feature/delivery-mechanism-5-ged2af3e)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf modules/backend/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 3a110a728cf520cfbbbafc0c4c75f14bf78bec3f modules/backend/deps/agent-native (remotes/origin/feature/agent-harness-p1-27-g3a110a7)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf modules/backend/deps/agent-native/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-native/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-native/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-native/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-native/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 5a57636cc0b8426a86a72bbbdd5b7f30e4fcac88 modules/backend/deps/agent-squad (remotes/origin/feature/agent-harness-p1-27-g5a57636)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf modules/backend/deps/agent-squad/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-squad/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-squad/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 3a110a728cf520cfbbbafc0c4c75f14bf78bec3f modules/backend/deps/agent-squad/deps/agent-native (remotes/origin/feature/agent-harness-p1-27-g3a110a7)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-squad/deps/agent-native/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-squad/deps/agent-native/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-squad/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-squad/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/logging-system/deps/development-guidelines (26b562d)\n 0b5c7747a3165bf0d0f2219204b7b70ec3ed7645 modules/backend/deps/agent-system-core (remotes/origin/feature/agent-harness-p3b-12-g0b5c774)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/logging-system/deps/development-guidelines (26b562d)\n 0b5c7747a3165bf0d0f2219204b7b70ec3ed7645 modules/core (remotes/origin/feature/agent-harness-p3b-12-g0b5c774)\n 19e89ae10bd93306400f13a9a1f449cbc5bfaa42 modules/documents (remotes/origin/feature/governance-docs)\n 50c724460159171254242ae48e956a80f4eb9c7e modules/frontend (heads/main)\n 2cb1496320dda6e65501ac94318295f067231dd7 modules/ui (remotes/origin/feature/governance-docs)\n" + }, + "after": { + "head": "df23fcab5624e506e53bcd7186ad86d9b243c9f5", + "branch": "feature/finish-guard-fixes", + "target_branch": "main", + "target_head": "4edec763fff1b8239e203dc9106f16a241ca343d", + "status": " M scripts/check-worktree.py\n M tests/test_task.py\n", + "tracked_diff_sha256": "a2db2799f92ea1de54e4f55e541b290488959f7f79c564091aa46121220734e2", + "untracked": {}, + "submodules": " cc1ad7749816afe129f81bcf0732d0ca7c789d10 deps/agent-command (remotes/origin/feature/core-v0-1-gcc1ad77)\n ed2af3e6048928b1fd0ba6da1f9d0c1bafec82d4 deps/agent-command/deps/development-guidelines (remotes/origin/feature/delivery-mechanism-5-ged2af3e)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 3a110a728cf520cfbbbafc0c4c75f14bf78bec3f deps/agent-native (remotes/origin/feature/agent-harness-p1-27-g3a110a7)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf deps/agent-native/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-native/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-native/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-native/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-native/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 5a57636cc0b8426a86a72bbbdd5b7f30e4fcac88 deps/agent-squad (remotes/origin/feature/agent-harness-p1-27-g5a57636)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf deps/agent-squad/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 3a110a728cf520cfbbbafc0c4c75f14bf78bec3f deps/agent-squad/deps/agent-native (remotes/origin/feature/agent-harness-p1-27-g3a110a7)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf deps/agent-squad/deps/agent-native/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/agent-native/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/agent-native/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/logging-system/deps/development-guidelines (26b562d)\n af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cb26e4c9473f75ad015a83e3bba8137a08ff56f9 modules/backend (remotes/origin/feature/ext-1-inproc-handler)\n cc1ad7749816afe129f81bcf0732d0ca7c789d10 modules/backend/deps/agent-command (remotes/origin/feature/core-v0-1-gcc1ad77)\n ed2af3e6048928b1fd0ba6da1f9d0c1bafec82d4 modules/backend/deps/agent-command/deps/development-guidelines (remotes/origin/feature/delivery-mechanism-5-ged2af3e)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf modules/backend/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 3a110a728cf520cfbbbafc0c4c75f14bf78bec3f modules/backend/deps/agent-native (remotes/origin/feature/agent-harness-p1-27-g3a110a7)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf modules/backend/deps/agent-native/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-native/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-native/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-native/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-native/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 5a57636cc0b8426a86a72bbbdd5b7f30e4fcac88 modules/backend/deps/agent-squad (remotes/origin/feature/agent-harness-p1-27-g5a57636)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf modules/backend/deps/agent-squad/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-squad/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-squad/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 3a110a728cf520cfbbbafc0c4c75f14bf78bec3f modules/backend/deps/agent-squad/deps/agent-native (remotes/origin/feature/agent-harness-p1-27-g3a110a7)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-squad/deps/agent-native/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-squad/deps/agent-native/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-squad/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-squad/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/logging-system/deps/development-guidelines (26b562d)\n 0b5c7747a3165bf0d0f2219204b7b70ec3ed7645 modules/backend/deps/agent-system-core (remotes/origin/feature/agent-harness-p3b-12-g0b5c774)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/logging-system/deps/development-guidelines (26b562d)\n 0b5c7747a3165bf0d0f2219204b7b70ec3ed7645 modules/core (remotes/origin/feature/agent-harness-p3b-12-g0b5c774)\n 19e89ae10bd93306400f13a9a1f449cbc5bfaa42 modules/documents (remotes/origin/feature/governance-docs)\n 50c724460159171254242ae48e956a80f4eb9c7e modules/frontend (heads/main)\n 2cb1496320dda6e65501ac94318295f067231dd7 modules/ui (remotes/origin/feature/governance-docs)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-finish-guard-fixes'\nPYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -p 'test_*.py' -v\ntest_candidate_cannot_read_checkout_credentials (test_ci_credentials.CheckoutTests.test_candidate_cannot_read_checkout_credentials) ... ok\ntest_candidate_submodule_update_commands_are_rejected (test_ci_credentials.CheckoutTests.test_candidate_submodule_update_commands_are_rejected) ... ok\ntest_credential_destination_confined_to_injected_server (test_ci_credentials.CheckoutTests.test_credential_destination_confined_to_injected_server) ... ok\ntest_external_or_unlisted_urls_are_rejected_before_component_fetch (test_ci_credentials.CheckoutTests.test_external_or_unlisted_urls_are_rejected_before_component_fetch) ... ok\ntest_inherited_template_hook_does_not_execute_with_credentials (test_ci_credentials.CheckoutTests.test_inherited_template_hook_does_not_execute_with_credentials) ... ok\ntest_nested_external_url_is_rejected_before_authenticated_fetch (test_ci_credentials.CheckoutTests.test_nested_external_url_is_rejected_before_authenticated_fetch) ... ok\ntest_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials (test_ci_credentials.CheckoutTests.test_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials) ... ok\ntest_redirects_do_not_forward_credential_or_fetch_unlisted_target (test_ci_credentials.CheckoutTests.test_redirects_do_not_forward_credential_or_fetch_unlisted_target) ... ok\ntest_after_snapshot_failure_keeps_command_exit_and_output (test_evidence.EvidenceTests.test_after_snapshot_failure_keeps_command_exit_and_output) ... ok\ntest_all_persisted_and_displayed_text_is_sanitized (test_evidence.EvidenceTests.test_all_persisted_and_displayed_text_is_sanitized) ... ok\ntest_authorization_forms_are_redacted_in_capture_console_and_import (test_evidence.EvidenceTests.test_authorization_forms_are_redacted_in_capture_console_and_import) ... ok\ntest_authorization_forms_are_redacted_on_direct_card_capture (test_evidence.EvidenceTests.test_authorization_forms_are_redacted_on_direct_card_capture) ... ok\ntest_before_after_heads_do_not_relabel_changed_command (test_evidence.EvidenceTests.test_before_after_heads_do_not_relabel_changed_command) ... ok\ntest_capture_does_not_overwrite_an_existing_receipt (test_evidence.EvidenceTests.test_capture_does_not_overwrite_an_existing_receipt) ... ok\ntest_capture_without_card_and_import_without_rerun (test_evidence.EvidenceTests.test_capture_without_card_and_import_without_rerun) ... ok\ntest_child_failure_code_is_preserved (test_evidence.EvidenceTests.test_child_failure_code_is_preserved) ... ok\ntest_command_line_token_arguments_are_redacted (test_evidence.EvidenceTests.test_command_line_token_arguments_are_redacted) ... ok\ntest_dirty_and_untracked_contents_have_object_digests (test_evidence.EvidenceTests.test_dirty_and_untracked_contents_have_object_digests) ... ok\ntest_failed_child_exit_survives_receipt_write_failure (test_evidence.EvidenceTests.test_failed_child_exit_survives_receipt_write_failure) ... ok\ntest_full_output_is_preserved_not_only_tail (test_evidence.EvidenceTests.test_full_output_is_preserved_not_only_tail) ... ok\ntest_import_missing_card_fails_without_losing_receipt (test_evidence.EvidenceTests.test_import_missing_card_fails_without_losing_receipt) ... ok\ntest_import_rejects_unredacted_authorization_with_valid_checksums (test_evidence.EvidenceTests.test_import_rejects_unredacted_authorization_with_valid_checksums) ... ok\ntest_import_retry_is_idempotent (test_evidence.EvidenceTests.test_import_retry_is_idempotent) ... ok\ntest_invalid_field_types_and_forged_source_are_rejected (test_evidence.EvidenceTests.test_invalid_field_types_and_forged_source_are_rejected) ... ok\ntest_known_secret_environment_value_is_redacted_without_label (test_evidence.EvidenceTests.test_known_secret_environment_value_is_redacted_without_label) ... ok\ntest_linked_worktree_import_preserves_source_identity (test_evidence.EvidenceTests.test_linked_worktree_import_preserves_source_identity) ... ok\ntest_missing_card_does_not_execute (test_evidence.EvidenceTests.test_missing_card_does_not_execute) ... ok\ntest_missing_required_snapshot_fields_are_rejected (test_evidence.EvidenceTests.test_missing_required_snapshot_fields_are_rejected) ... ok\ntest_nested_cwd_records_untracked_files_from_repository_root (test_evidence.EvidenceTests.test_nested_cwd_records_untracked_files_from_repository_root) ... ok\ntest_output_digest_checked_even_if_receipt_digest_recomputed (test_evidence.EvidenceTests.test_output_digest_checked_even_if_receipt_digest_recomputed) ... ok\ntest_pipeline_failure_is_recorded_and_returned (test_evidence.EvidenceTests.test_pipeline_failure_is_recorded_and_returned) ... ok\ntest_quoted_credentials_with_spaces_are_fully_redacted (test_evidence.EvidenceTests.test_quoted_credentials_with_spaces_are_fully_redacted) ... ok\ntest_receipt_write_failure_cannot_claim_success (test_evidence.EvidenceTests.test_receipt_write_failure_cannot_claim_success) ... ok\ntest_recorder_environment_does_not_leak_into_nested_commands (test_evidence.EvidenceTests.test_recorder_environment_does_not_leak_into_nested_commands) ... ok\ntest_source_cannot_be_promoted_by_environment (test_evidence.EvidenceTests.test_source_cannot_be_promoted_by_environment) ... ok\ntest_tamper_is_rejected_before_card_append (test_evidence.EvidenceTests.test_tamper_is_rejected_before_card_append) ... ok\ntest_unrelated_repo_cannot_import (test_evidence.EvidenceTests.test_unrelated_repo_cannot_import) ... ok\ntest_validate_precheck_checks_result_and_current_base (test_evidence.EvidenceTests.test_validate_precheck_checks_result_and_current_base) ... ok\ntest_validate_precheck_rejects_successful_arbitrary_command (test_evidence.EvidenceTests.test_validate_precheck_rejects_successful_arbitrary_command) ... ok\ntest_ide_lock_in_git_dir_does_not_block_finish (test_task.FinishGuardFixTests.test_ide_lock_in_git_dir_does_not_block_finish) ... ok\ntest_local_unique_commit_still_preserved (test_task.FinishGuardFixTests.test_local_unique_commit_still_preserved) ... ok\ntest_real_git_lock_still_blocks_finish (test_task.FinishGuardFixTests.test_real_git_lock_still_blocks_finish) ... ok\ntest_remote_tracking_refs_do_not_block_finish (test_task.FinishGuardFixTests.test_remote_tracking_refs_do_not_block_finish) ... ok\ntest_finish_abandon_retains_local_remote_tips_and_reason (test_task.TaskLifecycleTests.test_finish_abandon_retains_local_remote_tips_and_reason) ... ok\ntest_finish_abandon_without_reason_preserves_checkout_and_refs (test_task.TaskLifecycleTests.test_finish_abandon_without_reason_preserves_checkout_and_refs) ... ok\ntest_finish_clean_worktree_has_accurate_remote_result (test_task.TaskLifecycleTests.test_finish_clean_worktree_has_accurate_remote_result) ... ok\ntest_finish_deletes_only_merged_remote_branch (test_task.TaskLifecycleTests.test_finish_deletes_only_merged_remote_branch) ... ok\ntest_finish_preserves_component_commits_off_the_pinned_head (test_task.TaskLifecycleTests.test_finish_preserves_component_commits_off_the_pinned_head) ... ok\ntest_finish_preserves_component_untracked_file (test_task.TaskLifecycleTests.test_finish_preserves_component_untracked_file) ... ok\ntest_finish_preserves_linked_component_worktrees_at_the_pinned_head (test_task.TaskLifecycleTests.test_finish_preserves_linked_component_worktrees_at_the_pinned_head) ... ok\ntest_finish_preserves_linked_nested_component_worktree (test_task.TaskLifecycleTests.test_finish_preserves_linked_nested_component_worktree) ... ok\ntest_finish_preserves_locked_worktree (test_task.TaskLifecycleTests.test_finish_preserves_locked_worktree) ... ok\ntest_finish_preserves_main_and_active_index_lock (test_task.TaskLifecycleTests.test_finish_preserves_main_and_active_index_lock) ... ok\ntest_finish_preserves_modified_untracked_and_ignored_files (test_task.TaskLifecycleTests.test_finish_preserves_modified_untracked_and_ignored_files) ... ok\ntest_finish_preserves_remote_unmerged_tip (test_task.TaskLifecycleTests.test_finish_preserves_remote_unmerged_tip) ... ok\ntest_finish_recycles_clean_submodule_without_shared_config_changes (test_task.TaskLifecycleTests.test_finish_recycles_clean_submodule_without_shared_config_changes) ... ok\ntest_finish_rejects_subdirectory_without_deleting_it (test_task.TaskLifecycleTests.test_finish_rejects_subdirectory_without_deleting_it) ... ok\ntest_finish_remote_deletion_lease_preserves_concurrent_update (test_task.TaskLifecycleTests.test_finish_remote_deletion_lease_preserves_concurrent_update) ... ok\ntest_finish_requires_writer_exit_confirmation (test_task.TaskLifecycleTests.test_finish_requires_writer_exit_confirmation) ... ok\ntest_precheck_feature_behind_requires_sync (test_task.TaskLifecycleTests.test_precheck_feature_behind_requires_sync) ... ok\ntest_precheck_rejects_unreachable_authority (test_task.TaskLifecycleTests.test_precheck_rejects_unreachable_authority) ... ok\ntest_start_imports_precheck_and_creates_four_part_commit (test_task.TaskLifecycleTests.test_start_imports_precheck_and_creates_four_part_commit) ... ok\ntest_start_offline_does_not_create_worktree (test_task.TaskLifecycleTests.test_start_offline_does_not_create_worktree) ... ok\ntest_start_preserves_merged_local_and_remote_branch_names (test_task.TaskLifecycleTests.test_start_preserves_merged_local_and_remote_branch_names) ... ok\ntest_start_rejects_receipt_when_authoritative_base_changed (test_task.TaskLifecycleTests.test_start_rejects_receipt_when_authoritative_base_changed) ... ok\ntest_start_requires_precheck_receipt_before_creating_worktree (test_task.TaskLifecycleTests.test_start_requires_precheck_receipt_before_creating_worktree) ... ok\ntest_start_stacked_branch_records_parent_and_main_baseline (test_task.TaskLifecycleTests.test_start_stacked_branch_records_parent_and_main_baseline) ... ok\ntest_sync_commit_failure_never_reports_synced (test_task.TaskLifecycleTests.test_sync_commit_failure_never_reports_synced) ... ok\ntest_sync_does_not_execute_json_receipt_command (test_task.TaskLifecycleTests.test_sync_does_not_execute_json_receipt_command) ... ok\ntest_sync_keeps_json_evidence_fresh_after_metadata_only_changes (test_task.TaskLifecycleTests.test_sync_keeps_json_evidence_fresh_after_metadata_only_changes) ... ok\ntest_sync_keeps_unchanged_component_branch (test_task.TaskLifecycleTests.test_sync_keeps_unchanged_component_branch) ... ok\ntest_sync_materializes_nested_detached_components (test_task.TaskLifecycleTests.test_sync_materializes_nested_detached_components) ... ok\ntest_sync_materializes_updated_component (test_task.TaskLifecycleTests.test_sync_materializes_updated_component) ... ok\ntest_sync_preserves_component_feature_branch (test_task.TaskLifecycleTests.test_sync_preserves_component_feature_branch) ... ok\ntest_sync_preserves_dirty_child (test_task.TaskLifecycleTests.test_sync_preserves_dirty_child) ... ok\ntest_sync_preserves_nested_feature_branch_when_parent_pin_changes (test_task.TaskLifecycleTests.test_sync_preserves_nested_feature_branch_when_parent_pin_changes) ... ok\ntest_sync_reads_legacy_commands_with_escaped_pipes (test_task.TaskLifecycleTests.test_sync_reads_legacy_commands_with_escaped_pipes) ... ok\ntest_sync_still_warns_for_stale_legacy_table_evidence (test_task.TaskLifecycleTests.test_sync_still_warns_for_stale_legacy_table_evidence) ... ok\ntest_sync_warns_for_malformed_json_evidence (test_task.TaskLifecycleTests.test_sync_warns_for_malformed_json_evidence) ... ok\ntest_sync_warns_for_missing_json_receipt_fields_even_with_valid_checksum (test_task.TaskLifecycleTests.test_sync_warns_for_missing_json_receipt_fields_even_with_valid_checksum) ... ok\ntest_sync_warns_for_unresolved_json_evidence_head (test_task.TaskLifecycleTests.test_sync_warns_for_unresolved_json_evidence_head) ... ok\ntest_sync_warns_for_unresolved_legacy_evidence_head (test_task.TaskLifecycleTests.test_sync_warns_for_unresolved_legacy_evidence_head) ... ok\ntest_sync_warns_when_json_after_state_contains_uncommitted_code (test_task.TaskLifecycleTests.test_sync_warns_when_json_after_state_contains_uncommitted_code) ... ok\ntest_sync_warns_when_json_before_state_contains_uncommitted_code (test_task.TaskLifecycleTests.test_sync_warns_when_json_before_state_contains_uncommitted_code) ... ok\ntest_sync_warns_when_json_evidence_predates_noncard_changes (test_task.TaskLifecycleTests.test_sync_warns_when_json_evidence_predates_noncard_changes) ... ok\ntest_verify_rejects_recursive_drift_even_when_root_has_local_edits (test_task.TaskLifecycleTests.test_verify_rejects_recursive_drift_even_when_root_has_local_edits) ... ok\ntest_verify_rejects_uninitialized_component (test_task.TaskLifecycleTests.test_verify_rejects_uninitialized_component) ... ok\ntest_deleting_main_symlink_to_outside_is_denied (test_write_guard.WriteGuardTests.test_deleting_main_symlink_to_outside_is_denied) ... ok\ntest_detached_and_bad_branches_are_denied (test_write_guard.WriteGuardTests.test_detached_and_bad_branches_are_denied) ... ok\ntest_every_patch_file_and_move_destination_is_checked (test_write_guard.WriteGuardTests.test_every_patch_file_and_move_destination_is_checked) ... ok\ntest_feature_missing_parent_is_allowed (test_write_guard.WriteGuardTests.test_feature_missing_parent_is_allowed) ... ok\ntest_invalid_json_is_denied (test_write_guard.WriteGuardTests.test_invalid_json_is_denied) ... ok\ntest_missing_parent_on_main_is_denied (test_write_guard.WriteGuardTests.test_missing_parent_on_main_is_denied) ... ok\ntest_missing_unknown_and_malformed_write_input_are_denied (test_write_guard.WriteGuardTests.test_missing_unknown_and_malformed_write_input_are_denied) ... ok\ntest_non_git_destination_is_explicitly_outside_scope (test_write_guard.WriteGuardTests.test_non_git_destination_is_explicitly_outside_scope) ... ok\ntest_nonwrite_tools_are_outside_scope (test_write_guard.WriteGuardTests.test_nonwrite_tools_are_outside_scope) ... ok\ntest_relative_path_uses_hook_cwd_not_process_cwd (test_write_guard.WriteGuardTests.test_relative_path_uses_hook_cwd_not_process_cwd) ... ok\ntest_symlink_into_main_with_missing_parents_is_denied (test_write_guard.WriteGuardTests.test_symlink_into_main_with_missing_parents_is_denied) ... ok\ntest_valid_multi_file_patch_on_feature_is_allowed (test_write_guard.WriteGuardTests.test_valid_multi_file_patch_on_feature_is_allowed) ... ok\n\n----------------------------------------------------------------------\nRan 99 tests in 22.760s\n\nOK\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-finish-guard-fixes'\n", + "output_sha256": "a99587fc3e22f3cd912d539945cc01c4f4b2b1e9ca3b4908043860b2cf8dcd4b", + "receipt_sha256": "efcd87c31560508d18dc3186e5ac800f583ddb2e9354d9d263796e28e403cb71" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-05T14:59:39.697778+00:00", + "command": "PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -p 'test_*.py' && echo GOVERNANCE-91-OK", + "command_sha256": "788ca86ace53070e627d360a7dbe0b4463affba8770a986fe6d0c32ace460373", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-finish-guard-fixes", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "df23fcab5624e506e53bcd7186ad86d9b243c9f5", + "branch": "feature/finish-guard-fixes", + "target_branch": "main", + "target_head": "4edec763fff1b8239e203dc9106f16a241ca343d", + "status": " M .task/feature-finish-guard-fixes.md\n M scripts/check-worktree.py\n M tests/test_task.py\n", + "tracked_diff_sha256": "1bc9071fed59eae356aba93b4d754a21b8c6fa47b08cbb93dd15ed2e6f73871b", + "untracked": {}, + "submodules": " cc1ad7749816afe129f81bcf0732d0ca7c789d10 deps/agent-command (remotes/origin/feature/core-v0-1-gcc1ad77)\n ed2af3e6048928b1fd0ba6da1f9d0c1bafec82d4 deps/agent-command/deps/development-guidelines (remotes/origin/feature/delivery-mechanism-5-ged2af3e)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 3a110a728cf520cfbbbafc0c4c75f14bf78bec3f deps/agent-native (remotes/origin/feature/agent-harness-p1-27-g3a110a7)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf deps/agent-native/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-native/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-native/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-native/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-native/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 5a57636cc0b8426a86a72bbbdd5b7f30e4fcac88 deps/agent-squad (remotes/origin/feature/agent-harness-p1-27-g5a57636)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf deps/agent-squad/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 3a110a728cf520cfbbbafc0c4c75f14bf78bec3f deps/agent-squad/deps/agent-native (remotes/origin/feature/agent-harness-p1-27-g3a110a7)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf deps/agent-squad/deps/agent-native/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/agent-native/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/agent-native/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/logging-system/deps/development-guidelines (26b562d)\n af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cb26e4c9473f75ad015a83e3bba8137a08ff56f9 modules/backend (remotes/origin/feature/ext-1-inproc-handler)\n cc1ad7749816afe129f81bcf0732d0ca7c789d10 modules/backend/deps/agent-command (remotes/origin/feature/core-v0-1-gcc1ad77)\n ed2af3e6048928b1fd0ba6da1f9d0c1bafec82d4 modules/backend/deps/agent-command/deps/development-guidelines (remotes/origin/feature/delivery-mechanism-5-ged2af3e)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf modules/backend/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 3a110a728cf520cfbbbafc0c4c75f14bf78bec3f modules/backend/deps/agent-native (remotes/origin/feature/agent-harness-p1-27-g3a110a7)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf modules/backend/deps/agent-native/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-native/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-native/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-native/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-native/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 5a57636cc0b8426a86a72bbbdd5b7f30e4fcac88 modules/backend/deps/agent-squad (remotes/origin/feature/agent-harness-p1-27-g5a57636)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf modules/backend/deps/agent-squad/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-squad/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-squad/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 3a110a728cf520cfbbbafc0c4c75f14bf78bec3f modules/backend/deps/agent-squad/deps/agent-native (remotes/origin/feature/agent-harness-p1-27-g3a110a7)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-squad/deps/agent-native/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-squad/deps/agent-native/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-squad/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-squad/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/logging-system/deps/development-guidelines (26b562d)\n 0b5c7747a3165bf0d0f2219204b7b70ec3ed7645 modules/backend/deps/agent-system-core (remotes/origin/feature/agent-harness-p3b-12-g0b5c774)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/logging-system/deps/development-guidelines (26b562d)\n 0b5c7747a3165bf0d0f2219204b7b70ec3ed7645 modules/core (remotes/origin/feature/agent-harness-p3b-12-g0b5c774)\n 19e89ae10bd93306400f13a9a1f449cbc5bfaa42 modules/documents (remotes/origin/feature/governance-docs)\n 50c724460159171254242ae48e956a80f4eb9c7e modules/frontend (heads/main)\n 2cb1496320dda6e65501ac94318295f067231dd7 modules/ui (remotes/origin/feature/governance-docs)\n" + }, + "after": { + "head": "df23fcab5624e506e53bcd7186ad86d9b243c9f5", + "branch": "feature/finish-guard-fixes", + "target_branch": "main", + "target_head": "4edec763fff1b8239e203dc9106f16a241ca343d", + "status": " M .task/feature-finish-guard-fixes.md\n M scripts/check-worktree.py\n M tests/test_task.py\n", + "tracked_diff_sha256": "1bc9071fed59eae356aba93b4d754a21b8c6fa47b08cbb93dd15ed2e6f73871b", + "untracked": {}, + "submodules": " cc1ad7749816afe129f81bcf0732d0ca7c789d10 deps/agent-command (remotes/origin/feature/core-v0-1-gcc1ad77)\n ed2af3e6048928b1fd0ba6da1f9d0c1bafec82d4 deps/agent-command/deps/development-guidelines (remotes/origin/feature/delivery-mechanism-5-ged2af3e)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 3a110a728cf520cfbbbafc0c4c75f14bf78bec3f deps/agent-native (remotes/origin/feature/agent-harness-p1-27-g3a110a7)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf deps/agent-native/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-native/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-native/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-native/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-native/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 5a57636cc0b8426a86a72bbbdd5b7f30e4fcac88 deps/agent-squad (remotes/origin/feature/agent-harness-p1-27-g5a57636)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf deps/agent-squad/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 3a110a728cf520cfbbbafc0c4c75f14bf78bec3f deps/agent-squad/deps/agent-native (remotes/origin/feature/agent-harness-p1-27-g3a110a7)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf deps/agent-squad/deps/agent-native/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/agent-native/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/agent-native/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/logging-system/deps/development-guidelines (26b562d)\n af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cb26e4c9473f75ad015a83e3bba8137a08ff56f9 modules/backend (remotes/origin/feature/ext-1-inproc-handler)\n cc1ad7749816afe129f81bcf0732d0ca7c789d10 modules/backend/deps/agent-command (remotes/origin/feature/core-v0-1-gcc1ad77)\n ed2af3e6048928b1fd0ba6da1f9d0c1bafec82d4 modules/backend/deps/agent-command/deps/development-guidelines (remotes/origin/feature/delivery-mechanism-5-ged2af3e)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf modules/backend/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 3a110a728cf520cfbbbafc0c4c75f14bf78bec3f modules/backend/deps/agent-native (remotes/origin/feature/agent-harness-p1-27-g3a110a7)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf modules/backend/deps/agent-native/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-native/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-native/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-native/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-native/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 5a57636cc0b8426a86a72bbbdd5b7f30e4fcac88 modules/backend/deps/agent-squad (remotes/origin/feature/agent-harness-p1-27-g5a57636)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf modules/backend/deps/agent-squad/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-squad/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-squad/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 3a110a728cf520cfbbbafc0c4c75f14bf78bec3f modules/backend/deps/agent-squad/deps/agent-native (remotes/origin/feature/agent-harness-p1-27-g3a110a7)\n 65aaebca1ea69ab7d48eda51d33ef1d4eea5a0bf modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent (65aaebc)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-squad/deps/agent-native/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-squad/deps/agent-native/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-squad/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/agent-squad/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/logging-system/deps/development-guidelines (26b562d)\n 0b5c7747a3165bf0d0f2219204b7b70ec3ed7645 modules/backend/deps/agent-system-core (remotes/origin/feature/agent-harness-p3b-12-g0b5c774)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/logging-system/deps/development-guidelines (26b562d)\n 0b5c7747a3165bf0d0f2219204b7b70ec3ed7645 modules/core (remotes/origin/feature/agent-harness-p3b-12-g0b5c774)\n 19e89ae10bd93306400f13a9a1f449cbc5bfaa42 modules/documents (remotes/origin/feature/governance-docs)\n 50c724460159171254242ae48e956a80f4eb9c7e modules/frontend (heads/main)\n 2cb1496320dda6e65501ac94318295f067231dd7 modules/ui (remotes/origin/feature/governance-docs)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "...................................................................................................\n----------------------------------------------------------------------\nRan 99 tests in 21.849s\n\nOK\nGOVERNANCE-91-OK\n", + "output_sha256": "4b9a1da04fe04c76123dee4625ccffbd3d4e8a67b882b608da4c2194096d1134", + "receipt_sha256": "145ffc680c0a537362b9002e20391c00aabb21f92066a98a985793d67fe92f4b" +} +``` diff --git a/scripts/check-worktree.py b/scripts/check-worktree.py index 8ce1eac6..c682e712 100644 --- a/scripts/check-worktree.py +++ b/scripts/check-worktree.py @@ -87,8 +87,8 @@ def check_children(repo, mode, removal_roots=()): raise RuntimeError(f"submodule {child} owns branch {branch}; keep that work and explicitly reconcile pin {expected} before retrying task-sync") if mode in ("verify", "after-sync", "finish") and actual != expected: raise RuntimeError(f"submodule SHA drift: {child}: expected {expected}, actual {actual}") - if mode == "finish" and git(child, "rev-list", "--all", "--reflog", "--not", expected).strip(): - raise RuntimeError(f"submodule has commits outside its pinned history: {child}; preserve branches, stash and reflogs before removal") + if mode == "finish" and local_work_outside(child, expected): + raise RuntimeError(f"submodule has local work outside its pinned history: {child}; preserve branches, stash and reflogs before removal") check_children(child, mode, removal_roots) @@ -103,6 +103,23 @@ def materialize(repo): materialize(child) +def local_work_outside(child, expected): + """2026-10-05 修复:pinned-history 检查此前用 --all --reflog,把 refs/remotes 也 + 计入——pin 在 feature 顶端的子仓因 origin/main 不在 pin 历史内而永远无法 finish + (实测被迫删远端引用+清 reflog 绕过,损害现场)。只认「本地独有」工作: + 本地分支、stash、以及 HEAD 的 reflog(最近检出轨迹里的独有提交); + refs/remotes 一律不算——远端有副本即已保全。""" + if git(child, "rev-list", "--branches", "--not", expected).strip(): + return True + if git(child, "stash", "list").strip(): + return True + for line in git(child, "reflog", "show", "HEAD", "--format=%H").splitlines(): + tip = line.strip() + if tip and git(child, "rev-list", "-1", tip, "--not", expected).strip(): + return True + return False + + def check_finish_root(repo): if Path.cwd().resolve() != repo: raise RuntimeError("task-finish must run at the registered worktree root, not a subdirectory") @@ -117,8 +134,16 @@ def check_finish_root(repo): if any(field.startswith((b"locked", b"prunable", b"bare", b"detached")) for field in matches[0][1:]): raise RuntimeError("locked, detached, bare, or prunable worktree must be preserved") common = Path(text(repo, "rev-parse", "--path-format=absolute", "--git-common-dir")) - if any(common.rglob("*.lock")): - raise RuntimeError("Git lock exists in shared repository metadata; wait for its owner") + # 2026-10-05 修复:rglob("*.lock") 把 .git/cursor/ 等 IDE 产物当 Git 锁 + #(实测五天陈锁阻断 worktree 回收)。收窄到 Git 真实锁语义:公共区锁 + + # 本 worktree git-path 锁/活动操作标记(与 check_operations 同源清单)。 + shared_locks = [common / "config.lock", common / "shallow.lock"] + for marker in ("index.lock", "HEAD.lock", "MERGE_HEAD", "CHERRY_PICK_HEAD", + "REVERT_HEAD", "BISECT_LOG", "gc.pid"): + shared_locks.append(Path(text(repo, "rev-parse", "--path-format=absolute", "--git-path", marker))) + for lock in shared_locks: + if lock.exists(): + raise RuntimeError(f"Git lock exists in shared repository metadata ({lock.name}); wait for its owner") def main(): diff --git a/tests/test_task.py b/tests/test_task.py index 548805c8..b972a0e3 100644 --- a/tests/test_task.py +++ b/tests/test_task.py @@ -633,3 +633,153 @@ class TaskLifecycleTests(unittest.TestCase): if __name__ == "__main__": unittest.main() + + +class FinishGuardFixTests(unittest.TestCase): + """2026-10-05 两处 finish 守卫误报的回归:IDE 产物锁不再误报、真实 Git 锁仍拦; + 子仓远端跟踪引用不再卡 pinned-history,本地独有工作仍保全。""" + + def setUp(self): + self.root = tempfile.mkdtemp(prefix="finish-guard-") + self.addCleanup(shutil.rmtree, self.root, ignore_errors=True) + self.repo = Path(self.root) / "repo" + shutil.copytree(SOURCE / "scripts", self.repo / "scripts") + (self.repo / "Makefile").write_text("precheck:\n\t@bash scripts/task.sh precheck\n") + self.env = os.environ.copy() + self.env.update({"GIT_CONFIG_NOSYSTEM": "1", "GIT_CONFIG_GLOBAL": "/dev/null", + "GIT_ALLOW_PROTOCOL": "file", "GIT_TERMINAL_PROMPT": "0", + "GIT_AUTHOR_NAME": "Guard Test", "GIT_AUTHOR_EMAIL": "guard@example.invalid", + "GIT_COMMITTER_NAME": "Guard Test", "GIT_COMMITTER_EMAIL": "guard@example.invalid", + "TASK_WRITERS_STOPPED": "1"}) + for key in ("GIT_DIR", "GIT_WORK_TREE", "GIT_INDEX_FILE", "GITEA_TOKEN", "PRECHECK_RECEIPT"): + self.env.pop(key, None) + self.git(self.root, "init", "--bare", "-b", "main", self.root + "/origin.git") + self.git(self.root, "init", "-b", "main", str(self.repo)) + (self.repo / "tracked").write_text("base\n") + self.git(self.repo, "add", ".") + self.git(self.repo, "commit", "-q", "-m", "base") + self.git(self.repo, "remote", "add", "origin", self.root + "/origin.git") + self.git(self.repo, "push", "-q", "origin", "main") + + def git(self, cwd, *args): + return subprocess.run(["git", "-C", str(cwd), *args], check=True, + capture_output=True, text=True, env=self.env) + + def task(self, cwd, *args, check=True, env=None): + return subprocess.run(["bash", str(self.repo / "scripts" / "task.sh"), *args], + cwd=str(cwd), capture_output=True, text=True, + env=env or self.env, check=check) + + def worktree(self): + receipt = Path(self.root) / "precheck.json" + subprocess.run( + ["bash", str(self.repo / "scripts" / "evidence.sh")], cwd=str(self.repo), + capture_output=True, text=True, + env=self.env | {"RECEIPT": str(receipt), "CMD": "make precheck"}, check=True) + self.task(self.repo, "start", "feature/guard", + env=self.env | {"PRECHECK_RECEIPT": str(receipt)}) + wt = self.root + "/repo-wt-feature-guard" + assert Path(wt).is_dir(), "worktree not created" + return Path(wt) + + def add_submodule_pinned_off_main(self): + """pin 在 feature 顶端(origin/main 不在 pin 历史内)——修复前的永久卡死场景。""" + child = Path(self.root) / "component" + self.git(self.root, "init", "-b", "main", str(child)) + (child / "content").write_text("v1\n") + self.git(child, "add", ".") + self.git(child, "-c", "user.name=T", "-c", "user.email=t@t", "commit", "-q", "-m", "v1") + self.git(self.root, "init", "--bare", "-b", "main", self.root + "/component-origin.git") + self.git(child, "remote", "add", "origin", self.root + "/component-origin.git") + self.git(child, "push", "-q", "origin", "main") + self.git(child, "switch", "-c", "feature/pin-tip") + (child / "content").write_text("v2 pin tip\n") + self.git(child, "commit", "-am", "v2") + pin_tip = subprocess.run(["git", "-C", str(child), "rev-parse", "HEAD"], + capture_output=True, text=True, check=True, env=self.env).stdout.strip() + # 把 pin-tip 推上远端,子仓 add 时按该分支检出 + self.git(child, "push", "-q", "origin", "feature/pin-tip") + self.git(self.repo, "-c", "protocol.file.allow=always", + "submodule", "add", "-b", "feature/pin-tip", + self.root + "/component-origin.git", "component") + self.git(self.repo, "commit", "-q", "-am", "Pin component at feature tip") + self.git(self.repo, "push", "-q", "origin", "main") + # 让子仓本地带上 origin/main 的远端跟踪引用(不在 pin 历史内) + self.git(child, "fetch", "origin") + return child, pin_tip + + def test_ide_lock_in_git_dir_does_not_block_finish(self): + wt = self.worktree() + (self.repo / "tracked").write_text("implementation done\n") + self.git(self.repo, "add", "-A") + self.git(self.repo, "commit", "-q", "-m", "done") + self.git(self.repo, "push", "-q", "origin", "feature/guard") + self.git(self.repo, "merge", "--no-ff", "-q", "-m", "Merge feature/guard", "feature/guard") + self.git(self.repo, "push", "-q", "origin", "main") + ide = Path(subprocess.run(["git", "-C", str(self.repo), "rev-parse", + "--path-format=absolute", "--git-common-dir"], + capture_output=True, text=True, check=True).stdout.strip()) / "cursor" / "crepe" + ide.mkdir(parents=True, exist_ok=True) + stale = ide / "build.lock" + stale.write_text("stale IDE artifact") + result = self.task(wt, "finish", check=False) + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + self.assertFalse(wt.exists()) + self.assertTrue(stale.is_file(), "IDE artifact must be preserved untouched") + + def test_real_git_lock_still_blocks_finish(self): + wt = self.worktree() + (self.repo / "tracked").write_text("implementation done\n") + self.git(self.repo, "add", "-A") + self.git(self.repo, "commit", "-q", "-m", "done") + self.git(self.repo, "push", "-q", "origin", "feature/guard") + self.git(self.repo, "merge", "--no-ff", "-q", "-m", "Merge feature/guard", "feature/guard") + self.git(self.repo, "push", "-q", "origin", "main") + common = Path(subprocess.run(["git", "-C", str(self.repo), "rev-parse", + "--path-format=absolute", "--git-common-dir"], + capture_output=True, text=True, check=True).stdout.strip()) + (common / "config.lock").write_text("live writer") + result = self.task(wt, "finish", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertTrue(wt.exists()) + + def test_remote_tracking_refs_do_not_block_finish(self): + self.add_submodule_pinned_off_main() + wt = self.worktree() + self.git(wt, "submodule", "update", "--init", "--recursive") + (self.repo / "tracked").write_text("implementation done\n") + self.git(self.repo, "add", "-A") + self.git(self.repo, "commit", "-q", "-m", "done") + self.git(self.repo, "push", "-q", "origin", "feature/guard") + self.git(self.repo, "merge", "--no-ff", "-q", "-m", "Merge feature/guard", "feature/guard") + self.git(self.repo, "push", "-q", "origin", "main") + # 模拟实际场景:子仓检出于 pin 顶端且带有远端跟踪引用与克隆 reflog + result = self.task(wt, "finish", check=False) + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + self.assertFalse(wt.exists()) + + def test_local_unique_commit_still_preserved(self): + self.add_submodule_pinned_off_main() + wt = self.worktree() + self.git(wt, "submodule", "update", "--init", "--recursive") + child = wt / "component" + pinned = subprocess.run(["git", "-C", str(child), "rev-parse", "HEAD"], + capture_output=True, text=True, check=True).stdout.strip() + self.git(child, "switch", "-c", "feature/unique") + (child / "content").write_text("unique local work\n") + self.git(child, "commit", "-am", "unique") + unique = subprocess.run(["git", "-C", str(child), "rev-parse", "HEAD"], + capture_output=True, text=True, check=True).stdout.strip() + self.git(child, "checkout", "--detach", pinned) + (self.repo / "tracked").write_text("done\n") + self.git(self.repo, "add", "-A") + self.git(self.repo, "commit", "-q", "-m", "done") + self.git(self.repo, "push", "-q", "origin", "feature/guard") + self.git(self.repo, "merge", "--no-ff", "-q", "-m", "Merge feature/guard", "feature/guard") + self.git(self.repo, "push", "-q", "origin", "main") + result = self.task(wt, "finish", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertTrue(wt.exists()) + kept = subprocess.run(["git", "-C", str(child), "rev-parse", "feature/unique"], + capture_output=True, text=True, check=True).stdout.strip() + self.assertEqual(kept, unique)