From 90265ac67000c3c128aa00cea910f93e8e8b8fa2 Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 14 Oct 2026 16:55:04 +0000 Subject: [PATCH] Prioritize task goals and usable delivery Why: Keep authorized work focused on its stated outcome, prevent private scope expansion, and remove mechanical human stage gates. Evidence: make test-governance passed 344 tests with 18 environment-dependent skips; receipt is recorded in the task card. Impact: New tasks use goal-first execution while retaining real decision points, independent review, evidence, platform admission, and high-consequence dual keys. Refs: .task/feature-goal-first-delivery.md --- .task/feature-goal-first-delivery.md | 78 +++++++++++++++----- AGENTS.md | 30 +++++--- policy/adoption.md | 6 +- policy/delivery.md | 103 ++++++++++++++++----------- policy/governance.md | 4 +- policy/merge-queue.md | 12 ++-- policy/tool-adaptation-matrix.md | 10 +-- scripts/task.sh | 32 ++++----- tests/test_task.py | 15 ++-- 9 files changed, 184 insertions(+), 106 deletions(-) diff --git a/.task/feature-goal-first-delivery.md b/.task/feature-goal-first-delivery.md index 7741db42..2604a050 100644 --- a/.task/feature-goal-first-delivery.md +++ b/.task/feature-goal-first-delivery.md @@ -7,45 +7,49 @@ - 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 33261925a10c4eee40d1b6175b3895e78a47ef02 - 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-goal-first-delivery(worktree);分支:feature/goal-first-delivery -- 授权与交付终点:<本次允许的动作与终点;未授权事项写明> -- 交付模式:manual(前序人工决策,智能体 Review/合入);其他阶段明确授权后可记为 authorized-continuous +- 授权与交付终点:完善本仓交付规范及必要的任务卡接线,确立目标优先、不私自扩围、先可用再迭代,并移除可移除的人工环节;本轮先交付阶段 6 候选供用户评审,不修改 Guidelines 子模块、业务代码或平台保护。 +- 交付模式:transition-manual(本任务在旧规范下启动;2026-10-15 用户已批准阶段 1–5) - 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入) -- 自动推进授权:无;授权范围:无;授权来源:无;授权终点:无;停止条件:无(未授权) -- 当前阶段:需求拆解;当前增量:I1(待定义) +- 人工决策点:本轮阶段 6 产物评审;其余按旧规范与后续授权执行 +- 当前阶段:实施与自检;当前增量:I1(goal-first 交付规范及任务卡接线) - 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位) ## 目标与非目标 -<预期结果、受影响入口/模块/契约;明确不做什么。> +目标:使本仓执行者优先完成已授权任务目标并保持系统可用,只处理直接阻塞项,非阻塞问题按价值记录或忽略;在一次确认目标、范围和终点后连续交付。 + +非目标:不放宽授权、独立 Review、证据、CI/平台准入、高后果双钥匙或安全回收条件;不修改通用 Guidelines 子模块和业务功能。 ## 关联方向与规划 -- 适用状态:待核对(无适用规划时说明原因) -- 主记录路径/版本:待核对(路径按仓库根目录定位,归档后不变;只引用唯一正文) -- 对应里程碑:待核对 +- 适用状态:无适用业务规划;本任务是项目交付规范修订 +- 主记录路径/版本:policy/delivery.md 当前候选 +- 对应里程碑:本任务候选经验证、Review 与合入后生效 ## 需求分析 | ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 | |---|---|---|---|---|---|---| -| R1 | 待填写 | 待评估 | 待定 | 待定义 | 待确认 | 待评审 | +| R1 | 任务目标和系统可用性优先,先形成可验证的最小可用闭环 | 符合通用基线的授权边界与按影响选择流程 | P0 | AGENTS.md 和 policy/delivery.md 明确优先级、完成标准和先可用后迭代 | 现有交付规范 | 纳入 I1 | +| R2 | 禁止私自扩围,仅解决直接阻塞项;非阻塞项按价值记录或忽略 | 收紧基线硬边界 1,不放宽授权 | P0 | 规范具有阻塞/有价值非阻塞/低影响噪音分流,任务外修复必须获得授权 | R1 | 纳入 I1 | +| R3 | 移除可移除的逐阶段人工停顿,保留真实决策、安全和质量门禁 | 项目层在通用基线内明确执行方式 | P0 | 任务卡默认 goal-first,阶段为追溯记录而非人工签字表;治理测试覆盖模板 | R1、R2 | 纳入 I1 | ## 方案与计划 -- 方案引用:待填写(含对象版本) -- 实施计划引用:待填写(含增量与需求 ID) -- 测试计划引用:待填写(含需求 ID 与验收条件) +- 方案引用:2026-10-15 对话内有界方案(用户已批准) +- 实施计划引用:I1 同步修订 AGENTS.md、policy/delivery.md、必要治理接线与测试 +- 测试计划引用:R1–R3 用治理模板回归、文档一致性检索、`git diff --check` 和 `make test-governance` 验证 ## 阶段评审 | 阶段 | 对象版本 | 结论 | 评审人 | 时间 | 依据 | |---|---|---|---|---|---| -| 需求拆解 | 待定 | 未评审 | — | — | — | -| 需求评估 | 待定 | 未评审 | — | — | — | -| 需求表确认 | 待定 | 未评审 | — | — | — | -| 方案设计 | 待定 | 未评审 | — | — | — | -| 实施计划 | 待定 | 未评审 | — | — | — | -| 实施与自检 | 待定 | 未评审 | — | — | — | +| 需求拆解 | 2026-10-15 对话内方案 | 通过 | weichen | 2026-10-15 | 用户“批准,并且移除可以被移除的人工环节” | +| 需求评估 | 2026-10-15 对话内方案 | 通过 | weichen | 2026-10-15 | 同上 | +| 需求表确认 | R1–R3 | 通过 | weichen | 2026-10-15 | 同上 | +| 方案设计 | 2026-10-15 对话内方案+用户追加要求 | 通过 | weichen | 2026-10-15 | 同上 | +| 实施计划 | I1 | 通过 | weichen | 2026-10-15 | 同上 | +| 实施与自检 | 当前候选 | 进行中 | Codex | 2026-10-15 | 待完成差异和自检 | | 正式测试与验收 | 待定 | 未评审 | — | — | — | | 代码 Review | 待定 | 未评审 | — | — | — | | 合入 | 待定 | 未评审 | — | — | — | @@ -138,3 +142,41 @@ "receipt_sha256": "8e32b03f7ce6ca08d37d747fae7094d197bd58705f1a0d5eed9e4b47f1f651fe" } ``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-14T16:50:31.632382+00:00", + "command": "make test-governance", + "command_sha256": "9776a8dfcfb8f4c95abc94c40cae3a2c0e91e8f4b91fe95d98085c290e929158", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-goal-first-delivery", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "e049225cda398dc05f122b448a11fe6ed5ff0d43", + "branch": "feature/goal-first-delivery", + "target_branch": "main", + "target_head": "33261925a10c4eee40d1b6175b3895e78a47ef02", + "status": " M .task/feature-goal-first-delivery.md\n M AGENTS.md\n M policy/adoption.md\n M policy/delivery.md\n M policy/governance.md\n M policy/merge-queue.md\n M policy/tool-adaptation-matrix.md\n M scripts/task.sh\n M tests/test_task.py\n", + "tracked_diff_sha256": "d560874d5c181130cb3f26d8a5b90adc413e1e7e10b4e89c4887561fc0fa9fa6", + "untracked": {}, + "submodules": " 4f583ca3eeeb07a56a714c5086de84dcd6ad2980 deps/agent-command (heads/main)\n ed2af3e6048928b1fd0ba6da1f9d0c1bafec82d4 deps/agent-command/deps/development-guidelines (remotes/origin/feature/delivery-mechanism-5-ged2af3e)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c deps/agent-intent (heads/main)\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 c348441691e8bdab784a03aa9be64d53dacff341 deps/agent-native (heads/main)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c deps/agent-native/deps/agent-intent (heads/main)\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 490b0b2dfa1567cb16ff7a7230fd78e52bc2938e deps/agent-squad (heads/main)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c deps/agent-squad/deps/agent-intent (heads/main)\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 c348441691e8bdab784a03aa9be64d53dacff341 deps/agent-squad/deps/agent-native (heads/main)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c deps/agent-squad/deps/agent-native/deps/agent-intent (heads/main)\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 2f5b19872be2a4597838a4131ad75d1be089ee5e 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 ead5ade30e8a9475277ba72505f5029feea93304 modules/backend (v0.4.0-17-gead5ade)\n 4f583ca3eeeb07a56a714c5086de84dcd6ad2980 modules/backend/deps/agent-command (heads/main)\n ed2af3e6048928b1fd0ba6da1f9d0c1bafec82d4 modules/backend/deps/agent-command/deps/development-guidelines (remotes/origin/feature/delivery-mechanism-5-ged2af3e)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c modules/backend/deps/agent-intent (heads/main)\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 c348441691e8bdab784a03aa9be64d53dacff341 modules/backend/deps/agent-native (heads/main)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c modules/backend/deps/agent-native/deps/agent-intent (heads/main)\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 490b0b2dfa1567cb16ff7a7230fd78e52bc2938e modules/backend/deps/agent-squad (heads/main)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c modules/backend/deps/agent-squad/deps/agent-intent (heads/main)\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 c348441691e8bdab784a03aa9be64d53dacff341 modules/backend/deps/agent-squad/deps/agent-native (heads/main)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent (heads/main)\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 5773e74086791731059730bd3726dc8c9cd1381f modules/backend/deps/agent-system-core (v0.4.0)\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 5773e74086791731059730bd3726dc8c9cd1381f modules/core (v0.4.0)\n 46506aec34a8803d1b7f4de1a048de9dba591da2 modules/documents (remotes/origin/feature/dhf-plan-progress-note)\n 710ef836b5f7cf6705d6388310042f1e6a90adb3 modules/frontend (v0.4.0-8-g710ef83)\n 7c35a78abc8ef7db6fb2d508b2971d59a90de964 modules/ui (v0.4.0-2-g7c35a78)\n" + }, + "after": { + "head": "e049225cda398dc05f122b448a11fe6ed5ff0d43", + "branch": "feature/goal-first-delivery", + "target_branch": "main", + "target_head": "33261925a10c4eee40d1b6175b3895e78a47ef02", + "status": " M .task/feature-goal-first-delivery.md\n M AGENTS.md\n M policy/adoption.md\n M policy/delivery.md\n M policy/governance.md\n M policy/merge-queue.md\n M policy/tool-adaptation-matrix.md\n M scripts/task.sh\n M tests/test_task.py\n", + "tracked_diff_sha256": "d560874d5c181130cb3f26d8a5b90adc413e1e7e10b4e89c4887561fc0fa9fa6", + "untracked": {}, + "submodules": " 4f583ca3eeeb07a56a714c5086de84dcd6ad2980 deps/agent-command (heads/main)\n ed2af3e6048928b1fd0ba6da1f9d0c1bafec82d4 deps/agent-command/deps/development-guidelines (remotes/origin/feature/delivery-mechanism-5-ged2af3e)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c deps/agent-intent (heads/main)\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 c348441691e8bdab784a03aa9be64d53dacff341 deps/agent-native (heads/main)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c deps/agent-native/deps/agent-intent (heads/main)\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 490b0b2dfa1567cb16ff7a7230fd78e52bc2938e deps/agent-squad (heads/main)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c deps/agent-squad/deps/agent-intent (heads/main)\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 c348441691e8bdab784a03aa9be64d53dacff341 deps/agent-squad/deps/agent-native (heads/main)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c deps/agent-squad/deps/agent-native/deps/agent-intent (heads/main)\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 2f5b19872be2a4597838a4131ad75d1be089ee5e 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 ead5ade30e8a9475277ba72505f5029feea93304 modules/backend (v0.4.0-17-gead5ade)\n 4f583ca3eeeb07a56a714c5086de84dcd6ad2980 modules/backend/deps/agent-command (heads/main)\n ed2af3e6048928b1fd0ba6da1f9d0c1bafec82d4 modules/backend/deps/agent-command/deps/development-guidelines (remotes/origin/feature/delivery-mechanism-5-ged2af3e)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c modules/backend/deps/agent-intent (heads/main)\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 c348441691e8bdab784a03aa9be64d53dacff341 modules/backend/deps/agent-native (heads/main)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c modules/backend/deps/agent-native/deps/agent-intent (heads/main)\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 490b0b2dfa1567cb16ff7a7230fd78e52bc2938e modules/backend/deps/agent-squad (heads/main)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c modules/backend/deps/agent-squad/deps/agent-intent (heads/main)\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 c348441691e8bdab784a03aa9be64d53dacff341 modules/backend/deps/agent-squad/deps/agent-native (heads/main)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent (heads/main)\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 5773e74086791731059730bd3726dc8c9cd1381f modules/backend/deps/agent-system-core (v0.4.0)\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 5773e74086791731059730bd3726dc8c9cd1381f modules/core (v0.4.0)\n 46506aec34a8803d1b7f4de1a048de9dba591da2 modules/documents (remotes/origin/feature/dhf-plan-progress-note)\n 710ef836b5f7cf6705d6388310042f1e6a90adb3 modules/frontend (v0.4.0-8-g710ef83)\n 7c35a78abc8ef7db6fb2d508b2971d59a90de964 modules/ui (v0.4.0-2-g7c35a78)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-goal-first-delivery'\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_rdm_pin_fetch_is_three_shas_on_the_allowlist (test_ci_credentials.CheckoutTests.test_rdm_pin_fetch_is_three_shas_on_the_allowlist) ... 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_fixed_candidate_capture_preserves_checkout (test_evidence.EvidenceTests.test_fixed_candidate_capture_preserves_checkout) ... 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_validation_purpose_is_not_injected_into_measured_command (test_evidence.EvidenceTests.test_validation_purpose_is_not_injected_into_measured_command) ... ok\ntest_pin_is_three_fixed_shas (test_lifecycle_pin.RdmPinTests.test_pin_is_three_fixed_shas) ... ok\ntest_rejects_url_and_short_sha (test_lifecycle_pin.RdmPinTests.test_rejects_url_and_short_sha) ... ok\ntest_conflicted_task_does_not_block_an_independent_healthy_task (test_merge_queue_trial.QueueTrialTests.test_conflicted_task_does_not_block_an_independent_healthy_task) ... ok\ntest_external_target_advance_requires_a_new_candidate (test_merge_queue_trial.QueueTrialTests.test_external_target_advance_requires_a_new_candidate) ... ok\ntest_sequential_delivery_does_not_sync_waiting_branches (test_merge_queue_trial.QueueTrialTests.test_sequential_delivery_does_not_sync_waiting_branches) ... ok\ntest_addr_change_keeps_database_and_auth (test_svc.SvcDbRecoveryTests.test_addr_change_keeps_database_and_auth) ... ok\ntest_auth_preflight_aligns_with_effective_env_dsn (test_svc.SvcDbRecoveryTests.test_auth_preflight_aligns_with_effective_env_dsn) ... ok\ntest_batch_update_stops_second_service_despite_prior_pidcheck (test_svc.SvcDbRecoveryTests.test_batch_update_stops_second_service_despite_prior_pidcheck)\n批量 update 不得用上一服务的 SVC_PIDCHECK 误判下一服务进程。 ... ok\ntest_dbref_binding_survives_bare_restart_and_redeploy (test_svc.SvcDbRecoveryTests.test_dbref_binding_survives_bare_restart_and_redeploy) ... ok\ntest_explicit_unbind_blocks_residual_env_dsn (test_svc.SvcDbRecoveryTests.test_explicit_unbind_blocks_residual_env_dsn) ... ok\ntest_external_dsn_and_conffile_recover_on_bare_start (test_svc.SvcDbRecoveryTests.test_external_dsn_and_conffile_recover_on_bare_start) ... ok\ntest_legacy_exec_dsn_survives_consecutive_restarts (test_svc.SvcDbRecoveryTests.test_legacy_exec_dsn_survives_consecutive_restarts) ... ok\ntest_mock_conflict_and_legacy_binary_refuse (test_svc.SvcDbRecoveryTests.test_mock_conflict_and_legacy_binary_refuse) ... ok\ntest_rdm_companion_missing_web_fails_deploy (test_svc.SvcDbRecoveryTests.test_rdm_companion_missing_web_fails_deploy) ... ok\ntest_rdm_source_commits_and_update_track (test_svc.SvcDbRecoveryTests.test_rdm_source_commits_and_update_track) ... [main 3645693] rdm v2\n 1 file changed, 1 insertion(+)\n create mode 100644 marker\nTo /tmp/svc-db-regress-3yepxpef/rdmremote.git\n 69b536b..3645693 main -> main\nok\ntest_rdm_source_deploy_end_to_end (test_svc.SvcDbRecoveryTests.test_rdm_source_deploy_end_to_end) ... ok\ntest_refusals_keep_registration_without_sqlite_fallback (test_svc.SvcDbRecoveryTests.test_refusals_keep_registration_without_sqlite_fallback) ... ok\ntest_restart_refusal_happens_before_stopping_running_service (test_svc.SvcDbRecoveryTests.test_restart_refusal_happens_before_stopping_running_service) ... ok\ntest_seed_owner_override_skips_account_lookup (test_svc.SvcDbRecoveryTests.test_seed_owner_override_skips_account_lookup) ... ok\ntest_seed_puts_with_temporary_bearer_key_when_auth_on (test_svc.SvcDbRecoveryTests.test_seed_puts_with_temporary_bearer_key_when_auth_on) ... ok\ntest_seed_puts_without_credentials_when_auth_off (test_svc.SvcDbRecoveryTests.test_seed_puts_without_credentials_when_auth_off) ... ok\ntest_sequential_restarts_no_cross_dsn_and_no_secret_leak (test_svc.SvcDbRecoveryTests.test_sequential_restarts_no_cross_dsn_and_no_secret_leak) ... ok\ntest_source_switch_requires_flag (test_svc.SvcDbRecoveryTests.test_source_switch_requires_flag) ... ok\ntest_static_fresh_deploy_registers_pidcheck_and_starts (test_svc.SvcDbRecoveryTests.test_static_fresh_deploy_registers_pidcheck_and_starts)\n全新 static --dir:登记须含 pidcheck;首启探活不得把 http.server 判死。 ... ok\ntest_update_preserves_binding (test_svc.SvcDbRecoveryTests.test_update_preserves_binding) ... ok\ntest_backup_custom_out_not_pruned (test_svc_backup.SvcAgentBackupTests.test_backup_custom_out_not_pruned) ... ok\ntest_backup_event_recorded (test_svc_backup.SvcAgentBackupTests.test_backup_event_recorded) ... ok\ntest_backup_live_writer_consistent_and_outside_runtime (test_svc_backup.SvcAgentBackupTests.test_backup_live_writer_consistent_and_outside_runtime)\n活跃 WAL 写入者:快照可读、行在、integrity ok;-wal/-shm 不入快照。 ... ok\n/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/unittest/suite.py:107: ResourceWarning: unclosed file <_io.TextIOWrapper name=3 encoding='UTF-8'>\n for index, test in enumerate(self):\nResourceWarning: Enable tracemalloc to get the object allocation traceback\ntest_backup_manifest_sha_matches (test_svc_backup.SvcAgentBackupTests.test_backup_manifest_sha_matches) ... ok\ntest_backup_non_sqlite_db_kept_raw_without_leftovers (test_svc_backup.SvcAgentBackupTests.test_backup_non_sqlite_db_kept_raw_without_leftovers) ... ok\ntest_backup_rejects_postgres_with_db_hint (test_svc_backup.SvcAgentBackupTests.test_backup_rejects_postgres_with_db_hint) ... ok\ntest_backup_requires_registration (test_svc_backup.SvcAgentBackupTests.test_backup_requires_registration) ... ok\ntest_backup_target_exists_refused (test_svc_backup.SvcAgentBackupTests.test_backup_target_exists_refused) ... ok\ntest_backup_without_sqlite3_refuses (test_svc_backup.SvcAgentBackupTests.test_backup_without_sqlite3_refuses)\nPATH 无 sqlite3 → 拒绝(不回退裸拷贝)。重建与真实 PATH 等价的工具目录、 ... ok\ntest_retention_and_listing (test_svc_backup.SvcAgentBackupTests.test_retention_and_listing) ... ok\ntest_rm_purge_removes_snapshots (test_svc_backup.SvcAgentBackupTests.test_rm_purge_removes_snapshots) ... ok\ntest_forward_only_requires_confirm_and_backup (test_svc_deploy_txn.DeployTxnTests.test_forward_only_requires_confirm_and_backup) ... ok\ntest_schema_incompatible_refuses_before_stop (test_svc_deploy_txn.DeployTxnTests.test_schema_incompatible_refuses_before_stop) ... ok\ntest_replace_failure_keeps_original (test_svc_identity.AtomicWriteTests.test_replace_failure_keeps_original) ... ok\ntest_I3_start_ensures_sqlite_identity (test_svc_identity.IdentityTests.test_I3_start_ensures_sqlite_identity) ... ok\ntest_I3_wrong_db_identity_blocks_start (test_svc_identity.IdentityTests.test_I3_wrong_db_identity_blocks_start) ... ok\ntest_T1_bare_restart_stable_identity (test_svc_identity.IdentityTests.test_T1_bare_restart_stable_identity) ... ok\ntest_T2_port_change_keeps_anchors (test_svc_identity.IdentityTests.test_T2_port_change_keeps_anchors) ... ok\ntest_T3_data_drift_rejected (test_svc_identity.IdentityTests.test_T3_data_drift_rejected) ... ok\ntest_T4a_leftover_new_file_ignored (test_svc_identity.IdentityTests.test_T4a_leftover_new_file_ignored) ... ok\ntest_T4b_corrupt_manifest_blocks (test_svc_identity.IdentityTests.test_T4b_corrupt_manifest_blocks) ... ok\ntest_T5a_missing_marker_blocks (test_svc_identity.IdentityTests.test_T5a_missing_marker_blocks) ... ok\ntest_T5b_foreign_marker_blocks (test_svc_identity.IdentityTests.test_T5b_foreign_marker_blocks) ... ok\ntest_T5c_lost_manifest_blocks_not_rebuild (test_svc_identity.IdentityTests.test_T5c_lost_manifest_blocks_not_rebuild) ... ok\ntest_T6_cwd_independent_identity (test_svc_identity.IdentityTests.test_T6_cwd_independent_identity) ... ok\ntest_U1_bare_start_missing_row_is_event_init_recovers (test_svc_identity.IdentityTests.test_U1_bare_start_missing_row_is_event_init_recovers)\n普通启动只验证不补行:DB 行缺失 → 拒绝且不建空行(缺行即事件); ... ok\ntest_U1_capability_probe_no_false_positive_no_hang (test_svc_identity.IdentityTests.test_U1_capability_probe_no_false_positive_no_hang)\n能力探测无副作用:含 ensure 字样的服务态门禁报错不算能力(旧实现 ... ok\ntest_U1_update_ensures_missing_row_before_stop (test_svc_identity.IdentityTests.test_U1_update_ensures_missing_row_before_stop)\n已建立身份后删行:update 在停服前拒绝,不自动补行,旧进程保持。 ... ok\ntest_U1_update_refuses_identityless_candidate_keeps_old_state (test_svc_identity.IdentityTests.test_U1_update_refuses_identityless_candidate_keeps_old_state)\nmanifest 治理实例 × 无 identity 候选(RDM 旧形态):停服前拒绝—— ... ok\ntest_Z_real_pg_not_run (test_svc_identity.IdentityTests.test_Z_real_pg_not_run) ... skipped '真实 PG 身份专项 NOT_RUN:需真实实例(SVC_TEST_PG=1 + AGENT_PG_TEST_DSN)'\ntest_recover_fails_when_port_stolen (test_svc_identity.IdentityTests.test_recover_fails_when_port_stolen) ... ok\ntest_recover_ignores_never_started_service (test_svc_identity.IdentityTests.test_recover_ignores_never_started_service) ... ok\ntest_recover_noop_while_running (test_svc_identity.IdentityTests.test_recover_noop_while_running) ... ok\ntest_recover_reserved_name_rejected (test_svc_identity.IdentityTests.test_recover_reserved_name_rejected) ... ok\ntest_recover_respects_explicit_stop (test_svc_identity.IdentityTests.test_recover_respects_explicit_stop) ... ok\ntest_recover_restarts_sigkilled_service (test_svc_identity.IdentityTests.test_recover_restarts_sigkilled_service) ... ok\ntest_recover_skips_when_lock_held (test_svc_identity.IdentityTests.test_recover_skips_when_lock_held) ... ok\ntest_start_reclaims_own_orphan_without_pidfile (test_svc_identity.IdentityTests.test_start_reclaims_own_orphan_without_pidfile)\n模拟 update 误清 pidfile 后本 bin 仍占口:裸 start 应回收并拉起新进程。 ... ok\ntest_start_records_autostart_and_stop_clears (test_svc_identity.IdentityTests.test_start_records_autostart_and_stop_clears) ... ok\ntest_start_rejects_foreign_port_occupant (test_svc_identity.IdentityTests.test_start_rejects_foreign_port_occupant)\n外部 python http.server 占口:start 必须失败并提示非本服务。 ... ok\ntest_stop_on_dead_process_clears_autostart (test_svc_identity.IdentityTests.test_stop_on_dead_process_clears_autostart) ... ok\ntest_watchdog_print_plan (test_svc_identity.IdentityTests.test_watchdog_print_plan) ... ok\ntest_caller_identity_env_does_not_reach_serve (test_svc_lifecycle_isolation.LifecycleIsolationTests.test_caller_identity_env_does_not_reach_serve) ... ok\ntest_recover_fails_when_port_stolen (test_svc_lifecycle_isolation.LifecycleIsolationTests.test_recover_fails_when_port_stolen) ... ok\ntest_recover_ignores_never_started_service (test_svc_lifecycle_isolation.LifecycleIsolationTests.test_recover_ignores_never_started_service) ... ok\ntest_recover_noop_while_running (test_svc_lifecycle_isolation.LifecycleIsolationTests.test_recover_noop_while_running) ... ok\ntest_recover_reserved_name_rejected (test_svc_lifecycle_isolation.LifecycleIsolationTests.test_recover_reserved_name_rejected) ... ok\ntest_recover_respects_explicit_stop (test_svc_lifecycle_isolation.LifecycleIsolationTests.test_recover_respects_explicit_stop) ... ok\ntest_recover_restarts_sigkilled_service (test_svc_lifecycle_isolation.LifecycleIsolationTests.test_recover_restarts_sigkilled_service) ... ok\ntest_recover_skips_when_lock_held (test_svc_lifecycle_isolation.LifecycleIsolationTests.test_recover_skips_when_lock_held) ... ok\ntest_start_reclaims_own_orphan_without_pidfile (test_svc_lifecycle_isolation.LifecycleIsolationTests.test_start_reclaims_own_orphan_without_pidfile)\n模拟 update 误清 pidfile 后本 bin 仍占口:裸 start 应回收并拉起新进程。 ... ok\ntest_start_records_autostart_and_stop_clears (test_svc_lifecycle_isolation.LifecycleIsolationTests.test_start_records_autostart_and_stop_clears) ... ok\ntest_start_rejects_foreign_port_occupant (test_svc_lifecycle_isolation.LifecycleIsolationTests.test_start_rejects_foreign_port_occupant)\n外部 python http.server 占口:start 必须失败并提示非本服务。 ... ok\ntest_stop_on_dead_process_clears_autostart (test_svc_lifecycle_isolation.LifecycleIsolationTests.test_stop_on_dead_process_clears_autostart) ... ok\ntest_two_bare_restarts_keep_identity (test_svc_lifecycle_isolation.LifecycleIsolationTests.test_two_bare_restarts_keep_identity) ... ok\ntest_watchdog_print_plan (test_svc_lifecycle_isolation.LifecycleIsolationTests.test_watchdog_print_plan) ... ok\ntest_addr_defaults_to_default_addr (test_svc_precheck.AgentListenRejectedPrecheck.test_addr_defaults_to_default_addr) ... ok\ntest_incident_combo_not_rejected (test_svc_precheck.AgentListenRejectedPrecheck.test_incident_combo_not_rejected) ... ok\ntest_insecure_not_rejected (test_svc_precheck.AgentListenRejectedPrecheck.test_insecure_not_rejected) ... ok\ntest_loopback_not_rejected (test_svc_precheck.AgentListenRejectedPrecheck.test_loopback_not_rejected) ... ok\ntest_nonloop_auth_off_with_dsn_rejected (test_svc_precheck.AgentListenRejectedPrecheck.test_nonloop_auth_off_with_dsn_rejected) ... ok\ntest_nonloop_no_dsn_rejected (test_svc_precheck.AgentListenRejectedPrecheck.test_nonloop_no_dsn_rejected) ... ok\ntest_auth_off_beats_dsn (test_svc_precheck.DbAuthEnabledMatrix.test_auth_off_beats_dsn) ... ok\ntest_auth_on_explicit (test_svc_precheck.DbAuthEnabledMatrix.test_auth_on_explicit) ... ok\ntest_auto_with_effective_dsn_is_authed (test_svc_precheck.DbAuthEnabledMatrix.test_auto_with_effective_dsn_is_authed) ... ok\ntest_auto_without_dsn_is_denied (test_svc_precheck.DbAuthEnabledMatrix.test_auto_without_dsn_is_denied) ... ok\ntest_no_auth_no_dsn_denied (test_svc_precheck.DbAuthEnabledMatrix.test_no_auth_no_dsn_denied) ... ok\ntest_broken_dbref_refuses (test_svc_precheck.ResolveDbConfigFixtures.test_broken_dbref_refuses) ... ok\ntest_legacy_exec_dsn_migrates_to_recoverable_keys (test_svc_precheck.ResolveDbConfigFixtures.test_legacy_exec_dsn_migrates_to_recoverable_keys) ... ok\ntest_legacy_exec_dsn_without_instance_goes_to_dsn_key (test_svc_precheck.ResolveDbConfigFixtures.test_legacy_exec_dsn_without_instance_goes_to_dsn_key) ... ok\ntest_migration_is_idempotent (test_svc_precheck.ResolveDbConfigFixtures.test_migration_is_idempotent) ... ok\ntest_no_dsn_no_dbref_is_sqlite (test_svc_precheck.ResolveDbConfigFixtures.test_no_dsn_no_dbref_is_sqlite) ... ok\ntest_post_g17_exec_restores_dsn_from_dbref (test_svc_precheck.ResolveDbConfigFixtures.test_post_g17_exec_restores_dsn_from_dbref) ... ok\ntest_env_config_resets_identity_env (test_svc_precheck.ResolverStateIsolation.test_env_config_resets_identity_env) ... ok\ntest_env_config_resets_pidcheck_runtime_state (test_svc_precheck.ResolverStateIsolation.test_env_config_resets_pidcheck_runtime_state) ... ok\ntest_env_config_resets_resolver_state (test_svc_precheck.ResolverStateIsolation.test_env_config_resets_resolver_state) ... ok\ntest_help_topic_lists_rdm_admin (test_svc_rdm_admin.RdmAdminTests.test_help_topic_lists_rdm_admin) ... ok\ntest_recover_fails_when_port_stolen (test_svc_rdm_admin.RdmAdminTests.test_recover_fails_when_port_stolen) ... ok\ntest_recover_ignores_never_started_service (test_svc_rdm_admin.RdmAdminTests.test_recover_ignores_never_started_service) ... ok\ntest_recover_noop_while_running (test_svc_rdm_admin.RdmAdminTests.test_recover_noop_while_running) ... ok\ntest_recover_reserved_name_rejected (test_svc_rdm_admin.RdmAdminTests.test_recover_reserved_name_rejected) ... ok\ntest_recover_respects_explicit_stop (test_svc_rdm_admin.RdmAdminTests.test_recover_respects_explicit_stop) ... ok\ntest_recover_restarts_sigkilled_service (test_svc_rdm_admin.RdmAdminTests.test_recover_restarts_sigkilled_service) ... ok\ntest_recover_skips_when_lock_held (test_svc_rdm_admin.RdmAdminTests.test_recover_skips_when_lock_held) ... ok\ntest_refuses_when_base_db_missing (test_svc_rdm_admin.RdmAdminTests.test_refuses_when_base_db_missing) ... ok\ntest_refuses_when_rdm_db_missing (test_svc_rdm_admin.RdmAdminTests.test_refuses_when_rdm_db_missing) ... ok\ntest_show_empty_ledger_hint (test_svc_rdm_admin.RdmAdminTests.test_show_empty_ledger_hint) ... ok\ntest_show_known_owner_no_warning (test_svc_rdm_admin.RdmAdminTests.test_show_known_owner_no_warning) ... ok\ntest_show_prints_ledger_and_flags_unknown_owner (test_svc_rdm_admin.RdmAdminTests.test_show_prints_ledger_and_flags_unknown_owner) ... ok\ntest_start_reclaims_own_orphan_without_pidfile (test_svc_rdm_admin.RdmAdminTests.test_start_reclaims_own_orphan_without_pidfile)\n模拟 update 误清 pidfile 后本 bin 仍占口:裸 start 应回收并拉起新进程。 ... ok\ntest_start_records_autostart_and_stop_clears (test_svc_rdm_admin.RdmAdminTests.test_start_records_autostart_and_stop_clears) ... ok\ntest_start_rejects_foreign_port_occupant (test_svc_rdm_admin.RdmAdminTests.test_start_rejects_foreign_port_occupant)\n外部 python http.server 占口:start 必须失败并提示非本服务。 ... ok\ntest_status_lists_rdm_admin_row_and_warning (test_svc_rdm_admin.RdmAdminTests.test_status_lists_rdm_admin_row_and_warning) ... ok\ntest_status_silent_without_rdm_db (test_svc_rdm_admin.RdmAdminTests.test_status_silent_without_rdm_db) ... ok\ntest_stop_on_dead_process_clears_autostart (test_svc_rdm_admin.RdmAdminTests.test_stop_on_dead_process_clears_autostart) ... ok\ntest_transfer_idempotent_when_already_owner (test_svc_rdm_admin.RdmAdminTests.test_transfer_idempotent_when_already_owner) ... ok\ntest_transfer_rejects_empty_ledger (test_svc_rdm_admin.RdmAdminTests.test_transfer_rejects_empty_ledger) ... ok\ntest_transfer_rejects_owner_missing_from_base_users (test_svc_rdm_admin.RdmAdminTests.test_transfer_rejects_owner_missing_from_base_users) ... ok\ntest_transfer_rewrites_single_row_with_provenance (test_svc_rdm_admin.RdmAdminTests.test_transfer_rewrites_single_row_with_provenance) ... ok\ntest_unknown_subcommand_usage_exit_2 (test_svc_rdm_admin.RdmAdminTests.test_unknown_subcommand_usage_exit_2) ... ok\ntest_watchdog_print_plan (test_svc_rdm_admin.RdmAdminTests.test_watchdog_print_plan) ... ok\ntest_U3_real_agent_identity_lifecycle_sqlite (test_svc_realcombo.RealComboTests.test_U3_real_agent_identity_lifecycle_sqlite)\n真实组合二进制:领养 ensure → verify → 两次裸重启身份/锚点稳定; ... skipped '真实组合专项 NOT_RUN:需 SVC_TEST_REAL=1(详见文件头运行条件)'\ntest_U3_real_pg_identity_env_delivery (test_svc_realcombo.RealComboTests.test_U3_real_pg_identity_env_delivery)\n真实 PostgreSQL:AGENT_SYSTEM_DSN 环境交付 ensure/verify(凭据不进 ... skipped '真实组合专项 NOT_RUN:需 SVC_TEST_REAL=1(详见文件头运行条件)'\ntest_U3_real_rdm_binary_lifecycle_sqlite (test_svc_realcombo.RealComboTests.test_U3_real_rdm_binary_lifecycle_sqlite)\n真实 RDM 组合二进制:identity 接线(Backend 公共 CLI)→ serve 门禁 → ... skipped '真实组合专项 NOT_RUN:需 SVC_TEST_REAL=1(详见文件头运行条件)'\ntest_U3_real_rdm_full_deploy_track (test_svc_realcombo.RealComboTests.test_U3_real_rdm_full_deploy_track)\n全轨:materialize(真实 make build)→ 候选身份门禁 → release 切换 → ... skipped '真实组合专项 NOT_RUN:需 SVC_TEST_REAL=1(详见文件头运行条件)'\ntest_recover_fails_when_port_stolen (test_svc_realcombo.RealComboTests.test_recover_fails_when_port_stolen) ... skipped '真实组合专项 NOT_RUN:需 SVC_TEST_REAL=1(详见文件头运行条件)'\ntest_recover_ignores_never_started_service (test_svc_realcombo.RealComboTests.test_recover_ignores_never_started_service) ... skipped '真实组合专项 NOT_RUN:需 SVC_TEST_REAL=1(详见文件头运行条件)'\ntest_recover_noop_while_running (test_svc_realcombo.RealComboTests.test_recover_noop_while_running) ... skipped '真实组合专项 NOT_RUN:需 SVC_TEST_REAL=1(详见文件头运行条件)'\ntest_recover_reserved_name_rejected (test_svc_realcombo.RealComboTests.test_recover_reserved_name_rejected) ... skipped '真实组合专项 NOT_RUN:需 SVC_TEST_REAL=1(详见文件头运行条件)'\ntest_recover_respects_explicit_stop (test_svc_realcombo.RealComboTests.test_recover_respects_explicit_stop) ... skipped '真实组合专项 NOT_RUN:需 SVC_TEST_REAL=1(详见文件头运行条件)'\ntest_recover_restarts_sigkilled_service (test_svc_realcombo.RealComboTests.test_recover_restarts_sigkilled_service) ... skipped '真实组合专项 NOT_RUN:需 SVC_TEST_REAL=1(详见文件头运行条件)'\ntest_recover_skips_when_lock_held (test_svc_realcombo.RealComboTests.test_recover_skips_when_lock_held) ... skipped '真实组合专项 NOT_RUN:需 SVC_TEST_REAL=1(详见文件头运行条件)'\ntest_start_reclaims_own_orphan_without_pidfile (test_svc_realcombo.RealComboTests.test_start_reclaims_own_orphan_without_pidfile)\n模拟 update 误清 pidfile 后本 bin 仍占口:裸 start 应回收并拉起新进程。 ... skipped '真实组合专项 NOT_RUN:需 SVC_TEST_REAL=1(详见文件头运行条件)'\ntest_start_records_autostart_and_stop_clears (test_svc_realcombo.RealComboTests.test_start_records_autostart_and_stop_clears) ... skipped '真实组合专项 NOT_RUN:需 SVC_TEST_REAL=1(详见文件头运行条件)'\ntest_start_rejects_foreign_port_occupant (test_svc_realcombo.RealComboTests.test_start_rejects_foreign_port_occupant)\n外部 python http.server 占口:start 必须失败并提示非本服务。 ... skipped '真实组合专项 NOT_RUN:需 SVC_TEST_REAL=1(详见文件头运行条件)'\ntest_stop_on_dead_process_clears_autostart (test_svc_realcombo.RealComboTests.test_stop_on_dead_process_clears_autostart) ... skipped '真实组合专项 NOT_RUN:需 SVC_TEST_REAL=1(详见文件头运行条件)'\ntest_watchdog_print_plan (test_svc_realcombo.RealComboTests.test_watchdog_print_plan) ... skipped '真实组合专项 NOT_RUN:需 SVC_TEST_REAL=1(详见文件头运行条件)'\ntest_recover_fails_when_port_stolen (test_svc_recover.SvcAutoRecoverTests.test_recover_fails_when_port_stolen) ... ok\ntest_recover_ignores_never_started_service (test_svc_recover.SvcAutoRecoverTests.test_recover_ignores_never_started_service) ... ok\ntest_recover_noop_while_running (test_svc_recover.SvcAutoRecoverTests.test_recover_noop_while_running) ... ok\ntest_recover_reserved_name_rejected (test_svc_recover.SvcAutoRecoverTests.test_recover_reserved_name_rejected) ... ok\ntest_recover_respects_explicit_stop (test_svc_recover.SvcAutoRecoverTests.test_recover_respects_explicit_stop) ... ok\ntest_recover_restarts_sigkilled_service (test_svc_recover.SvcAutoRecoverTests.test_recover_restarts_sigkilled_service) ... ok\ntest_recover_skips_when_lock_held (test_svc_recover.SvcAutoRecoverTests.test_recover_skips_when_lock_held) ... ok\ntest_start_reclaims_own_orphan_without_pidfile (test_svc_recover.SvcAutoRecoverTests.test_start_reclaims_own_orphan_without_pidfile)\n模拟 update 误清 pidfile 后本 bin 仍占口:裸 start 应回收并拉起新进程。 ... ok\ntest_start_records_autostart_and_stop_clears (test_svc_recover.SvcAutoRecoverTests.test_start_records_autostart_and_stop_clears) ... ok\ntest_start_rejects_foreign_port_occupant (test_svc_recover.SvcAutoRecoverTests.test_start_rejects_foreign_port_occupant)\n外部 python http.server 占口:start 必须失败并提示非本服务。 ... ok\ntest_stop_on_dead_process_clears_autostart (test_svc_recover.SvcAutoRecoverTests.test_stop_on_dead_process_clears_autostart) ... ok\ntest_watchdog_print_plan (test_svc_recover.SvcAutoRecoverTests.test_watchdog_print_plan) ... ok\ntest_I3_start_ensures_sqlite_identity (test_svc_u2.U2ReleaseTests.test_I3_start_ensures_sqlite_identity) ... ok\ntest_I3_wrong_db_identity_blocks_start (test_svc_u2.U2ReleaseTests.test_I3_wrong_db_identity_blocks_start) ... ok\ntest_T1_bare_restart_stable_identity (test_svc_u2.U2ReleaseTests.test_T1_bare_restart_stable_identity) ... ok\ntest_T2_port_change_keeps_anchors (test_svc_u2.U2ReleaseTests.test_T2_port_change_keeps_anchors) ... ok\ntest_T3_data_drift_rejected (test_svc_u2.U2ReleaseTests.test_T3_data_drift_rejected) ... ok\ntest_T4a_leftover_new_file_ignored (test_svc_u2.U2ReleaseTests.test_T4a_leftover_new_file_ignored) ... ok\ntest_T4b_corrupt_manifest_blocks (test_svc_u2.U2ReleaseTests.test_T4b_corrupt_manifest_blocks) ... ok\ntest_T5a_missing_marker_blocks (test_svc_u2.U2ReleaseTests.test_T5a_missing_marker_blocks) ... ok\ntest_T5b_foreign_marker_blocks (test_svc_u2.U2ReleaseTests.test_T5b_foreign_marker_blocks) ... ok\ntest_T5c_lost_manifest_blocks_not_rebuild (test_svc_u2.U2ReleaseTests.test_T5c_lost_manifest_blocks_not_rebuild) ... ok\ntest_T6_cwd_independent_identity (test_svc_u2.U2ReleaseTests.test_T6_cwd_independent_identity) ... ok\ntest_U1_bare_start_missing_row_is_event_init_recovers (test_svc_u2.U2ReleaseTests.test_U1_bare_start_missing_row_is_event_init_recovers)\n普通启动只验证不补行:DB 行缺失 → 拒绝且不建空行(缺行即事件); ... ok\ntest_U1_capability_probe_no_false_positive_no_hang (test_svc_u2.U2ReleaseTests.test_U1_capability_probe_no_false_positive_no_hang)\n能力探测无副作用:含 ensure 字样的服务态门禁报错不算能力(旧实现 ... ok\ntest_U1_update_ensures_missing_row_before_stop (test_svc_u2.U2ReleaseTests.test_U1_update_ensures_missing_row_before_stop)\n已建立身份后删行:update 在停服前拒绝,不自动补行,旧进程保持。 ... ok\ntest_U1_update_refuses_identityless_candidate_keeps_old_state (test_svc_u2.U2ReleaseTests.test_U1_update_refuses_identityless_candidate_keeps_old_state)\nmanifest 治理实例 × 无 identity 候选(RDM 旧形态):停服前拒绝—— ... ok\ntest_U2_build_failure_keeps_old_running (test_svc_u2.U2ReleaseTests.test_U2_build_failure_keeps_old_running) ... ok\ntest_U2_fault_after_switch_rolls_back_on_next_start (test_svc_u2.U2ReleaseTests.test_U2_fault_after_switch_rolls_back_on_next_start) ... ok\ntest_U2_health_timeout_rolls_back (test_svc_u2.U2ReleaseTests.test_U2_health_timeout_rolls_back) ... ok\ntest_U2_journal_interrupt_resolved_on_start (test_svc_u2.U2ReleaseTests.test_U2_journal_interrupt_resolved_on_start) ... ok\ntest_U2_layout_switch_and_rollback_on_start_failure (test_svc_u2.U2ReleaseTests.test_U2_layout_switch_and_rollback_on_start_failure) ... ok\ntest_U2_legacy_layout_bare_lifecycle_still_works (test_svc_u2.U2ReleaseTests.test_U2_legacy_layout_bare_lifecycle_still_works) ... ok\ntest_U2_schema_advance_blocks_rollback (test_svc_u2.U2ReleaseTests.test_U2_schema_advance_blocks_rollback) ... ok\ntest_Z_real_pg_not_run (test_svc_u2.U2ReleaseTests.test_Z_real_pg_not_run) ... skipped '真实 PG 身份专项 NOT_RUN:需真实实例(SVC_TEST_PG=1 + AGENT_PG_TEST_DSN)'\ntest_recover_fails_when_port_stolen (test_svc_u2.U2ReleaseTests.test_recover_fails_when_port_stolen) ... ok\ntest_recover_ignores_never_started_service (test_svc_u2.U2ReleaseTests.test_recover_ignores_never_started_service) ... ok\ntest_recover_noop_while_running (test_svc_u2.U2ReleaseTests.test_recover_noop_while_running) ... ok\ntest_recover_reserved_name_rejected (test_svc_u2.U2ReleaseTests.test_recover_reserved_name_rejected) ... ok\ntest_recover_respects_explicit_stop (test_svc_u2.U2ReleaseTests.test_recover_respects_explicit_stop) ... ok\ntest_recover_restarts_sigkilled_service (test_svc_u2.U2ReleaseTests.test_recover_restarts_sigkilled_service) ... ok\ntest_recover_skips_when_lock_held (test_svc_u2.U2ReleaseTests.test_recover_skips_when_lock_held) ... ok\ntest_start_reclaims_own_orphan_without_pidfile (test_svc_u2.U2ReleaseTests.test_start_reclaims_own_orphan_without_pidfile)\n模拟 update 误清 pidfile 后本 bin 仍占口:裸 start 应回收并拉起新进程。 ... ok\ntest_start_records_autostart_and_stop_clears (test_svc_u2.U2ReleaseTests.test_start_records_autostart_and_stop_clears) ... ok\ntest_start_rejects_foreign_port_occupant (test_svc_u2.U2ReleaseTests.test_start_rejects_foreign_port_occupant)\n外部 python http.server 占口:start 必须失败并提示非本服务。 ... ok\ntest_stop_on_dead_process_clears_autostart (test_svc_u2.U2ReleaseTests.test_stop_on_dead_process_clears_autostart) ... ok\ntest_watchdog_print_plan (test_svc_u2.U2ReleaseTests.test_watchdog_print_plan) ... ok\ntest_T1_user_list_binds_manifest_data (test_svc_user_binding.UserBindingTests.test_T1_user_list_binds_manifest_data) ... ok\ntest_T2_reject_override_data_flag (test_svc_user_binding.UserBindingTests.test_T2_reject_override_data_flag) ... ok\ntest_T2b_reject_literal_default_data (test_svc_user_binding.UserBindingTests.test_T2b_reject_literal_default_data) ... ok\ntest_T3_missing_data_root_rejected (test_svc_user_binding.UserBindingTests.test_T3_missing_data_root_rejected) ... ok\ntest_T4_no_flock_rejects_user_and_deploy (test_svc_user_binding.UserBindingTests.test_T4_no_flock_rejects_user_and_deploy) ... ok\ntest_T5_identity_regression_smoke (test_svc_user_binding.UserBindingTests.test_T5_identity_regression_smoke) ... ok\ntest_recover_fails_when_port_stolen (test_svc_user_binding.UserBindingTests.test_recover_fails_when_port_stolen) ... ok\ntest_recover_ignores_never_started_service (test_svc_user_binding.UserBindingTests.test_recover_ignores_never_started_service) ... ok\ntest_recover_noop_while_running (test_svc_user_binding.UserBindingTests.test_recover_noop_while_running) ... ok\ntest_recover_reserved_name_rejected (test_svc_user_binding.UserBindingTests.test_recover_reserved_name_rejected) ... ok\ntest_recover_respects_explicit_stop (test_svc_user_binding.UserBindingTests.test_recover_respects_explicit_stop) ... ok\ntest_recover_restarts_sigkilled_service (test_svc_user_binding.UserBindingTests.test_recover_restarts_sigkilled_service) ... ok\ntest_recover_skips_when_lock_held (test_svc_user_binding.UserBindingTests.test_recover_skips_when_lock_held) ... ok\ntest_start_reclaims_own_orphan_without_pidfile (test_svc_user_binding.UserBindingTests.test_start_reclaims_own_orphan_without_pidfile)\n模拟 update 误清 pidfile 后本 bin 仍占口:裸 start 应回收并拉起新进程。 ... ok\ntest_start_records_autostart_and_stop_clears (test_svc_user_binding.UserBindingTests.test_start_records_autostart_and_stop_clears) ... ok\ntest_start_rejects_foreign_port_occupant (test_svc_user_binding.UserBindingTests.test_start_rejects_foreign_port_occupant)\n外部 python http.server 占口:start 必须失败并提示非本服务。 ... ok\ntest_stop_on_dead_process_clears_autostart (test_svc_user_binding.UserBindingTests.test_stop_on_dead_process_clears_autostart) ... ok\ntest_watchdog_print_plan (test_svc_user_binding.UserBindingTests.test_watchdog_print_plan) ... ok\ntest_full_help_mentions_user_binding (test_svc_user_help.UserHelpTests.test_full_help_mentions_user_binding) ... ok\ntest_help_accounts_lists_six_commands (test_svc_user_help.UserHelpTests.test_help_accounts_lists_six_commands) ... ok\ntest_topics_and_short_and_lifecycle_mention_accounts (test_svc_user_help.UserHelpTests.test_topics_and_short_and_lifecycle_mention_accounts) ... 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_default_branch_at_origin_main_does_not_block (test_task.FinishGuardFixTests.test_local_default_branch_at_origin_main_does_not_block)\n克隆默认分支停在 origin/main 顶端(pin 为 feature 顶端时不在其历史内) ... 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_close_backfills_card_landed_as_squash (test_task.TaskLifecycleTests.test_close_backfills_card_landed_as_squash) ... /home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/unittest/case.py:704: ResourceWarning: unclosed \n function, args, kwargs = self._cleanups.pop()\nResourceWarning: Enable tracemalloc to get the object allocation traceback\nok\ntest_close_ignores_squash_claim_when_sha_not_on_main (test_task.TaskLifecycleTests.test_close_ignores_squash_claim_when_sha_not_on_main) ... /home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/unittest/case.py:704: ResourceWarning: unclosed \n function, args, kwargs = self._cleanups.pop()\nResourceWarning: Enable tracemalloc to get the object allocation traceback\nok\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_long_merge_history_keeps_merged_card_visible_and_closable (test_task.TaskLifecycleTests.test_long_merge_history_keeps_merged_card_visible_and_closable) ... ok\ntest_post_merge_is_silent_outside_main_checkout (test_task.TaskLifecycleTests.test_post_merge_is_silent_outside_main_checkout) ... ok\ntest_post_merge_main_merge_only_reminds_owner (test_task.TaskLifecycleTests.test_post_merge_main_merge_only_reminds_owner) ... ok\ntest_post_merge_main_pull_only_reminds_owner (test_task.TaskLifecycleTests.test_post_merge_main_pull_only_reminds_owner) ... ok\ntest_precheck_facts_row_with_escaped_pipe_stays_fresh (test_task.TaskLifecycleTests.test_precheck_facts_row_with_escaped_pipe_stays_fresh) ... 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_precheck_routes_existing_project_delivery_policy (test_task.TaskLifecycleTests.test_precheck_routes_existing_project_delivery_policy) ... 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_conflict_is_not_reported_as_synced (test_task.TaskLifecycleTests.test_sync_conflict_is_not_reported_as_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_new_base_reports_actual_final_head (test_task.TaskLifecycleTests.test_sync_new_base_reports_actual_final_head) ... 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_dirty_parent_and_staged_changes (test_task.TaskLifecycleTests.test_sync_preserves_dirty_parent_and_staged_changes) ... 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_rejects_unreachable_target_without_changing_head (test_task.TaskLifecycleTests.test_sync_rejects_unreachable_target_without_changing_head) ... ok\ntest_sync_same_base_preserves_head_and_card (test_task.TaskLifecycleTests.test_sync_same_base_preserves_head_and_card) ... 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_local_precheck_allows_known_lag_without_changing_head (test_task_recovery.TaskRecoveryTests.test_local_precheck_allows_known_lag_without_changing_head) ... ok\ntest_local_precheck_never_advertises_delivery_even_when_current (test_task_recovery.TaskRecoveryTests.test_local_precheck_never_advertises_delivery_even_when_current) ... ok\ntest_local_precheck_rejects_dirty_state_and_unknown_remote (test_task_recovery.TaskRecoveryTests.test_local_precheck_rejects_dirty_state_and_unknown_remote) ... ok\ntest_local_precheck_rejects_foreign_registration (test_task_recovery.TaskRecoveryTests.test_local_precheck_rejects_foreign_registration) ... ok\ntest_local_precheck_rejects_invalid_baseline (test_task_recovery.TaskRecoveryTests.test_local_precheck_rejects_invalid_baseline) ... ok\ntest_local_precheck_rejects_main_and_missing_registration (test_task_recovery.TaskRecoveryTests.test_local_precheck_rejects_main_and_missing_registration) ... ok\ntest_local_precheck_rejects_wrong_branch_registration (test_task_recovery.TaskRecoveryTests.test_local_precheck_rejects_wrong_branch_registration) ... ok\ntest_local_receipt_cannot_start_a_task_or_resume_for_delivery (test_task_recovery.TaskRecoveryTests.test_local_receipt_cannot_start_a_task_or_resume_for_delivery) ... ok\ntest_local_resume_imports_original_receipt_without_sync (test_task_recovery.TaskRecoveryTests.test_local_resume_imports_original_receipt_without_sync) ... ok\ntest_local_resume_rejects_divergent_target_before_import (test_task_recovery.TaskRecoveryTests.test_local_resume_rejects_divergent_target_before_import) ... ok\ntest_local_resume_rejects_target_rewind_before_import (test_task_recovery.TaskRecoveryTests.test_local_resume_rejects_target_rewind_before_import) ... ok\ntest_make_resume_exports_the_selected_mode_and_receipt (test_task_recovery.TaskRecoveryTests.test_make_resume_exports_the_selected_mode_and_receipt) ... ok\ntest_resume_rejects_another_worktree_with_same_head (test_task_recovery.TaskRecoveryTests.test_resume_rejects_another_worktree_with_same_head) ... ok\ntest_resume_rejects_changed_source_head (test_task_recovery.TaskRecoveryTests.test_resume_rejects_changed_source_head) ... ok\ntest_strict_resume_imports_current_ready_receipt (test_task_recovery.TaskRecoveryTests.test_strict_resume_imports_current_ready_receipt) ... ok\ntest_strict_resume_rejects_target_advance (test_task_recovery.TaskRecoveryTests.test_strict_resume_rejects_target_advance) ... ok\ntest_unknown_validation_purpose_is_rejected (test_task_recovery.TaskRecoveryTests.test_unknown_validation_purpose_is_rejected) ... ok\ntest_unknown_work_mode_is_rejected (test_task_recovery.TaskRecoveryTests.test_unknown_work_mode_is_rejected) ... 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 344 tests in 255.591s\n\nOK (skipped=18)\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-goal-first-delivery'\n", + "output_sha256": "b86b1675c5f05e6adfef6e167095041c76291e16fca2ad2d15b903284ce2f383", + "receipt_sha256": "dfbb7c4fbd793b9f6a669818460dcd77ef8ce3cbe84e52f901109a2f115d7d8a" +} +``` diff --git a/AGENTS.md b/AGENTS.md index bcc40c3a..f7c21607 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -3,9 +3,22 @@ 本仓开发遵循 Development-Guidelines(见 `deps/development-guidelines`,gitlink 固定版本): 核心规则与术语见其 `core/`,按任务触发阅读 `standards/` 专题;通用交付依据为 `workflows/delivery.md`。 本项目的需求、设计试验、实施调整及交付**必读 [policy/delivery.md](policy/delivery.md)**: -需求、方案、实施与验收默认逐阶段人工评审,阶段内迭代、按影响回退;代码 Review 与 PR -合入由智能体负责,解决冲突且当前 HEAD 的 CI 通过后执行合入,无需另请人工操作。 -具体评审、版本及授权条件见 policy/delivery.md;其他阶段仅在用户明确授权范围内连续推进。 +目标、范围和交付终点一次确认;范围内的分析、方案、实施、修复、验证、代码 Review、 +PR 合入及安全收口由智能体连续推进。只在目标/范围/验收条件变更、存在会影响用户结果的 +重大取舍、触及高后果操作,或业务验收必须由用户判定时请求人工决策。智能体解决冲突并确认 +当前 HEAD 的 CI 通过后执行合入,无需另请人工操作。具体决策点、版本及授权条件见 +policy/delivery.md。 + +## 任务目标与范围(强制) + +- 执行优先级固定为:授权与安全边界 → 本次任务目标和系统可用 → 阻塞目标的必要问题 → + 非阻塞改进。完成标准是已批准验收条件成立且受影响系统保持可用,不是把所有附近问题一并清零。 +- 绝对禁止私自扩大范围。影响目标的问题仅在既有授权内作最小充分修复;必要修复超出范围时,说明 + 阻塞、最小扩围和影响,取得授权后再做。“相关”、“顺手”或“更完美”不构成扩围授权。 +- 新发现按对当前目标的影响分流:阻塞验收、导致不可用/明确回归、违反安全边界或必需门禁失败的问题必须 + 处理;其余不阻塞交付。只有具备明确影响和后续价值的非阻塞问题才记录,不为低影响噪音制造新任务。 +- 先实现端到端可用和可验证的最小闭环,再将体验、结构、性能及治理优化作为独立增量迭代;非阻塞 Review + 意见不得阻止当前目标交付。 ## UI 设计门禁(强制) @@ -39,14 +52,15 @@ - **多个分支交付 / CI 调度**:先读 [合入调度](policy/merge-queue.md),核对采纳状态、协调者、 记录及当前窗口。新模式尚未启用时保留既有同步节点;启用后最终同步至合入核验共用窗口, 同基线 `task-sync` 只核验,固定后检查用源码外 RECEIPT 保存(见 [证据流程](policy/governance.md#候选固定前后))。 -- 合入后由工作区 owner 确认所有写者退出,在**已登记任务 worktree 根目录**运行 +- 合入后核对所有写者退出;能从当前会话、进程、锁与工作区状态证明时,智能体在 + **已登记任务 worktree 根目录**运行 `TASK_WRITERS_STOPPED=1 make task-finish`。父子仓改动、未跟踪/ignored 唯一文件先保存或显式处置;删除被拒时 - 保留现场并按原因处理,禁止强删兜底。放弃未合入工作用 + 保留现场并按原因处理,禁止强删兜底;无法证明写者已退出时才请 owner 确认。放弃未合入工作用 `make task-finish ABANDON="--abandon <原因>"` 并记录原因;放弃不豁免现场保护。 - **任务卡闭合(防欠账)**:分支合入 main 后,其任务卡须回填"已完成"+主记录 PR 链接并 - 归档至 `.task/archive/`。`task-finish` 回收后提示所有者运行 `make task-close`,不借回收修改 + 归档至 `.task/archive/`。`task-finish` 回收后按提示运行 `make task-close`,不借回收修改 共享主检出或推送另一任务。主检出 pull/merge 的 post-merge 钩子仅提示待办,不自动写入或推送。 - `make task-close` 会提交、推送并可能创建 PR,须先核对闭合范围和对应授权。闭合在主检出运行→建 + `make task-close` 会提交、推送并可能创建 PR,标准闭合属于已授权交付的收口;仍须核对只包含本任务卡,否则停止扩围。闭合在主检出运行→建 `feature/card-close-*` 分支+PR,任务分支内加 `FOLD=--fold` 随当前 PR 合入。 precheck 的 `[cards]` 行报告欠账,验收前应清零;闭合 PR 同样由智能体按 policy/delivery.md 完成 Review、冲突处置及当前 HEAD 的 CI 核验后合入。 @@ -110,5 +124,5 @@ - **SSH key**:`~/.ssh/home_gitea`(ED25519,公钥指纹 `SHA256:GYXaOXIMeloQ1fKSfdJ/ndgPQzs/Ix7Hk62ekfkfQ20`,Gitea 侧密钥名 GMKtec); `~/.ssh/config` 已有 `git-ssh.u1680832.nyat.app` 主机条目,克隆/推送直接可用。 -- 任务卡闭合 PR(获授权后运行 `make task-close`)经 API 建 PR 时以 +- 任务卡闭合 PR(标准收口中运行 `make task-close`)经 API 建 PR 时以 `GITEA_TOKEN` 环境变量传入同上的 token。 diff --git a/policy/adoption.md b/policy/adoption.md index 4680737a..7764c29c 100644 --- a/policy/adoption.md +++ b/policy/adoption.md @@ -13,12 +13,12 @@ |---|---|---| | core/baseline.md | 日常 | manual | | workflows/delivery.md(含启动自检 §1) | 交付 | 本地命令检查;首次收据与 BUSY/SYNC/REMOTE_UNVERIFIED 语义见 policy/governance.md | -| standards/collaboration.md | 并行/同步节点 | **enforced(本地命令)**:分支、现场、组件检查;task-sync 实际合并时记录,同基线只核验。最终平台与阶段授权另验 | +| standards/collaboration.md | 并行/同步节点 | **enforced(本地命令)**:分支、现场、组件检查;task-sync 实际合并时记录,同基线只核验。最终平台准入与任务授权边界另验 | | 提交格式(主题行/四段 body) | 全部提交 | 主题行 enforced(local),body manual;任务工具生成四段 body,历史 PR 仅作旧版本证据 | | standards/verification.md | 验收 | 本地 make test-governance + 组合测试;当前证据与历史 scratch 记录分开 | | standards/multi-repo.md | 跨仓/gitlink | manual;受控历史迁移通道已于 2026-09-30 行使一次(documents/records/2026-09-30-history-migration.md) | | 工作区回收 | 交付终点 | advisory(task-finish);负例:合入前 finish 拒绝输出 | -| policy/delivery.md(项目收紧) | 需求、长期方向、试验、实施迭代及交付 | manual(人工/Agent 执行):前序人工决策与有范围的连续推进授权;智能体完成 Review、冲突处置和当前 HEAD 的 CI 核验后合入;任务卡提供记录,post-merge 默认只提示,行为回归见 tests/test_task.py | +| policy/delivery.md(项目收紧) | 需求、长期方向、试验、实施迭代及交付 | goal-first:目标/范围/终点一次确认,范围内智能体连续完成实施、验证、Review、合入和安全收口;仅真实决策点需人工;任务卡提供记录,post-merge 默认只提示,行为回归见 tests/test_task.py | | standards/tool-adaptation.md(draft.8) | 为工具创建规则/钩子实例 | 本组合 CLI/git 级实例已登记:policy/tool-adaptation-matrix.md(A1–A7 逐行定级+正负例证据) | | 同上(zcode 实例) | zcode 客户端写路径 | policy/tool-adaptation-zcode.md:PreToolUse 写守卫;脚本负例与客户端接线分开,客户端 pending-live | | core/baseline.md「规范层级」+ documentation.md「记忆分层/机制化」(draft.9) | 层级效力、记忆权威、经验机制化 | manual:本仓 policy/ 仅收紧不放宽;记忆四层按条文执行(任务卡=任务记忆,documents/records=项目记忆,Dev 仓 AGENTS.md 指针已就位) | @@ -29,7 +29,7 @@ | 原规则/章节 | 项目采用方式 | 原因与风险 | 负责人/复查条件 | |---|---|---|---| | baseline 硬边界 1(授权范围) | 高后果双钥匙:改写历史/解除分支保护/删归档/发布——Agent 只准备,用户执行(AGENTS.md 条文) | 单人+Agent 场景下消除单点;风险=用户不在场时高后果操作排队 | weichen;首次触发时复查 | -| delivery.md §2、design-verification.md 的轻量流程默认做法 | 按 [policy/delivery.md](delivery.md) 保留需求、方案、实施与验收的人工节点;代码 Review 与 PR 合入交由智能体,冲突解决且当前 HEAD 的 CI 通过后合入;小任务简化篇幅,阶段内可迭代 | 2026-10-12 用户明确要求智能体 Review 后合入,合入前解决冲突且 CI 通过;其他人工决策与高后果双钥匙边界保留 | weichen;Review、CI 或平台准入条件变化时复查 | +| delivery.md §2、design-verification.md 的轻量流程默认做法 | 按 [policy/delivery.md](delivery.md) 保留阶段产物和验证,移除逐阶段人工签字;目标、范围和终点一次确认后,智能体连续完成范围内交付,只在结果变更、重大取舍、高后果操作或用户专属验收时请求决策 | 2026-10-15 用户要求目标优先、绝不私自扩围、先可用再迭代,并移除可移除的人工环节;独立 Review、证据、平台准入和高后果双钥匙保留 | weichen;目标/授权边界、Review、CI 或平台准入条件变化时复查 | - 历史记录(2026-09-30)报告 11 个组合仓 main 禁直推、拒绝陈旧候选;当前平台能力须独立重验,本地脚本测试不替代远端证据。 - 规范源码以 gitlink 及其 VERSION 为准,流程启用以本采纳状态及项目条件为准;固定源码版本不代替实际能力证明。治理可靠性修复的命令与证据约定见 [开发门禁](governance.md),本地与客户端/平台能力分别登记;本轮不改变分支保护或发布授权。 diff --git a/policy/delivery.md b/policy/delivery.md index 252aa9c2..01b586c4 100644 --- a/policy/delivery.md +++ b/policy/delivery.md @@ -2,53 +2,76 @@ 适用:本项目的需求、修复、规范修改和其他交付任务。依据固定版本的 [通用交付流程](../deps/development-guidelines/workflows/delivery.md),本项目收紧为 -**需求、方案、实施与验收默认逐阶段人工评审;代码 Review 与 PR 合入由智能体完成; -阶段内迭代,按影响回退,按增量交付**。 -本文件是阶段与评审的权威表述;启动、同步、命令证据和回收操作见 +**目标、范围和交付终点一次确认;范围内连续推进;问题按是否阻塞目标分流; +先可用、再迭代完善**。代码 Review 和 PR 合入由智能体完成。 +本文件是阶段、决策点与连续执行的权威表述;启动、同步、命令证据和回收操作见 [开发门禁](governance.md)。规则的执行能力见 [能力矩阵](tool-adaptation-matrix.md)。 -## 授权与阶段评审 +## 授权、决策点与连续执行 -任务卡默认记为 `manual`。阶段 1–7 完成当前阶段产物并取得人工评审结论后,才进入下一阶段; -阶段 8–9 由智能体执行 Review 和合入,条件见下文「智能体 Review 与 PR 合入」。 -评审记录包含阶段、对象版本、评审人、时间、结论、意见及可追溯依据;结论使用 -未评审、通过、需修改、拒绝、不适用。人工结论与命令执行证据分开记录;Agent 自审、 -测试通过、工具写入或用户沉默均不能代替阶段 1–7 的人工批准,也不能由作者代签独立审核。 +任务卡默认记为 `goal-first`。用户的直接请求在目标、允许动作、写入对象和交付终点足够明确时, +即是对该范围的执行授权;方案、审计或只读请求仍不包含业务实施,本地实施不自动包含部署、迁移或共享环境写入。 +授权一旦成立,范围内的调查、需求拆解、方案选择、计划、编辑、必要缺陷修复、测试、Review、PR 合入和安全收口连续推进, +不逐阶段、逐文件、逐命令重复请求批准。阶段用于追溯和质量控制,不是默认的人工停顿点。 -只有用户明确要求自动或连续推进时,才将对应范围记为 `authorized-continuous`,记录 -授权来源、覆盖阶段、允许动作、交付终点、资源约束和停止条件。未覆盖的人工节点仍逐阶段 -人工评审;智能体 Review/合入按阶段 8–9 的职责与条件执行。 -授权连续推进不免除需求分析、试验判定、测试、代码 Review、证据和平台准入; -既有独立审核要求及高后果操作双钥匙仍有效。智能体合入职责不补齐尚不存在的前序产物。 +只有以下情况请求人工决策: -阶段内已授权的调查、编辑、自检、缺陷修复和等价实现可以持续进行,无需逐命令批准。 -需求拆解、评估、需求表可以共用一份任务卡,但分别保留阶段结论。小任务缩短篇幅; -确实不适用的内容说明原因,经人工确认或在明确授权的裁剪范围内处理,不能静默跳步。 -任务启动检查、独立工作区和收据用于准备现场,不表示任何阶段评审已通过。 +- 目标、范围、优先级、验收条件或交付终点将发生变化; +- 多个可行选项会造成不同的用户结果、公开契约、权限/数据语义或持续运维成本,且现有决策无法确定取舍; +- 触及未授权共享环境、外部资源/成本、不可逆或本仓定义的高后果双钥匙操作; +- 用户感受、业务判断、用户持有的凭据/设备或平台 owner 操作使验收无法由可复核证据自动完成。 + +存在决策点时,只暂停受影响部分,提交具体选项、影响和推荐;其他已授权且不受影响的工作继续。 +用户沉默不补齐真实决策点,但 Agent 自审、测试进展和工具记录也不得被包装成新的人工门禁。 +独立 Review、证据、平台准入和高后果双钥匙仍有效;它们保证交付质量和安全,不扩大业务授权。 + +需求拆解、评估、方案和计划可以共用一份任务卡。小任务只记录目标、范围、验收、关键决定和验证; +不适用的阶段标记原因后直接跳过。任务启动检查、独立工作区和收据用于准备现场,不表示业务结果已验证。 + +## 目标优先、范围控制与问题分流 + +执行顺序为: + +` 授权与安全边界 → 任务目标和系统可用 → 直接阻塞项 → 后续改进 `。 + +当前任务的完成标准是已批准的验收条件成立、目标用户链路可用,且受影响的既有关键能力没有明确回归。 +完成不要求把所有邻近代码、历史欠账、工具噪音和低影响建议同时清零。先形成端到端可用、可验证的最小闭环, +再把体验、结构、性能和治理优化作为独立增量。 + +新发现按以下标准处理: + +| 类别 | 判定 | 当前任务动作 | +|---|---|---| +| 阻塞项 | 直接导致目标无法实现、验收条件失败、系统/关键回归不可用、安全边界违反或必需门禁失败 | 在已授权范围内作最小充分修复;若超出范围,提交最小扩围决策 | +| 有价值非阻塞项 | 当前目标仍可交付,但有具体影响、复发风险或明确后续价值 | 只记录事实、影响和建议归属,不在当前任务修复,不阻塞交付 | +| 低影响噪音 | 不影响目标、可用性、安全、回归或后续决策 | 忽略或在当前记录中一句带过;不新建任务、不阻塞、不扩围 | + +“影响目标”只决定问题的优先级,不自动扩大授权。“相关”、“顺手”、“重构更干净”、“以后可能用到”都不是当前实施依据。 +Review 只将阻塞项列为必修;非阻塞意见标明后续建议,不得以“更完善”为由拒绝已达标且可用的当前增量。 ## 阶段与出口 | 阶段 | 必需产物 | 进入下一阶段的条件 | |---|---|---| -| 1 需求拆解 | 目标、用户场景、子需求、边界、非目标及待澄清问题 | 人工确认拆解与原始意图一致 | -| 2 需求评估 | 价值、可行性、成本、风险、依赖、现有能力及在途任务重叠;与项目定位、模块职责和公开契约的符合度 | 人工确认取舍;重大未知转入下述受控试验 | -| 3 需求表确认 | 稳定 ID、描述、适配依据、优先级、可判定验收条件、依赖和处理结论 | 人工确认本增量范围;影响实施的关键待核实项已处理 | -| 4 方案设计 | 推荐方案与主要备选、职责和接口、数据与权限影响、失败恢复、待验证假设及试验结论 | 人工批准当前方案版本及剩余风险处理方式 | -| 5 实施计划 | 关联需求的工作项、依赖顺序、责任人、文件或模块范围、测试方法与环境、完成条件及停止条件 | 人工批准当前实施和测试计划;远期工作可保留粗粒度 | -| 6 实施与自检 | 可审查变更、局部测试、计划偏差与迭代记录 | 人工确认当前增量实现产物,必要设计调整已重新获批 | -| 7 正式测试与验收 | 需求到证据映射;正常、异常、边界、回归结果及缺项 | 人工审阅当前候选的验证结果;正式验收前同步并固定被测对象 | +| 1 需求拆解 | 目标、用户场景、子需求、边界、非目标及待澄清问题 | 目标、授权范围和交付终点可执行;只有会改变结果的歧义才触发决策点 | +| 2 需求评估 | 价值、可行性、成本、风险、依赖、现有能力及在途任务重叠;与项目定位、模块职责和公开契约的符合度 | 无需用户取舍的评估由智能体结论;重大未知转入受控试验或具体决策点 | +| 3 需求表确认 | 稳定 ID、描述、适配依据、优先级、可判定验收条件、依赖和处理结论 | 当前增量与授权一致;影响实施的关键事实已核实或显式标注限制 | +| 4 方案设计 | 推荐方案与必要备选、职责和接口、数据与权限影响、失败恢复、待验证假设及试验结论 | 在已批准目标内选定最小充分方案;只有重大取舍触发人工决策 | +| 5 实施计划 | 关联需求的工作项、依赖顺序、责任人、文件或模块范围、测试方法与环境、完成条件及停止条件 | 计划足以执行且不扩大授权;远期工作保留粗粒度但不纳入当前任务 | +| 6 实施与自检 | 可审查变更、局部测试、计划偏差与迭代记录 | 当前增量达到验收条件,范围内阻塞项已闭合,非阻塞项已按价值分流 | +| 7 正式测试与验收 | 需求到证据映射;正常、异常、边界、回归结果及缺项 | 同步并固定被测对象,必需自动验证有有效证据;仅用户可判定的验收单独请求人工结论 | | 8 代码 Review | 智能体审阅者、对象版本、需求符合性、正确性、维护性、测试充分性及问题闭合记录 | 智能体完成必要重放、整改、补测和复审;当前版本 Review 通过,平台要求的独立批准已满足 | | 9 合入 | 最新 base/head、当前 HEAD 的 CI、Review、冲突处置和合入结果 | 智能体再次同步,确认冲突已解决、Review 有效且 CI 全部通过,经 PR 执行合入并核验真实结果;无需另请人工合入 | -| 10 合入核验与收口 | 实际合入内容及组件版本、验证依据、成果保存位置、写者状态、清理清单、任务归档安排及适用规划的进展与下一步建议 | 清理前取得人工批准或对应连续推进授权;安全回收后核对结果、闭合任务卡 | +| 10 合入核验与收口 | 实际合入内容及组件版本、验证依据、成果保存位置、写者状态、清理清单、任务归档安排及适用规划的进展与下一步建议 | 证明成果已保存、所有写者已退出并且回收条件满足后,智能体安全回收并闭合任务卡;无法证明时保留现场并请求决策 | -阶段 1–7 和阶段 10 的人工节点仅在明确的连续推进授权范围内按授权执行; -阶段 8–9 按智能体职责执行;各阶段产物及验证条件保留。 +各阶段默认按已授权范围连续执行;只有命中本文定义的决策点才暂停受影响部分。 +阶段产物、独立 Review、验证条件和平台准入保留;移除的是机械性人工签字,不是质量证据。 正式测试和最终 Review 的顺序不限制设计阶段试验、实施期测试或提前审阅。 文本合并无冲突不证明组合兼容;合入后仍核验真实内容与被测候选是否一致。 多个就绪任务的最终验证与合入按 [合入调度](merge-queue.md) 的采纳状态执行。 新模式生效后,阶段 7–9 在同一目标交付窗口内完成;对象未变时各节点重复核验, -不因记录检查再创建提交或重跑有效 CI。窗口领取不代替人工结论、独立 Review 或平台准入; +不因记录检查再创建提交或重跑有效 CI。窗口领取不代替已触发的必要决策、独立 Review 或平台准入; 未生效时继续既有同步规则。固定后的证据按 [源码外收据流程](governance.md#候选固定前后) 保存。 ## 长期方向与任务衔接 @@ -80,7 +103,7 @@ 进展更新和建议属于当前任务的收尾产物。跨仓更新遵循对应工作区、版本和评审要求; 更新尚未获批或合入时,任务卡保留待更新内容、负责人和下一动作,不能声称原规划已更新。 **下一步建议不等于启动授权**:没有覆盖该任务的明确授权,建议停留在待确认状态; -当前任务的完成、批准或连续推进授权不自动扩展到新任务。 +当前任务的完成或执行授权不自动扩展到新任务。 ## 需求表与追溯 @@ -99,13 +122,13 @@ ## 设计探索循环 需求分析和设计阶段允许先试验再完善方案,无须先批准尚未能确定的完整设计。 -执行试验前提交最小试验计划:待回答的问题或假设、对象和隔离环境、方法、预期判据、 -允许副作用、时间或成本边界、停止条件及产物保存或处置方式,并取得人工批准; -已有连续推进授权明确覆盖该试验范围时,引用该授权。 +执行试验前记录最小试验计划:待回答的问题或假设、对象和隔离环境、方法、预期判据、 +允许副作用、时间或成本边界、停止条件及产物保存或处置方式。试验在已授权目标内、可逆、已隔离且不新增外部成本时直接执行; +命中决策点时再请求对应授权。 在已批准范围内可以反复尝试: -`初步方案 → 批准试验范围 → 原型或测试 → 分析证据 → 修订方案与计划 → 结果评审`。 +`初步方案 → 核对授权与试验边界 → 原型或测试 → 分析证据 → 修订方案与计划 → 核对结果`。 记录成功、失败及不确定结果,以及下一步继续探索、采用、换方案或暂停的理由。 超出范围、触及未授权共享环境、达到预算或持续无有效进展时,暂停受影响试验并提交决策。 @@ -131,8 +154,8 @@ | 变化 | 执行动作与评审边界 | |---|---| -| 已批准范围内的内部组织、等价实现、局部缺陷修正 | 当前阶段继续调整、自测并记录;按阶段表由人工或智能体完成出口评审 | -| 技术路线、模块职责、公开契约、数据或权限设计、外部影响,或计划的关键依赖、交付顺序和资源约束变化 | 暂停受影响工作,修订方案或计划,经人工重审后继续;已有明确授权覆盖该类调整时按其边界执行 | +| 已批准范围内的内部组织、等价实现、局部缺陷修正 | 当前阶段继续调整、自测并记录;满足阶段表的客观出口条件后继续 | +| 技术路线、模块职责、公开契约、数据或权限设计、外部影响,或计划的关键依赖、交付顺序和资源约束变化 | 先判断是否改变已批准用户结果或持续成本;否则在范围内调整并补测,是则暂停受影响部分并提交决策 | | 目标、范围、优先级或验收条件变化 | 返回需求评估和需求表,取得对应批准后更新下游方案、计划和验证 | | 影响不明 | 先调查;仍无法判定时提交人工决定,不自行归入细节调整 | @@ -149,11 +172,11 @@ ### 智能体 Review 与 PR 合入 已获实施及交付授权的任务,代码 Review 和所有 PR 合入必须由智能体执行,包括任务卡闭合 PR、 -机器人和紧急通道。用户负责阶段评审及按双钥匙要求亲手调整平台保护;合入统一经智能体的 +机器人和紧急通道。用户只负责已触发的必要决策及按双钥匙要求亲手调整平台保护;合入统一经智能体的 同步、Review、当前 HEAD CI 和平台准入流程完成,不由人工直接点击合入。 本条即该范围内的合入执行授权,条件满足后由智能体直接合入,无需用户再次批准或亲手点击。 用户明确限定为只读、方案、本地修改、草稿 PR 或禁止合入时,以该任务边界为准。 -前序阶段的必要人工结论仍须齐备;合入职责不扩大需求、业务实施、清理或高后果操作授权。 +前序阶段的必要产物和已触发决策结论仍须齐备;合入职责不扩大需求、业务实施、部署/迁移或高后果操作授权。 智能体按以下顺序执行: @@ -181,9 +204,9 @@ ### 清理与恢复 -清理另行核对授权及条件。仅回收本任务登记工作区,按开发门禁核对当前权威目标、 +已授权任务的标准安全收口无需另行人工批准。仅回收本任务登记工作区,按开发门禁核对当前权威目标、 父子仓成果、未跟踪和 ignored 文件、独有提交与引用、活动 Git 操作以及所有写者退出。 -无法证明成果已保存时保留现场;本地删除与远端分支删除分别报告。 +无法证明成果已保存或写者已退出时保留现场并只请求该具体决策;本地删除与远端分支删除分别报告。 清理前保存任务主记录与证据。执行回收时将命令输出用 evidence 的 `RECEIPT` 模式保存到 待删目录之外;回收后的结果写入后续闭合记录,不能向已删除的任务卡补写收据。 diff --git a/policy/governance.md b/policy/governance.md index 8a11844e..ff1cafc2 100644 --- a/policy/governance.md +++ b/policy/governance.md @@ -3,8 +3,8 @@ 本文件细化根 AGENTS.md 的启动、验证和回收规则。通用语义以固定的 `deps/development-guidelines` 为准;门禁实现及回归用例随本仓版本管理。 需求表、设计试验、迭代调整、阶段产物、人工决策及智能体 Review/合入按 -[迭代交付](delivery.md) 执行。任务卡分别记录人工批准、智能体审阅者及对象版本; -本地 evidence 仅记录 SELF 命令,不能证明人工批准或提升为 CI/独立审阅证据。 +[迭代交付](delivery.md) 执行。任务卡分别记录授权边界、必要人工决策点、智能体审阅者及对象版本; +本地 evidence 仅记录 SELF 命令,不能证明授权/人工决策或提升为 CI/独立审阅证据。 ## 启动与恢复 diff --git a/policy/merge-queue.md b/policy/merge-queue.md index 9047c747..4cb63f26 100644 --- a/policy/merge-queue.md +++ b/policy/merge-queue.md @@ -20,7 +20,7 @@ Dev 目标身份使用实际托管实例、仓库 ID 与 `refs/heads/main`;其 采纳后的首版使用每个目标一份 Gitea 调度 Issue,由一个明确协调者维护,标为 manual。 任务卡引用 Issue 条目及尝试标识,原任务仍是授权、需求和阶段的状态权威。 -共享记录已建立:[Dev main 调度记录 #518](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/issues/518),包含实际托管实例、仓库 ID 和目标引用。用户已指定当前交付智能体负责后续人工协调,weichen 保留阶段评审和平台保护操作;具体任期与接管约束以该记录为准。 +共享记录已建立:[Dev main 调度记录 #518](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/issues/518),包含实际托管实例、仓库 ID 和目标引用。用户已指定当前交付智能体负责后续协调,weichen 保留必要决策和平台保护操作;具体任期与接管约束以该记录为准。 本轮仅协调已获授权的三个真实任务,入队/阻塞/当前窗口及时维护于 #518。普通、闭合、机器人与紧急通道都必须经智能体和同一目标窗口;owner-only 合入账号与无自动合入 workflow/活跃 webhook 的当场清单另留 SELF 收据。用户不亲手合入;API 不具备区分人工与智能体共用账号的身份隔离,协调能力保持 manual。 必须记录目标、条目、执行者、源 HEAD、依赖、顺序、尝试、最终 base/head、组件清单、 @@ -57,18 +57,18 @@ SYNC_REQUIRED 不整体降级为 READY;local 与 delivery 用独立结果和 ## 交付阶段与窗口 -人工评审和独立 Review 要求不变;提前审阅可以并行,最终有效性核验和受影响重放在窗口内完成。 -入队与领取不构成人工批准,也不授权跳过缺失阶段。 +必要人工决策点和独立 Review 要求不变;提前审阅可以并行,最终有效性核验和受影响重放在窗口内完成。 +入队与领取不扩大授权,也不授权跳过缺失产物或门禁。 | 原阶段 | 采纳后的调度衔接 | |---|---| | 1–6 需求、设计、计划、实施 | 各任务并行推进,在既有授权内局部检查;内容就绪时登记交付条目 | -| 7 正式测试与验收 | 领取窗口后实际同步最新 main,固定候选,完成正式验证并取得必要人工结论 | +| 7 正式测试与验收 | 领取窗口后实际同步最新 main,固定候选并完成正式验证;仅无法自动判定的业务验收取得人工结论 | | 8 代码 Review | 对同一固定候选核验有效 Review、独立重放和问题闭合;同步或整改后按影响复审 | | 9 合入 | 保持窗口,核验最新 base/head、全部必需 CI 和平台准入,经 PR 合入并查询真实结果 | -| 10 核验与收口 | 核对合入内容和组件后释放窗口;部署、清理另按原授权,闭合 PR 单独排队 | +| 10 核验与收口 | 核对合入内容和组件后释放窗口;部署另按原授权,标准安全清理连续执行,闭合 PR 单独排队 | -等待人工结论超过预算时进入 blocked 并安全释放窗口;再次领取时判断原结论及证据是否仍适用。 +等待必要人工决策超过预算时进入 blocked 并安全释放窗口;再次领取时判断原结论及证据是否仍适用。 窗口不得长期持有等待新的需求或方案批准;必要前置安排应在入队时说明。 普通失败和需要决策只阻塞当前条目及依赖项;未知合入结果则保持该目标在 reconciling,先对账。 diff --git a/policy/tool-adaptation-matrix.md b/policy/tool-adaptation-matrix.md index a8c7d0a6..50dfef87 100644 --- a/policy/tool-adaptation-matrix.md +++ b/policy/tool-adaptation-matrix.md @@ -7,15 +7,15 @@ | 要求 | 执行能力及范围 | 机制 | 复验入口 | |---|---|---|---| -| A1 启动/恢复 | 本地命令阻断;首次调用及阶段授权仍属 manual | 默认严格 READY;显式 local 验证既有任务/R0及 LOCAL_READY;start 固定严格用途,resume 验证后导入 | `tests/test_task.py`、`tests/test_task_recovery.py`、`tests/test_evidence.py` | +| A1 启动/恢复 | 本地命令阻断;首次收据必需,不创建阶段人工停顿 | 默认严格 READY;显式 local 验证既有任务/R0及 LOCAL_READY;start 固定严格用途,resume 验证后导入 | `tests/test_task.py`、`tests/test_task_recovery.py`、`tests/test_evidence.py` | | A2 同步 | 本地命令阻断;最终准入由平台承担 | 合并父仓、保护组件分支、物化固定指针、同基线幂等、完整最终 SHA | `tests/test_task.py`、`make test-worktree` | | A3 集成分支 | 本地提交闸;平台状态须独立核验 | pre-commit 拒绝 main/master 与坏分支名 | 本地 hook 负例;远端缺 CI/陈旧候选/直推等负例另验 | -| A4 提交格式 | 主题行 enforced(local),body manual | commit-msg 校验宽度/句点;任务工具生成四段 body | `tests/test_task.py`;人工核对 PR/卡片同源 | -| A5 回收 | 本地命令检查;写者退出由 owner 确认 | 登记根目录、锁/操作状态、父子仓与唯一文件、合入核验 | `tests/test_task.py` | +| A4 提交格式 | 主题行 enforced(local),body manual | commit-msg 校验宽度/句点;任务工具生成四段 body | `tests/test_task.py`;智能体核对 PR/卡片同源 | +| A5 回收 | 本地命令检查;写者退出须可证明,无法证明时才请求 owner 决策 | 登记根目录、锁/操作状态、父子仓与唯一文件、合入核验 | `tests/test_task.py` | | A6 秘密 | 本地脱敏及 CI 获取边界;权限与宿主隔离另验 | 命令/输出/摘要脱敏,凭据不持久写 Git 配置 | `tests/test_evidence.py`、`tests/test_ci_credentials.py` | | A7 证据 | 本地 SELF 收据;外部来源独立核验 | 首次捕获、完整脱敏输出/摘要、对象记录、原样导入 | `tests/test_evidence.py`;CI/审阅链接另核 | -| A8 阶段评审与迭代 | manual(人工/Agent 执行);前序人工决策,智能体 Review/合入;模板和提示不构成批准身份校验或全流程阻断 | policy/delivery.md;任务卡分别记录阶段结论、Review、冲突、当前 HEAD 的 CI 和合入;post-merge 默认仅提示 | `tests/test_task.py` 核对模板及钩子不自动写入;智能体核对 Review、冲突及匹配 HEAD 的 CI/平台准入;人工批准范围仍须核验 | -| A9 长期方向与后续任务 | manual;模板不校验规划有效性或自动调度任务 | policy/delivery.md;PROJECT.md 提供规划入口,任务卡关联规划/里程碑并记录下一步建议 | `tests/test_task.py` 核对生成字段与未授权默认值;人工核对当前规划、进展、重复任务和建议依据 | +| A8 阶段记录与迭代 | goal-first;模板默认连续执行,仅真实决策点需人工,没有全流程授权强制 | policy/delivery.md;任务卡分别记录阶段状态、决策点、Review、冲突、当前 HEAD 的 CI 和合入;post-merge 默认仅提示 | `tests/test_task.py` 核对 goal-first 模板及钩子不自动写入;智能体核对授权范围、Review、冲突及匹配 HEAD 的 CI/平台准入 | +| A9 长期方向与后续任务 | manual;模板不校验规划有效性或自动调度任务 | policy/delivery.md;PROJECT.md 提供规划入口,任务卡关联规划/里程碑并记录下一步建议 | `tests/test_task.py` 核对生成字段与未授权默认值;智能体核对当前规划、进展、重复任务和建议依据,新任务仍不自动获得授权 | | A10 交付窗口 | manual 受控试行;无自动互斥或接管 | policy/merge-queue.md;Issue #518 与协调者已登记,本候选固定实际合入规范版本;用户授权本轮三个任务并指定单一协调者;已实测平台机制及当前写者清单,当前候选组合与最终准入另核验 | tests/test_merge_queue_trial.py 临时 Git 场景 SELF;平台机制独立 REPLAY 已完成(范围见 Issue518);真实三任务及复盘待完成 | | A11 固定后证据 | manual 选择源码外位置;工具捕获绝对未用路径/原始输出;无 OS 冻结 | policy/governance.md;RECEIPT 捕获,后续授权闭合再原样导入 | `tests/test_evidence.py` 固定对象、权限、覆盖拒绝、原样导入与幂等 | diff --git a/scripts/task.sh b/scripts/task.sh index 50e710ba..184bd2fc 100755 --- a/scripts/task.sh +++ b/scripts/task.sh @@ -200,9 +200,9 @@ cmd_start() { - 工作区:${wt}(worktree);分支:${name} ${parent_note} - 授权与交付终点:<本次允许的动作与终点;未授权事项写明> -- 交付模式:manual(前序人工决策,智能体 Review/合入);其他阶段明确授权后可记为 authorized-continuous +- 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进) - 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入) -- 自动推进授权:无;授权范围:无;授权来源:无;授权终点:无;停止条件:无(未授权) +- 人工决策点:仅限目标/范围/验收变更、重大取舍、高后果操作或无法自动判定的业务验收 - 当前阶段:需求拆解;当前增量:I1(待定义) - 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位) @@ -228,26 +228,26 @@ ${parent_note} - 实施计划引用:待填写(含增量与需求 ID) - 测试计划引用:待填写(含需求 ID 与验收条件) -## 阶段评审 +## 阶段记录 -| 阶段 | 对象版本 | 结论 | 评审人 | 时间 | 依据 | +| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 | |---|---|---|---|---|---| -| 需求拆解 | 待定 | 未评审 | — | — | — | -| 需求评估 | 待定 | 未评审 | — | — | — | -| 需求表确认 | 待定 | 未评审 | — | — | — | -| 方案设计 | 待定 | 未评审 | — | — | — | -| 实施计划 | 待定 | 未评审 | — | — | — | -| 实施与自检 | 待定 | 未评审 | — | — | — | -| 正式测试与验收 | 待定 | 未评审 | — | — | — | -| 代码 Review | 待定 | 未评审 | — | — | — | -| 合入 | 待定 | 未评审 | — | — | — | -| 合入核验与收口 | 待定 | 未评审 | — | — | — | +| 需求拆解 | 待定 | 待执行 | — | — | — | +| 需求评估 | 待定 | 待执行 | — | — | — | +| 需求表确认 | 待定 | 待执行 | — | — | — | +| 方案设计 | 待定 | 待执行 | — | — | — | +| 实施计划 | 待定 | 待执行 | — | — | — | +| 实施与自检 | 待定 | 待执行 | — | — | — | +| 正式测试与验收 | 待定 | 待执行 | — | — | — | +| 代码 Review | 待定 | 待执行 | — | — | — | +| 合入 | 待定 | 待执行 | — | — | — | +| 合入核验与收口 | 待定 | 待执行 | — | — | — | ## 探索试验与迭代 -| 增量/试验 | 假设 | 范围 | 判断和停止条件 | 批准依据 | 结果 | 变更影响 | 需重审补测 | +| 增量/试验 | 假设 | 范围 | 判断和停止条件 | 授权/决策依据 | 结果 | 变更影响 | 需重审补测 | |---|---|---|---|---|---|---|---| -| 待定义 | — | — | — | 未批准 | NOT_RUN | 待评估 | 待评估 | +| 待定义 | — | — | — | 待核对 | NOT_RUN | 待评估 | 待评估 | ## 同步记录 diff --git a/tests/test_task.py b/tests/test_task.py index ccf7b388..478e6c3b 100644 --- a/tests/test_task.py +++ b/tests/test_task.py @@ -705,11 +705,10 @@ class TaskLifecycleTests(unittest.TestCase): self.assertTrue((wt / ".task/feature-new.md").is_file()) card = (wt / ".task/feature-new.md").read_text() self.assertIn("make precheck", card) - self.assertIn("交付模式:manual(前序人工决策,智能体 Review/合入)", card) - self.assertIn("authorized-continuous", card) + self.assertIn("交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进)", card) + self.assertIn("人工决策点:仅限目标/范围/验收变更、重大取舍、高后果操作或无法自动判定的业务验收", card) + self.assertNotIn("authorized-continuous", card) self.assertIn("流程依据:仓库根目录 policy/delivery.md", card) - for field in ("授权范围", "授权来源", "授权终点", "停止条件"): - self.assertIn(f"{field}:无", card) for field in ("当前阶段", "当前增量", "方案引用", "实施计划引用", "测试计划引用"): self.assertIn(field + ":", card) self.assertIn("## 交付调度\n", card) @@ -725,15 +724,15 @@ class TaskLifecycleTests(unittest.TestCase): self.assertIn("路径按仓库根目录定位,归档后不变", planning) self.assertIn("只引用唯一正文", planning) self.assertIn("| ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 |", card) - reviews = card.split("## 阶段评审\n", 1)[1].split("\n## ", 1)[0] - self.assertIn("| 阶段 | 对象版本 | 结论 | 评审人 | 时间 | 依据 |", reviews) + reviews = card.split("## 阶段记录\n", 1)[1].split("\n## ", 1)[0] + self.assertIn("| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |", reviews) for stage in ("需求拆解", "需求评估", "需求表确认", "方案设计", "实施计划", "实施与自检", "正式测试与验收", "代码 Review", "合入", "合入核验与收口"): row = next(line for line in reviews.splitlines() if line.startswith(f"| {stage} |")) - self.assertEqual(row.split("|")[3].strip(), "未评审") + self.assertEqual(row.split("|")[3].strip(), "待执行") self.assertNotIn("通过", reviews) self.assertIn("## 探索试验与迭代", card) - for field in ("假设", "范围", "判断和停止条件", "批准依据", "结果", "变更影响", "需重审补测"): + for field in ("假设", "范围", "判断和停止条件", "授权/决策依据", "结果", "变更影响", "需重审补测"): self.assertIn(field, card.split("## 探索试验与迭代\n", 1)[1].split("\n## ", 1)[0]) self.assertIn("## 规划进展与下一步\n", card) next_step = card.split("## 规划进展与下一步\n", 1)[1].split("\n## ", 1)[0]