From 0bd4bb3e24ccb36ac1a9d36380b0ccd852cd21f0 Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 13 Oct 2026 08:53:28 +0000 Subject: [PATCH 01/29] Record the task card for feature-dependency-workspace Why: establish the authorized task workspace and its initial baseline. Evidence: preserved precheck receipt in .task/feature-dependency-workspace.md; R0=ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1. Impact: task metadata only; the feature workspace starts at ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1. Refs: .task/feature-dependency-workspace.md --- .task/feature-dependency-workspace.md | 132 ++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 .task/feature-dependency-workspace.md diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md new file mode 100644 index 00000000..885f2b3f --- /dev/null +++ b/.task/feature-dependency-workspace.md @@ -0,0 +1,132 @@ +# feature/dependency-workspace 任务卡 + +任务主记录:;状态:进行中;owner:weichen + +## 基线与授权 + +- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1 +- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace(worktree);分支:feature/dependency-workspace + +- 授权与交付终点:<本次允许的动作与终点;未授权事项写明> +- 交付模式:manual(前序人工决策,智能体 Review/合入);其他阶段明确授权后可记为 authorized-continuous +- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入) +- 自动推进授权:无;授权范围:无;授权来源:无;授权终点:无;停止条件:无(未授权) +- 当前阶段:需求拆解;当前增量:I1(待定义) +- 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位) + +## 目标与非目标 + +<预期结果、受影响入口/模块/契约;明确不做什么。> + +## 关联方向与规划 + +- 适用状态:待核对(无适用规划时说明原因) +- 主记录路径/版本:待核对(路径按仓库根目录定位,归档后不变;只引用唯一正文) +- 对应里程碑:待核对 + +## 需求分析 + +| ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 | +|---|---|---|---|---|---|---| +| R1 | 待填写 | 待评估 | 待定 | 待定义 | 待确认 | 待评审 | + +## 方案与计划 + +- 方案引用:待填写(含对象版本) +- 实施计划引用:待填写(含增量与需求 ID) +- 测试计划引用:待填写(含需求 ID 与验收条件) + +## 阶段评审 + +| 阶段 | 对象版本 | 结论 | 评审人 | 时间 | 依据 | +|---|---|---|---|---|---| +| 需求拆解 | 待定 | 未评审 | — | — | — | +| 需求评估 | 待定 | 未评审 | — | — | — | +| 需求表确认 | 待定 | 未评审 | — | — | — | +| 方案设计 | 待定 | 未评审 | — | — | — | +| 实施计划 | 待定 | 未评审 | — | — | — | +| 实施与自检 | 待定 | 未评审 | — | — | — | +| 正式测试与验收 | 待定 | 未评审 | — | — | — | +| 代码 Review | 待定 | 未评审 | — | — | — | +| 合入 | 待定 | 未评审 | — | — | — | +| 合入核验与收口 | 待定 | 未评审 | — | — | — | + +## 探索试验与迭代 + +| 增量/试验 | 假设 | 范围 | 判断和停止条件 | 批准依据 | 结果 | 变更影响 | 需重审补测 | +|---|---|---|---|---|---|---|---| +| 待定义 | — | — | — | 未批准 | NOT_RUN | 待评估 | 待评估 | + +## 同步记录 + +| 节点 | sync_base_sha | tested_head_sha | checked_at | +|---|---|---|---| +| 启动 | ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1 | ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1 | 2026-10-13T08:53:28Z | + +## 证据(Evidence) + + +| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) | +|---|---|---|---|---|---| + +## 结果与验证(完成后填写) + +- 结果: +- 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表> +- 影响与剩余项: + +## 规划进展与下一步 + +- 本次推进/剩余:待核对(依据实际成果更新适用方案/规划) +- 首选下一任务:待核对(无适用规划、已完成或受阻时如实说明,不虚构任务) +- 推荐依据:待填写 +- 前置条件/待确认:待核对 +- 预期产物/验收条件:待定义 +- 重复任务核对:待核对(已有/在途任务、PR 与规划记录) +- 启动授权:未授权(建议不自动启动新任务,仍须明确授权) + +## 合入与清理 + +- Review 记录:NOT_RUN(审阅智能体/平台身份、base/head、结论、问题闭合及重放依据) +- 冲突记录:NOT_RUN(最新目标同步、冲突处置、组合兼容核验及复审/补测) +- CI 记录:NOT_RUN(当前 HEAD 完整 SHA、全部必需检查、运行链接、执行身份及 GATE 结果) +- 合入记录:NOT_RUN(交付授权范围、PR、被核验 HEAD、合入 SHA、目标分支及内容核验) +- 清理记录:NOT_RUN(授权依据、写者退出确认、worktree/分支/任务卡处置) + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T08:52:02.664115+00:00", + "command": "make precheck", + "command_sha256": "8fd03cdee8adbb8562846a1a114cc0623779a8654412cd20aac9b495e7eb0450", + "cwd": "/home/weichen/projects/Agent-System-Dev", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "branch": "main", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {}, + "submodules": " 4f583ca3eeeb07a56a714c5086de84dcd6ad2980 deps/agent-command (remotes/origin/HEAD)\n ed2af3e6048928b1fd0ba6da1f9d0c1bafec82d4 deps/agent-command/deps/development-guidelines (heads/main)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c deps/agent-intent (remotes/origin/HEAD)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-intent/deps/error-code-system (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-intent/deps/logging-system (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n c348441691e8bdab784a03aa9be64d53dacff341 deps/agent-native (remotes/origin/HEAD)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c deps/agent-native/deps/agent-intent (remotes/origin/HEAD)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-native/deps/agent-intent/deps/error-code-system (heads/main)\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 (heads/main)\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 (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-native/deps/logging-system (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 490b0b2dfa1567cb16ff7a7230fd78e52bc2938e deps/agent-squad (remotes/origin/HEAD)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c deps/agent-squad/deps/agent-intent (remotes/origin/HEAD)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/agent-intent/deps/error-code-system (heads/main)\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 (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n c348441691e8bdab784a03aa9be64d53dacff341 deps/agent-squad/deps/agent-native (remotes/origin/HEAD)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c deps/agent-squad/deps/agent-native/deps/agent-intent (remotes/origin/HEAD)\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 (heads/main)\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 (heads/main)\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 (heads/main)\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 (heads/main)\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 (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/logging-system (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/logging-system/deps/development-guidelines (26b562d)\n af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (remotes/origin/HEAD)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\n 4f583ca3eeeb07a56a714c5086de84dcd6ad2980 modules/backend/deps/agent-command (remotes/origin/HEAD)\n ed2af3e6048928b1fd0ba6da1f9d0c1bafec82d4 modules/backend/deps/agent-command/deps/development-guidelines (heads/main)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c modules/backend/deps/agent-intent (remotes/origin/HEAD)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-intent/deps/error-code-system (heads/main)\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 (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n c348441691e8bdab784a03aa9be64d53dacff341 modules/backend/deps/agent-native (remotes/origin/HEAD)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c modules/backend/deps/agent-native/deps/agent-intent (remotes/origin/HEAD)\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 (heads/main)\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 (heads/main)\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 (heads/main)\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 (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 490b0b2dfa1567cb16ff7a7230fd78e52bc2938e modules/backend/deps/agent-squad (remotes/origin/HEAD)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c modules/backend/deps/agent-squad/deps/agent-intent (remotes/origin/HEAD)\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 (heads/main)\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 (heads/main)\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 (remotes/origin/HEAD)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent (remotes/origin/HEAD)\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 (heads/main)\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 (heads/main)\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 (heads/main)\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 (heads/main)\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 (heads/main)\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 (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/logging-system/deps/development-guidelines (26b562d)\n 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/error-code-system (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/logging-system (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/logging-system/deps/development-guidelines (26b562d)\n 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n a73c84b5bee8ae569c4689daa4ead19c9f0a2b65 modules/documents (remotes/origin/feature/rdm-increment-settings-duties)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after": { + "head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "branch": "main", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {}, + "submodules": " 4f583ca3eeeb07a56a714c5086de84dcd6ad2980 deps/agent-command (remotes/origin/HEAD)\n ed2af3e6048928b1fd0ba6da1f9d0c1bafec82d4 deps/agent-command/deps/development-guidelines (heads/main)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c deps/agent-intent (remotes/origin/HEAD)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-intent/deps/error-code-system (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-intent/deps/logging-system (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n c348441691e8bdab784a03aa9be64d53dacff341 deps/agent-native (remotes/origin/HEAD)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c deps/agent-native/deps/agent-intent (remotes/origin/HEAD)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-native/deps/agent-intent/deps/error-code-system (heads/main)\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 (heads/main)\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 (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-native/deps/logging-system (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 490b0b2dfa1567cb16ff7a7230fd78e52bc2938e deps/agent-squad (remotes/origin/HEAD)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c deps/agent-squad/deps/agent-intent (remotes/origin/HEAD)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/agent-squad/deps/agent-intent/deps/error-code-system (heads/main)\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 (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n c348441691e8bdab784a03aa9be64d53dacff341 deps/agent-squad/deps/agent-native (remotes/origin/HEAD)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c deps/agent-squad/deps/agent-native/deps/agent-intent (remotes/origin/HEAD)\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 (heads/main)\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 (heads/main)\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 (heads/main)\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 (heads/main)\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 (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/agent-squad/deps/logging-system (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/agent-squad/deps/logging-system/deps/development-guidelines (26b562d)\n af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (remotes/origin/HEAD)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\n 4f583ca3eeeb07a56a714c5086de84dcd6ad2980 modules/backend/deps/agent-command (remotes/origin/HEAD)\n ed2af3e6048928b1fd0ba6da1f9d0c1bafec82d4 modules/backend/deps/agent-command/deps/development-guidelines (heads/main)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c modules/backend/deps/agent-intent (remotes/origin/HEAD)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-intent/deps/development-guidelines (26b562d)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/agent-intent/deps/error-code-system (heads/main)\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 (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-intent/deps/logging-system/deps/development-guidelines (26b562d)\n c348441691e8bdab784a03aa9be64d53dacff341 modules/backend/deps/agent-native (remotes/origin/HEAD)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c modules/backend/deps/agent-native/deps/agent-intent (remotes/origin/HEAD)\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 (heads/main)\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 (heads/main)\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 (heads/main)\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 (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-native/deps/logging-system/deps/development-guidelines (26b562d)\n 490b0b2dfa1567cb16ff7a7230fd78e52bc2938e modules/backend/deps/agent-squad (remotes/origin/HEAD)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c modules/backend/deps/agent-squad/deps/agent-intent (remotes/origin/HEAD)\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 (heads/main)\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 (heads/main)\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 (remotes/origin/HEAD)\n 343b1e6d9a5b58e47bf7e594826221036ae8175c modules/backend/deps/agent-squad/deps/agent-native/deps/agent-intent (remotes/origin/HEAD)\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 (heads/main)\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 (heads/main)\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 (heads/main)\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 (heads/main)\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 (heads/main)\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 (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/agent-squad/deps/logging-system/deps/development-guidelines (26b562d)\n 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 modules/backend/deps/error-code-system (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 modules/backend/deps/logging-system (heads/main)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 modules/backend/deps/logging-system/deps/development-guidelines (26b562d)\n 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n a73c84b5bee8ae569c4689daa4ead19c9f0a2b65 modules/documents (remotes/origin/feature/rdm-increment-settings-duties)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev'\n[repo] branch=main head=ff3fb4a7eb\n[remote] origin/main=ff3fb4a7eb ahead=0 behind=0\n[tree] clean submodules_drift=0 uninit=0\n[worktrees] linked=14\n[recycle] merged un-recycled branches: feature/card-close-20261012-054727Z feature/card-close-20261012-055452Z feature/card-close-20261012-062835Z feature/card-close-20261012-065217Z feature/card-close-20261012-095620Z feature/card-close-20261012-130704Z feature/card-close-20261012-133217Z feature/card-close-20261012-140049Z feature/card-close-20261012-150228Z feature/card-close-20261012-164920Z feature/card-close-20261012-static-pidcheck feature/card-close-20261013-021816Z feature/card-close-20261013-052211Z feature/card-close-20261013-065538Z feature/card-close-svc-d3-real-scenarios feature/card-close-u7-release-roadmap feature/card-close-u7-release-roadmap-record feature/d1-closeout-evidence feature/svc-d1-identity-flow feature/svc-d3-real-scenarios feature/svc-db-config-recover feature/svc-login-recovery-followup feature/sync-dhf-templates fix/genui-children-repair\n[hooks] core.hooksPath=scripts/hooks(pre-commit/post-merge 实际接线)\n[facts] policy/facts.md 4 条事实均在有效期内\n[required-reading] core/baseline.md, workflows/delivery.md §1, policy/delivery.md\n[R0] ff3fb4a7eb(完整:ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1)\n[worktree] before-sync: recursive component checks passed\n[verdict] READY — 保留本次 precheck receipt 后建任务工作区:PRECHECK_RECEIPT=/tmp/task-precheck.json make task-start NAME=feature/your-branch\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev'\n", + "output_sha256": "7bcf2cc1903113a60eee3da9eef6d16cc317f6acbfb6cbf177bf4b9c8d8c9786", + "receipt_sha256": "08abcfcbfcd22a88af26f72b01cd91fd189480dc9e4385881c7dcbe163aba927" +} +``` -- 2.54.0 From 14c9e9c903e97eba54b3a6556152c5b5e962c6e2 Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 13 Oct 2026 08:55:20 +0000 Subject: [PATCH 02/29] Record the sync checkpoint Why: bind the task validation checkpoint to the latest integration baseline. Evidence: SELF recursive component checks; sync_base=ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1; candidate=0bd4bb3e24ccb36ac1a9d36380b0ccd852cd21f0. Impact: task metadata only. Refs: .task/feature-dependency-workspace.md --- .task/feature-dependency-workspace.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md index 885f2b3f..613f9a54 100644 --- a/.task/feature-dependency-workspace.md +++ b/.task/feature-dependency-workspace.md @@ -130,3 +130,4 @@ "receipt_sha256": "08abcfcbfcd22a88af26f72b01cd91fd189480dc9e4385881c7dcbe163aba927" } ``` +| 同步前验收 | ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1 | 0bd4bb3e24ccb36ac1a9d36380b0ccd852cd21f0 | 2026-10-13T08:55:20Z | -- 2.54.0 From 09a8ae69482de5de2f7ec678f4ddce2ccca4a182 Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 13 Oct 2026 09:12:26 +0000 Subject: [PATCH 03/29] Record the dependency workspace proposal and review boundary Why: Keep the approved direction and concrete pending decisions discoverable across sessions. Evidence: The task card contains tool-written SELF precheck, task-sync, source inventory, and documentation validation receipts. Impact: Add a project entry and task state for a locally saved Documents candidate without changing the pinned composition or active dependency policy. Refs: Documents feature/dependency-workspace-plan; versioned-dependencies-and-workspaces r1 --- .task/feature-dependency-workspace.md | 273 +++++++++++++++++++++++--- PROJECT.md | 6 + 2 files changed, 257 insertions(+), 22 deletions(-) diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md index 613f9a54..5533c3fa 100644 --- a/.task/feature-dependency-workspace.md +++ b/.task/feature-dependency-workspace.md @@ -1,40 +1,41 @@ # feature/dependency-workspace 任务卡 -任务主记录:;状态:进行中;owner:weichen +任务主记录:Documents `docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md` r1(本地草案分支 `feature/dependency-workspace-plan`,PR NOT_RUN);状态:等待具体方案与实施顺序评审;owner:Codex(本工作区写者) ## 基线与授权 - 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1 - 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace(worktree);分支:feature/dependency-workspace -- 授权与交付终点:<本次允许的动作与终点;未授权事项写明> +- 授权与交付终点:用户 2026-10-13 要求实现已讨论的版本化依赖与按需功能仓编辑,并纳入通用/项目规范。本次先完成具体方案与可评审实施顺序;依照 policy/delivery.md 等待对应批准后实施。共享服务部署、版本发布、改写历史、修改分支保护和清理不在本次自动推进范围。 - 交付模式:manual(前序人工决策,智能体 Review/合入);其他阶段明确授权后可记为 authorized-continuous - 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入) - 自动推进授权:无;授权范围:无;授权来源:无;授权终点:无;停止条件:无(未授权) -- 当前阶段:需求拆解;当前增量:I1(待定义) +- 当前阶段:具体方案与实施顺序待评审;当前增量:r1 草案(U1–U8 均 NOT_RUN) - 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位) ## 目标与非目标 -<预期结果、受影响入口/模块/契约;明确不做什么。> +目标与非目标的唯一正文见 Documents 主记录 r1 第 1–2 节。保留独立仓库,Dev 按需检出并联调,正式组合采用版本依赖;覆盖实际 RDM 消费方与未来项目的显式规则采纳。本次不操作共享运行服务或业务数据。 ## 关联方向与规划 -- 适用状态:待核对(无适用规划时说明原因) -- 主记录路径/版本:待核对(路径按仓库根目录定位,归档后不变;只引用唯一正文) -- 对应里程碑:待核对 +- 适用状态:新方向,已核对当前项目骨架、库计划入口及 Guidelines 多仓/采纳规则;用户确认目标与启动实施,本文具体规则尚未批准。 +- 主记录路径/版本:Documents `docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md` r1;分支 `feature/dependency-workspace-plan`。 +- Documents 候选:commit `4a7b929`;独立工作区 `/home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan`。Dev 内 Documents 已恢复固定版本,未推进父仓 gitlink;保留外部工作区及其 Git 管理目录,后续回收须先保存并解除依赖。 +- 对应里程碑:U1–U8,当前仅准备评审产物。 ## 需求分析 | ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 | |---|---|---|---|---|---|---| -| R1 | 待填写 | 待评估 | 待定 | 待定义 | 待确认 | 待评审 | +| R1–R14 | 唯一需求表见主记录 r1 第 2 节 | 依赖方式与现行 gitlink 规则需同步调整,依据第 1/6 节 | 见实施依赖顺序 | 第 2/8 节 | U1–U7 | 具体需求表待评审 | ## 方案与计划 -- 方案引用:待填写(含对象版本) -- 实施计划引用:待填写(含增量与需求 ID) -- 测试计划引用:待填写(含需求 ID 与验收条件) +- 方案引用:Documents 主记录 r1 第 3–6 节(命名、依赖权威、命令、传输与规范归属)。 +- 实施顺序引用:主记录 r1 第 7 节(U1–U8);逐项执行计划在具体方案批准后细化。 +- 测试计划引用:主记录 r1 第 2/8 节(需求验收、正常/拒绝/故障路径及诚实出口)。 ## 阶段评审 @@ -55,7 +56,7 @@ | 增量/试验 | 假设 | 范围 | 判断和停止条件 | 批准依据 | 结果 | 变更影响 | 需重审补测 | |---|---|---|---|---|---|---|---| -| 待定义 | — | — | — | 未批准 | NOT_RUN | 待评估 | 待评估 | +| U1 | Go 真实版本下载可替代本地 replace | 两个基础库与隔离消费方 | 来源/传输/子模块不可获取则停止推广 | 具体试点范围待评审 | NOT_RUN | 模块命名和传输 | 通过后判断 U3 推广 | ## 同步记录 @@ -71,19 +72,19 @@ ## 结果与验证(完成后填写) -- 结果: -- 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表> -- 影响与剩余项: +- 结果:已准备独立工作区、当前源事实与 Documents r1 候选;未改 Go/npm/CI/部署或现行规范。 +- 验证:启动与同步 SELF 收据由 evidence 写入;文档检查另以 evidence 记录;迁移测试、独立重放和平台 CI 均 NOT_RUN。 +- 影响与剩余项:具体方案批准后细化实施计划并实施;正式验证、Review/PR/合入、规范采纳及清理分别记录。 ## 规划进展与下一步 -- 本次推进/剩余:待核对(依据实际成果更新适用方案/规划) -- 首选下一任务:待核对(无适用规划、已完成或受阻时如实说明,不虚构任务) -- 推荐依据:待填写 -- 前置条件/待确认:待核对 -- 预期产物/验收条件:待定义 -- 重复任务核对:待核对(已有/在途任务、PR 与规划记录) -- 启动授权:未授权(建议不自动启动新任务,仍须明确授权) +- 本次推进/剩余:方向落实为 r1 主记录,具体方案、实施顺序及命名待审;U1–U8 NOT_RUN。 +- 首选下一任务:本任务继续完成 r1 的评审与实施计划细化,随后 U1 基础库/下载试点。 +- 推荐依据:先证明脱离本地源码目录的真实消费,再改全部公开 import 与正式构建。 +- 前置条件/待确认:批准具体方案;依照项目规则取得实施计划与对应阶段批准,或明确连续推进授权。 +- 预期产物/验收条件:主记录第 2/7/8 节;仅本地编辑工具不能称完整迁移。 +- 重复任务核对:已核对本地规划索引与源码,未查询所有仓实时 PR;具体 U1 启动前核对相关在途任务,不能声称无重叠。 +- 启动授权:用户已要求启动此方向;后续具体阶段按评审/授权边界继续,不自动扩展到其他项目实施。 ## 合入与清理 @@ -131,3 +132,231 @@ } ``` | 同步前验收 | ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1 | 0bd4bb3e24ccb36ac1a9d36380b0ccd852cd21f0 | 2026-10-13T08:55:20Z | + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T08:54:50.378610+00:00", + "command": "make task-sync", + "command_sha256": "6c0e3c8fbb3f43d01548180c9d9c147ce1c1c32ba1e78d3383961de470fe0d52", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "0bd4bb3e24ccb36ac1a9d36380b0ccd852cd21f0", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n a73c84b5bee8ae569c4689daa4ead19c9f0a2b65 modules/documents (remotes/origin/feature/rdm-increment-settings-duties)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after": { + "head": "14c9e9c903e97eba54b3a6556152c5b5e962c6e2", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n a73c84b5bee8ae569c4689daa4ead19c9f0a2b65 modules/documents (remotes/origin/feature/rdm-increment-settings-duties)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n[worktree] before-sync: recursive component checks passed\nAlready up to date.\n[worktree] before-update: recursive component checks passed\n[worktree] materialize: recursive component checks passed\n[worktree] after-sync: recursive component checks passed\n[synced] sync_base=ff3fb4a7eb tested_head=0bd4bb3e24 checked_at=2026-10-13T08:55:20Z\n[next] 跑正式验收(make test 等),证据写入任务卡\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n", + "output_sha256": "454e8cc26c77f8f93d827f668e8e524f7c622fe978db93b44c06ca038803e98a", + "receipt_sha256": "f70348ab7d9e178cdc3ba1a1fdd6d7ec1075bf6b35dee76e33d14035b67bc0d8" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T08:56:45.074985+00:00", + "command": "git rev-parse HEAD origin/main; git ls-tree origin/main modules/core modules/backend modules/frontend modules/ui modules/documents deps/agent-native deps/agent-intent deps/agent-squad deps/agent-command deps/logging-system deps/error-code-system deps/development-guidelines; git -C modules/documents rev-parse HEAD origin/main; git -C modules/documents status --short; git -C /home/weichen/projects/Agent-System-RDM rev-parse HEAD", + "command_sha256": "f5c7759f2a24329949cd1fdce0a46d742f8b71c91008a85b6e49d4498a011d9e", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "14c9e9c903e97eba54b3a6556152c5b5e962c6e2", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": " M .task/feature-dependency-workspace.md\n M modules/documents\n", + "tracked_diff_sha256": "b582eaac6586178b0a52a4bbe13931535063235df3f1e5a2340534408313dfb3", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n+5a06acf7cded07797ec4ebfea42c89331359b0bb modules/documents (heads/feature/dependency-workspace-plan)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after": { + "head": "14c9e9c903e97eba54b3a6556152c5b5e962c6e2", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": " M .task/feature-dependency-workspace.md\n M modules/documents\n", + "tracked_diff_sha256": "b582eaac6586178b0a52a4bbe13931535063235df3f1e5a2340534408313dfb3", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n+5a06acf7cded07797ec4ebfea42c89331359b0bb modules/documents (heads/feature/dependency-workspace-plan)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "14c9e9c903e97eba54b3a6556152c5b5e962c6e2\nff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1\n160000 commit 4f583ca3eeeb07a56a714c5086de84dcd6ad2980\tdeps/agent-command\n160000 commit 343b1e6d9a5b58e47bf7e594826221036ae8175c\tdeps/agent-intent\n160000 commit c348441691e8bdab784a03aa9be64d53dacff341\tdeps/agent-native\n160000 commit 490b0b2dfa1567cb16ff7a7230fd78e52bc2938e\tdeps/agent-squad\n160000 commit af199eeaa23c5b39e08b4649f2513d7572dc5274\tdeps/development-guidelines\n160000 commit a3ee67bba269e1276c14e22c026171ecf2cf6190\tdeps/error-code-system\n160000 commit 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7\tdeps/logging-system\n160000 commit cfb8308895d0b94765ba10ed0e5b9bf38b439414\tmodules/backend\n160000 commit 0f94e4b062bf8736af3953821fe5d0f67d87ea8e\tmodules/core\n160000 commit a73c84b5bee8ae569c4689daa4ead19c9f0a2b65\tmodules/documents\n160000 commit 44b964682c89535342c283aa73492c758b16c732\tmodules/frontend\n160000 commit 0da2e3acd6c8ae8957825b64ddb54b250c0979c0\tmodules/ui\n5a06acf7cded07797ec4ebfea42c89331359b0bb\n5a06acf7cded07797ec4ebfea42c89331359b0bb\nb1fe932883d2a55f0373bb0930950da3d12d2b5e\n", + "output_sha256": "7eaf1ccff1ab384f66069517ed62bcc9a7cf537b0bbc8468398c458a359328a6", + "receipt_sha256": "0f7e111ab8853cc668a764fe43c2f3d416663d898db0e1d9494f37dccb3cdceb" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T09:07:44.926679+00:00", + "command": "cat /tmp/agent-system-dependency-doc-check-01a1345f.py && python3 /tmp/agent-system-dependency-doc-check-01a1345f.py && git diff --check && git -C modules/documents diff --check", + "command_sha256": "2ed4c1dd6a15bb605da88bcca119d06e20feb61031c735ada29a03ed558c0310", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "14c9e9c903e97eba54b3a6556152c5b5e962c6e2", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": " M .task/feature-dependency-workspace.md\n M PROJECT.md\n M modules/documents\n", + "tracked_diff_sha256": "b97309bc57c453d295bdae37ff315efc3734e2a296434399ed605a4e7473252b", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n+5a06acf7cded07797ec4ebfea42c89331359b0bb modules/documents (heads/feature/dependency-workspace-plan)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after": { + "head": "14c9e9c903e97eba54b3a6556152c5b5e962c6e2", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": " M .task/feature-dependency-workspace.md\n M PROJECT.md\n M modules/documents\n", + "tracked_diff_sha256": "b97309bc57c453d295bdae37ff315efc3734e2a296434399ed605a4e7473252b", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n+5a06acf7cded07797ec4ebfea42c89331359b0bb modules/documents (heads/feature/dependency-workspace-plan)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "import hashlib\nfrom pathlib import Path\nimport re\n\nroot = Path('/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace')\nproposal = root / 'modules/documents/docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md'\nindex = proposal.parent / 'INDEX.md'\nentry = root / 'PROJECT.md'\ncard = root / '.task/feature-dependency-workspace.md'\nbody = proposal.read_text()\nrequirements = re.findall(r'^\\| (R\\d+) \\|', body, flags=re.M)\nunits = re.findall(r'^\\| (U\\d+) ', body, flags=re.M)\nassert requirements == [f'R{i}' for i in range(1, 15)], requirements\nassert units == [f'U{i}' for i in range(1, 9)], units\nassert '状态:proposed' in body\nassert '当前尚未实现' in body\nassert 'U1–U8 实施、迁移测试、PR、发布与部署均 NOT_RUN' in body\nassert proposal.name in index.read_text()\nassert proposal.name in entry.read_text()\nassert proposal.name in card.read_text()\nassert '尚未推进该 Documents gitlink' in entry.read_text()\nchecked = 0\nfor document in (proposal, index):\n for target in re.findall(r'\\[[^\\]]+\\]\\(([^)]+)\\)', document.read_text()):\n if re.match(r'^[a-z][a-z0-9+.-]*:', target, re.I) or target.startswith('#'):\n continue\n assert (document.parent / target.split('#', 1)[0]).exists(), (document, target)\n checked += 1\nassert (root / '.task/feature-dependency-workspace.md').exists()\nprint(f'PASS: R1-R14 and U1-U8 are unique and ordered; {checked} relative links resolve')\nfor document in (proposal, index, entry):\n digest = hashlib.sha256(document.read_bytes()).hexdigest()\n print(f'SELF file_sha256={digest} path={document.relative_to(root)}')\nPASS: R1-R14 and U1-U8 are unique and ordered; 63 relative links resolve\nSELF file_sha256=650c54538cb49986a7116e6ed4f98ef0b3b7d26fab932f55a95eeec76a91f0d6 path=modules/documents/docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md\nSELF file_sha256=4621c4581f91f182cf4589bd8f1055a9d81f7afafd52c40c425037d253afa3a2 path=modules/documents/docs/proposals/INDEX.md\nSELF file_sha256=f745a35aff78a3ee53486be7436bb147576939a63bb1f66315e4ad98a104e82e path=PROJECT.md\n", + "output_sha256": "6bcf9d03255e5267b4637871420b380766926a46c57c4b3edb3df329e628fbca", + "receipt_sha256": "59108676d0cf8b73adae38c16a69a0726a1a7344da99821bee6c6f04f42d85cc" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T09:10:48.150271+00:00", + "command": "git -C modules/documents switch --detach a73c84b5bee8ae569c4689daa4ead19c9f0a2b65 && git -C modules/documents worktree add /home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan feature/dependency-workspace-plan", + "command_sha256": "eee54c487bd86d618e52c38c2c1d9940ffa2b6577dea1fe2992b816215fc3e6c", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "14c9e9c903e97eba54b3a6556152c5b5e962c6e2", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": " M .task/feature-dependency-workspace.md\n M PROJECT.md\n M modules/documents\n", + "tracked_diff_sha256": "5d55a22f470ad76c755612a03fa90a5496e5dec9da969604bfc57a7167330e94", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n+4a7b9293e9d74804833f98cebd52e235c9375d3c modules/documents (heads/feature/dependency-workspace-plan)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after": { + "head": "14c9e9c903e97eba54b3a6556152c5b5e962c6e2", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": " M .task/feature-dependency-workspace.md\n M PROJECT.md\n", + "tracked_diff_sha256": "668a1af80026945ab5cafe7fcfcee18478a850ab462002a81aaa47a3f2984ae4", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n a73c84b5bee8ae569c4689daa4ead19c9f0a2b65 modules/documents (remotes/origin/feature/rdm-increment-settings-duties)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "HEAD is now at a73c84b Add RDM settings, members, duties and permissions increment plan r1\nPreparing worktree (checking out 'feature/dependency-workspace-plan')\nHEAD is now at 4a7b929 Describe versioned dependencies and editable component workspaces\n", + "output_sha256": "0e4beba0dfab78dffa3491072bef05facf07840c473a8ebdbf4e0a6871e23563", + "receipt_sha256": "b3b0d09411eafa3ba6e31bb793003a1103f43ed4c5f78722835cd13d81cd33da" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T09:11:13.350035+00:00", + "command": "make task-sync", + "command_sha256": "6c0e3c8fbb3f43d01548180c9d9c147ce1c1c32ba1e78d3383961de470fe0d52", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "14c9e9c903e97eba54b3a6556152c5b5e962c6e2", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": " M .task/feature-dependency-workspace.md\n M PROJECT.md\n", + "tracked_diff_sha256": "71356e69d0f4ad5fe3d2bde1307181b70f6f2e04d5203eb3bbb609feb4cc0d1e", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n a73c84b5bee8ae569c4689daa4ead19c9f0a2b65 modules/documents (remotes/origin/feature/rdm-increment-settings-duties)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after": { + "head": "14c9e9c903e97eba54b3a6556152c5b5e962c6e2", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": " M .task/feature-dependency-workspace.md\n M PROJECT.md\n", + "tracked_diff_sha256": "71356e69d0f4ad5fe3d2bde1307181b70f6f2e04d5203eb3bbb609feb4cc0d1e", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n a73c84b5bee8ae569c4689daa4ead19c9f0a2b65 modules/documents (remotes/origin/feature/rdm-increment-settings-duties)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after_error": null, + "exit_code": 2, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\nERROR: unsaved, untracked files in /home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace; preserve them before continuing\nmake[1]: *** [Makefile:40: task-sync] Error 1\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n", + "output_sha256": "aff3b05dc227d67b9c1d9e51d759f7bdd4454d1d841c1b6e9c7d54fc06491d66", + "receipt_sha256": "2236684086f55fcbdd380b166443fdd8b77e47c67ece3298db159087f2be1d97" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T09:11:50.075449+00:00", + "command": "git -C /home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan fetch origin refs/heads/main:refs/remotes/origin/main && git -C /home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan merge --no-edit origin/main && cat /tmp/agent-system-dependency-doc-check-01a1345f.py && python3 /tmp/agent-system-dependency-doc-check-01a1345f.py && git diff --check && git -C /home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan diff --check && git -C /home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan rev-parse HEAD origin/main", + "command_sha256": "96731ff3550f627891a2d0b3cec8bc8a7e0012b155f4b074e4736fa1617d27ea", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "14c9e9c903e97eba54b3a6556152c5b5e962c6e2", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": " M .task/feature-dependency-workspace.md\n M PROJECT.md\n", + "tracked_diff_sha256": "bd31d590d79bca56e89304d110346309a6b2d9ba0275b95c6b503229defe1dee", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n a73c84b5bee8ae569c4689daa4ead19c9f0a2b65 modules/documents (remotes/origin/feature/rdm-increment-settings-duties)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after": { + "head": "14c9e9c903e97eba54b3a6556152c5b5e962c6e2", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": " M .task/feature-dependency-workspace.md\n M PROJECT.md\n", + "tracked_diff_sha256": "bd31d590d79bca56e89304d110346309a6b2d9ba0275b95c6b503229defe1dee", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n a73c84b5bee8ae569c4689daa4ead19c9f0a2b65 modules/documents (remotes/origin/feature/rdm-increment-settings-duties)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "Already up to date.\nimport hashlib\nfrom pathlib import Path\nimport re\n\nroot = Path('/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace')\nproposal = Path('/home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan/docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md')\nindex = proposal.parent / 'INDEX.md'\nentry = root / 'PROJECT.md'\ncard = root / '.task/feature-dependency-workspace.md'\nbody = proposal.read_text()\nrequirements = re.findall(r'^\\| (R\\d+) \\|', body, flags=re.M)\nunits = re.findall(r'^\\| (U\\d+) ', body, flags=re.M)\nassert requirements == [f'R{i}' for i in range(1, 15)], requirements\nassert units == [f'U{i}' for i in range(1, 9)], units\nassert '状态:proposed' in body\nassert '当前尚未实现' in body\nassert 'U1–U8 实施、迁移测试、PR、发布与部署均 NOT_RUN' in body\nassert proposal.name in index.read_text()\nassert proposal.name in entry.read_text()\nassert proposal.name in card.read_text()\nassert '尚未推进该 Documents gitlink' in entry.read_text()\nchecked = 0\nfor document in (proposal, index):\n for target in re.findall(r'\\[[^\\]]+\\]\\(([^)]+)\\)', document.read_text()):\n if re.match(r'^[a-z][a-z0-9+.-]*:', target, re.I) or target.startswith('#'):\n continue\n assert (document.parent / target.split('#', 1)[0]).exists(), (document, target)\n checked += 1\nassert (root / '.task/feature-dependency-workspace.md').exists()\nprint(f'PASS: R1-R14 and U1-U8 are unique and ordered; {checked} relative links resolve')\nfor document in (proposal, index, entry):\n digest = hashlib.sha256(document.read_bytes()).hexdigest()\n print(f'SELF file_sha256={digest} path={document}')\nPASS: R1-R14 and U1-U8 are unique and ordered; 63 relative links resolve\nSELF file_sha256=650c54538cb49986a7116e6ed4f98ef0b3b7d26fab932f55a95eeec76a91f0d6 path=/home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan/docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md\nSELF file_sha256=4621c4581f91f182cf4589bd8f1055a9d81f7afafd52c40c425037d253afa3a2 path=/home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan/docs/proposals/INDEX.md\nSELF file_sha256=f745a35aff78a3ee53486be7436bb147576939a63bb1f66315e4ad98a104e82e path=/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/PROJECT.md\n4a7b9293e9d74804833f98cebd52e235c9375d3c\n5a06acf7cded07797ec4ebfea42c89331359b0bb\n", + "output_sha256": "082c746c1195d69501b43eb6acc54313b4ccf71ae97179251339d951e9440616", + "receipt_sha256": "5a5798878d64e0c92d0406610abc842c6ea429b78bf8802277eb4ef3b8cd17e8" +} +``` diff --git a/PROJECT.md b/PROJECT.md index 4e0ccd7f..2ce9a967 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -12,6 +12,12 @@ 目录中的既有文档不因被收录而自动成为已批准规划。记录、任务关联及收尾建议按 [交付规范的长期方向与任务衔接](policy/delivery.md#长期方向与任务衔接) 执行。 +- [版本化依赖与按需源码工作区改造任务](.task/feature-dependency-workspace.md): + Documents 主记录为 `docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md` r1, + 保存于本地候选分支 `feature/dependency-workspace-plan`;具体方案与实施顺序待评审, + 本仓尚未推进该 Documents gitlink。保留功能仓独立、Dev 单入口按需编辑,覆盖语言依赖、 + RDM、正式构建/治理适配及 Guidelines 通用规则;迁移实施、验收、发布与部署 NOT_RUN。 + - [快慢通道展示与动态工作摘要方案 r1.1](modules/documents/docs/proposals/2026-10-12-fast-slow-channel-display.md): 对话即时答复、后台动态发现与来源、四层阅读、真实状态、并发/恢复及 U1–U4; 2026-10-12 方案设计已批准(阶段 1–4),首批仅 U1; -- 2.54.0 From dd9e4420bdb3fce6437961c9e18186d20fdcd753 Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 13 Oct 2026 09:13:21 +0000 Subject: [PATCH 04/29] Record the sync checkpoint Why: bind the task validation checkpoint to the latest integration baseline. Evidence: SELF recursive component checks; sync_base=ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1; candidate=09a8ae69482de5de2f7ec678f4ddce2ccca4a182. Impact: task metadata only. Refs: .task/feature-dependency-workspace.md --- .task/feature-dependency-workspace.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md index 5533c3fa..70612409 100644 --- a/.task/feature-dependency-workspace.md +++ b/.task/feature-dependency-workspace.md @@ -360,3 +360,4 @@ "receipt_sha256": "5a5798878d64e0c92d0406610abc842c6ea429b78bf8802277eb4ef3b8cd17e8" } ``` +| 同步前验收 | ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1 | 09a8ae69482de5de2f7ec678f4ddce2ccca4a182 | 2026-10-13T09:13:21Z | -- 2.54.0 From 9b1eb68d59479c830f04e0fd634f0c3f9153dfe2 Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 13 Oct 2026 09:14:25 +0000 Subject: [PATCH 05/29] Record the dependency workspace proposal and review boundary Why: Keep the approved direction and concrete pending decisions discoverable across sessions. Evidence: The task card contains tool-written SELF precheck, task-sync, source inventory, and documentation validation receipts. Impact: Add a project entry and task state for a locally saved Documents candidate without changing the pinned composition or active dependency policy. Refs: Documents feature/dependency-workspace-plan; versioned-dependencies-and-workspaces r1 --- .task/feature-dependency-workspace.md | 76 +++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md index 70612409..7844ac06 100644 --- a/.task/feature-dependency-workspace.md +++ b/.task/feature-dependency-workspace.md @@ -361,3 +361,79 @@ } ``` | 同步前验收 | ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1 | 09a8ae69482de5de2f7ec678f4ddce2ccca4a182 | 2026-10-13T09:13:21Z | + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T09:12:54.771649+00:00", + "command": "make task-sync", + "command_sha256": "6c0e3c8fbb3f43d01548180c9d9c147ce1c1c32ba1e78d3383961de470fe0d52", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "09a8ae69482de5de2f7ec678f4ddce2ccca4a182", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n a73c84b5bee8ae569c4689daa4ead19c9f0a2b65 modules/documents (remotes/origin/feature/rdm-increment-settings-duties)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after": { + "head": "dd9e4420bdb3fce6437961c9e18186d20fdcd753", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n a73c84b5bee8ae569c4689daa4ead19c9f0a2b65 modules/documents (remotes/origin/feature/rdm-increment-settings-duties)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n[worktree] before-sync: recursive component checks passed\nAlready up to date.\n[worktree] before-update: recursive component checks passed\n[worktree] materialize: recursive component checks passed\n[worktree] after-sync: recursive component checks passed\n[evidence] WARN JSON receipt line 98: recorded HEAD predates non-card changes ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 137: recorded HEAD predates non-card changes ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 175: unverified: recorded object includes uncommitted non-card changes ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 213: unverified: recorded object includes uncommitted non-card changes ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 251: unverified: recorded object includes uncommitted non-card changes ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 289: unverified: recorded object includes uncommitted non-card changes ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 327: unverified: recorded object includes uncommitted non-card changes ——关键检查须重跑并以 make evidence 重新写入\n[synced] sync_base=ff3fb4a7eb tested_head=09a8ae6948 checked_at=2026-10-13T09:13:21Z\n[next] 跑正式验收(make test 等),证据写入任务卡\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n", + "output_sha256": "7cb22d16bfa898a1c25f63a800f9e2cc5e46eeeded9d9a836fc39bf683f0be6b", + "receipt_sha256": "4d36354ad54a2215bbbd8db21d8fa6a2c89ba91f8db2190d61d20cc3c715793a" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T09:13:52.562225+00:00", + "command": "cat /tmp/agent-system-dependency-doc-check-01a1345f.py && python3 /tmp/agent-system-dependency-doc-check-01a1345f.py && git diff --check && git -C /home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan diff --check && git -C /home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan rev-parse HEAD && git -C /home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan status --short && git diff origin/main HEAD -- .gitmodules modules deps", + "command_sha256": "ba4a2660de282aab274d334af09901830dd926a5a8c9069f92c91106ed4beccb", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "dd9e4420bdb3fce6437961c9e18186d20fdcd753", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": " M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "4340187dc976e4d230b47d5292d2ea5848ecdc8b7ab1069958362919cc88f357", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n a73c84b5bee8ae569c4689daa4ead19c9f0a2b65 modules/documents (remotes/origin/feature/rdm-increment-settings-duties)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after": { + "head": "dd9e4420bdb3fce6437961c9e18186d20fdcd753", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1", + "status": " M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "4340187dc976e4d230b47d5292d2ea5848ecdc8b7ab1069958362919cc88f357", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n cfb8308895d0b94765ba10ed0e5b9bf38b439414 modules/backend (v0.3.0-153-gcfb8308)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/backend/deps/agent-system-core (v0.3.0-14-g0f94e4b)\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 0f94e4b062bf8736af3953821fe5d0f67d87ea8e modules/core (v0.3.0-14-g0f94e4b)\n a73c84b5bee8ae569c4689daa4ead19c9f0a2b65 modules/documents (remotes/origin/feature/rdm-increment-settings-duties)\n 44b964682c89535342c283aa73492c758b16c732 modules/frontend (v0.3.0-79-g44b9646)\n 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 modules/ui (v0.3.0-29-g0da2e3a)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "import hashlib\nfrom pathlib import Path\nimport re\n\nroot = Path('/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace')\nproposal = Path('/home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan/docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md')\nindex = proposal.parent / 'INDEX.md'\nentry = root / 'PROJECT.md'\ncard = root / '.task/feature-dependency-workspace.md'\nbody = proposal.read_text()\nrequirements = re.findall(r'^\\| (R\\d+) \\|', body, flags=re.M)\nunits = re.findall(r'^\\| (U\\d+) ', body, flags=re.M)\nassert requirements == [f'R{i}' for i in range(1, 15)], requirements\nassert units == [f'U{i}' for i in range(1, 9)], units\nassert '状态:proposed' in body\nassert '当前尚未实现' in body\nassert 'U1–U8 实施、迁移测试、PR、发布与部署均 NOT_RUN' in body\nassert proposal.name in index.read_text()\nassert proposal.name in entry.read_text()\nassert proposal.name in card.read_text()\nassert '尚未推进该 Documents gitlink' in entry.read_text()\nchecked = 0\nfor document in (proposal, index):\n for target in re.findall(r'\\[[^\\]]+\\]\\(([^)]+)\\)', document.read_text()):\n if re.match(r'^[a-z][a-z0-9+.-]*:', target, re.I) or target.startswith('#'):\n continue\n assert (document.parent / target.split('#', 1)[0]).exists(), (document, target)\n checked += 1\nassert (root / '.task/feature-dependency-workspace.md').exists()\nprint(f'PASS: R1-R14 and U1-U8 are unique and ordered; {checked} relative links resolve')\nfor document in (proposal, index, entry):\n digest = hashlib.sha256(document.read_bytes()).hexdigest()\n print(f'SELF file_sha256={digest} path={document}')\nPASS: R1-R14 and U1-U8 are unique and ordered; 63 relative links resolve\nSELF file_sha256=650c54538cb49986a7116e6ed4f98ef0b3b7d26fab932f55a95eeec76a91f0d6 path=/home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan/docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md\nSELF file_sha256=4621c4581f91f182cf4589bd8f1055a9d81f7afafd52c40c425037d253afa3a2 path=/home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan/docs/proposals/INDEX.md\nSELF file_sha256=f745a35aff78a3ee53486be7436bb147576939a63bb1f66315e4ad98a104e82e path=/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/PROJECT.md\n4a7b9293e9d74804833f98cebd52e235c9375d3c\n", + "output_sha256": "1a2b8f06070c13b12d32836889d0f8573a6ac0435d267beac278d14e4003bb56", + "receipt_sha256": "88e3cc35deb41531c74cc287cc62bd3238a6bb2e47a44bcce892ef25801551d4" +} +``` -- 2.54.0 From e0982c8428ec413334ab6761bf59b2c4bbaaba16 Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 13 Oct 2026 14:47:23 +0000 Subject: [PATCH 06/29] Record the sync checkpoint Why: bind the task validation checkpoint to the latest integration baseline. Evidence: SELF recursive component checks; sync_base=ee9b437b22b49f96e1bc65f79417b22e8e82a37c; candidate=4af43c5846e862e45671a51644b4646ea102c529. Impact: task metadata only. Refs: .task/feature-dependency-workspace.md --- .task/feature-dependency-workspace.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md index 7844ac06..d3a98126 100644 --- a/.task/feature-dependency-workspace.md +++ b/.task/feature-dependency-workspace.md @@ -437,3 +437,4 @@ "receipt_sha256": "88e3cc35deb41531c74cc287cc62bd3238a6bb2e47a44bcce892ef25801551d4" } ``` +| 同步前验收 | ee9b437b22b49f96e1bc65f79417b22e8e82a37c | 4af43c5846e862e45671a51644b4646ea102c529 | 2026-10-13T14:47:23Z | -- 2.54.0 From f71058cb7e7c8c97d5d002a317501e87ef7e7b5e Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 13 Oct 2026 15:25:37 +0000 Subject: [PATCH 07/29] Configure immutable component sources and process scoped Go transport Why: Prepare ordinary component workspaces and real module downloads without changing global Git configuration or other feature branches. Evidence: SELF clean-cache module consumption and real temporary-Git transport tests are recorded by make evidence in the task card, including expected RED and passing GREEN runs. Impact: Add component identities/source locks and non-secret transport configuration. Existing submodule layout remains supported during migration. Refs: Versioned dependencies U1/U2; R15; feature/dependency-workspace --- .gitignore | 6 + .task/feature-dependency-workspace.md | 422 +++++++++++++++++++++++++- components.json | 192 ++++++++++++ components.lock.json | 20 ++ scripts/workspace/transport.py | 49 +++ tests/test_transport.py | 60 ++++ 6 files changed, 746 insertions(+), 3 deletions(-) create mode 100644 components.json create mode 100644 components.lock.json create mode 100644 scripts/workspace/transport.py create mode 100644 tests/test_transport.py diff --git a/.gitignore b/.gitignore index fb2abb3d..dd877d3a 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,9 @@ runtime-backups/ # e2e.sh 运行工件(构建/种子/日志;scripts/e2e.sh 输出) .tmp/ + +# Isolated migration candidates and local component workspaces. +/.migration/ +/.workspace/ +/go.work +/go.work.sum diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md index d3a98126..68bd8630 100644 --- a/.task/feature-dependency-workspace.md +++ b/.task/feature-dependency-workspace.md @@ -8,10 +8,10 @@ - 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace(worktree);分支:feature/dependency-workspace - 授权与交付终点:用户 2026-10-13 要求实现已讨论的版本化依赖与按需功能仓编辑,并纳入通用/项目规范。本次先完成具体方案与可评审实施顺序;依照 policy/delivery.md 等待对应批准后实施。共享服务部署、版本发布、改写历史、修改分支保护和清理不在本次自动推进范围。 -- 交付模式:manual(前序人工决策,智能体 Review/合入);其他阶段明确授权后可记为 authorized-continuous +- 交付模式:authorized-continuous(实施计划细化、U1–U7 重构与自检;正式验收与高后果边界保留) - 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入) -- 自动推进授权:无;授权范围:无;授权来源:无;授权终点:无;停止条件:无(未授权) -- 当前阶段:具体方案与实施顺序待评审;当前增量:r1 草案(U1–U8 均 NOT_RUN) +- 自动推进授权:用户本次回答「批准,可以进行重构」;授权范围:上轮提出的计划细化、实施与自检连续推进;授权来源:2026-10-13 当前会话;授权终点:可审实现与自检;停止条件:真实传输试点失败、无法保护现场、超出方案/共享部署/发布范围。 +- 当前阶段:实施计划细化及实施与自检;当前增量:U1 起,R15 在途/后续分支平稳过渡纳入验收。 - 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位) ## 目标与非目标 @@ -438,3 +438,419 @@ } ``` | 同步前验收 | ee9b437b22b49f96e1bc65f79417b22e8e82a37c | 4af43c5846e862e45671a51644b4646ea102c529 | 2026-10-13T14:47:23Z | + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T14:47:39.709262+00:00", + "command": "make precheck", + "command_sha256": "8fd03cdee8adbb8562846a1a114cc0623779a8654412cd20aac9b495e7eb0450", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ee9b437b22b49f96e1bc65f79417b22e8e82a37c", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ee9b437b22b49f96e1bc65f79417b22e8e82a37c", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n[repo] branch=feature/dependency-workspace head=e0982c8428\n[remote] origin/main=ee9b437b22 ahead=7 behind=0\n[tree] clean submodules_drift=0 uninit=0\n[worktrees] linked=16\n[recycle] merged un-recycled branches: feature/card-close-20261012-054727Z feature/card-close-20261012-055452Z feature/card-close-20261012-062835Z feature/card-close-20261012-065217Z feature/card-close-20261012-095620Z feature/card-close-20261012-130704Z feature/card-close-20261012-133217Z feature/card-close-20261012-140049Z feature/card-close-20261012-150228Z feature/card-close-20261012-164920Z feature/card-close-20261012-static-pidcheck feature/card-close-20261013-021816Z feature/card-close-20261013-052211Z feature/card-close-20261013-065538Z feature/card-close-svc-d3-real-scenarios feature/card-close-u7-release-roadmap feature/card-close-u7-release-roadmap-record feature/d1-closeout-evidence feature/rdm-increment-release-plan feature/rdm-increment-settings-duties feature/svc-d1-identity-flow feature/svc-d3-real-scenarios feature/svc-db-config-recover feature/svc-login-recovery-followup feature/sync-dhf-templates fix/genui-children-repair\n[cards] 闭合分支超过 24 小时未合入:feature/card-close-20261012-123313Z\n[hooks] core.hooksPath=scripts/hooks(pre-commit/post-merge 实际接线)\n[facts] WARN 过期事实:F6(日期格式)——引用前先 make facts-verify 重验并更新登记表\n[required-reading] core/baseline.md, workflows/delivery.md §1, policy/delivery.md\n[R0] ee9b437b22(完整:ee9b437b22b49f96e1bc65f79417b22e8e82a37c)\n[worktree] before-sync: recursive component checks passed\n[verdict] READY — 保留本次 precheck receipt 后建任务工作区:PRECHECK_RECEIPT=/tmp/task-precheck.json make task-start NAME=feature/your-branch\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n", + "output_sha256": "472428d98b891fa3f457b56b709887ed17bc1230fafedc7fa249408786a6e224", + "receipt_sha256": "25a1c907c32347ca1064853d35cb82338a8d1ced8ed60135190f755045cfbfb0" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T14:57:00.161241+00:00", + "command": "cat /tmp/dependency-migration-clone-01a1345f.py && python3 /tmp/dependency-migration-clone-01a1345f.py", + "command_sha256": "f0380ea86b4307ea99c13fc804ff8eb012d8f0bc379303068036fe8bae72bcc3", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ee9b437b22b49f96e1bc65f79417b22e8e82a37c", + "status": " M .gitignore\n M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "b92f35bb8e0529e991224c05b39266f1a7bd0830ff39b594c3180ab8a879e467", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ee9b437b22b49f96e1bc65f79417b22e8e82a37c", + "status": " M .gitignore\n M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "b92f35bb8e0529e991224c05b39266f1a7bd0830ff39b594c3180ab8a879e467", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "from concurrent.futures import ThreadPoolExecutor\nfrom pathlib import Path\nimport json\nimport subprocess\n\nroot = Path('/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration')\nnames = ['Logging-System', 'Error-Code-System', 'Agent-System-Core', 'Agent-System-UI',\n 'Agent-System-Frontend', 'Agent-Native', 'Agent-Intent', 'Agent-Command',\n 'Agent-Squad', 'Agent-System-Backend', 'Agent-System-RDM']\ndef prepare(name):\n path = root / name\n if path.exists():\n raise RuntimeError(f'preserve existing candidate: {path}')\n url = f'ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/{name}.git'\n subprocess.run(['git', 'clone', '--no-checkout', url, str(path)], check=True, stdout=subprocess.DEVNULL)\n subprocess.run(['git', '-C', str(path), 'switch', '-c', 'feature/versioned-dependencies', 'origin/main'], check=True, stdout=subprocess.DEVNULL)\n sha = subprocess.check_output(['git', '-C', str(path), 'rev-parse', 'HEAD'], text=True).strip()\n return {'id': name, 'path': str(path), 'origin': url, 'initial_base_sha': sha}\nroot.mkdir(parents=True, exist_ok=True)\nwith ThreadPoolExecutor(max_workers=3) as pool:\n records = list(pool.map(prepare, names))\n(root / 'sources.json').write_text(json.dumps(records, indent=2) + '\\n')\nprint(json.dumps(records, indent=2))\nCloning into '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Logging-System'...\nCloning into '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Error-Code-System'...\nCloning into '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-System-Core'...\nSwitched to a new branch 'feature/versioned-dependencies'\nCloning into '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-System-UI'...\nSwitched to a new branch 'feature/versioned-dependencies'\nCloning into '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-System-Frontend'...\nSwitched to a new branch 'feature/versioned-dependencies'\nCloning into '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-Native'...\nSwitched to a new branch 'feature/versioned-dependencies'\nCloning into '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-Intent'...\nSwitched to a new branch 'feature/versioned-dependencies'\nSwitched to a new branch 'feature/versioned-dependencies'\nCloning into '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-Command'...\nCloning into '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-Squad'...\nSwitched to a new branch 'feature/versioned-dependencies'\nCloning into '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-System-Backend'...\nSwitched to a new branch 'feature/versioned-dependencies'\nCloning into '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-System-RDM'...\nSwitched to a new branch 'feature/versioned-dependencies'\nSwitched to a new branch 'feature/versioned-dependencies'\nSwitched to a new branch 'feature/versioned-dependencies'\n[\n {\n \"id\": \"Logging-System\",\n \"path\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Logging-System\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Logging-System.git\",\n \"initial_base_sha\": \"da5c33eb25a88b5ad5c88999d1a119f6f5b3af24\"\n },\n {\n \"id\": \"Error-Code-System\",\n \"path\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Error-Code-System\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Error-Code-System.git\",\n \"initial_base_sha\": \"9e99b52611449c0ce7f35527b9b95fe55701f892\"\n },\n {\n \"id\": \"Agent-System-Core\",\n \"path\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-System-Core\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Core.git\",\n \"initial_base_sha\": \"5773e74086791731059730bd3726dc8c9cd1381f\"\n },\n {\n \"id\": \"Agent-System-UI\",\n \"path\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-System-UI\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-UI.git\",\n \"initial_base_sha\": \"2c4322ef56df64ad72f65907d25b048a74bb5ffc\"\n },\n {\n \"id\": \"Agent-System-Frontend\",\n \"path\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-System-Frontend\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Frontend.git\",\n \"initial_base_sha\": \"eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b\"\n },\n {\n \"id\": \"Agent-Native\",\n \"path\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-Native\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Native.git\",\n \"initial_base_sha\": \"c348441691e8bdab784a03aa9be64d53dacff341\"\n },\n {\n \"id\": \"Agent-Intent\",\n \"path\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-Intent\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Intent.git\",\n \"initial_base_sha\": \"343b1e6d9a5b58e47bf7e594826221036ae8175c\"\n },\n {\n \"id\": \"Agent-Command\",\n \"path\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-Command\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Command.git\",\n \"initial_base_sha\": \"4f583ca3eeeb07a56a714c5086de84dcd6ad2980\"\n },\n {\n \"id\": \"Agent-Squad\",\n \"path\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-Squad\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Squad.git\",\n \"initial_base_sha\": \"490b0b2dfa1567cb16ff7a7230fd78e52bc2938e\"\n },\n {\n \"id\": \"Agent-System-Backend\",\n \"path\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-System-Backend\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Backend.git\",\n \"initial_base_sha\": \"5d5fc9891c0eb8994545ccb8b740535d9b99fb0e\"\n },\n {\n \"id\": \"Agent-System-RDM\",\n \"path\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-System-RDM\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-RDM.git\",\n \"initial_base_sha\": \"c058bfcf651c42b2dfc9c93ec7cb1f1036d3fd95\"\n }\n]\n", + "output_sha256": "947444627c8870cab67c41d9f9e870f47ce37fe78435c335f62e0909223fbb31", + "receipt_sha256": "3d59ccdd4402c4d343ad5d60d5025fce869e9c8db4f6766d7fb62f559394400a" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T15:00:37.190424+00:00", + "command": "cat /tmp/dependency-foundation-probe-01a1345f.py && python3 /tmp/dependency-foundation-probe-01a1345f.py red", + "command_sha256": "d5f8cf2f366e3cb0d08190bbdcd29fdb7a6ed5f77c53e4d26441c5ff4dadb4ad", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ee9b437b22b49f96e1bc65f79417b22e8e82a37c", + "status": " M .gitignore\n M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "d341d82253ecc6a89110fbe016cc81a6fa78d55d6616f3a48cbf69423440d8eb", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ee9b437b22b49f96e1bc65f79417b22e8e82a37c", + "status": " M .gitignore\n M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "d341d82253ecc6a89110fbe016cc81a6fa78d55d6616f3a48cbf69423440d8eb", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "import json\nimport os\nfrom pathlib import Path\nimport subprocess\nimport sys\nimport tempfile\n\nroot = Path('/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration')\nprefix = 'git-ssh.u1680832.nyat.app/weichen/'\nrecords = {r['id']: r for r in json.loads((root / 'sources.json').read_text())}\nexpect_red = sys.argv[1] == 'red'\nrefs = {n: subprocess.check_output(['git', '-C', str(root / n), 'rev-parse', 'HEAD'], text=True).strip()\n for n in ['Logging-System', 'Error-Code-System']}\nwith tempfile.TemporaryDirectory(prefix='foundation-', dir=root) as td:\n consumer = Path(td)\n (consumer / 'go.mod').write_text('module example.test/foundation\\n\\ngo 1.27\\n')\n env = dict(os.environ, GOWORK='off', GOTOOLCHAIN='local', GOPRIVATE=prefix.rstrip('/'),\n GOPROXY='direct', GONOSUMDB=prefix.rstrip('/'), GOMODCACHE=str(consumer / 'cache'),\n GIT_CONFIG_COUNT='1', GIT_CONFIG_KEY_0='url.ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/.insteadOf',\n GIT_CONFIG_VALUE_0='https://git-ssh.u1680832.nyat.app/weichen/')\n failed = []\n versions = {}\n for name, ref in refs.items():\n module = prefix + name + '.git'\n args = ['go', 'get', module + '@' + ref]\n result = subprocess.run(args, cwd=consumer, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)\n print(json.dumps({'command': args, 'source_sha': ref, 'exit': result.returncode}), flush=True)\n print(result.stdout, flush=True)\n if result.returncode:\n failed.append(name)\n if expect_red and 'declares its path' not in result.stdout:\n raise RuntimeError('unexpected download/transport failure')\n elif not expect_red:\n raw = subprocess.check_output(['go', 'list', '-m', '-json', module], cwd=consumer, env=env, text=True)\n versions[name] = json.loads(raw)['Version']\n if expect_red:\n assert failed == list(refs), failed\n print('RED: both existing short module declarations reject canonical remote consumption')\n else:\n assert not failed, failed\n (consumer / 'foundation_test.go').write_text('''package foundation\nimport (\n \"testing\"\n errcode \"git-ssh.u1680832.nyat.app/weichen/Error-Code-System.git/errcode\"\n _ \"git-ssh.u1680832.nyat.app/weichen/Logging-System.git/redact\"\n)\nfunc TestRealRemoteModules(t *testing.T) {\n code, err := errcode.ParseCode(\"sys.unknown_code\")\n if err != nil || code.Domain() != \"sys\" { t.Fatalf(\"code=%v err=%v\", code, err) }\n}\n''')\n subprocess.run(['go', 'test', '-mod=readonly', '-count=1', './...'], cwd=consumer, env=env, check=True)\n (root / 'foundation-versions.json').write_text(json.dumps({'refs': refs, 'versions': versions}, indent=2) + '\\n')\n print('GREEN: clean-cache remote modules compile and execute without workspace/local replace')\n print(json.dumps({'refs': refs, 'versions': versions}, indent=2))\n{\"command\": [\"go\", \"get\", \"git-ssh.u1680832.nyat.app/weichen/Logging-System.git@da5c33eb25a88b5ad5c88999d1a119f6f5b3af24\"], \"source_sha\": \"da5c33eb25a88b5ad5c88999d1a119f6f5b3af24\", \"exit\": 1}\ngo: downloading git-ssh.u1680832.nyat.app/weichen/Logging-System.git v0.0.0-20260930160839-da5c33eb25a8\ngo: git-ssh.u1680832.nyat.app/weichen/Logging-System.git@da5c33eb25a88b5ad5c88999d1a119f6f5b3af24 (v0.0.0-20260930160839-da5c33eb25a8) requires git-ssh.u1680832.nyat.app/weichen/Logging-System.git@v0.0.0-20260930160839-da5c33eb25a8: parsing go.mod:\n\tmodule declares its path as: logging-system\n\t but was required as: git-ssh.u1680832.nyat.app/weichen/Logging-System.git\n\n{\"command\": [\"go\", \"get\", \"git-ssh.u1680832.nyat.app/weichen/Error-Code-System.git@9e99b52611449c0ce7f35527b9b95fe55701f892\"], \"source_sha\": \"9e99b52611449c0ce7f35527b9b95fe55701f892\", \"exit\": 1}\ngo: downloading git-ssh.u1680832.nyat.app/weichen/Error-Code-System.git v0.0.0-20260930160838-9e99b5261144\ngo: git-ssh.u1680832.nyat.app/weichen/Error-Code-System.git@9e99b52611449c0ce7f35527b9b95fe55701f892 (v0.0.0-20260930160838-9e99b5261144) requires git-ssh.u1680832.nyat.app/weichen/Error-Code-System.git@v0.0.0-20260930160838-9e99b5261144: parsing go.mod:\n\tmodule declares its path as: error-code-system\n\t but was required as: git-ssh.u1680832.nyat.app/weichen/Error-Code-System.git\n\nRED: both existing short module declarations reject canonical remote consumption\n", + "output_sha256": "6f4a3d53b29ba7ca09c7a04498e7a6e92ac6352abd69838ca00290c1ee1d6c93", + "receipt_sha256": "f123f907a0d774442573083cd10b407665d65d8231a0ac14e044f111dfa0e19a" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T15:04:01.256603+00:00", + "command": "git -C .migration/Logging-System diff --check && git -C .migration/Error-Code-System diff --check && (cd .migration/Logging-System && GOWORK=off go test -count=1 ./...) && (cd .migration/Error-Code-System && GOWORK=off go test -count=1 ./...)", + "command_sha256": "e5088a6bfd858e2da4cebe31eae3a29ef32d29312582bd6006bc193ac726f29d", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ee9b437b22b49f96e1bc65f79417b22e8e82a37c", + "status": " M .gitignore\n M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "03ed187a0173eddda253d5e6b5c77167555ee8ab0d8369999a4ddab60840b47b", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "ee9b437b22b49f96e1bc65f79417b22e8e82a37c", + "status": " M .gitignore\n M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "03ed187a0173eddda253d5e6b5c77167555ee8ab0d8369999a4ddab60840b47b", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "? \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git\t[no test files]\nok \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git/cli\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git/config\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git/conformance\t0.044s\nok \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git/logsys\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git/redact\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git/server\t0.055s\nok \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git/sink\t0.015s\nok \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git/slogadapter\t0.002s\n? \tgit-ssh.u1680832.nyat.app/weichen/Error-Code-System.git\t[no test files]\nok \tgit-ssh.u1680832.nyat.app/weichen/Error-Code-System.git/cli\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Error-Code-System.git/conformance\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Error-Code-System.git/domains\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Error-Code-System.git/errcode\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Error-Code-System.git/httpx\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Error-Code-System.git/server\t0.004s\n", + "output_sha256": "325b95d178fee3a0222dd8dad501e6fdf4511eff843cf4762702db04466e4874", + "receipt_sha256": "8b0e620588027e1d523e39ab76f1d1910c16e89e10ed2a700b89b2526e8ced0f" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T15:06:47.873930+00:00", + "command": "cat /tmp/dependency-commit-providers-01a1345f.py && python3 /tmp/dependency-commit-providers-01a1345f.py Logging-System Error-Code-System && python3 /tmp/dependency-foundation-probe-01a1345f.py green", + "command_sha256": "347a7608c50a53f13d08acf93222e9a95d54591215e55968710284d59ef2454b", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "69c5c84d8a2f1a7966ebfb809cbb26d54e8e8abb", + "status": " M .gitignore\n M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "77d65645ea48f6aa107a50f0da4d61dbb94d70a33f42005c81647815138ea726", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "69c5c84d8a2f1a7966ebfb809cbb26d54e8e8abb", + "status": " M .gitignore\n M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "77d65645ea48f6aa107a50f0da4d61dbb94d70a33f42005c81647815138ea726", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "from pathlib import Path\nimport subprocess\nimport sys\n\nroot=Path('/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration')\nfor name in sys.argv[1:]:\n repo=root/name\n files=subprocess.check_output(['git','-C',str(repo),'diff','--name-only','-z'],text=True).split('\\0')\n files=[p for p in files if p]\n if not files: raise RuntimeError('no owned delta: '+name)\n subprocess.run(['git','-C',str(repo),'diff','--check'],check=True)\n subprocess.run(['git','-C',str(repo),'add','--',*files],check=True)\n subprocess.run(['git','-C',str(repo),'commit','-F','/tmp/dependency-provider-commit-01a1345f.txt','--',*files],check=True)\n subprocess.run(['git','-C',str(repo),'push','origin','HEAD:refs/heads/feature/versioned-dependencies'],check=True)\n print(name,subprocess.check_output(['git','-C',str(repo),'rev-parse','HEAD'],text=True).strip(),flush=True)\n[feature/versioned-dependencies 9c5442f] Enable canonical versioned Go module consumption\n 22 files changed, 38 insertions(+), 38 deletions(-)\nremote: \nremote: Create a new pull request for 'feature/versioned-dependencies': \nremote: https://git-panel.u1680832.nyat.app:30319/weichen/Logging-System/pulls/new/feature/versioned-dependencies \nremote: \nTo ssh://git-ssh.u1680832.nyat.app:31411/weichen/Logging-System.git\n * [new branch] HEAD -> feature/versioned-dependencies\nLogging-System 9c5442f06d05d4fd17905e91a415a8ce3d5db705\n[feature/versioned-dependencies 28d2d50] Enable canonical versioned Go module consumption\n 19 files changed, 28 insertions(+), 28 deletions(-)\nremote: \nremote: Create a new pull request for 'feature/versioned-dependencies': \nremote: https://git-panel.u1680832.nyat.app:30319/weichen/Error-Code-System/pulls/new/feature/versioned-dependencies \nremote: \nTo ssh://git-ssh.u1680832.nyat.app:31411/weichen/Error-Code-System.git\n * [new branch] HEAD -> feature/versioned-dependencies\nError-Code-System 28d2d50743479176307cec755413035a6a17c773\n{\"command\": [\"go\", \"get\", \"git-ssh.u1680832.nyat.app/weichen/Logging-System.git@9c5442f06d05d4fd17905e91a415a8ce3d5db705\"], \"source_sha\": \"9c5442f06d05d4fd17905e91a415a8ce3d5db705\", \"exit\": 0}\ngo: downloading git-ssh.u1680832.nyat.app/weichen/Logging-System.git v0.0.0-20261013150647-9c5442f06d05\ngo: added git-ssh.u1680832.nyat.app/weichen/Logging-System.git v0.0.0-20261013150647-9c5442f06d05\n\n{\"command\": [\"go\", \"get\", \"git-ssh.u1680832.nyat.app/weichen/Error-Code-System.git@28d2d50743479176307cec755413035a6a17c773\"], \"source_sha\": \"28d2d50743479176307cec755413035a6a17c773\", \"exit\": 0}\ngo: downloading git-ssh.u1680832.nyat.app/weichen/Error-Code-System.git v0.0.0-20261013150648-28d2d5074347\ngo: added git-ssh.u1680832.nyat.app/weichen/Error-Code-System.git v0.0.0-20261013150648-28d2d5074347\n\nok \texample.test/foundation\t0.002s\nGREEN: clean-cache remote modules compile and execute without workspace/local replace\n{\n \"refs\": {\n \"Logging-System\": \"9c5442f06d05d4fd17905e91a415a8ce3d5db705\",\n \"Error-Code-System\": \"28d2d50743479176307cec755413035a6a17c773\"\n },\n \"versions\": {\n \"Logging-System\": \"v0.0.0-20261013150647-9c5442f06d05\",\n \"Error-Code-System\": \"v0.0.0-20261013150648-28d2d5074347\"\n }\n}\n", + "output_sha256": "8f35ccaafb74dc3edc229b05d8443e3d5ed9e9c4e5d4f27e44947526188e0228", + "receipt_sha256": "fb1c5f0435d57fdfd786b750dd7e9c0c9be43d1b5809ea74c4f2423ec611c667" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T15:09:53.395849+00:00", + "command": "git -C .migration/Agent-System-Core diff --check && (cd .migration/Agent-System-Core && GOWORK=off go test -count=1 ./... && npm test && npm run typecheck)", + "command_sha256": "2d5526ed3cd807c792cfb3ff455a1017c2c719c74dfbf9201e3771b59253796d", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "69c5c84d8a2f1a7966ebfb809cbb26d54e8e8abb", + "status": " M .gitignore\n M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "16836eacb975c1c8bffc0bbae90f1413b2d5d766fd8f38efdca3de13f0510bca", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "69c5c84d8a2f1a7966ebfb809cbb26d54e8e8abb", + "status": " M .gitignore\n M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "16836eacb975c1c8bffc0bbae90f1413b2d5d766fd8f38efdca3de13f0510bca", + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "ok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Core.git\t0.003s\n\n> @agent-system/contracts@0.1.0 test\n> npm run check:package && node --test scripts/test-package.mjs\n\n\n> @agent-system/contracts@0.1.0 check:package\n> node scripts/build-package.mjs --check\n\n✔ packed contracts compile in a consumer without the Core checkout (602.65968ms)\nℹ tests 1\nℹ suites 0\nℹ pass 1\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 642.77669\n\n> @agent-system/contracts@0.1.0 typecheck\n> tsc -p tsconfig.package.json --noEmit\n\n", + "output_sha256": "b00579136a17414d8fe3e19e8fe79ef3b6aa7b5570728f6837dddca7b819e3e9", + "receipt_sha256": "568fd5ec507bb92e912685a02c6ceb77867823fc64c27ff8e1f45efc553ccf07" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T15:18:23.000163+00:00", + "command": "python3 -m unittest discover -s tests -p test_transport.py -v", + "command_sha256": "117a7baccc23a6e0d68c02dfcd72b8b7648a0ca4f0b31df3b6026487a2c0dc38", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "69c5c84d8a2f1a7966ebfb809cbb26d54e8e8abb", + "status": " M .gitignore\n M .task/feature-dependency-workspace.md\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_transport.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "0182484a6342fd5c388d0814d70c3dcab71d00ee3543b103e48475f0b9262e53", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "5b5160ad42f7349afe8776bcecb2a758e8768a611faad27ea26537b5a4ce87ab", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "99e8871ba1603d6861a42b46694c1c6589f1e7f1cca09bfeb3b981c3bd46ee63", + "scripts/workspace/go.py": "9306fbe0fe2ab10cbcd3ff046f9d444d94d0f7b80fe4be53a2d669f377873677", + "scripts/workspace/manifest.py": "840c02103309e25a25fc01bc7a87ad960a8fd8f456c38631b04b20482bfbe7f4", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "4a05473b50c871b95d0f9eed19447b5e5a25a085a8c61cba27fcf328a7934f40", + "tests/test_transport.py": "02cba544a6e7038e9eb5cf202feb725c5dec45efc72ff4dc4c4b669c9285cbb5", + "tests/test_workspace.py": "e70ee31b86d040ea63965757f32fd98e56c72383cb888ab975871e26ad8b6594" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "69c5c84d8a2f1a7966ebfb809cbb26d54e8e8abb", + "status": " M .gitignore\n M .task/feature-dependency-workspace.md\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_transport.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "0182484a6342fd5c388d0814d70c3dcab71d00ee3543b103e48475f0b9262e53", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "5b5160ad42f7349afe8776bcecb2a758e8768a611faad27ea26537b5a4ce87ab", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "99e8871ba1603d6861a42b46694c1c6589f1e7f1cca09bfeb3b981c3bd46ee63", + "scripts/workspace/go.py": "9306fbe0fe2ab10cbcd3ff046f9d444d94d0f7b80fe4be53a2d669f377873677", + "scripts/workspace/manifest.py": "840c02103309e25a25fc01bc7a87ad960a8fd8f456c38631b04b20482bfbe7f4", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "4a05473b50c871b95d0f9eed19447b5e5a25a085a8c61cba27fcf328a7934f40", + "tests/test_transport.py": "02cba544a6e7038e9eb5cf202feb725c5dec45efc72ff4dc4c4b669c9285cbb5", + "tests/test_workspace.py": "e70ee31b86d040ea63965757f32fd98e56c72383cb888ab975871e26ad8b6594" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after_error": null, + "exit_code": 1, + "output": "test_credentials_in_transport_url_are_rejected (test_transport.TransportTests.test_credentials_in_transport_url_are_rejected) ... FAIL\ntest_remote_revision_download_without_global_git_change (test_transport.TransportTests.test_remote_revision_download_without_global_git_change) ... FAIL\n\n======================================================================\nFAIL: test_credentials_in_transport_url_are_rejected (test_transport.TransportTests.test_credentials_in_transport_url_are_rejected)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_transport.py\", line 51, in test_credentials_in_transport_url_are_rejected\n transport = self.load()\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_transport.py\", line 13, in load\n self.assertTrue(SCRIPT.is_file(), 'process-scoped module transport is required')\n ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: False is not true : process-scoped module transport is required\n\n======================================================================\nFAIL: test_remote_revision_download_without_global_git_change (test_transport.TransportTests.test_remote_revision_download_without_global_git_change)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_transport.py\", line 20, in test_remote_revision_download_without_global_git_change\n transport = self.load()\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_transport.py\", line 13, in load\n self.assertTrue(SCRIPT.is_file(), 'process-scoped module transport is required')\n ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: False is not true : process-scoped module transport is required\n\n----------------------------------------------------------------------\nRan 2 tests in 0.001s\n\nFAILED (failures=2)\n", + "output_sha256": "cd8cea9da9aa4027a4b8da54d256262b9cddb88e8fb6dd5fbd7482e89c740c6d", + "receipt_sha256": "b97492aaa631b1c3272334a877da8c243a0fe1048c0d5e6b0b7f72841b37171f" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T15:18:24.006425+00:00", + "command": "(cd .migration/Agent-System-UI && npm test && npm run typecheck && npm run check:package)", + "command_sha256": "8288e4660f43ea7f6a5b0bd83e82ab67e2c02075e211aaed13a159ebc18f667e", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "69c5c84d8a2f1a7966ebfb809cbb26d54e8e8abb", + "status": " M .gitignore\n M .task/feature-dependency-workspace.md\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_transport.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "0182484a6342fd5c388d0814d70c3dcab71d00ee3543b103e48475f0b9262e53", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "5b5160ad42f7349afe8776bcecb2a758e8768a611faad27ea26537b5a4ce87ab", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "99e8871ba1603d6861a42b46694c1c6589f1e7f1cca09bfeb3b981c3bd46ee63", + "scripts/workspace/go.py": "9306fbe0fe2ab10cbcd3ff046f9d444d94d0f7b80fe4be53a2d669f377873677", + "scripts/workspace/manifest.py": "840c02103309e25a25fc01bc7a87ad960a8fd8f456c38631b04b20482bfbe7f4", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "4a05473b50c871b95d0f9eed19447b5e5a25a085a8c61cba27fcf328a7934f40", + "tests/test_transport.py": "02cba544a6e7038e9eb5cf202feb725c5dec45efc72ff4dc4c4b669c9285cbb5", + "tests/test_workspace.py": "e70ee31b86d040ea63965757f32fd98e56c72383cb888ab975871e26ad8b6594" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "69c5c84d8a2f1a7966ebfb809cbb26d54e8e8abb", + "status": " M .gitignore\n M .task/feature-dependency-workspace.md\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_transport.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "2d0824a3259d21f5f0701aef4cb265314f3e3daaf1e8bbef1967a414a0490007", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "5b5160ad42f7349afe8776bcecb2a758e8768a611faad27ea26537b5a4ce87ab", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "99e8871ba1603d6861a42b46694c1c6589f1e7f1cca09bfeb3b981c3bd46ee63", + "scripts/workspace/go.py": "9306fbe0fe2ab10cbcd3ff046f9d444d94d0f7b80fe4be53a2d669f377873677", + "scripts/workspace/manifest.py": "840c02103309e25a25fc01bc7a87ad960a8fd8f456c38631b04b20482bfbe7f4", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "4a05473b50c871b95d0f9eed19447b5e5a25a085a8c61cba27fcf328a7934f40", + "tests/test_transport.py": "02cba544a6e7038e9eb5cf202feb725c5dec45efc72ff4dc4c4b669c9285cbb5", + "tests/test_workspace.py": "e70ee31b86d040ea63965757f32fd98e56c72383cb888ab975871e26ad8b6594" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "\n> @agent-system/ui@0.1.0 test\n> vitest run && npm run test:package\n\n\n RUN v4.1.11 /home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-System-UI\n\n\n Test Files 18 passed (18)\n Tests 162 passed (162)\n Start at 15:18:24\n Duration 1.01s (transform 766ms, setup 0ms, import 2.13s, tests 1.97s, environment 4.81s)\n\n\n> @agent-system/ui@0.1.0 test:package\n> npm run check:package && node --test scripts/test-package.mjs\n\n\n> @agent-system/ui@0.1.0 check:package\n> node scripts/build-package.mjs --check\n\n✔ packed UI renders and exposes CSS and types without adjacent source checkouts (1432.9721ms)\nℹ tests 1\nℹ suites 0\nℹ pass 1\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 1471.263093\n\n> @agent-system/ui@0.1.0 typecheck\n> tsc --noEmit\n\n\n> @agent-system/ui@0.1.0 check:package\n> node scripts/build-package.mjs --check\n\n", + "output_sha256": "be224bb03dbe868d7e104a91bd514b1db97f92ef42a681ed12c350da207b24cd", + "receipt_sha256": "238d992820aa60efb9fbaefc9c0eebc614aca6cce4c1123ee9c8ff537163a7a6" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T15:19:51.183213+00:00", + "command": "python3 -m unittest discover -s tests -p test_transport.py -v", + "command_sha256": "117a7baccc23a6e0d68c02dfcd72b8b7648a0ca4f0b31df3b6026487a2c0dc38", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5aae47ebca20ad1f3add3b080212cca7e1c6edf9", + "status": " M .gitignore\n M .task/feature-dependency-workspace.md\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? scripts/workspace/transport.py\n?? tests/test_transport.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "41925d5d8571b9cf78ce7b6ccfe9a80e40f7f38fe1d40cdea49bec002699ea05", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "5b5160ad42f7349afe8776bcecb2a758e8768a611faad27ea26537b5a4ce87ab", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "99e8871ba1603d6861a42b46694c1c6589f1e7f1cca09bfeb3b981c3bd46ee63", + "scripts/workspace/go.py": "9306fbe0fe2ab10cbcd3ff046f9d444d94d0f7b80fe4be53a2d669f377873677", + "scripts/workspace/manifest.py": "840c02103309e25a25fc01bc7a87ad960a8fd8f456c38631b04b20482bfbe7f4", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "4a05473b50c871b95d0f9eed19447b5e5a25a085a8c61cba27fcf328a7934f40", + "scripts/workspace/transport.py": "4fb2fa86ecb1bf58bd00fbd4cafbbb38c06654fafa9e511ee391b9c4004a82b2", + "tests/test_transport.py": "02cba544a6e7038e9eb5cf202feb725c5dec45efc72ff4dc4c4b669c9285cbb5", + "tests/test_workspace.py": "0457bf0e774e638894fcd6675cef5a49ac84a224ca301324edbb4c921e036e5a" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after": { + "head": "e0982c8428ec413334ab6761bf59b2c4bbaaba16", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5aae47ebca20ad1f3add3b080212cca7e1c6edf9", + "status": " M .gitignore\n M .task/feature-dependency-workspace.md\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? scripts/workspace/transport.py\n?? tests/test_transport.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "41925d5d8571b9cf78ce7b6ccfe9a80e40f7f38fe1d40cdea49bec002699ea05", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "5b5160ad42f7349afe8776bcecb2a758e8768a611faad27ea26537b5a4ce87ab", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "99e8871ba1603d6861a42b46694c1c6589f1e7f1cca09bfeb3b981c3bd46ee63", + "scripts/workspace/go.py": "9306fbe0fe2ab10cbcd3ff046f9d444d94d0f7b80fe4be53a2d669f377873677", + "scripts/workspace/manifest.py": "840c02103309e25a25fc01bc7a87ad960a8fd8f456c38631b04b20482bfbe7f4", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "4a05473b50c871b95d0f9eed19447b5e5a25a085a8c61cba27fcf328a7934f40", + "scripts/workspace/transport.py": "4fb2fa86ecb1bf58bd00fbd4cafbbb38c06654fafa9e511ee391b9c4004a82b2", + "tests/test_transport.py": "02cba544a6e7038e9eb5cf202feb725c5dec45efc72ff4dc4c4b669c9285cbb5", + "tests/test_workspace.py": "0457bf0e774e638894fcd6675cef5a49ac84a224ca301324edbb4c921e036e5a" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "test_credentials_in_transport_url_are_rejected (test_transport.TransportTests.test_credentials_in_transport_url_are_rejected) ... ok\ntest_remote_revision_download_without_global_git_change (test_transport.TransportTests.test_remote_revision_download_without_global_git_change) ... ok\n\n----------------------------------------------------------------------\nRan 2 tests in 0.171s\n\nOK\n", + "output_sha256": "4f635d9752cb6d7eded7375868b6197ac501ba0f4ea16f3c351dd9fcab02c7c0", + "receipt_sha256": "b96a0bc4604cac443368cd695a29e08c053c3756eec76a41982e6801bc90d302" +} +``` diff --git a/components.json b/components.json new file mode 100644 index 00000000..c2973a6e --- /dev/null +++ b/components.json @@ -0,0 +1,192 @@ +{ + "schema": 1, + "components": [ + { + "id": "Logging-System", + "repo": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Logging-System.git", + "path": ".workspace/Logging-System", + "legacy_path": "deps/logging-system", + "role": "go-library", + "modules": [ + { + "path": "git-ssh.u1680832.nyat.app/weichen/Logging-System.git", + "legacy": "logging-system", + "directory": "." + } + ], + "target": "main" + }, + { + "id": "Error-Code-System", + "repo": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Error-Code-System.git", + "path": ".workspace/Error-Code-System", + "legacy_path": "deps/error-code-system", + "role": "go-library", + "modules": [ + { + "path": "git-ssh.u1680832.nyat.app/weichen/Error-Code-System.git", + "legacy": "error-code-system", + "directory": "." + } + ], + "target": "main" + }, + { + "id": "Agent-System-Core", + "repo": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Core.git", + "path": ".workspace/Agent-System-Core", + "legacy_path": "modules/core", + "role": "go-library", + "modules": [ + { + "path": "git-ssh.u1680832.nyat.app/weichen/Agent-System-Core.git", + "legacy": "agent-system-core", + "directory": "." + } + ], + "target": "main" + }, + { + "id": "Agent-System-UI", + "repo": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-UI.git", + "path": ".workspace/Agent-System-UI", + "legacy_path": "modules/ui", + "role": "npm-library", + "modules": [], + "target": "main" + }, + { + "id": "Agent-System-Frontend", + "repo": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Frontend.git", + "path": ".workspace/Agent-System-Frontend", + "legacy_path": "modules/frontend", + "role": "application", + "modules": [], + "target": "main" + }, + { + "id": "Agent-Native", + "repo": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Native.git", + "path": ".workspace/Agent-Native", + "legacy_path": "deps/agent-native", + "role": "go-library", + "modules": [ + { + "path": "git-ssh.u1680832.nyat.app/weichen/Agent-Native.git", + "legacy": "agent-native", + "directory": "." + } + ], + "target": "main" + }, + { + "id": "Agent-Intent", + "repo": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Intent.git", + "path": ".workspace/Agent-Intent", + "legacy_path": "deps/agent-intent", + "role": "go-library", + "modules": [ + { + "path": "git-ssh.u1680832.nyat.app/weichen/Agent-Intent.git", + "legacy": "agent-intent", + "directory": "." + } + ], + "target": "main" + }, + { + "id": "Agent-Command", + "repo": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Command.git", + "path": ".workspace/Agent-Command", + "legacy_path": "deps/agent-command", + "role": "go-library", + "modules": [ + { + "path": "git-ssh.u1680832.nyat.app/weichen/Agent-Command.git", + "legacy": "agent-command", + "directory": "." + } + ], + "target": "main" + }, + { + "id": "Agent-Squad", + "repo": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Squad.git", + "path": ".workspace/Agent-Squad", + "legacy_path": "deps/agent-squad", + "role": "go-library", + "modules": [ + { + "path": "git-ssh.u1680832.nyat.app/weichen/Agent-Squad.git", + "legacy": "agent-squad", + "directory": "." + }, + { + "path": "git-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/adapters/native", + "legacy": "agent-squad/adapters/native", + "directory": "adapters/native" + }, + { + "path": "git-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/adapters/intent", + "legacy": "agent-squad/adapters/intent", + "directory": "adapters/intent" + }, + { + "path": "git-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/adapters/sqlite", + "legacy": "agent-squad/adapters/sqlite", + "directory": "adapters/sqlite" + }, + { + "path": "git-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/cmd/agent-squad", + "legacy": "agent-squad/cmd/agent-squad", + "directory": "cmd/agent-squad" + } + ], + "target": "main" + }, + { + "id": "Agent-System-Backend", + "repo": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Backend.git", + "path": ".workspace/Agent-System-Backend", + "legacy_path": "modules/backend", + "role": "application", + "modules": [ + { + "path": "git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git", + "legacy": "agent-system-backend", + "directory": "." + } + ], + "target": "main" + }, + { + "id": "Development-Guidelines", + "repo": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Development-Guidelines.git", + "path": ".workspace/Development-Guidelines", + "legacy_path": "deps/development-guidelines", + "role": "guidelines", + "modules": [], + "target": "main" + }, + { + "id": "Agent-System-Documents", + "repo": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Documents.git", + "path": ".workspace/Agent-System-Documents", + "legacy_path": "modules/documents", + "role": "documentation", + "modules": [], + "target": "main" + } + ], + "transport": { + "go_private": [ + "git-ssh.u1680832.nyat.app/weichen" + ], + "git_rewrites": [ + { + "from": "https://git-ssh.u1680832.nyat.app/weichen/", + "to": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + } + ] + } +} diff --git a/components.lock.json b/components.lock.json new file mode 100644 index 00000000..e67a9c21 --- /dev/null +++ b/components.lock.json @@ -0,0 +1,20 @@ +{ + "schema": 1, + "components": { + "Agent-System-UI": { + "commit": "2c4322ef56df64ad72f65907d25b048a74bb5ffc" + }, + "Agent-System-Frontend": { + "commit": "eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b" + }, + "Agent-System-Backend": { + "commit": "5d5fc9891c0eb8994545ccb8b740535d9b99fb0e" + }, + "Development-Guidelines": { + "commit": "2f5b19872be2a4597838a4131ad75d1be089ee5e" + }, + "Agent-System-Documents": { + "commit": "129cc3579d9c9e3edfb46c99270d65f3e1dad0a0" + } + } +} diff --git a/scripts/workspace/transport.py b/scripts/workspace/transport.py new file mode 100644 index 00000000..ab8cd22d --- /dev/null +++ b/scripts/workspace/transport.py @@ -0,0 +1,49 @@ +"""Process-local module transport; configuration contains no credentials.""" +import json +import os +from pathlib import Path +from urllib.parse import urlsplit + + +def _url(value): + if not isinstance(value, str) or any(c.isspace() for c in value): + raise ValueError('invalid module transport URL') + parsed = urlsplit(value) + if parsed.scheme not in {'https', 'ssh', 'git+ssh', 'file'} or parsed.password: + raise ValueError('unsupported transport or credentials in URL') + if parsed.scheme == 'https' and parsed.username: + raise ValueError('transport URL must not contain credentials') + if parsed.scheme == 'file' and parsed.netloc not in {'', 'localhost'}: + raise ValueError('file transport must be local') + if parsed.query or parsed.fragment or not parsed.path: + raise ValueError('transport URL must identify a repository path') + return value + + +def environment(root=None): + root = Path(root) if root is not None else Path(__file__).resolve().parents[2] + path = root / 'components.json' + config = json.loads(path.read_text()).get('transport', {}) if path.exists() else {} + env = os.environ.copy() + env.update(GOWORK='off', GOTOOLCHAIN='local') + private = config.get('go_private', []) + if not isinstance(private, list) or any(not isinstance(p, str) or not p or any(c.isspace() for c in p) for p in private): + raise ValueError('invalid private module prefixes') + if private: + env.update(GOPRIVATE=','.join(private), GONOPROXY=','.join(private), GONOSUMDB=','.join(private)) + rewrites = config.get('git_rewrites', []) + if not isinstance(rewrites, list): + raise ValueError('invalid Git transport mappings') + if rewrites: + # Do not inherit temporary authentication configuration into candidate code. + for key in list(env): + if key == 'GIT_CONFIG_COUNT' or key.startswith(('GIT_CONFIG_KEY_', 'GIT_CONFIG_VALUE_')): + del env[key] + for i, rewrite in enumerate(rewrites): + if not isinstance(rewrite, dict) or set(rewrite) != {'from', 'to'}: + raise ValueError('invalid Git transport mapping') + source, target = _url(rewrite['from']), _url(rewrite['to']) + env[f'GIT_CONFIG_KEY_{i}'] = f'url.{target}.insteadOf' + env[f'GIT_CONFIG_VALUE_{i}'] = source + env['GIT_CONFIG_COUNT'] = str(len(rewrites)) + return env diff --git a/tests/test_transport.py b/tests/test_transport.py new file mode 100644 index 00000000..5c497746 --- /dev/null +++ b/tests/test_transport.py @@ -0,0 +1,60 @@ +import importlib.util +import json +import os +from pathlib import Path +import subprocess +import tempfile +import unittest + +SCRIPT = Path(__file__).resolve().parents[1] / 'scripts/workspace/transport.py' + +class TransportTests(unittest.TestCase): + def load(self): + self.assertTrue(SCRIPT.is_file(), 'process-scoped module transport is required') + spec = importlib.util.spec_from_file_location('workspace_transport', SCRIPT) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + def test_remote_revision_download_without_global_git_change(self): + transport = self.load() + with tempfile.TemporaryDirectory() as td: + root = Path(td) + source = root / 'provider' + source.mkdir() + subprocess.run(['git', 'init', '-q', str(source)], check=True) + subprocess.run(['git', '-C', str(source), 'config', 'user.name', 'Fixture'], check=True) + subprocess.run(['git', '-C', str(source), 'config', 'user.email', 'fixture@example.test'], check=True) + (source / 'go.mod').write_text('module example.test/provider.git\n\ngo 1.27\n') + (source / 'answer.go').write_text('package provider\nfunc Answer() int { return 42 }\n') + subprocess.run(['git', '-C', str(source), 'add', 'go.mod', 'answer.go'], check=True) + subprocess.run(['git', '-C', str(source), 'commit', '-qm', 'Add provider'], check=True) + sha = subprocess.check_output(['git', '-C', str(source), 'rev-parse', 'HEAD'], text=True).strip() + (root / 'components.json').write_text(json.dumps({'schema': 1, 'components': [], 'transport': { + 'go_private': ['example.test'], 'git_rewrites': [{'from': 'https://example.test/provider', 'to': source.as_uri()}]}})) + consumer = root / 'consumer' + consumer.mkdir() + (consumer / 'go.mod').write_text('module example.test/consumer\n\ngo 1.27\n') + env = transport.environment(root) + env['GOMODCACHE'] = str(root / 'module-cache') + before = subprocess.run(['git', 'config', '--global', '--list'], capture_output=True).stdout + result = subprocess.run(['go', 'get', 'example.test/provider.git@' + sha], cwd=consumer, env=env, capture_output=True, text=True) + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + (consumer / 'consumer_test.go').write_text('package consumer\nimport("testing"; "example.test/provider.git")\nfunc TestValue(t *testing.T) { if provider.Answer()!=42 { t.Fatal("wrong provider") } }\n') + result = subprocess.run(['go', 'test', '-mod=readonly', './...'], cwd=consumer, env=env, capture_output=True, text=True) + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + after = subprocess.run(['git', 'config', '--global', '--list'], capture_output=True).stdout + self.assertEqual(before, after) + self.assertNotIn('replace ', (consumer / 'go.mod').read_text()) + + def test_credentials_in_transport_url_are_rejected(self): + transport = self.load() + with tempfile.TemporaryDirectory() as td: + root = Path(td) + (root / 'components.json').write_text(json.dumps({'transport': {'git_rewrites': [ + {'from': 'https://example.test/', 'to': 'https://secret-token@example.test/'}]}})) + with self.assertRaises(ValueError): + transport.environment(root) + +if __name__ == '__main__': + unittest.main() -- 2.54.0 From b450e51c40ae7e52146a30b1ba6cb0612f4baeef Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 13 Oct 2026 15:58:23 +0000 Subject: [PATCH 08/29] Add safe component editing and explicit legacy workspace transition Why: Preserve a single Dev entry and independent repository ownership while allowing active feature branches to migrate without losing source or Git state. Evidence: SELF 29 real Git/Go workspace tests and ordinary component evidence/lock tests passed; detailed RED/GREEN runs are recorded by make evidence in the task card. Impact: Add fixed cloning, selected-version baselines, development overlays, npm source resolution, and independently preserved legacy snapshots. No other active worktree is modified. Refs: Versioned dependencies U2/U5; R15; feature/dependency-workspace --- .task/feature-dependency-workspace.md | 859 ++++++++++++++++++++++++++ components.json | 8 +- components.lock.json | 7 +- scripts/check-evidence.py | 6 + scripts/check-worktree.py | 30 + scripts/evidence.py | 56 +- scripts/workspace.py | 6 + scripts/workspace/__init__.py | 1 + scripts/workspace/cli.py | 237 +++++++ scripts/workspace/common.py | 75 +++ scripts/workspace/git.py | 70 +++ scripts/workspace/go.py | 153 +++++ scripts/workspace/manifest.py | 94 +++ scripts/workspace/npm.py | 62 ++ scripts/workspace/state.py | 36 ++ scripts/workspace/transition.py | 249 ++++++++ scripts/workspace/transport.py | 32 +- tests/test_component_governance.py | 69 +++ tests/test_transport.py | 22 + tests/test_workspace.py | 574 +++++++++++++++++ 20 files changed, 2633 insertions(+), 13 deletions(-) create mode 100644 scripts/workspace.py create mode 100644 scripts/workspace/__init__.py create mode 100644 scripts/workspace/cli.py create mode 100644 scripts/workspace/common.py create mode 100644 scripts/workspace/git.py create mode 100644 scripts/workspace/go.py create mode 100644 scripts/workspace/manifest.py create mode 100644 scripts/workspace/npm.py create mode 100644 scripts/workspace/state.py create mode 100644 scripts/workspace/transition.py create mode 100644 tests/test_component_governance.py create mode 100644 tests/test_workspace.py diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md index 68bd8630..384b2fe6 100644 --- a/.task/feature-dependency-workspace.md +++ b/.task/feature-dependency-workspace.md @@ -854,3 +854,862 @@ "receipt_sha256": "b96a0bc4604cac443368cd695a29e08c053c3756eec76a41982e6801bc90d302" } ``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T15:34:21.725090+00:00", + "command": "(cd .migration/Agent-System-Frontend && npm test && npm run build) && git -C .migration/Agent-System-Frontend diff --check", + "command_sha256": "d4827adcf257c5dc919f5eec3beb38c62aff4e67c390c578e842eef8b6e98a79", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "f71058cb7e7c8c97d5d002a317501e87ef7e7b5e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5aae47ebca20ad1f3add3b080212cca7e1c6edf9", + "status": "?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "6e29f940455d20332825e3228c054680781d2dd2c63f289d38f11e1117cf1822", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "00c12ad29f13d8640def2b3df9e06b11126a377230b6086329924f2f27914aa6", + "scripts/workspace/go.py": "6cf903115fe8358bf1939e036da3dcf343b9c86b81405567526aae55aaf248d5", + "scripts/workspace/manifest.py": "840c02103309e25a25fc01bc7a87ad960a8fd8f456c38631b04b20482bfbe7f4", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "f492ecc15b12a97f8d2ac71f2602bef7f38f902fe585cf27659dd4ce25584a5d", + "tests/test_workspace.py": "a4d28fe97df93645f6d10359d151bc69896202b3a64b10d29ff4f585f7eba492" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after": { + "head": "f71058cb7e7c8c97d5d002a317501e87ef7e7b5e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5aae47ebca20ad1f3add3b080212cca7e1c6edf9", + "status": "?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "6e29f940455d20332825e3228c054680781d2dd2c63f289d38f11e1117cf1822", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "00c12ad29f13d8640def2b3df9e06b11126a377230b6086329924f2f27914aa6", + "scripts/workspace/go.py": "15c178e0097202ae4421bc731451ef246dd2b765804e1f325e7f74525775541a", + "scripts/workspace/manifest.py": "840c02103309e25a25fc01bc7a87ad960a8fd8f456c38631b04b20482bfbe7f4", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "ce75598ef0cb41882effb0265e60a3d78c223c172ff6bb884bcf046e1ccf9efd", + "tests/test_workspace.py": "f1dee9a525431c723253e66787246362ed78b94f8ea9e5bf2a579e1d3bd59876" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "\n> agent-system-frontend@0.1.0 test\n> vitest run && npm run test:packages\n\n\n RUN v4.1.11 /home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Agent-System-Frontend\n\n(node:2419889) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2419886) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2419885) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2419894) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2419963) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2420083) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2420072) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2420095) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2419891) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2420466) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2419883) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n\n Test Files 33 passed (33)\n Tests 260 passed (260)\n Start at 15:34:22\n Duration 834ms (transform 5.32s, setup 0ms, import 8.83s, tests 1.05s, environment 4ms)\n\n\n> agent-system-frontend@0.1.0 test:packages\n> node --test scripts/test-packages.mjs\n\nnpm warn deprecated uuid@10.0.0: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).\n\nadded 178 packages in 2s\n\n> agent-system-frontend@0.1.0 build\n> tsc -b && vite build\n\nvite v6.4.3 building for production...\ntransforming...\n✓ 1015 modules transformed.\nrendering chunks...\ncomputing gzip size...\ndist/index.html 0.40 kB │ gzip: 0.27 kB\ndist/assets/index-DDAYwyEj.css 92.40 kB │ gzip: 15.95 kB\ndist/assets/jszip.min-D3vpNajS.js 0.12 kB │ gzip: 0.12 kB\ndist/assets/docx-preview-zvE_Eg6a.js 77.41 kB │ gzip: 21.29 kB\ndist/assets/jszip.min-C8r-wjLF.js 97.26 kB │ gzip: 30.16 kB\ndist/assets/index-CQuQ2tsO.js 213.14 kB │ gzip: 70.03 kB\ndist/assets/xlsx-CkFp8p6R.js 429.53 kB │ gzip: 143.07 kB\ndist/assets/index-BEPFMu8n.js 558.63 kB │ gzip: 174.18 kB\ndist/assets/pptx-preview.es-DejDD6gK.js 1,255.23 kB │ gzip: 401.46 kB\n\n(!) Some chunks are larger than 500 kB after minification. Consider:\n- Using dynamic import() to code-split the application\n- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks\n- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.\n✓ built in 7.64s\n✔ the application builds from packed dependencies without UI or Core source siblings (14193.694039ms)\nℹ tests 1\nℹ suites 0\nℹ pass 1\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 14254.085849\n\n> agent-system-frontend@0.1.0 build\n> tsc -b && vite build\n\nvite v6.4.3 building for production...\ntransforming...\n✓ 1015 modules transformed.\nrendering chunks...\ncomputing gzip size...\ndist/index.html 0.40 kB │ gzip: 0.27 kB\ndist/assets/index-DDAYwyEj.css 92.40 kB │ gzip: 15.95 kB\ndist/assets/jszip.min-D3vpNajS.js 0.12 kB │ gzip: 0.12 kB\ndist/assets/docx-preview-zvE_Eg6a.js 77.41 kB │ gzip: 21.29 kB\ndist/assets/jszip.min-C8r-wjLF.js 97.26 kB │ gzip: 30.16 kB\ndist/assets/index-CQuQ2tsO.js 213.14 kB │ gzip: 70.03 kB\ndist/assets/xlsx-CkFp8p6R.js 429.53 kB │ gzip: 143.07 kB\ndist/assets/index-BEPFMu8n.js 558.63 kB │ gzip: 174.18 kB\ndist/assets/pptx-preview.es-DejDD6gK.js 1,255.23 kB │ gzip: 401.46 kB\n\n(!) Some chunks are larger than 500 kB after minification. Consider:\n- Using dynamic import() to code-split the application\n- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks\n- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.\n✓ built in 8.22s\n", + "output_sha256": "4a1a95babbc8f6a57b64a966957a184e067fda18d0bb809c75cd85f7c7a07057", + "receipt_sha256": "881d9cbede9cd4f9844911370a84dc2e34b1070913e2163bcba35295e1e995b0" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T15:35:56.349657+00:00", + "command": "cat /tmp/dependency-integrate-go-layer-01a1345f.py && python3 /tmp/dependency-integrate-go-layer-01a1345f.py", + "command_sha256": "6ee695996189cd009134fd80f1792033d2d3b2d15dc32439ac1c137797a4eb15", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "f71058cb7e7c8c97d5d002a317501e87ef7e7b5e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5aae47ebca20ad1f3add3b080212cca7e1c6edf9", + "status": " M .task/feature-dependency-workspace.md\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "66d8c88ff8a61ac6b8ca612c56ea4acad3a3f796e7292385900aa1682150beb3", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "6e29f940455d20332825e3228c054680781d2dd2c63f289d38f11e1117cf1822", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "00c12ad29f13d8640def2b3df9e06b11126a377230b6086329924f2f27914aa6", + "scripts/workspace/go.py": "15c178e0097202ae4421bc731451ef246dd2b765804e1f325e7f74525775541a", + "scripts/workspace/manifest.py": "840c02103309e25a25fc01bc7a87ad960a8fd8f456c38631b04b20482bfbe7f4", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "ce75598ef0cb41882effb0265e60a3d78c223c172ff6bb884bcf046e1ccf9efd", + "tests/test_workspace.py": "196c70bf7840a70d6dd0a6c866b2e8ea08b8f9569fac7c74fa9a11747c7f2f14" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after": { + "head": "f71058cb7e7c8c97d5d002a317501e87ef7e7b5e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5aae47ebca20ad1f3add3b080212cca7e1c6edf9", + "status": " M .task/feature-dependency-workspace.md\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "66d8c88ff8a61ac6b8ca612c56ea4acad3a3f796e7292385900aa1682150beb3", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "6e29f940455d20332825e3228c054680781d2dd2c63f289d38f11e1117cf1822", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "00c12ad29f13d8640def2b3df9e06b11126a377230b6086329924f2f27914aa6", + "scripts/workspace/go.py": "15c178e0097202ae4421bc731451ef246dd2b765804e1f325e7f74525775541a", + "scripts/workspace/manifest.py": "840c02103309e25a25fc01bc7a87ad960a8fd8f456c38631b04b20482bfbe7f4", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "ce75598ef0cb41882effb0265e60a3d78c223c172ff6bb884bcf046e1ccf9efd", + "tests/test_workspace.py": "196c70bf7840a70d6dd0a6c866b2e8ea08b8f9569fac7c74fa9a11747c7f2f14" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "import importlib.util\nimport json\nfrom pathlib import Path\nimport subprocess\n\nroot=Path('/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace')\nspec=importlib.util.spec_from_file_location('transport',root/'scripts/workspace/transport.py')\ntransport=importlib.util.module_from_spec(spec); spec.loader.exec_module(transport)\ndata=json.loads((root/'.migration/provider-versions.json').read_text())\nfor name,manifest in [('Agent-Native','Agent-Native-owned-files.json'),('Agent-Intent','Agent-Intent-owned-files.json'),('Agent-Command','Agent-Command-owned-files.json'),('Agent-Squad','Agent-Squad-root-owned-files.json')]:\n repo=root/'.migration'/name\n files=json.loads((Path('/tmp/dependency-u3-01a1345f')/manifest).read_text())\n if any(Path(p).is_absolute() or '..' in Path(p).parts for p in files): raise RuntimeError('invalid owned path')\n subprocess.run(['git','-C',str(repo),'diff','--check'],check=True)\n subprocess.run(['go','test','-mod=readonly','-count=1','./...'],cwd=repo,env=transport.environment(root),check=True)\n subprocess.run(['git','-C',str(repo),'add','--',*files],check=True)\n subprocess.run(['git','-C',str(repo),'commit','-F','/tmp/dependency-provider-commit-01a1345f.txt','--',*files],check=True)\n subprocess.run(['git','-C',str(repo),'push','origin','HEAD:refs/heads/feature/versioned-dependencies'],check=True)\n sha=subprocess.check_output(['git','-C',str(repo),'rev-parse','HEAD'],text=True).strip()\n module='git-ssh.u1680832.nyat.app/weichen/'+name+'.git'\n selected=json.loads(subprocess.check_output(['go','list','-m','-json',module+'@'+sha],env=transport.environment(root),text=True))\n data['refs'][name]=sha; data['versions'][name]=selected['Version']\n (root/'.migration/provider-versions.json').write_text(json.dumps(data,indent=2)+'\\n')\n print(json.dumps({'repo':name,'committed_sha':sha,'version':selected['Version']}),flush=True)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/adapters/native\t0.197s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/adapters/pitransport\t0.038s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/catalogcheck\t0.003s\n? \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/cmd/agent-native\t[no test files]\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/conformance\t0.052s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/exec\t0.153s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/rpc\t0.005s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime\t1.276s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/agentspec\t0.005s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/checkpoint\t0.004s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/codeorch\t0.089s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/ext\t0.025s\n? \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/ext/pkg\t[no test files]\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/filestate\t0.023s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/gates\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/guardrails\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/hooks\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/llm\t0.266s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/mcp\t13.250s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/memory\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/policy\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/promptx\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/reminders\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/resources\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/session\t0.010s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/skills\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/subagent\t0.004s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/telemetry\t0.004s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/tools\t11.281s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/schema\t0.003s\n[feature/versioned-dependencies 6ddd3da] Enable canonical versioned Go module consumption\n 76 files changed, 169 insertions(+), 180 deletions(-)\nremote: \nremote: Create a new pull request for 'feature/versioned-dependencies': \nremote: https://git-panel.u1680832.nyat.app:30319/weichen/Agent-Native/pulls/new/feature/versioned-dependencies \nremote: \nTo ssh://git-ssh.u1680832.nyat.app:31411/weichen/Agent-Native.git\n * [new branch] HEAD -> feature/versioned-dependencies\n{\"repo\": \"Agent-Native\", \"committed_sha\": \"6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e\", \"version\": \"v0.0.0-20261013153610-6ddd3da8df5c\"}\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Intent.git/catalogcheck\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Intent.git/cmd/intentctl\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Intent.git/conformance\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Intent.git/examples\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Intent.git/intent\t0.005s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Intent.git/schema\t0.002s\n[feature/versioned-dependencies 3a8468c] Enable canonical versioned Go module consumption\n 12 files changed, 34 insertions(+), 37 deletions(-)\nremote: \nremote: Create a new pull request for 'feature/versioned-dependencies': \nremote: https://git-panel.u1680832.nyat.app:30319/weichen/Agent-Intent/pulls/new/feature/versioned-dependencies \nremote: \nTo ssh://git-ssh.u1680832.nyat.app:31411/weichen/Agent-Intent.git\n * [new branch] HEAD -> feature/versioned-dependencies\n{\"repo\": \"Agent-Intent\", \"committed_sha\": \"3a8468c83a80fa8ed17d9df347fd2565ddb95ebe\", \"version\": \"v0.0.0-20261013153611-3a8468c83a80\"}\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Command.git\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Command.git/conformance\t0.003s\n[feature/versioned-dependencies 1aa532f] Enable canonical versioned Go module consumption\n 4 files changed, 7 insertions(+), 3 deletions(-)\nremote: \nremote: Create a new pull request for 'feature/versioned-dependencies': \nremote: https://git-panel.u1680832.nyat.app:30319/weichen/Agent-Command/pulls/new/feature/versioned-dependencies \nremote: \nTo ssh://git-ssh.u1680832.nyat.app:31411/weichen/Agent-Command.git\n * [new branch] HEAD -> feature/versioned-dependencies\n{\"repo\": \"Agent-Command\", \"committed_sha\": \"1aa532f45e55380c6721b3b68074e415e0caff78\", \"version\": \"v0.0.0-20261013153614-1aa532f45e55\"}\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/schema\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/squad\t1.024s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/store\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/textextract\t0.002s\n[feature/versioned-dependencies d2fea7e] Enable canonical versioned Go module consumption\n 14 files changed, 36 insertions(+), 40 deletions(-)\nremote: \nremote: Create a new pull request for 'feature/versioned-dependencies': \nremote: https://git-panel.u1680832.nyat.app:30319/weichen/Agent-Squad/pulls/new/feature/versioned-dependencies \nremote: \nTo ssh://git-ssh.u1680832.nyat.app:31411/weichen/Agent-Squad.git\n * [new branch] HEAD -> feature/versioned-dependencies\n{\"repo\": \"Agent-Squad\", \"committed_sha\": \"d2fea7e17310d9e267c28a1e39328704e83df0b1\", \"version\": \"v0.0.0-20261013153617-d2fea7e17310\"}\n", + "output_sha256": "bbb3a987971b940bac42a70ea06c8ec835ac1dc8e7b4860ac59080e8c8410240", + "receipt_sha256": "acfd73935c219b7d26aa92d715efcf1a52b88b76fcaa4c859a4aa2ff8439ab94" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T15:48:16.124692+00:00", + "command": "python3 -m unittest discover -s tests -p test_component_governance.py -v", + "command_sha256": "3f069e0251ec89048b48766d9813ff136de15ade8316cae467a4e02202ebaa3b", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "f71058cb7e7c8c97d5d002a317501e87ef7e7b5e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5efbeebbdc09f8c2484613230a29c882c54652f0", + "status": " M .task/feature-dependency-workspace.md\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/npm.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_component_governance.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "7f1d5d20962cccac068a3be434c1dcfccf24eab7607dcea6c92724cdfb8dbcb7", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "de057a0003eb2bd93c95990613032345cc229556385d3c8571ac993ef2351231", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "00c12ad29f13d8640def2b3df9e06b11126a377230b6086329924f2f27914aa6", + "scripts/workspace/go.py": "15c178e0097202ae4421bc731451ef246dd2b765804e1f325e7f74525775541a", + "scripts/workspace/manifest.py": "2897ff4a760da798548d2d08dc965e8b72f93b78c946202de81d44dbea2e0181", + "scripts/workspace/npm.py": "614dc78f70ec87e983487c38fb7f9458bd43c5ba9ec31009cabbc4663c7266bf", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "ce75598ef0cb41882effb0265e60a3d78c223c172ff6bb884bcf046e1ccf9efd", + "tests/test_component_governance.py": "eb7b63294a31eb7f533fea8e5e250995d510bb9fc44682d7c102fbabbf359bd0", + "tests/test_dependency_ci.py": "18fc6e8eea386ccc4dee78f59e9e9443eacca1fe7626754f5cae8cab84daf56e", + "tests/test_workspace.py": "2688304a5b2471c1f984b232b3983d0bde4834057cf1bafae6281eb041e9c880" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after": { + "head": "f71058cb7e7c8c97d5d002a317501e87ef7e7b5e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5efbeebbdc09f8c2484613230a29c882c54652f0", + "status": " M .task/feature-dependency-workspace.md\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/npm.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_component_governance.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "7f1d5d20962cccac068a3be434c1dcfccf24eab7607dcea6c92724cdfb8dbcb7", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "de057a0003eb2bd93c95990613032345cc229556385d3c8571ac993ef2351231", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "00c12ad29f13d8640def2b3df9e06b11126a377230b6086329924f2f27914aa6", + "scripts/workspace/go.py": "15c178e0097202ae4421bc731451ef246dd2b765804e1f325e7f74525775541a", + "scripts/workspace/manifest.py": "2897ff4a760da798548d2d08dc965e8b72f93b78c946202de81d44dbea2e0181", + "scripts/workspace/npm.py": "614dc78f70ec87e983487c38fb7f9458bd43c5ba9ec31009cabbc4663c7266bf", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "ce75598ef0cb41882effb0265e60a3d78c223c172ff6bb884bcf046e1ccf9efd", + "tests/test_component_governance.py": "eb7b63294a31eb7f533fea8e5e250995d510bb9fc44682d7c102fbabbf359bd0", + "tests/test_dependency_ci.py": "18fc6e8eea386ccc4dee78f59e9e9443eacca1fe7626754f5cae8cab84daf56e", + "tests/test_workspace.py": "2688304a5b2471c1f984b232b3983d0bde4834057cf1bafae6281eb041e9c880" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after_error": null, + "exit_code": 1, + "output": "test_before_sync_rejects_component_git_lock (test_component_governance.ComponentGovernanceTests.test_before_sync_rejects_component_git_lock) ... FAIL\ntest_evidence_captures_ignored_component_revision_and_dirty_bytes (test_component_governance.ComponentGovernanceTests.test_evidence_captures_ignored_component_revision_and_dirty_bytes) ... FAIL\ntest_receipts_reject_component_path_escape (test_component_governance.ComponentGovernanceTests.test_receipts_reject_component_path_escape) ... FAIL\n\n======================================================================\nFAIL: test_before_sync_rejects_component_git_lock (test_component_governance.ComponentGovernanceTests.test_before_sync_rejects_component_git_lock)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_component_governance.py\", line 59, in test_before_sync_rejects_component_git_lock\n self.assertNotEqual(result.returncode,0,'a hidden component writer must block synchronization')\n ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 0 == 0 : a hidden component writer must block synchronization\n\n======================================================================\nFAIL: test_evidence_captures_ignored_component_revision_and_dirty_bytes (test_component_governance.ComponentGovernanceTests.test_evidence_captures_ignored_component_revision_and_dirty_bytes)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_component_governance.py\", line 49, in test_evidence_captures_ignored_component_revision_and_dirty_bytes\n self.assertIn('components',first,'receipts must identify ordinary ignored component checkouts')\n ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 'components' not found in {'head': '97b4d8550d1cb105f3415fb67992b0adb3b34402', 'branch': 'master', 'target_branch': 'main', 'target_head': None, 'status': '', 'tracked_diff_sha256': 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 'untracked': {}, 'submodules': ''} : receipts must identify ordinary ignored component checkouts\n\n======================================================================\nFAIL: test_receipts_reject_component_path_escape (test_component_governance.ComponentGovernanceTests.test_receipts_reject_component_path_escape)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_component_governance.py\", line 66, in test_receipts_reject_component_path_escape\n with self.assertRaises(Exception):\n ~~~~~~~~~~~~~~~~~^^^^^^^^^^^\nAssertionError: Exception not raised\n\n----------------------------------------------------------------------\nRan 3 tests in 0.168s\n\nFAILED (failures=3)\n", + "output_sha256": "aa5e6ba2f1e4e8499eb921d9db2dca46f170e18b9b7d7f22fc1947b8bf3eebc4", + "receipt_sha256": "212dbd926bde66cb984ab8f6a25dd06f3857a7f8c59d29bc65f5d655fe7b071b" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T15:48:14.596999+00:00", + "command": "python3 -m unittest tests.test_dependency_ci -v", + "command_sha256": "3480a10b30eb1d260477375a9aa8e3997c54e926582802dba99000f05bd22ece", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "f71058cb7e7c8c97d5d002a317501e87ef7e7b5e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5efbeebbdc09f8c2484613230a29c882c54652f0", + "status": " M .task/feature-dependency-workspace.md\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/npm.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "7f1d5d20962cccac068a3be434c1dcfccf24eab7607dcea6c92724cdfb8dbcb7", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "de057a0003eb2bd93c95990613032345cc229556385d3c8571ac993ef2351231", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "00c12ad29f13d8640def2b3df9e06b11126a377230b6086329924f2f27914aa6", + "scripts/workspace/go.py": "15c178e0097202ae4421bc731451ef246dd2b765804e1f325e7f74525775541a", + "scripts/workspace/manifest.py": "2897ff4a760da798548d2d08dc965e8b72f93b78c946202de81d44dbea2e0181", + "scripts/workspace/npm.py": "614dc78f70ec87e983487c38fb7f9458bd43c5ba9ec31009cabbc4663c7266bf", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "ce75598ef0cb41882effb0265e60a3d78c223c172ff6bb884bcf046e1ccf9efd", + "tests/test_dependency_ci.py": "18fc6e8eea386ccc4dee78f59e9e9443eacca1fe7626754f5cae8cab84daf56e", + "tests/test_workspace.py": "2688304a5b2471c1f984b232b3983d0bde4834057cf1bafae6281eb041e9c880" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after": { + "head": "f71058cb7e7c8c97d5d002a317501e87ef7e7b5e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5efbeebbdc09f8c2484613230a29c882c54652f0", + "status": " M .task/feature-dependency-workspace.md\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/npm.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_component_governance.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "469b15c3fb5e6135f894ce474f04965709534e846766b0fd52d7090456ab9f34", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "de057a0003eb2bd93c95990613032345cc229556385d3c8571ac993ef2351231", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "00c12ad29f13d8640def2b3df9e06b11126a377230b6086329924f2f27914aa6", + "scripts/workspace/go.py": "15c178e0097202ae4421bc731451ef246dd2b765804e1f325e7f74525775541a", + "scripts/workspace/manifest.py": "2897ff4a760da798548d2d08dc965e8b72f93b78c946202de81d44dbea2e0181", + "scripts/workspace/npm.py": "614dc78f70ec87e983487c38fb7f9458bd43c5ba9ec31009cabbc4663c7266bf", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "ce75598ef0cb41882effb0265e60a3d78c223c172ff6bb884bcf046e1ccf9efd", + "tests/test_component_governance.py": "eb7b63294a31eb7f533fea8e5e250995d510bb9fc44682d7c102fbabbf359bd0", + "tests/test_dependency_ci.py": "18fc6e8eea386ccc4dee78f59e9e9443eacca1fe7626754f5cae8cab84daf56e", + "tests/test_workspace.py": "2688304a5b2471c1f984b232b3983d0bde4834057cf1bafae6281eb041e9c880" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n" + }, + "after_error": null, + "exit_code": 1, + "output": "test_candidate_cannot_read_checkout_credentials (tests.test_ci_credentials.CheckoutTests.test_candidate_cannot_read_checkout_credentials) ... ok\ntest_candidate_submodule_update_commands_are_rejected (tests.test_ci_credentials.CheckoutTests.test_candidate_submodule_update_commands_are_rejected) ... ok\ntest_credential_destination_confined_to_injected_server (tests.test_ci_credentials.CheckoutTests.test_credential_destination_confined_to_injected_server) ... ok\ntest_external_or_unlisted_urls_are_rejected_before_component_fetch (tests.test_ci_credentials.CheckoutTests.test_external_or_unlisted_urls_are_rejected_before_component_fetch) ... ok\ntest_inherited_template_hook_does_not_execute_with_credentials (tests.test_ci_credentials.CheckoutTests.test_inherited_template_hook_does_not_execute_with_credentials) ... ok\ntest_nested_external_url_is_rejected_before_authenticated_fetch (tests.test_ci_credentials.CheckoutTests.test_nested_external_url_is_rejected_before_authenticated_fetch) ... ok\ntest_rdm_pin_fetch_is_three_shas_on_the_allowlist (tests.test_ci_credentials.CheckoutTests.test_rdm_pin_fetch_is_three_shas_on_the_allowlist) ... ok\ntest_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials (tests.test_ci_credentials.CheckoutTests.test_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials) ... ok\ntest_redirects_do_not_forward_credential_or_fetch_unlisted_target (tests.test_ci_credentials.CheckoutTests.test_redirects_do_not_forward_credential_or_fetch_unlisted_target) ... ok\ntest_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) ... FAIL\ntest_external_npm_git_source_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_external_npm_git_source_rejected_before_authenticated_request) ... FAIL\ntest_go_prefetch_uses_only_registered_private_repo_and_local_toolchain (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain) ... FAIL\ntest_npm_git_package_installs_committed_output_without_prepare (tests.test_dependency_ci.DependencyCITests.test_npm_git_package_installs_committed_output_without_prepare) ... FAIL\ntest_registered_application_lock_materializes_fixed_source (tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source) ... FAIL\ntest_unregistered_go_module_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_unregistered_go_module_rejected_before_authenticated_request) ... FAIL\ntest_unregistered_source_lock_is_rejected_before_component_fetch (tests.test_dependency_ci.DependencyCITests.test_unregistered_source_lock_is_rejected_before_component_fetch) ... FAIL\n\n======================================================================\nFAIL: test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 156, in test_component_checkout_removes_tokens_before_candidate_executes\n self.assertEqual(candidate.returncode, 0, candidate.stderr)\n ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 1 != 0 : Traceback (most recent call last):\n File \"/tmp/tmpiaxat_t6/checkout/probe.py\", line 5, in \n assert not any(secret in source for secret in ('synthetic-root-token-not-a-real-secret', 'synthetic-component-token-not-a-real-secret') for source in sources), 'credential readable by candidate'\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: credential readable by candidate\n\n\n======================================================================\nFAIL: test_external_npm_git_source_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_external_npm_git_source_rejected_before_authenticated_request)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 145, in test_external_npm_git_source_rejected_before_authenticated_request\n result = self.run_phase(\"Prefetch npm packages without lifecycle scripts\")\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 39, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name)],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 19, in phase\n raise AssertionError(f\"Workflow has no executable phase: {name}\")\nAssertionError: Workflow has no executable phase: Prefetch npm packages without lifecycle scripts\n\n======================================================================\nFAIL: test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 90, in test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain\n result = self.run_phase(\"Prefetch Go modules without executing candidate code\",\n extra={\"GOTOOLCHAIN\": \"auto\", \"GIT_TRACE\": \"1\"})\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 39, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name)],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 19, in phase\n raise AssertionError(f\"Workflow has no executable phase: {name}\")\nAssertionError: Workflow has no executable phase: Prefetch Go modules without executing candidate code\n\n======================================================================\nFAIL: test_npm_git_package_installs_committed_output_without_prepare (tests.test_dependency_ci.DependencyCITests.test_npm_git_package_installs_committed_output_without_prepare)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 129, in test_npm_git_package_installs_committed_output_without_prepare\n result = self.run_phase(\"Prefetch npm packages without lifecycle scripts\")\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 39, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name)],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 19, in phase\n raise AssertionError(f\"Workflow has no executable phase: {name}\")\nAssertionError: Workflow has no executable phase: Prefetch npm packages without lifecycle scripts\n\n======================================================================\nFAIL: test_registered_application_lock_materializes_fixed_source (tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 69, in test_registered_application_lock_materializes_fixed_source\n self.assertTrue((self.checkout / \".workspace/Agent-System-Backend/.git\").exists(),\n ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n \"versioned application source was not materialized\")\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: False is not true : versioned application source was not materialized\n\n======================================================================\nFAIL: test_unregistered_go_module_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_unregistered_go_module_rejected_before_authenticated_request)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 110, in test_unregistered_go_module_rejected_before_authenticated_request\n result = self.run_phase(\"Prefetch Go modules without executing candidate code\")\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 39, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name)],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 19, in phase\n raise AssertionError(f\"Workflow has no executable phase: {name}\")\nAssertionError: Workflow has no executable phase: Prefetch Go modules without executing candidate code\n\n======================================================================\nFAIL: test_unregistered_source_lock_is_rejected_before_component_fetch (tests.test_dependency_ci.DependencyCITests.test_unregistered_source_lock_is_rejected_before_component_fetch)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 81, in test_unregistered_source_lock_is_rejected_before_component_fetch\n self.assertNotEqual(result.returncode, 0, \"untrusted manifest was accepted\")\n ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 0 == 0 : untrusted manifest was accepted\n\n----------------------------------------------------------------------\nRan 16 tests in 9.243s\n\nFAILED (failures=7)\n", + "output_sha256": "c35b3efe21a6166e4ccacd213c390d63b2bdc64b70cedef59155bc460cbbb1f9", + "receipt_sha256": "a521e0cf28b8171eebaf0e963625dc6eb7a0a2df6e56a39965302ef490405b2c" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T15:49:26.495257+00:00", + "command": "python3 -m unittest discover -s tests -p test_component_governance.py -v && python3 -m unittest discover -s tests -p test_evidence.py -v", + "command_sha256": "dd7c4fd8ebe63bb2952317270e3e889ae4be9af1748f43adc24cbc8af3ce52da", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "f71058cb7e7c8c97d5d002a317501e87ef7e7b5e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5efbeebbdc09f8c2484613230a29c882c54652f0", + "status": " M .task/feature-dependency-workspace.md\n M scripts/check-evidence.py\n M scripts/check-worktree.py\n M scripts/evidence.py\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/npm.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_component_governance.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "3338f666dd85f1dc91b6d1adb68e25826a99e436c2db2791c7f824ae2b58d0fc", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "de057a0003eb2bd93c95990613032345cc229556385d3c8571ac993ef2351231", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "00c12ad29f13d8640def2b3df9e06b11126a377230b6086329924f2f27914aa6", + "scripts/workspace/go.py": "15c178e0097202ae4421bc731451ef246dd2b765804e1f325e7f74525775541a", + "scripts/workspace/manifest.py": "2897ff4a760da798548d2d08dc965e8b72f93b78c946202de81d44dbea2e0181", + "scripts/workspace/npm.py": "614dc78f70ec87e983487c38fb7f9458bd43c5ba9ec31009cabbc4663c7266bf", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "ce75598ef0cb41882effb0265e60a3d78c223c172ff6bb884bcf046e1ccf9efd", + "tests/test_component_governance.py": "eb7b63294a31eb7f533fea8e5e250995d510bb9fc44682d7c102fbabbf359bd0", + "tests/test_dependency_ci.py": "18fc6e8eea386ccc4dee78f59e9e9443eacca1fe7626754f5cae8cab84daf56e", + "tests/test_workspace.py": "2688304a5b2471c1f984b232b3983d0bde4834057cf1bafae6281eb041e9c880" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "d25af56f9f19850e6a96c1389895b5db568be3d90733ce8ef9bcf02704274c9b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "state": "missing" + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "state": "missing" + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7692e8cd56b1bd2d8337d28d19af56b622cd144c538cde29450deda04abf336c", + "state_sha256": null + } + }, + "after": { + "head": "f71058cb7e7c8c97d5d002a317501e87ef7e7b5e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5efbeebbdc09f8c2484613230a29c882c54652f0", + "status": " M .task/feature-dependency-workspace.md\n M scripts/check-evidence.py\n M scripts/check-worktree.py\n M scripts/evidence.py\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/npm.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_component_governance.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "3338f666dd85f1dc91b6d1adb68e25826a99e436c2db2791c7f824ae2b58d0fc", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "de057a0003eb2bd93c95990613032345cc229556385d3c8571ac993ef2351231", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "00c12ad29f13d8640def2b3df9e06b11126a377230b6086329924f2f27914aa6", + "scripts/workspace/go.py": "15c178e0097202ae4421bc731451ef246dd2b765804e1f325e7f74525775541a", + "scripts/workspace/manifest.py": "2897ff4a760da798548d2d08dc965e8b72f93b78c946202de81d44dbea2e0181", + "scripts/workspace/npm.py": "614dc78f70ec87e983487c38fb7f9458bd43c5ba9ec31009cabbc4663c7266bf", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "ce75598ef0cb41882effb0265e60a3d78c223c172ff6bb884bcf046e1ccf9efd", + "tests/test_component_governance.py": "eb7b63294a31eb7f533fea8e5e250995d510bb9fc44682d7c102fbabbf359bd0", + "tests/test_dependency_ci.py": "18fc6e8eea386ccc4dee78f59e9e9443eacca1fe7626754f5cae8cab84daf56e", + "tests/test_workspace.py": "2688304a5b2471c1f984b232b3983d0bde4834057cf1bafae6281eb041e9c880" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "d25af56f9f19850e6a96c1389895b5db568be3d90733ce8ef9bcf02704274c9b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "state": "missing" + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "state": "missing" + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7692e8cd56b1bd2d8337d28d19af56b622cd144c538cde29450deda04abf336c", + "state_sha256": null + } + }, + "after_error": null, + "exit_code": 0, + "output": "test_before_sync_rejects_component_git_lock (test_component_governance.ComponentGovernanceTests.test_before_sync_rejects_component_git_lock) ... ok\ntest_evidence_captures_ignored_component_revision_and_dirty_bytes (test_component_governance.ComponentGovernanceTests.test_evidence_captures_ignored_component_revision_and_dirty_bytes) ... ok\ntest_receipts_reject_component_path_escape (test_component_governance.ComponentGovernanceTests.test_receipts_reject_component_path_escape) ... ok\n\n----------------------------------------------------------------------\nRan 3 tests in 0.274s\n\nOK\ntest_after_snapshot_failure_keeps_command_exit_and_output (test_evidence.EvidenceTests.test_after_snapshot_failure_keeps_command_exit_and_output) ... ok\ntest_all_persisted_and_displayed_text_is_sanitized (test_evidence.EvidenceTests.test_all_persisted_and_displayed_text_is_sanitized) ... ok\ntest_authorization_forms_are_redacted_in_capture_console_and_import (test_evidence.EvidenceTests.test_authorization_forms_are_redacted_in_capture_console_and_import) ... ok\ntest_authorization_forms_are_redacted_on_direct_card_capture (test_evidence.EvidenceTests.test_authorization_forms_are_redacted_on_direct_card_capture) ... ok\ntest_before_after_heads_do_not_relabel_changed_command (test_evidence.EvidenceTests.test_before_after_heads_do_not_relabel_changed_command) ... ok\ntest_capture_does_not_overwrite_an_existing_receipt (test_evidence.EvidenceTests.test_capture_does_not_overwrite_an_existing_receipt) ... ok\ntest_capture_without_card_and_import_without_rerun (test_evidence.EvidenceTests.test_capture_without_card_and_import_without_rerun) ... ok\ntest_child_failure_code_is_preserved (test_evidence.EvidenceTests.test_child_failure_code_is_preserved) ... ok\ntest_command_line_token_arguments_are_redacted (test_evidence.EvidenceTests.test_command_line_token_arguments_are_redacted) ... ok\ntest_dirty_and_untracked_contents_have_object_digests (test_evidence.EvidenceTests.test_dirty_and_untracked_contents_have_object_digests) ... ok\ntest_failed_child_exit_survives_receipt_write_failure (test_evidence.EvidenceTests.test_failed_child_exit_survives_receipt_write_failure) ... ok\ntest_full_output_is_preserved_not_only_tail (test_evidence.EvidenceTests.test_full_output_is_preserved_not_only_tail) ... ok\ntest_import_missing_card_fails_without_losing_receipt (test_evidence.EvidenceTests.test_import_missing_card_fails_without_losing_receipt) ... ok\ntest_import_rejects_unredacted_authorization_with_valid_checksums (test_evidence.EvidenceTests.test_import_rejects_unredacted_authorization_with_valid_checksums) ... ok\ntest_import_retry_is_idempotent (test_evidence.EvidenceTests.test_import_retry_is_idempotent) ... ok\ntest_invalid_field_types_and_forged_source_are_rejected (test_evidence.EvidenceTests.test_invalid_field_types_and_forged_source_are_rejected) ... ok\ntest_known_secret_environment_value_is_redacted_without_label (test_evidence.EvidenceTests.test_known_secret_environment_value_is_redacted_without_label) ... ok\ntest_linked_worktree_import_preserves_source_identity (test_evidence.EvidenceTests.test_linked_worktree_import_preserves_source_identity) ... ok\ntest_missing_card_does_not_execute (test_evidence.EvidenceTests.test_missing_card_does_not_execute) ... ok\ntest_missing_required_snapshot_fields_are_rejected (test_evidence.EvidenceTests.test_missing_required_snapshot_fields_are_rejected) ... ok\ntest_nested_cwd_records_untracked_files_from_repository_root (test_evidence.EvidenceTests.test_nested_cwd_records_untracked_files_from_repository_root) ... ok\ntest_output_digest_checked_even_if_receipt_digest_recomputed (test_evidence.EvidenceTests.test_output_digest_checked_even_if_receipt_digest_recomputed) ... ok\ntest_pipeline_failure_is_recorded_and_returned (test_evidence.EvidenceTests.test_pipeline_failure_is_recorded_and_returned) ... ok\ntest_quoted_credentials_with_spaces_are_fully_redacted (test_evidence.EvidenceTests.test_quoted_credentials_with_spaces_are_fully_redacted) ... ok\ntest_receipt_write_failure_cannot_claim_success (test_evidence.EvidenceTests.test_receipt_write_failure_cannot_claim_success) ... ok\ntest_recorder_environment_does_not_leak_into_nested_commands (test_evidence.EvidenceTests.test_recorder_environment_does_not_leak_into_nested_commands) ... ok\ntest_source_cannot_be_promoted_by_environment (test_evidence.EvidenceTests.test_source_cannot_be_promoted_by_environment) ... ok\ntest_tamper_is_rejected_before_card_append (test_evidence.EvidenceTests.test_tamper_is_rejected_before_card_append) ... ok\ntest_unrelated_repo_cannot_import (test_evidence.EvidenceTests.test_unrelated_repo_cannot_import) ... ok\ntest_validate_precheck_checks_result_and_current_base (test_evidence.EvidenceTests.test_validate_precheck_checks_result_and_current_base) ... ok\ntest_validate_precheck_rejects_successful_arbitrary_command (test_evidence.EvidenceTests.test_validate_precheck_rejects_successful_arbitrary_command) ... ok\n\n----------------------------------------------------------------------\nRan 31 tests in 5.406s\n\nOK\n", + "output_sha256": "3bb27316dcec6338e553da6a95416db25b5dc153c7f6b0229bbbad142d7b3c80", + "receipt_sha256": "10dc69e049228aa41705071a714a2ffc7fc551bff5bbbacea40195cb661a4fd7" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T15:54:35.454766+00:00", + "command": "python3 -m unittest discover -s tests -p test_transport.py -v", + "command_sha256": "117a7baccc23a6e0d68c02dfcd72b8b7648a0ca4f0b31df3b6026487a2c0dc38", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "f71058cb7e7c8c97d5d002a317501e87ef7e7b5e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5efbeebbdc09f8c2484613230a29c882c54652f0", + "status": " M .gitea/workflows/ci.yaml\n M .task/feature-dependency-workspace.md\n M scripts/check-evidence.py\n M scripts/check-worktree.py\n M scripts/evidence.py\n M tests/test_transport.py\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/npm.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_component_governance.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "5fe4c9fbd5787e42ba8094ba1726af596589bc9eb907d5be832c3841775dd45f", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "aa34950bf8dce02d7266bae4d214bbd00298a47d12b6926a8768b229cadd8578", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "00c12ad29f13d8640def2b3df9e06b11126a377230b6086329924f2f27914aa6", + "scripts/workspace/go.py": "d48cfdca50324c70215ee4c477a6d11b802ccf798e78dd446880c8de877b90b8", + "scripts/workspace/manifest.py": "2897ff4a760da798548d2d08dc965e8b72f93b78c946202de81d44dbea2e0181", + "scripts/workspace/npm.py": "614dc78f70ec87e983487c38fb7f9458bd43c5ba9ec31009cabbc4663c7266bf", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "b94045163c3631bd5264f6364a87130cee9f66ce42d782f52f59f34916cce229", + "tests/test_component_governance.py": "eb7b63294a31eb7f533fea8e5e250995d510bb9fc44682d7c102fbabbf359bd0", + "tests/test_dependency_ci.py": "18fc6e8eea386ccc4dee78f59e9e9443eacca1fe7626754f5cae8cab84daf56e", + "tests/test_workspace.py": "5294bfd43617d11b6aed091b0eb6d4e6370876418bc00169e68394f4e0b8698d" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "d25af56f9f19850e6a96c1389895b5db568be3d90733ce8ef9bcf02704274c9b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "state": "missing" + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "state": "missing" + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7692e8cd56b1bd2d8337d28d19af56b622cd144c538cde29450deda04abf336c", + "state_sha256": null + } + }, + "after": { + "head": "f71058cb7e7c8c97d5d002a317501e87ef7e7b5e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5efbeebbdc09f8c2484613230a29c882c54652f0", + "status": " M .gitea/workflows/ci.yaml\n M .task/feature-dependency-workspace.md\n M scripts/check-evidence.py\n M scripts/check-worktree.py\n M scripts/evidence.py\n M tests/test_transport.py\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/npm.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_component_governance.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "5fe4c9fbd5787e42ba8094ba1726af596589bc9eb907d5be832c3841775dd45f", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "aa34950bf8dce02d7266bae4d214bbd00298a47d12b6926a8768b229cadd8578", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "00c12ad29f13d8640def2b3df9e06b11126a377230b6086329924f2f27914aa6", + "scripts/workspace/go.py": "d48cfdca50324c70215ee4c477a6d11b802ccf798e78dd446880c8de877b90b8", + "scripts/workspace/manifest.py": "2897ff4a760da798548d2d08dc965e8b72f93b78c946202de81d44dbea2e0181", + "scripts/workspace/npm.py": "614dc78f70ec87e983487c38fb7f9458bd43c5ba9ec31009cabbc4663c7266bf", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "b94045163c3631bd5264f6364a87130cee9f66ce42d782f52f59f34916cce229", + "tests/test_component_governance.py": "eb7b63294a31eb7f533fea8e5e250995d510bb9fc44682d7c102fbabbf359bd0", + "tests/test_dependency_ci.py": "18fc6e8eea386ccc4dee78f59e9e9443eacca1fe7626754f5cae8cab84daf56e", + "tests/test_workspace.py": "5294bfd43617d11b6aed091b0eb6d4e6370876418bc00169e68394f4e0b8698d" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "d25af56f9f19850e6a96c1389895b5db568be3d90733ce8ef9bcf02704274c9b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "state": "missing" + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "state": "missing" + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7692e8cd56b1bd2d8337d28d19af56b622cd144c538cde29450deda04abf336c", + "state_sha256": null + } + }, + "after_error": null, + "exit_code": 1, + "output": "test_credentials_in_transport_url_are_rejected (test_transport.TransportTests.test_credentials_in_transport_url_are_rejected) ... ok\ntest_remote_revision_download_without_global_git_change (test_transport.TransportTests.test_remote_revision_download_without_global_git_change) ... ok\ntest_verified_local_mirror_mapping_survives_without_authentication (test_transport.TransportTests.test_verified_local_mirror_mapping_survives_without_authentication) ... FAIL\n\n======================================================================\nFAIL: test_verified_local_mirror_mapping_survives_without_authentication (test_transport.TransportTests.test_verified_local_mirror_mapping_survives_without_authentication)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_transport.py\", line 77, in test_verified_local_mirror_mapping_survives_without_authentication\n self.assertIn((f'url.{target.as_uri()}.insteadOf','https://example.test/provider'),pairs)\n ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: ('url.file:///tmp/tmp0w8_5duj/mirrors/Provider.git.insteadOf', 'https://example.test/provider') not found in [('url.ssh://git@example.test:31411/.insteadOf', 'https://example.test/')]\n\n----------------------------------------------------------------------\nRan 3 tests in 0.169s\n\nFAILED (failures=1)\n", + "output_sha256": "2ac34bba88accf7f6ba7b591b705914c92b6a321b60f3e1057f1f8eec607c61b", + "receipt_sha256": "49c46dacbc237fdacc432d37d52fbeedddf0470b67cf0942c7cdbf3096e05e99" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T15:55:06.682358+00:00", + "command": "python3 -m unittest discover -s tests -p test_transport.py -v", + "command_sha256": "117a7baccc23a6e0d68c02dfcd72b8b7648a0ca4f0b31df3b6026487a2c0dc38", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "f71058cb7e7c8c97d5d002a317501e87ef7e7b5e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5efbeebbdc09f8c2484613230a29c882c54652f0", + "status": " M .gitea/workflows/ci.yaml\n M .task/feature-dependency-workspace.md\n M scripts/check-evidence.py\n M scripts/check-worktree.py\n M scripts/evidence.py\n M scripts/workspace/transport.py\n M tests/test_transport.py\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/npm.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_component_governance.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "854f9c6b7c182e09b3542c0a4e3936b70493bc191f17ec384df3b387da4b3824", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "aa34950bf8dce02d7266bae4d214bbd00298a47d12b6926a8768b229cadd8578", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "00c12ad29f13d8640def2b3df9e06b11126a377230b6086329924f2f27914aa6", + "scripts/workspace/go.py": "d48cfdca50324c70215ee4c477a6d11b802ccf798e78dd446880c8de877b90b8", + "scripts/workspace/manifest.py": "2897ff4a760da798548d2d08dc965e8b72f93b78c946202de81d44dbea2e0181", + "scripts/workspace/npm.py": "614dc78f70ec87e983487c38fb7f9458bd43c5ba9ec31009cabbc4663c7266bf", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "b94045163c3631bd5264f6364a87130cee9f66ce42d782f52f59f34916cce229", + "tests/test_component_governance.py": "eb7b63294a31eb7f533fea8e5e250995d510bb9fc44682d7c102fbabbf359bd0", + "tests/test_dependency_ci.py": "8e1fe3eb6b10ba80a6b230b5835a00679d12418494b6e0e0181855b0254ae394", + "tests/test_workspace.py": "5294bfd43617d11b6aed091b0eb6d4e6370876418bc00169e68394f4e0b8698d" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "d25af56f9f19850e6a96c1389895b5db568be3d90733ce8ef9bcf02704274c9b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "state": "missing" + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "state": "missing" + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7692e8cd56b1bd2d8337d28d19af56b622cd144c538cde29450deda04abf336c", + "state_sha256": null + } + }, + "after": { + "head": "f71058cb7e7c8c97d5d002a317501e87ef7e7b5e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5efbeebbdc09f8c2484613230a29c882c54652f0", + "status": " M .gitea/workflows/ci.yaml\n M .task/feature-dependency-workspace.md\n M scripts/check-evidence.py\n M scripts/check-worktree.py\n M scripts/evidence.py\n M scripts/workspace/transport.py\n M tests/test_transport.py\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/npm.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_component_governance.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "854f9c6b7c182e09b3542c0a4e3936b70493bc191f17ec384df3b387da4b3824", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "aa34950bf8dce02d7266bae4d214bbd00298a47d12b6926a8768b229cadd8578", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "00c12ad29f13d8640def2b3df9e06b11126a377230b6086329924f2f27914aa6", + "scripts/workspace/go.py": "d48cfdca50324c70215ee4c477a6d11b802ccf798e78dd446880c8de877b90b8", + "scripts/workspace/manifest.py": "2897ff4a760da798548d2d08dc965e8b72f93b78c946202de81d44dbea2e0181", + "scripts/workspace/npm.py": "614dc78f70ec87e983487c38fb7f9458bd43c5ba9ec31009cabbc4663c7266bf", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "b94045163c3631bd5264f6364a87130cee9f66ce42d782f52f59f34916cce229", + "tests/test_component_governance.py": "eb7b63294a31eb7f533fea8e5e250995d510bb9fc44682d7c102fbabbf359bd0", + "tests/test_dependency_ci.py": "8e1fe3eb6b10ba80a6b230b5835a00679d12418494b6e0e0181855b0254ae394", + "tests/test_workspace.py": "5294bfd43617d11b6aed091b0eb6d4e6370876418bc00169e68394f4e0b8698d" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "d25af56f9f19850e6a96c1389895b5db568be3d90733ce8ef9bcf02704274c9b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "state": "missing" + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "state": "missing" + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7692e8cd56b1bd2d8337d28d19af56b622cd144c538cde29450deda04abf336c", + "state_sha256": null + } + }, + "after_error": null, + "exit_code": 0, + "output": "test_credentials_in_transport_url_are_rejected (test_transport.TransportTests.test_credentials_in_transport_url_are_rejected) ... ok\ntest_remote_revision_download_without_global_git_change (test_transport.TransportTests.test_remote_revision_download_without_global_git_change) ... ok\ntest_verified_local_mirror_mapping_survives_without_authentication (test_transport.TransportTests.test_verified_local_mirror_mapping_survives_without_authentication) ... ok\n\n----------------------------------------------------------------------\nRan 3 tests in 0.176s\n\nOK\n", + "output_sha256": "78e82d57b422392e5bc6a9704ea45cb46e1dff1af991b2c998385dde77ea50e9", + "receipt_sha256": "c2f5869c7e571c5a7e88cbb9156a307a9e204799327773abcd389d9a5949b779" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T15:56:26.863063+00:00", + "command": "python3 -m unittest discover -s tests -p test_workspace.py -v && python3 -m unittest discover -s tests -p test_component_governance.py -v", + "command_sha256": "d6426eb14f50ddff30c8dc86e077756e876df1822ecd50a954c482018840fc35", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "f71058cb7e7c8c97d5d002a317501e87ef7e7b5e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5efbeebbdc09f8c2484613230a29c882c54652f0", + "status": " M .gitea/workflows/ci.yaml\n M .task/feature-dependency-workspace.md\n M components.json\n M components.lock.json\n M scripts/check-evidence.py\n M scripts/check-worktree.py\n M scripts/evidence.py\n M scripts/workspace/transport.py\n M tests/test_transport.py\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/npm.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_component_governance.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "aaaf9af6a478794f190e6b79b806b948215516eef44d0f5f4293fbca82ff2327", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "aa34950bf8dce02d7266bae4d214bbd00298a47d12b6926a8768b229cadd8578", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "00c12ad29f13d8640def2b3df9e06b11126a377230b6086329924f2f27914aa6", + "scripts/workspace/go.py": "d48cfdca50324c70215ee4c477a6d11b802ccf798e78dd446880c8de877b90b8", + "scripts/workspace/manifest.py": "2897ff4a760da798548d2d08dc965e8b72f93b78c946202de81d44dbea2e0181", + "scripts/workspace/npm.py": "614dc78f70ec87e983487c38fb7f9458bd43c5ba9ec31009cabbc4663c7266bf", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "b94045163c3631bd5264f6364a87130cee9f66ce42d782f52f59f34916cce229", + "tests/test_component_governance.py": "eb7b63294a31eb7f533fea8e5e250995d510bb9fc44682d7c102fbabbf359bd0", + "tests/test_dependency_ci.py": "8e1fe3eb6b10ba80a6b230b5835a00679d12418494b6e0e0181855b0254ae394", + "tests/test_workspace.py": "5294bfd43617d11b6aed091b0eb6d4e6370876418bc00169e68394f4e0b8698d" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "state": "missing" + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "state": "missing" + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": null + } + }, + "after": { + "head": "f71058cb7e7c8c97d5d002a317501e87ef7e7b5e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "5efbeebbdc09f8c2484613230a29c882c54652f0", + "status": " M .gitea/workflows/ci.yaml\n M .task/feature-dependency-workspace.md\n M components.json\n M components.lock.json\n M scripts/check-evidence.py\n M scripts/check-worktree.py\n M scripts/evidence.py\n M scripts/workspace/transport.py\n M tests/test_transport.py\n?? scripts/workspace.py\n?? scripts/workspace/__init__.py\n?? scripts/workspace/cli.py\n?? scripts/workspace/common.py\n?? scripts/workspace/git.py\n?? scripts/workspace/go.py\n?? scripts/workspace/manifest.py\n?? scripts/workspace/npm.py\n?? scripts/workspace/state.py\n?? scripts/workspace/transition.py\n?? tests/test_component_governance.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace.py\n", + "tracked_diff_sha256": "aaaf9af6a478794f190e6b79b806b948215516eef44d0f5f4293fbca82ff2327", + "untracked": { + "scripts/workspace.py": "fe7c424ff34d621453b7ff7afa47b57f145a05d3bdfd103f927c74fe91beee30", + "scripts/workspace/__init__.py": "5b62131864535e2e398d78d941aeff31fc0983b9b722390aecc7abdb1d7a0096", + "scripts/workspace/cli.py": "aa34950bf8dce02d7266bae4d214bbd00298a47d12b6926a8768b229cadd8578", + "scripts/workspace/common.py": "ce0d96596f25ee85fb0da49cabb7a119bb9d9b782a6ff0e1b5bc2358fb81a851", + "scripts/workspace/git.py": "00c12ad29f13d8640def2b3df9e06b11126a377230b6086329924f2f27914aa6", + "scripts/workspace/go.py": "d48cfdca50324c70215ee4c477a6d11b802ccf798e78dd446880c8de877b90b8", + "scripts/workspace/manifest.py": "2897ff4a760da798548d2d08dc965e8b72f93b78c946202de81d44dbea2e0181", + "scripts/workspace/npm.py": "614dc78f70ec87e983487c38fb7f9458bd43c5ba9ec31009cabbc4663c7266bf", + "scripts/workspace/state.py": "bed23cb6ca7ee4db0e40e42ea027bc234623f3f8255aa89c63a98e29cf9fb605", + "scripts/workspace/transition.py": "b94045163c3631bd5264f6364a87130cee9f66ce42d782f52f59f34916cce229", + "tests/test_component_governance.py": "eb7b63294a31eb7f533fea8e5e250995d510bb9fc44682d7c102fbabbf359bd0", + "tests/test_dependency_ci.py": "8e1fe3eb6b10ba80a6b230b5835a00679d12418494b6e0e0181855b0254ae394", + "tests/test_workspace.py": "5294bfd43617d11b6aed091b0eb6d4e6370876418bc00169e68394f4e0b8698d" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "state": "missing" + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "state": "missing" + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": null + } + }, + "after_error": null, + "exit_code": 0, + "output": "test_actual_go_version_baseline_overlay_and_unlink_restore_version_consumption (test_workspace.WorkspaceTests.test_actual_go_version_baseline_overlay_and_unlink_restore_version_consumption) ... ok\ntest_conflicting_duplicate_nested_component_stops_before_cloning (test_workspace.WorkspaceTests.test_conflicting_duplicate_nested_component_stops_before_cloning) ... ok\ntest_edit_registers_branch_and_prepare_preserves_work (test_workspace.WorkspaceTests.test_edit_registers_branch_and_prepare_preserves_work) ... ok\ntest_equivalent_recursive_nested_sources_share_an_independent_component (test_workspace.WorkspaceTests.test_equivalent_recursive_nested_sources_share_an_independent_component) ... ok\ntest_existing_fixed_checkout_is_not_switched_after_lock_change (test_workspace.WorkspaceTests.test_existing_fixed_checkout_is_not_switched_after_lock_change) ... ok\ntest_fresh_library_edit_resolves_fixed_consumer_and_preserves_consumer_manifest (test_workspace.WorkspaceTests.test_fresh_library_edit_resolves_fixed_consumer_and_preserves_consumer_manifest) ... ok\ntest_git_operation_is_reported_and_not_removed (test_workspace.WorkspaceTests.test_git_operation_is_reported_and_not_removed) ... ok\ntest_ignored_unique_files_and_shared_worktrees_block_branch_changes (test_workspace.WorkspaceTests.test_ignored_unique_files_and_shared_worktrees_block_branch_changes) ... ok\ntest_library_baseline_resolves_transitive_selected_module (test_workspace.WorkspaceTests.test_library_baseline_resolves_transitive_selected_module) ... ok\ntest_library_legacy_baseline_uses_gitlink_not_current_head (test_workspace.WorkspaceTests.test_library_legacy_baseline_uses_gitlink_not_current_head) ... ok\ntest_missing_fixed_source_never_falls_back_to_remote_main (test_workspace.WorkspaceTests.test_missing_fixed_source_never_falls_back_to_remote_main) ... ok\ntest_npm_library_edit_uses_consumer_lock_git_sha_not_remote_main (test_workspace.WorkspaceTests.test_npm_library_edit_uses_consumer_lock_git_sha_not_remote_main) ... ok\ntest_npm_library_rejects_wrong_lock_origin_and_competing_manual_lock (test_workspace.WorkspaceTests.test_npm_library_rejects_wrong_lock_origin_and_competing_manual_lock) ... ok\ntest_partial_initialization_is_retained_and_retry_is_safe (test_workspace.WorkspaceTests.test_partial_initialization_is_retained_and_retry_is_safe) ... ok\ntest_prepare_pins_fixed_commit_and_reuses_without_advancing (test_workspace.WorkspaceTests.test_prepare_pins_fixed_commit_and_reuses_without_advancing) ... ok\ntest_private_git_metadata_symlink_is_not_adopted (test_workspace.WorkspaceTests.test_private_git_metadata_symlink_is_not_adopted) ... ok\ntest_rejects_mismatched_origin_dirty_and_git_lock_without_changes (test_workspace.WorkspaceTests.test_rejects_mismatched_origin_dirty_and_git_lock_without_changes) ... ok\ntest_rejects_paths_and_symlink_escape (test_workspace.WorkspaceTests.test_rejects_paths_and_symlink_escape) ... ok\ntest_rejects_unknown_component_and_bad_branch_without_source_creation (test_workspace.WorkspaceTests.test_rejects_unknown_component_and_bad_branch_without_source_creation) ... ok\ntest_status_does_not_expose_credentials_from_an_unmatched_actual_origin (test_workspace.WorkspaceTests.test_status_does_not_expose_credentials_from_an_unmatched_actual_origin) ... ok\ntest_status_reports_dirty_and_verify_rejects_it (test_workspace.WorkspaceTests.test_status_reports_dirty_and_verify_rejects_it) ... ok\ntest_transition_known_nested_repositories_preserves_external_worktree_and_runs_go (test_workspace.WorkspaceTests.test_transition_known_nested_repositories_preserves_external_worktree_and_runs_go) ... ok\ntest_transition_preserves_committed_symlink_deletion_and_file_type_change (test_workspace.WorkspaceTests.test_transition_preserves_committed_symlink_deletion_and_file_type_change) ... ok\ntest_transition_preserves_staged_blob_internal_symlink_and_reflog_commit (test_workspace.WorkspaceTests.test_transition_preserves_staged_blob_internal_symlink_and_reflog_commit) ... ok\ntest_transition_refuses_initialized_nested_repository (test_workspace.WorkspaceTests.test_transition_refuses_initialized_nested_repository) ... ok\ntest_transition_rejects_external_symlinks_preserving_both_locations (test_workspace.WorkspaceTests.test_transition_rejects_external_symlinks_preserving_both_locations) ... ok\ntest_transition_report_is_readonly_apply_preserves_unique_commits_refs_and_files (test_workspace.WorkspaceTests.test_transition_report_is_readonly_apply_preserves_unique_commits_refs_and_files) ... ok\ntest_unlink_refuses_manual_overlay_changes_without_changing_registration (test_workspace.WorkspaceTests.test_unlink_refuses_manual_overlay_changes_without_changing_registration) ... ok\ntest_workspace_operation_lock_and_user_go_work_are_preserved (test_workspace.WorkspaceTests.test_workspace_operation_lock_and_user_go_work_are_preserved) ... ok\n\n----------------------------------------------------------------------\nRan 29 tests in 6.310s\n\nOK\ntest_before_sync_rejects_component_git_lock (test_component_governance.ComponentGovernanceTests.test_before_sync_rejects_component_git_lock) ... ok\ntest_evidence_captures_ignored_component_revision_and_dirty_bytes (test_component_governance.ComponentGovernanceTests.test_evidence_captures_ignored_component_revision_and_dirty_bytes) ... ok\ntest_receipts_reject_component_path_escape (test_component_governance.ComponentGovernanceTests.test_receipts_reject_component_path_escape) ... ok\n\n----------------------------------------------------------------------\nRan 3 tests in 0.170s\n\nOK\n", + "output_sha256": "841d84077f3e2747eb7d104d7fc98ac88f31aa738f0719573d3c7720ce2d03f7", + "receipt_sha256": "f013e83d58733e5a62144940ce51659f8413b22691bcf567158bdc5cf7af26b8" +} +``` diff --git a/components.json b/components.json index c2973a6e..7090f737 100644 --- a/components.json +++ b/components.json @@ -53,7 +53,8 @@ "legacy_path": "modules/ui", "role": "npm-library", "modules": [], - "target": "main" + "target": "main", + "package_name": "@agent-system/ui" }, { "id": "Agent-System-Frontend", @@ -140,6 +141,11 @@ "path": "git-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/cmd/agent-squad", "legacy": "agent-squad/cmd/agent-squad", "directory": "cmd/agent-squad" + }, + { + "path": "git-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/adapters/a2a", + "legacy": "agent-squad/adapters/a2a", + "directory": "adapters/a2a" } ], "target": "main" diff --git a/components.lock.json b/components.lock.json index e67a9c21..f83ab838 100644 --- a/components.lock.json +++ b/components.lock.json @@ -1,14 +1,11 @@ { "schema": 1, "components": { - "Agent-System-UI": { - "commit": "2c4322ef56df64ad72f65907d25b048a74bb5ffc" - }, "Agent-System-Frontend": { - "commit": "eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b" + "commit": "ad53e90a8542143104ddc7f759c8f8e7b7001924" }, "Agent-System-Backend": { - "commit": "5d5fc9891c0eb8994545ccb8b740535d9b99fb0e" + "commit": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c" }, "Development-Guidelines": { "commit": "2f5b19872be2a4597838a4131ad75d1be089ee5e" diff --git a/scripts/check-evidence.py b/scripts/check-evidence.py index df609348..8891c208 100644 --- a/scripts/check-evidence.py +++ b/scripts/check-evidence.py @@ -43,6 +43,12 @@ def card_path(path): def check_snapshot(snapshot): evidence.validate_snapshot(snapshot) stale = check_head(snapshot["head"]) + current = evidence.component_snapshot(Path(subprocess.check_output(['git', 'rev-parse', '--show-toplevel'], text=True).strip())) + if current is not None and snapshot.get('components') != current: + raise ValueError('recorded ordinary component/source-lock objects differ from the current objects') + for item in snapshot.get('components', {}).get('components', {}).values(): + if item.get('status') or item.get('untracked'): + raise ValueError('recorded ordinary component includes uncommitted changes') for line in snapshot["status"].splitlines(): if len(line) < 4 or line[2] != " ": raise ValueError("invalid recorded worktree status") diff --git a/scripts/check-worktree.py b/scripts/check-worktree.py index a9503cc4..e0c8ff8b 100644 --- a/scripts/check-worktree.py +++ b/scripts/check-worktree.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 """Fail closed before task synchronization, verification, or worktree disposal.""" import os +import json from pathlib import Path import subprocess import sys @@ -103,6 +104,34 @@ def materialize(repo): materialize(child) +def ordinary_components(repo, mode, removal_roots=()): + manifest = repo / 'components.json' + if not manifest.exists(): + return + document = json.loads(manifest.read_text()) + if document.get('schema') != 1 or not isinstance(document.get('components'), list): + raise RuntimeError('invalid component manifest') + for item in document['components']: + name = item.get('id') + relative = item.get('path') + if not isinstance(name, str) or relative != '.workspace/' + name: + raise RuntimeError('invalid component identity/path') + child = repo / relative + if child.resolve() != child.absolute() or repo not in child.resolve().parents: + raise RuntimeError('component path escapes its owner') + if not child.exists(): + continue + if not (child / '.git').exists() or Path(text(child, 'rev-parse', '--show-toplevel')).resolve() != child: + raise RuntimeError('component has borrowed or missing Git identity') + check_operations(child) + if mode == 'finish': + check_clean(child, ignored=True) + check_component_worktrees(child, removal_roots) + head = text(child, 'rev-parse', 'HEAD') + if local_work_outside(child, head): + raise RuntimeError('component has unpreserved local refs; preserve its source before removal') + + def local_work_outside(child, expected): """2026-10-05 修复:pinned-history 检查此前用 --all --reflog,把 refs/remotes 也 计入——pin 在 feature 顶端的子仓因 origin/main 不在 pin 历史内而永远无法 finish @@ -165,6 +194,7 @@ def main(): materialize(repo) else: check_children(repo, mode, removal_roots) + ordinary_components(repo, mode, removal_roots) print(f"[worktree] {mode}: recursive component checks passed") diff --git a/scripts/evidence.py b/scripts/evidence.py index 644ec39d..997ae01d 100644 --- a/scripts/evidence.py +++ b/scripts/evidence.py @@ -82,6 +82,52 @@ def common_dir(): return str(Path(git_text("rev-parse", "--git-common-dir")).resolve()) +def component_snapshot(root): + """Record ignored ordinary checkouts without resolving or changing versions.""" + manifest = root / 'components.json' + if not manifest.exists(): + return None + try: + config = json.loads(manifest.read_text()) + if config.get('schema') != 1 or not isinstance(config.get('components'), list): + raise EvidenceError('Invalid component manifest') + result = {'manifest_sha256': digest(manifest.read_bytes()), 'components': {}} + lock = root / 'components.lock.json' + result['lock_sha256'] = digest(lock.read_bytes()) if lock.exists() else None + state = root / '.workspace/state.json' + result['state_sha256'] = digest(state.read_bytes()) if state.exists() else None + for item in config['components']: + name, relative = item.get('id'), item.get('path') + if not isinstance(name, str) or not isinstance(relative, str) or relative != '.workspace/' + name: + raise EvidenceError('Invalid component identity/path') + path = root / relative + if path.resolve() != path.absolute() or root.resolve() not in path.resolve().parents: + raise EvidenceError('Component path escapes its owner') + if not path.exists(): + result['components'][name] = {'state': 'missing'} + continue + if not (path / '.git').exists(): + raise EvidenceError('Component source has no Git identity') + if Path(git_text('-C', str(path), 'rev-parse', '--show-toplevel')).resolve() != path.resolve(): + raise EvidenceError('Component Git identity is borrowed') + untracked = {} + for raw in git('-C', str(path), 'ls-files', '--others', '--exclude-standard', '-z').split(b'\0'): + if raw: + filename = os.fsdecode(raw) + entry = path / filename + untracked[filename] = digest(os.fsencode(os.readlink(entry))) if entry.is_symlink() else (digest(entry.read_bytes()) if entry.is_file() else None) + result['components'][name] = { + 'head': git_text('-C', str(path), 'rev-parse', 'HEAD'), + 'branch': git_text('-C', str(path), 'branch', '--show-current'), + 'status': git('-C', str(path), 'status', '--porcelain', '--untracked-files=all').decode('utf-8', 'replace'), + 'tracked_diff_sha256': digest(git('-C', str(path), 'diff', '--binary', 'HEAD', '--')), + 'untracked': untracked, + } + return result + except (OSError, ValueError, TypeError, AttributeError) as error: + raise EvidenceError('Component object could not be recorded') from error + + def snapshot(): untracked = {} root = Path(git_text("rev-parse", "--show-toplevel")) @@ -98,7 +144,7 @@ def snapshot(): else: untracked[name] = None target = os.environ.get("TASK_TARGET_BRANCH", "main") - return { + result = { "head": git_text("rev-parse", "HEAD"), "branch": git_text("rev-parse", "--abbrev-ref", "HEAD"), "target_branch": target, @@ -109,6 +155,10 @@ def snapshot(): "untracked": untracked, "submodules": git("submodule", "status", "--recursive").decode("utf-8", "replace"), } + components = component_snapshot(root) + if components is not None: + result['components'] = components + return result def create_receipt(command, output, exit_code, before, after, *, timestamp=None, @@ -135,8 +185,10 @@ def validate_snapshot(value): raise EvidenceError("Invalid receipt object snapshot") expected = {"head", "branch", "target_branch", "target_head", "status", "tracked_diff_sha256", "submodules", "untracked"} - if set(value) != expected: + if set(value) not in (expected, expected | {'components'}): raise EvidenceError("Invalid receipt object fields") + if 'components' in value and (not isinstance(value['components'], dict) or not isinstance(value['components'].get('components'), dict)): + raise EvidenceError('Invalid component snapshot') for key in ("head", "branch", "target_branch", "status", "tracked_diff_sha256", "submodules"): if not isinstance(value.get(key), str): raise EvidenceError("Invalid receipt object field: " + key) diff --git a/scripts/workspace.py b/scripts/workspace.py new file mode 100644 index 00000000..c8f5d31a --- /dev/null +++ b/scripts/workspace.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python3 +"""Public entry point for fixed sources and local component development.""" +from workspace.cli import main + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/workspace/__init__.py b/scripts/workspace/__init__.py new file mode 100644 index 00000000..1d52de48 --- /dev/null +++ b/scripts/workspace/__init__.py @@ -0,0 +1 @@ +"""Safe, local component source workspaces; language manifests own dependencies.""" diff --git a/scripts/workspace/cli.py b/scripts/workspace/cli.py new file mode 100644 index 00000000..bd60de3e --- /dev/null +++ b/scripts/workspace/cli.py @@ -0,0 +1,237 @@ +import argparse +import json +import os +from pathlib import Path +import subprocess +import sys + +from .common import WorkspaceError, safe_path, write_json +from .git import Git +from .go import Go +from .manifest import Manifest, validate_branch +from .npm import Npm +from .state import State +from .transition import Transition + + +def process_environment(root): + try: + from .transport import environment + except ModuleNotFoundError as error: + if error.name != "workspace.transport": + raise + result = os.environ.copy() + result.update({"GOWORK": "off", "GOTOOLCHAIN": "local"}) + else: + result = environment(root) + # Read-only reporting does not refresh another owner's Git index. + result["GIT_OPTIONAL_LOCKS"] = "0" + for name in ("GIT_DIR", "GIT_WORK_TREE", "GIT_INDEX_FILE", "GIT_COMMON_DIR"): + result.pop(name, None) + return result + + +class Workspace: + def __init__(self, root): + self.root = root.resolve() + self.manifest = Manifest(self.root) + self.state = State(self.root) + self.env = process_environment(self.root) + self.git = Git(self.env) + self.go = Go(self) + self.npm = Npm(self) + self.transition = Transition(self) + + def baseline(self, component): + name = component["id"] + if component["role"] == "go-library": + resolved = self.go.resolve(component) + if resolved: + return resolved + elif component["role"] == "npm-library": + resolved = self.npm.resolve(component) + if resolved: + return resolved + elif name in self.manifest.lock: + return self.manifest.lock[name]["commit"], {"kind": "source-lock"} + legacy = self.git.gitlink(self.root, component.get("legacy_path")) + if legacy: + return legacy, {"kind": "legacy-gitlink", "path": component.get("legacy_path")} + raise WorkspaceError(f"no fixed version source for {name}; latest main is not a fallback") + + def record(self, component, commit, source): + record = {"path": component["path"], "origin": component["repo"], "baseline": commit, + "source": source, "owner_root": str(self.root), "mode": "preparing", "linked": False} + self.state.data["components"][component["id"]] = record + return record + + def prepare_one(self, component): + name = component["id"] + path = safe_path(self.root, component["path"]) + commit, source = self.baseline(component) + record = self.state.data["components"].get(name) + if record and (record["path"] != component["path"] or record["origin"] != component["repo"]): + raise WorkspaceError(f"registered component identity changed: {name}") + if path.exists(): + editable = record and record.get("mode") in ("editable", "linked") + partial = record and record.get("mode") == "preparing" + actual = self.git.safe(path, component["repo"], clean=not (editable or partial)) + if editable: + if record["baseline"] != commit: + raise WorkspaceError(f"version changed while {name} is editable; owner must synchronize explicitly") + if actual["branch"] != record.get("branch"): + raise WorkspaceError(f"registered edit branch changed: {name}") + return record + if partial: + if any(entry.name != ".git" for entry in path.iterdir()): + raise WorkspaceError(f"partial clone contains files: {name}; preserve them for its owner") + else: + if actual["branch"] or actual["head"] != commit: + raise WorkspaceError(f"existing checkout differs from fixed source: {name}; no automatic checkout") + if record is None: + record = self.record(component, commit, source) + record.update({"mode": "versioned", "baseline": commit, "source": source}) + self.state.save() + return record + elif record and record.get("mode") != "preparing": + raise WorkspaceError(f"registered source is missing: {name}; owner must resolve it") + if record is None: + record = self.record(component, commit, source) + record.update({"baseline": commit, "source": source, "mode": "preparing"}) + self.state.save() + try: + if not path.exists(): + self.git.call(self.root, "clone", "--no-checkout", "--", component["repo"], str(path)) + self.git.call(path, "fetch", "--no-tags", "origin", commit) + self.git.call(path, "checkout", "--detach", commit) + self.git.safe(path, component["repo"]) + record.update({"mode": "versioned", "branch": None}) + record.pop("error", None) + self.state.save() + return record + except Exception as error: + record["error"] = str(error) + self.state.save() + raise + + def edit(self, component, branch): + self.go.check_owned() + if component["role"] in ("go-library", "npm-library"): + for consumer in self.manifest.select(): + if consumer["role"] == "application" and (consumer.get("modules") or component["role"] == "npm-library"): + path = safe_path(self.root, consumer["path"]) + if path.exists(): + self.git.safe(path, consumer["repo"], clean=False) + else: + self.prepare_one(consumer) + name = component["id"] + record = self.prepare_one(component) + path = safe_path(self.root, component["path"]) + branch = branch or "feature/workspace-" + name.lower() + validate_branch(branch) + if record.get("mode") in ("editable", "linked"): + if record.get("branch") != branch: + raise WorkspaceError(f"component already belongs to {record.get('branch')}; no branch replacement") + self.git.safe(path, component["repo"], clean=False) + else: + self.git.safe(path, component["repo"]) + if self.git.call(path, "show-ref", "--verify", "--quiet", "refs/heads/" + branch, check=False).returncode == 0: + raise WorkspaceError(f"branch already exists: {branch}; owner must choose its checkout") + self.git.call(path, "checkout", "-b", branch, record["baseline"]) + record.update({"mode": "editable", "branch": branch}) + self.state.save() + record["linked"] = bool(self.go.modules(component)) + if record["linked"]: + record["mode"] = "linked" + self.go.update() + self.state.save() + + def unlink(self, component): + self.go.check_owned() + record = self.state.data["components"].get(component["id"]) + if record is None: + raise WorkspaceError(f"component is not registered: {component['id']}") + self.git.safe(safe_path(self.root, component["path"]), component["repo"], clean=False) + record["linked"] = False + if record.get("mode") == "linked": + record["mode"] = "editable" + self.go.update() + self.state.save() + + def status(self, components): + result = {"schema": 1, "root": str(self.root), "components": {}, + "go_work": self.state.data.get("go_work")} + for component in components: + name = component["id"] + record = self.state.data["components"].get(name) + entry = {"path": component["path"], "repo": component["repo"], "role": component["role"], + "declared": self.manifest.lock.get(name), "registered": record} + path = safe_path(self.root, component["path"]) + if path.exists(): + try: + entry["actual"] = self.git.inspect(path) + except WorkspaceError as error: + entry["error"] = str(error) + result["components"][name] = entry + return result + + def verify(self, components): + self.go.check_owned() + for component in components: + record = self.state.data["components"].get(component["id"]) + if not record or record.get("linked"): + raise WorkspaceError(f"fixed source missing or development overlay active: {component['id']}") + actual = self.git.safe(safe_path(self.root, component["path"]), component["repo"]) + baseline, _ = self.baseline(component) + if actual["head"] != baseline or actual["branch"]: + raise WorkspaceError(f"fixed source differs from declared version: {component['id']}") + + def snapshot(self): + write_json(safe_path(self.root, ".workspace/resolved.json"), self.status(self.manifest.select())) + + +def main(argv=None): + parser = argparse.ArgumentParser(description="Fixed component sources and explicit local editing") + parser.add_argument("--root", type=Path, default=Path(__file__).resolve().parents[2]) + parser.add_argument("command", choices=("prepare", "edit", "unlink", "status", "verify", "transition")) + parser.add_argument("--name") + parser.add_argument("--branch") + parser.add_argument("--apply", action="store_true") + args = parser.parse_args(argv) + try: + if args.branch: + validate_branch(args.branch) + if args.command in ("edit", "unlink") and not args.name: + raise WorkspaceError("--name is required for component editing/unlinking") + if args.apply and args.command != "transition": + raise WorkspaceError("--apply is only valid for transition") + workspace = Workspace(args.root) + components = workspace.manifest.select(args.name, fixed=args.command in ("prepare", "verify")) + if args.command == "status": + result = workspace.status(components) + elif args.command == "transition" and not args.apply: + result = {"schema": 1, "components": {component["id"]: {"legacy": workspace.transition.inspect(component)} for component in components}} + elif args.command == "verify": + workspace.verify(components) + result = workspace.status(components) + else: + with workspace.state.operation(): + # Read state again under the operation lock: another process may have + # finished between initial inspection and lock acquisition. + workspace.state = State(workspace.root) + if args.command == "transition": + workspace.transition.apply_all(components, args.branch) + for component in components: + if args.command == "prepare": + workspace.prepare_one(component) + elif args.command == "edit": + workspace.edit(component, args.branch) + elif args.command == "unlink": + workspace.unlink(component) + workspace.snapshot() + result = workspace.status(components) + print(json.dumps(result, indent=2, sort_keys=True)) + return 0 + except (WorkspaceError, OSError, ValueError, subprocess.TimeoutExpired) as error: + print(f"workspace: {error}", file=sys.stderr) + return 1 diff --git a/scripts/workspace/common.py b/scripts/workspace/common.py new file mode 100644 index 00000000..4bd363fd --- /dev/null +++ b/scripts/workspace/common.py @@ -0,0 +1,75 @@ +import hashlib +import json +import os +from pathlib import Path, PurePosixPath +import subprocess +import tempfile + + +class WorkspaceError(Exception): + pass + + +def run(args, cwd, env=None, check=True): + result = subprocess.run(args, cwd=cwd, env=env, text=True, capture_output=True, + timeout=180) + if check and result.returncode: + raise WorkspaceError(f"{args[0]} failed ({result.returncode}): {result.stderr.strip() or result.stdout.strip()}") + return result + + +def relative_path(value, allow_dot=False): + if not isinstance(value, str) or not value or "\\" in value or any(ord(c) < 32 for c in value): + raise WorkspaceError("invalid relative path") + path = PurePosixPath(value) + if path.is_absolute() or ".." in path.parts or (value == "." and not allow_dot): + raise WorkspaceError(f"unsafe relative path: {value}") + return path + + +def safe_path(root, value, allow_dot=False): + relative_path(value, allow_dot) + path = root / value + # Refuse symlink path components even when a link currently points inside root. + # This avoids creating a second apparent owner and later retargeting escapes. + current = root + for part in PurePosixPath(value).parts: + current /= part + if current.is_symlink(): + raise WorkspaceError(f"symlink path is not owned by this workspace: {value}") + if not path.resolve().is_relative_to(root.resolve()): + raise WorkspaceError(f"path escapes workspace: {value}") + return path + + +def read_json(path): + if path.is_symlink(): + raise WorkspaceError(f"refusing symlink metadata: {path}") + try: + return json.loads(path.read_text()) + except (OSError, ValueError) as error: + raise WorkspaceError(f"cannot read {path.name}: {error}") from error + + +def atomic_write(path, content): + if path.is_symlink(): + raise WorkspaceError(f"refusing symlink output: {path}") + path.parent.mkdir(parents=True, exist_ok=True) + descriptor, temporary = tempfile.mkstemp(prefix="." + path.name + "-", dir=path.parent) + try: + with os.fdopen(descriptor, "w") as stream: + stream.write(content) + stream.flush() + os.fsync(stream.fileno()) + os.replace(temporary, path) + finally: + if os.path.exists(temporary): + os.unlink(temporary) + + +def write_json(path, value): + atomic_write(path, json.dumps(value, indent=2, sort_keys=True) + "\n") + + +def digest(path): + return hashlib.sha256(path.read_bytes()).hexdigest() diff --git a/scripts/workspace/git.py b/scripts/workspace/git.py new file mode 100644 index 00000000..2a4decd9 --- /dev/null +++ b/scripts/workspace/git.py @@ -0,0 +1,70 @@ +from pathlib import Path +from urllib.parse import urlsplit, urlunsplit + +from .common import WorkspaceError, run + + +def display_origin(value): + parsed = urlsplit(value) + netloc = parsed.netloc + if parsed.username and (parsed.scheme != "ssh" or parsed.username != "git" or parsed.password): + netloc = "@" + netloc.rsplit("@", 1)[-1] + return urlunsplit((parsed.scheme, netloc, parsed.path, + "" if parsed.query else "", "" if parsed.fragment else "")) + + +class Git: + def __init__(self, env): + self.env = env + + def call(self, path, *args, check=True): + return run(["git", "-c", "gc.auto=0", "-c", "core.hooksPath=/dev/null", "-c", "core.fsmonitor=false", *args], path, self.env, check) + + def text(self, path, *args, check=True): + return self.call(path, *args, check=check).stdout.strip() + + def inspect(self, path): + if not (path / ".git").exists(): + raise WorkspaceError(f"existing path is not an independent Git checkout: {path}") + top = Path(self.text(path, "rev-parse", "--show-toplevel")) + if top.resolve() != path.resolve(): + raise WorkspaceError("component path is not a Git root") + gitdir = Path(self.text(path, "rev-parse", "--absolute-git-dir")) + common = Path(self.text(path, "rev-parse", "--path-format=absolute", "--git-common-dir")) + locks = sorted(str(file) for directory in {gitdir, common} for file in directory.rglob("*.lock")) + operations = [name for name in ("MERGE_HEAD", "CHERRY_PICK_HEAD", "REVERT_HEAD", "rebase-merge", "rebase-apply", "BISECT_LOG") + if (gitdir / name).exists()] + changes = self.text(path, "status", "--porcelain=v1", "--untracked-files=all") + ignored = self.text(path, "ls-files", "--others", "--ignored", "--exclude-standard") + head = self.text(path, "rev-parse", "--verify", "HEAD", check=False) + branch = self.text(path, "symbolic-ref", "--quiet", "--short", "HEAD", check=False) + worktrees = self.text(path, "worktree", "list", "--porcelain") + return {"head": head or None, "branch": branch or None, + "origin": display_origin(self.text(path, "remote", "get-url", "origin", check=False)), + "dirty": bool(changes or ignored), "changes": changes.splitlines(), "ignored": ignored.splitlines(), + "locks": locks, "operations": operations, + "worktrees": [line[9:] for line in worktrees.splitlines() if line.startswith("worktree ")], + "git_dir": str(gitdir), "common_dir": str(common)} + + def safe(self, path, origin=None, clean=True, independent=True): + actual = self.inspect(path) + if origin is not None and actual["origin"] != origin: + raise WorkspaceError(f"origin mismatch at {path}") + if actual["locks"] or actual["operations"]: + raise WorkspaceError(f"Git operation/lock in progress at {path}") + if independent and (actual["git_dir"] != actual["common_dir"] or len(actual["worktrees"]) != 1): + raise WorkspaceError(f"shared Git worktree ownership at {path}; owner must resolve it") + if independent and ((path / ".git").is_symlink() or not (path / ".git").is_dir() + or Path(actual["git_dir"]).resolve() != (path / ".git").resolve()): + raise WorkspaceError(f"component Git metadata is owned outside its checkout: {path}") + if clean and actual["dirty"]: + raise WorkspaceError(f"dirty or ignored unique files at {path}; owner must save them") + return actual + + def gitlink(self, root, legacy): + if not legacy: + return None + result = self.text(root, "ls-tree", "HEAD", "--", legacy, check=False) + if result.startswith("160000 commit "): + return result.split()[2] + return None diff --git a/scripts/workspace/go.py b/scripts/workspace/go.py new file mode 100644 index 00000000..f4d547cc --- /dev/null +++ b/scripts/workspace/go.py @@ -0,0 +1,153 @@ +import json +from pathlib import Path +import shutil +import tempfile + +from .common import WorkspaceError, atomic_write, digest, run, safe_path +from .manifest import SHA + + +class Go: + def __init__(self, workspace): + self.workspace = workspace + + def call(self, path, *args): + result = run(["go", *args], path, self.workspace.env) + try: + return json.loads(result.stdout) + except ValueError as error: + raise WorkspaceError("Go returned invalid module metadata") from error + + def modules(self, component): + result = [] + base = safe_path(self.workspace.root, component["path"]) + for module in component.get("modules", []): + directory = safe_path(base, module.get("directory", "."), allow_dot=True) + if (directory / "go.mod").is_file(): + document = self.call(directory, "mod", "edit", "-json") + if document["Module"]["Path"] not in (module["path"], module.get("legacy")): + raise WorkspaceError(f"module identity mismatch at {directory}") + result.append((module, directory, document)) + return result + + def resolve(self, component): + selected = [] + consumers = sorted(self.workspace.manifest.select(), key=lambda c: ("backend" not in c["id"].lower(), c["id"])) + for consumer in consumers: + if consumer["role"] != "application": + continue + for consumer_module, directory, document in self.modules(consumer): + if document["Module"]["Path"] != consumer_module["path"]: + # An old short-name graph still belongs to the old gitlinks. + continue + # Package management can update go.sum even when source merely + # needs inspection. Resolve an identical isolated manifest so + # both editable and historical consumers stay untouched. + with tempfile.TemporaryDirectory(prefix="workspace-go-resolve-") as temporary: + isolated = Path(temporary) + shutil.copy2(directory / "go.mod", isolated / "go.mod") + if (directory / "go.sum").exists(): + shutil.copy2(directory / "go.sum", isolated / "go.sum") + output = run(["go", "list", "-mod=mod", "-m", "-json", "all"], isolated, self.workspace.env).stdout + graph = {} + decoder = json.JSONDecoder() + while output.strip(): + metadata, end = decoder.raw_decode(output.lstrip()) + output = output.lstrip()[end:] + graph[metadata["Path"]] = metadata + for module in component.get("modules", []): + metadata = graph.get(module["path"]) + if not metadata: + continue + if metadata.get("Replace"): + raise WorkspaceError(f"local replacement cannot establish version baseline: {module['path']}") + version = metadata.get("Version") + if not version: + raise WorkspaceError("Go module has no fixed selected version") + download = self.call(isolated, "mod", "download", "-json", module["path"] + "@" + version) + origin = download.get("Origin") or {} + commit = origin.get("Hash", "") + if origin.get("VCS") != "git" or not SHA.fullmatch(commit): + raise WorkspaceError(f"Go module has no verifiable Origin.Hash: {module['path']}") + if origin.get("URL") != component["repo"]: + # Canonical discovery uses HTTPS; transport maps that + # exact registered source to SSH, without a new identity. + canonical = "https://" + module["path"].split(".git", 1)[0] + ".git" + if origin.get("URL") != canonical: + raise WorkspaceError(f"Go Origin URL does not match approved repository: {module['path']}") + selected.append((commit, {"kind": "go-module", "module": module["path"], + "version": version, "consumer": consumer["id"], "origin": origin})) + if not selected: + return None + if len({entry[0] for entry in selected}) != 1: + raise WorkspaceError(f"consumer/submodule versions select different commits for {component['id']}; owner must choose compatible versions") + commit, source = selected[0] + source = dict(source, consumers=sorted({entry[1]["consumer"] for entry in selected}), + selections=[entry[1] for entry in selected]) + return commit, source + + def check_owned(self): + path = safe_path(self.workspace.root, "go.work") + recorded = self.workspace.state.data.get("go_work") + if path.exists() and (not recorded or digest(path) != recorded.get("sha256")): + raise WorkspaceError("go.work is not the registered generated overlay; preserve manual changes") + if recorded and not path.exists(): + raise WorkspaceError("registered go.work is missing; owner must resolve overlay state") + + def update(self): + self.check_owned() + paths = set() + linked_modules = set() + cached = {} + + def modules(component): + if component["id"] not in cached: + cached[component["id"]] = self.modules(component) + return cached[component["id"]] + + for name, entry in self.workspace.state.data["components"].items(): + if entry.get("linked"): + for _, directory, document in modules(self.workspace.manifest.components[name]): + paths.add(directory) + linked_modules.add(document["Module"]["Path"]) + for consumer in entry.get("source", {}).get("consumers", []): + for _, directory, document in modules(self.workspace.manifest.components[consumer]): + paths.add(directory) + linked_modules.add(document["Module"]["Path"]) + if linked_modules: + # Include only consuming modules, including transitive local consumers. + changed = True + while changed: + changed = False + for component in self.workspace.manifest.select(): + for _, directory, document in modules(component): + required = {item["Path"] for item in document.get("Require") or []} + if required & linked_modules and directory not in paths: + paths.add(directory) + linked_modules.add(document["Module"]["Path"]) + changed = True + path = safe_path(self.workspace.root, "go.work") + if not paths: + if path.exists(): + path.unlink() + self.workspace.state.data.pop("go_work", None) + return + version = run(["go", "env", "GOVERSION"], self.workspace.root, self.workspace.env).stdout.strip().removeprefix("go") + content = "go " + version + "\n\nuse (\n" + "".join("\t" + json.dumps("./" + str(item.relative_to(self.workspace.root))) + "\n" for item in sorted(paths)) + ")\n" + documents = [(directory, document) for rows in cached.values() for _, directory, document in rows if directory in paths] + directories = {document["Module"]["Path"]: directory for directory, document in documents} + aliases = {entry["Old"]["Path"] for _, document in documents for entry in document.get("Replace") or [] + if not entry["New"].get("Version") and entry["Old"]["Path"] in directories} + versions = {(entry["Path"], entry["Version"]) for _, document in documents for entry in document.get("Require") or [] + if entry["Path"] in aliases} + versions.update((entry["Old"]["Path"], entry["Old"]["Version"]) for _, document in documents + for entry in document.get("Replace") or [] + if entry["Old"]["Path"] in aliases and entry["Old"].get("Version")) + # Historical modules can replace the same library with different nested + # paths. Exact-version local overrides reconcile those paths while Go + # forbids an all-version replacement of a workspace main module. + if versions: + content += "\nreplace (\n" + "".join("\t" + name + " " + selected + " => " + json.dumps("./" + str(directories[name].relative_to(self.workspace.root))) + "\n" + for name, selected in sorted(versions)) + ")\n" + atomic_write(path, content) + self.workspace.state.data["go_work"] = {"sha256": digest(path), "paths": [str(item.relative_to(self.workspace.root)) for item in sorted(paths)]} diff --git a/scripts/workspace/manifest.py b/scripts/workspace/manifest.py new file mode 100644 index 00000000..62e831cf --- /dev/null +++ b/scripts/workspace/manifest.py @@ -0,0 +1,94 @@ +import re +from urllib.parse import urlsplit + +from .common import WorkspaceError, read_json, relative_path, safe_path + +ROLES = {"application", "go-library", "npm-library", "documentation", "guidelines"} +FIXED_ROLES = {"application", "documentation", "guidelines"} +SHA = re.compile(r"[0-9a-f]{40}\Z") +IDENTIFIER = re.compile(r"[A-Za-z0-9][A-Za-z0-9_-]*\Z") + + +def validate_repo(repo): + if not isinstance(repo, str) or not repo or repo.startswith("-") or any(c.isspace() for c in repo): + raise WorkspaceError("invalid component repository") + if "://" in repo: + parsed = urlsplit(repo) + if parsed.scheme not in {"ssh", "https", "file"} or parsed.password or parsed.query or parsed.fragment: + raise WorkspaceError("repository must be a credential-free approved Git URL") + if parsed.scheme == "https" and parsed.username: + raise WorkspaceError("repository credentials are forbidden") + if parsed.scheme == "ssh" and parsed.username not in (None, "git"): + raise WorkspaceError("unsupported SSH repository identity") + elif not repo.startswith("/"): + raise WorkspaceError("repository must be an absolute local path or approved URL") + + +class Manifest: + def __init__(self, root): + self.root = root + document = read_json(root / "components.json") + if not isinstance(document, dict) or document.get("schema") != 1 or not isinstance(document.get("components"), list): + raise WorkspaceError("unsupported components schema") + self.components = {} + modules = set() + for component in document["components"]: + if not isinstance(component, dict): + raise WorkspaceError("invalid component record") + name = component.get("id") + if not isinstance(name, str) or not IDENTIFIER.fullmatch(name) or name in self.components: + raise WorkspaceError("invalid or duplicate component id") + if component.get("path") != ".workspace/" + name: + raise WorkspaceError(f"component path must be .workspace/{name}") + safe_path(root, component["path"]) + if component.get("legacy_path"): + safe_path(root, component["legacy_path"]) + if component.get("role") not in ROLES: + raise WorkspaceError(f"invalid component role: {name}") + package = component.get("package_name") + if package is not None and (component["role"] != "npm-library" or not isinstance(package, str) + or not re.fullmatch(r"(?:@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*", package)): + raise WorkspaceError(f"invalid npm package mapping: {name}") + validate_repo(component.get("repo")) + target = component.get("target", "main") + validate_ref(target) + entries = component.get("modules", []) + if not isinstance(entries, list): + raise WorkspaceError("modules must be a list") + for module in entries: + if not isinstance(module, dict) or not isinstance(module.get("path"), str) or not module["path"]: + raise WorkspaceError("invalid module mapping") + if module["path"] in modules or any(c.isspace() for c in module["path"]): + raise WorkspaceError("duplicate or invalid module identity") + relative_path(module.get("directory", "."), allow_dot=True) + modules.add(module["path"]) + self.components[name] = component + lock = read_json(root / "components.lock.json") + if not isinstance(lock, dict) or lock.get("schema") != 1 or not isinstance(lock.get("components"), dict): + raise WorkspaceError("unsupported component lock schema") + self.lock = lock["components"] + for name, value in self.lock.items(): + if name not in self.components or not isinstance(value, dict) or not SHA.fullmatch(str(value.get("commit", ""))): + raise WorkspaceError(f"invalid locked component: {name}") + if self.components[name]["role"] in ("go-library", "npm-library"): + raise WorkspaceError(f"language library {name} cannot have a competing source lock") + + def select(self, name=None, fixed=False): + if name: + if name not in self.components: + raise WorkspaceError(f"unknown component: {name}") + return [self.components[name]] + return [entry for entry in self.components.values() if not fixed or entry["role"] in FIXED_ROLES] + + +def validate_ref(ref): + if not isinstance(ref, str) or not re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9._/-]*", ref): + raise WorkspaceError("invalid branch/ref name") + if any(token in ref for token in ("..", "//", "/.", ".lock")) or ref.endswith(("/", ".")): + raise WorkspaceError("invalid branch/ref name") + + +def validate_branch(branch): + validate_ref(branch) + if not branch.startswith(("feature/", "fix/", "chore/", "codex/")): + raise WorkspaceError("editing requires a named task branch") diff --git a/scripts/workspace/npm.py b/scripts/workspace/npm.py new file mode 100644 index 00000000..523edd11 --- /dev/null +++ b/scripts/workspace/npm.py @@ -0,0 +1,62 @@ +"""Resolve editable npm source from a consumer's Git package lock, without npm hooks.""" +from pathlib import Path +from urllib.parse import unquote, urlsplit, urlunsplit + +from .common import WorkspaceError, read_json, safe_path +from .manifest import SHA, validate_repo + + +def repository_identity(value): + value = value.removeprefix("git+") + parsed = urlsplit(value) + if parsed.scheme == "file": + if parsed.netloc not in ("", "localhost"): + raise WorkspaceError("npm Git origin must be local or approved") + return str(Path(unquote(parsed.path)).resolve()) + validate_repo(value) + return value + + +class Npm: + def __init__(self, workspace): + self.workspace = workspace + + def resolve(self, component): + package = component.get("package_name") + if not package: + return None + selected = [] + consumers = sorted(self.workspace.manifest.select(), key=lambda entry: ("frontend" not in entry["id"].lower(), entry["id"])) + for consumer in consumers: + if consumer["role"] != "application": + continue + root = safe_path(self.workspace.root, consumer["path"]) + path = safe_path(root, "package-lock.json") + if not path.exists(): + continue + lock = read_json(path) + if not isinstance(lock, dict) or lock.get("lockfileVersion") not in (2, 3) or not isinstance(lock.get("packages"), dict): + raise WorkspaceError(f"unsupported npm lock for {consumer['id']}") + for location, entry in lock["packages"].items(): + if location != "node_modules/" + package and not location.endswith("/node_modules/" + package): + continue + if not isinstance(entry, dict) or entry.get("link"): + raise WorkspaceError(f"local npm link cannot establish version baseline: {package}") + resolved = entry.get("resolved", "") + if not isinstance(resolved, str) or not resolved.startswith("git+"): + raise WorkspaceError(f"npm source needs a fixed approved Git origin: {package}") + parsed = urlsplit(resolved) + if not SHA.fullmatch(parsed.fragment): + raise WorkspaceError(f"npm Git source must pin a full commit: {package}") + origin = urlunsplit((parsed.scheme, parsed.netloc, parsed.path, parsed.query, "")) + if repository_identity(origin) != repository_identity(component["repo"]): + raise WorkspaceError(f"npm Git origin mismatch: {package}") + selected.append((parsed.fragment, {"kind": "npm-lock", "package": package, + "version": entry.get("version"), "resolved": resolved, + "consumer": consumer["id"], "lock_path": str(path.relative_to(self.workspace.root))})) + if not selected: + return None + if len({entry[0] for entry in selected}) != 1: + raise WorkspaceError(f"consumers select conflicting npm Git commits for {package}; owner must choose compatible versions") + commit, source = selected[0] + return commit, dict(source, selections=[entry[1] for entry in selected]) diff --git a/scripts/workspace/state.py b/scripts/workspace/state.py new file mode 100644 index 00000000..0ca9433f --- /dev/null +++ b/scripts/workspace/state.py @@ -0,0 +1,36 @@ +from contextlib import contextmanager +import os + +from .common import WorkspaceError, read_json, safe_path, write_json + + +class State: + def __init__(self, root): + self.root = root + self.area = safe_path(root, ".workspace") + self.path = safe_path(root, ".workspace/state.json") + self.data = read_json(self.path) if self.path.exists() else {"schema": 1, "components": {}} + if not isinstance(self.data, dict) or self.data.get("schema") != 1 or not isinstance(self.data.get("components"), dict): + raise WorkspaceError("unsupported workspace state") + for name, entry in self.data["components"].items(): + if not isinstance(entry, dict) or entry.get("owner_root") != str(root): + raise WorkspaceError(f"workspace owner mismatch: {name}") + safe_path(root, entry.get("path", "")) + + def save(self): + write_json(self.path, self.data) + + @contextmanager + def operation(self): + self.area.mkdir(exist_ok=True) + path = safe_path(self.root, ".workspace/.operation.lock") + try: + descriptor = os.open(path, os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o600) + except FileExistsError as error: + raise WorkspaceError("workspace has another writer (.operation.lock); preserve the owner lock") from error + try: + with os.fdopen(descriptor, "w") as stream: + stream.write(str(os.getpid()) + "\n") + yield + finally: + path.unlink() diff --git a/scripts/workspace/transition.py b/scripts/workspace/transition.py new file mode 100644 index 00000000..453745f8 --- /dev/null +++ b/scripts/workspace/transition.py @@ -0,0 +1,249 @@ +import hashlib +import os +import shutil + +from .common import WorkspaceError, safe_path +from .manifest import validate_branch + + +def files_snapshot(path, excluded=()): + """Hash files without following links or opening another repository's metadata.""" + files = {} + for current, directories, names in os.walk(path, followlinks=False): + directories[:] = [name for name in directories if name != ".git" + and str((type(path)(current) / name).relative_to(path)) not in excluded] + for name in directories + names: + file = type(path)(current) / name + if name == ".git": + continue + relative = str(file.relative_to(path)) + if file.is_symlink(): + files[relative] = {"link": os.readlink(file)} + elif file.is_file(): + files[relative] = {"sha256": hashlib.sha256(file.read_bytes()).hexdigest(), + "mode": file.stat().st_mode & 0o777} + return files + + +class Transition: + def __init__(self, workspace): + self.workspace = workspace + + def inspect(self, component): + root = self.workspace.root + legacy_name = component.get("legacy_path") + legacy = safe_path(root, legacy_name) if legacy_name else None + if not legacy or not (legacy / ".git").exists(): + return {"path": legacy_name, "gitlink": self.workspace.git.gitlink(root, legacy_name)} + return self.inspect_at(legacy, self.workspace.git.gitlink(root, legacy_name)) + + def inspect_at(self, legacy, pin=None): + root = self.workspace.root + result = {"path": str(legacy.relative_to(root)), "gitlink": pin} + if (legacy / ".git").exists(): + result.update(self.workspace.git.inspect(legacy)) + result["refs"] = self.workspace.git.text(legacy, "show-ref", check=False).splitlines() + result["reflog_commits"] = sorted(set(self.workspace.git.text(legacy, "reflog", "--all", "--format=%H", check=False).splitlines())) + index = type(root)(result["git_dir"]) / "index" + result["index_sha256"] = hashlib.sha256(index.read_bytes()).hexdigest() if index.exists() else None + result["index_entries"] = self.workspace.git.text(legacy, "ls-files", "--stage", "-z") + gitlinks = {} + for row in result["index_entries"].split("\0"): + if not row: + continue + metadata, relative = row.split("\t", 1) + mode, commit, stage = metadata.split() + if mode == "160000" and stage == "0": + gitlinks[relative] = commit + nested = [] + for current, directories, names in os.walk(legacy, followlinks=False): + if current == str(legacy): + directories[:] = [name for name in directories if name != ".git"] + continue + if ".git" in directories or ".git" in names: + path = type(legacy)(current) + relative = str(path.relative_to(legacy)) + child = self.inspect_at(path, gitlinks.get(relative)) + matches = [entry["id"] for entry in self.workspace.manifest.select() + if entry["repo"] == child.get("origin")] + nested.append({"path": relative, "id": matches[0] if len(matches) == 1 else None, + "tracked": relative in gitlinks, "snapshot": child}) + directories[:] = [] + result["nested"] = nested + result["files"] = files_snapshot(legacy, {entry["path"] for entry in nested}) + return result + + def validate_files(self, legacy, snapshot): + for relative, entry in snapshot.items(): + file = legacy / relative + if "link" in entry and (os.path.isabs(entry["link"]) or not file.resolve().is_relative_to(legacy.resolve())): + raise WorkspaceError(f"legacy symlink escapes component: {relative}; owner must resolve it") + + def content_identity(self, snapshot): + return snapshot["head"], snapshot["files"], snapshot["index_entries"] + + def preserve_refs(self, path, snapshots): + workspace = self.workspace + for snapshot in snapshots: + legacy = safe_path(workspace.root, snapshot["path"]) + namespace = hashlib.sha256(snapshot["path"].encode()).hexdigest()[:24] + workspace.git.call(path, "fetch", "--no-tags", "--", str(legacy), "+refs/*:refs/migration/sources/" + namespace + "/*") + for commit in snapshot["reflog_commits"]: + if workspace.git.call(path, "cat-file", "-e", commit, check=False).returncode: + workspace.git.call(path, "fetch", "--no-tags", "--", str(legacy), commit) + workspace.git.call(path, "update-ref", "refs/migration/reflog/" + commit, commit) + + def apply_all(self, components, branch): + """Resolve the whole nested ownership plan before creating any clone.""" + workspace = self.workspace + workspace.go.check_owned() + groups = {} + + def add(component, snapshot): + name = component["id"] + legacy = safe_path(workspace.root, snapshot["path"]) + if not snapshot.get("head"): + raise WorkspaceError(f"legacy checkout is unavailable: {name}") + workspace.git.safe(legacy, component["repo"], clean=False, independent=False) + self.validate_files(legacy, snapshot["files"]) + gitdir = type(legacy)(snapshot["git_dir"]) + if (gitdir / "objects/info/alternates").exists(): + raise WorkspaceError(f"legacy object store borrows another repository: {name}; owner must make it independent") + previous = groups.setdefault(name, []) + if previous: + if self.content_identity(previous[0]) != self.content_identity(snapshot): + raise WorkspaceError(f"conflicting duplicate logical component {name}: {previous[0]['path']} and {snapshot['path']}; owner must choose or reconcile them") + old_refs = dict(row.split(" ", 1)[::-1] for old in previous for row in old["refs"]) + new_refs = dict(row.split(" ", 1)[::-1] for row in snapshot["refs"]) + if any(old_refs[ref] != new_refs[ref] for ref in old_refs.keys() & new_refs.keys()): + raise WorkspaceError(f"conflicting duplicate refs for {name}; owner must reconcile them") + if any(old["path"] == snapshot["path"] for old in previous): + return + previous.append(snapshot) + for nested in snapshot.get("nested", []): + if not nested["tracked"] or nested["id"] is None: + raise WorkspaceError(f"unknown nested repository ownership at {snapshot['path']}/{nested['path']}; register its origin and Git ownership first") + add(workspace.manifest.components[nested["id"]], nested["snapshot"]) + + for component in components: + snapshot = self.inspect(component) + # Default transition also lists uninitialized components; a named + # unavailable checkout still reports a precise failure to its owner. + add(component, snapshot) + for name, snapshots in groups.items(): + component = workspace.manifest.components[name] + path = safe_path(workspace.root, component["path"]) + if path.exists(): + record = workspace.state.data["components"].get(name) + actual = workspace.git.safe(path, component["repo"], clean=False) + if not record or record.get("source", {}).get("kind") != "legacy-copy" or actual["branch"] != record.get("branch"): + raise WorkspaceError(f"migration destination has another owner: {name}; inspect its registered branch") + if actual["head"] != snapshots[0]["head"] or files_snapshot(path) != snapshots[0]["files"] or workspace.git.text(path, "ls-files", "--stage", "-z") != snapshots[0]["index_entries"]: + raise WorkspaceError(f"conflicting duplicate destination for {name}; preserve both scenes for the owner") + for name, snapshots in groups.items(): + component = workspace.manifest.components[name] + path = safe_path(workspace.root, component["path"]) + if path.exists(): + self.preserve_refs(path, snapshots) + record = workspace.state.data["components"][name] + record["legacy_snapshots"] = snapshots + workspace.state.save() + else: + self.copy_one(component, branch, snapshots) + for snapshots in groups.values(): + for snapshot in snapshots: + legacy = safe_path(workspace.root, snapshot["path"]) + if self.inspect_at(legacy, snapshot["gitlink"]) != snapshot: + raise WorkspaceError("legacy checkout changed during migration; independent copies retained for owner review") + for name in groups: + record = workspace.state.data["components"][name] + record["linked"] = bool(workspace.go.modules(workspace.manifest.components[name])) + if record["linked"]: + record["mode"] = "linked" + workspace.go.update() + workspace.state.save() + + def copy_one(self, component, branch, snapshots): + workspace = self.workspace + name = component["id"] + snapshot = snapshots[0] + legacy = safe_path(workspace.root, snapshot["path"]) + excluded = {entry["path"] for entry in snapshot.get("nested", [])} + gitdir = type(legacy)(snapshot["git_dir"]) + path = safe_path(workspace.root, component["path"]) + if path.exists(): + raise WorkspaceError(f"migration destination already exists: {name}; inspect its owner before retrying") + branch = branch or snapshot.get("branch") + if not branch or not branch.startswith(("feature/", "fix/", "chore/", "codex/")): + branch = "feature/migration-" + name.lower() + validate_branch(branch) + mappings = [{"id": nested["id"], "legacy_path": nested["snapshot"]["path"], + "workspace_path": workspace.manifest.components[nested["id"]]["path"]} + for nested in snapshot.get("nested", [])] + record = workspace.record(component, snapshot["head"], {"kind": "legacy-copy", "gitlink": snapshot["gitlink"], "nested_components": mappings}) + record.update({"mode": "migrating", "legacy_snapshot": snapshot, "legacy_snapshots": snapshots}) + workspace.state.save() + try: + # Local clone copies the complete object store without hardlinks/alternates. + # It never shares the submodule's Git common directory with the new root. + workspace.git.call(workspace.root, "clone", "--no-hardlinks", "--no-checkout", "--", str(legacy), str(path)) + workspace.git.call(path, "remote", "set-url", "origin", component["repo"]) + workspace.git.call(path, "fetch", "--no-tags", "--", str(legacy), "+refs/*:refs/migration/*") + self.preserve_refs(path, snapshots) + workspace.git.call(path, "checkout", "--detach", snapshot["head"]) + if workspace.git.call(path, "show-ref", "--verify", "--quiet", "refs/heads/" + branch, check=False).returncode == 0: + if workspace.git.text(path, "rev-parse", "refs/heads/" + branch) != snapshot["head"]: + raise WorkspaceError("migration branch conflict; original and partial clone retained") + workspace.git.call(path, "checkout", branch) + else: + workspace.git.call(path, "checkout", "-b", branch) + # Keep deletions as well as tracked, untracked, and ignored file content. + for filename in workspace.git.text(legacy, "diff", "--name-only", "-z", "--diff-filter=D", "HEAD").split("\0"): + if not filename: + continue + relative = type(path)(filename) + parent = safe_path(path, str(relative.parent), allow_dot=True) + file = parent / relative.name + if file.is_file() or file.is_symlink(): + file.unlink() + for current, directories, names in os.walk(legacy, followlinks=False): + directories[:] = [entry for entry in directories if entry != ".git" + and str((type(legacy)(current) / entry).relative_to(legacy)) not in excluded] + relative = type(legacy)(current).relative_to(legacy) + destination = path / relative + destination.mkdir(parents=True, exist_ok=True) + for filename in directories + names: + if filename == ".git": + continue + source = type(legacy)(current) / filename + target = destination / filename + if source.is_symlink(): + if target.is_symlink() and os.readlink(target) == os.readlink(source): + continue + if target.exists() or target.is_symlink(): + if target.is_dir() and not target.is_symlink(): + raise WorkspaceError(f"migration symlink conflicts with directory: {filename}") + target.unlink() + target.symlink_to(os.readlink(source), target_is_directory=source.is_dir()) + elif source.is_file(): + if target.is_symlink(): + target.unlink() + shutil.copy2(source, target) + # The clone copied all local objects, including staged blobs which + # are absent from HEAD. Preserve the index and split-index companions + # independently so staging is not silently flattened into file copies. + for index in list(gitdir.glob("sharedindex.*")) + [gitdir / "index"]: + if index.is_file(): + shutil.copy2(index, path / ".git" / index.name) + if self.inspect_at(legacy, snapshot["gitlink"]) != snapshot: + raise WorkspaceError("legacy checkout changed during migration; partial clone preserved for owner") + if files_snapshot(path) != snapshot["files"]: + raise WorkspaceError("migration file snapshot differs; original and partial clone preserved for owner") + workspace.git.safe(path, component["repo"], clean=False) + record.update({"mode": "editable", "branch": branch, "linked": False}) + record.pop("error", None) + workspace.state.save() + except Exception as error: + record["error"] = str(error) + workspace.state.save() + raise diff --git a/scripts/workspace/transport.py b/scripts/workspace/transport.py index ab8cd22d..721f3456 100644 --- a/scripts/workspace/transport.py +++ b/scripts/workspace/transport.py @@ -2,7 +2,7 @@ import json import os from pathlib import Path -from urllib.parse import urlsplit +from urllib.parse import urlsplit, unquote def _url(value): @@ -35,15 +35,37 @@ def environment(root=None): if not isinstance(rewrites, list): raise ValueError('invalid Git transport mappings') if rewrites: + inherited = [] + marker = env.get('CI_DEPENDENCY_MIRRORS') + if marker: + mirrors = Path(marker) + if not mirrors.is_absolute() or not mirrors.is_dir() or mirrors.is_symlink(): + raise ValueError('invalid CI dependency mirror identity') + mirrors = mirrors.resolve() + try: + count = int(env.get('GIT_CONFIG_COUNT', '0')) + except ValueError as error: + raise ValueError('invalid process Git configuration') from error + for i in range(count): + key, value = env.get(f'GIT_CONFIG_KEY_{i}', ''), env.get(f'GIT_CONFIG_VALUE_{i}', '') + if (key, value) in {('protocol.file.allow', 'always'), ('core.hooksPath', '/dev/null'), ('credential.helper', '')}: + inherited.append((key, value)) + elif key.startswith('url.file://') and key.endswith('.insteadOf'): + target = Path(unquote(urlsplit(key[4:-10]).path)).resolve() + if mirrors not in target.parents or not target.is_dir(): + raise ValueError('CI mirror source escapes its registered directory') + inherited.append((key, _url(value))) # Do not inherit temporary authentication configuration into candidate code. for key in list(env): if key == 'GIT_CONFIG_COUNT' or key.startswith(('GIT_CONFIG_KEY_', 'GIT_CONFIG_VALUE_')): del env[key] - for i, rewrite in enumerate(rewrites): + entries = list(inherited) + for rewrite in rewrites: if not isinstance(rewrite, dict) or set(rewrite) != {'from', 'to'}: raise ValueError('invalid Git transport mapping') source, target = _url(rewrite['from']), _url(rewrite['to']) - env[f'GIT_CONFIG_KEY_{i}'] = f'url.{target}.insteadOf' - env[f'GIT_CONFIG_VALUE_{i}'] = source - env['GIT_CONFIG_COUNT'] = str(len(rewrites)) + entries.append((f'url.{target}.insteadOf', source)) + for i, (key, value) in enumerate(entries): + env[f'GIT_CONFIG_KEY_{i}'], env[f'GIT_CONFIG_VALUE_{i}'] = key, value + env['GIT_CONFIG_COUNT'] = str(len(entries)) return env diff --git a/tests/test_component_governance.py b/tests/test_component_governance.py new file mode 100644 index 00000000..120a02db --- /dev/null +++ b/tests/test_component_governance.py @@ -0,0 +1,69 @@ +import importlib.util +import json +import os +from pathlib import Path +import subprocess +import tempfile +import unittest + +SCRIPTS = Path(__file__).resolve().parents[1] / 'scripts' + +class ComponentGovernanceTests(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.root = Path(self.temp.name) + self.run_git(self.root, 'init', '-q') + self.run_git(self.root, 'config', 'user.name', 'Fixture') + self.run_git(self.root, 'config', 'user.email', 'fixture@example.test') + self.child = self.root / '.workspace/Provider' + self.child.mkdir(parents=True) + self.run_git(self.child, 'init', '-q') + self.run_git(self.child, 'config', 'user.name', 'Fixture') + self.run_git(self.child, 'config', 'user.email', 'fixture@example.test') + (self.child/'value').write_text('one') + self.run_git(self.child, 'add', 'value') + self.run_git(self.child, 'commit', '-qm', 'Add value') + (self.root/'.gitignore').write_text('.workspace/\n') + (self.root/'components.json').write_text(json.dumps({'schema':1,'components':[{ + 'id':'Provider','repo':self.child.as_uri(),'path':'.workspace/Provider', + 'role':'documentation','modules':[],'target':'main'}]})) + self.run_git(self.root, 'add', '.gitignore', 'components.json') + self.run_git(self.root, 'commit', '-qm', 'Add component mapping') + self.old = Path.cwd() + os.chdir(self.root) + self.addCleanup(os.chdir,self.old) + + def run_git(self,root,*args): + return subprocess.check_output(['git','-C',str(root),*args],stderr=subprocess.STDOUT,text=True) + + def snapshot(self): + spec=importlib.util.spec_from_file_location('component_evidence',SCRIPTS/'evidence.py') + module=importlib.util.module_from_spec(spec); spec.loader.exec_module(module) + return module.snapshot() + + def test_evidence_captures_ignored_component_revision_and_dirty_bytes(self): + first=self.snapshot() + (self.child/'value').write_text('two') + second=self.snapshot() + self.assertIn('components',first,'receipts must identify ordinary ignored component checkouts') + self.assertNotEqual(first['components'],second['components']) + self.run_git(self.child,'commit','-qam','Change value') + third=self.snapshot() + self.assertNotEqual(second['components'],third['components']) + self.assertEqual(first['head'],third['head']) + + def test_before_sync_rejects_component_git_lock(self): + (self.child/'.git/index.lock').write_text('active owner') + result=subprocess.run(['python3',str(SCRIPTS/'check-worktree.py'),'before-sync'],cwd=self.root,capture_output=True,text=True) + self.assertNotEqual(result.returncode,0,'a hidden component writer must block synchronization') + self.assertTrue((self.child/'.git/index.lock').exists()) + + def test_receipts_reject_component_path_escape(self): + data=json.loads((self.root/'components.json').read_text()) + data['components'][0]['path']='../outside' + (self.root/'components.json').write_text(json.dumps(data)) + with self.assertRaises(Exception): + self.snapshot() + +if __name__=='__main__': unittest.main() diff --git a/tests/test_transport.py b/tests/test_transport.py index 5c497746..fce6160f 100644 --- a/tests/test_transport.py +++ b/tests/test_transport.py @@ -5,6 +5,7 @@ from pathlib import Path import subprocess import tempfile import unittest +from unittest.mock import patch SCRIPT = Path(__file__).resolve().parents[1] / 'scripts/workspace/transport.py' @@ -56,5 +57,26 @@ class TransportTests(unittest.TestCase): with self.assertRaises(ValueError): transport.environment(root) + def test_verified_local_mirror_mapping_survives_without_authentication(self): + transport = self.load() + with tempfile.TemporaryDirectory() as td: + root = Path(td) + mirror = root / 'mirrors' + mirror.mkdir() + target = mirror / 'Provider.git' + target.mkdir() + (root / 'components.json').write_text(json.dumps({'transport': {'git_rewrites': [ + {'from':'https://example.test/', 'to':'ssh://git@example.test:31411/'}]}})) + inherited = {'CI_DEPENDENCY_MIRRORS':str(mirror), 'GIT_CONFIG_COUNT':'3', + 'GIT_CONFIG_KEY_0':f'url.{target.as_uri()}.insteadOf','GIT_CONFIG_VALUE_0':'https://example.test/provider', + 'GIT_CONFIG_KEY_1':'protocol.file.allow','GIT_CONFIG_VALUE_1':'always', + 'GIT_CONFIG_KEY_2':'http.https://example.test/.extraheader','GIT_CONFIG_VALUE_2':'AUTHORIZATION: token fake-private'} + with patch.dict(os.environ,inherited): + env=transport.environment(root) + pairs=[(env[f'GIT_CONFIG_KEY_{i}'],env[f'GIT_CONFIG_VALUE_{i}']) for i in range(int(env['GIT_CONFIG_COUNT']))] + self.assertIn((f'url.{target.as_uri()}.insteadOf','https://example.test/provider'),pairs) + self.assertIn(('protocol.file.allow','always'),pairs) + self.assertFalse(any('extraheader' in key or 'fake-private' in value for key,value in pairs)) + if __name__ == '__main__': unittest.main() diff --git a/tests/test_workspace.py b/tests/test_workspace.py new file mode 100644 index 00000000..5ac119c8 --- /dev/null +++ b/tests/test_workspace.py @@ -0,0 +1,574 @@ +"""Workspace behavior against disposable real Git repositories and Go modules.""" +import hashlib +import json +import os +from pathlib import Path +import shutil +import subprocess +import sys +import tempfile +import unittest +import zipfile + +SOURCE = Path(__file__).resolve().parents[1] + + +class WorkspaceTests(unittest.TestCase): + def setUp(self): + self.tmp = tempfile.TemporaryDirectory(prefix="workspace-test-") + self.addCleanup(self.tmp.cleanup) + self.base = Path(self.tmp.name) + self.root = self.base / "project" + self.root.mkdir() + self.env = os.environ.copy() + for key in list(self.env): + if key.startswith("GIT_CONFIG_") or key in ("GIT_DIR", "GIT_WORK_TREE", "GIT_INDEX_FILE", "GOWORK"): + self.env.pop(key, None) + self.env.update({"GIT_CONFIG_NOSYSTEM": "1", "GIT_CONFIG_GLOBAL": "/dev/null", + "GIT_ALLOW_PROTOCOL": "file", "GIT_TERMINAL_PROMPT": "0", + "GIT_AUTHOR_NAME": "Workspace Test", "GIT_AUTHOR_EMAIL": "test@example.invalid", + "GIT_COMMITTER_NAME": "Workspace Test", "GIT_COMMITTER_EMAIL": "test@example.invalid", + "GOTOOLCHAIN": "local", "GOPROXY": "off", "GOSUMDB": "off"}) + self.git(self.root, "init", "--initial-branch=main") + (self.root / ".gitignore").write_text(".workspace/\ngo.work\ngo.work.sum\n") + self.git(self.root, "add", ".gitignore") + self.git(self.root, "commit", "-m", "Create project") + self.remote, self.author, self.first = self.component("App") + self.manifest = {"schema": 1, "components": [self.entry("App", self.remote)]} + self.lock = {"schema": 1, "components": {"App": {"commit": self.first}}} + self.save_manifest() + + def command(self, cwd, *args, check=True, env=None, separate_stderr=False): + result = subprocess.run(args, cwd=cwd, env=env or self.env, text=True, + stdout=subprocess.PIPE, stderr=subprocess.PIPE if separate_stderr else subprocess.STDOUT, timeout=60) + if check: + self.assertEqual(result.returncode, 0, result.stdout + (result.stderr or "")) + return result + + def git(self, cwd, *args, **kwargs): + return self.command(cwd, "git", *args, **kwargs) + + def cli(self, *args, check=True, env=None): + return self.command(self.root, sys.executable, str(SOURCE / "scripts/workspace.py"), + "--root", str(self.root), *args, check=check, env=env) + + def component(self, name, files=None): + remote = self.base / (name + ".git") + author = self.base / (name + "-author") + self.git(self.base, "init", "--bare", "--initial-branch=main", str(remote)) + self.git(remote, "config", "gc.auto", "0") + self.git(remote, "config", "receive.autogc", "false") + self.git(self.base, "init", "--initial-branch=main", str(author)) + for name, value in (files or {"content": "first\n", ".gitignore": "private/\n"}).items(): + path = author / name + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(value) + self.git(author, "add", ".") + self.git(author, "commit", "-m", "First component") + self.git(author, "remote", "add", "origin", str(remote)) + self.git(author, "push", "-u", "origin", "main") + return remote, author, self.git(author, "rev-parse", "HEAD").stdout.strip() + + def entry(self, name, remote, role="application", modules=None): + return {"id": name, "repo": str(remote), "path": ".workspace/" + name, + "legacy_path": "modules/" + name, "role": role, + "modules": modules or [], "target": "main"} + + def save_manifest(self): + (self.root / "components.json").write_text(json.dumps(self.manifest)) + (self.root / "components.lock.json").write_text(json.dumps(self.lock)) + + def state(self): + return json.loads((self.root / ".workspace/state.json").read_text()) + + def test_prepare_pins_fixed_commit_and_reuses_without_advancing(self): + (self.author / "content").write_text("latest\n") + self.git(self.author, "commit", "-am", "Advance remote") + self.git(self.author, "push", "origin", "main") + self.cli("prepare") + clone = self.root / ".workspace/App" + self.assertEqual(self.git(clone, "rev-parse", "HEAD").stdout.strip(), self.first) + self.assertEqual((clone / "content").read_text(), "first\n") + self.cli("prepare") + self.assertEqual(self.state()["components"]["App"]["baseline"], self.first) + self.assertTrue((self.root / ".workspace/resolved.json").is_file()) + + def test_edit_registers_branch_and_prepare_preserves_work(self): + self.cli("edit", "--name", "App", "--branch", "feature/change") + clone = self.root / ".workspace/App" + (clone / "content").write_text("my change\n") + self.git(clone, "commit", "-am", "Local work") + self.cli("prepare") + self.assertEqual(self.git(clone, "branch", "--show-current").stdout.strip(), "feature/change") + self.assertEqual((clone / "content").read_text(), "my change\n") + self.cli("unlink", "--name", "App") + self.assertTrue(clone.is_dir()) + + def test_rejects_unknown_component_and_bad_branch_without_source_creation(self): + result = self.cli("edit", "--name", "missing", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertIn("unknown component", result.stdout.lower()) + result = self.cli("edit", "--name", "App", "--branch", "feature/../../escape", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertFalse((self.root / ".workspace/App").exists()) + + def test_rejects_paths_and_symlink_escape(self): + for path in ("../escape", "/tmp/escape", ".workspace/../escape"): + with self.subTest(path=path): + self.manifest["components"][0]["path"] = path + self.save_manifest() + result = self.cli("prepare", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertFalse((self.base / "escape").exists()) + self.manifest["components"][0]["path"] = ".workspace/App" + self.save_manifest() + (self.root / ".workspace").symlink_to(self.author, target_is_directory=True) + result = self.cli("prepare", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertFalse((self.author / "App").exists()) + + def test_rejects_mismatched_origin_dirty_and_git_lock_without_changes(self): + self.cli("prepare") + clone = self.root / ".workspace/App" + self.git(clone, "remote", "set-url", "origin", str(self.base / "wrong.git")) + self.assertNotEqual(self.cli("prepare", check=False).returncode, 0) + self.git(clone, "remote", "set-url", "origin", str(self.remote)) + (clone / "unique").write_text("unsaved\n") + self.assertNotEqual(self.cli("edit", "--name", "App", check=False).returncode, 0) + self.assertEqual((clone / "unique").read_text(), "unsaved\n") + (clone / "unique").unlink() + lock = clone / ".git/index.lock" + lock.write_text("owned by another operation\n") + self.assertNotEqual(self.cli("edit", "--name", "App", check=False).returncode, 0) + self.assertEqual(lock.read_text(), "owned by another operation\n") + + def test_ignored_unique_files_and_shared_worktrees_block_branch_changes(self): + self.cli("prepare") + clone = self.root / ".workspace/App" + (clone / "private").mkdir() + (clone / "private/key").write_text("unique\n") + self.assertNotEqual(self.cli("edit", "--name", "App", check=False).returncode, 0) + shutil.rmtree(clone / "private") + external = self.base / "other-owner" + self.git(clone, "worktree", "add", "-b", "feature/other", str(external)) + result = self.cli("edit", "--name", "App", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertEqual(self.git(external, "branch", "--show-current").stdout.strip(), "feature/other") + + def test_workspace_operation_lock_and_user_go_work_are_preserved(self): + area = self.root / ".workspace" + area.mkdir() + lock = area / ".operation.lock" + lock.write_text("other writer\n") + result = self.cli("prepare", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertEqual(lock.read_text(), "other writer\n") + lock.unlink() + (self.root / "go.work").write_text("go 1.27\n// manual\n") + result = self.cli("edit", "--name", "App", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertEqual((self.root / "go.work").read_text(), "go 1.27\n// manual\n") + + def test_partial_initialization_is_retained_and_retry_is_safe(self): + self.lock["components"]["App"]["commit"] = "a" * 40 + self.save_manifest() + result = self.cli("prepare", check=False) + self.assertNotEqual(result.returncode, 0) + clone = self.root / ".workspace/App" + self.assertTrue((clone / ".git").exists(), result.stdout) + self.assertFalse((self.root / ".workspace/.operation.lock").exists()) + self.lock["components"]["App"]["commit"] = self.first + self.save_manifest() + self.cli("prepare") + self.assertEqual(self.git(clone, "rev-parse", "HEAD").stdout.strip(), self.first) + + def legacy(self): + self.git(self.root, "submodule", "add", str(self.remote), "modules/App") + self.git(self.root, "commit", "-am", "Pin legacy component") + return self.root / "modules/App" + + def fingerprint(self, path): + files = {} + for file in path.rglob("*"): + if ".git" not in file.relative_to(path).parts and file.is_file(): + files[str(file.relative_to(path))] = hashlib.sha256(file.read_bytes()).hexdigest() + return (self.git(path, "show-ref").stdout, self.git(path, "status", "--porcelain=v1").stdout, files) + + def test_transition_report_is_readonly_apply_preserves_unique_commits_refs_and_files(self): + legacy = self.legacy() + self.git(legacy, "checkout", "-b", "feature/legacy") + (legacy / "content").write_text("unpublished commit\n") + self.git(legacy, "commit", "-am", "Unpublished") + unique_head = self.git(legacy, "rev-parse", "HEAD").stdout.strip() + self.git(legacy, "branch", "feature/other-ref") + (legacy / "content").write_text("uncommitted\n") + (legacy / "unique").write_text("untracked\n") + (legacy / "private").mkdir() + (legacy / "private/data").write_text("ignored\n") + before = self.fingerprint(legacy) + report = json.loads(self.cli("transition", "--name", "App").stdout) + self.assertEqual(report["components"]["App"]["legacy"]["head"], unique_head) + self.assertFalse((self.root / ".workspace").exists()) + self.cli("transition", "--name", "App", "--apply") + clone = self.root / ".workspace/App" + self.assertEqual(self.git(clone, "rev-parse", "HEAD").stdout.strip(), unique_head) + self.assertEqual(self.git(clone, "remote", "get-url", "origin").stdout.strip(), str(self.remote)) + self.assertEqual((clone / "content").read_text(), "uncommitted\n") + self.assertEqual((clone / "unique").read_text(), "untracked\n") + self.assertEqual((clone / "private/data").read_text(), "ignored\n") + self.assertEqual(self.git(clone, "rev-parse", "refs/migration/heads/feature/other-ref").stdout.strip(), unique_head) + self.assertEqual(self.fingerprint(legacy), before) + self.assertFalse((clone / ".git/objects/info/alternates").exists()) + + def test_transition_rejects_external_symlinks_preserving_both_locations(self): + legacy = self.legacy() + outside = self.base / "outside" + outside.write_text("owner data\n") + (legacy / "escape").symlink_to(outside) + before = self.fingerprint(legacy) + result = self.cli("transition", "--name", "App", "--apply", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertEqual(outside.read_text(), "owner data\n") + self.assertEqual(self.fingerprint(legacy), before) + self.assertFalse((self.root / ".workspace/App").exists()) + + def test_library_legacy_baseline_uses_gitlink_not_current_head(self): + legacy = self.legacy() + (legacy / "content").write_text("local newer commit\n") + self.git(legacy, "commit", "-am", "Local advance") + self.manifest["components"][0]["role"] = "go-library" + self.lock["components"] = {} + self.save_manifest() + self.cli("edit", "--name", "App") + self.assertEqual(self.git(self.root / ".workspace/App", "rev-parse", "HEAD").stdout.strip(), self.first) + self.assertEqual((legacy / "content").read_text(), "local newer commit\n") + + def test_status_reports_dirty_and_verify_rejects_it(self): + self.cli("prepare") + clone = self.root / ".workspace/App" + (clone / "content").write_text("unsaved\n") + result = json.loads(self.cli("status").stdout) + self.assertTrue(result["components"]["App"]["actual"]["dirty"]) + self.assertNotEqual(self.cli("verify", check=False).returncode, 0) + self.assertEqual((clone / "content").read_text(), "unsaved\n") + + def test_transition_preserves_staged_blob_internal_symlink_and_reflog_commit(self): + legacy = self.legacy() + (legacy / "content").write_text("orphan commit\n") + self.git(legacy, "commit", "-am", "Reflog-only work") + orphan = self.git(legacy, "rev-parse", "HEAD").stdout.strip() + self.git(legacy, "checkout", "--detach", self.first) + (legacy / "content").write_text("staged value\n") + self.git(legacy, "add", "content") + (legacy / "content").write_text("working value\n") + (legacy / "link").symlink_to("content") + before = self.fingerprint(legacy) + self.cli("transition", "--name", "App", "--apply") + clone = self.root / ".workspace/App" + self.assertEqual(self.git(clone, "show", ":content").stdout, "staged value\n") + self.assertEqual((clone / "content").read_text(), "working value\n") + self.assertTrue((clone / "link").is_symlink()) + self.assertEqual(os.readlink(clone / "link"), "content") + self.assertEqual(self.git(clone, "rev-parse", "refs/migration/reflog/" + orphan).stdout.strip(), orphan) + self.assertEqual(self.fingerprint(legacy), before) + + def test_transition_refuses_initialized_nested_repository(self): + legacy = self.legacy() + nested = legacy / "child" + nested.mkdir() + self.git(nested, "init", "--initial-branch=main") + (nested / "unique").write_text("owned by nested repository\n") + result = self.cli("transition", "--name", "App", "--apply", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertIn("nested repository", result.stdout) + self.assertFalse((self.root / ".workspace/App").exists()) + self.assertEqual((nested / "unique").read_text(), "owned by nested repository\n") + + def nested_legacy(self): + legacy = self.legacy() + errors_remote, _, _ = self.component("Errors", { + "go.mod": "module example.invalid/errors\n\ngo 1.27\n", + "value.go": 'package errors\nfunc Value() string { return "errors" }\n', + ".gitignore": "private/\n"}) + logging_remote, _, _ = self.component("Logging", { + "go.mod": "module example.invalid/logging\n\ngo 1.27\n", + "value.go": 'package logging\nfunc Value() string { return "logging" }\n'}) + self.git(legacy, "submodule", "add", str(errors_remote), "deps/errors") + self.git(legacy, "submodule", "add", str(logging_remote), "deps/logging") + (legacy / "go.mod").write_text("module example.invalid/native\n\ngo 1.27\n\nrequire (\n example.invalid/errors v0.0.0\n example.invalid/logging v0.0.0\n)\nreplace example.invalid/errors => ./deps/errors\nreplace example.invalid/logging => ./deps/logging\n") + (legacy / "main.go").write_text('package main\nimport ("fmt"; errors "example.invalid/errors"; logging "example.invalid/logging")\nfunc main() { fmt.Print(errors.Value()+":"+logging.Value()) }\n') + self.git(legacy, "add", ".") + self.git(legacy, "commit", "-m", "Add registered nested dependencies") + self.manifest["components"][0]["modules"] = [{"path": "example.invalid/native", "directory": "."}] + self.manifest["components"] += [ + self.entry("Errors", errors_remote, "go-library", [{"path": "example.invalid/errors", "directory": "."}]), + self.entry("Logging", logging_remote, "go-library", [{"path": "example.invalid/logging", "directory": "."}])] + self.save_manifest() + return legacy, legacy / "deps/errors", legacy / "deps/logging" + + def test_transition_known_nested_repositories_preserves_external_worktree_and_runs_go(self): + legacy, errors, logging = self.nested_legacy() + self.git(errors, "checkout", "-b", "feature/nested") + (errors / "value.go").write_text('package errors\nfunc Value() string { return "committed" }\n') + self.git(errors, "commit", "-am", "Unpushed nested commit") + errors_head = self.git(errors, "rev-parse", "HEAD").stdout.strip() + (errors / "value.go").write_text('package errors\nfunc Value() string { return "staged" }\n') + self.git(errors, "add", "value.go") + (errors / "value.go").write_text('package errors\nfunc Value() string { return "working" }\n') + (errors / "private").mkdir() + (errors / "private/unique").write_text("nested ignored data\n") + external = self.base / "nested-dependent-worktree" + self.git(errors, "worktree", "add", "-b", "feature/external", str(external)) + before = {str(path): self.fingerprint(path) for path in (legacy, errors, logging, external)} + self.cli("transition", "--name", "App", "--apply") + clone = self.root / ".workspace/Errors" + self.assertEqual(self.git(clone, "rev-parse", "HEAD").stdout.strip(), errors_head) + self.assertIn('return "staged"', self.git(clone, "show", ":value.go").stdout) + self.assertEqual((clone / "private/unique").read_text(), "nested ignored data\n") + self.assertTrue((clone / ".git").is_dir()) + self.assertFalse((clone / ".git/objects/info/alternates").exists()) + self.assertFalse((self.root / ".workspace/App/deps/errors/.git").exists()) + self.assertEqual(self.command(self.root / ".workspace/App", "go", "run", ".").stdout, "working:logging") + for path in (legacy, errors, logging, external): + self.assertEqual(self.fingerprint(path), before[str(path)]) + self.assertTrue(Path(self.git(external, "rev-parse", "--absolute-git-dir").stdout.strip()).exists()) + mapping = self.state()["components"]["App"]["source"]["nested_components"] + self.assertEqual({item["id"] for item in mapping}, {"Errors", "Logging"}) + + def test_conflicting_duplicate_nested_component_stops_before_cloning(self): + legacy, errors, logging = self.nested_legacy() + remote = next(item["repo"] for item in self.manifest["components"] if item["id"] == "Errors") + self.git(legacy, "submodule", "add", remote, "deps/duplicate-errors") + self.git(legacy, "commit", "-am", "Add duplicate logical dependency") + duplicate = legacy / "deps/duplicate-errors" + (duplicate / "value.go").write_text("conflicting unsaved source\n") + before = self.fingerprint(legacy) + result = self.cli("transition", "--name", "App", "--apply", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertIn("conflicting duplicate", result.stdout) + self.assertIn("Errors", result.stdout) + self.assertFalse((self.root / ".workspace/App").exists()) + self.assertFalse((self.root / ".workspace/Errors").exists()) + self.assertEqual(self.fingerprint(legacy), before) + + def test_equivalent_recursive_nested_sources_share_an_independent_component(self): + legacy, errors, logging = self.nested_legacy() + remote = next(item["repo"] for item in self.manifest["components"] if item["id"] == "Errors") + self.git(logging, "submodule", "add", remote, "deps/errors") + (logging / "go.mod").write_text("module example.invalid/logging\n\ngo 1.27\n\nrequire example.invalid/errors v0.0.0\nreplace example.invalid/errors => ./deps/errors\n") + (logging / "value.go").write_text('package logging\nimport errors "example.invalid/errors"\nfunc Value() string { return "logging:"+errors.Value() }\n') + self.git(logging, "add", ".") + self.git(logging, "commit", "-m", "Add recursive registered dependency") + self.git(legacy, "add", "deps/logging") + self.git(legacy, "commit", "-m", "Pin recursive logging candidate") + duplicate = logging / "deps/errors" + before = {str(path): self.fingerprint(path) for path in (legacy, errors, logging, duplicate)} + self.cli("transition", "--name", "App", "--apply") + self.assertEqual(len(self.state()["components"]["Errors"]["legacy_snapshots"]), 2) + self.assertEqual(self.command(self.root / ".workspace/App", "go", "run", ".").stdout, "errors:logging:errors") + for path in (legacy, errors, logging, duplicate): + self.assertEqual(self.fingerprint(path), before[str(path)]) + + def npm_fixture(self): + remote, author, head = self.component("UI", {"package.json": '{"name":"@agent-system/ui","version":"0.0.0"}\n'}) + (author / "package.json").write_text('{"name":"@agent-system/ui","version":"0.0.1"}\n') + self.git(author, "commit", "-am", "Advance UI remote beyond consumer lock") + self.git(author, "push", "origin", "main") + (self.author / "package-lock.json").write_text(json.dumps({"name": "frontend", "lockfileVersion": 3, + "packages": {"": {"dependencies": {"@agent-system/ui": "git+file://" + str(remote) + "#" + head}}, + "node_modules/@agent-system/ui": {"version": "0.0.0", "resolved": "git+file://" + str(remote) + "#" + head}}})) + self.git(self.author, "add", "package-lock.json") + self.git(self.author, "commit", "-m", "Lock UI package") + self.git(self.author, "push", "origin", "main") + self.lock["components"]["App"]["commit"] = self.git(self.author, "rev-parse", "HEAD").stdout.strip() + entry = self.entry("UI", remote, "npm-library") + entry["package_name"] = "@agent-system/ui" + self.manifest["components"].append(entry) + self.save_manifest() + return remote, author, head + + def test_npm_library_edit_uses_consumer_lock_git_sha_not_remote_main(self): + _, _, head = self.npm_fixture() + self.cli("edit", "--name", "UI") + clone = self.root / ".workspace/UI" + self.assertEqual(self.git(clone, "rev-parse", "HEAD").stdout.strip(), head) + self.assertEqual(json.loads((clone / "package.json").read_text())["version"], "0.0.0") + self.assertEqual(self.state()["components"]["UI"]["source"]["kind"], "npm-lock") + self.assertFalse((self.root / "go.work").exists()) + + def test_npm_library_rejects_wrong_lock_origin_and_competing_manual_lock(self): + remote, _, head = self.npm_fixture() + self.lock["components"]["UI"] = {"commit": head} + self.save_manifest() + result = self.cli("edit", "--name", "UI", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertIn("competing", result.stdout) + self.lock["components"].pop("UI") + self.save_manifest() + self.cli("prepare") + lock_path = self.root / ".workspace/App/package-lock.json" + document = json.loads(lock_path.read_text()) + document["packages"]["node_modules/@agent-system/ui"]["resolved"] = "git+file://" + str(self.base / "unapproved.git") + "#" + head + lock_path.write_text(json.dumps(document)) + result = self.cli("edit", "--name", "UI", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertIn("origin", result.stdout) + self.assertFalse((self.root / ".workspace/UI").exists()) + + def test_unlink_refuses_manual_overlay_changes_without_changing_registration(self): + self.go_fixture() + self.cli("prepare") + consumer = self.root / ".workspace/Consumer" + self.command(consumer, "go", "mod", "download", "all", env=self.env | {"GOWORK": "off"}) + self.cli("edit", "--name", "Native") + overlay = self.root / "go.work" + overlay.write_text(overlay.read_text() + "// manual edit\n") + result = self.cli("unlink", "--name", "Native", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertTrue(self.state()["components"]["Native"]["linked"]) + self.assertTrue(overlay.read_text().endswith("// manual edit\n")) + + def test_missing_fixed_source_never_falls_back_to_remote_main(self): + self.lock["components"] = {} + self.save_manifest() + result = self.cli("prepare", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertFalse((self.root / ".workspace/App").exists()) + + def test_existing_fixed_checkout_is_not_switched_after_lock_change(self): + self.cli("prepare") + (self.author / "content").write_text("advanced version\n") + self.git(self.author, "commit", "-am", "Advance") + self.git(self.author, "push", "origin", "main") + self.lock["components"]["App"]["commit"] = self.git(self.author, "rev-parse", "HEAD").stdout.strip() + self.save_manifest() + result = self.cli("prepare", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertEqual(self.git(self.root / ".workspace/App", "rev-parse", "HEAD").stdout.strip(), self.first) + + def test_private_git_metadata_symlink_is_not_adopted(self): + self.cli("prepare") + clone = self.root / ".workspace/App" + external = self.base / "other-owner-metadata" + (clone / ".git").rename(external) + (clone / ".git").symlink_to(external, target_is_directory=True) + result = self.cli("edit", "--name", "App", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertFalse((external / "refs/heads/feature").exists()) + + def test_git_operation_is_reported_and_not_removed(self): + self.cli("prepare") + operation = self.root / ".workspace/App/.git/MERGE_HEAD" + operation.write_text(self.first + "\n") + result = self.cli("edit", "--name", "App", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertEqual(operation.read_text(), self.first + "\n") + + def test_status_does_not_expose_credentials_from_an_unmatched_actual_origin(self): + self.cli("prepare") + clone = self.root / ".workspace/App" + self.git(clone, "remote", "set-url", "origin", "https://owner:workspace-fake-secret@example.invalid/repo.git") + result = self.cli("status") + self.assertNotIn("workspace-fake-secret", result.stdout) + self.assertIn("redacted", result.stdout) + + def test_transition_preserves_committed_symlink_deletion_and_file_type_change(self): + legacy = self.legacy() + (legacy / "old-link").symlink_to("content") + (legacy / "regular").write_text("committed file\n") + self.git(legacy, "add", "old-link", "regular") + self.git(legacy, "commit", "-m", "Add two file types") + (legacy / "old-link").unlink() + (legacy / "regular").unlink() + (legacy / "regular").symlink_to("content") + before = self.fingerprint(legacy) + self.cli("transition", "--name", "App", "--apply") + clone = self.root / ".workspace/App" + self.assertFalse((clone / "old-link").is_symlink()) + self.assertTrue((clone / "regular").is_symlink()) + self.assertEqual(self.git(clone, "diff", "--raw").stdout, self.git(legacy, "diff", "--raw").stdout) + self.assertEqual(self.fingerprint(legacy), before) + + def go_fixture(self): + module = "example.invalid/Native" + library_remote, author, head = self.component("Native", { + "go.mod": "module example.invalid/Native\n\ngo 1.27\n", + "value.go": 'package native\nfunc Value() string { return "versioned" }\n'}) + version = "v0.0.0-20261013000000-" + head[:12] + proxy = self.base / "proxy/example.invalid/!native/@v" + proxy.mkdir(parents=True) + (proxy / (version + ".mod")).write_text((author / "go.mod").read_text()) + # Go's real proxy protocol supplies Origin.Hash, avoiding a fake Go executable. + (proxy / (version + ".info")).write_text(json.dumps({"Version": version, + "Time": "2026-10-13T00:00:00Z", "Origin": {"VCS": "git", "URL": str(library_remote), "Hash": head}})) + with zipfile.ZipFile(proxy / (version + ".zip"), "w") as archive: + for filename in ("go.mod", "value.go"): + archive.write(author / filename, module + "@" + version + "/" + filename) + app_remote, _, app_head = self.component("Consumer", { + "go.mod": "module example.invalid/consumer\n\ngo 1.27\n\nrequire " + module + " " + version + "\n", + "main.go": 'package main\nimport ("fmt"; native "example.invalid/Native")\nfunc main() { fmt.Print(native.Value()) }\n'}) + self.manifest["components"] = [self.entry("Consumer", app_remote, modules=[{"path": "example.invalid/consumer", "directory": "."}]), + self.entry("Native", library_remote, "go-library", [{"path": module, "legacy": "native", "directory": "."}])] + self.lock["components"] = {"Consumer": {"commit": app_head}} + self.save_manifest() + self.env.update({"GOPROXY": (self.base / "proxy").as_uri(), "GOMODCACHE": str(self.base / "modcache"), + "GOPATH": str(self.base / "gopath")}) + return head + + def test_actual_go_version_baseline_overlay_and_unlink_restore_version_consumption(self): + head = self.go_fixture() + self.cli("prepare") + consumer = self.root / ".workspace/Consumer" + native = self.root / ".workspace/Native" + self.command(consumer, "go", "mod", "download", "all", env=self.env | {"GOWORK": "off"}) + self.assertEqual(self.command(consumer, "go", "run", "-mod=readonly", ".", env=self.env | {"GOWORK": "off"}).stdout, "versioned") + self.cli("edit", "--name", "Native", "--branch", "feature/value") + self.assertEqual(self.git(native, "rev-parse", "HEAD").stdout.strip(), head) + (native / "value.go").write_text('package native\nfunc Value() string { return "edited" }\n') + self.assertEqual(self.command(consumer, "go", "run", ".").stdout, "edited") + self.assertEqual(self.command(consumer, "go", "run", "-mod=readonly", ".", env=self.env | {"GOWORK": "off"}).stdout, "versioned") + self.cli("unlink", "--name", "Native") + self.assertFalse((self.root / "go.work").exists()) + self.assertEqual(self.command(consumer, "go", "run", "-mod=readonly", ".").stdout, "versioned") + self.assertEqual((native / "value.go").read_text(), 'package native\nfunc Value() string { return "edited" }\n') + + def test_fresh_library_edit_resolves_fixed_consumer_and_preserves_consumer_manifest(self): + head = self.go_fixture() + self.cli("edit", "--name", "Native") + native = self.root / ".workspace/Native" + consumer = self.root / ".workspace/Consumer" + self.assertEqual(self.git(native, "rev-parse", "HEAD").stdout.strip(), head) + self.assertFalse((consumer / "go.sum").exists(), "source resolution must not write a consumer's go.sum") + self.assertEqual(self.git(consumer, "status", "--porcelain=v1").stdout, "") + + def test_library_baseline_resolves_transitive_selected_module(self): + head = self.go_fixture() + native_version = "v0.0.0-20261013000000-" + head[:12] + bridge_remote, bridge_author, bridge_head = self.component("Bridge", { + "go.mod": "module example.invalid/Bridge\n\ngo 1.27\n\nrequire example.invalid/Native " + native_version + "\n", + "value.go": 'package bridge\nimport native "example.invalid/Native"\nfunc Value() string { return native.Value() }\n'}) + bridge_version = "v0.0.0-20261013000000-" + bridge_head[:12] + proxy = self.base / "proxy/example.invalid/!bridge/@v" + proxy.mkdir(parents=True) + (proxy / (bridge_version + ".mod")).write_text((bridge_author / "go.mod").read_text()) + (proxy / (bridge_version + ".info")).write_text(json.dumps({"Version": bridge_version, + "Time": "2026-10-13T00:00:00Z", "Origin": {"VCS": "git", "URL": str(bridge_remote), "Hash": bridge_head}})) + with zipfile.ZipFile(proxy / (bridge_version + ".zip"), "w") as archive: + for filename in ("go.mod", "value.go"): + archive.write(bridge_author / filename, "example.invalid/Bridge@" + bridge_version + "/" + filename) + author = self.base / "Consumer-author" + (author / "go.mod").write_text("module example.invalid/consumer\n\ngo 1.27\n\nrequire example.invalid/Bridge " + bridge_version + "\n") + (author / "main.go").write_text('package main\nimport ("fmt"; bridge "example.invalid/Bridge")\nfunc main() { fmt.Print(bridge.Value()) }\n') + self.git(author, "commit", "-am", "Consume Native transitively") + self.git(author, "push", "origin", "main") + self.lock["components"]["Consumer"]["commit"] = self.git(author, "rev-parse", "HEAD").stdout.strip() + self.save_manifest() + self.cli("edit", "--name", "Native") + self.assertEqual(self.git(self.root / ".workspace/Native", "rev-parse", "HEAD").stdout.strip(), head) + self.assertFalse((self.root / ".workspace/Consumer/go.sum").exists()) + (self.root / ".workspace/Native/value.go").write_text('package native\nfunc Value() string { return "transitive edit" }\n') + self.assertEqual(self.command(self.root / ".workspace/Consumer", "go", "run", ".", separate_stderr=True).stdout, "transitive edit") + + +if __name__ == "__main__": + unittest.main() -- 2.54.0 From 93ac63fb3d3c6d1ba56b0aedda657b73821f3a1e Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 13 Oct 2026 17:18:07 +0000 Subject: [PATCH 09/29] Compose immutable dependency sources and preserve branch transitions Why: Replace repeated submodule source pointers with consumer-owned language versions and fixed application sources, keeping independent repository edits and existing branches intact. Evidence: SELF task receipts contain startup/sync evidence, real Go and npm consumption, Native overlay/unlink, safe transition/ref preservation, credential boundary and historical build regressions. Exact committed full composition and RDM checks follow this checkpoint; formal acceptance and GATE CI remain pending. Impact: Add isolated build/test composition, source provenance and safe owner refresh, adapt governance and service build callers, remove replaced index links while retaining original Git metadata, and adopt reusable dependency standards. Refs: Documents approved dependency-workspace r1/R1-R15 and U1-U7 implementation plan; feature/dependency-workspace task card. --- .gitea/workflows/ci.yaml | 1355 ++-- .gitignore | 7 + .gitmodules | 36 - .task/feature-dependency-workspace.md | 7824 +++++++++++++++++++++++- AGENTS.md | 14 +- Makefile | 144 +- PROJECT.md | 60 +- README.md | 50 +- components.lock.json | 8 +- deps/agent-command | 1 - deps/agent-intent | 1 - deps/agent-native | 1 - deps/agent-squad | 1 - deps/development-guidelines | 1 - deps/error-code-system | 1 - deps/logging-system | 1 - examples/downstream-rdm/README.md | 10 +- examples/downstream-rdm/go.mod | 11 +- examples/downstream-rdm/go.sum | 4 + examples/downstream-rdm/plugin.go | 2 +- examples/downstream-rdm/plugin_test.go | 10 +- modules/backend | 1 - modules/core | 1 - modules/documents | 1 - modules/frontend | 1 - modules/ui | 1 - policy/adoption.md | 20 +- policy/architecture.yaml | 6 +- policy/delivery.md | 2 +- policy/dependencies.md | 52 + policy/governance.md | 16 +- scripts/build-composition.py | 524 ++ scripts/check-pins.sh | 48 + scripts/check-worktree.py | 202 +- scripts/component-check.py | 115 + scripts/component-source.py | 52 + scripts/e2e.sh | 139 +- scripts/lint-architecture.go | 54 +- scripts/lint-architecture.sh | 13 +- scripts/lint-boundaries.sh | 123 +- scripts/svc.sh | 136 +- scripts/task.sh | 25 +- scripts/workspace/cli.py | 51 +- scripts/workspace/common.py | 2 +- scripts/workspace/git.py | 2 +- scripts/workspace/go.py | 9 +- scripts/workspace/transition.py | 45 +- tests/fixtures/rdm-legacy-product.sh | 83 + tests/test_ci_credentials.py | 53 +- tests/test_component_checks.py | 141 + tests/test_composition.py | 474 ++ tests/test_dependency_ci.py | 286 + tests/test_svc_build_cutover.py | 138 + tests/test_workspace.py | 204 + tests/test_workspace_cutover.py | 403 ++ 55 files changed, 12113 insertions(+), 852 deletions(-) delete mode 100644 .gitmodules delete mode 160000 deps/agent-command delete mode 160000 deps/agent-intent delete mode 160000 deps/agent-native delete mode 160000 deps/agent-squad delete mode 160000 deps/development-guidelines delete mode 160000 deps/error-code-system delete mode 160000 deps/logging-system create mode 100644 examples/downstream-rdm/go.sum delete mode 160000 modules/backend delete mode 160000 modules/core delete mode 160000 modules/documents delete mode 160000 modules/frontend delete mode 160000 modules/ui create mode 100644 policy/dependencies.md create mode 100644 scripts/build-composition.py create mode 100644 scripts/component-check.py create mode 100644 scripts/component-source.py create mode 100644 tests/fixtures/rdm-legacy-product.sh create mode 100644 tests/test_component_checks.py create mode 100644 tests/test_composition.py create mode 100644 tests/test_dependency_ci.py create mode 100644 tests/test_svc_build_cutover.py create mode 100644 tests/test_workspace_cutover.py diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 8970e45b..e93208c1 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -10,98 +10,146 @@ jobs: runs-on: ubuntu-latest env: GOPROXY: https://goproxy.cn,direct + GOTOOLCHAIN: local + GOWORK: "off" + GOPRIVATE: git-ssh.u1680832.nyat.app/weichen + GONOSUMDB: git-ssh.u1680832.nyat.app/weichen steps: - name: Checkout env: TOKEN: ${{ secrets.GITHUB_TOKEN }} SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} - run: | + run: &trusted_acquisition_1 | set -euo pipefail - # Credential handling stays inline: no file from the candidate is executed. - # Workflow provenance and runner isolation still require platform controls. - python3 - <<'PY_CHECKOUT' + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json import os from pathlib import Path import re + import shlex import subprocess import sys + import tempfile from urllib.parse import urlsplit - # 服务端基址取运行器注入的 GITHUB_SERVER_URL(平台控制、候选 PR 不可影响)。 - # 2026-10-05 修复(run 948/949 实测):注入值为内网直连形态 - # 'http://172.17.0.1:3000'(docker 网关 → 宿主 Gitea),与公网拼写不同且为 - # http——此前硬编码常量严格比对会拒绝合法检出。校验收宽为「http(s) + 非空 - # netloc」;凭据仍只附着于「该基址 + 下方仓库白名单」构造的 URL。 SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") - parsed_server = urlsplit(SERVER) - if parsed_server.scheme not in {"http", "https"} or not parsed_server.netloc: - sys.exit("Checkout server must be the platform-injected http(s) URL") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" - # Reviewed allowlist, independent of candidate .gitmodules. Add repositories - # here only with an explicit review of the checkout credential's scope. - REPOSITORIES = { - "modules/core": "Agent-System-Core", - "modules/backend": "Agent-System-Backend", - "modules/frontend": "Agent-System-Frontend", - "modules/ui": "Agent-System-UI", - "modules/documents": "Agent-System-Documents", - "deps/agent-system-core": "Agent-System-Core", - "deps/development-guidelines": "Development-Guidelines", - "deps/agent-native": "Agent-Native", - "deps/agent-squad": "Agent-Squad", - "deps/agent-intent": "Agent-Intent", - "deps/agent-command": "Agent-Command", - "deps/error-code-system": "Error-Code-System", - "deps/logging-system": "Logging-System", + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} root_token = os.environ.pop("TOKEN", "") component_token = os.environ.pop("SUBMODULE_TOKEN", "") - if not root_token or not component_token: - sys.exit("Checkout requires TOKEN and SUBMODULE_TOKEN") - if os.environ.get("GITHUB_REPOSITORY") != "weichen/Agent-System-Dev": - sys.exit("Checkout repository is outside the reviewed allowlist") - sha = os.environ.get("GITHUB_SHA", "") - if not re.fullmatch(r"[0-9a-fA-F]{40}", sha): - sys.exit("Checkout requires a fixed commit SHA") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" - # Discard inherited Git tracing/config/SSH hooks. Auth lives only in one - # Git process tree, in an exact URL-scoped header, never in a URL or file. - clean_env = {k: v for k, v in os.environ.items() if not k.startswith("GIT_")} - clean_env.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", - GIT_CONFIG_GLOBAL="/dev/null", GIT_TERMINAL_PROMPT="0") - config = { - "core.hooksPath": "/dev/null", "core.fsmonitor": "false", - "init.templateDir": "", "credential.helper": "", - "fetch.recurseSubmodules": "false", "submodule.recurse": "false", - "http.followRedirects": "false", "protocol.allow": "never", - "protocol." + urlsplit(SERVER).scheme + ".allow": "always", - } - - - def git(repo, *args, extra=None): - values = config | (extra or {}) - env = clean_env | {"GIT_CONFIG_COUNT": str(len(values))} + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} for index, (key, value) in enumerate(values.items()): env[f"GIT_CONFIG_KEY_{index}"] = key env[f"GIT_CONFIG_VALUE_{index}"] = value - return subprocess.run(["git", "-C", str(repo), *args], env=env, - check=True, stdout=subprocess.PIPE).stdout + return env + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout - def materialize(repo, depth=0): - if depth > 16: - raise ValueError("Submodule depth exceeds the reviewed checkout limit") - links = {} - for entry in git(repo, "ls-tree", "-rz", "HEAD").split(b"\0"): - if not entry: + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): continue - metadata, path = entry.split(b"\t", 1) - mode, kind, commit = metadata.decode().split() - if mode == "160000": - links[path.decode()] = commit + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def materialize_legacy(directory, depth=0): + if depth > 16: + raise ValueError("Historical submodule depth exceeds the checkout limit") + links = {} + for entry in git(directory, "ls-tree", "-rz", "HEAD").split(b"\0"): + if entry: + metadata, path = entry.split(b"\t", 1) + mode, kind, commit = metadata.decode().split() + if mode == "160000": + links[path.decode()] = commit if not links: return - raw = git(repo, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list") + raw = git(directory, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list") entries = {} for item in raw.split(b"\0"): if not item: @@ -115,46 +163,98 @@ jobs: raise ValueError("Duplicate candidate .gitmodules setting") entries[name][field] = value if set(entries) != set(links): - raise ValueError("Submodule names must match the fixed gitlink paths") - # Validate the entire level before any authenticated component fetch. + raise ValueError("Submodule names must match fixed gitlink paths") for name, fields in entries.items(): - repository = REPOSITORIES.get(name) - if not repository or fields.get("path") != name: - raise ValueError("Submodule path is outside the reviewed allowlist") - trusted_url = f"{SERVER}/weichen/{repository}.git" - if fields.get("url") not in {SSH + repository + ".git", trusted_url}: - raise ValueError("Submodule URL is outside the reviewed allowlist") + repo = LEGACY.get(name) + if not repo or fields.get("path") != name or fields.get("url") not in { + SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"}: + raise ValueError("Historical submodule source is outside the reviewed allowlist") for name in entries: - url = f"{SERVER}/weichen/{REPOSITORIES[name]}.git" - # Persist only the reviewed public URL so Git recognizes the - # initialized submodule after process-scoped config is gone. - git(repo, "config", f"submodule.{name}.url", url) - git(repo, "submodule", "update", "--init", "--checkout", "--", name, - extra={f"submodule.{name}.url": url, - f"submodule.{name}.update": "checkout", - f"http.{url}.extraheader": "AUTHORIZATION: token " + component_token}) - child = repo / name - if git(child, "rev-parse", "HEAD").decode().strip() != links[name]: - raise ValueError("Materialized submodule does not match the fixed SHA") - materialize(child, depth + 1) + repo = LEGACY[name] + sha = links[name] + url = f"{SERVER}/weichen/{repo}.git" + git(directory, "config", f"submodule.{name}.url", url) + # Trusted explicit checkout prevents candidate update commands from running. + git(directory, "submodule", "update", "--init", "--checkout", "--", name, token=component_token, repo=repo) + child = directory / name + if git(child, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Historical submodule does not match its fixed SHA") + mirror(repo, sha, component_token) + materialize_legacy(child, depth + 1) + def materialize_manifest(directory): + manifest = directory / "components.json" + lock = directory / "components.lock.json" + if not manifest.exists() and not lock.exists(): + materialize_legacy(directory) + return + data = json.loads(manifest.read_text()) + locked = json.loads(lock.read_text()) + if data.get("schema") != 1 or locked.get("schema") != 1: + raise ValueError("Unsupported source manifest schema") + entries = {} + for item in data["components"]: + repo = item["id"] + path = ".workspace/" + repo + if (repo not in REPOS or repo in entries or item["path"] != path or + item["repo"] not in {SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"} or + item.get("role") not in {"go-library", "npm-library", "application", "guidelines", "documentation"}): + raise ValueError("Candidate source manifest is outside the reviewed allowlist") + for module in item.get("modules", []): + if module.get("path") not in GO_MODULES or not module["path"].startswith(GO_PREFIX + repo + ".git"): + raise ValueError("Candidate module mapping is outside the reviewed allowlist") + entries[repo] = item + selected = locked["components"] + if set(selected) - set(entries): + raise ValueError("Source lock refers to an unregistered repository") + for repo, item in entries.items(): + if item["role"] in {"application", "guidelines", "documentation"} and repo not in selected: + raise ValueError("Application and documentation source needs a fixed lock") + for repo, pin in selected.items(): + fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + if destination.exists() or destination.is_symlink() or destination.parent.is_symlink(): + raise ValueError("Source materialization requires a fresh destination") + # Validate the complete lock before any authenticated component fetch. + for repo, pin in selected.items(): + sha = fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + destination.mkdir(parents=True) + url = f"{SERVER}/weichen/{repo}.git" + git(destination, "init", "-q") + git(destination, "remote", "add", "origin", url) + git(destination, "fetch", "--depth=1", "origin", sha, token=component_token, repo=repo) + git(destination, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(destination, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Materialized source differs from the fixed lock") + # Persist the registered identity; process config chooses the transport. + git(destination, "remote", "set-url", "origin", entries[repo]["repo"]) + mirror(repo, sha, component_token) + materialize_legacy(destination) try: - root = Path.cwd() - # An ephemeral clean checkout is required; do not reuse prior Git state. + if os.environ.get("GITHUB_REPOSITORY") != "weichen/Agent-System-Dev": + raise ValueError("Checkout repository is outside the reviewed allowlist") + sha = fixed_sha(os.environ.get("GITHUB_SHA", "")) + if not root_token: + raise ValueError("Checkout requires TOKEN") if (root / ".git").exists(): raise ValueError("Checkout requires a fresh workspace") git(root, "init", "-q") - url = SERVER + "/weichen/Agent-System-Dev.git" - git(root, "remote", "add", "origin", url) - git(root, "fetch", "--depth=1", "origin", sha, - extra={f"http.{url}.extraheader": "AUTHORIZATION: token " + root_token}) + git(root, "remote", "add", "origin", SERVER + "/weichen/Agent-System-Dev.git") + git(root, "fetch", "--depth=1", "origin", sha, token=root_token, repo="Agent-System-Dev") git(root, "checkout", "-q", "--detach", "FETCH_HEAD") - materialize(root) - except (ValueError, OSError, subprocess.CalledProcessError) as error: - sys.exit(f"Checkout refused: {error}") - print("Checkout complete; credentials were not persisted in Git configuration") - PY_CHECKOUT + if git(root, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Checked-out commit differs from the platform commit") + if (root / ".ci-mirrors").exists() or (root / ".ci-mirrors.env").exists(): + raise ValueError("Candidate cannot provide trusted prefetch state") + materialize_manifest(root) + mirror_env() + except (ValueError, KeyError, OSError, subprocess.CalledProcessError) as error: + # Do not print child stderr or environment: a failed credential fetch stays redacted. + sys.exit("Checkout refused: " + str(error)) + print("Fixed source checkout complete; credentials were not persisted") + PY_TRUSTED unset TOKEN SUBMODULE_TOKEN - name: Install Go 1.27.1 run: | @@ -163,17 +263,451 @@ jobs: tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz" ln -sfn /usr/local/go/bin/go /usr/local/bin/go ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt + - name: Prefetch Go modules without executing candidate code + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_2 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def source_roots(): + bases = [root] + composition = root / ".ci-composition-dev" + if composition.is_dir() and not composition.is_symlink(): + bases.append(composition) + paths = [] + for base in bases: + paths += [base, base / "rdm"] + [base / path for path in LEGACY] + [base / ".workspace" / repo for repo in sorted(REPOS)] + return [path for path in paths if path.is_dir() and not path.is_symlink()] + try: + targets = [] + for source in source_roots(): + for suffix in (".", "examples/trace", "adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad"): + directory = source / suffix + if (directory / "go.mod").is_file() and directory.resolve() not in targets: + targets.append(directory.resolve()) + # Parse using the installed local Go tool without credentials or candidate execution. + original_files = {} + for directory in targets: + parsed_mod = json.loads(subprocess.check_output(["go", "mod", "edit", "-json"], cwd=directory, env=clean)) + canonical = parsed_mod["Module"]["Path"].startswith(GO_PREFIX) + for name in ("go.mod", "go.sum"): + dependency_file = directory / name + if dependency_file.is_file(): + original_files[(directory, name)] = dependency_file.read_bytes() + elif canonical and name == "go.sum": + original_files[(directory, name)] = None + for dep in (parsed_mod.get("Require") or []): + path = dep["Path"] + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go dependency is outside the reviewed module mapping") + for replacement in (parsed_mod.get("Replace") or []): + path = replacement["New"]["Path"] + if canonical and not replacement["New"].get("Version"): + raise ValueError("Canonical module cannot acquire a local path replacement") + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go replacement is outside the reviewed module mapping") + auth = config.copy() + for repo in sorted(GO_REPOS): + url = f"{SERVER}/weichen/{repo}.git" + auth[f"url.{url}.insteadOf"] = "https://" + GO_PREFIX + repo + auth[f"http.{url}.extraheader"] = "AUTHORIZATION: token " + component_token + def objects(output): + decoder = json.JSONDecoder() + remaining = output.strip() + while remaining: + item, end = decoder.raw_decode(remaining) + remaining = remaining[end:].lstrip() + yield item + def unchanged(): + for (owner, name), contents in original_files.items(): + dependency_file = owner / name + current = dependency_file.read_bytes() if dependency_file.exists() else None + if current != contents: + raise ValueError("Go acquisition modified a committed Go dependency file: " + str(dependency_file)) + for directory in targets: + # Resolve private go.mod metadata only through exact repository headers; + # validate the complete selected graph before acquiring module zip files. + graph = subprocess.run(["go", "list", "-mod=readonly", "-m", "-json", "all"], cwd=directory, + env=process_env(auth), capture_output=True, text=True) + if graph.returncode: + raise ValueError("Go selected graph resolution failed: " + graph.stderr.strip()) + for item in objects(graph.stdout): + if item.get("Main"): + continue + selected = item.get("Replace") or item + for path in (item.get("Path", ""), selected.get("Path", "")): + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Selected Go module is outside the reviewed mapping") + unchanged() + # Go 1.27 can prune go.sum even under -mod=readonly for this + # metadata-only command. Use a disposable copy, then validate actual + # package loading against the unchanged committed source locks. + local_replacements = json.loads(subprocess.check_output( + ["go", "mod", "edit", "-json"], cwd=directory, env=clean)).get("Replace") or [] + downloaded = "" + if not any(not item["New"].get("Version") for item in local_replacements): + with tempfile.TemporaryDirectory(prefix="ci-go-prefetch-") as temporary: + download_root = Path(temporary) + for name in ("go.mod", "go.sum"): + if (directory / name).is_file(): + (download_root / name).write_bytes((directory / name).read_bytes()) + result = subprocess.run(["go", "mod", "download", "-json"], cwd=download_root, + env=process_env(auth), capture_output=True, text=True) + if result.returncode: + raise ValueError("Go module acquisition failed: " + result.stderr.strip()) + downloaded = result.stdout + unchanged() + for item in objects(downloaded): + path = item.get("Path", "") + if path.startswith(GO_PREFIX): + if path not in GO_MODULES: + raise ValueError("Resolved Go module is outside the reviewed mapping") + repo = path[len(GO_PREFIX):].split(".git", 1)[0] + origin = item.get("Origin") or json.loads(Path(item["Info"]).read_text()).get("Origin") or {} + mirror(repo, fixed_sha(origin.get("Hash")), component_token) + # Package metadata loads actual test/build dependencies without running + # vet, compilers, package init functions or candidate tests. No CGO tools. + packages = subprocess.run(["go", "list", "-mod=readonly", "-deps", "-test", "./..."], cwd=directory, + env=process_env(auth) | {"CGO_ENABLED": "0"}, capture_output=True, text=True) + if packages.returncode: + raise ValueError("Go test/build dependency acquisition failed: " + packages.stderr.strip()) + unchanged() + mirror_env() + except (ValueError, OSError, subprocess.CalledProcessError) as error: + sys.exit("Go prefetch refused: " + str(error)) + print("Go modules cached with GOTOOLCHAIN=local; no candidate code executed") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN - name: Install Node 22 run: | set -euo pipefail curl -fsSL -o "$RUNNER_TEMP/node.tar.xz" https://npmmirror.com/mirrors/node/v22.23.3/node-v22.23.3-linux-x64.tar.xz tar -C /usr/local --strip-components=1 -xJf "$RUNNER_TEMP/node.tar.xz" + - name: Prefetch npm packages without lifecycle scripts + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_3 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def source_roots(): + bases = [root] + composition = root / ".ci-composition-dev" + if composition.is_dir() and not composition.is_symlink(): + bases.append(composition) + paths = [] + for base in bases: + paths += [base, base / "rdm"] + [base / path for path in LEGACY] + [base / ".workspace" / repo for repo in sorted(REPOS)] + return [path for path in paths if path.is_dir() and not path.is_symlink()] + def git_package(value): + if not isinstance(value, str): + return None + if value.startswith(("file:", "link:", "workspace:")): + raise ValueError("Formal npm acquisition cannot consume a local package override") + if value.startswith(("http://", "https://")): + registry = urlsplit(value) + if registry.scheme != "https" or registry.hostname != "registry.npmjs.org" or registry.username or registry.password: + raise ValueError("npm tarball source is outside the reviewed public registry") + elif "/" in value and not value.startswith(("git+", "npm:")): + raise ValueError("npm repository shorthand is outside the fixed-SHA package mapping") + if value.startswith("git+") or value.startswith(("git://", "ssh://", "github:", "gitlab:", "bitbucket:")): + for repo in ("Agent-System-Core", "Agent-System-UI"): + prefix = "git+" + SSH + repo + ".git#" + if value.startswith(prefix): + return repo, fixed_sha(value[len(prefix):]) + raise ValueError("npm Git source is outside the reviewed fixed-SHA package mapping") + return None + + try: + targets = [] + selected = set() + for directory in source_roots(): + if not (directory / "package.json").is_file(): + continue + if (directory / ".npmrc").exists(): + raise ValueError("Candidate .npmrc is not allowed during private dependency acquisition") + package = json.loads((directory / "package.json").read_text()) + lock = json.loads((directory / "package-lock.json").read_text()) + if lock.get("lockfileVersion") not in {2, 3}: + raise ValueError("npm acquisition requires a package lock") + for group in ("dependencies", "devDependencies", "optionalDependencies"): + for value in package.get(group, {}).values(): + found = git_package(value) + if found: + selected.add(found) + for entry in lock.get("packages", {}).values(): + found = git_package(entry.get("resolved")) + if found: + selected.add(found) + for group in ("dependencies", "devDependencies", "optionalDependencies"): + for value in entry.get(group, {}).values(): + found = git_package(value) + if found: + selected.add(found) + targets.append(directory) + # Fetch only registered fixed Git package commits. npm never receives token config. + for repo, sha in sorted(selected): + repository = mirror(repo, sha, component_token) + package = json.loads(git(repository, "show", sha + ":package.json")) + forbidden = {"prepare", "prepack", "prepublish", "prepublishOnly", "preinstall", "install", "postinstall"} + if forbidden & set(package.get("scripts", {})): + raise ValueError("Git package provider must commit outputs without acquisition lifecycle scripts") + if not git(repository, "ls-tree", sha, "package/").strip(): + raise ValueError("Git package provider is missing committed package outputs") + no_auth = mirror_env() + empty_config = tempfile.NamedTemporaryFile(prefix="ci-npm-globalrc-") + for directory in targets: + result = subprocess.run(["npm", "ci", "--ignore-scripts", "--no-audit", "--no-fund", + "--userconfig=/dev/null", "--globalconfig=" + empty_config.name], + cwd=directory, env=no_auth, capture_output=True, text=True) + if result.returncode: + raise ValueError("npm dependency acquisition failed: " + result.stderr.strip()) + except (ValueError, OSError, subprocess.CalledProcessError) as error: + sys.exit("npm prefetch refused: " + str(error)) + print("npm packages cached without credentials or lifecycle execution") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN - name: Install house-style Python packages run: python3 -m pip install --break-system-packages -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx python-pptx openpyxl - name: make test (boundaries, pins, libs, core, backend, frontend, ui, agent-command) - run: make test + run: | + set -euo pipefail + source .ci-mirrors.env + make test - name: Build the single binary - run: make build + run: | + set -euo pipefail + source .ci-mirrors.env + make build # 协作存储方案 U2:真实 PostgreSQL + pgvector + Redis 门禁。 # 缺服务时失败而非跳过(make test-backend-pg 硬校验环境变量); @@ -182,152 +716,16 @@ jobs: runs-on: ubuntu-latest env: GOPROXY: https://goproxy.cn,direct + GOTOOLCHAIN: local + GOWORK: "off" + GOPRIVATE: git-ssh.u1680832.nyat.app/weichen + GONOSUMDB: git-ssh.u1680832.nyat.app/weichen steps: - name: Checkout env: TOKEN: ${{ secrets.GITHUB_TOKEN }} SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} - run: | - set -euo pipefail - # Credential handling stays inline: no file from the candidate is executed. - # Workflow provenance and runner isolation still require platform controls. - python3 - <<'PY_CHECKOUT' - import os - from pathlib import Path - import re - import subprocess - import sys - from urllib.parse import urlsplit - - # 服务端基址取运行器注入的 GITHUB_SERVER_URL(平台控制、候选 PR 不可影响)。 - # 2026-10-05 修复(run 948/949 实测):注入值为内网直连形态 - # 'http://172.17.0.1:3000'(docker 网关 → 宿主 Gitea),与公网拼写不同且为 - # http——此前硬编码常量严格比对会拒绝合法检出。校验收宽为「http(s) + 非空 - # netloc」;凭据仍只附着于「该基址 + 下方仓库白名单」构造的 URL。 - SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") - parsed_server = urlsplit(SERVER) - if parsed_server.scheme not in {"http", "https"} or not parsed_server.netloc: - sys.exit("Checkout server must be the platform-injected http(s) URL") - SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" - # Reviewed allowlist, independent of candidate .gitmodules. Add repositories - # here only with an explicit review of the checkout credential's scope. - REPOSITORIES = { - "modules/core": "Agent-System-Core", - "modules/backend": "Agent-System-Backend", - "modules/frontend": "Agent-System-Frontend", - "modules/ui": "Agent-System-UI", - "modules/documents": "Agent-System-Documents", - "deps/agent-system-core": "Agent-System-Core", - "deps/development-guidelines": "Development-Guidelines", - "deps/agent-native": "Agent-Native", - "deps/agent-squad": "Agent-Squad", - "deps/agent-intent": "Agent-Intent", - "deps/agent-command": "Agent-Command", - "deps/error-code-system": "Error-Code-System", - "deps/logging-system": "Logging-System", - } - root_token = os.environ.pop("TOKEN", "") - component_token = os.environ.pop("SUBMODULE_TOKEN", "") - if not root_token or not component_token: - sys.exit("Checkout requires TOKEN and SUBMODULE_TOKEN") - if os.environ.get("GITHUB_REPOSITORY") != "weichen/Agent-System-Dev": - sys.exit("Checkout repository is outside the reviewed allowlist") - sha = os.environ.get("GITHUB_SHA", "") - if not re.fullmatch(r"[0-9a-fA-F]{40}", sha): - sys.exit("Checkout requires a fixed commit SHA") - - # Discard inherited Git tracing/config/SSH hooks. Auth lives only in one - # Git process tree, in an exact URL-scoped header, never in a URL or file. - clean_env = {k: v for k, v in os.environ.items() if not k.startswith("GIT_")} - clean_env.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", - GIT_CONFIG_GLOBAL="/dev/null", GIT_TERMINAL_PROMPT="0") - config = { - "core.hooksPath": "/dev/null", "core.fsmonitor": "false", - "init.templateDir": "", "credential.helper": "", - "fetch.recurseSubmodules": "false", "submodule.recurse": "false", - "http.followRedirects": "false", "protocol.allow": "never", - "protocol." + urlsplit(SERVER).scheme + ".allow": "always", - } - - - def git(repo, *args, extra=None): - values = config | (extra or {}) - env = clean_env | {"GIT_CONFIG_COUNT": str(len(values))} - for index, (key, value) in enumerate(values.items()): - env[f"GIT_CONFIG_KEY_{index}"] = key - env[f"GIT_CONFIG_VALUE_{index}"] = value - return subprocess.run(["git", "-C", str(repo), *args], env=env, - check=True, stdout=subprocess.PIPE).stdout - - - def materialize(repo, depth=0): - if depth > 16: - raise ValueError("Submodule depth exceeds the reviewed checkout limit") - links = {} - for entry in git(repo, "ls-tree", "-rz", "HEAD").split(b"\0"): - if not entry: - continue - metadata, path = entry.split(b"\t", 1) - mode, kind, commit = metadata.decode().split() - if mode == "160000": - links[path.decode()] = commit - if not links: - return - raw = git(repo, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list") - entries = {} - for item in raw.split(b"\0"): - if not item: - continue - key, value = item.decode().split("\n", 1) - match = re.fullmatch(r"submodule\.(.+)\.(path|url)", key) - if not match: - raise ValueError("Unsupported candidate .gitmodules setting") - name, field = match.groups() - if field in entries.setdefault(name, {}): - raise ValueError("Duplicate candidate .gitmodules setting") - entries[name][field] = value - if set(entries) != set(links): - raise ValueError("Submodule names must match the fixed gitlink paths") - # Validate the entire level before any authenticated component fetch. - for name, fields in entries.items(): - repository = REPOSITORIES.get(name) - if not repository or fields.get("path") != name: - raise ValueError("Submodule path is outside the reviewed allowlist") - trusted_url = f"{SERVER}/weichen/{repository}.git" - if fields.get("url") not in {SSH + repository + ".git", trusted_url}: - raise ValueError("Submodule URL is outside the reviewed allowlist") - for name in entries: - url = f"{SERVER}/weichen/{REPOSITORIES[name]}.git" - # Persist only the reviewed public URL so Git recognizes the - # initialized submodule after process-scoped config is gone. - git(repo, "config", f"submodule.{name}.url", url) - git(repo, "submodule", "update", "--init", "--checkout", "--", name, - extra={f"submodule.{name}.url": url, - f"submodule.{name}.update": "checkout", - f"http.{url}.extraheader": "AUTHORIZATION: token " + component_token}) - child = repo / name - if git(child, "rev-parse", "HEAD").decode().strip() != links[name]: - raise ValueError("Materialized submodule does not match the fixed SHA") - materialize(child, depth + 1) - - - try: - root = Path.cwd() - # An ephemeral clean checkout is required; do not reuse prior Git state. - if (root / ".git").exists(): - raise ValueError("Checkout requires a fresh workspace") - git(root, "init", "-q") - url = SERVER + "/weichen/Agent-System-Dev.git" - git(root, "remote", "add", "origin", url) - git(root, "fetch", "--depth=1", "origin", sha, - extra={f"http.{url}.extraheader": "AUTHORIZATION: token " + root_token}) - git(root, "checkout", "-q", "--detach", "FETCH_HEAD") - materialize(root) - except (ValueError, OSError, subprocess.CalledProcessError) as error: - sys.exit(f"Checkout refused: {error}") - print("Checkout complete; credentials were not persisted in Git configuration") - PY_CHECKOUT - unset TOKEN SUBMODULE_TOKEN + run: *trusted_acquisition_1 - name: Install Go 1.27.1 run: | set -euo pipefail @@ -335,6 +733,10 @@ jobs: tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz" ln -sfn /usr/local/go/bin/go /usr/local/bin/go ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt + - name: Prefetch Go modules without executing candidate code + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: *trusted_acquisition_2 - name: Install house-style Python packages run: python3 -m pip install --break-system-packages -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx python-pptx openpyxl - name: Install PostgreSQL, pgvector and Redis @@ -382,189 +784,137 @@ jobs: - name: Clone Agent-System-RDM with nested pins (reviewed allowlist addition) env: SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} - run: | + run: &trusted_acquisition_4 | set -euo pipefail - # 凭据纪律与 Checkout 块同源:经 GIT_CONFIG_* 环境注入 URL 级 token 头, - # 不落文件/命令行;allowlist 扩项 = Agent-System-RDM 及其 pins(同一 - # 组件集合),由本 PR 评审背书。SSH pins URL 以 insteadOf 改写到受信 - # https 基址后再取。只追加 pin 的三个 40 位 hex,不 source pin 文件。 - SERVER="$(printf '%s' "$GITHUB_SERVER_URL" | sed 's:/*$::')" - scheme="${GITHUB_SERVER_URL%%://*}" - export GIT_CONFIG_COUNT=4 - export GIT_CONFIG_KEY_0="protocol.$scheme.allow" - export GIT_CONFIG_VALUE_0="always" - export GIT_CONFIG_KEY_1="http.$SERVER/.extraheader" - export GIT_CONFIG_VALUE_1="AUTHORIZATION: token $SUBMODULE_TOKEN" - export GIT_CONFIG_KEY_2="url.$SERVER/weichen/.insteadOf" - export GIT_CONFIG_VALUE_2="ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" - export GIT_CONFIG_KEY_3="core.hooksPath" - export GIT_CONFIG_VALUE_3="/dev/null" - git clone --depth=1 "$SERVER/weichen/Agent-System-RDM.git" rdm - mapfile -t pins < <(python3 - <<'PY' - import pathlib - got = {} - for line in pathlib.Path("tests/integration/lifecycle/rdm.pin").read_text().splitlines(): - line = line.strip() - if not line or line.startswith("#") or "=" not in line: - continue - key, value = line.split("=", 1) - if key not in ("sha", "prev_sha", "legacy_sha") or len(value) != 40: - raise SystemExit("rdm.pin rejected") - if any(c not in "0123456789abcdef" for c in value): - raise SystemExit("rdm.pin rejected") - got[key] = value - if set(got) != {"sha", "prev_sha", "legacy_sha"}: - raise SystemExit("rdm.pin rejected") - print(got["prev_sha"]) - print(got["legacy_sha"]) - print(got["sha"]) - PY - ) - [ "${#pins[@]}" -eq 3 ] - # depth=1 会把三个 pin 变成互不相关的浅根,update 会把 prev→sha 误判成分叉。 - # 当前 first-parent 距离是 39,200 留余量,仍不拉全史。 - git -C rdm fetch --depth=200 origin "${pins[@]}" - for rev in "${pins[@]}"; do - git -C rdm checkout --detach "$rev" - git -C rdm submodule update --init --recursive - done - echo "RDM commit: $(git -C rdm rev-parse HEAD)" - unset GIT_CONFIG_COUNT GIT_CONFIG_KEY_0 GIT_CONFIG_VALUE_0 \ - GIT_CONFIG_KEY_1 GIT_CONFIG_VALUE_1 GIT_CONFIG_KEY_2 \ - GIT_CONFIG_VALUE_2 GIT_CONFIG_KEY_3 GIT_CONFIG_VALUE_3 - unset SUBMODULE_TOKEN - : > rdm/pin-build-digests.txt - for rev in "${pins[@]}"; do - git -C rdm checkout --detach "$rev" - make -C rdm build - sha256sum rdm/bin/agent-system-rdm | awk -v rev="$rev" '{print rev, $1}' >> rdm/pin-build-digests.txt - done - - name: Install Node 22 - run: | - set -euo pipefail - curl -fsSL -o "$RUNNER_TEMP/node.tar.xz" https://npmmirror.com/mirrors/node/v22.23.3/node-v22.23.3-linux-x64.tar.xz - tar -C /usr/local --strip-components=1 -xJf "$RUNNER_TEMP/node.tar.xz" - - name: Build the real agent-system binary - run: make build - - name: Real-combination lifecycle gate (make test-lifecycle, required) - env: - AGENT_PG_TEST_DSN: postgres://ci_agent:ci_job_local_only@127.0.0.1:5432/agent_test?sslmode=disable - SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} - run: | - set -euo pipefail - # 路径变量在脚本内解析(YAML env: 不做 shell 展开)。 - # 不设 SVC_RDM_ORIGIN:全轨 git 部署由 svc-realcombo 作业覆盖。 - # pins 物化没有 SSH known_hosts。token 只经 SVC_CI_GIT_TOKEN 进 - # ci_git_env 的 URL 级头,不写文件。 - export SVC_TEST_REAL=1 SVC_TEST_PG=1 - export SVC_REAL_BIN="$PWD/bin/agent-system" - export SVC_REAL_RDM_BIN="$PWD/rdm/bin/agent-system-rdm" - export SVC_RDM_SRC_DIR="$PWD/rdm" - export SVC_CI_GIT_SERVER="$(printf '%s' "$GITHUB_SERVER_URL" | sed 's:/*$::')" - export SVC_CI_GIT_TOKEN="$SUBMODULE_TOKEN" - unset SUBMODULE_TOKEN - make test-lifecycle - - # U3(统一部署方案):真实 Dev/RDM 制品的 svc.sh 生命周期门禁——桩套件 - # (test_svc*.py)只证明脚本逻辑;本作业证明「声明≠能力」的最后一道:真实 - # identity 领养/verify、release 切换、伴生工作台、RDM 全轨部署。缺件即失败, - # 不静默跳过(SVC_TEST_REAL=1 硬开关)。 - svc-realcombo: - runs-on: ubuntu-latest - env: - GOPROXY: https://goproxy.cn,direct - steps: - - name: Checkout - env: - TOKEN: ${{ secrets.GITHUB_TOKEN }} - SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} - run: | - set -euo pipefail - # Credential handling stays inline: no file from the candidate is executed. - # Workflow provenance and runner isolation still require platform controls. - python3 - <<'PY_CHECKOUT' + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json import os from pathlib import Path import re + import shlex import subprocess import sys + import tempfile from urllib.parse import urlsplit - # 服务端基址取运行器注入的 GITHUB_SERVER_URL(平台控制、候选 PR 不可影响)。 - # 2026-10-05 修复(run 948/949 实测):注入值为内网直连形态 - # 'http://172.17.0.1:3000'(docker 网关 → 宿主 Gitea),与公网拼写不同且为 - # http——此前硬编码常量严格比对会拒绝合法检出。校验收宽为「http(s) + 非空 - # netloc」;凭据仍只附着于「该基址 + 下方仓库白名单」构造的 URL。 SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") - parsed_server = urlsplit(SERVER) - if parsed_server.scheme not in {"http", "https"} or not parsed_server.netloc: - sys.exit("Checkout server must be the platform-injected http(s) URL") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" - # Reviewed allowlist, independent of candidate .gitmodules. Add repositories - # here only with an explicit review of the checkout credential's scope. - REPOSITORIES = { - "modules/core": "Agent-System-Core", - "modules/backend": "Agent-System-Backend", - "modules/frontend": "Agent-System-Frontend", - "modules/ui": "Agent-System-UI", - "modules/documents": "Agent-System-Documents", - "deps/agent-system-core": "Agent-System-Core", - "deps/development-guidelines": "Development-Guidelines", - "deps/agent-native": "Agent-Native", - "deps/agent-squad": "Agent-Squad", - "deps/agent-intent": "Agent-Intent", - "deps/agent-command": "Agent-Command", - "deps/error-code-system": "Error-Code-System", - "deps/logging-system": "Logging-System", + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} root_token = os.environ.pop("TOKEN", "") component_token = os.environ.pop("SUBMODULE_TOKEN", "") - if not root_token or not component_token: - sys.exit("Checkout requires TOKEN and SUBMODULE_TOKEN") - if os.environ.get("GITHUB_REPOSITORY") != "weichen/Agent-System-Dev": - sys.exit("Checkout repository is outside the reviewed allowlist") - sha = os.environ.get("GITHUB_SHA", "") - if not re.fullmatch(r"[0-9a-fA-F]{40}", sha): - sys.exit("Checkout requires a fixed commit SHA") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" - # Discard inherited Git tracing/config/SSH hooks. Auth lives only in one - # Git process tree, in an exact URL-scoped header, never in a URL or file. - clean_env = {k: v for k, v in os.environ.items() if not k.startswith("GIT_")} - clean_env.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", - GIT_CONFIG_GLOBAL="/dev/null", GIT_TERMINAL_PROMPT="0") - config = { - "core.hooksPath": "/dev/null", "core.fsmonitor": "false", - "init.templateDir": "", "credential.helper": "", - "fetch.recurseSubmodules": "false", "submodule.recurse": "false", - "http.followRedirects": "false", "protocol.allow": "never", - "protocol." + urlsplit(SERVER).scheme + ".allow": "always", - } - - - def git(repo, *args, extra=None): - values = config | (extra or {}) - env = clean_env | {"GIT_CONFIG_COUNT": str(len(values))} + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} for index, (key, value) in enumerate(values.items()): env[f"GIT_CONFIG_KEY_{index}"] = key env[f"GIT_CONFIG_VALUE_{index}"] = value - return subprocess.run(["git", "-C", str(repo), *args], env=env, - check=True, stdout=subprocess.PIPE).stdout + return env + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout - def materialize(repo, depth=0): - if depth > 16: - raise ValueError("Submodule depth exceeds the reviewed checkout limit") - links = {} - for entry in git(repo, "ls-tree", "-rz", "HEAD").split(b"\0"): - if not entry: + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): continue - metadata, path = entry.split(b"\t", 1) - mode, kind, commit = metadata.decode().split() - if mode == "160000": - links[path.decode()] = commit + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def materialize_legacy(directory, depth=0): + if depth > 16: + raise ValueError("Historical submodule depth exceeds the checkout limit") + links = {} + for entry in git(directory, "ls-tree", "-rz", "HEAD").split(b"\0"): + if entry: + metadata, path = entry.split(b"\t", 1) + mode, kind, commit = metadata.decode().split() + if mode == "160000": + links[path.decode()] = commit if not links: return - raw = git(repo, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list") + raw = git(directory, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list") entries = {} for item in raw.split(b"\0"): if not item: @@ -578,47 +928,121 @@ jobs: raise ValueError("Duplicate candidate .gitmodules setting") entries[name][field] = value if set(entries) != set(links): - raise ValueError("Submodule names must match the fixed gitlink paths") - # Validate the entire level before any authenticated component fetch. + raise ValueError("Submodule names must match fixed gitlink paths") for name, fields in entries.items(): - repository = REPOSITORIES.get(name) - if not repository or fields.get("path") != name: - raise ValueError("Submodule path is outside the reviewed allowlist") - trusted_url = f"{SERVER}/weichen/{repository}.git" - if fields.get("url") not in {SSH + repository + ".git", trusted_url}: - raise ValueError("Submodule URL is outside the reviewed allowlist") + repo = LEGACY.get(name) + if not repo or fields.get("path") != name or fields.get("url") not in { + SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"}: + raise ValueError("Historical submodule source is outside the reviewed allowlist") for name in entries: - url = f"{SERVER}/weichen/{REPOSITORIES[name]}.git" - # Persist only the reviewed public URL so Git recognizes the - # initialized submodule after process-scoped config is gone. - git(repo, "config", f"submodule.{name}.url", url) - git(repo, "submodule", "update", "--init", "--checkout", "--", name, - extra={f"submodule.{name}.url": url, - f"submodule.{name}.update": "checkout", - f"http.{url}.extraheader": "AUTHORIZATION: token " + component_token}) - child = repo / name - if git(child, "rev-parse", "HEAD").decode().strip() != links[name]: - raise ValueError("Materialized submodule does not match the fixed SHA") - materialize(child, depth + 1) - + repo = LEGACY[name] + sha = links[name] + url = f"{SERVER}/weichen/{repo}.git" + git(directory, "config", f"submodule.{name}.url", url) + # Trusted explicit checkout prevents candidate update commands from running. + git(directory, "submodule", "update", "--init", "--checkout", "--", name, token=component_token, repo=repo) + child = directory / name + if git(child, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Historical submodule does not match its fixed SHA") + mirror(repo, sha, component_token) + materialize_legacy(child, depth + 1) try: - root = Path.cwd() - # An ephemeral clean checkout is required; do not reuse prior Git state. - if (root / ".git").exists(): - raise ValueError("Checkout requires a fresh workspace") - git(root, "init", "-q") - url = SERVER + "/weichen/Agent-System-Dev.git" - git(root, "remote", "add", "origin", url) - git(root, "fetch", "--depth=1", "origin", sha, - extra={f"http.{url}.extraheader": "AUTHORIZATION: token " + root_token}) - git(root, "checkout", "-q", "--detach", "FETCH_HEAD") - materialize(root) + pins = {} + for line in (root / "tests/integration/lifecycle/rdm.pin").read_text().splitlines(): + line = line.strip() + if not line or line.startswith("#"): + continue + key, value = line.split("=", 1) + if key not in {"sha", "prev_sha", "legacy_sha"} or key in pins: + raise ValueError("rdm.pin rejected") + pins[key] = fixed_sha(value) + if set(pins) != {"sha", "prev_sha", "legacy_sha"}: + raise ValueError("rdm.pin rejected") + directory = root / "rdm" + if directory.exists(): + raise ValueError("RDM source requires a fresh destination") + directory.mkdir() + git(directory, "init", "-q") + git(directory, "remote", "add", "origin", SERVER + "/weichen/Agent-System-RDM.git") + revisions = [pins[key] for key in ("prev_sha", "legacy_sha", "sha")] + git(directory, "fetch", "--depth=200", "origin", *revisions, token=component_token, repo="Agent-System-RDM") + for sha in revisions: + git(directory, "checkout", "-q", "--detach", sha) + materialize_legacy(directory) + mirror("Agent-System-RDM", sha, component_token) + # Future lifecycle fetches use only local fixed-source mirrors. + git(directory, "remote", "set-url", "origin", (mirrors / "Agent-System-RDM.git").as_uri()) + git(directory, "update-ref", "refs/remotes/origin/main", pins["sha"]) + mirror_env() + (root / ".ci-rdm-pins").write_text("\n".join(revisions) + "\n") except (ValueError, OSError, subprocess.CalledProcessError) as error: - sys.exit(f"Checkout refused: {error}") - print("Checkout complete; credentials were not persisted in Git configuration") - PY_CHECKOUT + sys.exit("RDM fixed source prefetch refused: " + str(error)) + print("RDM historical fixed sources cached; candidate builds run after credentials end") + PY_TRUSTED unset TOKEN SUBMODULE_TOKEN + - name: Prefetch Go modules without executing candidate code + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: *trusted_acquisition_2 + - name: Build fixed RDM pins without credentials + run: | + set -euo pipefail + source .ci-mirrors.env + : > rdm/pin-build-digests.txt + while IFS= read -r rev; do + git -C rdm checkout --detach "$rev" + make -C rdm build + sha256sum rdm/bin/agent-system-rdm | awk -v rev="$rev" '{print rev, $1}' >> rdm/pin-build-digests.txt + done < .ci-rdm-pins + - name: Install Node 22 + run: | + set -euo pipefail + curl -fsSL -o "$RUNNER_TEMP/node.tar.xz" https://npmmirror.com/mirrors/node/v22.23.3/node-v22.23.3-linux-x64.tar.xz + tar -C /usr/local --strip-components=1 -xJf "$RUNNER_TEMP/node.tar.xz" + - name: Prefetch npm packages without lifecycle scripts + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: *trusted_acquisition_3 + - name: Build the real agent-system binary + run: | + set -euo pipefail + source .ci-mirrors.env + make build + - name: Real-combination lifecycle gate (make test-lifecycle, required) + env: + AGENT_PG_TEST_DSN: postgres://ci_agent:ci_job_local_only@127.0.0.1:5432/agent_test?sslmode=disable + run: | + set -euo pipefail + # 路径变量在脚本内解析(YAML env: 不做 shell 展开)。 + # 不设 SVC_RDM_ORIGIN:全轨 git 部署由 svc-realcombo 作业覆盖。 + # Historical pins resolve through prefetched local mirrors; no checkout token. + export SVC_TEST_REAL=1 SVC_TEST_PG=1 + export SVC_REAL_BIN="$PWD/bin/agent-system" + export SVC_REAL_RDM_BIN="$PWD/rdm/bin/agent-system-rdm" + export SVC_RDM_SRC_DIR="$PWD/rdm" + source .ci-mirrors.env + unset TOKEN SUBMODULE_TOKEN SVC_CI_GIT_TOKEN + make test-lifecycle + + # U3(统一部署方案):真实 Dev/RDM 制品的 svc.sh 生命周期门禁——桩套件 + # (test_svc*.py)只证明脚本逻辑;本作业证明「声明≠能力」的最后一道:真实 + # identity 领养/verify、release 切换、伴生工作台、RDM 全轨部署。缺件即失败, + # 不静默跳过(SVC_TEST_REAL=1 硬开关)。 + svc-realcombo: + runs-on: ubuntu-latest + env: + GOPROXY: https://goproxy.cn,direct + GOTOOLCHAIN: local + GOWORK: "off" + GOPRIVATE: git-ssh.u1680832.nyat.app/weichen + GONOSUMDB: git-ssh.u1680832.nyat.app/weichen + steps: + - name: Checkout + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: *trusted_acquisition_1 - name: Install Go 1.27.1 run: | set -euo pipefail @@ -626,46 +1050,43 @@ jobs: tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz" ln -sfn /usr/local/go/bin/go /usr/local/bin/go ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt + - name: Prefetch Go modules without executing candidate code + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: *trusted_acquisition_2 - name: Install Node 22 run: | set -euo pipefail curl -fsSL -o "$RUNNER_TEMP/node.tar.xz" https://npmmirror.com/mirrors/node/v22.23.3/node-v22.23.3-linux-x64.tar.xz tar -C /usr/local --strip-components=1 -xJf "$RUNNER_TEMP/node.tar.xz" + - name: Prefetch npm packages without lifecycle scripts + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: *trusted_acquisition_3 - name: Build the real agent-system binary - run: make build + run: | + set -euo pipefail + source .ci-mirrors.env + make build - name: Clone Agent-System-RDM with nested pins (reviewed allowlist addition) env: SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} - run: | - set -euo pipefail - # 凭据纪律与 Checkout 块同源:经 GIT_CONFIG_* 环境注入 URL 级 token 头, - # 不落文件/命令行;allowlist 扩项 = Agent-System-RDM 及其 pins(同一 - # 组件集合),由本 PR 评审背书。SSH pins URL 以 insteadOf 改写到受信 - # https 基址后再取。 - SERVER="$(printf '%s' "$GITHUB_SERVER_URL" | sed 's:/*$::')" - scheme="${GITHUB_SERVER_URL%%://*}" - export GIT_CONFIG_COUNT=4 - export GIT_CONFIG_KEY_0="protocol.$scheme.allow" - export GIT_CONFIG_VALUE_0="always" - export GIT_CONFIG_KEY_1="http.$SERVER/.extraheader" - export GIT_CONFIG_VALUE_1="AUTHORIZATION: token $SUBMODULE_TOKEN" - export GIT_CONFIG_KEY_2="url.$SERVER/weichen/.insteadOf" - export GIT_CONFIG_VALUE_2="ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" - export GIT_CONFIG_KEY_3="core.hooksPath" - export GIT_CONFIG_VALUE_3="/dev/null" - git clone --depth=1 "$SERVER/weichen/Agent-System-RDM.git" rdm - # 凭据环境须保持到 pins 子模块取完(insteadOf + token 头覆盖嵌套 SSH URL), - # 之后再 unset。 - git -C rdm submodule update --init --recursive - echo "RDM commit: $(git -C rdm rev-parse HEAD)" - unset GIT_CONFIG_COUNT GIT_CONFIG_KEY_0 GIT_CONFIG_VALUE_0 \ - GIT_CONFIG_KEY_1 GIT_CONFIG_VALUE_1 GIT_CONFIG_KEY_2 \ - GIT_CONFIG_VALUE_2 GIT_CONFIG_KEY_3 GIT_CONFIG_VALUE_3 - unset SUBMODULE_TOKEN - make -C rdm build - - name: Run real-combination lifecycle gates (SQLite, U3, required) + run: *trusted_acquisition_4 + - name: Prefetch Go modules without executing candidate code env: SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: *trusted_acquisition_2 + - name: Build fixed RDM pins without credentials + run: | + set -euo pipefail + source .ci-mirrors.env + : > rdm/pin-build-digests.txt + while IFS= read -r rev; do + git -C rdm checkout --detach "$rev" + make -C rdm build + sha256sum rdm/bin/agent-system-rdm | awk -v rev="$rev" '{print rev, $1}' >> rdm/pin-build-digests.txt + done < .ci-rdm-pins + - name: Run real-combination lifecycle gates (SQLite, U3, required) run: | set -euo pipefail # 路径变量在脚本内解析(YAML env: 不做 shell 展开)。 @@ -673,7 +1094,7 @@ jobs: export SVC_REAL_BIN="$PWD/bin/agent-system" export SVC_REAL_RDM_BIN="$PWD/rdm/bin/agent-system-rdm" export SVC_RDM_ORIGIN="$PWD/rdm" - # CI 无 SSH key:把受信基址与 URL 级 token 头经环境交给套件(仅环境传递)。 - export SVC_CI_GIT_SERVER="${GITHUB_SERVER_URL%/}" - export SVC_CI_GIT_TOKEN="${SUBMODULE_TOKEN}" + # Source deployments use prefetched local mirrors without checkout secrets. + source .ci-mirrors.env + unset TOKEN SUBMODULE_TOKEN SVC_CI_GIT_TOKEN python3 -m unittest tests.test_svc_realcombo -v diff --git a/.gitignore b/.gitignore index dd877d3a..bcedfb16 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,10 @@ runtime-backups/ /.workspace/ /go.work /go.work.sum +/.ci-mirrors/ +/.ci-mirrors.env +/.ci-rdm-pins + +# Legacy checkouts remain for explicit owner transition and metadata preservation. +/modules/ +/deps/ diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index f1c67664..00000000 --- a/.gitmodules +++ /dev/null @@ -1,36 +0,0 @@ -[submodule "modules/core"] - path = modules/core - url = ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Core.git -[submodule "modules/backend"] - path = modules/backend - url = ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Backend.git -[submodule "modules/frontend"] - path = modules/frontend - url = ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Frontend.git -[submodule "modules/documents"] - path = modules/documents - url = ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Documents.git -[submodule "deps/development-guidelines"] - path = deps/development-guidelines - url = ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Development-Guidelines.git -[submodule "deps/agent-native"] - path = deps/agent-native - url = ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Native.git -[submodule "deps/agent-squad"] - path = deps/agent-squad - url = ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Squad.git -[submodule "deps/agent-intent"] - path = deps/agent-intent - url = ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Intent.git -[submodule "deps/error-code-system"] - path = deps/error-code-system - url = ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Error-Code-System.git -[submodule "deps/logging-system"] - path = deps/logging-system - url = ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Logging-System.git -[submodule "modules/ui"] - path = modules/ui - url = ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-UI.git -[submodule "deps/agent-command"] - path = deps/agent-command - url = ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Command.git diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md index 384b2fe6..3d045532 100644 --- a/.task/feature-dependency-workspace.md +++ b/.task/feature-dependency-workspace.md @@ -1,13 +1,13 @@ # feature/dependency-workspace 任务卡 -任务主记录:Documents `docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md` r1(本地草案分支 `feature/dependency-workspace-plan`,PR NOT_RUN);状态:等待具体方案与实施顺序评审;owner:Codex(本工作区写者) +任务主记录:Documents `docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md` r1(候选分支 `feature/dependency-workspace-plan`,PR NOT_RUN);状态:已授权实施与自检,组合收尾中;owner:Codex(本工作区写者) ## 基线与授权 - 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= ff3fb4a7ebe432ab21c6b9668abc9823aca2fdd1 - 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace(worktree);分支:feature/dependency-workspace -- 授权与交付终点:用户 2026-10-13 要求实现已讨论的版本化依赖与按需功能仓编辑,并纳入通用/项目规范。本次先完成具体方案与可评审实施顺序;依照 policy/delivery.md 等待对应批准后实施。共享服务部署、版本发布、改写历史、修改分支保护和清理不在本次自动推进范围。 +- 授权与交付终点:用户 2026-10-13 要求实现已讨论的版本化依赖与按需功能仓编辑,并纳入通用/项目规范。具体方案已获本会话批准,计划细化、重构与自检连续推进;正式验收按 policy/delivery.md 保留人工节点。共享服务部署、版本发布、改写历史、修改分支保护和清理不在本次自动推进范围。 - 交付模式:authorized-continuous(实施计划细化、U1–U7 重构与自检;正式验收与高后果边界保留) - 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入) - 自动推进授权:用户本次回答「批准,可以进行重构」;授权范围:上轮提出的计划细化、实施与自检连续推进;授权来源:2026-10-13 当前会话;授权终点:可审实现与自检;停止条件:真实传输试点失败、无法保护现场、超出方案/共享部署/发布范围。 @@ -20,33 +20,33 @@ ## 关联方向与规划 -- 适用状态:新方向,已核对当前项目骨架、库计划入口及 Guidelines 多仓/采纳规则;用户确认目标与启动实施,本文具体规则尚未批准。 +- 适用状态:新方向,已核对当前项目骨架、库计划入口及 Guidelines 多仓/采纳规则;用户批准 r1 方案及重构、自检,追加 R15 在途分支保护。 - 主记录路径/版本:Documents `docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md` r1;分支 `feature/dependency-workspace-plan`。 -- Documents 候选:commit `4a7b929`;独立工作区 `/home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan`。Dev 内 Documents 已恢复固定版本,未推进父仓 gitlink;保留外部工作区及其 Git 管理目录,后续回收须先保存并解除依赖。 -- 对应里程碑:U1–U8,当前仅准备评审产物。 +- Documents 候选:commit `7ba50e5b2dce226b4b962ea787222a4b08f0e94c`;独立工作区 `/home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan`。Documents 由 components.lock.json 显式固定;旧物理检出已保留;保留外部工作区及其 Git 管理目录,后续回收须先保存并解除依赖。 +- 对应里程碑:U1–U8;当前 U1–U7 实施收尾,U8/正式放行待后续节点。 ## 需求分析 | ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 | |---|---|---|---|---|---|---| -| R1–R14 | 唯一需求表见主记录 r1 第 2 节 | 依赖方式与现行 gitlink 规则需同步调整,依据第 1/6 节 | 见实施依赖顺序 | 第 2/8 节 | U1–U7 | 具体需求表待评审 | +| R1–R15 | 唯一需求表见主记录 r1 第 2 节 | 依赖方式与现行 gitlink 规则需同步调整,依据第 1/6 节 | 见实施依赖顺序 | 第 2/8 节 | U1–U7 | r1 已批准;R15 根据本次明确要求纳入 | ## 方案与计划 - 方案引用:Documents 主记录 r1 第 3–6 节(命名、依赖权威、命令、传输与规范归属)。 -- 实施顺序引用:主记录 r1 第 7 节(U1–U8);逐项执行计划在具体方案批准后细化。 +- 实施顺序引用:主记录 r1 第 7 节(U1–U8);逐项执行计划见 Documents 对应 -implementation-plan.md;授权已记录。 - 测试计划引用:主记录 r1 第 2/8 节(需求验收、正常/拒绝/故障路径及诚实出口)。 ## 阶段评审 | 阶段 | 对象版本 | 结论 | 评审人 | 时间 | 依据 | |---|---|---|---|---|---| -| 需求拆解 | 待定 | 未评审 | — | — | — | -| 需求评估 | 待定 | 未评审 | — | — | — | -| 需求表确认 | 待定 | 未评审 | — | — | — | -| 方案设计 | 待定 | 未评审 | — | — | — | -| 实施计划 | 待定 | 未评审 | — | — | — | -| 实施与自检 | 待定 | 未评审 | — | — | — | +| 需求拆解 | r1(4a7b929)+ R15 | 已批准推进 | 用户 weichen | 2026-10-13 | 本会话「批准,可以进行重构」,并要求在途/后续分支平稳过渡 | +| 需求评估 | r1(4a7b929)+ R15 | 已批准推进 | 用户 weichen | 2026-10-13 | 本会话「批准,可以进行重构」,并要求在途/后续分支平稳过渡 | +| 需求表确认 | r1(4a7b929)+ R15 | 已批准推进 | 用户 weichen | 2026-10-13 | 本会话「批准,可以进行重构」,并要求在途/后续分支平稳过渡 | +| 方案设计 | r1(4a7b929)+ R15 | 已批准推进 | 用户 weichen | 2026-10-13 | 本会话「批准,可以进行重构」,并要求在途/后续分支平稳过渡 | +| 实施计划 | U1–U8(30bc86a) | 已授权连续细化/实施 | 用户 weichen | 2026-10-13 | 本会话批准上轮具体方案与实施顺序,覆盖重构、自检 | +| 实施与自检 | 当前任务候选 | 进行中 | Codex;人工正式验收待定 | 2026-10-13 | 原始 SELF 命令收据如下;不等于正式通过 | | 正式测试与验收 | 待定 | 未评审 | — | — | — | | 代码 Review | 待定 | 未评审 | — | — | — | | 合入 | 待定 | 未评审 | — | — | — | @@ -56,7 +56,7 @@ | 增量/试验 | 假设 | 范围 | 判断和停止条件 | 批准依据 | 结果 | 变更影响 | 需重审补测 | |---|---|---|---|---|---|---|---| -| U1 | Go 真实版本下载可替代本地 replace | 两个基础库与隔离消费方 | 来源/传输/子模块不可获取则停止推广 | 具体试点范围待评审 | NOT_RUN | 模块命名和传输 | 通过后判断 U3 推广 | +| U1 | Go 真实版本下载可替代本地 replace | 两个基础库与隔离消费方 | 来源/传输/子模块不可获取则停止推广 | 已批准 r1 | SELF:真实远端 Go 版本调用;原始收据如下 | 模块命名和传输 | 通过后判断 U3 推广 | ## 同步记录 @@ -72,19 +72,16 @@ ## 结果与验证(完成后填写) -- 结果:已准备独立工作区、当前源事实与 Documents r1 候选;未改 Go/npm/CI/部署或现行规范。 -- 验证:启动与同步 SELF 收据由 evidence 写入;文档检查另以 evidence 记录;迁移测试、独立重放和平台 CI 均 NOT_RUN。 -- 影响与剩余项:具体方案批准后细化实施计划并实施;正式验证、Review/PR/合入、规范采纳及清理分别记录。 +- 结果:已实现版本依赖、按需普通 Git 工作区、显式过渡和固定构建的候选;移除已替代 gitlinks 时保留物理目录与 Git 管理数据。源码归属保持独立。 +- 验证:SELF 远端消费、Native 编辑/解除、Go/npm 独立验证及真实仓治理回归收据如下。最终固定组合/new clone/RDM 烟测正在收尾;独立重放、正式验收和平台 CI 尚未放行。 +- 影响与剩余项:完成精确候选组合检查、在途保留和新 clone 重放,再提交可审实现;本次不操作共享服务、数据、发布或他人工作区。 ## 规划进展与下一步 -- 本次推进/剩余:方向落实为 r1 主记录,具体方案、实施顺序及命名待审;U1–U8 NOT_RUN。 -- 首选下一任务:本任务继续完成 r1 的评审与实施计划细化,随后 U1 基础库/下载试点。 -- 推荐依据:先证明脱离本地源码目录的真实消费,再改全部公开 import 与正式构建。 -- 前置条件/待确认:批准具体方案;依照项目规则取得实施计划与对应阶段批准,或明确连续推进授权。 -- 预期产物/验收条件:主记录第 2/7/8 节;仅本地编辑工具不能称完整迁移。 -- 重复任务核对:已核对本地规划索引与源码,未查询所有仓实时 PR;具体 U1 启动前核对相关在途任务,不能声称无重叠。 -- 启动授权:用户已要求启动此方向;后续具体阶段按评审/授权边界继续,不自动扩展到其他项目实施。 +- 当前增量:U1–U7,实际产出与失败/通过证据由下方原始收据记录;不将分工报告等同能力证明。 +- 下一步:冻结组件与 Dev 候选,完成固定组合、RDM 真实产物和普通 clone 检查。正式测试验收、Review/GATE CI/合入仍分别记录。 +- 通用规则候选:Development-Guidelines draft.12,固定内容来源由 components.lock.json 定义,其他项目须独立采纳。 +- 在途保护:仅本任务工作区与独立 .migration 克隆可写;原共享检出、其他任务及外部 worktree 保持原现场。 ## 合入与清理 @@ -94,6 +91,10 @@ - 合入记录:NOT_RUN(交付授权范围、PR、被核验 HEAD、合入 SHA、目标分支及内容核验) - 清理记录:NOT_RUN(授权依据、写者退出确认、worktree/分支/任务卡处置) +## 代码整理(SELF,自检阶段) + +ce-simplify-code 的 reuse/quality/efficiency 三个独立只读扫描完成。采纳已有 digest 的完全等价复用,删除未用内部参数与两处未用 import;不合并有不同信任边界的 CI 校验,不改变 JSON 异常优先级,不引入未经测量的 clone/cache 行为。整理后的实际组合器 fixture 重放由 evidence 记录。此记录不代替正式代码 Review、独立重放或平台准入。 + ```json { @@ -1713,3 +1714,7778 @@ "receipt_sha256": "f013e83d58733e5a62144940ce51659f8413b22691bcf567158bdc5cf7af26b8" } ``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:02:27.297711+00:00", + "command": "python3 -m unittest tests.test_dependency_ci.DependencyCITests.test_npm_nonregistry_tarball_rejected_before_request -v", + "command_sha256": "02db5f46693d9515c45b66c9f2d648efbe1f1155b97ea611325c82ed1a5d5ce4", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "f2d863b4018727a2611ea6d024dddcb5f705ef8d", + "status": " M .gitea/workflows/ci.yaml\n M tests/test_ci_credentials.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n", + "tracked_diff_sha256": "28678c8bcdefbec3a55c274bc7a4fd14ec251e9f27774b8995853d135c2fa4a4", + "untracked": { + "tests/test_composition.py": "4597ab39cb4becc3dbb71009374ec3714ae4464cbd528118c2d2dfdf31fc7940", + "tests/test_dependency_ci.py": "6bb0cd31d8075380e36bfea461780e6cae65692879f26447e648754616622df4" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "state": "missing" + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "state": "missing" + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": null + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "f2d863b4018727a2611ea6d024dddcb5f705ef8d", + "status": " M .gitea/workflows/ci.yaml\n M tests/test_ci_credentials.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n", + "tracked_diff_sha256": "28678c8bcdefbec3a55c274bc7a4fd14ec251e9f27774b8995853d135c2fa4a4", + "untracked": { + "tests/test_composition.py": "4597ab39cb4becc3dbb71009374ec3714ae4464cbd528118c2d2dfdf31fc7940", + "tests/test_dependency_ci.py": "6bb0cd31d8075380e36bfea461780e6cae65692879f26447e648754616622df4" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "state": "missing" + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "state": "missing" + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": null + } + }, + "after_error": null, + "exit_code": 1, + "output": "test_npm_nonregistry_tarball_rejected_before_request (tests.test_dependency_ci.DependencyCITests.test_npm_nonregistry_tarball_rejected_before_request) ... FAIL\n\n======================================================================\nFAIL: test_npm_nonregistry_tarball_rejected_before_request (tests.test_dependency_ci.DependencyCITests.test_npm_nonregistry_tarball_rejected_before_request)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 183, in test_npm_nonregistry_tarball_rejected_before_request\n self.assertFalse(self.requests, \"candidate tarball source was contacted\")\n ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: [('/untrusted/payload.tgz', None)] is not false : candidate tarball source was contacted\n\n----------------------------------------------------------------------\nRan 1 test in 0.685s\n\nFAILED (failures=1)\n", + "output_sha256": "20789c2938cd879995b373650eb01220ee1fcffb8ec4f528a15071ca6f348d90", + "receipt_sha256": "768b14bb05b8c2562f11fd5aa38da9a13872bbd2932cfaf05d848771fb6ec232" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:03:01.518520+00:00", + "command": "python3 -m unittest tests.test_dependency_ci tests.test_ci_credentials -v", + "command_sha256": "aec96627d88bea7de31c0a9715632d3316431ef9b5cd6d15741cb16317092664", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "f2d863b4018727a2611ea6d024dddcb5f705ef8d", + "status": " M .gitea/workflows/ci.yaml\n M .task/feature-dependency-workspace.md\n M tests/test_ci_credentials.py\n?? scripts/build-composition.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n", + "tracked_diff_sha256": "93ba780394d717a1f7c3b51d761ac7fa1bf0370fd384c9c03b6889d667b60a1a", + "untracked": { + "scripts/build-composition.py": "e3857af9ac127c9a57860ef2119d21d6921e72f8e2defc50c7d3293bef4c172d", + "tests/test_composition.py": "4597ab39cb4becc3dbb71009374ec3714ae4464cbd528118c2d2dfdf31fc7940", + "tests/test_dependency_ci.py": "6bb0cd31d8075380e36bfea461780e6cae65692879f26447e648754616622df4" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "state": "missing" + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "state": "missing" + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": null + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "f2d863b4018727a2611ea6d024dddcb5f705ef8d", + "status": " M .gitea/workflows/ci.yaml\n M .task/feature-dependency-workspace.md\n M tests/test_ci_credentials.py\n?? scripts/build-composition.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n", + "tracked_diff_sha256": "93ba780394d717a1f7c3b51d761ac7fa1bf0370fd384c9c03b6889d667b60a1a", + "untracked": { + "scripts/build-composition.py": "e3857af9ac127c9a57860ef2119d21d6921e72f8e2defc50c7d3293bef4c172d", + "tests/test_composition.py": "4597ab39cb4becc3dbb71009374ec3714ae4464cbd528118c2d2dfdf31fc7940", + "tests/test_dependency_ci.py": "6bb0cd31d8075380e36bfea461780e6cae65692879f26447e648754616622df4" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "state": "missing" + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "state": "missing" + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": null + } + }, + "after_error": null, + "exit_code": 0, + "output": "test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) ... ok\ntest_external_npm_git_source_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_external_npm_git_source_rejected_before_authenticated_request) ... ok\ntest_go_prefetch_uses_only_registered_private_repo_and_local_toolchain (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain) ... ok\ntest_go_requirement_for_new_toolchain_fails_without_downloading_one (tests.test_dependency_ci.DependencyCITests.test_go_requirement_for_new_toolchain_fails_without_downloading_one) ... ok\ntest_npm_git_package_installs_committed_output_without_prepare (tests.test_dependency_ci.DependencyCITests.test_npm_git_package_installs_committed_output_without_prepare) ... ok\ntest_npm_nonregistry_tarball_rejected_before_request (tests.test_dependency_ci.DependencyCITests.test_npm_nonregistry_tarball_rejected_before_request) ... ok\ntest_npm_provider_prepare_is_rejected_without_execution (tests.test_dependency_ci.DependencyCITests.test_npm_provider_prepare_is_rejected_without_execution) ... ok\ntest_registered_application_lock_materializes_fixed_source (tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source) ... ok\ntest_unregistered_go_module_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_unregistered_go_module_rejected_before_authenticated_request) ... ok\ntest_unregistered_source_lock_is_rejected_before_component_fetch (tests.test_dependency_ci.DependencyCITests.test_unregistered_source_lock_is_rejected_before_component_fetch) ... ok\ntest_candidate_cannot_read_checkout_credentials (tests.test_ci_credentials.CheckoutTests.test_candidate_cannot_read_checkout_credentials) ... ok\ntest_candidate_submodule_update_commands_are_rejected (tests.test_ci_credentials.CheckoutTests.test_candidate_submodule_update_commands_are_rejected) ... ok\ntest_credential_destination_confined_to_injected_server (tests.test_ci_credentials.CheckoutTests.test_credential_destination_confined_to_injected_server) ... ok\ntest_external_or_unlisted_urls_are_rejected_before_component_fetch (tests.test_ci_credentials.CheckoutTests.test_external_or_unlisted_urls_are_rejected_before_component_fetch) ... ok\ntest_inherited_template_hook_does_not_execute_with_credentials (tests.test_ci_credentials.CheckoutTests.test_inherited_template_hook_does_not_execute_with_credentials) ... ok\ntest_nested_external_url_is_rejected_before_authenticated_fetch (tests.test_ci_credentials.CheckoutTests.test_nested_external_url_is_rejected_before_authenticated_fetch) ... ok\ntest_rdm_pin_fetch_is_three_shas_on_the_allowlist (tests.test_ci_credentials.CheckoutTests.test_rdm_pin_fetch_is_three_shas_on_the_allowlist) ... ok\ntest_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials (tests.test_ci_credentials.CheckoutTests.test_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials) ... ok\ntest_redirects_do_not_forward_credential_or_fetch_unlisted_target (tests.test_ci_credentials.CheckoutTests.test_redirects_do_not_forward_credential_or_fetch_unlisted_target) ... ok\n\n----------------------------------------------------------------------\nRan 19 tests in 12.308s\n\nOK\n", + "output_sha256": "165718cd4b5facd7b9f287130e1767623b91f79964dd3eebb505ca4a5c2fb929", + "receipt_sha256": "47291e17e45f367d6d6233bb1f2d7771090e0df9cbf9fdfae1bcf7c08457be51" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:07:19.935551+00:00", + "command": "python3 scripts/workspace.py prepare --name Agent-System-Backend && python3 scripts/workspace.py prepare --name Agent-System-Frontend", + "command_sha256": "d86d9caef18cf35931c5b77f818bb36656b52f326724e72ff74aaadb06ee1bc8", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "f2d863b4018727a2611ea6d024dddcb5f705ef8d", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\n M .task/feature-dependency-workspace.md\n M scripts/check-worktree.py\n M scripts/task.sh\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "c3600af7d54065adb1dd07dafe38af3cf086a009b9bfa17a3c708256066aa054", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "a9e5fcc670188e53e2762e51d9db6d2978ecfbb2e0a9f778bd8c60e4858fae25", + "tests/test_composition.py": "14c24d9bd5b960de642860604a8cd4ba10eea2ca8fb80a6c65017114a053861d", + "tests/test_dependency_ci.py": "6bb0cd31d8075380e36bfea461780e6cae65692879f26447e648754616622df4", + "tests/test_workspace_cutover.py": "c613265e7acb36c33a56e2762be33b0cf913d1644b06ac9996f9ea45a6403cc5" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "state": "missing" + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "state": "missing" + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": null + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "f2d863b4018727a2611ea6d024dddcb5f705ef8d", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\n M .task/feature-dependency-workspace.md\n M scripts/check-worktree.py\n M scripts/task.sh\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "c3600af7d54065adb1dd07dafe38af3cf086a009b9bfa17a3c708256066aa054", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "a9e5fcc670188e53e2762e51d9db6d2978ecfbb2e0a9f778bd8c60e4858fae25", + "tests/test_composition.py": "14c24d9bd5b960de642860604a8cd4ba10eea2ca8fb80a6c65017114a053861d", + "tests/test_dependency_ci.py": "6bb0cd31d8075380e36bfea461780e6cae65692879f26447e648754616622df4", + "tests/test_workspace_cutover.py": "c613265e7acb36c33a56e2762be33b0cf913d1644b06ac9996f9ea45a6403cc5" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": "5687d2501994196f62d1d00cb2318804c1a64a7e4b3f4ea0134f8ec823d944ac" + } + }, + "after_error": null, + "exit_code": 0, + "output": "{\n \"components\": {\n \"Agent-System-Backend\": {\n \"actual\": {\n \"branch\": null,\n \"changes\": [],\n \"common_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Backend/.git\",\n \"dirty\": false,\n \"git_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Backend/.git\",\n \"head\": \"f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c\",\n \"ignored\": [],\n \"locks\": [],\n \"operations\": [],\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Backend.git\",\n \"worktrees\": [\n \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Backend\"\n ]\n },\n \"declared\": {\n \"commit\": \"f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c\"\n },\n \"path\": \".workspace/Agent-System-Backend\",\n \"registered\": {\n \"baseline\": \"f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c\",\n \"branch\": null,\n \"linked\": false,\n \"mode\": \"versioned\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Backend.git\",\n \"owner_root\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace\",\n \"path\": \".workspace/Agent-System-Backend\",\n \"source\": {\n \"kind\": \"source-lock\"\n }\n },\n \"repo\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Backend.git\",\n \"role\": \"application\"\n }\n },\n \"go_work\": null,\n \"root\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace\",\n \"schema\": 1\n}\n{\n \"components\": {\n \"Agent-System-Frontend\": {\n \"actual\": {\n \"branch\": null,\n \"changes\": [],\n \"common_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Frontend/.git\",\n \"dirty\": false,\n \"git_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Frontend/.git\",\n \"head\": \"ad53e90a8542143104ddc7f759c8f8e7b7001924\",\n \"ignored\": [],\n \"locks\": [],\n \"operations\": [],\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Frontend.git\",\n \"worktrees\": [\n \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Frontend\"\n ]\n },\n \"declared\": {\n \"commit\": \"ad53e90a8542143104ddc7f759c8f8e7b7001924\"\n },\n \"path\": \".workspace/Agent-System-Frontend\",\n \"registered\": {\n \"baseline\": \"ad53e90a8542143104ddc7f759c8f8e7b7001924\",\n \"branch\": null,\n \"linked\": false,\n \"mode\": \"versioned\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Frontend.git\",\n \"owner_root\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace\",\n \"path\": \".workspace/Agent-System-Frontend\",\n \"source\": {\n \"kind\": \"source-lock\"\n }\n },\n \"repo\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Frontend.git\",\n \"role\": \"application\"\n }\n },\n \"go_work\": null,\n \"root\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace\",\n \"schema\": 1\n}\n", + "output_sha256": "927cad1680600910e59cda5f7954127b032a192ac43442270283459825bde8b5", + "receipt_sha256": "b816da95bd914846812a86f7c70b4a6c14394a088eb2293cecce73f5fed74f67" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:03:51.096038+00:00", + "command": "make test-governance", + "command_sha256": "9776a8dfcfb8f4c95abc94c40cae3a2c0e91e8f4b91fe95d98085c290e929158", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "f2d863b4018727a2611ea6d024dddcb5f705ef8d", + "status": " M .gitea/workflows/ci.yaml\n M .task/feature-dependency-workspace.md\n M tests/test_ci_credentials.py\n?? scripts/build-composition.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n", + "tracked_diff_sha256": "47d7d9455b548644784d293f0fbeb1a6d0da805191754b335fdfc7049f75af9a", + "untracked": { + "scripts/build-composition.py": "e3857af9ac127c9a57860ef2119d21d6921e72f8e2defc50c7d3293bef4c172d", + "tests/test_composition.py": "4597ab39cb4becc3dbb71009374ec3714ae4464cbd528118c2d2dfdf31fc7940", + "tests/test_dependency_ci.py": "6bb0cd31d8075380e36bfea461780e6cae65692879f26447e648754616622df4" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "state": "missing" + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "state": "missing" + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": null + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "f2d863b4018727a2611ea6d024dddcb5f705ef8d", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\n M .task/feature-dependency-workspace.md\n M scripts/check-worktree.py\n M scripts/task.sh\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "66a7a1ee16056052d643dcf78e71d31584a2d9da6663161b005d61cb14434a40", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "a9e5fcc670188e53e2762e51d9db6d2978ecfbb2e0a9f778bd8c60e4858fae25", + "tests/test_composition.py": "14c24d9bd5b960de642860604a8cd4ba10eea2ca8fb80a6c65017114a053861d", + "tests/test_dependency_ci.py": "6bb0cd31d8075380e36bfea461780e6cae65692879f26447e648754616622df4", + "tests/test_workspace_cutover.py": "c613265e7acb36c33a56e2762be33b0cf913d1644b06ac9996f9ea45a6403cc5" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": "5687d2501994196f62d1d00cb2318804c1a64a7e4b3f4ea0134f8ec823d944ac" + } + }, + "after_error": null, + "exit_code": 0, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\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_before_sync_rejects_component_git_lock (test_component_governance.ComponentGovernanceTests.test_before_sync_rejects_component_git_lock) ... ok\ntest_evidence_captures_ignored_component_revision_and_dirty_bytes (test_component_governance.ComponentGovernanceTests.test_evidence_captures_ignored_component_revision_and_dirty_bytes) ... ok\ntest_receipts_reject_component_path_escape (test_component_governance.ComponentGovernanceTests.test_receipts_reject_component_path_escape) ... ok\ntest_dirty_root_lock_is_rejected (test_composition.CompositionTests.test_dirty_root_lock_is_rejected) ... ok\ntest_fixed_commits_embed_assets_without_touching_developer_checkout (test_composition.CompositionTests.test_fixed_commits_embed_assets_without_touching_developer_checkout) ... ok\ntest_local_go_replace_is_rejected (test_composition.CompositionTests.test_local_go_replace_is_rejected) ... ok\ntest_locked_missing_revision_is_rejected (test_composition.CompositionTests.test_locked_missing_revision_is_rejected) ... ok\ntest_missing_frontend_assets_fails_before_publishing_binary (test_composition.CompositionTests.test_missing_frontend_assets_fails_before_publishing_binary) ... ok\ntest_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache (test_composition.CompositionTests.test_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache) ... ok\ntest_source_path_escape_is_rejected (test_composition.CompositionTests.test_source_path_escape_is_rejected) ... ok\ntest_test_target_runs_real_frontend_and_go_tests (test_composition.CompositionTests.test_test_target_runs_real_frontend_and_go_tests) ... ok\ntest_component_checkout_removes_tokens_before_candidate_executes (test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) ... ok\ntest_external_npm_git_source_rejected_before_authenticated_request (test_dependency_ci.DependencyCITests.test_external_npm_git_source_rejected_before_authenticated_request) ... ok\ntest_go_prefetch_uses_only_registered_private_repo_and_local_toolchain (test_dependency_ci.DependencyCITests.test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain) ... ok\ntest_go_requirement_for_new_toolchain_fails_without_downloading_one (test_dependency_ci.DependencyCITests.test_go_requirement_for_new_toolchain_fails_without_downloading_one) ... ok\ntest_npm_git_package_installs_committed_output_without_prepare (test_dependency_ci.DependencyCITests.test_npm_git_package_installs_committed_output_without_prepare) ... ok\ntest_npm_nonregistry_tarball_rejected_before_request (test_dependency_ci.DependencyCITests.test_npm_nonregistry_tarball_rejected_before_request) ... ok\ntest_npm_provider_prepare_is_rejected_without_execution (test_dependency_ci.DependencyCITests.test_npm_provider_prepare_is_rejected_without_execution) ... ok\ntest_registered_application_lock_materializes_fixed_source (test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source) ... ok\ntest_unregistered_go_module_rejected_before_authenticated_request (test_dependency_ci.DependencyCITests.test_unregistered_go_module_rejected_before_authenticated_request) ... ok\ntest_unregistered_source_lock_is_rejected_before_component_fetch (test_dependency_ci.DependencyCITests.test_unregistered_source_lock_is_rejected_before_component_fetch) ... ok\ntest_after_snapshot_failure_keeps_command_exit_and_output (test_evidence.EvidenceTests.test_after_snapshot_failure_keeps_command_exit_and_output) ... ok\ntest_all_persisted_and_displayed_text_is_sanitized (test_evidence.EvidenceTests.test_all_persisted_and_displayed_text_is_sanitized) ... ok\ntest_authorization_forms_are_redacted_in_capture_console_and_import (test_evidence.EvidenceTests.test_authorization_forms_are_redacted_in_capture_console_and_import) ... ok\ntest_authorization_forms_are_redacted_on_direct_card_capture (test_evidence.EvidenceTests.test_authorization_forms_are_redacted_on_direct_card_capture) ... ok\ntest_before_after_heads_do_not_relabel_changed_command (test_evidence.EvidenceTests.test_before_after_heads_do_not_relabel_changed_command) ... ok\ntest_capture_does_not_overwrite_an_existing_receipt (test_evidence.EvidenceTests.test_capture_does_not_overwrite_an_existing_receipt) ... ok\ntest_capture_without_card_and_import_without_rerun (test_evidence.EvidenceTests.test_capture_without_card_and_import_without_rerun) ... ok\ntest_child_failure_code_is_preserved (test_evidence.EvidenceTests.test_child_failure_code_is_preserved) ... ok\ntest_command_line_token_arguments_are_redacted (test_evidence.EvidenceTests.test_command_line_token_arguments_are_redacted) ... ok\ntest_dirty_and_untracked_contents_have_object_digests (test_evidence.EvidenceTests.test_dirty_and_untracked_contents_have_object_digests) ... ok\ntest_failed_child_exit_survives_receipt_write_failure (test_evidence.EvidenceTests.test_failed_child_exit_survives_receipt_write_failure) ... ok\ntest_full_output_is_preserved_not_only_tail (test_evidence.EvidenceTests.test_full_output_is_preserved_not_only_tail) ... ok\ntest_import_missing_card_fails_without_losing_receipt (test_evidence.EvidenceTests.test_import_missing_card_fails_without_losing_receipt) ... ok\ntest_import_rejects_unredacted_authorization_with_valid_checksums (test_evidence.EvidenceTests.test_import_rejects_unredacted_authorization_with_valid_checksums) ... ok\ntest_import_retry_is_idempotent (test_evidence.EvidenceTests.test_import_retry_is_idempotent) ... ok\ntest_invalid_field_types_and_forged_source_are_rejected (test_evidence.EvidenceTests.test_invalid_field_types_and_forged_source_are_rejected) ... ok\ntest_known_secret_environment_value_is_redacted_without_label (test_evidence.EvidenceTests.test_known_secret_environment_value_is_redacted_without_label) ... ok\ntest_linked_worktree_import_preserves_source_identity (test_evidence.EvidenceTests.test_linked_worktree_import_preserves_source_identity) ... ok\ntest_missing_card_does_not_execute (test_evidence.EvidenceTests.test_missing_card_does_not_execute) ... ok\ntest_missing_required_snapshot_fields_are_rejected (test_evidence.EvidenceTests.test_missing_required_snapshot_fields_are_rejected) ... ok\ntest_nested_cwd_records_untracked_files_from_repository_root (test_evidence.EvidenceTests.test_nested_cwd_records_untracked_files_from_repository_root) ... ok\ntest_output_digest_checked_even_if_receipt_digest_recomputed (test_evidence.EvidenceTests.test_output_digest_checked_even_if_receipt_digest_recomputed) ... ok\ntest_pipeline_failure_is_recorded_and_returned (test_evidence.EvidenceTests.test_pipeline_failure_is_recorded_and_returned) ... ok\ntest_quoted_credentials_with_spaces_are_fully_redacted (test_evidence.EvidenceTests.test_quoted_credentials_with_spaces_are_fully_redacted) ... ok\ntest_receipt_write_failure_cannot_claim_success (test_evidence.EvidenceTests.test_receipt_write_failure_cannot_claim_success) ... ok\ntest_recorder_environment_does_not_leak_into_nested_commands (test_evidence.EvidenceTests.test_recorder_environment_does_not_leak_into_nested_commands) ... ok\ntest_source_cannot_be_promoted_by_environment (test_evidence.EvidenceTests.test_source_cannot_be_promoted_by_environment) ... ok\ntest_tamper_is_rejected_before_card_append (test_evidence.EvidenceTests.test_tamper_is_rejected_before_card_append) ... ok\ntest_unrelated_repo_cannot_import (test_evidence.EvidenceTests.test_unrelated_repo_cannot_import) ... ok\ntest_validate_precheck_checks_result_and_current_base (test_evidence.EvidenceTests.test_validate_precheck_checks_result_and_current_base) ... ok\ntest_validate_precheck_rejects_successful_arbitrary_command (test_evidence.EvidenceTests.test_validate_precheck_rejects_successful_arbitrary_command) ... ok\ntest_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_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 96badb1] rdm v2\n 1 file changed, 1 insertion(+)\n create mode 100644 marker\nTo /tmp/svc-db-regress-dackc2c1/rdmremote.git\n 103186c..96badb1 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_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_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_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_does_not_execute_json_receipt_command (test_task.TaskLifecycleTests.test_sync_does_not_execute_json_receipt_command) ... ok\ntest_sync_keeps_json_evidence_fresh_after_metadata_only_changes (test_task.TaskLifecycleTests.test_sync_keeps_json_evidence_fresh_after_metadata_only_changes) ... ok\ntest_sync_keeps_unchanged_component_branch (test_task.TaskLifecycleTests.test_sync_keeps_unchanged_component_branch) ... ok\ntest_sync_materializes_nested_detached_components (test_task.TaskLifecycleTests.test_sync_materializes_nested_detached_components) ... ok\ntest_sync_materializes_updated_component (test_task.TaskLifecycleTests.test_sync_materializes_updated_component) ... ok\ntest_sync_preserves_component_feature_branch (test_task.TaskLifecycleTests.test_sync_preserves_component_feature_branch) ... ok\ntest_sync_preserves_dirty_child (test_task.TaskLifecycleTests.test_sync_preserves_dirty_child) ... ok\ntest_sync_preserves_nested_feature_branch_when_parent_pin_changes (test_task.TaskLifecycleTests.test_sync_preserves_nested_feature_branch_when_parent_pin_changes) ... ok\ntest_sync_reads_legacy_commands_with_escaped_pipes (test_task.TaskLifecycleTests.test_sync_reads_legacy_commands_with_escaped_pipes) ... ok\ntest_sync_still_warns_for_stale_legacy_table_evidence (test_task.TaskLifecycleTests.test_sync_still_warns_for_stale_legacy_table_evidence) ... ok\ntest_sync_warns_for_malformed_json_evidence (test_task.TaskLifecycleTests.test_sync_warns_for_malformed_json_evidence) ... ok\ntest_sync_warns_for_missing_json_receipt_fields_even_with_valid_checksum (test_task.TaskLifecycleTests.test_sync_warns_for_missing_json_receipt_fields_even_with_valid_checksum) ... ok\ntest_sync_warns_for_unresolved_json_evidence_head (test_task.TaskLifecycleTests.test_sync_warns_for_unresolved_json_evidence_head) ... ok\ntest_sync_warns_for_unresolved_legacy_evidence_head (test_task.TaskLifecycleTests.test_sync_warns_for_unresolved_legacy_evidence_head) ... ok\ntest_sync_warns_when_json_after_state_contains_uncommitted_code (test_task.TaskLifecycleTests.test_sync_warns_when_json_after_state_contains_uncommitted_code) ... ok\ntest_sync_warns_when_json_before_state_contains_uncommitted_code (test_task.TaskLifecycleTests.test_sync_warns_when_json_before_state_contains_uncommitted_code) ... ok\ntest_sync_warns_when_json_evidence_predates_noncard_changes (test_task.TaskLifecycleTests.test_sync_warns_when_json_evidence_predates_noncard_changes) ... ok\ntest_verify_rejects_recursive_drift_even_when_root_has_local_edits (test_task.TaskLifecycleTests.test_verify_rejects_recursive_drift_even_when_root_has_local_edits) ... ok\ntest_verify_rejects_uninitialized_component (test_task.TaskLifecycleTests.test_verify_rejects_uninitialized_component) ... ok\ntest_credentials_in_transport_url_are_rejected (test_transport.TransportTests.test_credentials_in_transport_url_are_rejected) ... ok\ntest_remote_revision_download_without_global_git_change (test_transport.TransportTests.test_remote_revision_download_without_global_git_change) ... ok\ntest_verified_local_mirror_mapping_survives_without_authentication (test_transport.TransportTests.test_verified_local_mirror_mapping_survives_without_authentication) ... ok\ntest_actual_go_version_baseline_overlay_and_unlink_restore_version_consumption (test_workspace.WorkspaceTests.test_actual_go_version_baseline_overlay_and_unlink_restore_version_consumption) ... ok\ntest_conflicting_duplicate_nested_component_stops_before_cloning (test_workspace.WorkspaceTests.test_conflicting_duplicate_nested_component_stops_before_cloning) ... ok\ntest_edit_registers_branch_and_prepare_preserves_work (test_workspace.WorkspaceTests.test_edit_registers_branch_and_prepare_preserves_work) ... ok\ntest_equivalent_recursive_nested_sources_share_an_independent_component (test_workspace.WorkspaceTests.test_equivalent_recursive_nested_sources_share_an_independent_component) ... ok\ntest_existing_fixed_checkout_is_not_switched_after_lock_change (test_workspace.WorkspaceTests.test_existing_fixed_checkout_is_not_switched_after_lock_change) ... ok\ntest_fresh_library_edit_resolves_fixed_consumer_and_preserves_consumer_manifest (test_workspace.WorkspaceTests.test_fresh_library_edit_resolves_fixed_consumer_and_preserves_consumer_manifest) ... ok\ntest_git_operation_is_reported_and_not_removed (test_workspace.WorkspaceTests.test_git_operation_is_reported_and_not_removed) ... ok\ntest_ignored_unique_files_and_shared_worktrees_block_branch_changes (test_workspace.WorkspaceTests.test_ignored_unique_files_and_shared_worktrees_block_branch_changes) ... ok\ntest_library_baseline_resolves_transitive_selected_module (test_workspace.WorkspaceTests.test_library_baseline_resolves_transitive_selected_module) ... ok\ntest_library_legacy_baseline_uses_gitlink_not_current_head (test_workspace.WorkspaceTests.test_library_legacy_baseline_uses_gitlink_not_current_head) ... ok\ntest_missing_fixed_source_never_falls_back_to_remote_main (test_workspace.WorkspaceTests.test_missing_fixed_source_never_falls_back_to_remote_main) ... ok\ntest_npm_library_edit_uses_consumer_lock_git_sha_not_remote_main (test_workspace.WorkspaceTests.test_npm_library_edit_uses_consumer_lock_git_sha_not_remote_main) ... ok\ntest_npm_library_rejects_wrong_lock_origin_and_competing_manual_lock (test_workspace.WorkspaceTests.test_npm_library_rejects_wrong_lock_origin_and_competing_manual_lock) ... ok\ntest_partial_initialization_is_retained_and_retry_is_safe (test_workspace.WorkspaceTests.test_partial_initialization_is_retained_and_retry_is_safe) ... ok\ntest_prepare_pins_fixed_commit_and_reuses_without_advancing (test_workspace.WorkspaceTests.test_prepare_pins_fixed_commit_and_reuses_without_advancing) ... ok\ntest_private_git_metadata_symlink_is_not_adopted (test_workspace.WorkspaceTests.test_private_git_metadata_symlink_is_not_adopted) ... ok\ntest_rejects_mismatched_origin_dirty_and_git_lock_without_changes (test_workspace.WorkspaceTests.test_rejects_mismatched_origin_dirty_and_git_lock_without_changes) ... ok\ntest_rejects_paths_and_symlink_escape (test_workspace.WorkspaceTests.test_rejects_paths_and_symlink_escape) ... ok\ntest_rejects_unknown_component_and_bad_branch_without_source_creation (test_workspace.WorkspaceTests.test_rejects_unknown_component_and_bad_branch_without_source_creation) ... ok\ntest_status_does_not_expose_credentials_from_an_unmatched_actual_origin (test_workspace.WorkspaceTests.test_status_does_not_expose_credentials_from_an_unmatched_actual_origin) ... ok\ntest_status_reports_dirty_and_verify_rejects_it (test_workspace.WorkspaceTests.test_status_reports_dirty_and_verify_rejects_it) ... ok\ntest_transition_known_nested_repositories_preserves_external_worktree_and_runs_go (test_workspace.WorkspaceTests.test_transition_known_nested_repositories_preserves_external_worktree_and_runs_go) ... ok\ntest_transition_preserves_committed_symlink_deletion_and_file_type_change (test_workspace.WorkspaceTests.test_transition_preserves_committed_symlink_deletion_and_file_type_change) ... ok\ntest_transition_preserves_staged_blob_internal_symlink_and_reflog_commit (test_workspace.WorkspaceTests.test_transition_preserves_staged_blob_internal_symlink_and_reflog_commit) ... ok\ntest_transition_refuses_initialized_nested_repository (test_workspace.WorkspaceTests.test_transition_refuses_initialized_nested_repository) ... ok\ntest_transition_rejects_external_symlinks_preserving_both_locations (test_workspace.WorkspaceTests.test_transition_rejects_external_symlinks_preserving_both_locations) ... ok\ntest_transition_report_is_readonly_apply_preserves_unique_commits_refs_and_files (test_workspace.WorkspaceTests.test_transition_report_is_readonly_apply_preserves_unique_commits_refs_and_files) ... ok\ntest_unlink_refuses_manual_overlay_changes_without_changing_registration (test_workspace.WorkspaceTests.test_unlink_refuses_manual_overlay_changes_without_changing_registration) ... ok\ntest_workspace_operation_lock_and_user_go_work_are_preserved (test_workspace.WorkspaceTests.test_workspace_operation_lock_and_user_go_work_are_preserved) ... 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 365 tests in 237.567s\n\nOK (skipped=18)\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n", + "output_sha256": "2a6f1308b682d69271a1dd9aded6e46a6e671f156bfb528171ab14d56184d0a0", + "receipt_sha256": "9b96663663bc2d721b3499d0e249c940b54cba0d3015914e1d8d8e75de947e04" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:09:41.106884+00:00", + "command": "python3 -m unittest tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source -v", + "command_sha256": "89fa000b267f5329376eebc2d18659069ca925a12d1ebfa8b7ad643578f3251c", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "f2d863b4018727a2611ea6d024dddcb5f705ef8d", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\n M .task/feature-dependency-workspace.md\n M Makefile\n M scripts/check-worktree.py\n M scripts/task.sh\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "9e64810904f0fdda71bb83cd7577a4c7e839d9cfdee3ee4b41af5eee14e05468", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "a9e5fcc670188e53e2762e51d9db6d2978ecfbb2e0a9f778bd8c60e4858fae25", + "tests/test_composition.py": "14c24d9bd5b960de642860604a8cd4ba10eea2ca8fb80a6c65017114a053861d", + "tests/test_dependency_ci.py": "a939545fc315be79b8d501a753b970e55b9f2e31bdd745a3581c1d01793f95da", + "tests/test_workspace_cutover.py": "131ee0f35f0d1ffee6becf12be3d438cae1459449c4c4aabb735938aaca7000b" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": "5687d2501994196f62d1d00cb2318804c1a64a7e4b3f4ea0134f8ec823d944ac" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "f2d863b4018727a2611ea6d024dddcb5f705ef8d", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\n M .task/feature-dependency-workspace.md\n M Makefile\n M scripts/check-worktree.py\n M scripts/task.sh\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "9e64810904f0fdda71bb83cd7577a4c7e839d9cfdee3ee4b41af5eee14e05468", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "a9e5fcc670188e53e2762e51d9db6d2978ecfbb2e0a9f778bd8c60e4858fae25", + "tests/test_composition.py": "14c24d9bd5b960de642860604a8cd4ba10eea2ca8fb80a6c65017114a053861d", + "tests/test_dependency_ci.py": "a939545fc315be79b8d501a753b970e55b9f2e31bdd745a3581c1d01793f95da", + "tests/test_workspace_cutover.py": "131ee0f35f0d1ffee6becf12be3d438cae1459449c4c4aabb735938aaca7000b" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": "5687d2501994196f62d1d00cb2318804c1a64a7e4b3f4ea0134f8ec823d944ac" + } + }, + "after_error": null, + "exit_code": 1, + "output": "test_registered_application_lock_materializes_fixed_source (tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source) ... FAIL\n\n======================================================================\nFAIL: test_registered_application_lock_materializes_fixed_source (tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 65, in test_registered_application_lock_materializes_fixed_source\n self.assertEqual(self.git(self.checkout / \".workspace/Agent-System-Backend\", \"config\", \"remote.origin.url\"),\n ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n SSH + \"Agent-System-Backend.git\")\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 'http://127.0.0.1:35717/weichen/Agent-System-Backend.git' != 'ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Backend.git'\n- http://127.0.0.1:35717/weichen/Agent-System-Backend.git\n+ ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Backend.git\n\n\n----------------------------------------------------------------------\nRan 1 test in 0.615s\n\nFAILED (failures=1)\n", + "output_sha256": "4c011dd48d7166f2e57f78b81188b438032d297a44c5530e6fa34fe7c66cfcc7", + "receipt_sha256": "11de37d64ceea1758616bed5114d239a7e3950aa888fa71eab91cb00966c2769" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:10:05.098270+00:00", + "command": "python3 -m unittest tests.test_dependency_ci tests.test_ci_credentials -v", + "command_sha256": "aec96627d88bea7de31c0a9715632d3316431ef9b5cd6d15741cb16317092664", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "f2d863b4018727a2611ea6d024dddcb5f705ef8d", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\n M .task/feature-dependency-workspace.md\n M Makefile\n M scripts/check-worktree.py\n M scripts/task.sh\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "32d7666107c7a4b43e154ee7e04e3a25f8d9d6e60c72e7b0277218735ce1285a", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "a9e5fcc670188e53e2762e51d9db6d2978ecfbb2e0a9f778bd8c60e4858fae25", + "tests/test_composition.py": "14c24d9bd5b960de642860604a8cd4ba10eea2ca8fb80a6c65017114a053861d", + "tests/test_dependency_ci.py": "a939545fc315be79b8d501a753b970e55b9f2e31bdd745a3581c1d01793f95da", + "tests/test_workspace_cutover.py": "131ee0f35f0d1ffee6becf12be3d438cae1459449c4c4aabb735938aaca7000b" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": "5687d2501994196f62d1d00cb2318804c1a64a7e4b3f4ea0134f8ec823d944ac" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "f2d863b4018727a2611ea6d024dddcb5f705ef8d", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\n M .task/feature-dependency-workspace.md\n M Makefile\n M scripts/check-worktree.py\n M scripts/task.sh\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "32d7666107c7a4b43e154ee7e04e3a25f8d9d6e60c72e7b0277218735ce1285a", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "a9e5fcc670188e53e2762e51d9db6d2978ecfbb2e0a9f778bd8c60e4858fae25", + "tests/test_composition.py": "14c24d9bd5b960de642860604a8cd4ba10eea2ca8fb80a6c65017114a053861d", + "tests/test_dependency_ci.py": "a939545fc315be79b8d501a753b970e55b9f2e31bdd745a3581c1d01793f95da", + "tests/test_workspace_cutover.py": "131ee0f35f0d1ffee6becf12be3d438cae1459449c4c4aabb735938aaca7000b" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": "5687d2501994196f62d1d00cb2318804c1a64a7e4b3f4ea0134f8ec823d944ac" + } + }, + "after_error": null, + "exit_code": 0, + "output": "test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) ... ok\ntest_external_npm_git_source_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_external_npm_git_source_rejected_before_authenticated_request) ... ok\ntest_go_prefetch_uses_only_registered_private_repo_and_local_toolchain (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain) ... ok\ntest_go_requirement_for_new_toolchain_fails_without_downloading_one (tests.test_dependency_ci.DependencyCITests.test_go_requirement_for_new_toolchain_fails_without_downloading_one) ... ok\ntest_npm_git_package_installs_committed_output_without_prepare (tests.test_dependency_ci.DependencyCITests.test_npm_git_package_installs_committed_output_without_prepare) ... ok\ntest_npm_nonregistry_tarball_rejected_before_request (tests.test_dependency_ci.DependencyCITests.test_npm_nonregistry_tarball_rejected_before_request) ... ok\ntest_npm_provider_prepare_is_rejected_without_execution (tests.test_dependency_ci.DependencyCITests.test_npm_provider_prepare_is_rejected_without_execution) ... ok\ntest_registered_application_lock_materializes_fixed_source (tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source) ... ok\ntest_unregistered_go_module_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_unregistered_go_module_rejected_before_authenticated_request) ... ok\ntest_unregistered_source_lock_is_rejected_before_component_fetch (tests.test_dependency_ci.DependencyCITests.test_unregistered_source_lock_is_rejected_before_component_fetch) ... ok\ntest_candidate_cannot_read_checkout_credentials (tests.test_ci_credentials.CheckoutTests.test_candidate_cannot_read_checkout_credentials) ... ok\ntest_candidate_submodule_update_commands_are_rejected (tests.test_ci_credentials.CheckoutTests.test_candidate_submodule_update_commands_are_rejected) ... ok\ntest_credential_destination_confined_to_injected_server (tests.test_ci_credentials.CheckoutTests.test_credential_destination_confined_to_injected_server) ... ok\ntest_external_or_unlisted_urls_are_rejected_before_component_fetch (tests.test_ci_credentials.CheckoutTests.test_external_or_unlisted_urls_are_rejected_before_component_fetch) ... ok\ntest_inherited_template_hook_does_not_execute_with_credentials (tests.test_ci_credentials.CheckoutTests.test_inherited_template_hook_does_not_execute_with_credentials) ... ok\ntest_nested_external_url_is_rejected_before_authenticated_fetch (tests.test_ci_credentials.CheckoutTests.test_nested_external_url_is_rejected_before_authenticated_fetch) ... ok\ntest_rdm_pin_fetch_is_three_shas_on_the_allowlist (tests.test_ci_credentials.CheckoutTests.test_rdm_pin_fetch_is_three_shas_on_the_allowlist) ... ok\ntest_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials (tests.test_ci_credentials.CheckoutTests.test_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials) ... ok\ntest_redirects_do_not_forward_credential_or_fetch_unlisted_target (tests.test_ci_credentials.CheckoutTests.test_redirects_do_not_forward_credential_or_fetch_unlisted_target) ... ok\n\n----------------------------------------------------------------------\nRan 19 tests in 12.240s\n\nOK\n", + "output_sha256": "468f795e567e81dae74637088385ce885b89412db57a5182d26e017de74edb51", + "receipt_sha256": "43bb949a0b04fde74b3518851a6b5c2cbfbf388964830ed933523558463d143d" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:11:33.637435+00:00", + "command": "python3 scripts/workspace.py edit --name Agent-Native --branch feature/dependency-live-edit-probe", + "command_sha256": "f6147bb740b34697494c2b1b4d86de0f97e4cac9b9422c8e524cf570f49bdb9e", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "f2d863b4018727a2611ea6d024dddcb5f705ef8d", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\n M .task/feature-dependency-workspace.md\n M Makefile\n M scripts/check-worktree.py\n M scripts/task.sh\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "0a1e2126ac35381b3e4dadb4f74fe150a7a010da93c53f97de601e5f75ff100e", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "a9e5fcc670188e53e2762e51d9db6d2978ecfbb2e0a9f778bd8c60e4858fae25", + "tests/test_composition.py": "14c24d9bd5b960de642860604a8cd4ba10eea2ca8fb80a6c65017114a053861d", + "tests/test_dependency_ci.py": "a939545fc315be79b8d501a753b970e55b9f2e31bdd745a3581c1d01793f95da", + "tests/test_workspace_cutover.py": "5ec6f6b6c21bb8c35b8b448573bc5ae8342727d82271676cfed89c84092f47b3" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": "5687d2501994196f62d1d00cb2318804c1a64a7e4b3f4ea0134f8ec823d944ac" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "f2d863b4018727a2611ea6d024dddcb5f705ef8d", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\n M .task/feature-dependency-workspace.md\n M Makefile\n M scripts/check-worktree.py\n M scripts/task.sh\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "0a1e2126ac35381b3e4dadb4f74fe150a7a010da93c53f97de601e5f75ff100e", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "a9e5fcc670188e53e2762e51d9db6d2978ecfbb2e0a9f778bd8c60e4858fae25", + "tests/test_composition.py": "14c24d9bd5b960de642860604a8cd4ba10eea2ca8fb80a6c65017114a053861d", + "tests/test_dependency_ci.py": "a939545fc315be79b8d501a753b970e55b9f2e31bdd745a3581c1d01793f95da", + "tests/test_workspace_cutover.py": "5ec6f6b6c21bb8c35b8b448573bc5ae8342727d82271676cfed89c84092f47b3" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": "5687d2501994196f62d1d00cb2318804c1a64a7e4b3f4ea0134f8ec823d944ac" + } + }, + "after_error": null, + "exit_code": 1, + "output": "workspace: Go Origin URL does not match approved repository: git-ssh.u1680832.nyat.app/weichen/Agent-Native.git\n", + "output_sha256": "f46c0e1f518123344d3cb7bc1800721f6f5cd79095b2b7f493fff5e65c877799", + "receipt_sha256": "2d59c7914d18b1201773ab5065798b05664ae3643400c9ba93bc43cd69a5e1ac" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:12:55.034161+00:00", + "command": "python3 scripts/workspace.py edit --name Agent-Native --branch feature/dependency-live-edit-probe", + "command_sha256": "f6147bb740b34697494c2b1b4d86de0f97e4cac9b9422c8e524cf570f49bdb9e", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "f2d863b4018727a2611ea6d024dddcb5f705ef8d", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\n M .task/feature-dependency-workspace.md\n M Makefile\n M policy/architecture.yaml\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "a373eed6a9be69f2ef0cc602a9af53dd1c49c060354288183983ad6dda2cdf08", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "a9e5fcc670188e53e2762e51d9db6d2978ecfbb2e0a9f778bd8c60e4858fae25", + "tests/test_composition.py": "14c24d9bd5b960de642860604a8cd4ba10eea2ca8fb80a6c65017114a053861d", + "tests/test_dependency_ci.py": "a939545fc315be79b8d501a753b970e55b9f2e31bdd745a3581c1d01793f95da", + "tests/test_workspace_cutover.py": "5ec6f6b6c21bb8c35b8b448573bc5ae8342727d82271676cfed89c84092f47b3" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "state": "missing" + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": "5687d2501994196f62d1d00cb2318804c1a64a7e4b3f4ea0134f8ec823d944ac" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\n M .task/feature-dependency-workspace.md\n M Makefile\n M policy/architecture.yaml\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "a373eed6a9be69f2ef0cc602a9af53dd1c49c060354288183983ad6dda2cdf08", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "a9e5fcc670188e53e2762e51d9db6d2978ecfbb2e0a9f778bd8c60e4858fae25", + "tests/test_composition.py": "14c24d9bd5b960de642860604a8cd4ba10eea2ca8fb80a6c65017114a053861d", + "tests/test_dependency_ci.py": "a939545fc315be79b8d501a753b970e55b9f2e31bdd745a3581c1d01793f95da", + "tests/test_workspace_cutover.py": "5ec6f6b6c21bb8c35b8b448573bc5ae8342727d82271676cfed89c84092f47b3" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": "746b23e0fb58a4bbc35f1028620d05671d62c87b1347875b6216e447ad971480" + } + }, + "after_error": null, + "exit_code": 0, + "output": "{\n \"components\": {\n \"Agent-Native\": {\n \"actual\": {\n \"branch\": \"feature/dependency-live-edit-probe\",\n \"changes\": [],\n \"common_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-Native/.git\",\n \"dirty\": false,\n \"git_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-Native/.git\",\n \"head\": \"6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e\",\n \"ignored\": [],\n \"locks\": [],\n \"operations\": [],\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Native.git\",\n \"worktrees\": [\n \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-Native\"\n ]\n },\n \"declared\": null,\n \"path\": \".workspace/Agent-Native\",\n \"registered\": {\n \"baseline\": \"6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e\",\n \"branch\": \"feature/dependency-live-edit-probe\",\n \"linked\": true,\n \"mode\": \"linked\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Native.git\",\n \"owner_root\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace\",\n \"path\": \".workspace/Agent-Native\",\n \"source\": {\n \"consumer\": \"Agent-System-Backend\",\n \"consumers\": [\n \"Agent-System-Backend\"\n ],\n \"kind\": \"go-module\",\n \"module\": \"git-ssh.u1680832.nyat.app/weichen/Agent-Native.git\",\n \"origin\": {\n \"Hash\": \"6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e\",\n \"URL\": \"https://git-ssh.u1680832.nyat.app/weichen/Agent-Native\",\n \"VCS\": \"git\"\n },\n \"selections\": [\n {\n \"consumer\": \"Agent-System-Backend\",\n \"kind\": \"go-module\",\n \"module\": \"git-ssh.u1680832.nyat.app/weichen/Agent-Native.git\",\n \"origin\": {\n \"Hash\": \"6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e\",\n \"URL\": \"https://git-ssh.u1680832.nyat.app/weichen/Agent-Native\",\n \"VCS\": \"git\"\n },\n \"version\": \"v0.0.0-20261013153610-6ddd3da8df5c\"\n }\n ],\n \"version\": \"v0.0.0-20261013153610-6ddd3da8df5c\"\n }\n },\n \"repo\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Native.git\",\n \"role\": \"go-library\"\n }\n },\n \"go_work\": {\n \"paths\": [\n \".workspace/Agent-Native\",\n \".workspace/Agent-System-Backend\"\n ],\n \"sha256\": \"38da33d0e8f4d91662d22417c84f4b0b1bd243b8e3f4bcb8d34f8bdda88afc3d\"\n },\n \"root\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace\",\n \"schema\": 1\n}\n", + "output_sha256": "9af180dd1e8b1f1cec8f5f3ae6a99302c66715935249e1134003405714d664bc", + "receipt_sha256": "81d09cfd5f6a3943a982a254c90bb40f128abe3e861a90cc1b6784c33992387b" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:12:56.191829+00:00", + "command": "python3 -m unittest discover -s tests -p test_workspace.py -v", + "command_sha256": "7154d39b0d1bd97c7943affd715166f3f8cca5be50900350b9fea8c63454c140", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\n M .task/feature-dependency-workspace.md\n M Makefile\n M policy/architecture.yaml\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "a373eed6a9be69f2ef0cc602a9af53dd1c49c060354288183983ad6dda2cdf08", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "a9e5fcc670188e53e2762e51d9db6d2978ecfbb2e0a9f778bd8c60e4858fae25", + "tests/test_composition.py": "14c24d9bd5b960de642860604a8cd4ba10eea2ca8fb80a6c65017114a053861d", + "tests/test_dependency_ci.py": "a939545fc315be79b8d501a753b970e55b9f2e31bdd745a3581c1d01793f95da", + "tests/test_workspace_cutover.py": "5ec6f6b6c21bb8c35b8b448573bc5ae8342727d82271676cfed89c84092f47b3" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": "746b23e0fb58a4bbc35f1028620d05671d62c87b1347875b6216e447ad971480" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\n M .task/feature-dependency-workspace.md\n M Makefile\n M policy/architecture.yaml\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "925ac9617bd29cc1bcebb60807b66439c04c1d10fa30c3f2e19458d1ed8e9566", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "a9e5fcc670188e53e2762e51d9db6d2978ecfbb2e0a9f778bd8c60e4858fae25", + "tests/test_composition.py": "14c24d9bd5b960de642860604a8cd4ba10eea2ca8fb80a6c65017114a053861d", + "tests/test_dependency_ci.py": "a939545fc315be79b8d501a753b970e55b9f2e31bdd745a3581c1d01793f95da", + "tests/test_workspace_cutover.py": "5ec6f6b6c21bb8c35b8b448573bc5ae8342727d82271676cfed89c84092f47b3" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": "746b23e0fb58a4bbc35f1028620d05671d62c87b1347875b6216e447ad971480" + } + }, + "after_error": null, + "exit_code": 0, + "output": "test_actual_go_version_baseline_overlay_and_unlink_restore_version_consumption (test_workspace.WorkspaceTests.test_actual_go_version_baseline_overlay_and_unlink_restore_version_consumption) ... ok\ntest_conflicting_duplicate_nested_component_stops_before_cloning (test_workspace.WorkspaceTests.test_conflicting_duplicate_nested_component_stops_before_cloning) ... ok\ntest_edit_registers_branch_and_prepare_preserves_work (test_workspace.WorkspaceTests.test_edit_registers_branch_and_prepare_preserves_work) ... ok\ntest_equivalent_recursive_nested_sources_share_an_independent_component (test_workspace.WorkspaceTests.test_equivalent_recursive_nested_sources_share_an_independent_component) ... ok\ntest_existing_fixed_checkout_is_not_switched_after_lock_change (test_workspace.WorkspaceTests.test_existing_fixed_checkout_is_not_switched_after_lock_change) ... ok\ntest_fresh_library_edit_resolves_fixed_consumer_and_preserves_consumer_manifest (test_workspace.WorkspaceTests.test_fresh_library_edit_resolves_fixed_consumer_and_preserves_consumer_manifest) ... ok\ntest_git_operation_is_reported_and_not_removed (test_workspace.WorkspaceTests.test_git_operation_is_reported_and_not_removed) ... ok\ntest_ignored_unique_files_and_shared_worktrees_block_branch_changes (test_workspace.WorkspaceTests.test_ignored_unique_files_and_shared_worktrees_block_branch_changes) ... ok\ntest_library_baseline_resolves_transitive_selected_module (test_workspace.WorkspaceTests.test_library_baseline_resolves_transitive_selected_module) ... ok\ntest_library_legacy_baseline_uses_gitlink_not_current_head (test_workspace.WorkspaceTests.test_library_legacy_baseline_uses_gitlink_not_current_head) ... ok\ntest_missing_fixed_source_never_falls_back_to_remote_main (test_workspace.WorkspaceTests.test_missing_fixed_source_never_falls_back_to_remote_main) ... ok\ntest_npm_library_edit_uses_consumer_lock_git_sha_not_remote_main (test_workspace.WorkspaceTests.test_npm_library_edit_uses_consumer_lock_git_sha_not_remote_main) ... ok\ntest_npm_library_rejects_wrong_lock_origin_and_competing_manual_lock (test_workspace.WorkspaceTests.test_npm_library_rejects_wrong_lock_origin_and_competing_manual_lock) ... ok\ntest_partial_initialization_is_retained_and_retry_is_safe (test_workspace.WorkspaceTests.test_partial_initialization_is_retained_and_retry_is_safe) ... ok\ntest_prepare_pins_fixed_commit_and_reuses_without_advancing (test_workspace.WorkspaceTests.test_prepare_pins_fixed_commit_and_reuses_without_advancing) ... ok\ntest_private_git_metadata_symlink_is_not_adopted (test_workspace.WorkspaceTests.test_private_git_metadata_symlink_is_not_adopted) ... ok\ntest_rejects_mismatched_origin_dirty_and_git_lock_without_changes (test_workspace.WorkspaceTests.test_rejects_mismatched_origin_dirty_and_git_lock_without_changes) ... ok\ntest_rejects_paths_and_symlink_escape (test_workspace.WorkspaceTests.test_rejects_paths_and_symlink_escape) ... ok\ntest_rejects_unknown_component_and_bad_branch_without_source_creation (test_workspace.WorkspaceTests.test_rejects_unknown_component_and_bad_branch_without_source_creation) ... ok\ntest_status_does_not_expose_credentials_from_an_unmatched_actual_origin (test_workspace.WorkspaceTests.test_status_does_not_expose_credentials_from_an_unmatched_actual_origin) ... ok\ntest_status_reports_dirty_and_verify_rejects_it (test_workspace.WorkspaceTests.test_status_reports_dirty_and_verify_rejects_it) ... ok\ntest_transition_known_nested_repositories_preserves_external_worktree_and_runs_go (test_workspace.WorkspaceTests.test_transition_known_nested_repositories_preserves_external_worktree_and_runs_go) ... ok\ntest_transition_preserves_committed_symlink_deletion_and_file_type_change (test_workspace.WorkspaceTests.test_transition_preserves_committed_symlink_deletion_and_file_type_change) ... ok\ntest_transition_preserves_staged_blob_internal_symlink_and_reflog_commit (test_workspace.WorkspaceTests.test_transition_preserves_staged_blob_internal_symlink_and_reflog_commit) ... ok\ntest_transition_refuses_initialized_nested_repository (test_workspace.WorkspaceTests.test_transition_refuses_initialized_nested_repository) ... ok\ntest_transition_rejects_external_symlinks_preserving_both_locations (test_workspace.WorkspaceTests.test_transition_rejects_external_symlinks_preserving_both_locations) ... ok\ntest_transition_report_is_readonly_apply_preserves_unique_commits_refs_and_files (test_workspace.WorkspaceTests.test_transition_report_is_readonly_apply_preserves_unique_commits_refs_and_files) ... ok\ntest_unlink_refuses_manual_overlay_changes_without_changing_registration (test_workspace.WorkspaceTests.test_unlink_refuses_manual_overlay_changes_without_changing_registration) ... ok\ntest_workspace_operation_lock_and_user_go_work_are_preserved (test_workspace.WorkspaceTests.test_workspace_operation_lock_and_user_go_work_are_preserved) ... ok\n\n----------------------------------------------------------------------\nRan 29 tests in 6.626s\n\nOK\n", + "output_sha256": "c1027b08a16350244828342beff351ad4d10243c9d46e6a52a606220f87358dc", + "receipt_sha256": "3af8386693a0f95e0b1e9c1b839d319dc0f8c6d76db44d70932119f2bbfb1bdf" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:14:35.300092+00:00", + "command": "go run /tmp/dependency-native-live-probe-01a1345f.go && python3 scripts/workspace.py unlink --name Agent-Native && if GOWORK=off go run /tmp/dependency-native-live-probe-01a1345f.go; then exit 1; else printf \"PASS: unlink excludes the uncommitted local Native function\\n\"; fi && test -f .workspace/Agent-Native/exec/workspace_probe.go", + "command_sha256": "256ceec1fcfe80bfd8970240a0660061bf3045956db0a9d4480150880fdb4648", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\n M .task/feature-dependency-workspace.md\n M Makefile\n M policy/architecture.yaml\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "bf88c63a28432b0f945bca09aed5096b9a7bcc492c5e6a7c3f5dcd499f1cd940", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "a9e5fcc670188e53e2762e51d9db6d2978ecfbb2e0a9f778bd8c60e4858fae25", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_composition.py": "4e2dadcaa61ab4103e73bf712ea39e4a29dcc1caa45427877c2ec525348e98ce", + "tests/test_dependency_ci.py": "a939545fc315be79b8d501a753b970e55b9f2e31bdd745a3581c1d01793f95da", + "tests/test_workspace_cutover.py": "af035b6cc9c7d5a47c5ac649c75eea8a3905c1e1cf2e349beb94567ae93bde50" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "?? exec/workspace_probe.go\n", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": { + "exec/workspace_probe.go": "aca5dfbb14436d7459a87b669d646e6c74482d49e1116634e02fedf627b31d75" + } + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": "746b23e0fb58a4bbc35f1028620d05671d62c87b1347875b6216e447ad971480" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\n M .task/feature-dependency-workspace.md\n M Makefile\n M policy/architecture.yaml\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "bf88c63a28432b0f945bca09aed5096b9a7bcc492c5e6a7c3f5dcd499f1cd940", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "a9e5fcc670188e53e2762e51d9db6d2978ecfbb2e0a9f778bd8c60e4858fae25", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_composition.py": "4e2dadcaa61ab4103e73bf712ea39e4a29dcc1caa45427877c2ec525348e98ce", + "tests/test_dependency_ci.py": "a939545fc315be79b8d501a753b970e55b9f2e31bdd745a3581c1d01793f95da", + "tests/test_workspace_cutover.py": "af035b6cc9c7d5a47c5ac649c75eea8a3905c1e1cf2e349beb94567ae93bde50" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "?? exec/workspace_probe.go\n", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": { + "exec/workspace_probe.go": "aca5dfbb14436d7459a87b669d646e6c74482d49e1116634e02fedf627b31d75" + } + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "native-local-source\n{\n \"components\": {\n \"Agent-Native\": {\n \"actual\": {\n \"branch\": \"feature/dependency-live-edit-probe\",\n \"changes\": [\n \"?? exec/workspace_probe.go\"\n ],\n \"common_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-Native/.git\",\n \"dirty\": true,\n \"git_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-Native/.git\",\n \"head\": \"6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e\",\n \"ignored\": [],\n \"locks\": [],\n \"operations\": [],\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Native.git\",\n \"worktrees\": [\n \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-Native\"\n ]\n },\n \"declared\": null,\n \"path\": \".workspace/Agent-Native\",\n \"registered\": {\n \"baseline\": \"6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e\",\n \"branch\": \"feature/dependency-live-edit-probe\",\n \"linked\": false,\n \"mode\": \"editable\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Native.git\",\n \"owner_root\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace\",\n \"path\": \".workspace/Agent-Native\",\n \"source\": {\n \"consumer\": \"Agent-System-Backend\",\n \"consumers\": [\n \"Agent-System-Backend\"\n ],\n \"kind\": \"go-module\",\n \"module\": \"git-ssh.u1680832.nyat.app/weichen/Agent-Native.git\",\n \"origin\": {\n \"Hash\": \"6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e\",\n \"URL\": \"https://git-ssh.u1680832.nyat.app/weichen/Agent-Native\",\n \"VCS\": \"git\"\n },\n \"selections\": [\n {\n \"consumer\": \"Agent-System-Backend\",\n \"kind\": \"go-module\",\n \"module\": \"git-ssh.u1680832.nyat.app/weichen/Agent-Native.git\",\n \"origin\": {\n \"Hash\": \"6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e\",\n \"URL\": \"https://git-ssh.u1680832.nyat.app/weichen/Agent-Native\",\n \"VCS\": \"git\"\n },\n \"version\": \"v0.0.0-20261013153610-6ddd3da8df5c\"\n }\n ],\n \"version\": \"v0.0.0-20261013153610-6ddd3da8df5c\"\n }\n },\n \"repo\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Native.git\",\n \"role\": \"go-library\"\n }\n },\n \"go_work\": null,\n \"root\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace\",\n \"schema\": 1\n}\n/tmp/dependency-native-live-probe-01a1345f.go:5:2: no required module provides package git-ssh.u1680832.nyat.app/weichen/Agent-Native.git/exec: go.mod file not found in current directory or any parent directory; see 'go help modules'\nPASS: unlink excludes the uncommitted local Native function\n", + "output_sha256": "b9cf4fa099627ebd8cf51e15cbe171ab2dca671d49ecd7439ab3957b9c0ad433", + "receipt_sha256": "6cd67a41dd6da39990dbb57d96569ca4400ffdc5b3d17875b51e558d78cecf97" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:15:48.554834+00:00", + "command": "(cd .workspace/Agent-System-Backend && if GOWORK=off go run /tmp/dependency-native-live-probe-01a1345f.go; then exit 1; else printf \"PASS: declared remote Native has no local probe symbol\\n\"; fi) && test -f .workspace/Agent-Native/exec/workspace_probe.go", + "command_sha256": "8b61dcd0eaeb5e221d74b89480f118ec482c92c0a6e7c6537c8d9c1267aec680", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\n M .task/feature-dependency-workspace.md\n M Makefile\n M policy/architecture.yaml\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "640d101169825fda7e347dbbeced958427a39aa2eba3f5c013546ced2bfd4751", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "a9e5fcc670188e53e2762e51d9db6d2978ecfbb2e0a9f778bd8c60e4858fae25", + "scripts/component-source.py": "996e0c3408a4be40271a8d67e81fc0351a705a282b32efd0f27f2b9ee89c915c", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_composition.py": "4e2dadcaa61ab4103e73bf712ea39e4a29dcc1caa45427877c2ec525348e98ce", + "tests/test_dependency_ci.py": "a939545fc315be79b8d501a753b970e55b9f2e31bdd745a3581c1d01793f95da", + "tests/test_workspace_cutover.py": "af035b6cc9c7d5a47c5ac649c75eea8a3905c1e1cf2e349beb94567ae93bde50" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "?? exec/workspace_probe.go\n", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": { + "exec/workspace_probe.go": "aca5dfbb14436d7459a87b669d646e6c74482d49e1116634e02fedf627b31d75" + } + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\n M .task/feature-dependency-workspace.md\n M Makefile\n M policy/architecture.yaml\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "640d101169825fda7e347dbbeced958427a39aa2eba3f5c013546ced2bfd4751", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "a9e5fcc670188e53e2762e51d9db6d2978ecfbb2e0a9f778bd8c60e4858fae25", + "scripts/component-source.py": "996e0c3408a4be40271a8d67e81fc0351a705a282b32efd0f27f2b9ee89c915c", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_composition.py": "4e2dadcaa61ab4103e73bf712ea39e4a29dcc1caa45427877c2ec525348e98ce", + "tests/test_dependency_ci.py": "a939545fc315be79b8d501a753b970e55b9f2e31bdd745a3581c1d01793f95da", + "tests/test_workspace_cutover.py": "af035b6cc9c7d5a47c5ac649c75eea8a3905c1e1cf2e349beb94567ae93bde50" + }, + "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 af199eeaa23c5b39e08b4649f2513d7572dc5274 deps/development-guidelines (heads/main)\n a3ee67bba269e1276c14e22c026171ecf2cf6190 deps/error-code-system (a3ee67b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/error-code-system/deps/development-guidelines (26b562d)\n 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 deps/logging-system (49b5d8b)\n 26b562d2e34fbc560711296a309c91c74ffc55b1 deps/logging-system/deps/development-guidelines (26b562d)\n 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e modules/backend (v0.4.0)\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.3.0-16-g5773e74)\n 047d362c72ec2c095ec14e1d2f2d152f94471faf modules/documents (remotes/origin/feature/project-member-access-1-g047d362)\n eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b modules/frontend (v0.4.0)\n 2c4322ef56df64ad72f65907d25b048a74bb5ffc modules/ui (v0.4.0)\n", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "?? exec/workspace_probe.go\n", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": { + "exec/workspace_probe.go": "aca5dfbb14436d7459a87b669d646e6c74482d49e1116634e02fedf627b31d75" + } + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7c83c41f8bdef99f6c1cb401de288561ae6385c10fce1e566553d66cf1a110da", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "# command-line-arguments\n/tmp/dependency-native-live-probe-01a1345f.go:8:34: undefined: native.WorkspaceDevelopmentProbe\nPASS: declared remote Native has no local probe symbol\n", + "output_sha256": "633ff45e9ddb798f31092d578f2c1e4cbdf4cdfcd0b73bbbf8c6cb8f9ece0f35", + "receipt_sha256": "ba6917cfd661f469e2636c75cdc87e15cb3ad7ead3179a3e50d77b5c87ce5fb7" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:35:53.334592+00:00", + "command": "python3 -m unittest tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source -v", + "command_sha256": "89fa000b267f5329376eebc2d18659069ca925a12d1ebfa8b7ad643578f3251c", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/architecture.yaml\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "7e02b793b5ca7455409bc3e1bd0755b1439353f7f1e6e434cf831b1a6b9f5a7e", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "83727b9094472cc0c4146fb513d02417c4ce5eade19f9be4395d6cbcfc49d0d1", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/architecture.yaml\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "7e02b793b5ca7455409bc3e1bd0755b1439353f7f1e6e434cf831b1a6b9f5a7e", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "83727b9094472cc0c4146fb513d02417c4ce5eade19f9be4395d6cbcfc49d0d1", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 1, + "output": "test_registered_application_lock_materializes_fixed_source (tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source) ... FAIL\n\n======================================================================\nFAIL: test_registered_application_lock_materializes_fixed_source (tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 63, in test_registered_application_lock_materializes_fixed_source\n self.assertEqual(result.returncode, 0, result.stderr)\n ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 1 != 0 : Checkout refused: Application and documentation source needs a fixed lock\n\n\n----------------------------------------------------------------------\nRan 1 test in 0.583s\n\nFAILED (failures=1)\n", + "output_sha256": "9262237d47739f84de010991e801f10465e34745192cfc23c516ada8d32d123d", + "receipt_sha256": "dd02577d4f6d90b26d41a2564cfcf7a55b57352ab4f01b70a9cac65457fdf9af" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:36:01.247149+00:00", + "command": "python3 -m unittest tests.test_dependency_ci tests.test_ci_credentials -v", + "command_sha256": "aec96627d88bea7de31c0a9715632d3316431ef9b5cd6d15741cb16317092664", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/architecture.yaml\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "6829574675551182df3a8244b5a5c8462b398a66e6a7236029b13be851d8ae20", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "83727b9094472cc0c4146fb513d02417c4ce5eade19f9be4395d6cbcfc49d0d1", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/architecture.yaml\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "6829574675551182df3a8244b5a5c8462b398a66e6a7236029b13be851d8ae20", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "83727b9094472cc0c4146fb513d02417c4ce5eade19f9be4395d6cbcfc49d0d1", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) ... ok\ntest_external_npm_git_source_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_external_npm_git_source_rejected_before_authenticated_request) ... ok\ntest_go_prefetch_uses_only_registered_private_repo_and_local_toolchain (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain) ... ok\ntest_go_requirement_for_new_toolchain_fails_without_downloading_one (tests.test_dependency_ci.DependencyCITests.test_go_requirement_for_new_toolchain_fails_without_downloading_one) ... ok\ntest_npm_git_package_installs_committed_output_without_prepare (tests.test_dependency_ci.DependencyCITests.test_npm_git_package_installs_committed_output_without_prepare) ... ok\ntest_npm_nonregistry_tarball_rejected_before_request (tests.test_dependency_ci.DependencyCITests.test_npm_nonregistry_tarball_rejected_before_request) ... ok\ntest_npm_provider_prepare_is_rejected_without_execution (tests.test_dependency_ci.DependencyCITests.test_npm_provider_prepare_is_rejected_without_execution) ... ok\ntest_registered_application_lock_materializes_fixed_source (tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source) ... ok\ntest_unregistered_go_module_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_unregistered_go_module_rejected_before_authenticated_request) ... ok\ntest_unregistered_source_lock_is_rejected_before_component_fetch (tests.test_dependency_ci.DependencyCITests.test_unregistered_source_lock_is_rejected_before_component_fetch) ... ok\ntest_candidate_cannot_read_checkout_credentials (tests.test_ci_credentials.CheckoutTests.test_candidate_cannot_read_checkout_credentials) ... ok\ntest_candidate_submodule_update_commands_are_rejected (tests.test_ci_credentials.CheckoutTests.test_candidate_submodule_update_commands_are_rejected) ... ok\ntest_credential_destination_confined_to_injected_server (tests.test_ci_credentials.CheckoutTests.test_credential_destination_confined_to_injected_server) ... ok\ntest_external_or_unlisted_urls_are_rejected_before_component_fetch (tests.test_ci_credentials.CheckoutTests.test_external_or_unlisted_urls_are_rejected_before_component_fetch) ... ok\ntest_inherited_template_hook_does_not_execute_with_credentials (tests.test_ci_credentials.CheckoutTests.test_inherited_template_hook_does_not_execute_with_credentials) ... ok\ntest_nested_external_url_is_rejected_before_authenticated_fetch (tests.test_ci_credentials.CheckoutTests.test_nested_external_url_is_rejected_before_authenticated_fetch) ... ok\ntest_rdm_pin_fetch_is_three_shas_on_the_allowlist (tests.test_ci_credentials.CheckoutTests.test_rdm_pin_fetch_is_three_shas_on_the_allowlist) ... ok\ntest_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials (tests.test_ci_credentials.CheckoutTests.test_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials) ... ok\ntest_redirects_do_not_forward_credential_or_fetch_unlisted_target (tests.test_ci_credentials.CheckoutTests.test_redirects_do_not_forward_credential_or_fetch_unlisted_target) ... ok\n\n----------------------------------------------------------------------\nRan 19 tests in 12.299s\n\nOK\n", + "output_sha256": "a4b825f330687cc11bff701811df1d0291442ce73d4030ba68b6bcb79e2f71d3", + "receipt_sha256": "6171f44290b483c19d02ee86932c63c5148e87131715531579ccc95b638ae574" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:37:34.942286+00:00", + "command": "python3 /tmp/dependency-finish-examples-01a1345f.py", + "command_sha256": "d3abaadee9cd4bedfc23d54d9cb00920ecad0267db8c0383f75232023363af24", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "583ab8cf6d195676637cd1155016a63146afce3b44a3e40ff650a6c85c738989", + "untracked": { + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "83727b9094472cc0c4146fb513d02417c4ce5eade19f9be4395d6cbcfc49d0d1", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "3e0ca9db2d05e7c2fe38fb1c03714341d5bd262d7c37536bc2b71d411c18d1d7", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "83727b9094472cc0c4146fb513d02417c4ce5eade19f9be4395d6cbcfc49d0d1", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 1, + "output": "EXAMPLE /home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/examples/downstream-rdm\ngo: added git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git v0.4.1-0.20261013154716-f1302ed5b395\n# example.com/agent-system-plugin-rdm [example.com/agent-system-plugin-rdm.test]\n./plugin_test.go:55:21: cannot use reg (variable of type *fakeRegistry) as extension.Registry value in argument to register: *fakeRegistry does not implement extension.Registry (missing method AddAdminZone)\n./plugin_test.go:96:44: cannot use fakeHost{…} (value of struct type fakeHost) as extension.Host value in argument to rdmPing: fakeHost does not implement extension.Host (missing method KnowledgeDelete)\nFAIL\texample.com/agent-system-plugin-rdm [build failed]\nFAIL\nTraceback (most recent call last):\n File \"/tmp/dependency-finish-examples-01a1345f.py\", line 11, in \n subprocess.run(args,cwd=path,env=env,check=True)\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/subprocess.py\", line 578, in run\n raise CalledProcessError(retcode, process.args,\n output=stdout, stderr=stderr)\nsubprocess.CalledProcessError: Command '('go', 'test', '-mod=readonly', './...')' returned non-zero exit status 1.\n", + "output_sha256": "3dbfe42dd93dc5cdfbabc1aec67b07920122d7c140cae1ce1ea7e6bd9bebe649", + "receipt_sha256": "2643f37efd91704762823d985aac6b5ed5f9a88d625322f16c3a17a04ed59d2f" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:38:23.167955+00:00", + "command": "python3 /tmp/dependency-finish-examples-01a1345f.py", + "command_sha256": "d3abaadee9cd4bedfc23d54d9cb00920ecad0267db8c0383f75232023363af24", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "360c69826c3f4f03974a95532798c34dc517858595e5f74dc32e3620966dda27", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "83727b9094472cc0c4146fb513d02417c4ce5eade19f9be4395d6cbcfc49d0d1", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "360c69826c3f4f03974a95532798c34dc517858595e5f74dc32e3620966dda27", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "83727b9094472cc0c4146fb513d02417c4ce5eade19f9be4395d6cbcfc49d0d1", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "EXAMPLE /home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/examples/downstream-rdm\nok \texample.com/agent-system-plugin-rdm\t0.002s\nEXAMPLE /home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Logging-System/examples/trace\ngo: added git-ssh.u1680832.nyat.app/weichen/Error-Code-System.git v0.0.0-20261013150648-28d2d5074347\ngo: added git-ssh.u1680832.nyat.app/weichen/Logging-System.git v0.0.0-20261013150647-9c5442f06d05\nok \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git/examples/trace\t0.002s\n", + "output_sha256": "bef6dc6fb99aebb693e4ae694fc8fc2e278b5f300da7153e1a59cf41f4c444bd", + "receipt_sha256": "5b55a328a8d2258ae568a76661c60d2fc9dd3db62e8f2368283d5f8211d4dd01" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:39:41.623261+00:00", + "command": "git diff --check", + "command_sha256": "466c2f308b48c7661d646fdd068fbecea974c665fe65dbf8ed508f224180ce0b", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "514ce2c1ea4459ee4a338ef20ccec25f6283adde90c81257eb23d4ac13d2cf62", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "83727b9094472cc0c4146fb513d02417c4ce5eade19f9be4395d6cbcfc49d0d1", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "514ce2c1ea4459ee4a338ef20ccec25f6283adde90c81257eb23d4ac13d2cf62", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "83727b9094472cc0c4146fb513d02417c4ce5eade19f9be4395d6cbcfc49d0d1", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "", + "output_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "receipt_sha256": "bdf197f395340e24ad7ea3f3cbb962df1b82be8fd2bd198689046cbfa10a953e" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:39:57.350898+00:00", + "command": "python3 -m unittest tests.test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests tests.test_dependency_ci.DependencyCITests.test_go_prefetch_covers_logging_trace_module -v", + "command_sha256": "02614a6ae6430ad94e7049e490d1e542d61586879b41258d03f5296b83b53695", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "f692dd8817941dd1e416d0df209766955a9cb5176aed9ead0118292766e1624d", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "64ca34758662cd2e29be9d84136dc314e497bd3e9799b10a9a7302a09a0fe960", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "1e5c6b9c10ba77ed34663fd670138621a17342bd", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "f692dd8817941dd1e416d0df209766955a9cb5176aed9ead0118292766e1624d", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "64ca34758662cd2e29be9d84136dc314e497bd3e9799b10a9a7302a09a0fe960", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 1, + "output": "test_component_ci_executes_nested_go_module_tests (tests.test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) ... \n test_component_ci_executes_nested_go_module_tests (tests.test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) (repo='Logging-System') ... FAIL\n test_component_ci_executes_nested_go_module_tests (tests.test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) (repo='Agent-Squad') ... FAIL\ntest_go_prefetch_covers_logging_trace_module (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_covers_logging_trace_module) ... FAIL\n\n======================================================================\nFAIL: test_component_ci_executes_nested_go_module_tests (tests.test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) (repo='Logging-System')\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 209, in test_component_ci_executes_nested_go_module_tests\n self.assertNotEqual(result.returncode, 0, \"nested regression was skipped by component CI\")\n ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 0 == 0 : nested regression was skipped by component CI\n\n======================================================================\nFAIL: test_component_ci_executes_nested_go_module_tests (tests.test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) (repo='Agent-Squad')\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 209, in test_component_ci_executes_nested_go_module_tests\n self.assertNotEqual(result.returncode, 0, \"nested regression was skipped by component CI\")\n ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 0 == 0 : nested regression was skipped by component CI\n\n======================================================================\nFAIL: test_go_prefetch_covers_logging_trace_module (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_covers_logging_trace_module)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 223, in test_go_prefetch_covers_logging_trace_module\n self.assertTrue(self.requests, \"trace module's private requirement was not prefetched\")\n ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: [] is not true : trace module's private requirement was not prefetched\n\n----------------------------------------------------------------------\nRan 2 tests in 1.012s\n\nFAILED (failures=3)\n", + "output_sha256": "f6e1f8891d51f1c30684419481359e50a0c39536f867d0d888283e097f0fb2d5", + "receipt_sha256": "682950c0156b964100ce10c75f096b1d848141795b43e0b07b99f5ef10565abe" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:42:00.705055+00:00", + "command": "python3 -m unittest tests.test_dependency_ci.DependencyCITests.test_go_prefetch_rejects_mutation_of_committed_checksums -v", + "command_sha256": "4c9ac535aec27f247f372b606640fae68cde40eec70b75b8ac0f291290ccd206", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "f97c606bbb66f8b92d39b4898313020bbcd0c8994a292329b18c6ee519893171", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "4a6f3a1abd1638552496bbdc6b57cfe84fac5e377f4b9fd211ffa1787fbc298e", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "f97c606bbb66f8b92d39b4898313020bbcd0c8994a292329b18c6ee519893171", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "4a6f3a1abd1638552496bbdc6b57cfe84fac5e377f4b9fd211ffa1787fbc298e", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 1, + "output": "test_go_prefetch_rejects_mutation_of_committed_checksums (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_rejects_mutation_of_committed_checksums) ... FAIL\n\n======================================================================\nFAIL: test_go_prefetch_rejects_mutation_of_committed_checksums (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_rejects_mutation_of_committed_checksums)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 232, in test_go_prefetch_rejects_mutation_of_committed_checksums\n self.assertNotEqual(result.returncode, 0, \"private acquisition silently rewrote committed checksums\")\n ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 0 == 0 : private acquisition silently rewrote committed checksums\n\n----------------------------------------------------------------------\nRan 1 test in 0.622s\n\nFAILED (failures=1)\n", + "output_sha256": "cdaedd7b35cd4ce6bd70ac344286065720cd11b936bec5f4a32ae0615b804384", + "receipt_sha256": "d21f3eb51a514a7600c841ec4ad8fc3254479cd37bea97c22dd8316cd0ed62db" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:42:03.524267+00:00", + "command": "python3 /tmp/dependency-check-docs-final-01a1345f.py", + "command_sha256": "5dc2d73a4dc7fb5db16a8dd47ac36f84e5a98aeabd44a3f0b6162062e9e01a37", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "d94bc4dbc4d8a8afd382e6c6302a40aa5833caabff740826fae21aecd3c1d6e7", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "4a6f3a1abd1638552496bbdc6b57cfe84fac5e377f4b9fd211ffa1787fbc298e", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "d94bc4dbc4d8a8afd382e6c6302a40aa5833caabff740826fae21aecd3c1d6e7", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "4a6f3a1abd1638552496bbdc6b57cfe84fac5e377f4b9fd211ffa1787fbc298e", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "SELF 32c7fa6c10e89c9775b8d84495a2b54edb461f128e9321d2cbbf030dd84a5adf /home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan/docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md\nSELF b90d57e1dfe172bc34c9527e2875d5a10df611822e0cd92501d76a4f15ec5fd9 /home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan/docs/proposals/2026-10-13-versioned-dependencies-implementation-plan.md\nSELF 29b2a2c2f13c101865d0eb46e9c966f954c45c01d379f054d4c197cc5285dc2f /home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan/docs/proposals/INDEX.md\nSELF 60a9307b298d99939c12189643a2abfd397cccf4cc809ee2d4f8008b9d1d492c /home/weichen/projects/Development-Guidelines-wt-feature-versioned-dependencies/README.md\nSELF f0fb916ff17cf1b079b7c89c8a34380839317c45a8e9e415bdf2da10392a80e9 /home/weichen/projects/Development-Guidelines-wt-feature-versioned-dependencies/standards/multi-repo.md\nSELF bd1ce8f432732cced1a3edce42e593ba5219ae3231b395e6480b3208cb4b1d2b /home/weichen/projects/Development-Guidelines-wt-feature-versioned-dependencies/standards/collaboration.md\nSELF ff6d51d5b1426b256a94c7c87e86e47ff9cb7337fd1c5edf9edcce42de29e4e8 /home/weichen/projects/Development-Guidelines-wt-feature-versioned-dependencies/workflows/adoption.md\nPASS: R1-R15, U1-U8, general/project separation, relative links: 116\n", + "output_sha256": "361662eb8029a9fe468f8fa37923c0c128f380f93b2dc8510591f35550d91cd2", + "receipt_sha256": "ef1f4b0770f2a7eed2961edd705ac6c97f5322b326ca7463d7366a3b716623d8" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:42:29.606404+00:00", + "command": "git -C /home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan add AGENTS.md README.md docs/proposals/INDEX.md docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md && git -C /home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan commit --only -F /tmp/dependency-docs-transition-commit-01a1345f.txt -- AGENTS.md README.md docs/proposals/INDEX.md docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md && git -C /home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan push origin feature/dependency-workspace-plan", + "command_sha256": "f4b774990541a7b8b0248f584172294e4900610ef468c7b22cc562204acf136f", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "af527144c2b7e40e59dad252994569f66713bd84933b4797637d66ebaa213f11", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "4a6f3a1abd1638552496bbdc6b57cfe84fac5e377f4b9fd211ffa1787fbc298e", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "af527144c2b7e40e59dad252994569f66713bd84933b4797637d66ebaa213f11", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "4a6f3a1abd1638552496bbdc6b57cfe84fac5e377f4b9fd211ffa1787fbc298e", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "[feature/dependency-workspace-plan 7ba50e5] Record approved branch transition and dependency entry points\n 4 files changed, 9 insertions(+), 7 deletions(-)\nremote: \nremote: Create a new pull request for 'feature/dependency-workspace-plan': \nremote: https://git-panel.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/new/feature/dependency-workspace-plan \nremote: \nTo ssh://git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Documents.git\n * [new branch] feature/dependency-workspace-plan -> feature/dependency-workspace-plan\n", + "output_sha256": "1fcdc02c9730d7156d6849703446bba80f700ff32770a23abae6f697c9711eb3", + "receipt_sha256": "de67bb38c500b09eaea8326a159875d0dd14376b2b7a45d97e6c7d623a8e0a88" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:42:43.583261+00:00", + "command": "python3 -m unittest tests.test_dependency_ci tests.test_ci_credentials -v", + "command_sha256": "aec96627d88bea7de31c0a9715632d3316431ef9b5cd6d15741cb16317092664", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "71e18ea165032b0c5647972135a19b116a434fe8d072e444ddd98d4304bac085", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "4a6f3a1abd1638552496bbdc6b57cfe84fac5e377f4b9fd211ffa1787fbc298e", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "b638bc6284c5cf0df18b1d532b22e7f318bb5b213b38e65ea2d2127245de2f7a", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "4a6f3a1abd1638552496bbdc6b57cfe84fac5e377f4b9fd211ffa1787fbc298e", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) ... ok\ntest_component_ci_executes_nested_go_module_tests (tests.test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) ... ok\ntest_external_npm_git_source_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_external_npm_git_source_rejected_before_authenticated_request) ... ok\ntest_go_prefetch_covers_logging_trace_module (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_covers_logging_trace_module) ... ok\ntest_go_prefetch_rejects_mutation_of_committed_checksums (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_rejects_mutation_of_committed_checksums) ... ok\ntest_go_prefetch_uses_only_registered_private_repo_and_local_toolchain (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain) ... ok\ntest_go_requirement_for_new_toolchain_fails_without_downloading_one (tests.test_dependency_ci.DependencyCITests.test_go_requirement_for_new_toolchain_fails_without_downloading_one) ... ok\ntest_npm_git_package_installs_committed_output_without_prepare (tests.test_dependency_ci.DependencyCITests.test_npm_git_package_installs_committed_output_without_prepare) ... ok\ntest_npm_nonregistry_tarball_rejected_before_request (tests.test_dependency_ci.DependencyCITests.test_npm_nonregistry_tarball_rejected_before_request) ... ok\ntest_npm_provider_prepare_is_rejected_without_execution (tests.test_dependency_ci.DependencyCITests.test_npm_provider_prepare_is_rejected_without_execution) ... ok\ntest_registered_application_lock_materializes_fixed_source (tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source) ... ok\ntest_unregistered_go_module_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_unregistered_go_module_rejected_before_authenticated_request) ... ok\ntest_unregistered_source_lock_is_rejected_before_component_fetch (tests.test_dependency_ci.DependencyCITests.test_unregistered_source_lock_is_rejected_before_component_fetch) ... ok\ntest_candidate_cannot_read_checkout_credentials (tests.test_ci_credentials.CheckoutTests.test_candidate_cannot_read_checkout_credentials) ... ok\ntest_candidate_submodule_update_commands_are_rejected (tests.test_ci_credentials.CheckoutTests.test_candidate_submodule_update_commands_are_rejected) ... ok\ntest_credential_destination_confined_to_injected_server (tests.test_ci_credentials.CheckoutTests.test_credential_destination_confined_to_injected_server) ... ok\ntest_external_or_unlisted_urls_are_rejected_before_component_fetch (tests.test_ci_credentials.CheckoutTests.test_external_or_unlisted_urls_are_rejected_before_component_fetch) ... ok\ntest_inherited_template_hook_does_not_execute_with_credentials (tests.test_ci_credentials.CheckoutTests.test_inherited_template_hook_does_not_execute_with_credentials) ... ok\ntest_nested_external_url_is_rejected_before_authenticated_fetch (tests.test_ci_credentials.CheckoutTests.test_nested_external_url_is_rejected_before_authenticated_fetch) ... ok\ntest_rdm_pin_fetch_is_three_shas_on_the_allowlist (tests.test_ci_credentials.CheckoutTests.test_rdm_pin_fetch_is_three_shas_on_the_allowlist) ... ok\ntest_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials (tests.test_ci_credentials.CheckoutTests.test_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials) ... ok\ntest_redirects_do_not_forward_credential_or_fetch_unlisted_target (tests.test_ci_credentials.CheckoutTests.test_redirects_do_not_forward_credential_or_fetch_unlisted_target) ... ok\n\n----------------------------------------------------------------------\nRan 22 tests in 16.092s\n\nOK\n", + "output_sha256": "2302abae5af5ee3b7cbf2590100004dc45e6af802ac728a162c99b11704ef4f4", + "receipt_sha256": "f4a6b44861a0a48ad87014a26624353ed1fa65b1c55aea2f87ce27d8e6bd5b0f" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:43:14.415768+00:00", + "command": "python3 /tmp/dependency-ci-package-check.py", + "command_sha256": "dc0b57002fd501fafd6d8fc9bdd7e6a68c67605e4e9ffa68d6bcc79c71b1d241", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "bc9b3a0be5d1aed074318e8591f51b2ec03591adc483036b02eb9ffde08585ea", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "4a6f3a1abd1638552496bbdc6b57cfe84fac5e377f4b9fd211ffa1787fbc298e", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "bc9b3a0be5d1aed074318e8591f51b2ec03591adc483036b02eb9ffde08585ea", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "4a6f3a1abd1638552496bbdc6b57cfe84fac5e377f4b9fd211ffa1787fbc298e", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "Agent-System-Core pack --ignore-scripts: cda89816421af5e8ce4e0532a19c921614a3836a6ff3be02a0013ca6db039078\nAgent-System-UI pack --ignore-scripts: 5cdaf3d9cc3f93316d0f0765fd6ffce28bc61e8f125ee3c717cc0f2d118382ac\n\nadded 8 packages in 291ms\nFinal provider exports consumed without lifecycle scripts\nCONSUMER=/tmp/dependency-ci-package-consumer-gon5cq7t\n", + "output_sha256": "14f5511a9c84b6cd40dd1ed26ffe0d5fa0a31f8eeaa6a7b026e75e7f0a6e2300", + "receipt_sha256": "9bc65e1ca78eb389cb16697c025390130959e544de942430944571613fb7d59b" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:43:46.810783+00:00", + "command": "python3 /tmp/dependency-ci-final-probe.py", + "command_sha256": "80350596743319a77dfad276d10b2181afeadc6623bbaa6b01ff4ef5475708c5", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "ead5b8e0d35c90cb4cae93c71bdab5cf9cefc2ea14800332f1e3e9d4b79598c0", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "4a6f3a1abd1638552496bbdc6b57cfe84fac5e377f4b9fd211ffa1787fbc298e", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "ead5b8e0d35c90cb4cae93c71bdab5cf9cefc2ea14800332f1e3e9d4b79598c0", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "4a6f3a1abd1638552496bbdc6b57cfe84fac5e377f4b9fd211ffa1787fbc298e", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "SOURCE_EXPORT=/tmp/dependency-ci-final-source-35886fek\nLogging-System: indexed source exported with no legacy source directories\nError-Code-System: indexed source exported with no legacy source directories\nAgent-System-Core: indexed source exported with no legacy source directories\nAgent-Native: indexed source exported with no legacy source directories\nAgent-Intent: indexed source exported with no legacy source directories\nAgent-Command: indexed source exported with no legacy source directories\nAgent-Squad: indexed source exported with no legacy source directories\nAgent-System-Backend: indexed source exported with no legacy source directories\nAgent-System-UI: indexed source exported with no legacy source directories\nAgent-System-Frontend: indexed source exported with no legacy source directories\nAgent-System-RDM: indexed source exported with no legacy source directories\nGO_SOURCE_CHECK Logging-System/. exit=0\nGO_SOURCE_CHECK Logging-System/examples/trace exit=1\nPREFETCH dependency-files-mutated=True\nGO_SOURCE_CHECK Error-Code-System/. exit=0\nGO_SOURCE_CHECK Agent-System-Core/. exit=0\nGO_SOURCE_CHECK Agent-Native/. exit=0\nGO_SOURCE_CHECK Agent-Intent/. exit=1\nPREFETCH dependency-files-mutated=True\nGO_SOURCE_CHECK Agent-Command/. exit=0\nGO_SOURCE_CHECK Agent-Squad/. exit=0\nGO_SOURCE_CHECK Agent-Squad/adapters/sqlite exit=1\nPREFETCH dependency-files-mutated=True\nGO_SOURCE_CHECK Agent-Squad/adapters/native exit=0\nGO_SOURCE_CHECK Agent-Squad/adapters/intent exit=1\nPREFETCH dependency-files-mutated=True\nGO_SOURCE_CHECK Agent-Squad/adapters/a2a exit=0\nGO_SOURCE_CHECK Agent-Squad/cmd/agent-squad exit=1\nPREFETCH dependency-files-mutated=True\nGO_SOURCE_CHECK Agent-System-Backend/. exit=1\nPREFETCH dependency-files-mutated=True\nGO_SOURCE_CHECK Agent-System-RDM/. exit=1\nPREFETCH dependency-files-mutated=True\nALL_EXPORT_CHECKS_FINISHED\n", + "output_sha256": "c5e4980899d6264d2eeeae791d7c236488609a666f1c194c6a2b1bbc686153fb", + "receipt_sha256": "f46b3d7288ca3b92732e27c50622ec57571acbe1879cd0edb34395d067954687" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:44:04.069580+00:00", + "command": "python3 /tmp/dependency-complete-backend-source-01a1345f.py", + "command_sha256": "3c3dd302cf463d2d0dfe6f906ed94dc4283724e10a9e489482d2d640b2df4890", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "ead5b8e0d35c90cb4cae93c71bdab5cf9cefc2ea14800332f1e3e9d4b79598c0", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "4a6f3a1abd1638552496bbdc6b57cfe84fac5e377f4b9fd211ffa1787fbc298e", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "f9de5afea27cc2a816064bc18930782ac457d5e1b4818adcdda4442878e54016", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "4a6f3a1abd1638552496bbdc6b57cfe84fac5e377f4b9fd211ffa1787fbc298e", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 1, + "output": "RUN ['go', 'get', 'git-ssh.u1680832.nyat.app/weichen/Agent-Squad.git@37b273e35f88473e369e4be70c80e6c8a8545ee3', 'git-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/adapters/native@37b273e35f88473e369e4be70c80e6c8a8545ee3']\ngo: downloading git-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/adapters/native v0.0.0-20261013154435-37b273e35f88\ngo: downloading git-ssh.u1680832.nyat.app/weichen/Agent-Squad.git v0.0.0-20261013154435-37b273e35f88\ngo: upgraded git-ssh.u1680832.nyat.app/weichen/Agent-Squad.git v0.0.0-20261013154230-ed0952e08fd7 => v0.0.0-20261013154435-37b273e35f88\ngo: upgraded git-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/adapters/native v0.0.0-20261013154230-ed0952e08fd7 => v0.0.0-20261013154435-37b273e35f88\nRUN ['go', 'mod', 'download', 'all']\ngo: github.com/stretchr/objx@v0.1.0: Get \"https://proxy.golang.org/github.com/stretchr/objx/@v/v0.1.0.zip\": net/http: TLS handshake timeout\ngo: golang.org/x/net@v0.57.0: Get \"https://proxy.golang.org/golang.org/x/net/@v/v0.57.0.zip\": net/http: TLS handshake timeout\ngo: golang.org/x/term@v0.45.0: Get \"https://proxy.golang.org/golang.org/x/term/@v/v0.45.0.zip\": net/http: TLS handshake timeout\nTraceback (most recent call last):\n File \"/tmp/dependency-complete-backend-source-01a1345f.py\", line 8, in \n print('RUN',list(argv),flush=True);subprocess.run(argv,cwd=repo,env=env,check=True)\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/subprocess.py\", line 578, in run\n raise CalledProcessError(retcode, process.args,\n output=stdout, stderr=stderr)\nsubprocess.CalledProcessError: Command '('go', 'mod', 'download', 'all')' returned non-zero exit status 1.\n", + "output_sha256": "314bcc9e1163935d45baaffa209f1d94618e997356d292e7c173fd0acf22996f", + "receipt_sha256": "f3b4c92f22d989d8b767c4ed12171a851d187dd859b315a5a1b42b03e6c3ffff" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:40:43.300865+00:00", + "command": "make test-governance", + "command_sha256": "9776a8dfcfb8f4c95abc94c40cae3a2c0e91e8f4b91fe95d98085c290e929158", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "f97c606bbb66f8b92d39b4898313020bbcd0c8994a292329b18c6ee519893171", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "64ca34758662cd2e29be9d84136dc314e497bd3e9799b10a9a7302a09a0fe960", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "973fdc1f454e5388c31be29b347458d75fc661ea60baac882279228aa4357056", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "4a6f3a1abd1638552496bbdc6b57cfe84fac5e377f4b9fd211ffa1787fbc298e", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 2, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\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_before_sync_rejects_component_git_lock (test_component_governance.ComponentGovernanceTests.test_before_sync_rejects_component_git_lock) ... ok\ntest_evidence_captures_ignored_component_revision_and_dirty_bytes (test_component_governance.ComponentGovernanceTests.test_evidence_captures_ignored_component_revision_and_dirty_bytes) ... ok\ntest_receipts_reject_component_path_escape (test_component_governance.ComponentGovernanceTests.test_receipts_reject_component_path_escape) ... ok\ntest_developer_package_tarball_overrides_do_not_reach_formal_tests (test_composition.CompositionTests.test_developer_package_tarball_overrides_do_not_reach_formal_tests) ... ok\ntest_dirty_root_lock_is_rejected (test_composition.CompositionTests.test_dirty_root_lock_is_rejected) ... ok\ntest_fixed_commits_embed_assets_without_touching_developer_checkout (test_composition.CompositionTests.test_fixed_commits_embed_assets_without_touching_developer_checkout) ... ok\ntest_fixed_root_governance_and_boundaries_receive_proven_source_map (test_composition.CompositionTests.test_fixed_root_governance_and_boundaries_receive_proven_source_map) ... ok\ntest_frontend_dist_symlink_cannot_import_assets_from_outside_source (test_composition.CompositionTests.test_frontend_dist_symlink_cannot_import_assets_from_outside_source) ... ok\ntest_historical_rdm_product_still_builds_from_legacy_pins (test_composition.CompositionTests.test_historical_rdm_product_still_builds_from_legacy_pins) ... ok\ntest_local_go_replace_is_rejected (test_composition.CompositionTests.test_local_go_replace_is_rejected) ... ok\ntest_locked_missing_revision_is_rejected (test_composition.CompositionTests.test_locked_missing_revision_is_rejected) ... ok\ntest_missing_frontend_assets_fails_before_publishing_binary (test_composition.CompositionTests.test_missing_frontend_assets_fails_before_publishing_binary) ... ok\ntest_modified_go_module_cache_is_rejected_before_product_publication (test_composition.CompositionTests.test_modified_go_module_cache_is_rejected_before_product_publication) ... ok\ntest_npm_local_dependency_overlay_is_rejected (test_composition.CompositionTests.test_npm_local_dependency_overlay_is_rejected) ... ok\ntest_project_test_mode_refuses_missing_boundary_gate (test_composition.CompositionTests.test_project_test_mode_refuses_missing_boundary_gate) ... ok\ntest_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock (test_composition.CompositionTests.test_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock) ... ok\ntest_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache (test_composition.CompositionTests.test_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache) ... ok\ntest_source_path_escape_is_rejected (test_composition.CompositionTests.test_source_path_escape_is_rejected) ... ok\ntest_test_target_checks_fixed_go_library_and_ui_sources (test_composition.CompositionTests.test_test_target_checks_fixed_go_library_and_ui_sources) ... ok\ntest_test_target_runs_real_frontend_and_go_tests (test_composition.CompositionTests.test_test_target_runs_real_frontend_and_go_tests) ... ok\ntest_version_and_plugin_assets_come_from_committed_root (test_composition.CompositionTests.test_version_and_plugin_assets_come_from_committed_root) ... ok\ntest_versioned_rdm_product_entry_uses_fixed_composer (test_composition.CompositionTests.test_versioned_rdm_product_entry_uses_fixed_composer) ... ok\ntest_component_checkout_removes_tokens_before_candidate_executes (test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) ... ok\ntest_component_ci_executes_nested_go_module_tests (test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) ... \n test_component_ci_executes_nested_go_module_tests (test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) (repo='Logging-System') ... FAIL\n test_component_ci_executes_nested_go_module_tests (test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) (repo='Agent-Squad') ... FAIL\ntest_external_npm_git_source_rejected_before_authenticated_request (test_dependency_ci.DependencyCITests.test_external_npm_git_source_rejected_before_authenticated_request) ... ok\ntest_go_prefetch_covers_logging_trace_module (test_dependency_ci.DependencyCITests.test_go_prefetch_covers_logging_trace_module) ... FAIL\ntest_go_prefetch_uses_only_registered_private_repo_and_local_toolchain (test_dependency_ci.DependencyCITests.test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain) ... ok\ntest_go_requirement_for_new_toolchain_fails_without_downloading_one (test_dependency_ci.DependencyCITests.test_go_requirement_for_new_toolchain_fails_without_downloading_one) ... ok\ntest_npm_git_package_installs_committed_output_without_prepare (test_dependency_ci.DependencyCITests.test_npm_git_package_installs_committed_output_without_prepare) ... ok\ntest_npm_nonregistry_tarball_rejected_before_request (test_dependency_ci.DependencyCITests.test_npm_nonregistry_tarball_rejected_before_request) ... ok\ntest_npm_provider_prepare_is_rejected_without_execution (test_dependency_ci.DependencyCITests.test_npm_provider_prepare_is_rejected_without_execution) ... ok\ntest_registered_application_lock_materializes_fixed_source (test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source) ... ok\ntest_unregistered_go_module_rejected_before_authenticated_request (test_dependency_ci.DependencyCITests.test_unregistered_go_module_rejected_before_authenticated_request) ... ok\ntest_unregistered_source_lock_is_rejected_before_component_fetch (test_dependency_ci.DependencyCITests.test_unregistered_source_lock_is_rejected_before_component_fetch) ... ok\ntest_after_snapshot_failure_keeps_command_exit_and_output (test_evidence.EvidenceTests.test_after_snapshot_failure_keeps_command_exit_and_output) ... ok\ntest_all_persisted_and_displayed_text_is_sanitized (test_evidence.EvidenceTests.test_all_persisted_and_displayed_text_is_sanitized) ... ok\ntest_authorization_forms_are_redacted_in_capture_console_and_import (test_evidence.EvidenceTests.test_authorization_forms_are_redacted_in_capture_console_and_import) ... ok\ntest_authorization_forms_are_redacted_on_direct_card_capture (test_evidence.EvidenceTests.test_authorization_forms_are_redacted_on_direct_card_capture) ... ok\ntest_before_after_heads_do_not_relabel_changed_command (test_evidence.EvidenceTests.test_before_after_heads_do_not_relabel_changed_command) ... ok\ntest_capture_does_not_overwrite_an_existing_receipt (test_evidence.EvidenceTests.test_capture_does_not_overwrite_an_existing_receipt) ... ok\ntest_capture_without_card_and_import_without_rerun (test_evidence.EvidenceTests.test_capture_without_card_and_import_without_rerun) ... ok\ntest_child_failure_code_is_preserved (test_evidence.EvidenceTests.test_child_failure_code_is_preserved) ... ok\ntest_command_line_token_arguments_are_redacted (test_evidence.EvidenceTests.test_command_line_token_arguments_are_redacted) ... ok\ntest_dirty_and_untracked_contents_have_object_digests (test_evidence.EvidenceTests.test_dirty_and_untracked_contents_have_object_digests) ... ok\ntest_failed_child_exit_survives_receipt_write_failure (test_evidence.EvidenceTests.test_failed_child_exit_survives_receipt_write_failure) ... ok\ntest_full_output_is_preserved_not_only_tail (test_evidence.EvidenceTests.test_full_output_is_preserved_not_only_tail) ... ok\ntest_import_missing_card_fails_without_losing_receipt (test_evidence.EvidenceTests.test_import_missing_card_fails_without_losing_receipt) ... ok\ntest_import_rejects_unredacted_authorization_with_valid_checksums (test_evidence.EvidenceTests.test_import_rejects_unredacted_authorization_with_valid_checksums) ... ok\ntest_import_retry_is_idempotent (test_evidence.EvidenceTests.test_import_retry_is_idempotent) ... ok\ntest_invalid_field_types_and_forged_source_are_rejected (test_evidence.EvidenceTests.test_invalid_field_types_and_forged_source_are_rejected) ... ok\ntest_known_secret_environment_value_is_redacted_without_label (test_evidence.EvidenceTests.test_known_secret_environment_value_is_redacted_without_label) ... ok\ntest_linked_worktree_import_preserves_source_identity (test_evidence.EvidenceTests.test_linked_worktree_import_preserves_source_identity) ... ok\ntest_missing_card_does_not_execute (test_evidence.EvidenceTests.test_missing_card_does_not_execute) ... ok\ntest_missing_required_snapshot_fields_are_rejected (test_evidence.EvidenceTests.test_missing_required_snapshot_fields_are_rejected) ... ok\ntest_nested_cwd_records_untracked_files_from_repository_root (test_evidence.EvidenceTests.test_nested_cwd_records_untracked_files_from_repository_root) ... ok\ntest_output_digest_checked_even_if_receipt_digest_recomputed (test_evidence.EvidenceTests.test_output_digest_checked_even_if_receipt_digest_recomputed) ... ok\ntest_pipeline_failure_is_recorded_and_returned (test_evidence.EvidenceTests.test_pipeline_failure_is_recorded_and_returned) ... ok\ntest_quoted_credentials_with_spaces_are_fully_redacted (test_evidence.EvidenceTests.test_quoted_credentials_with_spaces_are_fully_redacted) ... ok\ntest_receipt_write_failure_cannot_claim_success (test_evidence.EvidenceTests.test_receipt_write_failure_cannot_claim_success) ... ok\ntest_recorder_environment_does_not_leak_into_nested_commands (test_evidence.EvidenceTests.test_recorder_environment_does_not_leak_into_nested_commands) ... ok\ntest_source_cannot_be_promoted_by_environment (test_evidence.EvidenceTests.test_source_cannot_be_promoted_by_environment) ... ok\ntest_tamper_is_rejected_before_card_append (test_evidence.EvidenceTests.test_tamper_is_rejected_before_card_append) ... ok\ntest_unrelated_repo_cannot_import (test_evidence.EvidenceTests.test_unrelated_repo_cannot_import) ... ok\ntest_validate_precheck_checks_result_and_current_base (test_evidence.EvidenceTests.test_validate_precheck_checks_result_and_current_base) ... ok\ntest_validate_precheck_rejects_successful_arbitrary_command (test_evidence.EvidenceTests.test_validate_precheck_rejects_successful_arbitrary_command) ... ok\ntest_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_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 ce003d7] rdm v2\n 1 file changed, 1 insertion(+)\n create mode 100644 marker\nTo /tmp/svc-db-regress-jxj8wmwx/rdmremote.git\n db24a50..ce003d7 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_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_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_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_does_not_execute_json_receipt_command (test_task.TaskLifecycleTests.test_sync_does_not_execute_json_receipt_command) ... ok\ntest_sync_keeps_json_evidence_fresh_after_metadata_only_changes (test_task.TaskLifecycleTests.test_sync_keeps_json_evidence_fresh_after_metadata_only_changes) ... ok\ntest_sync_keeps_unchanged_component_branch (test_task.TaskLifecycleTests.test_sync_keeps_unchanged_component_branch) ... ok\ntest_sync_materializes_nested_detached_components (test_task.TaskLifecycleTests.test_sync_materializes_nested_detached_components) ... ok\ntest_sync_materializes_updated_component (test_task.TaskLifecycleTests.test_sync_materializes_updated_component) ... ok\ntest_sync_preserves_component_feature_branch (test_task.TaskLifecycleTests.test_sync_preserves_component_feature_branch) ... ok\ntest_sync_preserves_dirty_child (test_task.TaskLifecycleTests.test_sync_preserves_dirty_child) ... ok\ntest_sync_preserves_nested_feature_branch_when_parent_pin_changes (test_task.TaskLifecycleTests.test_sync_preserves_nested_feature_branch_when_parent_pin_changes) ... ok\ntest_sync_reads_legacy_commands_with_escaped_pipes (test_task.TaskLifecycleTests.test_sync_reads_legacy_commands_with_escaped_pipes) ... ok\ntest_sync_still_warns_for_stale_legacy_table_evidence (test_task.TaskLifecycleTests.test_sync_still_warns_for_stale_legacy_table_evidence) ... ok\ntest_sync_warns_for_malformed_json_evidence (test_task.TaskLifecycleTests.test_sync_warns_for_malformed_json_evidence) ... ok\ntest_sync_warns_for_missing_json_receipt_fields_even_with_valid_checksum (test_task.TaskLifecycleTests.test_sync_warns_for_missing_json_receipt_fields_even_with_valid_checksum) ... ok\ntest_sync_warns_for_unresolved_json_evidence_head (test_task.TaskLifecycleTests.test_sync_warns_for_unresolved_json_evidence_head) ... ok\ntest_sync_warns_for_unresolved_legacy_evidence_head (test_task.TaskLifecycleTests.test_sync_warns_for_unresolved_legacy_evidence_head) ... ok\ntest_sync_warns_when_json_after_state_contains_uncommitted_code (test_task.TaskLifecycleTests.test_sync_warns_when_json_after_state_contains_uncommitted_code) ... ok\ntest_sync_warns_when_json_before_state_contains_uncommitted_code (test_task.TaskLifecycleTests.test_sync_warns_when_json_before_state_contains_uncommitted_code) ... ok\ntest_sync_warns_when_json_evidence_predates_noncard_changes (test_task.TaskLifecycleTests.test_sync_warns_when_json_evidence_predates_noncard_changes) ... ok\ntest_verify_rejects_recursive_drift_even_when_root_has_local_edits (test_task.TaskLifecycleTests.test_verify_rejects_recursive_drift_even_when_root_has_local_edits) ... ok\ntest_verify_rejects_uninitialized_component (test_task.TaskLifecycleTests.test_verify_rejects_uninitialized_component) ... ok\ntest_credentials_in_transport_url_are_rejected (test_transport.TransportTests.test_credentials_in_transport_url_are_rejected) ... ok\ntest_remote_revision_download_without_global_git_change (test_transport.TransportTests.test_remote_revision_download_without_global_git_change) ... ok\ntest_verified_local_mirror_mapping_survives_without_authentication (test_transport.TransportTests.test_verified_local_mirror_mapping_survives_without_authentication) ... ok\ntest_actual_go_version_baseline_overlay_and_unlink_restore_version_consumption (test_workspace.WorkspaceTests.test_actual_go_version_baseline_overlay_and_unlink_restore_version_consumption) ... ok\ntest_conflicting_duplicate_nested_component_stops_before_cloning (test_workspace.WorkspaceTests.test_conflicting_duplicate_nested_component_stops_before_cloning) ... ok\ntest_edit_registers_branch_and_prepare_preserves_work (test_workspace.WorkspaceTests.test_edit_registers_branch_and_prepare_preserves_work) ... ok\ntest_equivalent_recursive_nested_sources_share_an_independent_component (test_workspace.WorkspaceTests.test_equivalent_recursive_nested_sources_share_an_independent_component) ... ok\ntest_existing_fixed_checkout_is_not_switched_after_lock_change (test_workspace.WorkspaceTests.test_existing_fixed_checkout_is_not_switched_after_lock_change) ... ok\ntest_fresh_library_edit_resolves_fixed_consumer_and_preserves_consumer_manifest (test_workspace.WorkspaceTests.test_fresh_library_edit_resolves_fixed_consumer_and_preserves_consumer_manifest) ... ok\ntest_git_operation_is_reported_and_not_removed (test_workspace.WorkspaceTests.test_git_operation_is_reported_and_not_removed) ... ok\ntest_ignored_unique_files_and_shared_worktrees_block_branch_changes (test_workspace.WorkspaceTests.test_ignored_unique_files_and_shared_worktrees_block_branch_changes) ... ok\ntest_library_baseline_resolves_transitive_selected_module (test_workspace.WorkspaceTests.test_library_baseline_resolves_transitive_selected_module) ... ok\ntest_library_legacy_baseline_uses_gitlink_not_current_head (test_workspace.WorkspaceTests.test_library_legacy_baseline_uses_gitlink_not_current_head) ... ok\ntest_missing_fixed_source_never_falls_back_to_remote_main (test_workspace.WorkspaceTests.test_missing_fixed_source_never_falls_back_to_remote_main) ... ok\ntest_npm_library_edit_uses_consumer_lock_git_sha_not_remote_main (test_workspace.WorkspaceTests.test_npm_library_edit_uses_consumer_lock_git_sha_not_remote_main) ... ok\ntest_npm_library_rejects_wrong_lock_origin_and_competing_manual_lock (test_workspace.WorkspaceTests.test_npm_library_rejects_wrong_lock_origin_and_competing_manual_lock) ... ok\ntest_partial_initialization_is_retained_and_retry_is_safe (test_workspace.WorkspaceTests.test_partial_initialization_is_retained_and_retry_is_safe) ... ok\ntest_prepare_pins_fixed_commit_and_reuses_without_advancing (test_workspace.WorkspaceTests.test_prepare_pins_fixed_commit_and_reuses_without_advancing) ... ok\ntest_private_git_metadata_symlink_is_not_adopted (test_workspace.WorkspaceTests.test_private_git_metadata_symlink_is_not_adopted) ... ok\ntest_rejects_mismatched_origin_dirty_and_git_lock_without_changes (test_workspace.WorkspaceTests.test_rejects_mismatched_origin_dirty_and_git_lock_without_changes) ... ok\ntest_rejects_paths_and_symlink_escape (test_workspace.WorkspaceTests.test_rejects_paths_and_symlink_escape) ... ok\ntest_rejects_unknown_component_and_bad_branch_without_source_creation (test_workspace.WorkspaceTests.test_rejects_unknown_component_and_bad_branch_without_source_creation) ... ok\ntest_status_does_not_expose_credentials_from_an_unmatched_actual_origin (test_workspace.WorkspaceTests.test_status_does_not_expose_credentials_from_an_unmatched_actual_origin) ... ok\ntest_status_reports_dirty_and_verify_rejects_it (test_workspace.WorkspaceTests.test_status_reports_dirty_and_verify_rejects_it) ... ok\ntest_transition_known_nested_repositories_preserves_external_worktree_and_runs_go (test_workspace.WorkspaceTests.test_transition_known_nested_repositories_preserves_external_worktree_and_runs_go) ... ok\ntest_transition_preserves_committed_symlink_deletion_and_file_type_change (test_workspace.WorkspaceTests.test_transition_preserves_committed_symlink_deletion_and_file_type_change) ... ok\ntest_transition_preserves_staged_blob_internal_symlink_and_reflog_commit (test_workspace.WorkspaceTests.test_transition_preserves_staged_blob_internal_symlink_and_reflog_commit) ... ok\ntest_transition_refuses_initialized_nested_repository (test_workspace.WorkspaceTests.test_transition_refuses_initialized_nested_repository) ... ok\ntest_transition_rejects_external_symlinks_preserving_both_locations (test_workspace.WorkspaceTests.test_transition_rejects_external_symlinks_preserving_both_locations) ... ok\ntest_transition_report_is_readonly_apply_preserves_unique_commits_refs_and_files (test_workspace.WorkspaceTests.test_transition_report_is_readonly_apply_preserves_unique_commits_refs_and_files) ... ok\ntest_unlink_refuses_manual_overlay_changes_without_changing_registration (test_workspace.WorkspaceTests.test_unlink_refuses_manual_overlay_changes_without_changing_registration) ... ok\ntest_workspace_operation_lock_and_user_go_work_are_preserved (test_workspace.WorkspaceTests.test_workspace_operation_lock_and_user_go_work_are_preserved) ... ok\ntest_architecture_gate_preserves_edges_under_workspace_paths_and_new_module_identity (test_workspace_cutover.WorkspaceCutoverTests.test_architecture_gate_preserves_edges_under_workspace_paths_and_new_module_identity) ... ok\ntest_boundary_gate_uses_isolated_map_and_rejects_new_backend_internal_import (test_workspace_cutover.WorkspaceCutoverTests.test_boundary_gate_uses_isolated_map_and_rejects_new_backend_internal_import) ... ok\ntest_finish_preserves_absorbed_metadata_after_legacy_checkout_disappears (test_workspace_cutover.WorkspaceCutoverTests.test_finish_preserves_absorbed_metadata_after_legacy_checkout_disappears) ... ok\ntest_finish_preserves_external_worktree_of_retired_legacy_checkout (test_workspace_cutover.WorkspaceCutoverTests.test_finish_preserves_external_worktree_of_retired_legacy_checkout) ... ok\ntest_finish_preserves_nonbranch_legacy_refs_without_remote_backup (test_workspace_cutover.WorkspaceCutoverTests.test_finish_preserves_nonbranch_legacy_refs_without_remote_backup) ... ok\ntest_make_workspace_commands_prepare_edit_unlink_and_report (test_workspace_cutover.WorkspaceCutoverTests.test_make_workspace_commands_prepare_edit_unlink_and_report) ... ok\ntest_old_task_sync_adopts_new_sources_and_reports_explicit_transition (test_workspace_cutover.WorkspaceCutoverTests.test_old_task_sync_adopts_new_sources_and_reports_explicit_transition) ... ok\ntest_old_task_sync_preserves_unique_legacy_commit_staging_dirty_and_ignored_files (test_workspace_cutover.WorkspaceCutoverTests.test_old_task_sync_preserves_unique_legacy_commit_staging_dirty_and_ignored_files) ... ok\ntest_old_task_text_conflict_keeps_legacy_source_and_reports_no_success (test_workspace_cutover.WorkspaceCutoverTests.test_old_task_text_conflict_keeps_legacy_source_and_reports_no_success) ... ok\ntest_precheck_never_claims_ready_for_unavailable_fixed_rules (test_workspace_cutover.WorkspaceCutoverTests.test_precheck_never_claims_ready_for_unavailable_fixed_rules) ... ok\ntest_precheck_prepares_fixed_rules_outside_project_before_ready (test_workspace_cutover.WorkspaceCutoverTests.test_precheck_prepares_fixed_rules_outside_project_before_ready) ... ok\ntest_precheck_rejects_borrowed_rules_cache_symlink (test_workspace_cutover.WorkspaceCutoverTests.test_precheck_rejects_borrowed_rules_cache_symlink) ... ok\ntest_start_prepares_fixed_sources_without_recursive_submodule_init (test_workspace_cutover.WorkspaceCutoverTests.test_start_prepares_fixed_sources_without_recursive_submodule_init) ... ok\ntest_sync_preserves_edit_branch_and_refuses_changed_declared_source (test_workspace_cutover.WorkspaceCutoverTests.test_sync_preserves_edit_branch_and_refuses_changed_declared_source) ... ok\ntest_verify_detects_active_git_operation_in_nested_retired_root (test_workspace_cutover.WorkspaceCutoverTests.test_verify_detects_active_git_operation_in_nested_retired_root) ... ok\ntest_verify_detects_nested_git_operation_inside_new_workspace (test_workspace_cutover.WorkspaceCutoverTests.test_verify_detects_nested_git_operation_inside_new_workspace) ... 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======================================================================\nFAIL: test_component_ci_executes_nested_go_module_tests (test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) (repo='Logging-System')\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 209, in test_component_ci_executes_nested_go_module_tests\n self.assertNotEqual(result.returncode, 0, \"nested regression was skipped by component CI\")\n ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 0 == 0 : nested regression was skipped by component CI\n\n======================================================================\nFAIL: test_component_ci_executes_nested_go_module_tests (test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) (repo='Agent-Squad')\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 209, in test_component_ci_executes_nested_go_module_tests\n self.assertNotEqual(result.returncode, 0, \"nested regression was skipped by component CI\")\n ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 0 == 0 : nested regression was skipped by component CI\n\n======================================================================\nFAIL: test_go_prefetch_covers_logging_trace_module (test_dependency_ci.DependencyCITests.test_go_prefetch_covers_logging_trace_module)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 223, in test_go_prefetch_covers_logging_trace_module\n self.assertTrue(self.requests, \"trace module's private requirement was not prefetched\")\n ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: [] is not true : trace module's private requirement was not prefetched\n\n----------------------------------------------------------------------\nRan 394 tests in 255.445s\n\nFAILED (failures=3, skipped=18)\nmake[1]: *** [Makefile:227: test-governance] Error 1\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n", + "output_sha256": "32b9dd805349689cc6fe4da2c505afe37647577907e012446f4043d173d4ef8f", + "receipt_sha256": "f6c2e5668af97d3fb75f0efd1e73dfc388a3b67dd3afd5ac9cf1faa102b40ed9" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:44:54.441003+00:00", + "command": "python3 /tmp/dependency-complete-backend-source-01a1345f.py", + "command_sha256": "3c3dd302cf463d2d0dfe6f906ed94dc4283724e10a9e489482d2d640b2df4890", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "973fdc1f454e5388c31be29b347458d75fc661ea60baac882279228aa4357056", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "4a6f3a1abd1638552496bbdc6b57cfe84fac5e377f4b9fd211ffa1787fbc298e", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "3ee00dd0d63714b18462afc78a2c3b7073a9c357e28849e2590c4c3801dd137f", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "4a6f3a1abd1638552496bbdc6b57cfe84fac5e377f4b9fd211ffa1787fbc298e", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "RUN ['go', 'get', 'git-ssh.u1680832.nyat.app/weichen/Agent-Squad.git@37b273e35f88473e369e4be70c80e6c8a8545ee3', 'git-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/adapters/native@37b273e35f88473e369e4be70c80e6c8a8545ee3']\nRUN ['go', 'mod', 'download', 'all']\nRUN ['go', 'test', '-mod=readonly', './...']\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/cmd/agent-system\t0.007s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/cmd/storage-migrate\t0.042s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/eval\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/app\t0.448s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/blobstore\t0.005s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/bus\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/cardsvc\t0.148s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/cmdbus\t0.016s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/config\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ctxasm\t0.005s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/docgen\t0.006s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/evalgold\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/genui\t0.081s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/hostapi\t0.037s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ingest\t0.799s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/intentgate\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/intentsem\t0.004s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/pgbus\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/plugins\t0.264s\n? \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/profiles\t[no test files]\n? \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/projectscope\t[no test files]\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/prompts\t0.078s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/quality\t0.161s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/rag\t0.151s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ratelimit\t0.268s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/route\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/runmgr\t1.045s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/runtime\t1.793s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/server\t9.275s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/settings\t0.050s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/skills\t1.698s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/squadadapter\t0.155s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/store\t2.998s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/surfacesvc\t0.178s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/tools\t13.221s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/wfcompile\t0.078s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/workflow\t0.011s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/extension\t0.009s\n? \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/extension/link\t[no test files]\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/identity\t0.069s\n? \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/web\t[no test files]\n", + "output_sha256": "4b12025b10b8a1a340161b02f0044ae1cac859cd950576e6d13d4af4f933eda9", + "receipt_sha256": "57880289322c781de4dc27376f7fb33a604250469278489eade76ca66a17efe1" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:47:04.096732+00:00", + "command": "python3 -m unittest tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_fetches_fixed_dev_without_executing_code tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits -v", + "command_sha256": "ceb2a35375adc364c4ab51b3058237d8d8da73a618a950b22ebfed05a694838d", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "c2e86a4e3061ecef833b7b96eecd364d92a8617186ffd304268fcdfb8f138ed3", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "41e2b97471bb71128bce960049b14cb383c73e1b70978638b4bcb338ae09bf22", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "c2e86a4e3061ecef833b7b96eecd364d92a8617186ffd304268fcdfb8f138ed3", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "41e2b97471bb71128bce960049b14cb383c73e1b70978638b4bcb338ae09bf22", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 1, + "output": "test_rdm_composition_lock_fetches_fixed_dev_without_executing_code (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_fetches_fixed_dev_without_executing_code) ... FAIL\ntest_rdm_composition_lock_rejects_external_missing_and_malformed_commits (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) ... \n test_rdm_composition_lock_rejects_external_missing_and_malformed_commits (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) (lock={'schema': 1, 'repo': 'http://127.0.0.1:45759/untrusted/receiver', 'commit': 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'}) ... FAIL\n test_rdm_composition_lock_rejects_external_missing_and_malformed_commits (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) (lock={'schema': 1, 'repo': 'ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git'}) ... FAIL\n test_rdm_composition_lock_rejects_external_missing_and_malformed_commits (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) (lock={'schema': 1, 'repo': 'ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git', 'commit': 'main'}) ... FAIL\n\n======================================================================\nFAIL: test_rdm_composition_lock_fetches_fixed_dev_without_executing_code (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_fetches_fixed_dev_without_executing_code)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 239, in test_rdm_composition_lock_fetches_fixed_dev_without_executing_code\n result = self.run_phase(\"Prefetch fixed Dev product composition\",\n workflow=MIGRATION / \"Agent-System-RDM/.gitea/workflows/ci.yml\")\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_ci_credentials.py\", line 25, in workflow_script\n raise AssertionError(f\"Workflow has no executable phase: {name}\")\nAssertionError: Workflow has no executable phase: Prefetch fixed Dev product composition\n\n======================================================================\nFAIL: test_rdm_composition_lock_rejects_external_missing_and_malformed_commits (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) (lock={'schema': 1, 'repo': 'http://127.0.0.1:45759/untrusted/receiver', 'commit': 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'})\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 254, in test_rdm_composition_lock_rejects_external_missing_and_malformed_commits\n result = self.run_phase(\"Prefetch fixed Dev product composition\",\n workflow=MIGRATION / \"Agent-System-RDM/.gitea/workflows/ci.yml\")\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_ci_credentials.py\", line 25, in workflow_script\n raise AssertionError(f\"Workflow has no executable phase: {name}\")\nAssertionError: Workflow has no executable phase: Prefetch fixed Dev product composition\n\n======================================================================\nFAIL: test_rdm_composition_lock_rejects_external_missing_and_malformed_commits (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) (lock={'schema': 1, 'repo': 'ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git'})\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 254, in test_rdm_composition_lock_rejects_external_missing_and_malformed_commits\n result = self.run_phase(\"Prefetch fixed Dev product composition\",\n workflow=MIGRATION / \"Agent-System-RDM/.gitea/workflows/ci.yml\")\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_ci_credentials.py\", line 25, in workflow_script\n raise AssertionError(f\"Workflow has no executable phase: {name}\")\nAssertionError: Workflow has no executable phase: Prefetch fixed Dev product composition\n\n======================================================================\nFAIL: test_rdm_composition_lock_rejects_external_missing_and_malformed_commits (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) (lock={'schema': 1, 'repo': 'ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git', 'commit': 'main'})\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 254, in test_rdm_composition_lock_rejects_external_missing_and_malformed_commits\n result = self.run_phase(\"Prefetch fixed Dev product composition\",\n workflow=MIGRATION / \"Agent-System-RDM/.gitea/workflows/ci.yml\")\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_ci_credentials.py\", line 25, in workflow_script\n raise AssertionError(f\"Workflow has no executable phase: {name}\")\nAssertionError: Workflow has no executable phase: Prefetch fixed Dev product composition\n\n----------------------------------------------------------------------\nRan 2 tests in 1.006s\n\nFAILED (failures=4)\n", + "output_sha256": "ac6753e38fc4ead765c06d05529b36c7bc78962071c77de6f3e4517686d05504", + "receipt_sha256": "98d77e1b1db1498b1da4d17199ec3cec652452ab1c26fd6a04fbc6b6a3556f3d" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:47:50.162496+00:00", + "command": "python3 /tmp/dependency-complete-backend-source-01a1345f.py", + "command_sha256": "3c3dd302cf463d2d0dfe6f906ed94dc4283724e10a9e489482d2d640b2df4890", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "2cb3a82cedc465e0ea4dcaaf38c40ef68938b565471911a8ce53aef5bf4e303f", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "41e2b97471bb71128bce960049b14cb383c73e1b70978638b4bcb338ae09bf22", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "2cb3a82cedc465e0ea4dcaaf38c40ef68938b565471911a8ce53aef5bf4e303f", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "5767da13f45c0649d090e19efcc9c5e007747cd1fa5a9374f4335f27ae0caa39", + "tests/test_dependency_ci.py": "41e2b97471bb71128bce960049b14cb383c73e1b70978638b4bcb338ae09bf22", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "RUN ['go', 'get', 'git-ssh.u1680832.nyat.app/weichen/Agent-Squad.git@37b273e35f88473e369e4be70c80e6c8a8545ee3', 'git-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/adapters/native@37b273e35f88473e369e4be70c80e6c8a8545ee3']\nRUN ['go', 'mod', 'tidy']\nRUN ['go', 'mod', 'download']\nRUN ['go', 'list', '-mod=readonly', '-deps', '-test', './...']\ninternal/goarch\nunsafe\ninternal/abi\ninternal/unsafeheader\ninternal/cpu\ninternal/bytealg\ninternal/byteorder\ninternal/chacha8rand\ninternal/coverage/rtcov\ninternal/godebugs\ninternal/goexperiment\ninternal/goos\ninternal/profilerecord\ninternal/runtime/atomic\ninternal/runtime/syscall/linux\nmath/bits\ninternal/strconv\ninternal/runtime/cgroup\ninternal/runtime/exithook\ninternal/runtime/gc\ninternal/runtime/sys\ninternal/runtime/gc/scan\ninternal/asan\ninternal/msan\ninternal/race\ninternal/runtime/math\ninternal/runtime/maps\ninternal/runtime/pprof/label\ninternal/stringslite\ninternal/trace/tracev2\nruntime\ninternal/reflectlite\nerrors\nsync/atomic\ninternal/sync\ninternal/synctest\nsync\nio\niter\nunicode\nunicode/utf8\nbytes\ncmp\nencoding\nencoding/json/internal\nencoding/json/internal/jsonflags\nencoding/json/internal/jsonopts\nmath\nslices\nstrconv\nstrings\nunicode/utf16\nencoding/json/internal/jsonwire\nencoding/json/jsontext\nencoding/base32\nencoding/base64\nreflect\nencoding/binary\ninternal/fmtsort\ninternal/oserror\npath\nsyscall\ntime\nio/fs\ninternal/filepathlite\ninternal/syscall/unix\ninternal/poll\ninternal/syscall/execenv\ninternal/testlog\nos\nfmt\nencoding/hex\nencoding/json/v2\nencoding/json\nflag\ncontext\nhash\ncrypto\ninternal/bisect\ninternal/godebug\ncrypto/internal/fips140deps/godebug\ncrypto/internal/fips140\ncrypto/internal/fips140/alias\ncrypto/internal/fips140deps/byteorder\ncrypto/internal/fips140deps/cpu\ncrypto/internal/impl\ncrypto/internal/fips140/sha256\ncrypto/internal/constanttime\ncrypto/internal/fips140/subtle\ncrypto/internal/fips140/sha3\ncrypto/internal/fips140/sha512\ncrypto/internal/fips140/hmac\ncrypto/internal/fips140/check\ncrypto/internal/fips140/aes\ncrypto/internal/fips140deps/time\ncrypto/internal/entropy/v1.0.0\ncrypto/internal/sysrand\ncrypto/internal/fips140/drbg\ncrypto/internal/fips140/aes/gcm\ncrypto/fips140\ncrypto/internal/fips140only\ncrypto/subtle\ncrypto/cipher\ncrypto/internal/boring/sig\ncrypto/internal/boring\nmath/rand/v2\ncrypto/internal/randutil\ncrypto/internal/rand\nmath/rand\nmath/big\ncrypto/rand\nsort\nregexp/syntax\nregexp\ngit-ssh.u1680832.nyat.app/weichen/Agent-Command.git\npath/filepath\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/checkpoint\nbufio\ncompress/flate\nhash/crc32\ncompress/gzip\ncontainer/list\ncrypto/aes\ncrypto/des\ncrypto/internal/fips140/nistec/fiat\ncrypto/internal/fips140/nistec\ncrypto/internal/fips140/ecdh\ncrypto/internal/fips140/edwards25519/field\ncrypto/ecdh\ncrypto/elliptic\ncrypto/internal/boring/bbig\ncrypto/internal/fips140/bigmod\ncrypto/internal/fips140/ecdsa\nweak\ncrypto/internal/fips140cache\ncrypto/sha3\ncrypto/internal/fips140hash\ncrypto/sha512\ninternal/saferio\nencoding/asn1\nvendor/golang.org/x/crypto/cryptobyte/asn1\nvendor/golang.org/x/crypto/cryptobyte\ncrypto/ecdsa\ncrypto/internal/fips140/edwards25519\ncrypto/internal/fips140/ed25519\ncrypto/ed25519\ncrypto/internal/fips140/hkdf\ncrypto/hkdf\ncrypto/hmac\ncrypto/internal/fips140/mlkem\ncrypto/mlkem\ncrypto/sha256\nvendor/golang.org/x/crypto/internal/alias\nvendor/golang.org/x/crypto/chacha20\nvendor/golang.org/x/crypto/internal/poly1305\nvendor/golang.org/x/sys/cpu\nvendor/golang.org/x/crypto/chacha20poly1305\ncrypto/hpke\ncrypto/internal/fips140/tls12\ncrypto/internal/fips140/tls13\ncrypto/md5\ncrypto/internal/fips140/mldsa\ncrypto/mldsa\ncrypto/rc4\ncrypto/internal/fips140/rsa\ncrypto/rsa\ncrypto/sha1\ncrypto/tls/internal/fips140tls\ncrypto/dsa\ncrypto/x509/pkix\nencoding/pem\nmaps\nvendor/golang.org/x/net/dns/dnsmessage\ninternal/nettrace\ninternal/singleflight\nunique\nnet/netip\nruntime/cgo\nnet\nnet/url\ncrypto/x509\ncrypto/tls\nvendor/golang.org/x/text/transform\nlog/internal\nlog\nvendor/golang.org/x/text/unicode/bidi\nvendor/golang.org/x/text/secure/bidirule\nvendor/golang.org/x/text/unicode/norm\nvendor/golang.org/x/net/idna\nnet/textproto\nvendor/golang.org/x/net/http/httpguts\nvendor/golang.org/x/net/http/httpproxy\nmime\nmime/quotedprintable\nmime/multipart\nnet/http/httptrace\nnet/http/internal\nnet/http/internal/ascii\nvendor/golang.org/x/net/http2/hpack\nnet/http/internal/httpcommon\nnet/http/internal/httpsfv\nnet/http/internal/http2\nnet/http\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/llm\nembed\nos/exec\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/codeorch\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/filestate\nhtml\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/tools\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/mcp\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/policy\ngit-ssh.u1680832.nyat.app/weichen/Logging-System.git/logsys\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/telemetry\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/exec\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/hooks\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/memory\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/reminders\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/session\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/promptx\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/skills\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/subagent\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/adapters/native\narchive/zip\nencoding/xml\ngit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/textextract\ngit-ssh.u1680832.nyat.app/weichen/Error-Code-System.git/errcode\nhash/fnv\ngit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/squad\ngit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/adapters/native\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/blobstore\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Core.git\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/bus\ndatabase/sql/internal\nuuid\ndatabase/sql/driver\ndatabase/sql\ngithub.com/jackc/pgx/v5/internal/pgio\ngithub.com/jackc/pgx/v5/internal/sanitize\ncrypto/internal/fips140/pbkdf2\ncrypto/pbkdf2\ngithub.com/jackc/pgpassfile\ngithub.com/jackc/pgservicefile\ngithub.com/jackc/pgx/v5/internal/iobufpool\ngithub.com/jackc/pgx/v5/pgconn/ctxwatch\ngithub.com/jackc/pgx/v5/pgconn/internal/bgreader\ngithub.com/jackc/pgx/v5/pgproto3\ngithub.com/jackc/pgx/v5/pgtype\ngolang.org/x/text/internal/tag\ngolang.org/x/text/internal/language\ngolang.org/x/text/internal/language/compact\ngolang.org/x/text/language\ngolang.org/x/text/internal\ngolang.org/x/text/transform\ngolang.org/x/text/unicode/norm\ngolang.org/x/text/cases\ngolang.org/x/text/runes\ngolang.org/x/text/unicode/bidi\ngolang.org/x/text/secure/bidirule\ngolang.org/x/text/width\ngolang.org/x/text/secure/precis\nos/user\ngithub.com/jackc/pgx/v5/pgconn\ngithub.com/jackc/pgx/v5/internal/stmtcache\ngithub.com/jackc/pgx/v5\ngithub.com/jackc/puddle/v2/internal/genstack\ngolang.org/x/sync/semaphore\ngithub.com/jackc/puddle/v2\ngithub.com/jackc/pgx/v5/pgxpool\ngithub.com/jackc/pgx/v5/stdlib\ngolang.org/x/sys/cpu\ngolang.org/x/crypto/blake2b\ngolang.org/x/crypto/argon2\ngolang.org/x/sys/unix\ngithub.com/dustin/go-humanize\ngithub.com/google/uuid\nmodernc.org/libc/uuid/uuid\ngithub.com/remyoudompheng/bigfft\nmodernc.org/mathutil\nmodernc.org/memory\nos/signal\nruntime/debug\nmodernc.org/libc\nmodernc.org/libc/sys/types\nmodernc.org/sqlite/lib\nmodernc.org/sqlite/vtab\nmodernc.org/sqlite\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/store\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/cardsvc\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/cmdbus\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/config\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/extension\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/genui\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/hostapi\nhash/adler32\ncompress/zlib\nencoding/ascii85\ngithub.com/ledongthuc/pdf\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ingest\ngit-ssh.u1680832.nyat.app/weichen/Agent-Intent.git/intent\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/intentgate\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/intentsem\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/pgbus\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/settings\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/skills\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/quality\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/tools\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/workflow\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/plugins\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/profiles\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/projectscope\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/prompts\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/rag\ngithub.com/cespare/xxhash/v2\ngithub.com/dgryski/go-rendezvous\ngithub.com/redis/go-redis/v9/auth\ngithub.com/redis/go-redis/v9/internal/rand\ngithub.com/redis/go-redis/v9/internal/util\ngithub.com/redis/go-redis/v9/internal\ngithub.com/redis/go-redis/v9/internal/hashtag\ngithub.com/redis/go-redis/v9/internal/hscan\ngithub.com/redis/go-redis/v9/internal/proto\ngithub.com/redis/go-redis/v9/internal/pool\ngithub.com/redis/go-redis/v9\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ratelimit\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/route\ngit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/gates\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ctxasm\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/docgen\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/squadadapter\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/wfcompile\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/runtime\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/runmgr\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/surfacesvc\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/web\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/server\ngit-ssh.u1680832.nyat.app/weichen/Logging-System.git/sink\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/app\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/identity\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/cmd/agent-system\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/cmd/storage-migrate\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/eval\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/evalgold\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/extension/link\ninternal/sysinfo\nruntime/trace\ntesting\ngo/token\ngo/scanner\ngo/ast\ngo/build/constraint\ngo/parser\ninternal/fuzz\ntext/tabwriter\nruntime/pprof\ntesting/internal/testdeps\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/cmd/agent-system [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/cmd/agent-system.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/cmd/agent-system.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/cmd/storage-migrate [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/cmd/storage-migrate.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/cmd/storage-migrate.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/eval [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/eval.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/eval.test\ninternal/gate\ninternal/nettest\nnet/http/internal/testcert\nnet/http/httptest\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/app [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/app.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/app.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/blobstore [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/blobstore.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/blobstore.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/bus [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/bus.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/bus.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/cardsvc [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/cardsvc.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/cardsvc.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/cmdbus [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/cmdbus.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/cmdbus.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/config [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/config.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/config.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ctxasm [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ctxasm.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ctxasm.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/docgen [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/docgen.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/docgen.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/evalgold [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/evalgold.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/evalgold.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/genui [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/genui.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/genui.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/hostapi [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/hostapi.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/hostapi.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ingest [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ingest.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ingest.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/intentgate [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/intentgate.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/intentgate.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/intentsem [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/intentsem.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/intentsem.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/pgbus [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/pgbus.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/pgbus.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/plugins [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/plugins.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/plugins.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/prompts [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/prompts.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/prompts.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/quality [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/quality.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/quality.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/rag [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/rag.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/rag.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ratelimit [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ratelimit.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ratelimit.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/route [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/route.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/route.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/runmgr [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/runmgr.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/runmgr.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/runtime [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/runtime.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/runtime.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/server [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/server.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/server.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/settings [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/settings.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/settings.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/skills [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/skills.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/skills.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/squadadapter [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/squadadapter.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/squadadapter.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/store [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/store.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/store.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/surfacesvc [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/surfacesvc.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/surfacesvc.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/tools [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/tools.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/tools.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/wfcompile [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/wfcompile.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/wfcompile.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/workflow [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/workflow.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/workflow.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/extension [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/extension.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/extension.test\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/identity [git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/identity.test]\ngit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/identity.test\nRUN ['go', 'test', '-mod=readonly', './...']\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/cmd/agent-system\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/cmd/storage-migrate\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/eval\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/app\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/blobstore\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/bus\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/cardsvc\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/cmdbus\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/config\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ctxasm\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/docgen\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/evalgold\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/genui\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/hostapi\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ingest\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/intentgate\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/intentsem\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/pgbus\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/plugins\t(cached)\n? \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/profiles\t[no test files]\n? \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/projectscope\t[no test files]\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/prompts\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/quality\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/rag\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ratelimit\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/route\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/runmgr\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/runtime\t1.456s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/server\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/settings\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/skills\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/squadadapter\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/store\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/surfacesvc\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/tools\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/wfcompile\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/workflow\t(cached)\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/extension\t(cached)\n? \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/extension/link\t[no test files]\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/identity\t(cached)\n? \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/web\t[no test files]\n", + "output_sha256": "cf4c9545b8637a79cdd55676a14cd9b515c7291e8694243906a96110e4cfcebb", + "receipt_sha256": "bb8130d466a9ee44223a5f4b12ac5e9afc0d325ce2c171f45968124acefbce60" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:49:07.820042+00:00", + "command": "python3 -B -m unittest discover -s tests -p test_composition.py -k unused_transitive -v", + "command_sha256": "309485443f56e8034dbfc902e21495bb68fe9d3e9ef90a04fe9728aae09d5d2d", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "830ad0e553f4a5f51363d909492ce403c83086da6d6602af1fc5e04db0406949", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "c0a05740d34819add6ab43b57b1d19cc6b5b95d662d01194d953618a6f98e62c", + "tests/test_dependency_ci.py": "41e2b97471bb71128bce960049b14cb383c73e1b70978638b4bcb338ae09bf22", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "830ad0e553f4a5f51363d909492ce403c83086da6d6602af1fc5e04db0406949", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "880b661f2f03b715436b7a4fd10b2cf928eda80ae807f15beba126e30d721d71", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "c0a05740d34819add6ab43b57b1d19cc6b5b95d662d01194d953618a6f98e62c", + "tests/test_dependency_ci.py": "41e2b97471bb71128bce960049b14cb383c73e1b70978638b4bcb338ae09bf22", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 1, + "output": "test_unused_transitive_zip_does_not_require_consumer_sum_rewrite (test_composition.CompositionTests.test_unused_transitive_zip_does_not_require_consumer_sum_rewrite) ... FAIL\n\n======================================================================\nFAIL: test_unused_transitive_zip_does_not_require_consumer_sum_rewrite (test_composition.CompositionTests.test_unused_transitive_zip_does_not_require_consumer_sum_rewrite)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_composition.py\", line 161, in test_unused_transitive_zip_does_not_require_consumer_sum_rewrite\n self.assertEqual(result.returncode, 0, result.stdout)\n ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 2 != 0 : [composition] git clone --no-checkout --no-hardlinks -- /tmp/composition-test-hsbe_smj/frontend /tmp/agent-system-composition-vgw995bo/Agent-System-Frontend-git\nCloning into '/tmp/agent-system-composition-vgw995bo/Agent-System-Frontend-git'...\ndone.\n[composition] git clone --no-checkout --no-hardlinks -- /tmp/composition-test-hsbe_smj/backend /tmp/agent-system-composition-vgw995bo/Agent-System-Backend-git\nCloning into '/tmp/agent-system-composition-vgw995bo/Agent-System-Backend-git'...\ndone.\n[composition] npm ci --ignore-scripts --no-audit --no-fund\n\nup to date in 79ms\n[composition] npm run build\n\n> composition-fixture@1.0.0 build\n> node build.cjs\n\n[composition] go mod verify\ncomposition: Go acquisition changed committed go.sum; update the consumer first\nall modules verified\n\n\n----------------------------------------------------------------------\nRan 1 test in 0.547s\n\nFAILED (failures=1)\n", + "output_sha256": "618aae73e0a76161c2d888ab1ee14db689ebd1503558493f2f27115250ef80bc", + "receipt_sha256": "e02b9d80ce36fa85a911cf3d2cc747cc7f471005be12a9dbed665d506489dcc5" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:49:32.869517+00:00", + "command": "python3 -B -m unittest discover -s tests -p test_composition.py -v", + "command_sha256": "57fafdaf6207351efb67ec6dd35d781e8ece54dba12585050f373432d3aef46f", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "3c7bbfab5bd08a6140d1d09f0e37a613a60174b3ef9d3756e891feca4ca02264", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "7e94c84ae43f83fefb65576136425a58739b2a50a39f34c3e43be45ce8b97bb6", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "c0a05740d34819add6ab43b57b1d19cc6b5b95d662d01194d953618a6f98e62c", + "tests/test_dependency_ci.py": "41e2b97471bb71128bce960049b14cb383c73e1b70978638b4bcb338ae09bf22", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "abd1fe04df486eadf62e3cd2e0335dac97a16bcaf7227b46ba2f034e20149d6b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "4045d3e24dba5f3a8738472a417c987975df4af4a29a785f84b372a1675db18e", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "7e94c84ae43f83fefb65576136425a58739b2a50a39f34c3e43be45ce8b97bb6", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "c0a05740d34819add6ab43b57b1d19cc6b5b95d662d01194d953618a6f98e62c", + "tests/test_dependency_ci.py": "41e2b97471bb71128bce960049b14cb383c73e1b70978638b4bcb338ae09bf22", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "test_developer_package_tarball_overrides_do_not_reach_formal_tests (test_composition.CompositionTests.test_developer_package_tarball_overrides_do_not_reach_formal_tests) ... ok\ntest_dirty_root_lock_is_rejected (test_composition.CompositionTests.test_dirty_root_lock_is_rejected) ... ok\ntest_fixed_commits_embed_assets_without_touching_developer_checkout (test_composition.CompositionTests.test_fixed_commits_embed_assets_without_touching_developer_checkout) ... ok\ntest_fixed_root_governance_and_boundaries_receive_proven_source_map (test_composition.CompositionTests.test_fixed_root_governance_and_boundaries_receive_proven_source_map) ... ok\ntest_frontend_dist_symlink_cannot_import_assets_from_outside_source (test_composition.CompositionTests.test_frontend_dist_symlink_cannot_import_assets_from_outside_source) ... ok\ntest_historical_rdm_product_still_builds_from_legacy_pins (test_composition.CompositionTests.test_historical_rdm_product_still_builds_from_legacy_pins) ... ok\ntest_local_go_replace_is_rejected (test_composition.CompositionTests.test_local_go_replace_is_rejected) ... ok\ntest_locked_missing_revision_is_rejected (test_composition.CompositionTests.test_locked_missing_revision_is_rejected) ... ok\ntest_missing_frontend_assets_fails_before_publishing_binary (test_composition.CompositionTests.test_missing_frontend_assets_fails_before_publishing_binary) ... ok\ntest_modified_go_module_cache_is_rejected_before_product_publication (test_composition.CompositionTests.test_modified_go_module_cache_is_rejected_before_product_publication) ... ok\ntest_npm_local_dependency_overlay_is_rejected (test_composition.CompositionTests.test_npm_local_dependency_overlay_is_rejected) ... ok\ntest_project_test_mode_refuses_missing_boundary_gate (test_composition.CompositionTests.test_project_test_mode_refuses_missing_boundary_gate) ... ok\ntest_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock (test_composition.CompositionTests.test_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock) ... ok\ntest_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache (test_composition.CompositionTests.test_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache) ... ok\ntest_source_path_escape_is_rejected (test_composition.CompositionTests.test_source_path_escape_is_rejected) ... ok\ntest_test_target_checks_fixed_go_library_and_ui_sources (test_composition.CompositionTests.test_test_target_checks_fixed_go_library_and_ui_sources) ... ok\ntest_test_target_runs_real_frontend_and_go_tests (test_composition.CompositionTests.test_test_target_runs_real_frontend_and_go_tests) ... ok\ntest_unused_transitive_zip_does_not_require_consumer_sum_rewrite (test_composition.CompositionTests.test_unused_transitive_zip_does_not_require_consumer_sum_rewrite) ... ok\ntest_version_and_plugin_assets_come_from_committed_root (test_composition.CompositionTests.test_version_and_plugin_assets_come_from_committed_root) ... ok\ntest_versioned_rdm_product_entry_uses_fixed_composer (test_composition.CompositionTests.test_versioned_rdm_product_entry_uses_fixed_composer) ... ok\n\n----------------------------------------------------------------------\nRan 20 tests in 16.288s\n\nOK\n", + "output_sha256": "e5cb5fb64429ad277286d726b884a1e7e829ce450f8f139183fa6a3dd125c5c3", + "receipt_sha256": "71fd2086fca2bdb44dc72d29f3857d6f5557f67f108138afe817121e75f06903" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:51:25.915249+00:00", + "command": "python3 -m unittest tests.test_dependency_ci tests.test_ci_credentials -v", + "command_sha256": "aec96627d88bea7de31c0a9715632d3316431ef9b5cd6d15741cb16317092664", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "a7f21f450227cb0e2e9519e45dd1cd3d0aa7c75ded01a1c9bd0582d98f0bb0cb", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "7e94c84ae43f83fefb65576136425a58739b2a50a39f34c3e43be45ce8b97bb6", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "c0a05740d34819add6ab43b57b1d19cc6b5b95d662d01194d953618a6f98e62c", + "tests/test_dependency_ci.py": "6f85f4a4969ffb6ec1a2cc1a55c9d941a9f1faa5b0b35c6c163052ff55250a9a", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "a7f21f450227cb0e2e9519e45dd1cd3d0aa7c75ded01a1c9bd0582d98f0bb0cb", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "7e94c84ae43f83fefb65576136425a58739b2a50a39f34c3e43be45ce8b97bb6", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "c0a05740d34819add6ab43b57b1d19cc6b5b95d662d01194d953618a6f98e62c", + "tests/test_dependency_ci.py": "6f85f4a4969ffb6ec1a2cc1a55c9d941a9f1faa5b0b35c6c163052ff55250a9a", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 1, + "output": "test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) ... ok\ntest_component_ci_executes_nested_go_module_tests (tests.test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) ... ok\ntest_external_npm_git_source_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_external_npm_git_source_rejected_before_authenticated_request) ... ok\ntest_go_prefetch_covers_logging_trace_module (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_covers_logging_trace_module) ... ERROR\ntest_go_prefetch_rejects_mutation_of_committed_checksums (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_rejects_mutation_of_committed_checksums) ... ok\ntest_go_prefetch_uses_only_registered_private_repo_and_local_toolchain (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain) ... ERROR\ntest_go_requirement_for_new_toolchain_fails_without_downloading_one (tests.test_dependency_ci.DependencyCITests.test_go_requirement_for_new_toolchain_fails_without_downloading_one) ... ok\ntest_npm_git_package_installs_committed_output_without_prepare (tests.test_dependency_ci.DependencyCITests.test_npm_git_package_installs_committed_output_without_prepare) ... ok\ntest_npm_nonregistry_tarball_rejected_before_request (tests.test_dependency_ci.DependencyCITests.test_npm_nonregistry_tarball_rejected_before_request) ... ok\ntest_npm_provider_prepare_is_rejected_without_execution (tests.test_dependency_ci.DependencyCITests.test_npm_provider_prepare_is_rejected_without_execution) ... ok\ntest_rdm_composition_lock_fetches_fixed_dev_without_executing_code (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_fetches_fixed_dev_without_executing_code) ... ok\ntest_rdm_composition_lock_rejects_external_missing_and_malformed_commits (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) ... ok\ntest_registered_application_lock_materializes_fixed_source (tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source) ... ok\ntest_unregistered_go_module_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_unregistered_go_module_rejected_before_authenticated_request) ... ok\ntest_unregistered_source_lock_is_rejected_before_component_fetch (tests.test_dependency_ci.DependencyCITests.test_unregistered_source_lock_is_rejected_before_component_fetch) ... ok\ntest_candidate_cannot_read_checkout_credentials (tests.test_ci_credentials.CheckoutTests.test_candidate_cannot_read_checkout_credentials) ... ok\ntest_candidate_submodule_update_commands_are_rejected (tests.test_ci_credentials.CheckoutTests.test_candidate_submodule_update_commands_are_rejected) ... ok\ntest_credential_destination_confined_to_injected_server (tests.test_ci_credentials.CheckoutTests.test_credential_destination_confined_to_injected_server) ... ok\ntest_external_or_unlisted_urls_are_rejected_before_component_fetch (tests.test_ci_credentials.CheckoutTests.test_external_or_unlisted_urls_are_rejected_before_component_fetch) ... ok\ntest_inherited_template_hook_does_not_execute_with_credentials (tests.test_ci_credentials.CheckoutTests.test_inherited_template_hook_does_not_execute_with_credentials) ... ok\ntest_nested_external_url_is_rejected_before_authenticated_fetch (tests.test_ci_credentials.CheckoutTests.test_nested_external_url_is_rejected_before_authenticated_fetch) ... ok\ntest_rdm_pin_fetch_is_three_shas_on_the_allowlist (tests.test_ci_credentials.CheckoutTests.test_rdm_pin_fetch_is_three_shas_on_the_allowlist) ... ok\ntest_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials (tests.test_ci_credentials.CheckoutTests.test_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials) ... ok\ntest_redirects_do_not_forward_credential_or_fetch_unlisted_target (tests.test_ci_credentials.CheckoutTests.test_redirects_do_not_forward_credential_or_fetch_unlisted_target) ... ok\n\n======================================================================\nERROR: test_go_prefetch_covers_logging_trace_module (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_covers_logging_trace_module)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 240, in test_go_prefetch_covers_logging_trace_module\n (example / \"go.sum\").write_text(self.fixture_checksums(MODULE, sha))\n ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 67, in fixture_checksums\n result = subprocess.run([\"go\", \"mod\", \"download\", \"-json\"], cwd=directory, env=env,\n capture_output=True, text=True, check=True)\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/subprocess.py\", line 578, in run\n raise CalledProcessError(retcode, process.args,\n output=stdout, stderr=stderr)\nsubprocess.CalledProcessError: Command '['go', 'mod', 'download', '-json']' returned non-zero exit status 1.\n\n======================================================================\nERROR: test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 106, in test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain\n (self.checkout / \"go.sum\").write_text(self.fixture_checksums(MODULE, sha))\n ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_dependency_ci.py\", line 67, in fixture_checksums\n result = subprocess.run([\"go\", \"mod\", \"download\", \"-json\"], cwd=directory, env=env,\n capture_output=True, text=True, check=True)\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/subprocess.py\", line 578, in run\n raise CalledProcessError(retcode, process.args,\n output=stdout, stderr=stderr)\nsubprocess.CalledProcessError: Command '['go', 'mod', 'download', '-json']' returned non-zero exit status 1.\n\n----------------------------------------------------------------------\nRan 24 tests in 17.075s\n\nFAILED (errors=2)\n", + "output_sha256": "64250547d7cef9f683dab51f9bb8b4f2ef834bc734767de860adedb51a0734e1", + "receipt_sha256": "dc1a3c223feb5fee2ec401f0cd9eae47e811d98306f0d7ae7162482b6d69eb4a" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:52:08.863736+00:00", + "command": "python3 /tmp/dependency-ci-final-probe.py", + "command_sha256": "80350596743319a77dfad276d10b2181afeadc6623bbaa6b01ff4ef5475708c5", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "e1e78c819d754c2be15ae22e439cfa05c83d40e7a268c76cfde33565daec61c1", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "7e94c84ae43f83fefb65576136425a58739b2a50a39f34c3e43be45ce8b97bb6", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "c0a05740d34819add6ab43b57b1d19cc6b5b95d662d01194d953618a6f98e62c", + "tests/test_dependency_ci.py": "6f85f4a4969ffb6ec1a2cc1a55c9d941a9f1faa5b0b35c6c163052ff55250a9a", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "e1e78c819d754c2be15ae22e439cfa05c83d40e7a268c76cfde33565daec61c1", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "7e94c84ae43f83fefb65576136425a58739b2a50a39f34c3e43be45ce8b97bb6", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "c0a05740d34819add6ab43b57b1d19cc6b5b95d662d01194d953618a6f98e62c", + "tests/test_dependency_ci.py": "0304eca6d538bcefb9b908743eca573b1935474b07fd26c06ca6f07563122313", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 1, + "output": "SOURCE_EXPORT=/tmp/dependency-ci-final-source-loo_smkn\nLogging-System: indexed source exported with no legacy source directories\nError-Code-System: indexed source exported with no legacy source directories\nAgent-System-Core: indexed source exported with no legacy source directories\nAgent-Native: indexed source exported with no legacy source directories\nAgent-Intent: indexed source exported with no legacy source directories\nAgent-Command: indexed source exported with no legacy source directories\nAgent-Squad: indexed source exported with no legacy source directories\nAgent-System-Backend: indexed source exported with no legacy source directories\nAgent-System-UI: indexed source exported with no legacy source directories\nAgent-System-Frontend: indexed source exported with no legacy source directories\nAgent-System-RDM: indexed source exported with no legacy source directories\nGO_SOURCE_CHECK Logging-System/. exit=0\nGO_SOURCE_CHECK Logging-System/examples/trace exit=1\nPREFETCH dependency-files-mutated=True\nGO_SOURCE_CHECK Error-Code-System/. exit=0\nGO_SOURCE_CHECK Agent-System-Core/. exit=0\nGO_SOURCE_CHECK Agent-Native/. exit=0\nGO_SOURCE_CHECK Agent-Intent/. exit=0\nGO_SOURCE_CHECK Agent-Command/. exit=0\nGO_SOURCE_CHECK Agent-Squad/. exit=0\nGO_SOURCE_CHECK Agent-Squad/adapters/sqlite exit=0\nGO_SOURCE_CHECK Agent-Squad/adapters/native exit=0\nGO_SOURCE_CHECK Agent-Squad/adapters/intent exit=0\nGO_SOURCE_CHECK Agent-Squad/adapters/a2a exit=0\nGO_SOURCE_CHECK Agent-Squad/cmd/agent-squad exit=0\nGO_SOURCE_CHECK Agent-System-Backend/. exit=0\nGO_SOURCE_CHECK Agent-System-RDM/. exit=0\nALL_EXPORT_CHECKS_FINISHED failures=1\n", + "output_sha256": "73816ccbe917eb52658d8bc8755239327fcfcdafb1c31fb16940c6879665d646", + "receipt_sha256": "2618b182ab673ed832784ab2c871c2b1495037443f99e02847d7f53f78b23015" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:53:53.192957+00:00", + "command": "python3 -B -m unittest discover -s tests -p test_composition.py -k fixed_root_governance -v", + "command_sha256": "79b5a0e3a86e8c818c2a0a1a2a5027a1ca617facda853ab7a1dd59b740b87396", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "e30ce81006075ca544b6e2c4fe70af857b6d43a0c9d27bd336311ca57f4f2c78", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "7e94c84ae43f83fefb65576136425a58739b2a50a39f34c3e43be45ce8b97bb6", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "0304eca6d538bcefb9b908743eca573b1935474b07fd26c06ca6f07563122313", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "e30ce81006075ca544b6e2c4fe70af857b6d43a0c9d27bd336311ca57f4f2c78", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "7e94c84ae43f83fefb65576136425a58739b2a50a39f34c3e43be45ce8b97bb6", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "0304eca6d538bcefb9b908743eca573b1935474b07fd26c06ca6f07563122313", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 1, + "output": "test_fixed_root_governance_and_boundaries_receive_proven_source_map (test_composition.CompositionTests.test_fixed_root_governance_and_boundaries_receive_proven_source_map) ... FAIL\n\n======================================================================\nFAIL: test_fixed_root_governance_and_boundaries_receive_proven_source_map (test_composition.CompositionTests.test_fixed_root_governance_and_boundaries_receive_proven_source_map)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_composition.py\", line 299, in test_fixed_root_governance_and_boundaries_receive_proven_source_map\n self.assertEqual(marker.read_text(), \"boundaries\\npins\\ngovernance\\n\")\n ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 'boundaries\\ngovernance\\n' != 'boundaries\\npins\\ngovernance\\n'\n boundaries\n+ pins\n governance\n\n\n----------------------------------------------------------------------\nRan 1 test in 0.847s\n\nFAILED (failures=1)\n", + "output_sha256": "170789a46929cfccb439df80ce15edc9d05f47f7a0d410a9b0746389b1182782", + "receipt_sha256": "d13ba4391bdb859d49f2b9b0a05a5265ef459b9da2a2d51913b00080a47d1dc4" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:54:00.398825+00:00", + "command": "python3 -m unittest tests.test_dependency_ci tests.test_ci_credentials -v", + "command_sha256": "aec96627d88bea7de31c0a9715632d3316431ef9b5cd6d15741cb16317092664", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "667d2677c8f460f18488bbd193925dc6d66fa5e9ba809840325bc62fcff8fdb9", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "7e94c84ae43f83fefb65576136425a58739b2a50a39f34c3e43be45ce8b97bb6", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "0304eca6d538bcefb9b908743eca573b1935474b07fd26c06ca6f07563122313", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "e793e9804a1f5ecf49b29a40b4baac90ceb04e55", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "667d2677c8f460f18488bbd193925dc6d66fa5e9ba809840325bc62fcff8fdb9", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "4eae804c84d5c0299c5e705a8ff747bd570fc94b88f7ea87908a2ccfaa0f07d9", + "scripts/build-composition.py": "7e94c84ae43f83fefb65576136425a58739b2a50a39f34c3e43be45ce8b97bb6", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "0304eca6d538bcefb9b908743eca573b1935474b07fd26c06ca6f07563122313", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) ... ok\ntest_component_ci_executes_nested_go_module_tests (tests.test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) ... ok\ntest_external_npm_git_source_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_external_npm_git_source_rejected_before_authenticated_request) ... ok\ntest_go_prefetch_covers_logging_trace_module (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_covers_logging_trace_module) ... ok\ntest_go_prefetch_rejects_mutation_of_committed_checksums (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_rejects_mutation_of_committed_checksums) ... ok\ntest_go_prefetch_uses_only_registered_private_repo_and_local_toolchain (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain) ... ok\ntest_go_requirement_for_new_toolchain_fails_without_downloading_one (tests.test_dependency_ci.DependencyCITests.test_go_requirement_for_new_toolchain_fails_without_downloading_one) ... ok\ntest_npm_git_package_installs_committed_output_without_prepare (tests.test_dependency_ci.DependencyCITests.test_npm_git_package_installs_committed_output_without_prepare) ... ok\ntest_npm_nonregistry_tarball_rejected_before_request (tests.test_dependency_ci.DependencyCITests.test_npm_nonregistry_tarball_rejected_before_request) ... ok\ntest_npm_provider_prepare_is_rejected_without_execution (tests.test_dependency_ci.DependencyCITests.test_npm_provider_prepare_is_rejected_without_execution) ... ok\ntest_rdm_composition_lock_fetches_fixed_dev_without_executing_code (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_fetches_fixed_dev_without_executing_code) ... ok\ntest_rdm_composition_lock_rejects_external_missing_and_malformed_commits (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) ... ok\ntest_registered_application_lock_materializes_fixed_source (tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source) ... ok\ntest_unregistered_go_module_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_unregistered_go_module_rejected_before_authenticated_request) ... ok\ntest_unregistered_source_lock_is_rejected_before_component_fetch (tests.test_dependency_ci.DependencyCITests.test_unregistered_source_lock_is_rejected_before_component_fetch) ... ok\ntest_candidate_cannot_read_checkout_credentials (tests.test_ci_credentials.CheckoutTests.test_candidate_cannot_read_checkout_credentials) ... ok\ntest_candidate_submodule_update_commands_are_rejected (tests.test_ci_credentials.CheckoutTests.test_candidate_submodule_update_commands_are_rejected) ... ok\ntest_credential_destination_confined_to_injected_server (tests.test_ci_credentials.CheckoutTests.test_credential_destination_confined_to_injected_server) ... ok\ntest_external_or_unlisted_urls_are_rejected_before_component_fetch (tests.test_ci_credentials.CheckoutTests.test_external_or_unlisted_urls_are_rejected_before_component_fetch) ... ok\ntest_inherited_template_hook_does_not_execute_with_credentials (tests.test_ci_credentials.CheckoutTests.test_inherited_template_hook_does_not_execute_with_credentials) ... ok\ntest_nested_external_url_is_rejected_before_authenticated_fetch (tests.test_ci_credentials.CheckoutTests.test_nested_external_url_is_rejected_before_authenticated_fetch) ... ok\ntest_rdm_pin_fetch_is_three_shas_on_the_allowlist (tests.test_ci_credentials.CheckoutTests.test_rdm_pin_fetch_is_three_shas_on_the_allowlist) ... ok\ntest_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials (tests.test_ci_credentials.CheckoutTests.test_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials) ... ok\ntest_redirects_do_not_forward_credential_or_fetch_unlisted_target (tests.test_ci_credentials.CheckoutTests.test_redirects_do_not_forward_credential_or_fetch_unlisted_target) ... ok\n\n----------------------------------------------------------------------\nRan 24 tests in 18.302s\n\nOK\n", + "output_sha256": "17d667b3d3758d17233ede7184a55dffe30ff3fa9609c89ce9a0823e5f3435f4", + "receipt_sha256": "e4200bd3ccb4cba7b0339647cfb8b17d91548d2bc8e3b008be8ef6119c099d2d" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:54:36.078831+00:00", + "command": "python3 -B -m unittest discover -s tests -p test_composition.py -v", + "command_sha256": "57fafdaf6207351efb67ec6dd35d781e8ece54dba12585050f373432d3aef46f", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "03bb31d4142b37d94282ed5eed5e625671c2a60f550f57fa4d64ccfbf1b84d66", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "f296bebd46c98aaccac4b0e9c4ca7cdaedad3931a208736957db414aea72d57e", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "0304eca6d538bcefb9b908743eca573b1935474b07fd26c06ca6f07563122313", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "03bb31d4142b37d94282ed5eed5e625671c2a60f550f57fa4d64ccfbf1b84d66", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "f296bebd46c98aaccac4b0e9c4ca7cdaedad3931a208736957db414aea72d57e", + "scripts/component-check.py": "d0a59b6d0fe88d2f5f66ab7a28662e1c1a4b74a129ed47cdc8de2723a3f31729", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "33740dfaa4e7716331be8a93b167b536fad5c24412e95d25d95aa536b0818c50", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "0304eca6d538bcefb9b908743eca573b1935474b07fd26c06ca6f07563122313", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "test_developer_package_tarball_overrides_do_not_reach_formal_tests (test_composition.CompositionTests.test_developer_package_tarball_overrides_do_not_reach_formal_tests) ... ok\ntest_dirty_root_lock_is_rejected (test_composition.CompositionTests.test_dirty_root_lock_is_rejected) ... ok\ntest_fixed_commits_embed_assets_without_touching_developer_checkout (test_composition.CompositionTests.test_fixed_commits_embed_assets_without_touching_developer_checkout) ... ok\ntest_fixed_root_governance_and_boundaries_receive_proven_source_map (test_composition.CompositionTests.test_fixed_root_governance_and_boundaries_receive_proven_source_map) ... ok\ntest_frontend_dist_symlink_cannot_import_assets_from_outside_source (test_composition.CompositionTests.test_frontend_dist_symlink_cannot_import_assets_from_outside_source) ... ok\ntest_historical_rdm_product_still_builds_from_legacy_pins (test_composition.CompositionTests.test_historical_rdm_product_still_builds_from_legacy_pins) ... ok\ntest_local_go_replace_is_rejected (test_composition.CompositionTests.test_local_go_replace_is_rejected) ... ok\ntest_locked_missing_revision_is_rejected (test_composition.CompositionTests.test_locked_missing_revision_is_rejected) ... ok\ntest_missing_frontend_assets_fails_before_publishing_binary (test_composition.CompositionTests.test_missing_frontend_assets_fails_before_publishing_binary) ... ok\ntest_modified_go_module_cache_is_rejected_before_product_publication (test_composition.CompositionTests.test_modified_go_module_cache_is_rejected_before_product_publication) ... ok\ntest_npm_local_dependency_overlay_is_rejected (test_composition.CompositionTests.test_npm_local_dependency_overlay_is_rejected) ... ok\ntest_project_test_mode_refuses_missing_boundary_gate (test_composition.CompositionTests.test_project_test_mode_refuses_missing_boundary_gate) ... ok\ntest_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock (test_composition.CompositionTests.test_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock) ... ok\ntest_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache (test_composition.CompositionTests.test_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache) ... ok\ntest_source_path_escape_is_rejected (test_composition.CompositionTests.test_source_path_escape_is_rejected) ... ok\ntest_test_target_checks_fixed_go_library_and_ui_sources (test_composition.CompositionTests.test_test_target_checks_fixed_go_library_and_ui_sources) ... ok\ntest_test_target_runs_real_frontend_and_go_tests (test_composition.CompositionTests.test_test_target_runs_real_frontend_and_go_tests) ... ok\ntest_unused_transitive_zip_does_not_require_consumer_sum_rewrite (test_composition.CompositionTests.test_unused_transitive_zip_does_not_require_consumer_sum_rewrite) ... ok\ntest_version_and_plugin_assets_come_from_committed_root (test_composition.CompositionTests.test_version_and_plugin_assets_come_from_committed_root) ... ok\ntest_versioned_rdm_product_entry_uses_fixed_composer (test_composition.CompositionTests.test_versioned_rdm_product_entry_uses_fixed_composer) ... ok\n\n----------------------------------------------------------------------\nRan 20 tests in 18.245s\n\nOK\n", + "output_sha256": "17252e80473588efce2fe0081c8bb8d67e5a9a01d93d4c6bbfac15b83b7f3fce", + "receipt_sha256": "1ad69d699b3fc1a36053826921869305e9c217ae100d80b49da611752c8e5fef" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:57:06.568857+00:00", + "command": "python3 -m unittest tests.test_dependency_ci tests.test_ci_credentials -v", + "command_sha256": "aec96627d88bea7de31c0a9715632d3316431ef9b5cd6d15741cb16317092664", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "95557f5fbbc10a3d2cc46ebee3764c46f609e7973ecbc02db1042bb857b9ffb2", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "f296bebd46c98aaccac4b0e9c4ca7cdaedad3931a208736957db414aea72d57e", + "scripts/component-check.py": "d2092b394c9ee12311e4a70edff03c4def8d4da33a5c8748de5a2742a0af6909", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "3ebcb37b2a21dfabf76ac37551ab88499879f6cbedf00aef51c4e49d363f3c1b", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "0304eca6d538bcefb9b908743eca573b1935474b07fd26c06ca6f07563122313", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "95557f5fbbc10a3d2cc46ebee3764c46f609e7973ecbc02db1042bb857b9ffb2", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "2fee657d01f0f5e7abca887202560bf6265accebb90555a966e476bb4b566267", + "scripts/component-check.py": "d2092b394c9ee12311e4a70edff03c4def8d4da33a5c8748de5a2742a0af6909", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "3ebcb37b2a21dfabf76ac37551ab88499879f6cbedf00aef51c4e49d363f3c1b", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "0304eca6d538bcefb9b908743eca573b1935474b07fd26c06ca6f07563122313", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) ... ok\ntest_component_ci_executes_nested_go_module_tests (tests.test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) ... ok\ntest_external_npm_git_source_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_external_npm_git_source_rejected_before_authenticated_request) ... ok\ntest_go_prefetch_covers_logging_trace_module (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_covers_logging_trace_module) ... ok\ntest_go_prefetch_rejects_mutation_of_committed_checksums (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_rejects_mutation_of_committed_checksums) ... ok\ntest_go_prefetch_uses_only_registered_private_repo_and_local_toolchain (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain) ... ok\ntest_go_requirement_for_new_toolchain_fails_without_downloading_one (tests.test_dependency_ci.DependencyCITests.test_go_requirement_for_new_toolchain_fails_without_downloading_one) ... ok\ntest_npm_git_package_installs_committed_output_without_prepare (tests.test_dependency_ci.DependencyCITests.test_npm_git_package_installs_committed_output_without_prepare) ... ok\ntest_npm_nonregistry_tarball_rejected_before_request (tests.test_dependency_ci.DependencyCITests.test_npm_nonregistry_tarball_rejected_before_request) ... ok\ntest_npm_provider_prepare_is_rejected_without_execution (tests.test_dependency_ci.DependencyCITests.test_npm_provider_prepare_is_rejected_without_execution) ... ok\ntest_rdm_composition_lock_fetches_fixed_dev_without_executing_code (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_fetches_fixed_dev_without_executing_code) ... ok\ntest_rdm_composition_lock_rejects_external_missing_and_malformed_commits (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) ... ok\ntest_registered_application_lock_materializes_fixed_source (tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source) ... ok\ntest_unregistered_go_module_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_unregistered_go_module_rejected_before_authenticated_request) ... ok\ntest_unregistered_source_lock_is_rejected_before_component_fetch (tests.test_dependency_ci.DependencyCITests.test_unregistered_source_lock_is_rejected_before_component_fetch) ... ok\ntest_candidate_cannot_read_checkout_credentials (tests.test_ci_credentials.CheckoutTests.test_candidate_cannot_read_checkout_credentials) ... ok\ntest_candidate_submodule_update_commands_are_rejected (tests.test_ci_credentials.CheckoutTests.test_candidate_submodule_update_commands_are_rejected) ... ok\ntest_credential_destination_confined_to_injected_server (tests.test_ci_credentials.CheckoutTests.test_credential_destination_confined_to_injected_server) ... ok\ntest_external_or_unlisted_urls_are_rejected_before_component_fetch (tests.test_ci_credentials.CheckoutTests.test_external_or_unlisted_urls_are_rejected_before_component_fetch) ... ok\ntest_inherited_template_hook_does_not_execute_with_credentials (tests.test_ci_credentials.CheckoutTests.test_inherited_template_hook_does_not_execute_with_credentials) ... ok\ntest_nested_external_url_is_rejected_before_authenticated_fetch (tests.test_ci_credentials.CheckoutTests.test_nested_external_url_is_rejected_before_authenticated_fetch) ... ok\ntest_rdm_pin_fetch_is_three_shas_on_the_allowlist (tests.test_ci_credentials.CheckoutTests.test_rdm_pin_fetch_is_three_shas_on_the_allowlist) ... ok\ntest_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials (tests.test_ci_credentials.CheckoutTests.test_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials) ... ok\ntest_redirects_do_not_forward_credential_or_fetch_unlisted_target (tests.test_ci_credentials.CheckoutTests.test_redirects_do_not_forward_credential_or_fetch_unlisted_target) ... ok\n\n----------------------------------------------------------------------\nRan 24 tests in 18.179s\n\nOK\n", + "output_sha256": "518d1faa332e6a43f082081038d53f776b0ca390f1c46118022eab14b6ff3754", + "receipt_sha256": "7ea93cd0b064f655d640353f1c292440bff373fcaa523000605a71b24d24db8b" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T16:57:22.993239+00:00", + "command": "python3 -B -m unittest discover -s tests -p test_composition.py -v", + "command_sha256": "57fafdaf6207351efb67ec6dd35d781e8ece54dba12585050f373432d3aef46f", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "95557f5fbbc10a3d2cc46ebee3764c46f609e7973ecbc02db1042bb857b9ffb2", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "2fee657d01f0f5e7abca887202560bf6265accebb90555a966e476bb4b566267", + "scripts/component-check.py": "d2092b394c9ee12311e4a70edff03c4def8d4da33a5c8748de5a2742a0af6909", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "3ebcb37b2a21dfabf76ac37551ab88499879f6cbedf00aef51c4e49d363f3c1b", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "0304eca6d538bcefb9b908743eca573b1935474b07fd26c06ca6f07563122313", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "96d010367e3c2449d374cccce07a6e42355932e1123cc590204d6c7c030533ff", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "2fee657d01f0f5e7abca887202560bf6265accebb90555a966e476bb4b566267", + "scripts/component-check.py": "d2092b394c9ee12311e4a70edff03c4def8d4da33a5c8748de5a2742a0af6909", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "3ebcb37b2a21dfabf76ac37551ab88499879f6cbedf00aef51c4e49d363f3c1b", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "0304eca6d538bcefb9b908743eca573b1935474b07fd26c06ca6f07563122313", + "tests/test_svc_build_cutover.py": "e4b3639ff073b22fd77fcd11e177f2082047f1e38c6ab6ad92f6448c2e6514c2", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "test_developer_package_tarball_overrides_do_not_reach_formal_tests (test_composition.CompositionTests.test_developer_package_tarball_overrides_do_not_reach_formal_tests) ... ok\ntest_dirty_root_lock_is_rejected (test_composition.CompositionTests.test_dirty_root_lock_is_rejected) ... ok\ntest_fixed_commits_embed_assets_without_touching_developer_checkout (test_composition.CompositionTests.test_fixed_commits_embed_assets_without_touching_developer_checkout) ... ok\ntest_fixed_root_governance_and_boundaries_receive_proven_source_map (test_composition.CompositionTests.test_fixed_root_governance_and_boundaries_receive_proven_source_map) ... ok\ntest_frontend_dist_symlink_cannot_import_assets_from_outside_source (test_composition.CompositionTests.test_frontend_dist_symlink_cannot_import_assets_from_outside_source) ... ok\ntest_historical_rdm_product_still_builds_from_legacy_pins (test_composition.CompositionTests.test_historical_rdm_product_still_builds_from_legacy_pins) ... ok\ntest_local_go_replace_is_rejected (test_composition.CompositionTests.test_local_go_replace_is_rejected) ... ok\ntest_locked_missing_revision_is_rejected (test_composition.CompositionTests.test_locked_missing_revision_is_rejected) ... ok\ntest_missing_frontend_assets_fails_before_publishing_binary (test_composition.CompositionTests.test_missing_frontend_assets_fails_before_publishing_binary) ... ok\ntest_modified_go_module_cache_is_rejected_before_product_publication (test_composition.CompositionTests.test_modified_go_module_cache_is_rejected_before_product_publication) ... ok\ntest_npm_local_dependency_overlay_is_rejected (test_composition.CompositionTests.test_npm_local_dependency_overlay_is_rejected) ... ok\ntest_project_test_mode_refuses_missing_boundary_gate (test_composition.CompositionTests.test_project_test_mode_refuses_missing_boundary_gate) ... ok\ntest_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock (test_composition.CompositionTests.test_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock) ... ok\ntest_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache (test_composition.CompositionTests.test_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache) ... ok\ntest_source_path_escape_is_rejected (test_composition.CompositionTests.test_source_path_escape_is_rejected) ... ok\ntest_test_target_checks_fixed_go_library_and_ui_sources (test_composition.CompositionTests.test_test_target_checks_fixed_go_library_and_ui_sources) ... ok\ntest_test_target_runs_real_frontend_and_go_tests (test_composition.CompositionTests.test_test_target_runs_real_frontend_and_go_tests) ... ok\ntest_unused_transitive_zip_does_not_require_consumer_sum_rewrite (test_composition.CompositionTests.test_unused_transitive_zip_does_not_require_consumer_sum_rewrite) ... ok\ntest_version_and_plugin_assets_come_from_committed_root (test_composition.CompositionTests.test_version_and_plugin_assets_come_from_committed_root) ... ok\ntest_versioned_rdm_product_entry_uses_fixed_composer (test_composition.CompositionTests.test_versioned_rdm_product_entry_uses_fixed_composer) ... ok\n\n----------------------------------------------------------------------\nRan 20 tests in 16.702s\n\nOK\n", + "output_sha256": "31ef695e88eb12dd14ce9eedd72f2dd4c8cb671c46a1719e86dee20ff688eb80", + "receipt_sha256": "e58acd5be05c01f631ff3ab6b03b71d4065fafc0da517693da4f7b601eef6d31" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T17:00:28.860997+00:00", + "command": "PYTHONPATH=. python3 /tmp/dependency-ci-real-prefetch.py", + "command_sha256": "8143f93e1d067154be6f5c003eabbb031e17c72113e08b0227b6571a61b8b536", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "9a44d246795611ffdddbe53cc4a38d75a1e6ca67bd135e1a9aa3b89d86f093d7", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "2fee657d01f0f5e7abca887202560bf6265accebb90555a966e476bb4b566267", + "scripts/component-check.py": "d2092b394c9ee12311e4a70edff03c4def8d4da33a5c8748de5a2742a0af6909", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "3ebcb37b2a21dfabf76ac37551ab88499879f6cbedf00aef51c4e49d363f3c1b", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "0304eca6d538bcefb9b908743eca573b1935474b07fd26c06ca6f07563122313", + "tests/test_svc_build_cutover.py": "80a353d1f3eec3a51623a0e6c25aefcbb83c9802ea9af8dae6bb18c5eac29df5", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "9a44d246795611ffdddbe53cc4a38d75a1e6ca67bd135e1a9aa3b89d86f093d7", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "2fee657d01f0f5e7abca887202560bf6265accebb90555a966e476bb4b566267", + "scripts/component-check.py": "d2092b394c9ee12311e4a70edff03c4def8d4da33a5c8748de5a2742a0af6909", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "3ebcb37b2a21dfabf76ac37551ab88499879f6cbedf00aef51c4e49d363f3c1b", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "0304eca6d538bcefb9b908743eca573b1935474b07fd26c06ca6f07563122313", + "tests/test_svc_build_cutover.py": "80a353d1f3eec3a51623a0e6c25aefcbb83c9802ea9af8dae6bb18c5eac29df5", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 1, + "output": "Logging-System actual readonly CI prefetch exit=0\nGo modules cached with GOTOOLCHAIN=local; no candidate code executed\n\nError-Code-System actual readonly CI prefetch exit=0\nGo modules cached with GOTOOLCHAIN=local; no candidate code executed\n\nAgent-System-Core actual readonly CI prefetch exit=0\nGo modules cached with GOTOOLCHAIN=local; no candidate code executed\n\nAgent-Native actual readonly CI prefetch exit=0\nGo modules cached with GOTOOLCHAIN=local; no candidate code executed\n\nAgent-Intent actual readonly CI prefetch exit=1\nGo prefetch refused: Go selected graph resolution failed: go: module lookup disabled by GOPROXY=off\ngo: golang.org/x/text@v0.29.0: module lookup disabled by GOPROXY=off\n\nAgent-Command actual readonly CI prefetch exit=0\nGo modules cached with GOTOOLCHAIN=local; no candidate code executed\n\nAgent-Squad actual readonly CI prefetch exit=1\nGo prefetch refused: Command '['git', '-C', '/tmp/dependency-ci-final-source-loo_smkn/Agent-Squad/.ci-mirrors/Agent-Squad.git', 'fetch', '--depth=200', 'http://127.0.0.1:41247/weichen/Agent-Squad.git', 'd2fea7e17310d9e267c28a1e39328704e83df0b1']' returned non-zero exit status 128.\n\nAgent-System-Backend actual readonly CI prefetch exit=1\nGo prefetch refused: Go selected graph resolution failed: go: git-ssh.u1680832.nyat.app/weichen/Agent-System-Core.git@v0.4.1-0.20261013151137-f32d4317846f: invalid pseudo-version: git fetch --unshallow -f --end-of-options origin in /tmp/tmpobtezijs/home/go/pkg/mod/cache/vcs/807b922af6ef9157e34799b3988e173ab26cb3110af221c50921c518b47861fe: exit status 128:\n\tfatal: the remote end hung up unexpectedly\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: git-ssh.u1680832.nyat.app/weichen/Agent-System-Core.git@v0.4.1-0.20261013151137-f32d4317846f: invalid pseudo-version: git fetch --unshallow -f --end-of-options origin in /tmp/tmpobtezijs/home/go/pkg/mod/cache/vcs/807b922af6ef9157e34799b3988e173ab26cb3110af221c50921c518b47861fe: exit status 128:\n\tfatal: the remote end hung up unexpectedly\n\nAgent-System-RDM actual readonly CI prefetch exit=1\nGo prefetch refused: Go selected graph resolution failed: go: git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git@v0.4.1-0.20261013154716-f1302ed5b395: invalid pseudo-version: git fetch --unshallow -f --end-of-options origin in /tmp/tmpobtezijs/home/go/pkg/mod/cache/vcs/831b36c22a2c29042157f9eb7a0d7416d6c005e7ec1236ae883e371b6c951d02: exit status 128:\n\tfatal: the remote end hung up unexpectedly\ngo: git-ssh.u1680832.nyat.app/weichen/Agent-System-Core.git@v0.4.1-0.20261013151137-f32d4317846f: invalid pseudo-version: git fetch --unshallow -f --end-of-options origin in /tmp/tmpobtezijs/home/go/pkg/mod/cache/vcs/807b922af6ef9157e34799b3988e173ab26cb3110af221c50921c518b47861fe: exit status 128:\n\tfatal: the remote end hung up unexpectedly\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: module lookup disabled by GOPROXY=off\ngo: git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git@v0.4.1-0.20261013154716-f1302ed5b395: invalid pseudo-version: git fetch --unshallow -f --end-of-options origin in /tmp/tmpobtezijs/home/go/pkg/mod/cache/vcs/831b36c22a2c29042157f9eb7a0d7416d6c005e7ec1236ae883e371b6c951d02: exit status 128:\n\tfatal: the remote end hung up unexpectedly\n\nactual provider prefetch failures=4\n", + "output_sha256": "0246b97a36e891fe1756a8fe1eede747e0ad79dd4418b3065f620363e2824d41", + "receipt_sha256": "89bf9e8166892b809fe7eed70a391e628eb7b8455585315a65393140c5424372" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T17:01:32.741247+00:00", + "command": "python3 /tmp/dependency-check-docs-final-01a1345f.py", + "command_sha256": "5dc2d73a4dc7fb5db16a8dd47ac36f84e5a98aeabd44a3f0b6162062e9e01a37", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "b9d7896ca321a5cd35b409b61747d317fa94f3770de420d1ac108226e34f1dc5", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "2fee657d01f0f5e7abca887202560bf6265accebb90555a966e476bb4b566267", + "scripts/component-check.py": "d2092b394c9ee12311e4a70edff03c4def8d4da33a5c8748de5a2742a0af6909", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "3ebcb37b2a21dfabf76ac37551ab88499879f6cbedf00aef51c4e49d363f3c1b", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "0304eca6d538bcefb9b908743eca573b1935474b07fd26c06ca6f07563122313", + "tests/test_svc_build_cutover.py": "80a353d1f3eec3a51623a0e6c25aefcbb83c9802ea9af8dae6bb18c5eac29df5", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "b9d7896ca321a5cd35b409b61747d317fa94f3770de420d1ac108226e34f1dc5", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "2fee657d01f0f5e7abca887202560bf6265accebb90555a966e476bb4b566267", + "scripts/component-check.py": "d2092b394c9ee12311e4a70edff03c4def8d4da33a5c8748de5a2742a0af6909", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "3ebcb37b2a21dfabf76ac37551ab88499879f6cbedf00aef51c4e49d363f3c1b", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "0304eca6d538bcefb9b908743eca573b1935474b07fd26c06ca6f07563122313", + "tests/test_svc_build_cutover.py": "80a353d1f3eec3a51623a0e6c25aefcbb83c9802ea9af8dae6bb18c5eac29df5", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "SELF 32c7fa6c10e89c9775b8d84495a2b54edb461f128e9321d2cbbf030dd84a5adf /home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan/docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md\nSELF b90d57e1dfe172bc34c9527e2875d5a10df611822e0cd92501d76a4f15ec5fd9 /home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan/docs/proposals/2026-10-13-versioned-dependencies-implementation-plan.md\nSELF 29b2a2c2f13c101865d0eb46e9c966f954c45c01d379f054d4c197cc5285dc2f /home/weichen/projects/Agent-System-Documents-wt-feature-dependency-workspace-plan/docs/proposals/INDEX.md\nSELF 60a9307b298d99939c12189643a2abfd397cccf4cc809ee2d4f8008b9d1d492c /home/weichen/projects/Development-Guidelines-wt-feature-versioned-dependencies/README.md\nSELF f0fb916ff17cf1b079b7c89c8a34380839317c45a8e9e415bdf2da10392a80e9 /home/weichen/projects/Development-Guidelines-wt-feature-versioned-dependencies/standards/multi-repo.md\nSELF bd1ce8f432732cced1a3edce42e593ba5219ae3231b395e6480b3208cb4b1d2b /home/weichen/projects/Development-Guidelines-wt-feature-versioned-dependencies/standards/collaboration.md\nSELF ff6d51d5b1426b256a94c7c87e86e47ff9cb7337fd1c5edf9edcce42de29e4e8 /home/weichen/projects/Development-Guidelines-wt-feature-versioned-dependencies/workflows/adoption.md\nPASS: R1-R15, U1-U8, general/project separation, relative links: 116\n", + "output_sha256": "361662eb8029a9fe468f8fa37923c0c128f380f93b2dc8510591f35550d91cd2", + "receipt_sha256": "104423617dc8ea262878e8ae6ff856085a1709bbf364b244f7ec73bd6c059a91" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T17:02:07.079218+00:00", + "command": "PYTHONPATH=. python3 /tmp/dependency-ci-real-prefetch.py", + "command_sha256": "8143f93e1d067154be6f5c003eabbb031e17c72113e08b0227b6571a61b8b536", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "98df6eed10c2d9fcbc0f852b15c730dd2e10b303d3485f05779b2ee3c57bdfd9", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "2fee657d01f0f5e7abca887202560bf6265accebb90555a966e476bb4b566267", + "scripts/component-check.py": "d2092b394c9ee12311e4a70edff03c4def8d4da33a5c8748de5a2742a0af6909", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "3ebcb37b2a21dfabf76ac37551ab88499879f6cbedf00aef51c4e49d363f3c1b", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "0304eca6d538bcefb9b908743eca573b1935474b07fd26c06ca6f07563122313", + "tests/test_svc_build_cutover.py": "80a353d1f3eec3a51623a0e6c25aefcbb83c9802ea9af8dae6bb18c5eac29df5", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "98df6eed10c2d9fcbc0f852b15c730dd2e10b303d3485f05779b2ee3c57bdfd9", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "2fee657d01f0f5e7abca887202560bf6265accebb90555a966e476bb4b566267", + "scripts/component-check.py": "d2092b394c9ee12311e4a70edff03c4def8d4da33a5c8748de5a2742a0af6909", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "3ebcb37b2a21dfabf76ac37551ab88499879f6cbedf00aef51c4e49d363f3c1b", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "0304eca6d538bcefb9b908743eca573b1935474b07fd26c06ca6f07563122313", + "tests/test_svc_build_cutover.py": "80a353d1f3eec3a51623a0e6c25aefcbb83c9802ea9af8dae6bb18c5eac29df5", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "Logging-System actual readonly CI prefetch exit=0\nGo modules cached with GOTOOLCHAIN=local; no candidate code executed\n\nError-Code-System actual readonly CI prefetch exit=0\nGo modules cached with GOTOOLCHAIN=local; no candidate code executed\n\nAgent-System-Core actual readonly CI prefetch exit=0\nGo modules cached with GOTOOLCHAIN=local; no candidate code executed\n\nAgent-Native actual readonly CI prefetch exit=0\nGo modules cached with GOTOOLCHAIN=local; no candidate code executed\n\nAgent-Intent actual readonly CI prefetch exit=0\nGo modules cached with GOTOOLCHAIN=local; no candidate code executed\n\nAgent-Command actual readonly CI prefetch exit=0\nGo modules cached with GOTOOLCHAIN=local; no candidate code executed\n\nAgent-Squad actual readonly CI prefetch exit=0\nGo modules cached with GOTOOLCHAIN=local; no candidate code executed\n\nAgent-System-Backend actual readonly CI prefetch exit=0\nGo modules cached with GOTOOLCHAIN=local; no candidate code executed\n\nAgent-System-RDM actual readonly CI prefetch exit=0\nGo modules cached with GOTOOLCHAIN=local; no candidate code executed\n\nactual provider prefetch failures=0\n", + "output_sha256": "4ec75dea4bfce9edb6c59c393b6507edb846e3687f294e2c07d60081554adc9b", + "receipt_sha256": "01a6af38e9dce548fdab704327bade428484f77e9dbb29c7e72a13b4f4280ce4" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T17:03:32.609398+00:00", + "command": "python3 -m unittest tests.test_dependency_ci tests.test_ci_credentials -v", + "command_sha256": "aec96627d88bea7de31c0a9715632d3316431ef9b5cd6d15741cb16317092664", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/cli.py\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "6acd455fe7082b7eb5596421e231a3d302cd3dd450ee76d0c645635ff39f046a", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "2fee657d01f0f5e7abca887202560bf6265accebb90555a966e476bb4b566267", + "scripts/component-check.py": "d2092b394c9ee12311e4a70edff03c4def8d4da33a5c8748de5a2742a0af6909", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "3ebcb37b2a21dfabf76ac37551ab88499879f6cbedf00aef51c4e49d363f3c1b", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "dab15dcc2368a8e61c259189ad951b4995a212e1772f0e802af774836b871bdb", + "tests/test_svc_build_cutover.py": "80a353d1f3eec3a51623a0e6c25aefcbb83c9802ea9af8dae6bb18c5eac29df5", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/cli.py\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "6acd455fe7082b7eb5596421e231a3d302cd3dd450ee76d0c645635ff39f046a", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "2fee657d01f0f5e7abca887202560bf6265accebb90555a966e476bb4b566267", + "scripts/component-check.py": "d2092b394c9ee12311e4a70edff03c4def8d4da33a5c8748de5a2742a0af6909", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "3ebcb37b2a21dfabf76ac37551ab88499879f6cbedf00aef51c4e49d363f3c1b", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "dab15dcc2368a8e61c259189ad951b4995a212e1772f0e802af774836b871bdb", + "tests/test_svc_build_cutover.py": "80a353d1f3eec3a51623a0e6c25aefcbb83c9802ea9af8dae6bb18c5eac29df5", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) ... ok\ntest_component_ci_executes_nested_go_module_tests (tests.test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) ... ok\ntest_external_npm_git_source_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_external_npm_git_source_rejected_before_authenticated_request) ... ok\ntest_go_prefetch_covers_logging_trace_module (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_covers_logging_trace_module) ... ok\ntest_go_prefetch_rejects_mutation_of_committed_checksums (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_rejects_mutation_of_committed_checksums) ... ok\ntest_go_prefetch_uses_only_registered_private_repo_and_local_toolchain (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain) ... ok\ntest_go_requirement_for_new_toolchain_fails_without_downloading_one (tests.test_dependency_ci.DependencyCITests.test_go_requirement_for_new_toolchain_fails_without_downloading_one) ... ok\ntest_npm_git_package_installs_committed_output_without_prepare (tests.test_dependency_ci.DependencyCITests.test_npm_git_package_installs_committed_output_without_prepare) ... ok\ntest_npm_nonregistry_tarball_rejected_before_request (tests.test_dependency_ci.DependencyCITests.test_npm_nonregistry_tarball_rejected_before_request) ... ok\ntest_npm_provider_prepare_is_rejected_without_execution (tests.test_dependency_ci.DependencyCITests.test_npm_provider_prepare_is_rejected_without_execution) ... ok\ntest_rdm_composition_lock_fetches_fixed_dev_without_executing_code (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_fetches_fixed_dev_without_executing_code) ... ok\ntest_rdm_composition_lock_rejects_external_missing_and_malformed_commits (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) ... ok\ntest_registered_application_lock_materializes_fixed_source (tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source) ... ok\ntest_unregistered_go_module_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_unregistered_go_module_rejected_before_authenticated_request) ... ok\ntest_unregistered_source_lock_is_rejected_before_component_fetch (tests.test_dependency_ci.DependencyCITests.test_unregistered_source_lock_is_rejected_before_component_fetch) ... ok\ntest_candidate_cannot_read_checkout_credentials (tests.test_ci_credentials.CheckoutTests.test_candidate_cannot_read_checkout_credentials) ... ok\ntest_candidate_submodule_update_commands_are_rejected (tests.test_ci_credentials.CheckoutTests.test_candidate_submodule_update_commands_are_rejected) ... ok\ntest_credential_destination_confined_to_injected_server (tests.test_ci_credentials.CheckoutTests.test_credential_destination_confined_to_injected_server) ... ok\ntest_external_or_unlisted_urls_are_rejected_before_component_fetch (tests.test_ci_credentials.CheckoutTests.test_external_or_unlisted_urls_are_rejected_before_component_fetch) ... ok\ntest_inherited_template_hook_does_not_execute_with_credentials (tests.test_ci_credentials.CheckoutTests.test_inherited_template_hook_does_not_execute_with_credentials) ... ok\ntest_nested_external_url_is_rejected_before_authenticated_fetch (tests.test_ci_credentials.CheckoutTests.test_nested_external_url_is_rejected_before_authenticated_fetch) ... ok\ntest_rdm_pin_fetch_is_three_shas_on_the_allowlist (tests.test_ci_credentials.CheckoutTests.test_rdm_pin_fetch_is_three_shas_on_the_allowlist) ... ok\ntest_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials (tests.test_ci_credentials.CheckoutTests.test_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials) ... ok\ntest_redirects_do_not_forward_credential_or_fetch_unlisted_target (tests.test_ci_credentials.CheckoutTests.test_redirects_do_not_forward_credential_or_fetch_unlisted_target) ... ok\n\n----------------------------------------------------------------------\nRan 24 tests in 17.797s\n\nOK\n", + "output_sha256": "2c12c2a2fe5e2b63191b47a4b434bd5f8c29a4149885077dc2e37813809719fb", + "receipt_sha256": "20c43287e12d0c4b071100a54d328032e7cd0a45061c4685214304f35ad1d62f" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T17:09:44.180657+00:00", + "command": "python3 /tmp/dependency-commit-cutover-providers-01a1345f.py Logging-System Error-Code-System Agent-System-Core Agent-System-UI Agent-System-Frontend Agent-Native Agent-Intent Agent-Command Agent-Squad Agent-System-Backend", + "command_sha256": "89fa2938ae315e71b7bf7ba275decdffc0145aa161e78f1499a214e54d642140", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/cli.py\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "29e6189004152f9b11e5fa3543fafc32209dd80e5437c7a5f61177b3b14dad9c", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "2fee657d01f0f5e7abca887202560bf6265accebb90555a966e476bb4b566267", + "scripts/component-check.py": "3baa744caea6a7b987b37c9b312db2cd04bc3c3c8715df01982d3732be2cf028", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "8fa2e18685ffcaa9eec466853d82c76200bb104670cf30d9bf896351b89ee4a0", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "dab15dcc2368a8e61c259189ad951b4995a212e1772f0e802af774836b871bdb", + "tests/test_svc_build_cutover.py": "5ddbfc1f1626aa2ac6ffa7c63a0b99f8eabdaf301089ab62c84ad2881809b541", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/cli.py\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "29e6189004152f9b11e5fa3543fafc32209dd80e5437c7a5f61177b3b14dad9c", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "2fee657d01f0f5e7abca887202560bf6265accebb90555a966e476bb4b566267", + "scripts/component-check.py": "3baa744caea6a7b987b37c9b312db2cd04bc3c3c8715df01982d3732be2cf028", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "8fa2e18685ffcaa9eec466853d82c76200bb104670cf30d9bf896351b89ee4a0", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "dab15dcc2368a8e61c259189ad951b4995a212e1772f0e802af774836b871bdb", + "tests/test_svc_build_cutover.py": "5ddbfc1f1626aa2ac6ffa7c63a0b99f8eabdaf301089ab62c84ad2881809b541", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 1, + "output": "fatal: pathspec '.gitmodules' did not match any files\nTraceback (most recent call last):\n File \"/tmp/dependency-commit-cutover-providers-01a1345f.py\", line 13, in \n subprocess.run(['git','-C',str(repo),'add','--',*files],check=True)\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/subprocess.py\", line 578, in run\n raise CalledProcessError(retcode, process.args,\n output=stdout, stderr=stderr)\nsubprocess.CalledProcessError: Command '['git', '-C', '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Logging-System', 'add', '--', '.gitea/workflows/ci.yml', '.gitmodules', 'AGENTS.md', 'PROJECT.md', 'README.md', 'deps/development-guidelines', 'examples/trace/go.mod', 'examples/trace/go.sum']' returned non-zero exit status 128.\n", + "output_sha256": "e1a74079ed3ed285d912d879ebbf6bc31b438a407cf2d780377b7524097f98ae", + "receipt_sha256": "422c6c7756eacffdd85f572c7e1645671d61ebd921f33654a7ab4f2ca777fb8c" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T17:11:20.638615+00:00", + "command": "python3 /tmp/dependency-commit-cutover-providers-01a1345f.py Logging-System Error-Code-System Agent-System-Core Agent-System-UI Agent-System-Frontend Agent-Native Agent-Intent Agent-Command Agent-Squad Agent-System-Backend", + "command_sha256": "89fa2938ae315e71b7bf7ba275decdffc0145aa161e78f1499a214e54d642140", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/cli.py\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "c1659a56c8a7e7218f8ad6607a948588053707bd88c22aba8e2a832109eacfa0", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "2fee657d01f0f5e7abca887202560bf6265accebb90555a966e476bb4b566267", + "scripts/component-check.py": "ae3ff3c32a7400e560e7b1a4612c1bb43d6dd68f6b99170d3800eb8cdb0d1451", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "8fa2e18685ffcaa9eec466853d82c76200bb104670cf30d9bf896351b89ee4a0", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "dab15dcc2368a8e61c259189ad951b4995a212e1772f0e802af774836b871bdb", + "tests/test_svc_build_cutover.py": "5ddbfc1f1626aa2ac6ffa7c63a0b99f8eabdaf301089ab62c84ad2881809b541", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/cli.py\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "c1659a56c8a7e7218f8ad6607a948588053707bd88c22aba8e2a832109eacfa0", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "2fee657d01f0f5e7abca887202560bf6265accebb90555a966e476bb4b566267", + "scripts/component-check.py": "ae3ff3c32a7400e560e7b1a4612c1bb43d6dd68f6b99170d3800eb8cdb0d1451", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "8fa2e18685ffcaa9eec466853d82c76200bb104670cf30d9bf896351b89ee4a0", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "dab15dcc2368a8e61c259189ad951b4995a212e1772f0e802af774836b871bdb", + "tests/test_svc_build_cutover.py": "5ddbfc1f1626aa2ac6ffa7c63a0b99f8eabdaf301089ab62c84ad2881809b541", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 1, + "output": "error: pathspec 'deps/development-guidelines' did not match any file(s) known to git\nTraceback (most recent call last):\n File \"/tmp/dependency-commit-cutover-providers-01a1345f.py\", line 17, in \n subprocess.run(['git','-C',str(repo),'commit','--include','-F','/tmp/dependency-source-cutover-commit-01a1345f.txt','--',*present],check=True)\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/subprocess.py\", line 578, in run\n raise CalledProcessError(retcode, process.args,\n output=stdout, stderr=stderr)\nsubprocess.CalledProcessError: Command '['git', '-C', '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.migration/Logging-System', 'commit', '--include', '-F', '/tmp/dependency-source-cutover-commit-01a1345f.txt', '--', '.gitea/workflows/ci.yml', 'AGENTS.md', 'PROJECT.md', 'README.md', 'deps/development-guidelines', 'examples/trace/go.mod', 'examples/trace/go.sum']' returned non-zero exit status 128.\n", + "output_sha256": "e08985946f8ddea7cd79eae2c7ecb7a1aacfedcc7ba2282f2a0e399d10295b32", + "receipt_sha256": "919fa15afd3a6a458c62fcc97f3830ff25c4f811135ddb901517b5d99d36be14" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T17:11:41.561474+00:00", + "command": "python3 /tmp/dependency-commit-cutover-providers-01a1345f.py Logging-System Error-Code-System Agent-System-Core Agent-System-UI Agent-System-Frontend Agent-Native Agent-Intent Agent-Command Agent-Squad Agent-System-Backend", + "command_sha256": "89fa2938ae315e71b7bf7ba275decdffc0145aa161e78f1499a214e54d642140", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/cli.py\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "774e31350178bb41ea7f661a9d24965f23324caefce22933917c5fea8e81d2e8", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "2fee657d01f0f5e7abca887202560bf6265accebb90555a966e476bb4b566267", + "scripts/component-check.py": "ae3ff3c32a7400e560e7b1a4612c1bb43d6dd68f6b99170d3800eb8cdb0d1451", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "8fa2e18685ffcaa9eec466853d82c76200bb104670cf30d9bf896351b89ee4a0", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "dab15dcc2368a8e61c259189ad951b4995a212e1772f0e802af774836b871bdb", + "tests/test_svc_build_cutover.py": "5ddbfc1f1626aa2ac6ffa7c63a0b99f8eabdaf301089ab62c84ad2881809b541", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/cli.py\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "774e31350178bb41ea7f661a9d24965f23324caefce22933917c5fea8e81d2e8", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "2fee657d01f0f5e7abca887202560bf6265accebb90555a966e476bb4b566267", + "scripts/component-check.py": "ae3ff3c32a7400e560e7b1a4612c1bb43d6dd68f6b99170d3800eb8cdb0d1451", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "8fa2e18685ffcaa9eec466853d82c76200bb104670cf30d9bf896351b89ee4a0", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "dab15dcc2368a8e61c259189ad951b4995a212e1772f0e802af774836b871bdb", + "tests/test_svc_build_cutover.py": "5ddbfc1f1626aa2ac6ffa7c63a0b99f8eabdaf301089ab62c84ad2881809b541", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "f60b26947166eaaf001b4d2f23e3433346d2df7314f0a550ff3633f44cdf222b", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "[feature/versioned-dependencies 2e26200] Adopt credential safe CI and retire replaced source gitlinks\n 8 files changed, 515 insertions(+), 35 deletions(-)\n delete mode 100644 .gitmodules\n delete mode 160000 deps/development-guidelines\n create mode 100644 examples/trace/go.sum\nremote: \nremote: Create a new pull request for 'feature/versioned-dependencies': \nremote: https://git-panel.u1680832.nyat.app:30319/weichen/Logging-System/pulls/new/feature/versioned-dependencies \nremote: \nTo ssh://git-ssh.u1680832.nyat.app:31411/weichen/Logging-System.git\n 9c5442f..2e26200 HEAD -> feature/versioned-dependencies\nSOURCE Logging-System 2e2620009fcb21c302369c1125bea33e2a383c71\n[feature/versioned-dependencies f55c6b1] Adopt credential safe CI and retire replaced source gitlinks\n 6 files changed, 504 insertions(+), 25 deletions(-)\n delete mode 100644 .gitmodules\n delete mode 160000 deps/development-guidelines\nremote: \nremote: Create a new pull request for 'feature/versioned-dependencies': \nremote: https://git-panel.u1680832.nyat.app:30319/weichen/Error-Code-System/pulls/new/feature/versioned-dependencies \nremote: \nTo ssh://git-ssh.u1680832.nyat.app:31411/weichen/Error-Code-System.git\n 28d2d50..f55c6b1 HEAD -> feature/versioned-dependencies\nSOURCE Error-Code-System f55c6b11b6eeda36b9d30fb9e92dcecc44a9fcae\n[feature/versioned-dependencies dc4440d] Adopt credential safe CI and retire replaced source gitlinks\n 3 files changed, 712 insertions(+), 4 deletions(-)\n create mode 100644 .gitea/workflows/ci.yml\nremote: \nremote: Create a new pull request for 'feature/versioned-dependencies': \nremote: https://git-panel.u1680832.nyat.app:30319/weichen/Agent-System-Core/pulls/new/feature/versioned-dependencies \nremote: \nTo ssh://git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Core.git\n f32d431..dc4440d HEAD -> feature/versioned-dependencies\nSOURCE Agent-System-Core dc4440d5d81a7ff9a79349c9c6a390cc2f9cb60a\n[feature/versioned-dependencies bc0a4d3] Adopt credential safe CI and retire replaced source gitlinks\n 2 files changed, 436 insertions(+), 47 deletions(-)\nremote: \nremote: Create a new pull request for 'feature/versioned-dependencies': \nremote: https://git-panel.u1680832.nyat.app:30319/weichen/Agent-System-UI/pulls/new/feature/versioned-dependencies \nremote: \nTo ssh://git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-UI.git\n 468776e..bc0a4d3 HEAD -> feature/versioned-dependencies\nSOURCE Agent-System-UI bc0a4d33d03728e8726b5c398c4239a87def8eda\n[feature/versioned-dependencies 6ed7b93] Adopt credential safe CI and retire replaced source gitlinks\n 2 files changed, 467 insertions(+), 2 deletions(-)\n create mode 100644 .gitea/workflows/ci.yml\nremote: \nremote: Create a new pull request for 'feature/versioned-dependencies': \nremote: https://git-panel.u1680832.nyat.app:30319/weichen/Agent-System-Frontend/pulls/new/feature/versioned-dependencies \nremote: \nTo ssh://git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Frontend.git\n ad53e90..6ed7b93 HEAD -> feature/versioned-dependencies\nSOURCE Agent-System-Frontend 6ed7b9322c5733f76b206a35cd78649ba385d83b\n[feature/versioned-dependencies 3b550d7] Adopt credential safe CI and retire replaced source gitlinks\n 9 files changed, 484 insertions(+), 44 deletions(-)\n delete mode 100644 .gitmodules\n delete mode 160000 deps/agent-intent\n delete mode 160000 deps/development-guidelines\n delete mode 160000 deps/error-code-system\n delete mode 160000 deps/logging-system\nremote: \nremote: Create a new pull request for 'feature/versioned-dependencies': \nremote: https://git-panel.u1680832.nyat.app:30319/weichen/Agent-Native/pulls/new/feature/versioned-dependencies \nremote: \nTo ssh://git-ssh.u1680832.nyat.app:31411/weichen/Agent-Native.git\n 6ddd3da..3b550d7 HEAD -> feature/versioned-dependencies\nSOURCE Agent-Native 3b550d783dd7d4dd37d30bb312f0c4369a3102a5\n[feature/versioned-dependencies c29cf6a] Adopt credential safe CI and retire replaced source gitlinks\n 8 files changed, 484 insertions(+), 40 deletions(-)\n delete mode 100644 .gitmodules\n delete mode 160000 deps/development-guidelines\n delete mode 160000 deps/error-code-system\n delete mode 160000 deps/logging-system\nremote: \nremote: Create a new pull request for 'feature/versioned-dependencies': \nremote: https://git-panel.u1680832.nyat.app:30319/weichen/Agent-Intent/pulls/new/feature/versioned-dependencies \nremote: \nTo ssh://git-ssh.u1680832.nyat.app:31411/weichen/Agent-Intent.git\n 3a8468c..c29cf6a HEAD -> feature/versioned-dependencies\nSOURCE Agent-Intent c29cf6a283d0a2d93099e703d76b08c8a7801c90\n[feature/versioned-dependencies 63dc7e0] Adopt credential safe CI and retire replaced source gitlinks\n 4 files changed, 499 insertions(+), 5 deletions(-)\n create mode 100644 .gitea/workflows/ci.yml\n delete mode 100644 .gitmodules\n delete mode 160000 deps/development-guidelines\nremote: \nremote: Create a new pull request for 'feature/versioned-dependencies': \nremote: https://git-panel.u1680832.nyat.app:30319/weichen/Agent-Command/pulls/new/feature/versioned-dependencies \nremote: \nTo ssh://git-ssh.u1680832.nyat.app:31411/weichen/Agent-Command.git\n 1aa532f..63dc7e0 HEAD -> feature/versioned-dependencies\nSOURCE Agent-Command 63dc7e06412af632c6b9c32ca3d71fb7cd8235fc\n[feature/versioned-dependencies 42e1c4c] Adopt credential safe CI and retire replaced source gitlinks\n 10 files changed, 493 insertions(+), 51 deletions(-)\n delete mode 100644 .gitmodules\n delete mode 160000 deps/agent-intent\n delete mode 160000 deps/agent-native\n delete mode 160000 deps/development-guidelines\n delete mode 160000 deps/error-code-system\n delete mode 160000 deps/logging-system\nremote: \nremote: Create a new pull request for 'feature/versioned-dependencies': \nremote: https://git-panel.u1680832.nyat.app:30319/weichen/Agent-Squad/pulls/new/feature/versioned-dependencies \nremote: \nTo ssh://git-ssh.u1680832.nyat.app:31411/weichen/Agent-Squad.git\n 37b273e..42e1c4c HEAD -> feature/versioned-dependencies\nSOURCE Agent-Squad 42e1c4cd3296c7c68eef9473f34e50d59ba1412b\n[feature/versioned-dependencies fffd579] Adopt credential safe CI and retire replaced source gitlinks\n 14 files changed, 483 insertions(+), 50 deletions(-)\n delete mode 100644 .gitmodules\n delete mode 160000 deps/agent-command\n delete mode 160000 deps/agent-intent\n delete mode 160000 deps/agent-native\n delete mode 160000 deps/agent-squad\n delete mode 160000 deps/agent-system-core\n delete mode 160000 deps/error-code-system\n delete mode 160000 deps/logging-system\nremote: \nremote: Create a new pull request for 'feature/versioned-dependencies': \nremote: https://git-panel.u1680832.nyat.app:30319/weichen/Agent-System-Backend/pulls/new/feature/versioned-dependencies \nremote: \nTo ssh://git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Backend.git\n f1302ed..fffd579 HEAD -> feature/versioned-dependencies\nSOURCE Agent-System-Backend fffd5790cfab317fadafb40fa55a11bab6e9a847\n", + "output_sha256": "d787c4e704cb50da871914cb21b3312310468509b23cfaab1a724a3cb446aa68", + "receipt_sha256": "4c302900219b3818d601339a1f097081de5cc61fd585c6bf5c24604d4cd7d418" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T17:14:07.699846+00:00", + "command": "PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -p test_composition.py -v", + "command_sha256": "e2dfe5d6f43f53ee79d704ce73bf3a813dd3f0e5c9f9db00262aa9cdf389668c", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/cli.py\n M scripts/workspace/common.py\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "c0ab53d58a7e6a99672ac3f3f0eab3145007f0b56fd79ddfbe451a9aed0ea8bf", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "3cbf7dde996fa8a7d371452d70f08ccd383dfc7ef80f0f9dc4b432e19a652a8e", + "scripts/component-check.py": "ae3ff3c32a7400e560e7b1a4612c1bb43d6dd68f6b99170d3800eb8cdb0d1451", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "8fa2e18685ffcaa9eec466853d82c76200bb104670cf30d9bf896351b89ee4a0", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "dab15dcc2368a8e61c259189ad951b4995a212e1772f0e802af774836b871bdb", + "tests/test_svc_build_cutover.py": "5ddbfc1f1626aa2ac6ffa7c63a0b99f8eabdaf301089ab62c84ad2881809b541", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7f50152402d0e4bb18f9ce32d5bafca6610ee5971e172a7842b4036866f7eed6", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "415f9ac58ece9d9b63bd9b3fea39978bb847fcce", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/cli.py\n M scripts/workspace/common.py\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "c0ab53d58a7e6a99672ac3f3f0eab3145007f0b56fd79ddfbe451a9aed0ea8bf", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "e5b18eef3f48e19184b84eeef481b1df2a4c06b4010ee2842ef7e759ebaa85c8", + "scripts/build-composition.py": "3cbf7dde996fa8a7d371452d70f08ccd383dfc7ef80f0f9dc4b432e19a652a8e", + "scripts/component-check.py": "ae3ff3c32a7400e560e7b1a4612c1bb43d6dd68f6b99170d3800eb8cdb0d1451", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "8fa2e18685ffcaa9eec466853d82c76200bb104670cf30d9bf896351b89ee4a0", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "dab15dcc2368a8e61c259189ad951b4995a212e1772f0e802af774836b871bdb", + "tests/test_svc_build_cutover.py": "5ddbfc1f1626aa2ac6ffa7c63a0b99f8eabdaf301089ab62c84ad2881809b541", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7f50152402d0e4bb18f9ce32d5bafca6610ee5971e172a7842b4036866f7eed6", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 1, + "output": "test_developer_package_tarball_overrides_do_not_reach_formal_tests (test_composition.CompositionTests.test_developer_package_tarball_overrides_do_not_reach_formal_tests) ... ok\ntest_dirty_root_lock_is_rejected (test_composition.CompositionTests.test_dirty_root_lock_is_rejected) ... ok\ntest_fixed_commits_embed_assets_without_touching_developer_checkout (test_composition.CompositionTests.test_fixed_commits_embed_assets_without_touching_developer_checkout) ... ok\ntest_fixed_root_governance_and_boundaries_receive_proven_source_map (test_composition.CompositionTests.test_fixed_root_governance_and_boundaries_receive_proven_source_map) ... ok\ntest_frontend_dist_symlink_cannot_import_assets_from_outside_source (test_composition.CompositionTests.test_frontend_dist_symlink_cannot_import_assets_from_outside_source) ... ok\ntest_historical_rdm_product_still_builds_from_legacy_pins (test_composition.CompositionTests.test_historical_rdm_product_still_builds_from_legacy_pins) ... ok\ntest_local_go_replace_is_rejected (test_composition.CompositionTests.test_local_go_replace_is_rejected) ... ok\ntest_locked_missing_revision_is_rejected (test_composition.CompositionTests.test_locked_missing_revision_is_rejected) ... ok\ntest_missing_frontend_assets_fails_before_publishing_binary (test_composition.CompositionTests.test_missing_frontend_assets_fails_before_publishing_binary) ... ok\ntest_modified_go_module_cache_is_rejected_before_product_publication (test_composition.CompositionTests.test_modified_go_module_cache_is_rejected_before_product_publication) ... ok\ntest_npm_local_dependency_overlay_is_rejected (test_composition.CompositionTests.test_npm_local_dependency_overlay_is_rejected) ... ok\ntest_project_test_mode_refuses_missing_boundary_gate (test_composition.CompositionTests.test_project_test_mode_refuses_missing_boundary_gate) ... ok\ntest_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock (test_composition.CompositionTests.test_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock) ... ok\ntest_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache (test_composition.CompositionTests.test_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache) ... ok\ntest_source_path_escape_is_rejected (test_composition.CompositionTests.test_source_path_escape_is_rejected) ... ok\ntest_test_target_checks_fixed_go_library_and_ui_sources (test_composition.CompositionTests.test_test_target_checks_fixed_go_library_and_ui_sources) ... ok\ntest_test_target_runs_real_frontend_and_go_tests (test_composition.CompositionTests.test_test_target_runs_real_frontend_and_go_tests) ... ok\ntest_unused_transitive_zip_does_not_require_consumer_sum_rewrite (test_composition.CompositionTests.test_unused_transitive_zip_does_not_require_consumer_sum_rewrite) ... ok\ntest_version_and_plugin_assets_come_from_committed_root (test_composition.CompositionTests.test_version_and_plugin_assets_come_from_committed_root) ... ok\ntest_versioned_rdm_product_entry_uses_fixed_composer (test_composition.CompositionTests.test_versioned_rdm_product_entry_uses_fixed_composer) ... FAIL\n\n======================================================================\nFAIL: test_versioned_rdm_product_entry_uses_fixed_composer (test_composition.CompositionTests.test_versioned_rdm_product_entry_uses_fixed_composer)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_composition.py\", line 401, in test_versioned_rdm_product_entry_uses_fixed_composer\n self.assertEqual(result.returncode, 0, result.stdout)\n ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 2 != 0 : make[1]: Entering directory '/tmp/composition-test-4md99y64/rdm'\nbash scripts/build-product.sh\nTraceback (most recent call last):\n File \"/tmp/composition-test-4md99y64/dev/scripts/build-composition.py\", line 21, in \n from workspace.common import digest\nModuleNotFoundError: No module named 'workspace.common'\nmake[1]: *** [Makefile:62: product] Error 1\nmake[1]: Leaving directory '/tmp/composition-test-4md99y64/rdm'\n\n\n----------------------------------------------------------------------\nRan 20 tests in 15.524s\n\nFAILED (failures=1)\n", + "output_sha256": "06b6d7514f7558827d57d4c36f78aad9120d759fc6070204cd6e9fe6ada9cd25", + "receipt_sha256": "e87797f1fe9bbdfd5ceb8c5c562ed1c0a037afcecc2174eac5ab84f3686deef4" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T17:16:12.969889+00:00", + "command": "PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -p test_composition.py -v", + "command_sha256": "e2dfe5d6f43f53ee79d704ce73bf3a813dd3f0e5c9f9db00262aa9cdf389668c", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/cli.py\n M scripts/workspace/common.py\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "d6151428514843dac35ee46aef835e74dfa91e635ffc08de00e22c16fa8514ff", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "0c933daeb0eb1e374002a45611c74af0ea925d85fbb49797897e489e65be16f3", + "scripts/build-composition.py": "3cbf7dde996fa8a7d371452d70f08ccd383dfc7ef80f0f9dc4b432e19a652a8e", + "scripts/component-check.py": "ae3ff3c32a7400e560e7b1a4612c1bb43d6dd68f6b99170d3800eb8cdb0d1451", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "8fa2e18685ffcaa9eec466853d82c76200bb104670cf30d9bf896351b89ee4a0", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "dab15dcc2368a8e61c259189ad951b4995a212e1772f0e802af774836b871bdb", + "tests/test_svc_build_cutover.py": "5ddbfc1f1626aa2ac6ffa7c63a0b99f8eabdaf301089ab62c84ad2881809b541", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7f50152402d0e4bb18f9ce32d5bafca6610ee5971e172a7842b4036866f7eed6", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/cli.py\n M scripts/workspace/common.py\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "d6151428514843dac35ee46aef835e74dfa91e635ffc08de00e22c16fa8514ff", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "0c933daeb0eb1e374002a45611c74af0ea925d85fbb49797897e489e65be16f3", + "scripts/build-composition.py": "3cbf7dde996fa8a7d371452d70f08ccd383dfc7ef80f0f9dc4b432e19a652a8e", + "scripts/component-check.py": "ae3ff3c32a7400e560e7b1a4612c1bb43d6dd68f6b99170d3800eb8cdb0d1451", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "8fa2e18685ffcaa9eec466853d82c76200bb104670cf30d9bf896351b89ee4a0", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "dab15dcc2368a8e61c259189ad951b4995a212e1772f0e802af774836b871bdb", + "tests/test_svc_build_cutover.py": "5ddbfc1f1626aa2ac6ffa7c63a0b99f8eabdaf301089ab62c84ad2881809b541", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7f50152402d0e4bb18f9ce32d5bafca6610ee5971e172a7842b4036866f7eed6", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 1, + "output": "test_developer_package_tarball_overrides_do_not_reach_formal_tests (test_composition.CompositionTests.test_developer_package_tarball_overrides_do_not_reach_formal_tests) ... ok\ntest_dirty_root_lock_is_rejected (test_composition.CompositionTests.test_dirty_root_lock_is_rejected) ... ok\ntest_fixed_commits_embed_assets_without_touching_developer_checkout (test_composition.CompositionTests.test_fixed_commits_embed_assets_without_touching_developer_checkout) ... ok\ntest_fixed_root_governance_and_boundaries_receive_proven_source_map (test_composition.CompositionTests.test_fixed_root_governance_and_boundaries_receive_proven_source_map) ... ok\ntest_frontend_dist_symlink_cannot_import_assets_from_outside_source (test_composition.CompositionTests.test_frontend_dist_symlink_cannot_import_assets_from_outside_source) ... ok\ntest_historical_rdm_product_still_builds_from_legacy_pins (test_composition.CompositionTests.test_historical_rdm_product_still_builds_from_legacy_pins) ... ok\ntest_local_go_replace_is_rejected (test_composition.CompositionTests.test_local_go_replace_is_rejected) ... ok\ntest_locked_missing_revision_is_rejected (test_composition.CompositionTests.test_locked_missing_revision_is_rejected) ... ok\ntest_missing_frontend_assets_fails_before_publishing_binary (test_composition.CompositionTests.test_missing_frontend_assets_fails_before_publishing_binary) ... ok\ntest_modified_go_module_cache_is_rejected_before_product_publication (test_composition.CompositionTests.test_modified_go_module_cache_is_rejected_before_product_publication) ... ok\ntest_npm_local_dependency_overlay_is_rejected (test_composition.CompositionTests.test_npm_local_dependency_overlay_is_rejected) ... ok\ntest_project_test_mode_refuses_missing_boundary_gate (test_composition.CompositionTests.test_project_test_mode_refuses_missing_boundary_gate) ... ok\ntest_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock (test_composition.CompositionTests.test_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock) ... ok\ntest_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache (test_composition.CompositionTests.test_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache) ... ok\ntest_source_path_escape_is_rejected (test_composition.CompositionTests.test_source_path_escape_is_rejected) ... ok\ntest_test_target_checks_fixed_go_library_and_ui_sources (test_composition.CompositionTests.test_test_target_checks_fixed_go_library_and_ui_sources) ... ok\ntest_test_target_runs_real_frontend_and_go_tests (test_composition.CompositionTests.test_test_target_runs_real_frontend_and_go_tests) ... ok\ntest_unused_transitive_zip_does_not_require_consumer_sum_rewrite (test_composition.CompositionTests.test_unused_transitive_zip_does_not_require_consumer_sum_rewrite) ... ok\ntest_version_and_plugin_assets_come_from_committed_root (test_composition.CompositionTests.test_version_and_plugin_assets_come_from_committed_root) ... ok\ntest_versioned_rdm_product_entry_uses_fixed_composer (test_composition.CompositionTests.test_versioned_rdm_product_entry_uses_fixed_composer) ... FAIL\n\n======================================================================\nFAIL: test_versioned_rdm_product_entry_uses_fixed_composer (test_composition.CompositionTests.test_versioned_rdm_product_entry_uses_fixed_composer)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/tests/test_composition.py\", line 401, in test_versioned_rdm_product_entry_uses_fixed_composer\n self.assertEqual(result.returncode, 0, result.stdout)\n ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 2 != 0 : make[1]: Entering directory '/tmp/composition-test-2im6v8vz/rdm'\nbash scripts/build-product.sh\nTraceback (most recent call last):\n File \"/tmp/composition-test-2im6v8vz/dev/scripts/build-composition.py\", line 21, in \n from workspace.common import digest\nModuleNotFoundError: No module named 'workspace.common'\nmake[1]: *** [Makefile:62: product] Error 1\nmake[1]: Leaving directory '/tmp/composition-test-2im6v8vz/rdm'\n\n\n----------------------------------------------------------------------\nRan 20 tests in 15.620s\n\nFAILED (failures=1)\n", + "output_sha256": "09dde5f06c9ad12ac54dad092d72a886a3426a48bfcf145d0092444a6512d159", + "receipt_sha256": "f78be926f754e9a12193694ca515af9ed043d8a0c026976e1daa0ead98ff9994" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T17:18:07.752375+00:00", + "command": "git diff --check", + "command_sha256": "466c2f308b48c7661d646fdd068fbecea974c665fe65dbf8ed508f224180ce0b", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/cli.py\n M scripts/workspace/common.py\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "ea83d780c4d66cf1cb9b6cd76abb9800f34be3bd5058a0b50a8b4cd60c93a267", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "0c933daeb0eb1e374002a45611c74af0ea925d85fbb49797897e489e65be16f3", + "scripts/build-composition.py": "3cbf7dde996fa8a7d371452d70f08ccd383dfc7ef80f0f9dc4b432e19a652a8e", + "scripts/component-check.py": "ae3ff3c32a7400e560e7b1a4612c1bb43d6dd68f6b99170d3800eb8cdb0d1451", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "8fa2e18685ffcaa9eec466853d82c76200bb104670cf30d9bf896351b89ee4a0", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "dab15dcc2368a8e61c259189ad951b4995a212e1772f0e802af774836b871bdb", + "tests/test_svc_build_cutover.py": "5ddbfc1f1626aa2ac6ffa7c63a0b99f8eabdaf301089ab62c84ad2881809b541", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7f50152402d0e4bb18f9ce32d5bafca6610ee5971e172a7842b4036866f7eed6", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "b450e51c40ae7e52146a30b1ba6cb0612f4baeef", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": " M .gitea/workflows/ci.yaml\n M .gitignore\nD .gitmodules\n M .task/feature-dependency-workspace.md\n M AGENTS.md\n M Makefile\n M PROJECT.md\n M README.md\n M components.lock.json\nD deps/agent-command\nD deps/agent-intent\nD deps/agent-native\nD deps/agent-squad\nD deps/development-guidelines\nD deps/error-code-system\nD deps/logging-system\n M examples/downstream-rdm/README.md\n M examples/downstream-rdm/go.mod\n M examples/downstream-rdm/plugin.go\n M examples/downstream-rdm/plugin_test.go\nD modules/backend\nD modules/core\nD modules/documents\nD modules/frontend\nD modules/ui\n M policy/adoption.md\n M policy/architecture.yaml\n M policy/delivery.md\n M policy/governance.md\n M scripts/check-pins.sh\n M scripts/check-worktree.py\n M scripts/e2e.sh\n M scripts/lint-architecture.go\n M scripts/lint-architecture.sh\n M scripts/lint-boundaries.sh\n M scripts/svc.sh\n M scripts/task.sh\n M scripts/workspace/cli.py\n M scripts/workspace/common.py\n M scripts/workspace/git.py\n M scripts/workspace/go.py\n M scripts/workspace/transition.py\n M tests/test_ci_credentials.py\n M tests/test_workspace.py\n?? examples/downstream-rdm/go.sum\n?? policy/dependencies.md\n?? scripts/build-composition.py\n?? scripts/component-check.py\n?? scripts/component-source.py\n?? tests/fixtures/rdm-legacy-product.sh\n?? tests/test_component_checks.py\n?? tests/test_composition.py\n?? tests/test_dependency_ci.py\n?? tests/test_svc_build_cutover.py\n?? tests/test_workspace_cutover.py\n", + "tracked_diff_sha256": "ea83d780c4d66cf1cb9b6cd76abb9800f34be3bd5058a0b50a8b4cd60c93a267", + "untracked": { + "examples/downstream-rdm/go.sum": "46dc9e9b21648d4a34e30a9c58959ebd52bf3c7ece11bd20c33e291df3719fd7", + "policy/dependencies.md": "0c933daeb0eb1e374002a45611c74af0ea925d85fbb49797897e489e65be16f3", + "scripts/build-composition.py": "3cbf7dde996fa8a7d371452d70f08ccd383dfc7ef80f0f9dc4b432e19a652a8e", + "scripts/component-check.py": "ae3ff3c32a7400e560e7b1a4612c1bb43d6dd68f6b99170d3800eb8cdb0d1451", + "scripts/component-source.py": "57d06d0d40d2c8006c1186334100ffebb3c96ac0dd2d1334a59bd9ea29ed81d8", + "tests/fixtures/rdm-legacy-product.sh": "c36df85966d87f3492c91102394bae35d94e745680feb94bee8a2811ecc1b2ea", + "tests/test_component_checks.py": "8fa2e18685ffcaa9eec466853d82c76200bb104670cf30d9bf896351b89ee4a0", + "tests/test_composition.py": "2c079acc6a06d720695ea0b75c5879ff818e466b3ac4cab63e645e587223faf6", + "tests/test_dependency_ci.py": "dab15dcc2368a8e61c259189ad951b4995a212e1772f0e802af774836b871bdb", + "tests/test_svc_build_cutover.py": "5ddbfc1f1626aa2ac6ffa7c63a0b99f8eabdaf301089ab62c84ad2881809b541", + "tests/test_workspace_cutover.py": "4a804934e19eae8545dba149137e2856bc8ad9ed01cdd44a3b9e3d8e275224b4" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7f50152402d0e4bb18f9ce32d5bafca6610ee5971e172a7842b4036866f7eed6", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "", + "output_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "receipt_sha256": "8906c99e54fa7f23f64ed9abfcc36c1742d8502d420ee8bed6d95870f73d6c05" +} +``` diff --git a/AGENTS.md b/AGENTS.md index 98963749..8450e5ef 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,9 @@ # Agent 工作说明(Agent-System-Dev) -本仓开发遵循 Development-Guidelines(见 `deps/development-guidelines`,gitlink 固定版本): +本仓开发遵循固定 Development-Guidelines:新布局从 `components.lock.json` 准备 +`.workspace/Development-Guidelines`(启动检查可先提供仓外固定缓存);旧提交仍读 +`deps/development-guidelines` 的 gitlink。规则载入、版本权威及分支过渡见 +[policy/dependencies.md](policy/dependencies.md),首次准备失败不得跳过必读。 核心规则与术语见其 `core/`,按任务触发阅读 `standards/` 专题;通用交付依据为 `workflows/delivery.md`。 本项目的需求、设计试验、实施调整及交付**必读 [policy/delivery.md](policy/delivery.md)**: 需求、方案、实施与验收默认逐阶段人工评审,阶段内迭代、按影响回退;代码 Review 与 PR @@ -15,7 +18,7 @@ `@ui/motion.css` 的 `mk-*` 工具类;折叠一律用 `@ui` Collapsible 原语,禁止 `
`。 - 守护测试(UI 仓与 Frontend 仓各一份 `design-guard.test.ts`)以棘轮拦截新增裸色值、 私有 `@keyframes` 与行内字号;风格调整须在同一变更集中关联 UI 令牌 PR 与 Dev 的 - `DESIGN.md`/gitlink 组合 PR,并验证精确组件 SHA(跨仓不要求两个文件出现在同一 PR)。 + `DESIGN.md`/依赖锁组合 PR,并验证精确组件 SHA(跨仓不要求两个文件出现在同一 PR)。 - 异步状态只有一个所有者。事件按 seq 处理,过期事件丢弃。 ## 任务启动门禁(强制) @@ -77,7 +80,10 @@ - 主题行:英文祈使句一行(≤100 列,不以句点结尾);body 写 `Why: / Evidence: / Impact: / Refs:` 四段;任务卡与 PR 描述为同一份文档。 -- 跨仓 gitlink 变更须经组合验证(`make test`)后在 Dev 仓推进;受保护分支经 PR 合入。 +- 跨仓语言依赖/应用源码锁变更须经固定组合验证(`make test`)后在 Dev 仓推进; + 旧布局 gitlink 变更仍按其固定组合核验。受保护分支经 PR 合入。 + 功能仓源码只提交到所属仓;按需编辑、开发覆盖与旧任务显式过渡遵循 + [依赖与过渡入口](policy/dependencies.md)。不得修改其他活动工作区或删除仍被引用的 Git 管理数据。 - **高后果操作双钥匙**:改写历史、解除/变更分支保护、删除归档引用、发布版本——Agent 只准备 方案与命令,由用户确认并亲手执行;Agent 不得自行实施(baseline 硬边界 1 的授权范围要求)。 - 模块边界、公开契约与隔离档位见 `policy/modules/`(如有)与 PROJECT.md。 @@ -98,7 +104,7 @@ - **Web / API(HTTPS)**:`https://git-home.u1680832.nyat.app:30319`(Gitea 1.27.3, API 前缀 `/api/v1`;偶发 broken pipe / 超时,重试即可)。 - **Git over SSH**:`ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/.git` - (.gitmodules 与各仓 origin 均为此格式)。 + (components.json 与各仓 origin 使用此传输格式)。 - **API token**:`~/.secrets/gitea`,两行键值 `URL_PREFIX=…` 与 `ACCESS_TOKEN=<40 位 hex>`;取值 `grep ACCESS_TOKEN ~/.secrets/gitea | cut -d= -f2-`, 用作 `Authorization: token <值>` 请求头。**token 值不入仓、不回显、不写进产出物** diff --git a/Makefile b/Makefile index cec357de..d16ecad0 100644 --- a/Makefile +++ b/Makefile @@ -2,18 +2,36 @@ # 部署约束:非容器化;默认产物为单二进制(modules/backend,内嵌前端与嵌入式存储)。 SHELL := /bin/bash +SOURCE_MODE := $(if $(wildcard components.json),workspace,legacy) +ifeq ($(SOURCE_MODE),workspace) +CORE := .workspace/Agent-System-Core +BACKEND := .workspace/Agent-System-Backend +FRONTEND := .workspace/Agent-System-Frontend +UI := .workspace/Agent-System-UI +NATIVE := .workspace/Agent-Native +INTENT := .workspace/Agent-Intent +SQUAD := .workspace/Agent-Squad +COMMAND := .workspace/Agent-Command +DOCUMENTS := .workspace/Agent-System-Documents +else CORE := modules/core BACKEND := modules/backend FRONTEND := modules/frontend UI := modules/ui +NATIVE := deps/agent-native +INTENT := deps/agent-intent +SQUAD := deps/agent-squad +COMMAND := deps/agent-command +DOCUMENTS := modules/documents +endif BIN := bin/agent-system EMBED_DIR := $(BACKEND)/web/dist PLUGINS := plugins # 版本溯源(release-operations:运行制品须可对上固定组合)。无 tag 时 --always 给短 SHA。 -COMBO := core=$(shell git -C $(CORE) rev-parse --short HEAD 2>/dev/null)+backend=$(shell git -C $(BACKEND) rev-parse --short HEAD 2>/dev/null)+frontend=$(shell git -C $(FRONTEND) rev-parse --short HEAD 2>/dev/null)+ui=$(shell git -C $(UI) rev-parse --short HEAD 2>/dev/null)+agentcmd=$(shell git -C deps/agent-command rev-parse --short HEAD 2>/dev/null)+documents=$(shell git -C modules/documents rev-parse --short HEAD 2>/dev/null)+native=$(shell git -C deps/agent-native rev-parse --short HEAD 2>/dev/null)+squad=$(shell git -C deps/agent-squad rev-parse --short HEAD 2>/dev/null)+intent=$(shell git -C deps/agent-intent rev-parse --short HEAD 2>/dev/null) +COMBO := core=$(shell git -C $(CORE) rev-parse --short HEAD 2>/dev/null)+backend=$(shell git -C $(BACKEND) rev-parse --short HEAD 2>/dev/null)+frontend=$(shell git -C $(FRONTEND) rev-parse --short HEAD 2>/dev/null)+ui=$(shell git -C $(UI) rev-parse --short HEAD 2>/dev/null)+agentcmd=$(shell git -C $(COMMAND) rev-parse --short HEAD 2>/dev/null)+documents=$(shell git -C $(DOCUMENTS) rev-parse --short HEAD 2>/dev/null)+native=$(shell git -C $(NATIVE) rev-parse --short HEAD 2>/dev/null)+squad=$(shell git -C $(SQUAD) rev-parse --short HEAD 2>/dev/null)+intent=$(shell git -C $(INTENT) rev-parse --short HEAD 2>/dev/null) VERSION := $(shell git describe --tags --always --dirty 2>/dev/null)+$(COMBO) -.PHONY: help sync status build frontend svc svc-list svc-info svc-commits svc-history svc-update svc-recover svc-watchdog test-backend test-backend-pg test-multi-instance test-lifecycle test-frontend test-ui test-core test-agentcmd test-pins test-libs dev pin clean setup precheck task-start task-sync task-close task-finish facts-verify evidence version +.PHONY: help sync status workspace-prepare component-edit component-unlink workspace-status workspace-transition build frontend svc svc-list svc-info svc-commits svc-history svc-update svc-recover svc-watchdog test-backend test-backend-pg test-multi-instance test-lifecycle test-frontend test-ui test-core test-agentcmd test-pins test-libs dev pin clean setup precheck task-start task-sync task-close task-finish facts-verify evidence version version: @echo "agent-system $(VERSION)" @@ -52,14 +70,33 @@ task-finish: evidence: @SRC='$(SRC)' TAIL='$(TAIL)' bash scripts/evidence.sh +# workspace.py owns source identity, locks and development overlays. +workspace-prepare: + @python3 scripts/workspace.py --root . prepare $(if $(NAME),--name "$(NAME)") $(if $(filter 1,$(REFRESH_FIXED)),--refresh-fixed) + +component-edit: + @test -n "$(NAME)" || { echo "usage: make component-edit NAME= [BRANCH=feature/]"; exit 2; } + @python3 scripts/workspace.py --root . edit --name "$(NAME)" $(if $(BRANCH),--branch "$(BRANCH)") + +component-unlink: + @test -n "$(NAME)" || { echo "usage: make component-unlink NAME="; exit 2; } + @python3 scripts/workspace.py --root . unlink --name "$(NAME)" + +workspace-status: + @python3 scripts/workspace.py --root . status $(if $(NAME),--name "$(NAME)") + +# Default report is read-only. Only explicit ARGS=--apply copies into new roots. +workspace-transition: + @python3 scripts/workspace.py --root . transition $(if $(NAME),--name "$(NAME)") $(ARGS) + # 外部事实登记表逐条重验(--update 刷新 PASS 项 last_verified)。 facts-verify: @bash scripts/facts-verify.sh $(ARGS) help: - @echo "make sync 物化全部 submodule(递归)" - @echo "make build 构建单二进制 bin/agent-system(契约同步→前端构建→embed→静态链接)" - @echo "make test 全量测试(boundaries + pins + libs + core + backend + frontend + ui + agent-command)" + @echo "make sync 准备固定应用/资料/规则源码(旧提交保留 submodule 模式)" + @echo "make build 固定版本隔离构建 bin/agent-system(前端资产→embed→单二进制)" + @echo "make test 固定组合测试(治理 + boundaries/architecture + 组件与前端测试)" @echo "make test-governance 临时真实仓库中的任务、证据、写守卫与 CI 凭据回归" @echo "make svc 服务级操作:make svc ENV= [ACTION=deploy|start|stop|restart|status|logs] [ARGS='--from dev@ --tag ...']" @echo "make svc-list 服务总览:make svc-list [ARGS='--tag core'];数据库运维:scripts/svc.sh db create|dsn|backup|backups|restore|clone|copy|ls|set" @@ -70,16 +107,32 @@ help: @echo "make svc-recover 自恢复:拉回 autostart=1 但已死的服务:make svc-recover [ARGS='dev --quiet']" @echo "make svc-watchdog 自恢复看护:make svc-watchdog ARGS='install|remove|status'(systemd 用户 timer)" @echo "make dev 开发模式说明(前后端分离热更新)" - @echo "make pin 推进 submodule 指针到各仓远端 main(提交前须 make test 通过)" - @echo "make status submodule 状态" + @echo "make workspace-prepare 准备固定源码;component-edit NAME= 按需编辑" + @echo "make workspace-transition [NAME=] 默认只报告;ARGS=--apply 显式准备新现场" +ifeq ($(SOURCE_MODE),workspace) +sync: workspace-prepare + +status: workspace-status +else sync: git submodule update --init --recursive status: @git submodule status +endif # 契约同步:Core 的 TS 类型镜像到前端与 UI 组件库(Core 为权威,单一来源)。 +ifeq ($(SOURCE_MODE),workspace) +# Contracts are versioned npm package exports; frontend builds materialize them. +contracts: frontend + +frontend: + python3 scripts/build-composition.py --root . --target frontend + +build: + python3 scripts/build-composition.py --root . --target build +else contracts: test-worktree cp $(CORE)/ts/types.ts $(FRONTEND)/src/contracts.ts.tmp { echo "// 从 Agent-System-Core ts/types.ts 同步(make contracts 生成;Core 为权威)。"; cat $(FRONTEND)/src/contracts.ts.tmp; } > $(FRONTEND)/src/contracts.ts @@ -98,6 +151,22 @@ build: frontend cd $(BACKEND) && CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o ../../bin/storage-migrate ./cmd/storage-migrate @echo "OK: $(BIN)(版本 $(VERSION);随附插件目录 $(PLUGINS)/)+ bin/storage-migrate(协作存储 U4 迁移工具)" +endif + +ifeq ($(SOURCE_MODE),workspace) +# Named checks exercise developer sources, prepare selected versions, and keep +# GOWORK=off unless LOCAL_OVERLAY=1 explicitly selects registered component links. +.PHONY: dev-backend dev-frontend +LOCAL_CHECK := python3 scripts/component-check.py --root . +test-lifecycle: + @test -n "$${AGENT_PG_TEST_DSN}" || { echo "test-lifecycle: AGENT_PG_TEST_DSN 未设置(真实 PostgreSQL 必需,不静默跳过)"; exit 1; } + @test -n "$${SVC_RDM_SRC_DIR}" || { echo "test-lifecycle: SVC_RDM_SRC_DIR 未设置(RDM 检出必需,不静默跳过)"; exit 1; } + bash scripts/fetch-rdm-pin.sh tests/integration/lifecycle/rdm.pin >/dev/null + python3 tests/integration/lifecycle/lifecycle_suite.py + +test-core test-backend test-backend-pg test-multi-instance test-frontend test-ui test-agentcmd eval-deliverables dev-backend dev-frontend: + $(LOCAL_CHECK) --target $@ $(if $(filter 1,$(LOCAL_OVERLAY)),--overlay) +else test-core: cd $(CORE) && go test ./... @@ -138,24 +207,37 @@ test-ui: contracts cd $(UI) && npm ci --no-fund --no-audit && npx tsc --noEmit && npx vitest run && node scripts/check-knip.mjs test-agentcmd: - cd deps/agent-command && go vet ./... && go test -count=1 ./... + cd $(COMMAND) && go vet ./... && go test -count=1 ./... + +endif test-boundaries: bash scripts/lint-boundaries.sh # 容器仓 deps/ gitlink 与 Dev 顶层指针一致。读索引中的 gitlink。 +ifeq ($(SOURCE_MODE),workspace) +test-pins: + @if [ -n "$${COMPOSITION_SOURCE_MAP:-}" ]; then bash scripts/check-pins.sh; else python3 scripts/workspace.py --root . verify; fi +else test-pins: bash scripts/check-pins.sh +endif # 三个库在各自模块内测试。不用 go.work:工作区 MVS 会抬高 golang.org/x 版本。 +ifeq ($(SOURCE_MODE),workspace) test-libs: - cd deps/agent-intent && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./... - cd deps/agent-native && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./... - cd deps/agent-squad && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./... - cd deps/agent-squad/adapters/intent && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./... - cd deps/agent-squad/adapters/native && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./... - cd deps/agent-squad/adapters/sqlite && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./... - cd deps/agent-squad/cmd/agent-squad && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./... + $(LOCAL_CHECK) --target $@ $(if $(filter 1,$(LOCAL_OVERLAY)),--overlay) +else +test-libs: + cd $(INTENT) && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./... + cd $(NATIVE) && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./... + cd $(SQUAD) && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./... + cd $(SQUAD)/adapters/intent && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./... + cd $(SQUAD)/adapters/native && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./... + cd $(SQUAD)/adapters/sqlite && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./... + cd $(SQUAD)/cmd/agent-squad && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./... + +endif plugin-new: @test -n "$(NAME)" || (echo "用法:make plugin-new NAME="; exit 2) @@ -170,9 +252,23 @@ test-worktree: python3 scripts/check-worktree.py verify # 即使 make -j,也先确认实际被测子仓与固定组合一致。 +ifeq ($(SOURCE_MODE),workspace) +test-libs test-core test-backend test-frontend test-ui test-agentcmd: | test-worktree +ifeq ($(COMPOSITION_SOURCE_MAP),) +test-boundaries test-pins: | test-worktree +endif +else test-boundaries test-pins test-libs test-core test-backend test-frontend test-ui test-agentcmd: | test-worktree +endif +ifeq ($(SOURCE_MODE),workspace) +# Formal composition uses isolated sources and GOWORK=off. Developer overlays +# remain untouched; the composition executor runs the component gates. +test: + python3 scripts/build-composition.py --root . --target test +else test: test-worktree test-governance test-boundaries test-pins test-libs test-core test-backend test-frontend test-ui test-agentcmd +endif # 运行演示(mock 模式):单二进制 + 示例插件 + 嵌入式存储,浏览器 http://127.0.0.1:8787 # 环境服务管理(scripts/svc.sh):deploy = 停旧 → 构建 → 启动;dev/prod 相互隔离。 @@ -205,6 +301,10 @@ svc-update: demo: build $(BIN) serve --addr 127.0.0.1:8787 --data ./data --plugins $(PLUGINS) --mock +ifeq ($(SOURCE_MODE),workspace) +dev: + $(LOCAL_CHECK) --target dev $(if $(filter 1,$(LOCAL_OVERLAY)),--overlay) +else dev: @echo "开发模式(原生,非容器):" @echo " 1. make sync && make contracts" @@ -212,7 +312,14 @@ dev: @echo " 3. 终端 B:cd $(FRONTEND) && npm ci && npm run dev # Vite 代理到 8787" @echo " 4. mock 演示:设置→运行时→演示模式;或终端 A 加 --mock" +endif + # 推进指针(多仓纪律:先验证后固定)。 +ifeq ($(SOURCE_MODE),workspace) +pin: + @echo "pin: update consumer go.mod/package-lock.json or components.lock.json explicitly, then verify the fixed composition" >&2 + @exit 2 +else pin: @for m in modules/core modules/backend modules/frontend modules/ui modules/documents deps/agent-native deps/agent-squad deps/agent-intent deps/error-code-system deps/logging-system deps/development-guidelines deps/agent-command; do \ (git -C $$m fetch -q origin && git -C $$m checkout -q origin/main) || echo "skip $$m"; \ @@ -220,5 +327,12 @@ pin: @echo "submodule 指针已推进;请 make test 后 git add .gitmodules modules deps && git commit" @scripts/check-pins.sh || echo "pin: check-pins 未通过,上面列出的容器需要重钉;pin 本身不失败" +endif + +ifeq ($(SOURCE_MODE),workspace) +clean: + rm -f $(BIN) bin/storage-migrate +else clean: rm -rf $(BIN) $(FRONTEND)/dist $(FRONTEND)/node_modules $(UI)/node_modules data +endif diff --git a/PROJECT.md b/PROJECT.md index 966c053a..f329d24a 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -1,55 +1,55 @@ # Agent-System-Dev 项目事实 -- 用途:开发集成父仓(gitlink 权威);非分发单元。 -- 组合:modules/{core,backend,frontend,ui,documents} + deps/{development-guidelines,agent-native,agent-squad,agent-intent,agent-command,error-code-system,logging-system}。 +- 用途:独立功能仓的开发与固定组合入口;非分发单元。 +- 组合:组件身份见 components.json;应用/规范/资料提交见 components.lock.json,Go/npm 库版本由消费方语言锁决定。按需源码位于被忽略的 .workspace/。 - 部署:非容器;Releases 仓从本仓固定提交导出版本。 ## 方向与规划入口 -长期方向、目标及跨任务规划从过程仓的 [项目方向与规划索引](modules/documents/docs/proposals/INDEX.md) -查找主记录、里程碑和关联任务;原始正文沿用 [方案与规划目录](modules/documents/docs/proposals/)。 +长期方向、目标及跨任务规划从过程仓的 [项目方向与规划索引](.workspace/Agent-System-Documents/docs/proposals/INDEX.md) +查找主记录、里程碑和关联任务;原始正文沿用 [方案与规划目录](.workspace/Agent-System-Documents/docs/proposals/)。 确立或调整具体方向时,在本入口维护其主记录链接;正文、确认依据和进展仍以该主记录为准。 目录中的既有文档不因被收录而自动成为已批准规划。记录、任务关联及收尾建议按 [交付规范的长期方向与任务衔接](policy/delivery.md#长期方向与任务衔接) 执行。 - [版本化依赖与按需源码工作区改造任务](.task/feature-dependency-workspace.md): - Documents 主记录为 `docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md` r1, - 保存于本地候选分支 `feature/dependency-workspace-plan`;具体方案与实施顺序待评审, - 本仓尚未推进该 Documents gitlink。保留功能仓独立、Dev 单入口按需编辑,覆盖语言依赖、 - RDM、正式构建/治理适配及 Guidelines 通用规则;迁移实施、验收、发布与部署 NOT_RUN。 + 已批准方案和实施计划由固定 Documents 的 `docs/proposals/2026-10-13-versioned-dependencies-and-workspaces.md` + 与对应 `-implementation-plan.md` 保存。用户授权重构与自检连续推进,特别要求在途分支平稳过渡; + 实施进展和命令证据见任务卡,正式验收、共享部署及发布仍按原审批边界。 + [项目依赖与过渡规则](policy/dependencies.md) 是具体工作入口。 -- [快慢通道展示与动态工作摘要方案 r1.1](modules/documents/docs/proposals/2026-10-12-fast-slow-channel-display.md): +- [快慢通道展示与动态工作摘要方案 r1.1](.workspace/Agent-System-Documents/docs/proposals/2026-10-12-fast-slow-channel-display.md): 对话即时答复、后台动态发现与来源、四层阅读、真实状态、并发/恢复及 U1–U4; 2026-10-12 方案设计已批准(阶段 1–4),首批仅 U1; - [U1 实施计划](modules/documents/docs/proposals/2026-10-12-fast-slow-channel-display-u1-plan.md) 待阶段 5 批准后启动业务代码; + [U1 实施计划](.workspace/Agent-System-Documents/docs/proposals/2026-10-12-fast-slow-channel-display-u1-plan.md) 待阶段 5 批准后启动业务代码; 业务实施、模型实验、运行验收与部署 NOT_RUN。 -新增方向:[Generative UI 调研与插件方案 r2](modules/documents/docs/proposals/2026-10-10-generative-ui-plugin.md)。 +新增方向:[Generative UI 调研与插件方案 r2](.workspace/Agent-System-Documents/docs/proposals/2026-10-10-generative-ui-plugin.md)。 2026-10-11 用户裁定首试点(对话内分析页)、可信编译插件交付与试验参数;U1 受控试验当日完成 (结构分化 6/6、生成走工具参数通道、首期自研 renderer,详见方案「U1 结果与 r2 修订」); U2 起实施与部署分别评审。 -- [多人协作存储与分布式演进方案](modules/documents/docs/proposals/2026-10-11-collaboration-storage-and-distribution.md): +- [多人协作存储与分布式演进方案](.workspace/Agent-System-Documents/docs/proposals/2026-10-11-collaboration-storage-and-distribution.md): 10–100 人、多项目、多会话并行;PostgreSQL 团队档、迁移恢复与多实例执行。方案 r1 已批准 (2026-10-11,用户指示「按方案开始改造」),实施自首选增量 U1+U2 启动。 -- [RDM 两树一网集成、完善与追溯审计展示方案](modules/documents/docs/proposals/2026-10-11-rdm-two-trees-trace-audit-integration.md): +- [RDM 两树一网集成、完善与追溯审计展示方案](.workspace/Agent-System-Documents/docs/proposals/2026-10-11-rdm-two-trees-trace-audit-integration.md): 每项目一套笔记树、文档树与追溯网;项目绑定与读取授权闭环、原子事件历史、统一审计读服务 与四入口工作区。方案 r1 已获用户评审通过(2026-10-11,五阶段一并,KTD4 双层管理员裁定); U1–U5 全部实施合入(RDM PR #195/#197/#201/#213;Dev PR #368,2026-10-11;超管槽待基座能力 接线,申请见 RDM 仓 docs/proposals/2026-10-11-u1-base-extension-requests.md); U6 团队存储独立后续;运行验收属部署环境。 -- [RDM 模板与两树一网对话文档生成方案 r1.1](modules/documents/docs/proposals/2026-10-11-rdm-template-dialog-generation.md):69 类历史资产盘点、模板版本与章节实例化、持久提案、文档级审签及 DOCX;待用户评审,业务实施与运行验收 NOT_RUN。 首批项目建议书/竞品分析、随后扩展全部文档已确认(2026-10-11),其余方案与实施仍待评审。 +- [RDM 模板与两树一网对话文档生成方案 r1.1](.workspace/Agent-System-Documents/docs/proposals/2026-10-11-rdm-template-dialog-generation.md):69 类历史资产盘点、模板版本与章节实例化、持久提案、文档级审签及 DOCX;待用户评审,业务实施与运行验收 NOT_RUN。 首批项目建议书/竞品分析、随后扩展全部文档已确认(2026-10-11),其余方案与实施仍待评审。 -- [RDM 最终目标核对与完整交付方案 r1](modules/documents/docs/proposals/2026-10-11-rdm-final-target-completion.md):系统级项目、上限内权限覆盖、私域协作、全部文档三权与完整业务链;34 UR/68 SR/10 F 逐条映射;方案已随 #340 合入(2026-10-11),U1 需求基线核对经 RDM #199/#200 落地,U2 起未启动。 +- [RDM 最终目标核对与完整交付方案 r1](.workspace/Agent-System-Documents/docs/proposals/2026-10-11-rdm-final-target-completion.md):系统级项目、上限内权限覆盖、私域协作、全部文档三权与完整业务链;34 UR/68 SR/10 F 逐条映射;方案已随 #340 合入(2026-10-11),U1 需求基线核对经 RDM #199/#200 落地,U2 起未启动。 -- [服务重启与全量数据恢复方案 r3.1](modules/documents/docs/proposals/2026-10-12-service-restart-data-recovery.md): +- [服务重启与全量数据恢复方案 r3.1](.workspace/Agent-System-Documents/docs/proposals/2026-10-12-service-restart-data-recovery.md): svc 启停、异常进程/主机退出后的依赖、配置/数据身份、任务/HITL/副作用、文件与组合备份恢复; r2 已批准。r3.1 增补 D1 实例身份收尾、D2 可回滚切换、D3 真实组合门禁,并记录 2026-10-12 rdmcand 数据归属:会话不在 dev 库的 rdmcand 窗口内,领域事件为空,不跨实例搬迁。 D1 与 D2 已合入 Backend #184、RDM #291、Dev #485。D3 的 `make test-lifecycle` 跑真实组合用例;登录仍是 NOT_RUN,依赖账户方案 U7/U5,不在本轮公共化账户 CLI。r3 其余未批条款仍待人工评审。 -- [svc 统一部署与一次性登录 Key 方案 r1](modules/documents/docs/proposals/2026-10-12-svc-unified-deploy-and-login-key.md): +- [svc 统一部署与一次性登录 Key 方案 r1](.workspace/Agent-System-Documents/docs/proposals/2026-10-12-svc-unified-deploy-and-login-key.md): 二进制/源码统一部署、环境准备、无初始密码开户与账户恢复;一次性 Key 仅兑换设密受限会话; 2026-10-12 已批准;U1/U4 实施启动中;规格见 `docs/svc-deploy/`。 @@ -57,17 +57,23 @@ U2 起实施与部署分别评审。 ## 验证 -`make test` 先核对子模块工作树与固定指针,再运行治理脚本、公开边界、跨仓指针、库及各模块 -测试。实际目标以根 Makefile 为准。`make test-governance` 可独立检查开发门禁,使用临时 -真实仓库,不访问生产数据;操作与证据要求见 [开发门禁](policy/governance.md)。 +`make setup` 启用钩子。新 clone 无需递归克隆;启动门禁提供固定规则, +`make workspace-prepare` 准备固定应用与资料。`make component-edit NAME=Agent-Native` +按消费方实际版本创建功能仓编辑分支并生成本地 go.work;解除用 `make component-unlink`。 -`make build` 在 backend 模块内编译,replace 指向该模块自己的 `deps/`; -`scripts/check-pins.sh` 核对这些 gitlink 与 Dev 顶层指针,`make test-worktree` 另核对 -真正被测的组件工作树。两者分别验证固定组合与实际检出,不能相互替代。 +`make test` / `make build` 在隔离目录使用已提交的清单、应用源码、语言依赖和前端包, +关闭 Go 开发覆盖,拒绝本地 replace/link,构建 frontend dist 后装配 backend embed。 +输出 bin/resolved-manifest.json,含实际来源、解析版本及资产摘要;工作区本地覆盖不会改变正式候选。 -未加 go.work:工作区最小版本选择会抬高 backend 单独构建使用的部分 `golang.org/x` 版本。 -发布消费方须从固定 Dev 提交递归物化后运行 `make build`,再核验制品与实际运行状态。 +`make test-governance` 在临时真实仓库验证启动、任务同步、证据、迁移保留和拒绝路径; +`make test-pins` 在新布局核验固定来源,历史提交仍执行旧 gitlink 检查。 +公开边界与架构检查使用组合器的固定来源映射,详细操作见 [开发门禁](policy/governance.md)。 -- [渐进工作台界面重设计 r0.2](modules/documents/docs/proposals/2026-10-12-work-companion-ui-design.md):用户已授权连续实施;[计划 r1](modules/documents/docs/proposals/2026-10-12-work-companion-ui-plan.md)覆盖任务摘要、对话/输入、窄屏和真实状态投影;进展见对应任务卡。 +RDM 从自身 go.mod 消费远端 Backend,`COMPOSITION_ROOT=<已提交 Dev 根目录> make product` +隔离 vendor 并注入固定前端资产,随产物记录其实际 Backend 版本;不改模块缓存。 +`product-smoke` 的临时运行验证与正式验收、共享部署分开记录。真实 PG/Redis、生命周期等 +专项门禁保持原环境要求;未提供环境不会由本地组合测试冒充通过。 -- [系统项目、成员工作入口与私域协作闭环 r1](modules/documents/docs/proposals/2026-10-13-system-project-membership.md):2026-10-13 用户批准阶段 1–9 连续推进;统一全局项目身份与名称、成员个人会话、每项目两树一网和私域权限;当前组合验证/CI/tag 消费推进中,部署与线上修复未授权。 +- [渐进工作台界面重设计 r0.2](.workspace/Agent-System-Documents/docs/proposals/2026-10-12-work-companion-ui-design.md):用户已授权连续实施;[计划 r1](.workspace/Agent-System-Documents/docs/proposals/2026-10-12-work-companion-ui-plan.md)覆盖任务摘要、对话/输入、窄屏和真实状态投影;进展见对应任务卡。 + +- [系统项目、成员工作入口与私域协作闭环 r1](.workspace/Agent-System-Documents/docs/proposals/2026-10-13-system-project-membership.md):2026-10-13 用户批准阶段 1–9 连续推进;统一全局项目身份与名称、成员个人会话、每项目两树一网和私域权限;当前组合验证/CI/tag 消费推进中,部署与线上修复未授权。 diff --git a/README.md b/README.md index a9874688..6a3979fb 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,30 @@ # Agent-System-Dev -Agent-System 的开发集成仓(父仓):以 submodule 固定全部模块组合,承载跨仓构建、测试编排与原生(非容器)开发环境。**非分发单元**——发布物在 Agent-System-Releases。 +Agent-System 的开发集成入口,组织独立功能仓、固定依赖和跨仓构建。只需手动 clone 本仓;应用与资料由源码清单准备,Go/npm 库由消费方下载。发布物仍在 Agent-System-Releases,默认采用原生单二进制。 -## 组合结构 - -``` -modules/core Agent-System-Core 核心契约(领域模型/事件协议/插件 API/设置与 UI 词汇) -modules/backend Agent-System-Backend 后端单二进制(内嵌前端与嵌入式 SQLite) -modules/frontend Agent-System-Frontend 前端(React 19 + Vite + TS) -modules/documents Agent-System-Documents 系统文档与过程记录 -modules/ui Agent-System-UI UI 组件库(词汇渲染器/设计令牌/收件箱卡片工作区组件) -deps/development-guidelines 开发规范(gitlink 固定版本) -deps/agent-native deps/agent-squad deps/agent-intent 生态执行/编排/意图 -deps/agent-command Agent-Command 命令总线基础库(spec/注册表/危险分级/审计信封) -deps/error-code-system deps/logging-system 基础设施 -plugins/ 示例插件与插件开发参考(P4 起填充) -``` - -父仓 gitlink 是各组件源码版本的权威;构建、审核与发布固定提交,不执行 `submodule update --remote`。 - -## 常用命令 +## 开始开发 ```bash -make sync # 物化全部 submodule(递归) -make build # 构建单二进制 bin/agent-system -make test # 全量测试 -make dev # 开发模式说明(前后端分离热更新) +make setup +RECEIPT=/tmp/my-task-precheck.json CMD="make precheck" make evidence +make task-start NAME=feature/my-task PRECHECK_RECEIPT=/tmp/my-task-precheck.json +# 在返回的任务 worktree 中执行 +make workspace-prepare +make component-edit NAME=Agent-Native BRANCH=feature/my-native-change +make workspace-status +make component-unlink NAME=Agent-Native ``` -## 约束(全局) +按需源码是 .workspace 下的普通独立 Git 仓。功能修改提交到所属仓;消费方通过依赖 PR 采用新版本,不需要为了保存源码提交而同步推进全部仓库。 -- 非容器化部署:默认单二进制,必要时拆分多个原生二进制;不发布容器镜像。 -- 依赖方向:frontend→core←backend;插件只依赖 core;生态仓依赖纪律沿用各仓既有约定。 -- 开发规范:`deps/development-guidelines`(见各仓 AGENTS.md)。 +`make test` 与 `make build` 使用已提交的固定组合,在隔离目录关闭开发覆盖,生成 bin/agent-system、storage-migrate 与 resolved-manifest.json。源码身份见 components.json;应用/规范/资料提交见 components.lock.json;库的实际版本见消费方 go.mod/go.sum、package-lock.json。 -## 文档 +## 规范与过渡 -设计方案:`modules/documents/docs/proposals/2026-09-29-system-skeleton-design-and-plan.md`(含 D1–D16 决策记录)。 -本机服务管理(后端/前端/数据库部署、生命周期、备份克隆):`docs/svc.md`(`scripts/svc.sh`)。 +- [项目事实与验证入口](PROJECT.md) +- [版本依赖、按需编辑和旧分支过渡](policy/dependencies.md) +- [阶段交付](policy/delivery.md)与[开发门禁](policy/governance.md) + +旧提交继续采用自己的 submodule 模式;旧任务同步新主干前由 owner 保存现场并显式过渡。迁移工具默认只报告,不改动其他活动工作区。规范来自固定 Development-Guidelines,过程文档来自固定 Agent-System-Documents;新项目通过独立采纳采用通用规则。 + +本机服务管理见 [docs/svc.md](docs/svc.md)。依赖改造不授权共享服务部署、数据库操作或发布。 diff --git a/components.lock.json b/components.lock.json index f83ab838..fad82574 100644 --- a/components.lock.json +++ b/components.lock.json @@ -2,16 +2,16 @@ "schema": 1, "components": { "Agent-System-Frontend": { - "commit": "ad53e90a8542143104ddc7f759c8f8e7b7001924" + "commit": "6ed7b9322c5733f76b206a35cd78649ba385d83b" }, "Agent-System-Backend": { - "commit": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c" + "commit": "fffd5790cfab317fadafb40fa55a11bab6e9a847" }, "Development-Guidelines": { - "commit": "2f5b19872be2a4597838a4131ad75d1be089ee5e" + "commit": "1a842553b6a7432e5a85aaae43a45a7a7ea58195" }, "Agent-System-Documents": { - "commit": "129cc3579d9c9e3edfb46c99270d65f3e1dad0a0" + "commit": "7ba50e5b2dce226b4b962ea787222a4b08f0e94c" } } } diff --git a/deps/agent-command b/deps/agent-command deleted file mode 160000 index 4f583ca3..00000000 --- a/deps/agent-command +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4f583ca3eeeb07a56a714c5086de84dcd6ad2980 diff --git a/deps/agent-intent b/deps/agent-intent deleted file mode 160000 index 343b1e6d..00000000 --- a/deps/agent-intent +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 343b1e6d9a5b58e47bf7e594826221036ae8175c diff --git a/deps/agent-native b/deps/agent-native deleted file mode 160000 index c3484416..00000000 --- a/deps/agent-native +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c348441691e8bdab784a03aa9be64d53dacff341 diff --git a/deps/agent-squad b/deps/agent-squad deleted file mode 160000 index 490b0b2d..00000000 --- a/deps/agent-squad +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 490b0b2dfa1567cb16ff7a7230fd78e52bc2938e diff --git a/deps/development-guidelines b/deps/development-guidelines deleted file mode 160000 index af199eea..00000000 --- a/deps/development-guidelines +++ /dev/null @@ -1 +0,0 @@ -Subproject commit af199eeaa23c5b39e08b4649f2513d7572dc5274 diff --git a/deps/error-code-system b/deps/error-code-system deleted file mode 160000 index a3ee67bb..00000000 --- a/deps/error-code-system +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a3ee67bba269e1276c14e22c026171ecf2cf6190 diff --git a/deps/logging-system b/deps/logging-system deleted file mode 160000 index 49b5d8be..00000000 --- a/deps/logging-system +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 49b5d8be604d05e4246dffa0d10fa1c2b7ad45d7 diff --git a/examples/downstream-rdm/README.md b/examples/downstream-rdm/README.md index cb3f4347..c2b0b09c 100644 --- a/examples/downstream-rdm/README.md +++ b/examples/downstream-rdm/README.md @@ -1,9 +1,5 @@ -# 下游薄切片 +# 独立下游扩展示例 -本目录模拟独立仓库 `Agent-System-Plugin-RDM`。它只 import `agent-system-backend/pkg/extension`,不改基座。 +本目录模拟独立功能仓,通过 Backend 的公开 pkg/extension 注册扩展。go.mod/go.sum 固定远端依赖,普通 clone 即可下载和测试,不要求相邻源码目录或复制 replace。需要完整产品时空白导入公开 pkg/extension/link,并通过 Dev 的固定组合器装配前端资产,具体见 policy/dependencies.md。 -把本目录搬到新仓库时,由 owner 创建 Git 仓库。`replace` 改成基座检出路径或已发布版本。需要拉起完整二进制时再空白导入 `agent-system-backend/pkg/extension/link`,并复制基座 `go.mod` 的 replace(下游模块不会继承它们)。 - -``` -go test . -``` +版本采用由 Go 生成的提交版本;更新消费方依赖后独立测试,再对实际固定组合审阅。本地源码联调用工作区覆盖,正式构建使用 GOWORK=off。 diff --git a/examples/downstream-rdm/go.mod b/examples/downstream-rdm/go.mod index 6a050575..68a1cf64 100644 --- a/examples/downstream-rdm/go.mod +++ b/examples/downstream-rdm/go.mod @@ -3,13 +3,6 @@ module example.com/agent-system-plugin-rdm go 1.27 require ( - agent-system-backend v0.0.0 - agent-system-core v0.0.0 + git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git v0.4.1-0.20261013154716-f1302ed5b395 + git-ssh.u1680832.nyat.app/weichen/Agent-System-Core.git v0.4.1-0.20261013151137-f32d4317846f ) - -// 声明式路径(仅 pkg/extension 根包)只需下面两条 replace。 -// 空白导入 pkg/extension/link 拉起完整后端时,须复制基座 go.mod 的 -// 全部 8 条 deps replace——见 README 与 extension-compat-policy §4。 -replace agent-system-backend => ../../modules/backend - -replace agent-system-core => ../../modules/backend/deps/agent-system-core diff --git a/examples/downstream-rdm/go.sum b/examples/downstream-rdm/go.sum new file mode 100644 index 00000000..1c1e0ad6 --- /dev/null +++ b/examples/downstream-rdm/go.sum @@ -0,0 +1,4 @@ +git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git v0.4.1-0.20261013154716-f1302ed5b395 h1:Ij/SYy1bNdlteFZeCSBFUEEFbhwd3srpAOwSIjhbpsI= +git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git v0.4.1-0.20261013154716-f1302ed5b395/go.mod h1:ipD03jF1IpqWwU7m+verjzgnOYVc7Tau9xz9mJKKn8s= +git-ssh.u1680832.nyat.app/weichen/Agent-System-Core.git v0.4.1-0.20261013151137-f32d4317846f h1:39RW0R6zmtXLNbLQaqFCmtZ6zjEs2lhDLb9YLhudIiM= +git-ssh.u1680832.nyat.app/weichen/Agent-System-Core.git v0.4.1-0.20261013151137-f32d4317846f/go.mod h1:T3FU9NsngaxF/1C2ISi02fV7+aqNepOEvX0QhswA70Y= diff --git a/examples/downstream-rdm/plugin.go b/examples/downstream-rdm/plugin.go index 19a89b07..a131c8f0 100644 --- a/examples/downstream-rdm/plugin.go +++ b/examples/downstream-rdm/plugin.go @@ -4,7 +4,7 @@ import ( "context" "encoding/json" - "agent-system-backend/pkg/extension" + "git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/extension" ) func init() { diff --git a/examples/downstream-rdm/plugin_test.go b/examples/downstream-rdm/plugin_test.go index bd785ff7..d3f2e90b 100644 --- a/examples/downstream-rdm/plugin_test.go +++ b/examples/downstream-rdm/plugin_test.go @@ -6,8 +6,8 @@ import ( "errors" "testing" - "agent-system-backend/pkg/extension" - core "agent-system-core" + "git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/extension" + core "git-ssh.u1680832.nyat.app/weichen/Agent-System-Core.git" ) func TestCompiledSkillRegistration(t *testing.T) { @@ -24,6 +24,7 @@ func TestCompiledSkillRegistration(t *testing.T) { // fakeRegistry 记录 register() 的登记动作,不拉起基座。 type fakeRegistry struct { + extension.Registry // Unused capabilities fail if this example starts calling them. skills []string commands []string handlers int @@ -64,7 +65,10 @@ func TestRegisterBindsPingHandler(t *testing.T) { } // fakeHost 是下游测试里的最小句柄替身:只实现 rdm.ping 用到的能力。 -type fakeHost struct{ owner string } +type fakeHost struct { + extension.Host + owner string +} func (f fakeHost) PluginID() string { return "rdm" } func (f fakeHost) Owner() string { return f.owner } diff --git a/modules/backend b/modules/backend deleted file mode 160000 index 5d5fc989..00000000 --- a/modules/backend +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5d5fc9891c0eb8994545ccb8b740535d9b99fb0e diff --git a/modules/core b/modules/core deleted file mode 160000 index 5773e740..00000000 --- a/modules/core +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5773e74086791731059730bd3726dc8c9cd1381f diff --git a/modules/documents b/modules/documents deleted file mode 160000 index 047d362c..00000000 --- a/modules/documents +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 047d362c72ec2c095ec14e1d2f2d152f94471faf diff --git a/modules/frontend b/modules/frontend deleted file mode 160000 index eb2d6d32..00000000 --- a/modules/frontend +++ /dev/null @@ -1 +0,0 @@ -Subproject commit eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b diff --git a/modules/ui b/modules/ui deleted file mode 160000 index 2c4322ef..00000000 --- a/modules/ui +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2c4322ef56df64ad72f65907d25b048a74bb5ffc diff --git a/policy/adoption.md b/policy/adoption.md index 0b594ed9..39c89bf5 100644 --- a/policy/adoption.md +++ b/policy/adoption.md @@ -2,9 +2,9 @@ - 项目/负责人:Agent-System 组合 / weichen - 状态:active(2026-09-30 经 PR weichen/Development-Guidelines#1 采纳 draft.7;机制经 Dev PR#1 合入 ef89fc8) -- 规范位置:deps/development-guidelines(gitlink 固定版本) -- 过程文档位置:modules/documents(docs/records/) -- 版本权威:父仓 gitlink +- 规范位置:.workspace/Development-Guidelines(components.lock.json 固定源码;首次启动可读仓外固定缓存) +- 过程文档位置:.workspace/Agent-System-Documents(docs/records/) +- 版本权威:components.lock.json;规则内容版本由该提交的 VERSION 标识,历史提交保留原 gitlink - 批准/生效依据:Dev PR#1(19/19 正负例 + make test);guidelines PR#1 | 规范/工作流 | 适用条件与范围 | 执行方式/证据 | @@ -14,7 +14,7 @@ | standards/collaboration.md | 并行/同步节点 | **enforced(本地)**:pre-commit 拒绝集成分支直提与坏分支名(负例:hook-main/badbranch 拒绝输出);节点同步由 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) | +| standards/multi-repo.md | 跨仓/版本依赖 | 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 | | standards/tool-adaptation.md(draft.8) | 为工具创建规则/钩子实例 | 本组合 CLI/git 级实例已登记:policy/tool-adaptation-matrix.md(A1–A7 逐行定级+正负例证据) | @@ -29,4 +29,14 @@ | delivery.md §2、design-verification.md 的轻量流程默认做法 | 按 [policy/delivery.md](delivery.md) 保留需求、方案、实施与验收的人工节点;代码 Review 与 PR 合入交由智能体,冲突解决且当前 HEAD 的 CI 通过后合入;小任务简化篇幅,阶段内可迭代 | 2026-10-12 用户明确要求智能体 Review 后合入,合入前解决冲突且 CI 通过;其他人工决策与高后果双钥匙边界保留 | weichen;Review、CI 或平台准入条件变化时复查 | - 历史记录(2026-09-30)报告 11 个组合仓 main 禁直推、拒绝陈旧候选;当前平台能力须独立重验,本地脚本测试不替代远端证据。 -- 当前规范内容以 gitlink 及其 VERSION 为准。治理可靠性修复的命令与证据约定见 [开发门禁](governance.md),本地与客户端/平台能力分别登记;本轮不改变分支保护、发布授权或通用库版本。 +- 当前规范内容以 components.lock.json 固定源码及其 VERSION 为准。治理可靠性修复的命令与证据约定见 [开发门禁](governance.md),本地与客户端/平台能力分别登记;本轮不改变分支保护、发布授权或通用库版本。 + +## 2026-10-13 版本依赖采纳增量 + +用户批准版本依赖与按需工作区方案 r1,并授权重构与自检连续推进、保护在途分支。 +固定 draft.12 内容延续已固定上游规则;本次采纳将 Go/npm 库的版本权威交给消费方, +应用、规范与资料交给源码锁。具体组件、命令、旧任务同步及回退见 [依赖规则](dependencies.md)。 + +启动取源、组件编辑/解除、固定组合与旧现场保留由本地工具和真实仓库回归验证,证据为 SELF。 +平台 runner 隔离、token scope、受信工作流来源、分支保护和精确 HEAD CI 仍须 GATE/REPLAY 核验; +本文件不宣称平台合并队列或发布能力已就位。其他项目须独立采纳,不因本轮升级自动改变规则。 diff --git a/policy/architecture.yaml b/policy/architecture.yaml index 06af4c4e..0f3f9e9d 100644 --- a/policy/architecture.yaml +++ b/policy/architecture.yaml @@ -4,10 +4,10 @@ # it queries store metadata and does not depend on either transport/composition root. # Approved membership proposal r1 adds app/server -> projectscope -> store. backend: - root: modules/backend/internal - import_prefix: agent-system-backend/internal/ + root: .workspace/Agent-System-Backend/internal + import_prefix: git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ frontend: - root: modules/frontend/src + root: .workspace/Agent-System-Frontend/src groups: - name: app dir: . diff --git a/policy/delivery.md b/policy/delivery.md index 733d798f..df993189 100644 --- a/policy/delivery.md +++ b/policy/delivery.md @@ -1,7 +1,7 @@ # 需求、试验与迭代交付 适用:本项目的需求、修复、规范修改和其他交付任务。依据固定版本的 -[通用交付流程](../deps/development-guidelines/workflows/delivery.md),本项目收紧为 +[通用交付流程](../.workspace/Development-Guidelines/workflows/delivery.md),本项目收紧为 **需求、方案、实施与验收默认逐阶段人工评审;代码 Review 与 PR 合入由智能体完成; 阶段内迭代,按影响回退,按增量交付**。 本文件是阶段与评审的权威表述;启动、同步、命令证据和回收操作见 diff --git a/policy/dependencies.md b/policy/dependencies.md new file mode 100644 index 00000000..99a45e37 --- /dev/null +++ b/policy/dependencies.md @@ -0,0 +1,52 @@ +# 版本依赖、源码编辑与分支过渡 + +适用:组件版本升级、功能仓编辑、新 clone、旧任务同步和源码候选构建。通用原则见固定 Development-Guidelines 的 multi-repo/collaboration/adoption;本文件只规定项目映射、命令和过渡入口。 + +## 版本权威 + +- `components.json`:逻辑组件、批准的仓库、职责、模块/包身份与消费路径,不存凭据。 +- `components.lock.json`:应用、规范和过程资料的完整提交;Go/npm 库不另设可竞争的源码锁。 +- Go:消费方 go.mod 的实际模块图决定版本,go.sum 校验内容。模块路径为 `git-ssh.u1680832.nyat.app/weichen/.git`,子模块追加目录;端口仅属于传输配置。 +- npm:消费方 package-lock 固定 Git 提交及包完整性信息;契约由 Core 单一 TS 源码产生,UI 与 Frontend 消费 `@agent-system/contracts`,Frontend 消费 `@agent-system/ui`。 +- 正式产物:隔离固定源码装配 frontend dist/backend embed,自动导出解析清单与摘要。RDM 使用隔离 vendor 构建注入固定前端资产,不改 Go module cache,不写本地路径 replace。 + +新模式是否存在以该提交的 `components.json`/锁为准。历史提交没有这两份文件时继续按照其旧 gitlinks 与脚本构建;不能套用最新来源改变历史候选。 + +## 从 Dev 按需编辑 + +1. 从普通 clone 开始,按项目启动门禁执行 precheck/task-start;新布局由固定清单准备应用和规范,普通库按语言依赖下载。 +2. `make component-edit NAME=Agent-Native` 取得消费方实际使用的源版本,创建所属功能仓的独立编辑分支并接入本地 go.work。 +3. 在返回的目录修改、局部验证、提交及创建功能仓 PR;Dev 不提交复制的功能仓源码。 +4. `make component-unlink NAME=Agent-Native` 解除开发覆盖,保留源码和分支;采用新版本由消费方依赖 PR 决定。 + +`make test-backend LOCAL_OVERLAY=1` 可明确使用已登记 Go 开发覆盖做局部检查,默认局部入口 GOWORK=off;结果仍为开发对象,不能代替固定组合。 + +`make workspace-status` 是只读状态;`make workspace-prepare` 准备固定来源。正式 build/test 与局部开发验证分开,不能把存在 go.work/npm 链接的工作树当发布候选。Go 正式消费 `GOWORK=off`,候选代码执行环境没有 checkout token;源码获取和执行阶段分离。 + +依赖锁变更后,owner 可用 `make workspace-prepare NAME=Agent-System-Backend REFRESH_FIXED=1` +显式刷新已登记、干净且处于原基线的 detached 检出,旧提交仍由本地保存引用保留。编辑分支、 +未保存或 ignored 唯一文件、Git 操作和共享归属均拒绝刷新;不会切换已编辑组件。 + +UI 源码编辑从 Frontend 锁中解析实际 Git 提交;其包构建是显式命令。当前工作区工具的源码编辑/版本解析与 Go 覆盖分别验证,不能仅凭 UI 仓被检出就声称 npm 开发链接已生效。 + +## 在途分支与迁移 + +本轮切换不 checkout/reset/stash/clean 其他活动工作区,不批量 rebase,不重写旧提交和 tag,不删除旧物理目录或 Git 管理数据。 + +- 未同步的旧任务继续用旧提交、旧脚本和固定 gitlinks;新功能分支从最新权威 main 起步。 +- 旧任务纳入新 main 前先核对父仓与组件状态;有当前写者、Git 锁、未提交或唯一文件时由 owner 保存并安排安全同步点。文本和 API 冲突分别处理,不把旧 pin/锁批量覆盖新组合。 +- `make workspace-transition` 默认只报告迁移计划;`NAME=<组件>` 可限定范围。确认归属后显式 `ARGS=--apply` 才在新工作区准备独立源码。原仓、refs、reflog、暂存/工作树/未跟踪和 ignored 唯一文件保留。 +- 已登记嵌套组件独立保存;相同内容的重复来源可去重,但引用仍按来源保存。未知归属、冲突的重复组件、外借对象库、逃逸 symlink 或目标已有他人现场拒绝并报告,不能称迁移成功。 +- 组件分支仍是所属仓的代码;来源/命名变化后按已合入接口进行正常合并和审阅。原分支或数据不被自动删除;不能将“已复制保存”解释为语义迁移已完成。 + +迁移后的库版本以消费方实际解析为准,主干前进时不隐式切换已编辑组件。旧组件目录的 .git common-dir 可能供外部 worktree 使用;task-finish 必须核对依赖及唯一成果,删除被拒就保留现场。 + +## 验证与回退 + +真实 Git/Go fixture 验证固定取源、编辑/解除、嵌套组件、dirty/index/ignored/ref 保留、冲突、锁和越界拒绝。新 clone 的固定产品构建、RDM 完整前端二进制、当前组合和历史组合分别重放;文档检查不能替代这些能力。 + +回退用普通 PR 恢复已批准依赖、源码锁和构建规则,并重建同一解析组合;不改历史、不推断业务数据库可以逆迁移。正式验收与合入仍按 policy/delivery.md,SELF 不提升为 GATE/REPLAY,发布与共享部署保留原授权边界。 + +## 后续项目采纳 + +通用规则只维护在 Development-Guidelines;新项目固定审阅过的规范来源并填写采纳模板,选择自己的仓库映射、读取目录、编辑命令和正式构建入口。现存项目不会因上游规则合入或新包可用而自动升级、自动移除 submodule 或自动改变审批权限。 diff --git a/policy/governance.md b/policy/governance.md index 79f4d07c..cdd9ff1b 100644 --- a/policy/governance.md +++ b/policy/governance.md @@ -1,7 +1,7 @@ # 开发门禁的执行与证据 本文件细化根 AGENTS.md 的启动、验证和回收规则。通用语义以固定的 -`deps/development-guidelines` 为准;门禁实现及回归用例随本仓版本管理。 +`components.lock.json` 固定的 Development-Guidelines 为准;门禁实现及回归用例随本仓版本管理。 需求表、设计试验、迭代调整、阶段产物、人工决策及智能体 Review/合入按 [迭代交付](delivery.md) 执行。任务卡分别记录人工批准、智能体审阅者及对象版本; 本地 evidence 仅记录 SELF 命令,不能证明人工批准或提升为 CI/独立审阅证据。 @@ -29,13 +29,15 @@ make task-start NAME=feature/my-task PRECHECK_RECEIPT=/tmp/my-task-precheck.json ## 被测对象 -`make task-sync` 在父仓合并后按固定 gitlink 物化未修改组件,并核对实际组件工作树。 -组件 feature 分支若与新指针不同,先保留其分支,交给 owner 显式同步并更新组合; -不能用自动 checkout 丢弃组件分支现场。任何失败都保留现场并阻止同步成功声明。 +`make task-sync` 在父仓合并后按该提交的模式准备来源:新布局读取固定清单, +历史布局读取原 gitlink。主干前进不会自动切换已编辑组件;来源变化、未保存修改或 Git 操作 +由 owner 先处理,任何失败保留现场并阻止同步成功声明。旧目录仍可能支撑其他 worktree, +显式过渡与保存要求见 [依赖规则](dependencies.md)。 -`make test-worktree` 核对递归子模块:未初始化、冲突、指针漂移及子仓未保存改动均拒绝。 -它是组合测试和构建的前置检查。父仓未提交改动可以局部测试,但证据必须记录实际对象状态; -正式验收使用已提交的固定对象,不能仅写一个与工作树不同的 HEAD。 +`make test-worktree` 验证当前模式中的已登记来源与实际工作树;新布局的本地编辑状态可记录, +但正式 `make test/build` 从已提交的固定源码与语言图隔离物化。evidence 同时记录忽略目录中 +已登记组件的 HEAD、分支、dirty/差异与唯一内容摘要,不能只用父仓 HEAD 代表开发组合。 +历史布局继续拒绝未初始化、冲突、指针漂移及未保存子仓改动。 ## 本地记录与独立证据 diff --git a/scripts/build-composition.py b/scripts/build-composition.py new file mode 100644 index 00000000..975d5d8f --- /dev/null +++ b/scripts/build-composition.py @@ -0,0 +1,524 @@ +#!/usr/bin/env python3 +"""Build immutable application commits without developer workspace overlays. + +Go versions remain authoritative in go.mod; npm versions in package-lock.json. +The output manifest records the selected graph rather than creating another lock. +""" +import argparse +import hashlib +import importlib.util +import io +import json +from pathlib import Path, PurePosixPath +import re +import shutil +import subprocess +import sys +import tarfile +import tempfile +from urllib.parse import urlsplit + +from workspace.common import digest + + +SHA = re.compile(r"[0-9a-f]{40}\Z") +IDS = re.compile(r"[A-Za-z0-9][A-Za-z0-9_-]*\Z") +BACKEND = "Agent-System-Backend" +FRONTEND = "Agent-System-Frontend" + + +class CompositionError(Exception): + pass + + +def run(command, cwd, env, *, binary=False, quiet=False): + if not quiet: + print("[composition] " + " ".join(map(str, command)), flush=True) + result = subprocess.run(command, cwd=cwd, env=env, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, text=not binary) + if not quiet and not binary: + sys.stdout.write(result.stdout) + sys.stderr.write(result.stderr) + if result.returncode: + detail = result.stderr.decode(errors="replace") if binary else result.stderr + raise CompositionError(f"command failed ({result.returncode}): {command[0]} {detail.strip()}") + return result.stdout + + +def tree_digest(root): + if root.is_symlink(): + raise CompositionError(f"artifact root symlink is forbidden: {root.name}") + entries = [] + for path in sorted(root.rglob("*")): + if path.is_symlink(): + raise CompositionError(f"artifact symlink is forbidden: {path.name}") + if path.is_file(): + entries.append({"path": path.relative_to(root).as_posix(), "sha256": digest(path), "size": path.stat().st_size}) + encoded = json.dumps(entries, sort_keys=True, separators=(",", ":")).encode() + return {"sha256": hashlib.sha256(encoded).hexdigest(), "files": entries} + + +def safe_relative(root, value): + if not isinstance(value, str) or not value or "\\" in value: + raise CompositionError("invalid component path") + relative = PurePosixPath(value) + if relative.is_absolute() or ".." in relative.parts or (root / value).resolve().is_relative_to(root) is False: + raise CompositionError("component path escapes root") + + +def validate_repo(repo): + if not isinstance(repo, str) or not repo or repo.startswith("-") or any(c.isspace() for c in repo): + raise CompositionError("invalid repository source") + if "://" not in repo: + if not Path(repo).is_absolute(): + raise CompositionError("repository must be an approved URL or absolute local path") + return + parsed = urlsplit(repo) + if parsed.scheme not in {"ssh", "https", "file"} or parsed.password or parsed.query or parsed.fragment: + raise CompositionError("repository URL contains credentials or unsupported transport") + if parsed.scheme == "https" and parsed.username: + raise CompositionError("repository credentials are forbidden") + if parsed.scheme == "file" and parsed.netloc not in {"", "localhost"}: + raise CompositionError("file repository must be local") + + +def inputs(root, env): + commit = run(["git", "rev-parse", "HEAD"], root, env, quiet=True).strip() + if not SHA.fullmatch(commit): + raise CompositionError("root must have a committed Git revision") + documents = {} + hashes = {} + for name in ("components.json", "components.lock.json"): + committed = run(["git", "show", f"{commit}:{name}"], root, env, binary=True, quiet=True) + path = root / name + if path.is_symlink() or path.read_bytes() != committed: + raise CompositionError(f"{name} differs from committed root {commit}") + documents[name] = json.loads(committed) + hashes[name] = hashlib.sha256(committed).hexdigest() + manifest, lock = documents["components.json"], documents["components.lock.json"] + if manifest.get("schema") != 1 or not isinstance(manifest.get("components"), list): + raise CompositionError("unsupported components schema") + if lock.get("schema") != 1 or not isinstance(lock.get("components"), dict): + raise CompositionError("unsupported component lock schema") + components = {} + for item in manifest["components"]: + name = item.get("id") + if not isinstance(name, str) or not IDS.fullmatch(name) or name in components: + raise CompositionError("invalid or duplicate component id") + if item.get("path") != f".workspace/{name}": + raise CompositionError(f"invalid component path: {name}") + safe_relative(root, item["path"]) + if item.get("legacy_path"): + safe_relative(root, item["legacy_path"]) + validate_repo(item.get("repo")) + for module in item.get("modules", []): + safe_relative(root, module.get("directory", ".")) + components[name] = item + for name, value in lock["components"].items(): + if name not in components or not isinstance(value, dict) or not SHA.fullmatch(value.get("commit", "")): + raise CompositionError(f"invalid locked component: {name}") + if components[name].get("role") in {"go-library", "npm-library"}: + raise CompositionError(f"language library cannot have a competing source lock: {name}") + for name in (BACKEND, FRONTEND): + if name not in components or components[name].get("role") != "application" or name not in lock["components"]: + raise CompositionError(f"missing fixed application source: {name}") + return commit, components, lock["components"], hashes + + +def execution_environment(env): + """Acquisition-only authentication/transport never reaches npm/Go candidate code.""" + clean = env.copy() + for key in list(clean): + upper = key.upper() + if (any(word in upper for word in ("TOKEN", "SECRET", "PASSWORD", "CREDENTIAL", "API_KEY", "ACCESS_KEY")) + or upper.startswith(("GIT_CONFIG_", "GIT_SSH", "NPM_CONFIG_", "BASH_FUNC_")) + or upper in {"SSH_AUTH_SOCK", "SSH_AGENT_PID", "NODE_OPTIONS", "BASH_ENV", "ENV", "GOFLAGS", "GIT_ASKPASS", "SSH_ASKPASS", "CONTRACTS_TARBALL", "UI_TARBALL"}): + del clean[key] + clean.update(GOWORK="off", GOTOOLCHAIN="local", GOFLAGS="", CGO_ENABLED="0") + return clean + + +def export_source(repo, commit, destination, temporary, env, *, abbreviated=False): + validate_repo(repo) + clone = temporary / (destination.name + "-git") + run(["git", "clone", "--no-checkout", "--no-hardlinks", "--", repo, str(clone)], temporary, env) + exists = subprocess.run(["git", "cat-file", "-e", commit + "^{commit}"], cwd=clone, env=env, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL).returncode == 0 + if not exists: + run(["git", "fetch", "--no-tags", "origin", commit], clone, env) + actual = run(["git", "rev-parse", commit + "^{commit}"], clone, env, quiet=True).strip() + if not SHA.fullmatch(actual) or (actual != commit and not (abbreviated and len(commit) == 12 and actual.startswith(commit))): + raise CompositionError("application revision is not an immutable full commit") + archive = run(["git", "archive", "--format=tar", actual], clone, env, binary=True, quiet=True) + extract_archive(archive, destination) + return {"repo": repo, "commit": actual, "archive_sha256": hashlib.sha256(archive).hexdigest()} + + +def extract_archive(archive, destination): + destination.mkdir() + with tarfile.open(fileobj=io.BytesIO(archive)) as tar: + for entry in tar.getmembers(): + safe_relative(destination, entry.name) + if not (entry.isfile() or entry.isdir()): + raise CompositionError(f"source archive contains an unsupported link: {entry.name}") + tar.extractall(destination, filter="data") + + +def version(manifest, lock, *, backend_commit=None, resolved_go=None): + resolved = json.dumps({"go": manifest["go"] if resolved_go is None else resolved_go, + "npm_lock": manifest["npm"]["lock_sha256"]}, + sort_keys=True, separators=(",", ":")).encode() + return (manifest["root"]["commit"][:12] + "+backend=" + (backend_commit or lock[BACKEND]["commit"])[:12] + + "+frontend=" + lock[FRONTEND]["commit"][:12] + + "+deps=" + hashlib.sha256(resolved).hexdigest()[:12]) + + +def json_stream(output): + decoder = json.JSONDecoder() + result = [] + while output.strip(): + value, end = decoder.raw_decode(output.lstrip()) + result.append(value) + output = output.lstrip()[end:] + return result + + +def go_dependencies(source, fetch_env): + document = json.loads(run(["go", "mod", "edit", "-json"], source, fetch_env, quiet=True)) + for replacement in document.get("Replace") or []: + if not replacement["New"].get("Version"): + raise CompositionError("formal Go build forbids local directory replace") + original = {name: (source / name).read_bytes() if (source / name).exists() else None for name in ("go.mod", "go.sum")} + # Tidy locks need sums for consumed packages, not unused transitive zip files. + # Load actual build/test metadata before ending acquisition; no tests execute. + # Download may normalize sum lines even for a valid readonly consumer. Keep + # that package-manager bookkeeping in an identical disposable manifest. + with tempfile.TemporaryDirectory(prefix="composition-go-prefetch-") as directory: + isolated = Path(directory) + for name, content in original.items(): + if content is not None: + (isolated / name).write_bytes(content) + downloads = json_stream(run(["go", "mod", "download", "-json"], isolated, fetch_env, quiet=True)) + run(["go", "list", "-mod=readonly", "-deps", "-test", "./..."], source, + fetch_env | {"CGO_ENABLED": "0"}, quiet=True) + run(["go", "mod", "verify"], source, fetch_env) + modules = json_stream(run(["go", "list", "-mod=readonly", "-m", "-json", "all"], source, fetch_env, quiet=True)) + selected = [] + for module in modules: + item = {key: module[key] for key in ("Path", "Version", "Main", "Sum", "GoModSum", "GoVersion") if key in module} + if "Replace" in module: + replacement = module["Replace"] + if not replacement.get("Version"): + raise CompositionError("resolved Go graph contains a local replace") + item["Replace"] = {key: replacement[key] for key in ("Path", "Version", "Sum", "GoModSum") if key in replacement} + selected.append(item) + for name, content in original.items(): + actual = (source / name).read_bytes() if (source / name).exists() else None + if actual != content: + raise CompositionError(f"Go acquisition changed committed {name}; update the consumer first") + return {"modules": selected, "go_mod_sha256": digest(source / "go.mod"), + "go_sum_sha256": digest(source / "go.sum") if (source / "go.sum").exists() else None, + "downloads": [{key: value[key] for key in ("Path", "Version", "Sum", "GoModSum", "Origin") if key in value} for value in downloads]} + + +def npm_dependencies(source, components, fetch_env): + path = source / "package-lock.json" + lock = json.loads(path.read_text()) + if lock.get("lockfileVersion", 0) < 2 or not isinstance(lock.get("packages"), dict): + raise CompositionError("frontend requires a complete npm lock") + approved = {component["repo"] for component in components.values()} + packages = {} + for name, package in lock["packages"].items(): + if package.get("link"): + raise CompositionError("formal npm build forbids workspace links") + for value in [package.get("resolved", ""), *package.get("dependencies", {}).values()]: + if not isinstance(value, str): + raise CompositionError("invalid npm lock dependency") + if value.startswith(("file:", "link:", "workspace:")): + raise CompositionError("formal npm build forbids local dependency overlays") + if value.startswith(("git+", "git:", "ssh:")): + repo, sep, revision = value.removeprefix("git+").rpartition("#") + if not sep or not SHA.fullmatch(revision) or repo not in approved: + raise CompositionError("npm Git dependency must use an approved source and full commit") + packages[name] = {key: package[key] for key in ("version", "resolved", "integrity") if key in package} + before = digest(path) + run(["npm", "ci", "--ignore-scripts", "--no-audit", "--no-fund"], source, fetch_env) + if digest(path) != before: + raise CompositionError("npm acquisition changed committed lock") + result = {"lock_sha256": before, "packages": packages} + contract = source / "node_modules/@agent-system/contracts" + if contract.is_dir(): + result["contracts"] = tree_digest(contract) + return result + + +def frontend_assets(source, clean_env): + dist = source / "dist" + if dist.exists(): + shutil.rmtree(dist) + run(["npm", "run", "build"], source, clean_env) + if not (dist / "index.html").is_file() or not (dist / "index.html").stat().st_size: + raise CompositionError("frontend dist requires nonempty index.html") + if not (dist / "assets").is_dir() or not any(p.is_file() and p.stat().st_size for p in (dist / "assets").rglob("*")): + raise CompositionError("frontend dist requires nonempty assets/") + return dist, tree_digest(dist) + + +def inject(dist, destination): + if destination.is_symlink(): + raise CompositionError("embed destination must not be a symlink") + if destination.exists(): + shutil.rmtree(destination) + shutil.copytree(dist, destination) + (destination / ".gitkeep").touch() + + +def provider_revision(module, downloads): + metadata = next((entry for entry in downloads if entry["Path"] == module["Path"] and entry["Version"] == module["Version"]), {}) + origin = metadata.get("Origin", {}) + commit = origin.get("Hash", "") + pseudo = re.search(r"-([0-9a-f]{12})\Z", module["Version"]) + if SHA.fullmatch(commit): + if pseudo and not commit.startswith(pseudo.group(1)): + raise CompositionError(f"Go Origin.Hash differs from selected version: {module['Path']}") + return commit, False + if pseudo: + return pseudo.group(1), True + raise CompositionError(f"cannot prove source commit for selected Go module: {module['Path']}@{module['Version']}") + + +def provider_tests(root, root_commit, components, sources, manifest, temporary, + fetch_env, clean_env, rdm=None, source_map_path=None): + """Preserve the full test gates while taking provider identities from consumers.""" + graph = manifest["go"]["backend"] + source_records = {name: {"path": str(path), "commit": manifest["applications"][name]["commit"], "repo": components[name]["repo"]} + for name, path in sources.items()} + module_sources = {} + manifest["test_sources"] = {} + manifest["checks"] = [] + for name, component in components.items(): + if component.get("role") != "go-library": + continue + selected = [(mapping, next((m for m in graph["modules"] if m["Path"] == mapping["path"]), None)) + for mapping in component.get("modules", [])] + selected = [(mapping, module) for mapping, module in selected if module is not None] + if not selected: + continue + primary = next((pair for pair in selected if pair[0].get("directory", ".") == "."), selected[0]) + revision, abbreviated = provider_revision(primary[1], graph["downloads"]) + source = temporary / name + record = export_source(component["repo"], revision, source, temporary, fetch_env, abbreviated=abbreviated) + manifest["test_sources"][name] = record + source_records[name] = {"path": str(source), "commit": record["commit"], "repo": component["repo"]} + sources[name] = source + for mapping in component.get("modules", []): + module = next((m for m in graph["modules"] if m["Path"] == mapping["path"]), None) + module_root = source + module_commit = record["commit"] + if module: + module_revision, module_abbreviated = provider_revision(module, graph["downloads"]) + if not module_commit.startswith(module_revision): + module_root = temporary / (name + "-" + mapping["directory"].replace("/", "-")) + alternate = export_source(component["repo"], module_revision, module_root, temporary, fetch_env, abbreviated=module_abbreviated) + module_commit = alternate["commit"] + manifest["test_sources"][mapping["path"]] = alternate + location = module_root / mapping.get("directory", ".") + if not (location / "go.mod").is_file(): + raise CompositionError(f"declared provider module is missing: {mapping['path']}") + module_sources[mapping["path"]] = {"path": str(location), "commit": module_commit, "repo": component["repo"]} + manifest["go"][mapping["path"]] = go_dependencies(location, fetch_env) + for action in ("test", "vet"): + command = ["go", action, "-mod=readonly", "./..."] + run(command, location, clean_env) + manifest["checks"].append({"component": name, "module": mapping["path"], "command": command, "result": "PASS"}) + # UI is a package provider; its source identity belongs to the npm lock. + ui_component = components.get("Agent-System-UI") + if ui_component: + package_name = ui_component.get("package_name", "@agent-system/ui") + resolved = manifest["npm"]["packages"].get("node_modules/" + package_name, {}).get("resolved", "") + repo, _, commit = resolved.removeprefix("git+").rpartition("#") + if repo != ui_component["repo"] or not SHA.fullmatch(commit): + raise CompositionError("cannot prove UI source from the Frontend npm lock") + ui = temporary / "Agent-System-UI" + record = export_source(repo, commit, ui, temporary, fetch_env) + sources["Agent-System-UI"] = ui + manifest["test_sources"]["Agent-System-UI"] = record + source_records["Agent-System-UI"] = {"path": str(ui), "commit": commit, "repo": repo} + for name, source in sources.items(): + if name == FRONTEND or not (source / "package.json").is_file(): + continue + manifest.setdefault("provider_npm", {})[name] = npm_dependencies(source, components, fetch_env) + scripts = json.loads((source / "package.json").read_text()).get("scripts", {}) + for action in ("typecheck", "test"): + if action in scripts: + command = ["npm", "run", action] + run(command, source, clean_env) + manifest["checks"].append({"component": name, "command": command, "result": "PASS"}) + run(["go", "vet", "-mod=readonly", "./..."], sources[BACKEND], clean_env) + manifest["checks"].extend([ + {"component": FRONTEND, "command": ["npm", "test"], "result": "PASS"}, + {"component": BACKEND, "command": ["go", "test", "-mod=readonly", "./..."], "result": "PASS"}, + {"component": BACKEND, "command": ["go", "vet", "-mod=readonly", "./..."], "result": "PASS"}, + ]) + if rdm: + source_records["Agent-System-RDM"] = {"path": str(rdm), **{key: manifest["applications"]["Agent-System-RDM"][key] for key in ("commit", "repo")}} + run(["go", "vet", "-mod=vendor", "./..."], rdm, clean_env) + manifest["checks"].extend({"component": "Agent-System-RDM", "command": ["go", action, "-mod=vendor", "./..."], "result": "PASS"} for action in ("test", "vet")) + formal_root = temporary / "Dev-test-root" + archive = run(["git", "archive", "--format=tar", root_commit], root, fetch_env, binary=True, quiet=True) + extract_archive(archive, formal_root) + source_map = {"schema": 1, "root_commit": root_commit, "components": source_records, "modules": module_sources} + map_file = source_map_path or temporary / "composition-sources.json" + map_file.parent.mkdir(parents=True, exist_ok=True) + map_file.write_text(json.dumps(source_map, indent=2) + "\n") + gate_env = clean_env | {"COMPOSITION_SOURCE_MAP": str(map_file)} + if rdm: + gate_env["COMPOSITION_RDM_SOURCE"] = str(rdm) + gates = ((["bash", "scripts/lint-boundaries.sh"], "scripts/lint-boundaries.sh"), + (["bash", "scripts/check-pins.sh"], "scripts/check-pins.sh"), + (["make", "test-governance"], "Makefile")) + project_gates = any((formal_root / required_path).is_file() for _, required_path in gates) + for command, required_path in gates: + if project_gates and not (formal_root / required_path).is_file(): + raise CompositionError(f"fixed root is missing required test gate: {required_path}") + if (formal_root / required_path).is_file(): + run(command, formal_root, gate_env) + manifest["checks"].append({"component": "Agent-System-Dev", "commit": root_commit, "command": command, "result": "PASS"}) + + +def compose(root, target, output, rdm_source=None, source_map_path=None): + transport_path = Path(__file__).resolve().parent / "workspace/transport.py" + spec = importlib.util.spec_from_file_location("composition_transport", transport_path) + transport = importlib.util.module_from_spec(spec) + spec.loader.exec_module(transport) + fetch_env = transport.environment(root) + fetch_env.update(GOWORK="off", GOFLAGS="", GOTOOLCHAIN="local") + root_commit, components, lock, input_hashes = inputs(root, fetch_env) + clean_env = execution_environment(fetch_env) + manifest = {"schema": 1, "kind": "agent-system-composition/1", "target": target, + "root": {"commit": root_commit, "inputs": input_hashes}, "applications": {}, "go": {}, "artifacts": {}, "assets": {}} + with tempfile.TemporaryDirectory(prefix="agent-system-composition-") as directory: + temporary = Path(directory) + sources = {} + for name in (FRONTEND, BACKEND): + if target == "frontend" and name == BACKEND: + continue + source = temporary / name + manifest["applications"][name] = export_source(components[name]["repo"], lock[name]["commit"], source, temporary, fetch_env) + sources[name] = source + frontend = sources[FRONTEND] + manifest["npm"] = npm_dependencies(frontend, components, fetch_env) + dist, manifest["frontend"] = frontend_assets(frontend, clean_env) + manifest["toolchains"] = {"go": run(["go", "version"], temporary, clean_env, quiet=True).strip(), + "node": run(["node", "--version"], temporary, clean_env, quiet=True).strip(), + "npm": run(["npm", "--version"], temporary, clean_env, quiet=True).strip()} + products = temporary / "products" + products.mkdir() + rdm = None + manifest["version"] = version(manifest, lock) + if target != "frontend": + backend = sources[BACKEND] + manifest["go"]["backend"] = go_dependencies(backend, fetch_env) + manifest["version"] = version(manifest, lock) + inject(dist, backend / "web/dist") + manifest["go"]["backend"]["embed_sha256"] = tree_digest(backend / "web/dist")["sha256"] + if target == "test": + run(["npm", "test"], frontend, clean_env) + run(["go", "test", "-mod=readonly", "./..."], backend, clean_env) + else: + for name, package in (("agent-system", "./cmd/agent-system"), ("storage-migrate", "./cmd/storage-migrate")): + flags = "-s -w" + (" -X main.version=" + manifest["version"] if name == "agent-system" else "") + run(["go", "build", "-mod=readonly", "-trimpath", "-buildvcs=false", "-ldflags=" + flags, "-o", str(products / name), package], backend, clean_env) + if rdm_source: + rdm_commit = run(["git", "rev-parse", "HEAD"], rdm_source, fetch_env, quiet=True).strip() + rdm = temporary / "Agent-System-RDM" + manifest["applications"]["Agent-System-RDM"] = export_source(str(rdm_source), rdm_commit, rdm, temporary, fetch_env) + graph = go_dependencies(rdm, fetch_env) + manifest["go"]["rdm"] = graph + backend_module = next((m["path"] for m in components[BACKEND]["modules"] if m.get("directory", ".") == "."), None) + selected = next((m for m in graph["modules"] if m["Path"] == backend_module), None) + if not selected: + raise CompositionError("RDM must consume the fixed Backend as an ordinary versioned Go module") + effective = selected.get("Replace", selected) + if effective.get("Path") != backend_module or not effective.get("Version"): + raise CompositionError("RDM Backend must resolve to the approved versioned module") + # RDM's module graph is its dependency authority. The Dev app + # source lock fixes a separate application and may differ. + revision, abbreviated = provider_revision(effective, graph["downloads"]) + admin_source = temporary / "RDM-Backend" + backend_record = export_source(components[BACKEND]["repo"], revision, admin_source, + temporary, fetch_env, abbreviated=abbreviated) + graph["backend_source"] = {**backend_record, "module": backend_module, "version": effective["Version"]} + manifest["go"]["rdm_admin"] = go_dependencies(admin_source, fetch_env) + inject(dist, admin_source / "web/dist") + manifest["go"]["rdm_admin"]["embed_sha256"] = tree_digest(admin_source / "web/dist")["sha256"] + graph["admin_version"] = version(manifest, lock, backend_commit=backend_record["commit"], + resolved_go={"rdm": graph["modules"], "admin": manifest["go"]["rdm_admin"]}) + run(["go", "mod", "vendor"], rdm, fetch_env) + vendored_backend = rdm / "vendor" / backend_module + if not (vendored_backend / "web/embed.go").is_file(): + raise CompositionError("RDM vendored Backend does not contain the embed package") + graph["vendor_modules_sha256"] = digest(rdm / "vendor/modules.txt") + graph["vendor_backend_source_sha256"] = tree_digest(vendored_backend)["sha256"] + inject(dist, vendored_backend / "web/dist") + graph["vendor_backend_dist_sha256"] = tree_digest(vendored_backend / "web/dist")["sha256"] + if target == "test": + run(["go", "test", "-mod=vendor", "./..."], rdm, clean_env) + run(["go", "test", "-mod=readonly", "./..."], admin_source, clean_env) + run(["go", "vet", "-mod=readonly", "./..."], admin_source, clean_env) + else: + run(["go", "build", "-mod=vendor", "-trimpath", "-buildvcs=false", "-ldflags=-s -w", "-o", str(products / "agent-system-rdm-product"), "."], rdm, clean_env) + run(["go", "build", "-mod=readonly", "-trimpath", "-buildvcs=false", + "-ldflags=-s -w -X main.version=" + graph["admin_version"], + "-o", str(products / "agent-system-admin"), "./cmd/agent-system"], admin_source, clean_env) + if target == "test": + provider_tests(root, root_commit, components, sources, manifest, temporary, + fetch_env, clean_env, rdm, source_map_path) + if target == "build" and run(["git", "ls-tree", root_commit, "--", "plugins"], root, fetch_env, quiet=True).strip(): + archive = run(["git", "archive", "--format=tar", root_commit, "plugins"], root, fetch_env, binary=True, quiet=True) + root_assets = temporary / "root-assets" + extract_archive(archive, root_assets) + manifest["assets"]["plugins"] = tree_digest(root_assets / "plugins") + manifest["assets"]["plugins"]["root_commit"] = root_commit + for artifact in products.iterdir(): + manifest["artifacts"][artifact.name] = {"sha256": digest(artifact), "size": artifact.stat().st_size} + # Publish only after all required build/test commands succeeded. + output.mkdir(parents=True, exist_ok=True) + for artifact in products.iterdir(): + shutil.copy2(artifact, output / artifact.name) + if "plugins" in manifest["assets"]: + destination = output / "plugins" + if destination.exists(): + shutil.rmtree(destination) + shutil.copytree(root_assets / "plugins", destination) + if target == "frontend": + destination = output / "frontend-dist" + if destination.exists(): + shutil.rmtree(destination) + shutil.copytree(dist, destination) + pending = output / ".resolved-manifest.json.tmp" + pending.write_text(json.dumps(manifest, indent=2, sort_keys=True) + "\n") + pending.replace(output / "resolved-manifest.json") + print(f"[composition] complete: {target}; manifest={output / 'resolved-manifest.json'}", flush=True) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--root", type=Path, default=Path(__file__).resolve().parents[1]) + parser.add_argument("--target", required=True, choices=("frontend", "build", "test")) + parser.add_argument("--output", type=Path) + parser.add_argument("--rdm-source", type=Path) + parser.add_argument("--source-map", type=Path, help="Write source identity map used by test gates; paths exist only during this run") + args = parser.parse_args() + root = args.root.resolve() + try: + compose(root, args.target, (args.output or root / "bin").resolve(), args.rdm_source.resolve() if args.rdm_source else None, + args.source_map.resolve() if args.source_map else None) + except (CompositionError, OSError, ValueError, KeyError, TypeError) as error: + print(f"composition: {error}", file=sys.stderr) + return 2 + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/check-pins.sh b/scripts/check-pins.sh index 219a017e..e176dbba 100755 --- a/scripts/check-pins.sh +++ b/scripts/check-pins.sh @@ -5,6 +5,54 @@ set -euo pipefail root=$(cd "$(dirname "$0")/.." && pwd) cd "$root" +# New layouts have one version authority per dependency kind. Inspect the formal +# source map when supplied, otherwise verify prepared fixed application sources. +if [ -f components.json ]; then + python3 - "$root" <<'PYCODE' +import importlib.util, json, os, pathlib, subprocess, sys +root = pathlib.Path(sys.argv[1]) +sys.path.insert(0, str(root / "scripts")) +spec = importlib.util.spec_from_file_location("component_source", root / "scripts/component-source.py") +resolver = importlib.util.module_from_spec(spec); spec.loader.exec_module(resolver) +try: + document = json.loads((root / "components.json").read_text()) + components = {entry["id"]: entry for entry in document["components"]} + marker = os.environ.get("COMPOSITION_SOURCE_MAP") + if marker: + names = [name for name in json.loads(pathlib.Path(marker).read_text())["components"] if name in components] + else: + names = [name for name, entry in components.items() if entry["role"] == "application"] + for name in names: + component = components[name] + path = resolver.source_path(root, name) + if component["role"] == "application" and (path / ".gitmodules").exists(): + raise ValueError("legacy gitlink declaration remains in fixed source: " + name) + for module in component.get("modules", []): + directory = path / module.get("directory", ".") + if not (directory / "go.mod").is_file(): + raise ValueError("declared module source is missing: " + name) + env = os.environ | {"GOWORK": "off", "GOTOOLCHAIN": "local"} + result = subprocess.run(["go", "mod", "edit", "-json"], cwd=directory, env=env, capture_output=True, text=True) + if result.returncode: raise ValueError("Go module cannot be parsed: " + name) + parsed = json.loads(result.stdout) + if parsed["Module"]["Path"] != module["path"]: + raise ValueError("module identity differs from approved mapping: " + name) + if any(not replacement["New"].get("Version") for replacement in parsed.get("Replace") or []): + raise ValueError("local replace in fixed source: " + name) + npm_lock = path / "package-lock.json" + if npm_lock.exists(): + for entry in json.loads(npm_lock.read_text()).get("packages", {}).values(): + if entry.get("link") or str(entry.get("resolved", "")).startswith(("file:", "link:")): + raise ValueError("local npm overlay in fixed source: " + name) + print("ok fixed source " + name) + if not names: raise ValueError("fixed application sources are missing") +except (ValueError, KeyError, TypeError, OSError) as error: + print("pin: " + str(error), file=sys.stderr); sys.exit(1) +print("version authorities ok (source lock / go.mod / npm lock; no gitlink alignment)") +PYCODE + exit $? +fi + fail=0 pin_of() { diff --git a/scripts/check-worktree.py b/scripts/check-worktree.py index e0c8ff8b..d8517842 100644 --- a/scripts/check-worktree.py +++ b/scripts/check-worktree.py @@ -1,15 +1,26 @@ #!/usr/bin/env python3 """Fail closed before task synchronization, verification, or worktree disposal.""" import os -import json +import hashlib from pathlib import Path import subprocess import sys +from workspace.common import WorkspaceError + def git(repo, *args): - result = subprocess.run(["git", "-C", str(repo), *args], stdout=subprocess.PIPE, - stderr=subprocess.PIPE) + command = ["git", "-C", str(repo)] + # Retired absorbed metadata may outlive its configured work tree. Inspect + # its refs/registrations without chdir to that absent checkout. + if (repo / "HEAD").is_file() and (repo / "config").is_file() and not (repo / ".git").exists(): + command += ["--git-dir=" + str(repo), "--work-tree=" + str(repo)] + environment = os.environ.copy() + environment["GIT_OPTIONAL_LOCKS"] = "0" + for variable in ("GIT_DIR", "GIT_WORK_TREE", "GIT_INDEX_FILE", "GIT_COMMON_DIR"): + environment.pop(variable, None) + result = subprocess.run([*command, *args], stdout=subprocess.PIPE, + stderr=subprocess.PIPE, env=environment) if result.returncode: raise RuntimeError(f"Git check failed in {repo}: {' '.join(args)}") return result.stdout @@ -104,32 +115,141 @@ def materialize(repo): materialize(child) -def ordinary_components(repo, mode, removal_roots=()): - manifest = repo / 'components.json' - if not manifest.exists(): +def component_manifest(repo): + from workspace.manifest import Manifest + return Manifest(repo) if (repo / "components.json").exists() else None + + +def prepare_rules(repo): + """Resolve startup reading before task writes, using an external fixed cache.""" + from workspace.cli import process_environment + from workspace.git import Git + manifest = component_manifest(repo) + if manifest is None: return - document = json.loads(manifest.read_text()) - if document.get('schema') != 1 or not isinstance(document.get('components'), list): - raise RuntimeError('invalid component manifest') - for item in document['components']: - name = item.get('id') - relative = item.get('path') - if not isinstance(name, str) or relative != '.workspace/' + name: - raise RuntimeError('invalid component identity/path') - child = repo / relative - if child.resolve() != child.absolute() or repo not in child.resolve().parents: - raise RuntimeError('component path escapes its owner') - if not child.exists(): + rules = [entry for entry in manifest.select() if entry["role"] == "guidelines"] + if len(rules) != 1 or rules[0]["id"] not in manifest.lock: + raise RuntimeError("exactly one fixed guidelines source is required before READY") + component = rules[0] + commit = manifest.lock[component["id"]]["commit"] + cache = Path(os.environ.get("XDG_CACHE_HOME", Path.home() / ".cache")) / "agent-system" / "rules" + if not cache.is_absolute() or cache.resolve().is_relative_to(repo): + raise RuntimeError("rules cache must be an absolute external directory") + for parent in (cache, *cache.parents): + if parent.is_symlink(): + raise RuntimeError("rules cache must not traverse symbolic links") + cache.mkdir(parents=True, exist_ok=True) + identity = hashlib.sha256((component["repo"] + "\n" + commit).encode()).hexdigest() + source = cache / identity + lock = cache / (identity + ".lock") + try: + descriptor = os.open(lock, os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o600) + except FileExistsError as error: + raise RuntimeError("fixed rules cache has an active owner; retry without removing its lock") from error + os.close(descriptor) + try: + helper = Git(process_environment(repo)) + if source.exists(): + actual = helper.safe(source, component["repo"]) + if actual["head"] != commit or actual["branch"]: + raise RuntimeError("fixed rules cache differs from its declared source; preserve it for its owner") + else: + helper.call(cache, "clone", "--no-checkout", "--", component["repo"], str(source)) + helper.call(source, "fetch", "--no-tags", "origin", commit) + helper.call(source, "checkout", "--detach", commit) + helper.safe(source, component["repo"]) + for required in ("core/baseline.md", "workflows/delivery.md"): + path = source / required + if not path.is_file() or path.is_symlink() or not path.resolve().is_relative_to(source): + raise RuntimeError(f"fixed rules source is missing required reading: {required}") + print(f"[rules] path={source} commit={commit}; required-reading root verified") + finally: + lock.unlink() + + +def prepare_sources(repo): + result = subprocess.run([sys.executable, str(repo / "scripts/workspace.py"), "--root", str(repo), "prepare"], + stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + if result.returncode: + raise RuntimeError(result.stderr.strip() or "fixed source preparation failed; owner must reconcile") + print("[workspace] fixed application, documentation and guidelines sources prepared; edit branches preserved") + + +def inspect_source(child, mode, removal_roots): + if child.is_symlink() or (child / ".git").is_symlink(): + raise RuntimeError(f"component Git identity is a symbolic link: {child}") + if not (child / ".git").exists() or Path(text(child, "rev-parse", "--show-toplevel")).resolve() != child: + raise RuntimeError(f"component has borrowed or missing Git identity: {child}") + check_operations(child) + if mode == "finish": + check_component_worktrees(child, removal_roots) + check_clean(child, ignored=True) + if local_work_outside(child, text(child, "rev-parse", "HEAD")): + raise RuntimeError(f"component has unpreserved local refs: {child}; preserve its source before removal") + + +def inspect_source_tree(root, mode, removal_roots, seen): + for current, directories, files in os.walk(root, followlinks=False): + child = Path(current) + directories[:] = [name for name in directories if name != ".git"] + if ".git" in files or (child / ".git").exists(): + if child not in seen: + seen.add(child) + inspect_source(child, mode, removal_roots) + + +def legacy_components(repo, manifest, mode, removal_roots): + """Keep retired physical roots and nested repositories visible after gitlink removal.""" + from workspace.common import safe_path + seen = set() + for component in manifest.select(): + relative = component.get("legacy_path") + if not relative: continue - if not (child / '.git').exists() or Path(text(child, 'rev-parse', '--show-toplevel')).resolve() != child: - raise RuntimeError('component has borrowed or missing Git identity') - check_operations(child) - if mode == 'finish': - check_clean(child, ignored=True) - check_component_worktrees(child, removal_roots) - head = text(child, 'rev-parse', 'HEAD') - if local_work_outside(child, head): - raise RuntimeError('component has unpreserved local refs; preserve its source before removal') + root = safe_path(repo, relative) + if not root.exists(): + continue + if mode == "materialize": + print(f"[transition] retained legacy source {relative}; inspect make workspace-transition NAME={component['id']} before explicit ARGS=--apply") + inspect_source_tree(root, mode, removal_roots, seen) + + +def check_retained_metadata(repo, removal_roots): + """An absent legacy checkout can still own external worktrees via absorbed metadata.""" + modules = Path(text(repo, "rev-parse", "--absolute-git-dir")) / "modules" + if not modules.exists(): + return + for current, directories, files in os.walk(modules, followlinks=False): + directories[:] = [name for name in directories if name not in + {"objects", "refs", "logs", "hooks", "worktrees", "lfs", "info"}] + metadata = Path(current) + if "HEAD" not in files or "config" not in files: + continue + for record in worktrees(metadata): + other = Path(os.fsdecode(record[0][9:])).resolve() + if not any(other == root or root in other.parents for root in removal_roots): + raise RuntimeError(f"registered component worktree {other} depends on retained metadata in {metadata}; preserve it before removal") + check_operations(metadata) + if local_work_outside(metadata, text(metadata, "rev-parse", "HEAD")): + raise RuntimeError(f"retained component metadata has unpreserved local refs: {metadata}") + + +def ordinary_components(repo, mode, removal_roots=()): + manifest = component_manifest(repo) + if manifest is None: + return + from workspace.common import safe_path + operation = safe_path(repo, ".workspace/.operation.lock") + if operation.exists(): + raise RuntimeError("active workspace operation lock; preserve it for its owner") + seen = set() + for item in manifest.select(): + child = safe_path(repo, item["path"]) + if child.exists(): + inspect_source(child, mode, removal_roots) + seen.add(child) + inspect_source_tree(child, mode, removal_roots, seen) + legacy_components(repo, manifest, mode, removal_roots) def local_work_outside(child, expected): @@ -139,6 +259,10 @@ def local_work_outside(child, expected): 不在任何远端跟踪引用历史内的提交才算。克隆默认分支停在 origin/main 顶端、 reflog 里的检出轨迹等「远端有副本」的状态一律不算;stash 恒为本地独有。""" candidates = git(child, "rev-list", "--branches", "--not", expected).split() + for row in git(child, "for-each-ref", "--format=%(objectname) %(refname)").splitlines(): + tip, ref = row.split(b" ", 1) + if not ref.startswith(b"refs/remotes/"): + candidates.append(tip) for line in git(child, "reflog", "show", "HEAD", "--format=%H").splitlines(): tip = line.strip() if tip: @@ -180,27 +304,37 @@ def check_finish_root(repo): def main(): mode = sys.argv[1] if len(sys.argv) > 1 else "verify" - if mode not in ("verify", "before-sync", "before-update", "materialize", "after-sync", "finish"): - raise RuntimeError("usage: check-worktree.py [verify|before-sync|before-update|materialize|after-sync|finish]") + if mode not in ("rules", "verify", "before-sync", "before-update", "materialize", "after-sync", "finish"): + raise RuntimeError("usage: check-worktree.py [rules|verify|before-sync|before-update|materialize|after-sync|finish]") repo = Path(text(Path.cwd(), "rev-parse", "--show-toplevel")).resolve() + if mode == "rules": + prepare_rules(repo) + return check_operations(repo) removal_roots = () if mode == "finish": check_finish_root(repo) removal_roots = (repo, Path(text(repo, "rev-parse", "--absolute-git-dir")).resolve()) - if mode in ("before-sync", "after-sync", "finish"): - check_clean(repo, ignored=(mode == "finish")) + if mode in ("before-sync", "after-sync"): + check_clean(repo) + manifest = component_manifest(repo) if mode == "materialize": - materialize(repo) - else: + if manifest is None: + materialize(repo) + else: + prepare_sources(repo) + elif manifest is None: check_children(repo, mode, removal_roots) ordinary_components(repo, mode, removal_roots) + if mode == "finish": + check_retained_metadata(repo, removal_roots) + check_clean(repo, ignored=True) print(f"[worktree] {mode}: recursive component checks passed") if __name__ == "__main__": try: main() - except RuntimeError as exc: + except (RuntimeError, WorkspaceError, ValueError, OSError) as exc: print(f"ERROR: {exc}", file=sys.stderr) sys.exit(1) diff --git a/scripts/component-check.py b/scripts/component-check.py new file mode 100644 index 00000000..b9737fa4 --- /dev/null +++ b/scripts/component-check.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 +"""Prepare selected fixed sources and run explicitly local component checks.""" +import argparse +import os +from pathlib import Path +import subprocess +import sys + +from workspace.cli import Workspace, process_environment +from workspace.common import WorkspaceError +from workspace.state import State + +SINGLE = {"test-backend": "Agent-System-Backend", "test-backend-pg": "Agent-System-Backend", + "test-core": "Agent-System-Core", "test-agentcmd": "Agent-Command", + "test-frontend": "Agent-System-Frontend", "test-ui": "Agent-System-UI", + "test-multi-instance": "Agent-System-Backend", "eval-deliverables": "Agent-System-Backend", + "dev-backend": "Agent-System-Backend", "dev-frontend": "Agent-System-Frontend"} + + +def run(command, cwd, env): + print("[component-check] " + " ".join(map(str, command)), flush=True) + result = subprocess.run(command, cwd=cwd, env=env) + if result.returncode: + raise WorkspaceError(f"local component command failed ({result.returncode})") + + +def prepare_local_source(workspace, component): + """Repeated local npm checks may reuse only recognized generated directories.""" + record = workspace.state.data["components"].get(component["id"]) + path = workspace.root / component["path"] + if record and record.get("mode") == "versioned" and (path / "package.json").is_file(): + actual = workspace.git.safe(path, component["repo"], clean=False) + commit, source = workspace.baseline(component) + generated = ("node_modules/", "dist/") + if actual["head"] != commit or actual["branch"] or actual["changes"] or any(not name.startswith(generated) for name in actual["ignored"]): + raise WorkspaceError(f"local source or ignored unique files require owner coordination: {component['id']}") + record.update(baseline=commit, source=source) + workspace.state.save() + return + workspace.prepare_one(component) + + +def check(root, target, overlay): + root = root.resolve() + if target in ("test-backend-pg", "test-multi-instance") and not os.environ.get("AGENT_PG_TEST_DSN"): + raise WorkspaceError("AGENT_PG_TEST_DSN required; real PostgreSQL gate is not skipped") + if target == "test-backend-pg" and not os.environ.get("AGENT_REDIS_TEST_ADDR"): + raise WorkspaceError("AGENT_REDIS_TEST_ADDR required; real Redis gate is not skipped") + workspace = Workspace(root) + names = [SINGLE[target]] if target in SINGLE else (["Agent-Native", "Agent-Intent", "Agent-Squad"] if target == "test-libs" else ["Agent-System-Backend", "Agent-System-Frontend"]) + selected = [workspace.manifest.select(name)[0] for name in names] + with workspace.state.operation(): + workspace.state = State(root) + if any(component["role"] in ("go-library", "npm-library") for component in selected): + for component in workspace.manifest.select(fixed=True): + if component["role"] == "application": + prepare_local_source(workspace, component) + for component in selected: + prepare_local_source(workspace, component) + workspace.snapshot() + env = process_environment(root) + if overlay: + workspace.go.check_owned() + if not workspace.state.data.get("go_work") or not (root / "go.work").is_file(): + raise WorkspaceError("LOCAL_OVERLAY=1 requires a registered go.work; use component-edit first") + env["GOWORK"] = str(root / "go.work") + else: + env["GOWORK"] = "off" + print(f"[component-check] local developer sources; GOWORK={env['GOWORK']}; registered edit branches and unsaved code retained", flush=True) + paths = {component["id"]: root / component["path"] for component in selected} + if target == "dev": + print("Backend: make dev-backend [LOCAL_OVERLAY=1]\nFrontend: make dev-frontend\nPrivate module transport is scoped to those processes.") + return + path = paths[names[0]] + if target == "dev-backend": + run(["go", "run", "./cmd/agent-system", "serve", "--addr", "127.0.0.1:8787", "--data", str(root / "data"), "--plugins", str(root / "plugins")], path, env) + elif target == "dev-frontend": + run(["npm", "ci", "--ignore-scripts", "--no-fund", "--no-audit"], path, env) + run(["npm", "run", "dev"], path, env) + elif target == "test-multi-instance": + suite = root / "tests/integration/multi-instance" + binary = suite / ".build/agent-system" + binary.parent.mkdir(parents=True, exist_ok=True) + run(["go", "build", "-mod=readonly", "-o", str(binary), "./cmd/agent-system"], path, env | {"CGO_ENABLED": "0"}) + run(["go", "test", "-mod=readonly", "-count=1", "-timeout=15m", "."], suite, env | {"AGENT_BIN": str(binary)}) + elif target == "eval-deliverables": + run(["go", "test", "-mod=readonly", "./eval/", "./internal/quality/", "-count=1"], path, env) + elif target in ("test-frontend", "test-ui"): + run(["npm", "ci", "--ignore-scripts", "--no-fund", "--no-audit"], path, env) + if target == "test-ui": + run(["npm", "exec", "--offline", "--", "tsc", "--noEmit"], path, env) + run(["npm", "exec", "--offline", "--", "vitest", "run"], path, env) + run(["node", "scripts/check-knip.mjs"], path, env) + else: + for component in selected: + source = paths[component["id"]] + modules = component.get("modules", []) if target == "test-libs" else [{"directory": "."}] + for module in modules: + directory = source / module.get("directory", ".") + if target in ("test-libs", "test-agentcmd"): + run(["go", "vet", "-mod=readonly", "./..."], directory, env) + run(["go", "test", "-mod=readonly", "-count=1", "./..."], directory, env) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--root", type=Path, default=Path(__file__).resolve().parents[1]) + parser.add_argument("--target", choices=(*SINGLE, "test-libs", "dev"), required=True) + parser.add_argument("--overlay", action="store_true") + args = parser.parse_args() + try: + check(args.root, args.target, args.overlay) + except (WorkspaceError, OSError, ValueError) as error: + print(f"component-check: {error}", file=sys.stderr) + raise SystemExit(1) diff --git a/scripts/component-source.py b/scripts/component-source.py new file mode 100644 index 00000000..38d4574a --- /dev/null +++ b/scripts/component-source.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +"""Resolve governance inputs from a formal source map or the owner's checkout.""" +import json +import os +from pathlib import Path +import re +import sys + +LEGACY = {"Agent-System-Backend": "modules/backend", "Agent-System-Frontend": "modules/frontend", + "Agent-System-Core": "modules/core", "Agent-System-UI": "modules/ui", + "Agent-Native": "deps/agent-native", "Agent-Intent": "deps/agent-intent", "Agent-Squad": "deps/agent-squad"} +SHA = re.compile(r"[0-9a-f]{40}\Z") + + +def source_path(root, name): + if not re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9_-]*", name): + raise ValueError("invalid component identifier") + marker = os.environ.get("COMPOSITION_SOURCE_MAP") + if not marker: + relative = ".workspace/" + name if (root / "components.json").exists() else LEGACY[name] + path = root / relative + else: + source_map = Path(marker) + if not source_map.is_absolute() or source_map.is_symlink() or not source_map.is_file(): + raise ValueError("composition source map must be an absolute regular file") + document = json.loads(source_map.read_text()) + if document.get("schema") != 1 or not SHA.fullmatch(str(document.get("root_commit", ""))): + raise ValueError("invalid composition source map identity") + manifest = json.loads((root / "components.json").read_text()) + declared = [entry for entry in manifest["components"] if entry.get("id") == name] + item = document.get("components", {}).get(name) + if len(declared) != 1 or not isinstance(item, dict) or item.get("repo") != declared[0].get("repo") or not SHA.fullmatch(str(item.get("commit", ""))): + raise ValueError("invalid isolated component identity: " + name) + locked = json.loads((root / "components.lock.json").read_text())["components"].get(name) + if locked and item["commit"] != locked["commit"]: + raise ValueError("isolated component differs from locked source: " + name) + path = Path(item.get("path", "")) + if not path.is_absolute(): + raise ValueError("isolated component path must be absolute: " + name) + if not path.is_dir() or path.resolve() != path.absolute(): + raise ValueError("component source is missing or traverses a symbolic link: " + name) + return path + + +if __name__ == "__main__": + try: + if len(sys.argv) != 2: + raise ValueError("usage: component-source.py ") + print(source_path(Path(__file__).resolve().parents[1], sys.argv[1])) + except (OSError, ValueError, KeyError, TypeError) as error: + print("component-source: " + str(error), file=sys.stderr) + raise SystemExit(1) diff --git a/scripts/e2e.sh b/scripts/e2e.sh index 0ab67b9b..50cd4477 100755 --- a/scripts/e2e.sh +++ b/scripts/e2e.sh @@ -10,8 +10,9 @@ # 3. 验收:vite preview(dist+/api 代理)→ npx playwright test # 4. 收尾:停 serve/preview,保存认证/失败工件到 $E2E_OUT # -# 用法:bash scripts/e2e.sh [--seed-only] +# 用法:bash scripts/e2e.sh [--seed-only|--build-only] # --seed-only 只做构建+种子+起服务(留端口与路径在 stdout,供人工/调试) +# --build-only 只构建固定产物;不建号、不起进程、不运行浏览器或模型验收 # 环境变量: # RDM_REPO RDM 仓路径(默认 <本仓上级>/Agent-System-RDM) # E2E_API_PORT/E2E_UI_PORT 服务端口(默认 18791/4173) @@ -25,7 +26,13 @@ DEV_ROOT=$(git -C "$(dirname "$0")/.." rev-parse --show-toplevel) cd "$DEV_ROOT" SEED_ONLY=0 -[ "${1:-}" = "--seed-only" ] && SEED_ONLY=1 +BUILD_ONLY=0 +case "${1:-}" in + --seed-only) SEED_ONLY=1 ;; + --build-only) BUILD_ONLY=1 ;; + "") ;; + *) echo "usage: scripts/e2e.sh [--seed-only|--build-only]" >&2; exit 2 ;; +esac RDM_REPO=${RDM_REPO:-"$DEV_ROOT/../Agent-System-RDM"} API_PORT=${E2E_API_PORT:-18791} @@ -46,52 +53,102 @@ die() { printf '\033[31m[e2e][FAIL]\033[0m %s\n' "$*" >&2; exit 1; } command -v go >/dev/null || die "go not found" command -v node >/dev/null || die "node not found" command -v curl >/dev/null || die "curl not found" -[ -d "$RDM_REPO/.git" ] || die "RDM repo not found at $RDM_REPO (set RDM_REPO)" +git -C "$RDM_REPO" rev-parse --git-dir >/dev/null 2>&1 || die "RDM repo not found at $RDM_REPO (set RDM_REPO)" +if [ "$BUILD_ONLY" != 1 ]; then for p in "$API_PORT" "$UI_PORT"; do if timeout 2 bash -c "echo > /dev/tcp/127.0.0.1/$p" 2>/dev/null; then die "port $p already in use (set E2E_API_PORT/E2E_UI_PORT)" fi done +fi -# ── 1. 构建 ───────────────────────────────────────────── -# RDM 源码经 git archive 从本地对象导出(不建 worktree、不触远端——Gitea 抖动时 -# submodule 克隆会挂死);pins/* 从 RDM 主检出的已物化 submodule 快照拷贝(cp 排除 -# .git,39MB 级),构建输入由此固定为 RDM origin/main + 其 gitlink 指向的本地内容。 -log "build RDM binary (archive origin/main + snapshot pins from local checkout)" -RDM_WT="$OUT/rdm-src" -RDM_SHA=$(git -C "$RDM_REPO" rev-parse origin/main) || die "no origin/main in RDM repo" -mkdir -p "$RDM_WT" -git -C "$RDM_REPO" archive "$RDM_SHA" | tar -x -C "$RDM_WT" -# 主检出 pins 对齐 gitlink(本地对象已有时秒回;此时才需要网络 fetch 一次)。 -git -C "$RDM_REPO" submodule update --init --recursive --quiet \ - || die "materialize RDM pins failed (is the RDM checkout reachable?)" -PIN_SHA_MAIN=$(git -C "$RDM_REPO/pins/agent-system-backend" rev-parse HEAD) -PIN_SHA_WANT=$(git -C "$RDM_REPO" ls-tree "$RDM_SHA" pins/agent-system-backend | awk '{print $3}') -[ "$PIN_SHA_MAIN" = "$PIN_SHA_WANT" ] \ - || die "RDM checkout pins/backend ($PIN_SHA_MAIN) != origin/main pin ($PIN_SHA_WANT); git -C $RDM_REPO submodule update first" -mkdir -p "$RDM_WT/pins" -tar -C "$RDM_REPO/pins" --exclude=.git -cf - agent-system-backend | tar -C "$RDM_WT/pins" -xf - +API_PID="" +UI_PID="" cleanup() { - [ -n "${API_PID:-}" ] && kill "$API_PID" 2>/dev/null || true - # npx→node 的进程树用单 PID 杀不净:按命令行匹配兜底(本脚本专用端口)。 - [ -n "${UI_PID:-}" ] && kill "$UI_PID" 2>/dev/null || true - pkill -f "vite preview --port $UI_PORT" 2>/dev/null || true - pkill -f "agent-system-rdm -data.*e2e" 2>/dev/null || true - pkill -f "agent-system serve .*$API_PORT" 2>/dev/null || true + if [ -n "${API_PID:-}" ]; then kill "$API_PID" 2>/dev/null || true; fi + if [ -n "${UI_PID:-}" ]; then + kill "$UI_PID" 2>/dev/null || true + pkill -f "vite preview --port $UI_PORT" 2>/dev/null || true + fi } trap cleanup EXIT -(cd "$RDM_WT" && go build -o "$OUT/agent-system-rdm" .) || die "rdm build failed" -log "rdm binary: $OUT/agent-system-rdm (RDM@${RDM_SHA:0:12}, pins@${PIN_SHA_WANT:0:12})" -log "build base CLI (user create) from the same pinned backend as the RDM binary" -# 版本一致性:建号 CLI 必须与被测 RDM 二进制共用同一基座 pin——用 Dev 顶层 -# backend(main 最新)建号会把库迁到更高 schema,RDM pins(较旧)打不开。 -(cd "$RDM_WT/pins/agent-system-backend" && go build -o "$OUT/agent-system" ./cmd/agent-system) \ - || die "backend cli build failed" +# ── 1. 构建 ───────────────────────────────────────────── +RDM_SHA=$(git -C "$RDM_REPO" rev-parse origin/main) || die "no origin/main in RDM repo" +RDM_MODULE=$(git -C "$RDM_REPO" show "$RDM_SHA:go.mod" | awk '$1 == "module" { print $2; exit }') +if [ -f "$DEV_ROOT/components.json" ] && [ "$RDM_MODULE" = "git-ssh.u1680832.nyat.app/weichen/Agent-System-RDM.git" ]; then + log "build versioned RDM and matching base CLI through the fixed Dev composition" + source "$DEV_ROOT/scripts/svc.sh" + RUNTIME="$OUT" + ENV_NAME=e2e-build + RDM_SRC_DIR="$RDM_REPO" + COMPOSITION_ROOT="$DEV_ROOT" + RDM_WT=$(materialize_rdm_commit "$RDM_SHA" "${RDM_SHA:0:12}") || die "versioned RDM composition failed" + cp "$RDM_WT/bin/agent-system-rdm" "$OUT/agent-system-rdm" + cp "$RDM_WT/bin/agent-system-admin" "$OUT/agent-system" + # Prepare the owner-controlled fixed source, then keep npm/cache/browser files + # in this run's independent archive, rather than modifying its .workspace. + python3 "$DEV_ROOT/scripts/workspace.py" --root "$DEV_ROOT" prepare --name Agent-System-Frontend >/dev/null || die "fixed Frontend preparation failed" + python3 "$DEV_ROOT/scripts/workspace.py" --root "$DEV_ROOT" verify --name Agent-System-Frontend >/dev/null || die "Frontend differs from fixed source" + FRONTEND_PREPARED=$(python3 "$DEV_ROOT/scripts/component-source.py" Agent-System-Frontend) || die "Frontend source identity unavailable" + FRONTEND_DIR="$OUT/frontend-src" + mkdir -p "$FRONTEND_DIR" + git -C "$FRONTEND_PREPARED" archive HEAD | tar -x -C "$FRONTEND_DIR" + python3 - "$DEV_ROOT" "$FRONTEND_DIR" <<'NPM_ENV' +import importlib.util, pathlib, subprocess, sys +root = pathlib.Path(sys.argv[1]); sys.path.insert(0, str(root / "scripts")) +from workspace.cli import process_environment +spec = importlib.util.spec_from_file_location("composer", root / "scripts/build-composition.py") +composer = importlib.util.module_from_spec(spec); spec.loader.exec_module(composer) +environment = composer.execution_environment(process_environment(root)) +sys.exit(subprocess.run(["npm", "ci", "--ignore-scripts", "--no-audit", "--no-fund"], cwd=sys.argv[2], env=environment).returncode) +NPM_ENV + [ "$?" = 0 ] || die "credential-free npm acquisition failed" + make -C "$DEV_ROOT" frontend >/dev/null || die "fixed frontend build failed" + FRONTEND_DIST="$DEV_ROOT/bin/frontend-dist" +else + # Historical RDM pins and the old Dev layout retain their former build route. + if [ -f "$DEV_ROOT/components.json" ]; then + die "historical RDM e2e requires its historical Dev candidate; no mixed-layout success is claimed" + fi + FRONTEND_DIR="$DEV_ROOT/modules/frontend" + FRONTEND_DIST="$FRONTEND_DIR/dist" + # ── 1. 构建 ───────────────────────────────────────────── + # RDM 源码经 git archive 从本地对象导出(不建 worktree、不触远端——Gitea 抖动时 + # submodule 克隆会挂死);pins/* 从 RDM 主检出的已物化 submodule 快照拷贝(cp 排除 + # .git,39MB 级),构建输入由此固定为 RDM origin/main + 其 gitlink 指向的本地内容。 + log "build RDM binary (archive origin/main + snapshot pins from local checkout)" + RDM_WT="$OUT/rdm-src" + RDM_SHA=$(git -C "$RDM_REPO" rev-parse origin/main) || die "no origin/main in RDM repo" + mkdir -p "$RDM_WT" + git -C "$RDM_REPO" archive "$RDM_SHA" | tar -x -C "$RDM_WT" + # 主检出 pins 对齐 gitlink(本地对象已有时秒回;此时才需要网络 fetch 一次)。 + git -C "$RDM_REPO" submodule update --init --recursive --quiet \ + || die "materialize RDM pins failed (is the RDM checkout reachable?)" + PIN_SHA_MAIN=$(git -C "$RDM_REPO/pins/agent-system-backend" rev-parse HEAD) + PIN_SHA_WANT=$(git -C "$RDM_REPO" ls-tree "$RDM_SHA" pins/agent-system-backend | awk '{print $3}') + [ "$PIN_SHA_MAIN" = "$PIN_SHA_WANT" ] \ + || die "RDM checkout pins/backend ($PIN_SHA_MAIN) != origin/main pin ($PIN_SHA_WANT); git -C $RDM_REPO submodule update first" + mkdir -p "$RDM_WT/pins" + tar -C "$RDM_REPO/pins" --exclude=.git -cf - agent-system-backend | tar -C "$RDM_WT/pins" -xf - + (cd "$RDM_WT" && go build -o "$OUT/agent-system-rdm" .) || die "rdm build failed" + log "rdm binary: $OUT/agent-system-rdm (RDM@${RDM_SHA:0:12}, pins@${PIN_SHA_WANT:0:12})" -log "build frontend dist (contracts + ui deps + bundle, via make frontend)" -make -C "$DEV_ROOT" frontend >/dev/null || die "frontend build failed" + log "build base CLI (user create) from the same pinned backend as the RDM binary" + # 版本一致性:建号 CLI 必须与被测 RDM 二进制共用同一基座 pin——用 Dev 顶层 + # backend(main 最新)建号会把库迁到更高 schema,RDM pins(较旧)打不开。 + (cd "$RDM_WT/pins/agent-system-backend" && go build -o "$OUT/agent-system" ./cmd/agent-system) \ + || die "backend cli build failed" + + log "build frontend dist (contracts + ui deps + bundle, via make frontend)" + make -C "$DEV_ROOT" frontend >/dev/null || die "frontend build failed" +fi +[ -x "$OUT/agent-system-rdm" ] && [ -x "$OUT/agent-system" ] && [ -f "$FRONTEND_DIST/index.html" ] || die "complete e2e build artifacts are missing" +if [ "$BUILD_ONLY" = 1 ]; then + log "build-only complete; runtime/browser/model acceptance NOT_RUN; artifacts=$OUT" + exit 0 +fi # ── 2. 种子 ───────────────────────────────────────────── DATA="$OUT/data" @@ -189,15 +246,15 @@ log "seed done" # ── 3. 验收 ───────────────────────────────────────────── if [ "$SEED_ONLY" = 1 ]; then log "seed-only mode: api=$API_BASE ui=next;cookie jar=$JAR;数据=$DATA" - log "preview: (cd modules/frontend && PLAYWRIGHT_API_TARGET=$API_BASE npx vite preview --port $UI_PORT)" + log "preview: (cd $FRONTEND_DIR && PLAYWRIGHT_API_TARGET=$API_BASE npx vite preview --port $UI_PORT)" log "inspect: curl -b $JAR $API_BASE/api/commands/rdm.inspect.summary -X POST -H 'Content-Type: application/json' -d '{\"params\":{\"projectId\":\"$PID_MAIN\"}}'" wait exit 0 fi log "start vite preview at http://127.0.0.1:$UI_PORT" -(cd "$DEV_ROOT/modules/frontend" && \ - PLAYWRIGHT_API_TARGET="$API_BASE" npx vite preview --port "$UI_PORT" --strictPort \ +(cd "$FRONTEND_DIR" && \ + PLAYWRIGHT_API_TARGET="$API_BASE" npx vite preview --outDir "$FRONTEND_DIST" --port "$UI_PORT" --strictPort \ >"$OUT/preview.log" 2>&1 & echo $! > "$OUT/preview.pid") UI_PID=$(cat "$OUT/preview.pid") @@ -208,10 +265,10 @@ for i in $(seq 1 40); do done log "playwright (install chromium if missing)" -(cd "$DEV_ROOT/modules/frontend" && npx playwright install chromium >/dev/null 2>&1 || true) +(cd "$FRONTEND_DIR" && npx playwright install chromium >/dev/null 2>&1 || true) log "run specs" -cd "$DEV_ROOT/modules/frontend" +cd "$FRONTEND_DIR" export PLAYWRIGHT_BASE_URL="http://127.0.0.1:$UI_PORT" E2E_OWNER="$OWNER" E2E_PASSWORD="$PASSWORD" \ E2E_PROJECT_MAIN="$PROJ_MAIN" E2E_PROJECT_ISOLATED="$PROJ_ISO" set +e diff --git a/scripts/lint-architecture.go b/scripts/lint-architecture.go index 9ded0e9c..67c7b562 100644 --- a/scripts/lint-architecture.go +++ b/scripts/lint-architecture.go @@ -11,6 +11,7 @@ import ( "go/parser" "go/token" "os" + "os/exec" "path/filepath" "sort" "strings" @@ -115,7 +116,11 @@ func checkPolicy(root string) error { return err } text := string(raw) - for _, need := range []string{"modules/backend/internal", "modules/frontend/src", "components"} { + backend, frontend := "modules/backend/internal", "modules/frontend/src" + if _, err := os.Stat(filepath.Join(root, "components.json")); err == nil { + backend, frontend = ".workspace/Agent-System-Backend/internal", ".workspace/Agent-System-Frontend/src" + } + for _, need := range []string{backend, frontend, "components"} { if !strings.Contains(text, need) { return fmt.Errorf("policy/architecture.yaml missing %s", need) } @@ -123,14 +128,36 @@ func checkPolicy(root string) error { return nil } +func componentRoot(root, id, legacy string) (string, error) { + if os.Getenv("COMPOSITION_SOURCE_MAP") != "" { + output, err := exec.Command("python3", filepath.Join(root, "scripts/component-source.py"), id).CombinedOutput() + if err != nil { + return "", fmt.Errorf("isolated component lookup failed: %s", strings.TrimSpace(string(output))) + } + return strings.TrimSpace(string(output)), nil + } + if _, err := os.Stat(filepath.Join(root, "components.json")); err == nil { + return filepath.Join(root, ".workspace", id), nil + } + return filepath.Join(root, legacy), nil +} + func collect(root string) ([]string, error) { var edges []string - be, err := backendEdges(filepath.Join(root, "modules/backend/internal")) + backend, err := componentRoot(root, "Agent-System-Backend", "modules/backend") + if err != nil { + return nil, err + } + frontend, err := componentRoot(root, "Agent-System-Frontend", "modules/frontend") + if err != nil { + return nil, err + } + be, err := backendEdges(filepath.Join(backend, "internal")) if err != nil { return nil, err } edges = append(edges, be...) - fe, err := frontendEdges(filepath.Join(root, "modules/frontend/src")) + fe, err := frontendEdges(filepath.Join(frontend, "src")) if err != nil { return nil, err } @@ -139,8 +166,26 @@ func collect(root string) ([]string, error) { } func backendEdges(dir string) ([]string, error) { + if info, err := os.Stat(dir); err != nil || !info.IsDir() { + return nil, fmt.Errorf("backend source directory is unavailable: %s", dir) + } + raw, err := os.ReadFile(filepath.Join(filepath.Dir(dir), "go.mod")) + if err != nil { + return nil, err + } + prefix := "" + for _, line := range strings.Split(string(raw), "\n") { + fields := strings.Fields(line) + if len(fields) >= 2 && fields[0] == "module" { + prefix = fields[1] + "/internal/" + break + } + } + if prefix == "" { + return nil, fmt.Errorf("backend module identity is unavailable") + } var edges []string - err := filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error { + err = filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error { if err != nil || d.IsDir() { return nil } @@ -158,7 +203,6 @@ func backendEdges(dir string) ([]string, error) { } for _, imp := range f.Imports { p := strings.Trim(imp.Path.Value, `"`) - const prefix = "agent-system-backend/internal/" if !strings.HasPrefix(p, prefix) { continue } diff --git a/scripts/lint-architecture.sh b/scripts/lint-architecture.sh index 7451dd8e..87afc9a9 100755 --- a/scripts/lint-architecture.sh +++ b/scripts/lint-architecture.sh @@ -4,23 +4,24 @@ set -euo pipefail root=$(cd "$(dirname "$0")/.." && pwd) base="$root/policy/architecture-baseline.json" -tool=(go run "$root/scripts/lint-architecture.go" -root "$root" -baseline "$base") +tool=(env GOWORK=off go run "$root/scripts/lint-architecture.go" -root "$root" -baseline "$base") ( cd "$root/scripts" && "${tool[@]}" ) +probe=$(mktemp) +trap 'rm -f "$probe"' EXIT set +e -( cd "$root/scripts" && "${tool[@]}" -inject 'backend/store->backend/__architecture_probe__' ) >/tmp/architecture-probe.out 2>&1 +( cd "$root/scripts" && "${tool[@]}" -inject 'backend/store->backend/__architecture_probe__' ) >"$probe" 2>&1 code=$? set -e if [ "$code" -eq 0 ]; then echo "architecture: injected edge was accepted" >&2 - cat /tmp/architecture-probe.out >&2 + cat "$probe" >&2 exit 1 fi -if ! grep -q '__architecture_probe__' /tmp/architecture-probe.out; then +if ! grep -q '__architecture_probe__' "$probe"; then echo "architecture: injected edge did not fail for the expected reason" >&2 - cat /tmp/architecture-probe.out >&2 + cat "$probe" >&2 exit 1 fi -rm -f /tmp/architecture-probe.out echo "architecture negative ok" diff --git a/scripts/lint-boundaries.sh b/scripts/lint-boundaries.sh index 8009adc0..e9c6d682 100755 --- a/scripts/lint-boundaries.sh +++ b/scripts/lint-boundaries.sh @@ -1,60 +1,84 @@ #!/usr/bin/env bash -# 依赖边界:公开扩展 SDK 与示例不得导入后端 internal。 -# pkg/extension/link 是唯一例外:下游空白导入它才能把 extension.Main 接到产品组合根。 +# Public SDK isolation and sibling-library ratchets use the fixed composition map +# when supplied; a manual invocation uses sources prepared by the checkout owner. set -euo pipefail root=$(cd "$(dirname "$0")/.." && pwd) fail=0 +source_path() { python3 "$root/scripts/component-source.py" "$1"; } +module_path() { + local mod + mod=$(awk '/^module /{print $2; exit}' "$1/go.mod") + [ -n "$mod" ] || { echo "boundary: source lacks a module identity: $1" >&2; return 1; } + printf '%s\n' "$mod" +} +backend=$(source_path Agent-System-Backend) +intent=$(source_path Agent-Intent) +native=$(source_path Agent-Native) +squad=$(source_path Agent-Squad) +backend_mod=$(module_path "$backend") +intent_mod=$(module_path "$intent") +native_mod=$(module_path "$native") +squad_mod=$(module_path "$squad") check() { local path="$1" - if [ -d "$path" ] && grep -R -n --include='*.go' --include='*.ts' --include='*.tsx' 'agent-system-backend/internal' "$path" >/dev/null; then - echo "boundary: $path imports agent-system-backend/internal" >&2 - grep -R -n --include='*.go' --include='*.ts' --include='*.tsx' 'agent-system-backend/internal' "$path" >&2 + if [ -d "$path" ] && rg -n --glob '*.go' --glob '*.ts' --glob '*.tsx' -F \ + -e "$backend_mod/internal" -e 'agent-system-backend/internal' "$path" >/dev/null; then + echo "boundary: $path imports backend internal" >&2 + rg -n --glob '*.go' --glob '*.ts' --glob '*.tsx' -F \ + -e "$backend_mod/internal" -e 'agent-system-backend/internal' "$path" >&2 fail=1 fi } -sdk="$root/modules/backend/pkg/extension" +sdk="$backend/pkg/extension" if [ -d "$sdk" ]; then - hits=$(grep -R -n --include='*.go' 'agent-system-backend/internal' "$sdk" | grep -v '/link/' || true) + hits=$(rg -n --glob '*.go' --glob '!link/**' -F -e "$backend_mod/internal" \ + -e 'agent-system-backend/internal' "$sdk" | { grep -v '/link/' || true; } || true) if [ -n "$hits" ]; then - echo "boundary: pkg/extension imports agent-system-backend/internal" >&2 + echo "boundary: pkg/extension imports backend internal" >&2 echo "$hits" >&2 fail=1 fi fi check "$root/examples" -# 库间依赖棘轮:三个库的包导入兄弟库的配对,相对白名单只许减少、不许新增。 +# Preserve the allowlist's semantic package names when public module prefixes +# change. No baseline is regenerated during dependency migration. +normalize() { + local value="$1" idx + for idx in 0 1 2; do + case "$value" in + "${canonical[$idx]}") printf '%s' "${legacy[$idx]}"; return ;; + "${canonical[$idx]}"/*) printf '%s%s' "${legacy[$idx]}" "${value#"${canonical[$idx]}"}"; return ;; + esac + done + printf '%s' "$value" +} +canonical=("$intent_mod" "$native_mod" "$squad_mod") +legacy=(agent-intent agent-native agent-squad) +siblings=("${canonical[@]}" "${legacy[@]}") allow="$root/policy/lib-deps-allowlist.txt" observed=$(mktemp) recorded=$(mktemp) -trap 'rm -f "$observed" "$recorded"' EXIT -siblings=(agent-intent agent-native agent-squad) -for dir in deps/agent-intent deps/agent-native deps/agent-squad; do - mod=$(awk '/^module /{print $2; exit}' "$root/$dir/go.mod") - ( - cd "$root/scripts" - go run lint-imports.go "$root/$dir" - ) | while read -r importer rest; do +imports=$(mktemp) +trap 'rm -f "$observed" "$recorded" "$imports"' EXIT +for dir in "$intent" "$native" "$squad"; do + mod=$(module_path "$dir") + (cd "$root/scripts" && GOWORK=off go run lint-imports.go "$dir") > "$imports" + while read -r importer rest; do for imp in $rest; do for sib in "${siblings[@]}"; do - case "$imp" in - "$sib"|"$sib"/*) ;; - *) continue ;; - esac - case "$importer" in - "$mod"|"$mod"/*) ;; - *) continue ;; - esac - if [ "$sib" != "$mod" ]; then - echo "$importer $imp" + case "$imp" in "$sib"|"$sib"/*) ;; *) continue ;; esac + case "$importer" in "$mod"|"$mod"/*) ;; *) continue ;; esac + if [ "$(normalize "$sib")" != "$(normalize "$mod")" ]; then + printf '%s %s\n' "$(normalize "$importer")" "$(normalize "$imp")" fi done done - done -done | sort -u >"$observed" -grep -v -e '^#' -e '^$' "$allow" | sort -u >"$recorded" || true + done < "$imports" +done | sort -u > "$observed" +grep -v -e '^#' -e '^$' "$allow" | sort -u > "$recorded" || true new_pairs=$(comm -13 "$recorded" "$observed" || true) if [ -n "$new_pairs" ]; then echo "boundary: new sibling-library import pairs" >&2 @@ -67,34 +91,27 @@ if [ -n "$stale_pairs" ]; then echo "$stale_pairs" >&2 fi -# 核心模块的依赖图不得出现兄弟库。go list ./... 不进入带 go.mod 的子目录。 -for dir in deps/agent-intent deps/agent-native deps/agent-squad; do - mod=$(awk '/^module /{print $2; exit}' "$root/$dir/go.mod") - deps_out=$(cd "$root/$dir" && GOWORK=off go list -deps ./...) || fail=1 +for dir in "$intent" "$native" "$squad"; do + mod=$(module_path "$dir") + deps_out=$(cd "$dir" && GOWORK=off go list -deps ./...) || fail=1 for sib in "${siblings[@]}"; do - [ "$sib" = "$mod" ] && continue - if printf '%s\n' "$deps_out" | grep -E -q "^(${sib}|${sib}/)"; then - echo "boundary: $mod core depends on $sib" >&2 - fail=1 - fi + [ "$(normalize "$sib")" = "$(normalize "$mod")" ] && continue + while IFS= read -r dep; do + case "$dep" in + "$sib"|"$sib"/*) echo "boundary: $mod core depends on $sib" >&2; fail=1 ;; + esac + done <<< "$deps_out" done done -# agent-intent 只许被小队意图适配器和后端识别适配器导入。 -while IFS= read -r f; do - grep -q '"agent-intent/' "$f" || continue - case "$f" in - */deps/agent-squad/adapters/intent/*|*/modules/backend/internal/intentgate/*|*/modules/backend/internal/intentsem/*) ;; - *) - echo "boundary: $f imports agent-intent" >&2 - fail=1 - ;; +while IFS= read -r file; do + case "$file" in + "$squad"/adapters/intent/*|"$backend"/internal/intentgate/*|"$backend"/internal/intentsem/*) ;; + *) echo "boundary: $file imports agent-intent" >&2; fail=1 ;; esac -done < <(find "$root/deps/agent-native" "$root/deps/agent-squad" "$root/modules/backend" \ - -path '*/deps/*' -prune -o -name '*.go' -print) +done < <(rg -l --glob '*.go' --glob '!**/deps/**' -F -e "\"$intent_mod\"" \ + -e "\"$intent_mod/" -e '"agent-intent"' -e '"agent-intent/' "$native" "$squad" "$backend" || true) -if [ "$fail" -ne 0 ]; then - exit 1 -fi +[ "$fail" -eq 0 ] || exit 1 bash "$root/scripts/lint-architecture.sh" echo "boundaries ok" diff --git a/scripts/svc.sh b/scripts/svc.sh index 33e9b39a..bc8ecd87 100755 --- a/scripts/svc.sh +++ b/scripts/svc.sh @@ -2247,6 +2247,68 @@ svc_deploy_recycle_wt() { return 0 } +# Source format belongs to the candidate being built, not the caller's checkout. +svc_versioned_rdm() { + [ -f "$1/go.mod" ] && [ "$(awk '$1 == "module" { print $2; exit }' "$1/go.mod")" = "git-ssh.u1680832.nyat.app/weichen/Agent-System-RDM.git" ] +} + +svc_check_build_worktree() { + local wt="$1" expected="$2" actual marker path + actual=$(git -C "$wt" rev-parse HEAD) || return 1 + [ "$actual" = "$expected" ] || { c_err "candidate SHA mismatch: expected=$expected actual=$actual; cached worktree retained"; return 1; } + [ "$(git -C "$wt" rev-parse --show-toplevel)" = "$wt" ] || { c_err "candidate worktree identity mismatch; preserve its owner"; return 1; } + for marker in index.lock HEAD.lock MERGE_HEAD CHERRY_PICK_HEAD REVERT_HEAD rebase-merge rebase-apply BISECT_LOG; do + path=$(git -C "$wt" rev-parse --path-format=absolute --git-path "$marker") || return 1 + [ ! -e "$path" ] || { c_err "candidate Git operation/lock active: $marker; preserve its owner"; return 1; } + done + if [ -f "$wt/components.json" ] || svc_versioned_rdm "$wt"; then + [ -z "$(GIT_OPTIONAL_LOCKS=0 git -C "$wt" status --porcelain --untracked-files=all --ignore-submodules=all)" ] \ + || { c_err "candidate source is dirty; preserve it before retrying the fixed build"; return 1; } + fi +} + +svc_frontend_dist() { + local root="$1" + if [ -f "$root/components.json" ]; then + python3 - "$root/bin/resolved-manifest.json" "$(git -C "$root" rev-parse HEAD)" <<'PY' +import json, sys +try: + record = json.load(open(sys.argv[1])) + if record.get("target") != "frontend" or record.get("root", {}).get("commit") != sys.argv[2]: + raise ValueError("frontend composition identity mismatch") +except (OSError, ValueError) as error: + print("svc: " + str(error), file=sys.stderr); sys.exit(1) +PY + [ "$?" = 0 ] || return 1 + printf '%s\n' "$root/bin/frontend-dist" + else + printf '%s\n' "$root/modules/frontend/dist" + fi +} + +svc_composition_plugins() { + local root="$1" present + present=$(python3 - "$root/bin/resolved-manifest.json" "$(git -C "$root" rev-parse HEAD)" <<'PY' +import json, sys +try: + record = json.load(open(sys.argv[1])) + if record.get("target") != "build" or record.get("root", {}).get("commit") != sys.argv[2]: + raise ValueError("build composition identity mismatch") + print("yes" if "plugins" in record.get("assets", {}) else "no") +except (OSError, ValueError) as error: + print("svc: " + str(error), file=sys.stderr); sys.exit(1) +PY + ) || return 1 + if [ "$present" = yes ]; then + [ -d "$root/bin/plugins" ] || { c_err "composed plugins are missing"; return 1; } + printf '%s\n' "$root/bin/plugins" + else + mkdir -p "$root/.svc-empty-plugins" + [ -z "$(find "$root/.svc-empty-plugins" -mindepth 1 -print -quit)" ] || { c_err "empty plugin source contains unique files; preserve it"; return 1; } + printf '%s\n' "$root/.svc-empty-plugins" + fi +} + # materialize_dev_commit FULL SHA TARGET:隔离 worktree 物化+构建;stdout 只回显 worktree # 路径(提示信息走 stderr)。TARGET=build(agent)| frontend(static)。 materialize_dev_commit() { @@ -2258,12 +2320,16 @@ materialize_dev_commit() { c_info "[$ENV_NAME] 物化 Dev 提交 $sha → 隔离 worktree(源:独立部署源仓 $SRC_DIR,不触碰当前工作区)" git -C "$SRC_DIR" worktree add --detach "$wt" "$full" >/dev/null || return 1 fi - c_info "[$ENV_NAME] 物化子模块组合(git submodule update --init --recursive;缺对象时需网络)" - # stdout 只留给最后的 worktree 路径(调用方 $() 捕获)——子模块/构建输出全部走 stderr。 - git -C "$wt" submodule update --init --recursive >&2 || { - c_err "[$ENV_NAME] 子模块物化失败(网络或对象缺失;重试会自动 fetch 部署源仓)" - return 1 - } + svc_check_build_worktree "$wt" "$full" || return 1 + if [ -f "$wt/components.json" ]; then + c_info "[$ENV_NAME] 固定源码清单组合(隔离装配;不初始化旧 gitlinks)" + else + c_info "[$ENV_NAME] 物化历史子模块组合(git submodule update --init --recursive)" + git -C "$wt" submodule update --init --recursive >&2 || { + c_err "[$ENV_NAME] 历史子模块物化失败;构建 worktree 保留供重试" + return 1 + } + fi c_info "[$ENV_NAME] 构建(make $target:npm ci + 构建,需网络)" make -C "$wt" "$target" >&2 || return 1 echo "$wt" @@ -2273,9 +2339,19 @@ materialize_dev_commit() { recycle_worktree() { local repo="${2:-$SRC_DIR}" local wt="$RUNTIME/.worktrees/$1" - c_info "[$ENV_NAME] 回收构建 worktree" - git -C "$repo" worktree remove --force "$wt" >/dev/null 2>&1 \ - || c_warn "[$ENV_NAME] worktree 回收失败,可手动:git -C $repo worktree remove --force $wt" + [ -d "$wt" ] || return 0 + if [ -n "$(git -C "$wt" symbolic-ref --quiet --short HEAD 2>/dev/null || true)" ] \ + || ! svc_check_build_worktree "$wt" "$(git -C "$wt" rev-parse HEAD 2>/dev/null)"; then + c_warn "[$ENV_NAME] 构建 worktree 属于分支或有活动操作,保留现场:$wt" + return 0 + fi + if [ -n "$(GIT_OPTIONAL_LOCKS=0 git -C "$wt" status --porcelain --untracked-files=all --ignored=matching 2>/dev/null)" ]; then + c_warn "[$ENV_NAME] 构建 worktree 含未保存或 ignored 产物,保留现场供 owner 检查:$wt" + return 0 + fi + c_info "[$ENV_NAME] 回收干净构建 worktree(无 force)" + git -C "$repo" worktree remove "$wt" >/dev/null 2>&1 \ + || c_warn "[$ENV_NAME] Git 拒绝回收;保留 worktree 与元数据供 owner 检查:$wt" } # materialize_rdm_commit FULL SHA:RDM 源的隔离 worktree 物化+构建;stdout 只回显 @@ -2290,13 +2366,25 @@ materialize_rdm_commit() { c_info "[$ENV_NAME] 物化 RDM 提交 $sha → 隔离 worktree(源:独立 RDM 源仓 $RDM_SRC_DIR,不触碰当前工作区)" git -C "$RDM_SRC_DIR" worktree add --detach "$wt" "$full" >/dev/null || return 1 fi - c_info "[$ENV_NAME] 物化基座 pins(git submodule update --init --recursive;缺对象时需网络)" - git -C "$wt" submodule update --init --recursive >&2 || { - c_err "[$ENV_NAME] pins 子模块物化失败(网络或对象缺失;重试会自动 fetch RDM 源仓)" - return 1 - } - c_info "[$ENV_NAME] 构建(make build:纯 Go,无需 npm)" - make -C "$wt" build >&2 || return 1 + svc_check_build_worktree "$wt" "$full" || return 1 + if svc_versioned_rdm "$wt"; then + local composition_root="${COMPOSITION_ROOT:-$ROOT}" + composition_root=$(realpath -e -- "$composition_root") || { c_err "COMPOSITION_ROOT is unavailable"; return 1; } + [ -f "$composition_root/components.json" ] && [ -f "$composition_root/components.lock.json" ] && [ -f "$composition_root/scripts/build-composition.py" ] || { + c_err "[$ENV_NAME] 版本化 RDM 需要 COMPOSITION_ROOT 指向固定 Dev 候选;不回落旧 pins" + return 1 + } + c_info "[$ENV_NAME] 构建固定 RDM 产品(COMPOSITION_ROOT=$composition_root;不初始化旧 pins)" + make -C "$wt" COMPOSITION_ROOT="$composition_root" build >&2 || return 1 + else + c_info "[$ENV_NAME] 物化历史基座 pins(git submodule update --init --recursive)" + git -C "$wt" submodule update --init --recursive >&2 || { + c_err "[$ENV_NAME] 历史 pins 物化失败;构建 worktree 保留供重试" + return 1 + } + c_info "[$ENV_NAME] 构建历史 RDM 候选(make build)" + make -C "$wt" build >&2 || return 1 + fi [ -x "$wt/bin/agent-system-rdm" ] || { c_err "[$ENV_NAME] 构建产物缺失:$wt/bin/agent-system-rdm(RDM Makefile 的 build 目标应产出该名称)" return 1 @@ -2678,11 +2766,15 @@ agent_do_deploy() { hist_event deploy fail "$(read_pid)" "构建失败($SRC_LABEL)" return 1 } - srcbin="$BIN"; srcplug="$ROOT/plugins" ;; + srcbin="$BIN" + if [ -f "$ROOT/components.json" ]; then srcplug=$(svc_composition_plugins "$ROOT") || return 1 + else srcplug="$ROOT/plugins"; fi ;; dev) wt="$(materialize_dev_commit "$SRC_FULL" "$SRC_SHA" build)" \ || { hist_event deploy fail "$(read_pid)" "物化/构建失败($SRC_LABEL)"; return 1; } - srcbin="$wt/bin/agent-system"; srcplug="$wt/plugins" ;; + srcbin="$wt/bin/agent-system" + if [ -f "$wt/components.json" ]; then srcplug=$(svc_composition_plugins "$wt") || return 1 + else srcplug="$wt/plugins"; fi ;; release) local relbin="$REL_ROOT/build/$REL_VERSION/agent-system" if [ ! -f "$relbin" ]; then @@ -2803,7 +2895,7 @@ print_agent_plan() { printf ' 产物:%s ← %s + %s/plugins\n' "$ENV_BIN" "$BIN" "$ROOT" ;; dev) printf ' 来源:%s(完整提交 %s;独立部署源仓 %s)\n' "$SRC_LABEL" "$SRC_FULL" "$SRC_DIR" - printf ' 物化:worktree %s(submodule update --init --recursive + make build)\n' "$RUNTIME/.worktrees/$SRC_SHA" ;; + printf ' 物化:worktree %s(按候选格式选择历史 gitlinks 或固定源码装配 + make build)\n' "$RUNTIME/.worktrees/$SRC_SHA" ;; release) printf ' 来源:%s(Releases 提交 %s)\n' "$SRC_LABEL" "$(git -C "$REL_ROOT" rev-parse --short "$REL_COMMIT")" [ -n "${SRC_DEVCOMMIT:-}" ] && printf ' 对应 Dev 提交:%s\n' "$SRC_DEVCOMMIT" @@ -2812,7 +2904,7 @@ print_agent_plan() { else printf ' 制品:%s(缺失!需先在 Releases 仓构建,或换版本)\n' "$art"; fi ;; rdm) printf ' 来源:%s(完整提交 %s;独立 RDM 源仓 %s)\n' "$SRC_LABEL" "$SRC_FULL" "$RDM_SRC_DIR" - printf ' 物化:worktree %s(pins submodule update --init --recursive + make build)\n' "$RUNTIME/.worktrees/rdm-$SRC_SHA" + printf ' 物化:worktree %s(按候选格式选择历史 pins 或 COMPOSITION_ROOT 固定产品装配)\n' "$RUNTIME/.worktrees/rdm-$SRC_SHA" printf ' 产物:%s ← bin/agent-system-rdm + 空插件目录(组合插件编译进二进制)\n' "$ENV_BIN" printf ' 工作台:web/ → %s/htdocs;自动伴生:scripts/svc.sh %s deploy --kind static --dir 该目录\n' \ "$ENV_DIR" "$(rdm_companion_name "$ENV_NAME")" ;; @@ -3359,12 +3451,12 @@ static_do_deploy() { local) c_info "[$ENV_NAME] 构建当前工作区前端(make frontend)——写主检出构建产物(gitignore 目录)" make -C "$ROOT" frontend || { hist_event deploy fail "$(read_pid)" "make frontend 失败"; return 1; } - src_dist="$ROOT/modules/frontend/dist" + src_dist=$(svc_frontend_dist "$ROOT") || return 1 ;; dev) wt="$(materialize_dev_commit "$SRC_FULL" "$SRC_SHA" frontend)" \ || { hist_event deploy fail "$(read_pid)" "物化/构建失败($SRC_LABEL)"; return 1; } - src_dist="$wt/modules/frontend/dist" + src_dist=$(svc_frontend_dist "$wt") || return 1 ;; release) c_err "[$ENV_NAME] release 制品内嵌前端(无独立 dist);static 请用 --from dev|local 或 --dir" diff --git a/scripts/task.sh b/scripts/task.sh index 7fdaeeda..afc7bf19 100755 --- a/scripts/task.sh +++ b/scripts/task.sh @@ -113,6 +113,10 @@ cmd_precheck() { echo "[verdict] SYNC_REQUIRED — ${branch} 缺少 origin/${TARGET_BRANCH} 的 ${behind} 个提交;主检出 pull --ff-only,任务分支 make task-sync" exit 4 fi + if ! check_worktree rules; then + echo "[verdict] RULES_UNVERIFIED — fixed startup reading unavailable; preserve the workspace and retry" >&2 + return 7 + fi echo "[verdict] READY — 保留本次 precheck receipt 后建任务工作区:PRECHECK_RECEIPT=/tmp/task-precheck.json make task-start NAME=feature/your-branch" } @@ -157,14 +161,17 @@ cmd_start() { wt="$(dirname "$mainroot")/$(basename "$mainroot")-wt-${slug}" [ -e "$wt" ] && die "worktree path exists: $wt" git worktree add -q "$wt" -b "$name" "$start_ref" - # 物化后按 submodule status 实际状态核对,不只信退出码:网络抖动或嵌套指针 - # 漂移时 update 可能静默留坑(2026-09-30 实测深嵌套层带病通过,构建期才炸)。 - (cd "$wt" && git submodule update --init --recursive >/dev/null 2>&1) \ - || echo "[warn] submodule update 非零退出,见下方状态核对" - local sub_drift - sub_drift=$(git -C "$wt" submodule status --recursive 2>/dev/null | grep -cE '^[-+U]' || true) - [ "${sub_drift:-0}" -gt 0 ] \ - && echo "[warn] worktree 子模块物化不完整:${sub_drift} 项漂移/未初始化——构建前先核对(git -C $wt submodule status --recursive)" + if [ -f "$wt/components.json" ]; then + (cd "$wt" && check_worktree materialize) || die "fixed sources unavailable; task worktree retained for retry" + else + # Historical commits keep the original submodule materializer. + (cd "$wt" && git submodule update --init --recursive >/dev/null 2>&1) \ + || echo "[warn] submodule update 非零退出,见下方状态核对" + local sub_drift + sub_drift=$(git -C "$wt" submodule status --recursive 2>/dev/null | grep -cE '^[-+U]' || true) + [ "${sub_drift:-0}" -gt 0 ] \ + && echo "[warn] worktree 子模块物化不完整:${sub_drift} 项漂移/未初始化——构建前先核对" + fi local card="$wt/.task/${slug}.md" mkdir -p "$wt/.task" cat > "$card" </dev/null 2>&1 || { echo "product-build: 缺少 $1(完整 Web 产物不可构建)" >&2; exit 2; }; } +need node; need npm; need go + +# copy_tree SRC DST EXCLUDE...:tar 管道拷贝 + 拷贝期排除(CI runner 无 rsync; +# cp -a 无法在拷贝中排除——源在目标祖先目录内时会「拷入自身」)。 +copy_tree() { + local src="$1" dst="$2"; shift 2 + mkdir -p "$dst" + local excl=() rel + for rel in "$@"; do excl+=(--exclude "./$rel"); done + ( cd "$src" && tar cf - "${excl[@]}" . ) | ( cd "$dst" && tar xf - ) +} + +echo "[product] 物化组件(pins 只读;.build/product 全新重建)" +rm -rf "$BUILD" +mkdir -p "$BUILD" +copy_tree pins/agent-system-frontend "$BUILD/frontend" .git node_modules dist tsconfig.tsbuildinfo +copy_tree pins/agent-system-ui "$BUILD/ui" .git node_modules dist +copy_tree pins/agent-system-backend "$BUILD/backend" .git internal/runtime/data internal/server/data +copy_tree "$ROOT" "$BUILD/rdm" .git .build bin node_modules data .task .zcode dist + +echo "[product] 构建前端(frontend+ui 邻接布局;npm ci + vite build)" +# ui 仓有自己的 node_modules(marked/dompurify 等,见 frontend vite.config dedupe 注释)。 +( cd "$BUILD/ui" && npm ci --no-audit --no-fund >/dev/null 2>&1 ) +( cd "$BUILD/frontend" && npm ci --no-audit --no-fund >/dev/null 2>&1 && npm run build 2>&1 | tail -4 ) + +INDEX="$BUILD/frontend/dist/index.html" +[ -f "$INDEX" ] || { echo "product-build: frontend/dist 缺 index.html——拒绝作为完整 Web 产物" >&2; exit 3; } +ls "$BUILD/frontend/dist/assets" >/dev/null 2>&1 || { echo "product-build: dist 缺 assets/ 骨架" >&2; exit 3; } + +echo "[product] 注入 backend web embed(dist → backend/web/dist)" +rm -rf "$BUILD/backend/web/dist" +mkdir -p "$BUILD/backend/web/dist" +cp -r "$BUILD/frontend/dist/." "$BUILD/backend/web/dist/" +touch "$BUILD/backend/web/dist/.gitkeep" + +echo "[product] 重写 rdm/go.mod 的 backend replace(→ ../backend;其余随前缀)" +sed -i 's#=> \./pins/agent-system-backend#=> ../backend#g' "$BUILD/rdm/go.mod" + +echo "[product] 编译组合二进制" +( cd "$BUILD/rdm" && go build -trimpath -buildvcs=false -o "$OUT_BIN" . ) +# 同源 admin 工具(backend cmd/agent-system:apikey 等 CLI;烟测/运维用,同 embed 源)。 +( cd "$BUILD/backend" && go build -trimpath -buildvcs=false -o "$ROOT/bin/agent-system-admin" ./cmd/agent-system ) + +DIST_SHA=$(find "$BUILD/backend/web/dist" -type f ! -name .gitkeep -print0 | sort -z | xargs -0 sha256sum | sha256sum | cut -c1-16) +BIN_SHA=$(sha256sum "$OUT_BIN" | cut -c1-16) +BE_SHA=$(git -C pins/agent-system-backend rev-parse HEAD) +FE_SHA=$(git -C pins/agent-system-frontend rev-parse HEAD) +UI_SHA=$(git -C pins/agent-system-ui rev-parse HEAD) +RDM_SHA=$(git rev-parse HEAD) +cat > "$OUT_MAN" <>", gate) + clone = work / "lifecycle-source" + replay = subprocess.run( + ["bash", "-c", 'source .ci-mirrors.env; git clone -q "$1" "$2"; ' + 'git -C "$2" fetch -q origin; env', "fixture", + SSH + "Agent-System-RDM.git", str(clone)], cwd=work, env=self.env, + capture_output=True, text=True, timeout=30) + self.assertEqual(replay.returncode, 0, replay.stderr) + self.assertNotIn(SUB_TOKEN, replay.stdout + replay.stderr) + self.assertEqual(self.git(clone, "rev-parse", "HEAD"), shas[2]) if __name__ == "__main__": diff --git a/tests/test_component_checks.py b/tests/test_component_checks.py new file mode 100644 index 00000000..77e4ef8e --- /dev/null +++ b/tests/test_component_checks.py @@ -0,0 +1,141 @@ +"""Local named checks prepare fixed sources and retain edits with real Go/Git.""" +import json +import os +from pathlib import Path +import shutil +import subprocess +import tempfile +import unittest + +SOURCE = Path(__file__).resolve().parents[1] + + +@unittest.skipUnless(shutil.which("go"), "Go required") +class ComponentCheckTests(unittest.TestCase): + def setUp(self): + self.tmp = tempfile.TemporaryDirectory(prefix="component-check-") + self.addCleanup(self.tmp.cleanup) + self.base = Path(self.tmp.name) + self.root = self.base / "dev" + self.root.mkdir() + self.env = os.environ.copy() + for key in list(self.env): + if key.startswith("GIT_CONFIG_") or key in ("GIT_DIR", "GIT_WORK_TREE", "GIT_INDEX_FILE", "GOWORK", "COMPOSITION_SOURCE_MAP", "CI_DEPENDENCY_MIRRORS"): + self.env.pop(key, None) + self.env.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_GLOBAL="/dev/null", GIT_ALLOW_PROTOCOL="file", + GIT_AUTHOR_NAME="Checks", GIT_AUTHOR_EMAIL="check@example.invalid", + GIT_COMMITTER_NAME="Checks", GIT_COMMITTER_EMAIL="check@example.invalid", + GOTOOLCHAIN="local", GOPROXY="off", GOSUMDB="off") + self.call(self.root, "git", "init", "--initial-branch=main") + shutil.copytree(SOURCE / "scripts", self.root / "scripts") + shutil.copyfile(SOURCE / "Makefile", self.root / "Makefile") + (self.root / ".gitignore").write_text(".workspace/\ngo.work\ngo.work.sum\ntests/integration/multi-instance/.build/\n") + app = self.base / "backend" + app.mkdir() + self.call(app, "git", "init", "--initial-branch=main") + (app / "go.mod").write_text("module example.com/backend\n\ngo 1.23\n") + (app / "source.go").write_text("package backend\nfunc Value() string {return \"fixed\"}\n") + (app / "source_test.go").write_text('package backend\nimport "testing"\nfunc TestValue(t *testing.T) {if Value() != "fixed" {t.Fatal(Value())}}\n') + (app / "cmd/agent-system").mkdir(parents=True) + (app / "cmd/agent-system/main.go").write_text('package main\nimport "fmt"\nfunc main(){fmt.Print("fixed-binary")}\n') + self.call(app, "git", "add", ".") + self.call(app, "git", "commit", "-m", "Fixed Backend") + sha = self.call(app, "git", "rev-parse", "HEAD").stdout.strip() + manifest = {"schema": 1, "components": [{"id": "Agent-System-Backend", "repo": str(app), "path": ".workspace/Agent-System-Backend", "legacy_path": "modules/backend", "role": "application", "modules": [{"path": "example.com/backend", "directory": "."}], "target": "main"}]} + (self.root / "components.json").write_text(json.dumps(manifest)) + (self.root / "components.lock.json").write_text(json.dumps({"schema": 1, "components": {"Agent-System-Backend": {"commit": sha}}})) + self.call(self.root, "git", "add", ".") + self.call(self.root, "git", "commit", "-m", "Fixed Dev") + + def call(self, cwd, *args, check=True, env=None): + result = subprocess.run(args, cwd=cwd, env=env or self.env, text=True, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, timeout=90) + if check: + self.assertEqual(result.returncode, 0, result.stdout) + return result + + def test_backend_check_prepares_fixed_source_and_replays_owner_edits(self): + result = self.call(self.root, "make", "test-backend") + self.assertIn("GOWORK=off", result.stdout) + child = self.root / ".workspace/Agent-System-Backend" + self.assertEqual((child / "source.go").read_text(), 'package backend\nfunc Value() string {return "fixed"}\n') + self.call(self.root, "python3", "scripts/workspace.py", "--root", str(self.root), "edit", "--name", "Agent-System-Backend", "--branch", "feature/owned") + (child / "source.go").write_text('package backend\nfunc Value() string {return "owner-edit"}\n') + result = self.call(self.root, "make", "test-backend", check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("owner-edit", result.stdout) + self.assertEqual(self.call(child, "git", "branch", "--show-current").stdout.strip(), "feature/owned") + self.assertIn('"owner-edit"', (child / "source.go").read_text()) + + def test_pg_gate_requires_environment_and_forwards_it_to_real_go_tests(self): + result = self.call(self.root, "make", "test-backend-pg", check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertFalse((self.root / ".workspace").exists()) + self.call(self.root, "python3", "scripts/workspace.py", "--root", str(self.root), "edit", "--name", "Agent-System-Backend", "--branch", "feature/pg-gate") + child = self.root / ".workspace/Agent-System-Backend" + (child / "pg_gate_test.go").write_text('package backend\nimport("os";"testing")\nfunc TestGateEnv(t *testing.T){if os.Getenv("AGENT_PG_TEST_DSN")!="fixture-dsn"||os.Getenv("AGENT_REDIS_TEST_ADDR")!="fixture-redis"{t.Fatal("gate environment missing")}}\n') + self.call(self.root, "make", "test-backend-pg", env=self.env | {"AGENT_PG_TEST_DSN": "fixture-dsn", "AGENT_REDIS_TEST_ADDR": "fixture-redis"}) + + def test_multi_instance_binary_is_built_inside_dev_root_and_reached_by_suite(self): + suite = self.root / "tests/integration/multi-instance" + suite.mkdir(parents=True) + (suite / "go.mod").write_text("module example.com/multi\n\ngo 1.23\n") + (suite / "binary_test.go").write_text('package multi\nimport("os";"os/exec";"testing")\nfunc TestBinary(t *testing.T){b,e:=exec.Command(os.Getenv("AGENT_BIN")).Output();if e!=nil||string(b)!="fixed-binary"{t.Fatalf("%s %v",b,e)}}\n') + self.call(self.root, "make", "test-multi-instance", env=self.env | {"AGENT_PG_TEST_DSN": "fixture-dsn"}) + self.assertTrue((suite / ".build/agent-system").is_file()) + self.assertFalse((self.root / ".workspace/tests").exists()) + + def test_new_pin_gate_validates_fixed_sources_and_rejects_local_replaces(self): + self.call(self.root, "python3", "scripts/workspace.py", "--root", str(self.root), "prepare") + self.call(self.root, "bash", "scripts/check-pins.sh") + child = self.root / ".workspace/Agent-System-Backend" + (child / "go.mod").write_text((child / "go.mod").read_text() + "\nreplace example.com/dependency => ../local\n") + result = self.call(self.root, "bash", "scripts/check-pins.sh", check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("local replace", result.stdout) + + def test_registered_private_transport_reaches_real_go_process_without_global_change(self): + manifest = json.loads((self.root / "components.json").read_text()) + manifest["transport"] = {"go_private": ["private.example.test"], "git_rewrites": [{"from": "https://private.example.test/", "to": self.base.as_uri() + "/"}]} + (self.root / "components.json").write_text(json.dumps(manifest)) + global_config = self.base / "global.gitconfig" + global_config.write_text("[user]\n name = existing-user\n") + env = self.env | {"GIT_CONFIG_GLOBAL": str(global_config)} + self.call(self.root, "python3", "scripts/workspace.py", "--root", str(self.root), "edit", "--name", "Agent-System-Backend", "--branch", "feature/transport", env=env) + child = self.root / ".workspace/Agent-System-Backend" + (child / "transport_test.go").write_text('package backend\nimport("os";"testing")\nfunc TestTransport(t *testing.T){if os.Getenv("GOPRIVATE")!="private.example.test"||os.Getenv("GOWORK")!="off"||os.Getenv("GIT_CONFIG_COUNT")==""{t.Fatal("process-scoped transport missing")}}\n') + before = global_config.read_bytes() + self.call(self.root, "make", "test-backend", env=env) + self.assertEqual(global_config.read_bytes(), before) + + def test_explicit_overlay_uses_registered_workspace_and_preserves_default_version_mode(self): + self.call(self.root, "python3", "scripts/workspace.py", "--root", str(self.root), "edit", "--name", "Agent-System-Backend", "--branch", "feature/overlay") + child = self.root / ".workspace/Agent-System-Backend" + work = self.root / "go.work" + (child / "overlay_test.go").write_text('package backend\nimport("os";"testing")\nfunc TestOverlay(t *testing.T){if os.Getenv("GOWORK")!="' + str(work) + '"{t.Fatal("registered overlay missing")}}\n') + self.call(self.root, "make", "test-backend", "LOCAL_OVERLAY=1") + default = self.call(self.root, "make", "test-backend", check=False) + self.assertNotEqual(default.returncode, 0, default.stdout) + self.assertIn("registered overlay missing", default.stdout) + self.assertTrue(work.is_file()) + + def test_make_pin_gate_uses_map_in_gitless_formal_root_and_ignores_external_rdm_identity(self): + self.call(self.root, "python3", "scripts/workspace.py", "--root", str(self.root), "prepare") + formal = self.base / "formal" + formal.mkdir() + shutil.copytree(self.root / "scripts", formal / "scripts") + for name in ("Makefile", "components.json", "components.lock.json"): + shutil.copy2(self.root / name, formal / name) + entry = json.loads((self.root / "components.json").read_text())["components"][0] + locked = json.loads((self.root / "components.lock.json").read_text())["components"][entry["id"]]["commit"] + mapping = {"schema": 1, "root_commit": self.call(self.root, "git", "rev-parse", "HEAD").stdout.strip(), + "components": {entry["id"]: {"path": str(self.root / entry["path"]), "repo": entry["repo"], "commit": locked}, + "Agent-System-RDM": {"path": str(self.base / "external-rdm"), "repo": "external registered by composer", "commit": locked}}} + source_map = self.base / "map.json" + source_map.write_text(json.dumps(mapping)) + self.call(formal, "make", "test-pins", env=self.env | {"COMPOSITION_SOURCE_MAP": str(source_map)}) + self.assertFalse((formal / ".workspace").exists()) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_composition.py b/tests/test_composition.py new file mode 100644 index 00000000..ef6d9da6 --- /dev/null +++ b/tests/test_composition.py @@ -0,0 +1,474 @@ +"""Real Git/npm/Go fixtures for immutable product composition.""" +import hashlib +import json +import os +from pathlib import Path +import shutil +import subprocess +import sys +import tempfile +import unittest +import zipfile + + +SCRIPT = Path(__file__).resolve().parents[1] / "scripts/build-composition.py" +RDM_SCRIPTS = Path(os.environ.get("COMPOSITION_RDM_SOURCE", str(SCRIPT.parent.parent / ".migration/Agent-System-RDM"))) +LEGACY_PRODUCT = Path(__file__).resolve().parent / "fixtures/rdm-legacy-product.sh" + + +@unittest.skipUnless(all(shutil.which(c) for c in ("git", "go", "node", "npm")), "Git/Go/Node/npm required") +class CompositionTests(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory(prefix="composition-test-") + self.addCleanup(self.temp.cleanup) + self.base = Path(self.temp.name) + self.root = self.base / "dev" + self.backend = self.base / "backend" + self.frontend = self.base / "frontend" + self.out = self.base / "output" + self.env = os.environ.copy() + self.env.update(GOWORK="off", GOPROXY="off", GOSUMDB="off", GOTOOLCHAIN="local") + self.env.pop("GOFLAGS", None) + for repo in (self.root, self.backend, self.frontend): + repo.mkdir() + self.run_command(["git", "init", "-q", "-b", "main"], repo) + self.run_command(["git", "config", "user.email", "fixture@example.invalid"], repo) + self.run_command(["git", "config", "user.name", "Composition Fixture"], repo) + self.write(self.backend, "go.mod", "module example.com/backend\n\ngo 1.23\n") + self.write(self.backend, "web/dist/.gitkeep", "") + self.write(self.backend, "web/embed.go", '''package web +import "embed" +//go:embed all:dist +var Files embed.FS +func Page() string { b, _ := Files.ReadFile("dist/index.html"); return string(b) } +''') + self.write(self.backend, "cmd/agent-system/main.go", '''package main +import ("fmt"; "os"; "example.com/backend/web") +var version = "fixture-dev" +func main() { if len(os.Args)>1 && os.Args[1]=="version" {fmt.Print(version)} else {fmt.Print(web.Page())} } +''') + self.write(self.backend, "cmd/storage-migrate/main.go", '''package main +import "fmt" +func main() { fmt.Print("migration-tool") } +''') + self.write(self.backend, "web/embed_test.go", '''package web +import "testing" +func TestProduct(t *testing.T) { if Page() != "immutable-page" { t.Fatalf("unexpected page: %q", Page()) } } +''') + self.backend_sha = self.commit(self.backend) + self.write(self.frontend, "package.json", json.dumps({ + "name": "composition-fixture", "version": "1.0.0", "private": True, + "scripts": {"build": "node build.cjs", "test": "node test.cjs", "postinstall": "node -e \"process.exit(91)\""}, + })) + self.write(self.frontend, "build.cjs", '''const fs = require('node:fs'); +if (process.env.GITEA_TOKEN || process.env.SSH_AUTH_SOCK || process.env.GIT_CONFIG_COUNT) process.exit(90); +fs.mkdirSync('dist/assets', { recursive: true }); +fs.writeFileSync('dist/index.html', 'immutable-page'); +fs.writeFileSync('dist/assets/main.js', 'console.log("fixed")'); +''') + self.write(self.frontend, "test.cjs", '''const fs = require('node:fs'); +if (fs.readFileSync('dist/index.html', 'utf8') !== 'immutable-page') process.exit(92); +''') + self.run_command(["npm", "install", "--package-lock-only", "--ignore-scripts", "--no-audit", "--no-fund"], self.frontend) + self.frontend_sha = self.commit(self.frontend) + self.manifest = {"schema": 1, "components": [ + {"id": "Agent-System-Backend", "repo": str(self.backend), "path": ".workspace/Agent-System-Backend", "role": "application", "modules": [{"path": "example.com/backend", "directory": "."}], "target": "main"}, + {"id": "Agent-System-Frontend", "repo": str(self.frontend), "path": ".workspace/Agent-System-Frontend", "role": "application", "modules": [], "target": "main"}, + ]} + self.lock = {"schema": 1, "components": { + "Agent-System-Backend": {"commit": self.backend_sha}, + "Agent-System-Frontend": {"commit": self.frontend_sha}, + }} + self.save_inputs() + self.root_sha = self.commit(self.root) + + def write(self, repo, path, value): + destination = repo / path + destination.parent.mkdir(parents=True, exist_ok=True) + destination.write_text(value) + + def run_command(self, command, cwd=None, env=None, check=True): + result = subprocess.run(command, cwd=cwd, env=env or self.env, text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + if check: + self.assertEqual(result.returncode, 0, result.stdout) + return result + + def commit(self, repo): + self.run_command(["git", "add", "."], repo) + self.run_command(["git", "commit", "-qm", "Fixture"], repo) + return self.run_command(["git", "rev-parse", "HEAD"], repo).stdout.strip() + + def save_inputs(self): + self.write(self.root, "components.json", json.dumps(self.manifest)) + self.write(self.root, "components.lock.json", json.dumps(self.lock)) + + def compose(self, target="build", extra=(), env=None): + return self.run_command([sys.executable, "-B", str(SCRIPT), "--root", str(self.root), "--target", target, "--output", str(self.out), *extra], env=env, check=False) + + def test_fixed_commits_embed_assets_without_touching_developer_checkout(self): + # Reading working trees or allowing go.work/npm overlays would produce DIRTY or fail. + self.write(self.backend, "web/dist/index.html", "DIRTY") + self.write(self.backend, "cmd/agent-system/main.go", "invalid local Go") + self.write(self.frontend, "build.cjs", "throw new Error('dirty local frontend')") + self.write(self.root, "go.work", "invalid developer workspace") + self.write(self.root, ".workspace/Agent-System-Frontend/package.json", '{"dependencies":{"bad":"file:/missing"}}') + env = self.env | {"GITEA_TOKEN": "fixture-secret", "SSH_AUTH_SOCK": "/missing-agent", "GIT_CONFIG_COUNT": "1", "GIT_CONFIG_KEY_0": "credential.helper", "GIT_CONFIG_VALUE_0": "bad-helper"} + result = self.compose(env=env) + self.assertEqual(result.returncode, 0, result.stdout) + self.assertEqual(self.run_command([str(self.out / "agent-system")]).stdout, "immutable-page") + self.assertEqual(self.run_command([str(self.out / "storage-migrate")]).stdout, "migration-tool") + self.assertEqual((self.backend / "web/dist/index.html").read_text(), "DIRTY") + resolved = json.loads((self.out / "resolved-manifest.json").read_text()) + self.assertEqual(resolved["root"]["commit"], self.root_sha) + self.assertEqual(resolved["applications"]["Agent-System-Backend"]["commit"], self.backend_sha) + self.assertEqual(resolved["applications"]["Agent-System-Frontend"]["commit"], self.frontend_sha) + self.assertEqual(resolved["artifacts"]["agent-system"]["sha256"], hashlib.sha256((self.out / "agent-system").read_bytes()).hexdigest()) + self.assertEqual(resolved["go"]["backend"]["modules"][0]["Path"], "example.com/backend") + self.assertTrue(resolved["npm"]["lock_sha256"]) + self.assertTrue(resolved["frontend"]["sha256"]) + self.assertNotIn("fixture-secret", (self.out / "resolved-manifest.json").read_text()) + + def test_test_target_runs_real_frontend_and_go_tests(self): + result = self.compose("test") + self.assertEqual(result.returncode, 0, result.stdout) + self.assertIn("example.com/backend/web", result.stdout) + self.assertEqual(json.loads((self.out / "resolved-manifest.json").read_text())["target"], "test") + + def test_unused_transitive_zip_does_not_require_consumer_sum_rewrite(self): + proxy = self.base / "unused-proxy" + for name, mod, body in ( + ("unused", "module example.com/unused\n\ngo 1.16\n", "package unused\n"), + ("used", "module example.com/used\n\ngo 1.16\nrequire example.com/unused v1.0.0\n", "package used\nfunc Value() int { return 7 }\n"), + ): + directory = proxy / "example.com" / name / "@v" + directory.mkdir(parents=True) + (directory / "v1.0.0.mod").write_text(mod) + (directory / "v1.0.0.info").write_text('{"Version":"v1.0.0","Time":"2026-10-13T00:00:00Z"}') + (directory / "list").write_text("v1.0.0\n") + with zipfile.ZipFile(directory / "v1.0.0.zip", "w") as archive: + archive.writestr(f"example.com/{name}@v1.0.0/go.mod", mod) + archive.writestr(f"example.com/{name}@v1.0.0/value.go", body) + env = self.env | {"GOPROXY": proxy.as_uri(), "GOMODCACHE": str(self.base / "unused-cache")} + self.write(self.backend, "go.mod", "module example.com/backend\n\ngo 1.23\nrequire example.com/used v1.0.0\n") + self.write(self.backend, "web/value.go", 'package web\nimport "example.com/used"\nvar Value = used.Value()\n') + self.run_command(["go", "mod", "tidy"], self.backend, env=env) + sums = (self.backend / "go.sum").read_text() + self.assertNotIn("example.com/unused v1.0.0 h1:", sums) + self.lock["components"]["Agent-System-Backend"]["commit"] = self.commit(self.backend) + self.save_inputs() + self.commit(self.root) + result = self.compose(env=env) + self.assertEqual(result.returncode, 0, result.stdout) + self.assertEqual((self.backend / "go.sum").read_text(), sums) + graph = json.loads((self.out / "resolved-manifest.json").read_text())["go"]["backend"]["modules"] + self.assertIn("example.com/used", {module["Path"] for module in graph}) + + def test_developer_package_tarball_overrides_do_not_reach_formal_tests(self): + self.write(self.frontend, "test.cjs", "if (process.env.CONTRACTS_TARBALL || process.env.UI_TARBALL) process.exit(93)") + self.lock["components"]["Agent-System-Frontend"]["commit"] = self.commit(self.frontend) + self.save_inputs() + self.commit(self.root) + result = self.compose("test", env=self.env | {"CONTRACTS_TARBALL": "/tmp/dirty-contracts.tgz", "UI_TARBALL": "/tmp/dirty-ui.tgz"}) + self.assertEqual(result.returncode, 0, result.stdout) + + def test_test_target_checks_fixed_go_library_and_ui_sources(self): + library = self.base / "probe-library" + library.mkdir() + self.run_command(["git", "init", "-q", "-b", "main"], library) + self.run_command(["git", "config", "user.email", "fixture@example.invalid"], library) + self.run_command(["git", "config", "user.name", "Fixture"], library) + self.write(library, "go.mod", "module example.com/probe\n\ngo 1.23\n") + self.write(library, "probe.go", "package probe\nfunc Text() string { return \"\" }\n") + self.write(library, "probe_test.go", '''package probe +import ("testing"; "os") +func TestFixedLibrary(t *testing.T) { if err:=os.WriteFile(os.Getenv("COMPOSITION_GO_MARKER"), []byte("fixed-go-test"), 0600); err!=nil {t.Fatal(err)} } +''') + library_sha = self.commit(library) + version = "v0.0.0-" + self.run_command(["git", "show", "-s", "--format=%cd", "--date=format-local:%Y%m%d%H%M%S", library_sha], library).stdout.strip() + "-" + library_sha[:12] + proxy = self.base / "probe-proxy/example.com/probe/@v" + proxy.mkdir(parents=True) + (proxy / (version + ".mod")).write_text((library / "go.mod").read_text()) + (proxy / (version + ".info")).write_text(json.dumps({"Version": version, "Time": "2026-10-13T00:00:00Z", "Origin": {"VCS": "git", "URL": str(library), "Hash": library_sha}})) + (proxy / "list").write_text(version + "\n") + with zipfile.ZipFile(proxy / (version + ".zip"), "w") as archive: + for path in self.run_command(["git", "ls-files"], library).stdout.splitlines(): + archive.write(library / path, "example.com/probe@" + version + "/" + path) + self.write(self.backend, "go.mod", f"module example.com/backend\n\ngo 1.23\nrequire example.com/probe {version}\n") + self.write(self.backend, "web/probe.go", 'package web\nimport "example.com/probe"\nvar _ = probe.Text()\n') + env = self.env | {"GOPROXY": (self.base / "probe-proxy").as_uri(), "GOMODCACHE": str(self.base / "probe-cache"), + "COMPOSITION_GO_MARKER": str(self.base / "go-tested"), "COMPOSITION_UI_MARKER": str(self.base / "ui-tested")} + self.run_command(["go", "mod", "download", "all"], self.backend, env=env) + self.lock["components"]["Agent-System-Backend"]["commit"] = self.commit(self.backend) + self.write(library, "probe_test.go", "invalid dirty library tests") + ui = self.base / "ui" + ui.mkdir() + self.run_command(["git", "init", "-q", "-b", "main"], ui) + self.run_command(["git", "config", "user.email", "fixture@example.invalid"], ui) + self.run_command(["git", "config", "user.name", "Fixture"], ui) + self.write(ui, "package.json", json.dumps({"name": "@agent-system/ui", "version": "1.0.0", "scripts": {"test": "node test.cjs", "typecheck": "node -e \"process.exit(0)\""}})) + self.write(ui, "test.cjs", "require('node:fs').writeFileSync(process.env.COMPOSITION_UI_MARKER, 'fixed-ui-test')") + self.run_command(["npm", "install", "--package-lock-only", "--ignore-scripts", "--no-audit", "--no-fund"], ui) + ui_sha = self.commit(ui) + package = json.loads((self.frontend / "package.json").read_text()) + package["dependencies"] = {"@agent-system/ui": "git+" + ui.as_uri() + "#" + ui_sha} + self.write(self.frontend, "package.json", json.dumps(package)) + self.run_command(["npm", "install", "--package-lock-only", "--ignore-scripts", "--no-audit", "--no-fund"], self.frontend) + self.lock["components"]["Agent-System-Frontend"]["commit"] = self.commit(self.frontend) + self.write(ui, "test.cjs", "throw Error('dirty ui tests')") + self.manifest["components"].extend([ + {"id": "Probe", "repo": str(library), "path": ".workspace/Probe", "role": "go-library", "modules": [{"path": "example.com/probe", "directory": "."}], "target": "main"}, + {"id": "Agent-System-UI", "repo": ui.as_uri(), "path": ".workspace/Agent-System-UI", "role": "npm-library", "modules": [], "target": "main"}, + ]) + self.save_inputs() + self.commit(self.root) + result = self.compose("test", env=env) + self.assertEqual(result.returncode, 0, result.stdout) + self.assertTrue((self.base / "go-tested").is_file(), "resolved Go provider tests were not executed") + self.assertEqual((self.base / "go-tested").read_text(), "fixed-go-test") + self.assertTrue((self.base / "ui-tested").is_file(), "fixed npm UI provider tests were not executed") + self.assertEqual((self.base / "ui-tested").read_text(), "fixed-ui-test") + self.assertIn("go vet", result.stdout) + + def test_version_and_plugin_assets_come_from_committed_root(self): + self.write(self.root, "plugins/example/plugin.json", '{"name":"immutable-plugin"}') + self.root_sha = self.commit(self.root) + self.write(self.root, "plugins/example/plugin.json", '{"name":"dirty-plugin"}') + result = self.compose() + self.assertEqual(result.returncode, 0, result.stdout) + resolved = json.loads((self.out / "resolved-manifest.json").read_text()) + self.assertIn("version", resolved) + self.assertEqual(self.run_command([str(self.out / "agent-system"), "version"]).stdout, resolved["version"]) + self.assertIn(self.root_sha[:12], resolved["version"]) + self.assertIn(self.backend_sha[:12], resolved["version"]) + self.assertIn(self.frontend_sha[:12], resolved["version"]) + self.assertEqual((self.out / "plugins/example/plugin.json").read_text(), '{"name":"immutable-plugin"}') + self.assertTrue(resolved["assets"]["plugins"]["sha256"]) + + def test_npm_local_dependency_overlay_is_rejected(self): + lock = json.loads((self.frontend / "package-lock.json").read_text()) + lock["packages"]["node_modules/local"] = {"resolved": "file:../dirty"} + self.write(self.frontend, "package-lock.json", json.dumps(lock)) + self.lock["components"]["Agent-System-Frontend"]["commit"] = self.commit(self.frontend) + self.save_inputs() + self.commit(self.root) + result = self.compose() + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("local", result.stdout) + self.assertFalse((self.out / "agent-system").exists()) + + def test_frontend_dist_symlink_cannot_import_assets_from_outside_source(self): + external = self.base / "external-assets" + self.write(external, "index.html", "escaped-page") + self.write(external, "assets/main.js", "escaped-code") + self.write(self.frontend, "build.cjs", "require('node:fs').symlinkSync(" + json.dumps(str(external)) + ", 'dist', 'dir')") + self.lock["components"]["Agent-System-Frontend"]["commit"] = self.commit(self.frontend) + self.save_inputs() + self.commit(self.root) + result = self.compose() + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("symlink", result.stdout) + self.assertFalse((self.out / "agent-system").exists()) + + def test_project_test_mode_refuses_missing_boundary_gate(self): + self.write(self.root, "Makefile", "test-governance:\n\ttrue\n") + self.commit(self.root) + result = self.compose("test") + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("lint-boundaries", result.stdout) + + def test_fixed_root_governance_and_boundaries_receive_proven_source_map(self): + self.write(self.root, "Makefile", "test-governance:\n\tpython3 -B scripts/map-check.py governance\n") + self.write(self.root, "scripts/lint-boundaries.sh", "#!/bin/sh\npython3 -B scripts/map-check.py boundaries\n") + self.write(self.root, "scripts/check-pins.sh", "#!/bin/sh\npython3 -B scripts/map-check.py pins\n") + self.write(self.root, "scripts/map-check.py", '''import json, os, pathlib, sys +root = pathlib.Path.cwd() +assert not (root / '.git').exists(), 'gates must run from the immutable archive' +mapping = json.loads(pathlib.Path(os.environ['COMPOSITION_SOURCE_MAP']).read_text()) +lock = json.loads((root / 'components.lock.json').read_text()) +for name in ('Agent-System-Backend', 'Agent-System-Frontend'): + assert mapping['components'][name]['commit'] == lock['components'][name]['commit'] +assert (pathlib.Path(mapping['components']['Agent-System-Backend']['path']) / 'web/dist/index.html').read_text() == 'immutable-page' +with pathlib.Path(os.environ['COMPOSITION_GATE_MARKER']).open('a') as output: output.write(sys.argv[1]+'\\n') +''') + self.commit(self.root) + # Dirty gate code is excluded, just like dirty application code. + self.write(self.root, "scripts/map-check.py", "raise Exception('dirty governance')") + marker = self.base / "gates-run" + result = self.compose("test", extra=("--source-map", str(self.base / "source-map.json")), env=self.env | {"COMPOSITION_GATE_MARKER": str(marker)}) + self.assertEqual(result.returncode, 0, result.stdout) + self.assertEqual(marker.read_text(), "boundaries\npins\ngovernance\n") + self.assertEqual(json.loads((self.base / "source-map.json").read_text())["components"]["Agent-System-Backend"]["commit"], self.backend_sha) + + def test_missing_frontend_assets_fails_before_publishing_binary(self): + self.write(self.frontend, "build.cjs", "require('node:fs').mkdirSync('dist', {recursive:true});") + self.lock["components"]["Agent-System-Frontend"]["commit"] = self.commit(self.frontend) + self.save_inputs() + self.commit(self.root) + result = self.compose() + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("index.html", result.stdout) + self.assertFalse((self.out / "agent-system").exists()) + + def test_dirty_root_lock_is_rejected(self): + self.lock["components"]["Agent-System-Backend"]["commit"] = "a" * 40 + self.save_inputs() + result = self.compose() + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("committed", result.stdout) + + def test_locked_missing_revision_is_rejected(self): + self.lock["components"]["Agent-System-Backend"]["commit"] = "a" * 40 + self.save_inputs() + self.commit(self.root) + result = self.compose() + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertFalse((self.out / "agent-system").exists()) + + def test_source_path_escape_is_rejected(self): + self.manifest["components"][0]["path"] = "../outside" + self.save_inputs() + self.commit(self.root) + result = self.compose() + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("path", result.stdout) + + def test_local_go_replace_is_rejected(self): + self.write(self.backend, "go.mod", "module example.com/backend\n\ngo 1.23\nreplace example.com/dirty => /missing/local\n") + self.lock["components"]["Agent-System-Backend"]["commit"] = self.commit(self.backend) + self.save_inputs() + self.commit(self.root) + result = self.compose() + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("replace", result.stdout) + + def test_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache(self): + rdm = self.base / "rdm" + rdm.mkdir() + self.run_command(["git", "init", "-q", "-b", "main"], rdm) + self.run_command(["git", "config", "user.email", "fixture@example.invalid"], rdm) + self.run_command(["git", "config", "user.name", "Fixture"], rdm) + version = "v0.0.0-" + self.run_command(["git", "show", "-s", "--format=%cd", "--date=format-local:%Y%m%d%H%M%S", self.backend_sha], self.backend).stdout.strip() + "-" + self.backend_sha[:12] + proxy = self.base / "proxy/example.com/backend/@v" + proxy.mkdir(parents=True) + (proxy / (version + ".mod")).write_text((self.backend / "go.mod").read_text()) + (proxy / (version + ".info")).write_text(json.dumps({"Version": version, "Time": "2026-10-13T00:00:00Z"})) + (proxy / "list").write_text(version + "\n") + with zipfile.ZipFile(proxy / (version + ".zip"), "w") as archive: + paths = self.run_command(["git", "ls-files"], self.backend).stdout.splitlines() + for path in paths: + archive.write(self.backend / path, "example.com/backend@" + version + "/" + path) + self.write(rdm, "go.mod", f"module example.com/rdm\n\ngo 1.23\nrequire example.com/backend {version}\n") + self.write(rdm, "main.go", 'package main\nimport ("fmt"; "example.com/backend/web")\nfunc main() { fmt.Print(web.Page()) }\n') + module_cache = self.base / "module-cache" + env = self.env | {"GOPROXY": (self.base / "proxy").as_uri(), "GOMODCACHE": str(module_cache)} + self.run_command(["go", "mod", "download", "all"], rdm, env=env) + rdm_sha = self.commit(rdm) + cached_asset = module_cache / ("example.com/backend@" + version) / "web/dist/.gitkeep" + self.assertTrue(cached_asset.exists()) + result = self.compose(extra=("--rdm-source", str(rdm)), env=env) + self.assertEqual(result.returncode, 0, result.stdout) + self.assertEqual(self.run_command([str(self.out / "agent-system-rdm-product")]).stdout, "immutable-page") + self.assertFalse(cached_asset.with_name("index.html").exists()) + resolved = json.loads((self.out / "resolved-manifest.json").read_text()) + self.assertEqual(resolved["applications"]["Agent-System-RDM"]["commit"], rdm_sha) + self.assertTrue(resolved["go"]["rdm"]["vendor_modules_sha256"]) + self.assertTrue(resolved["go"]["rdm"]["vendor_backend_source_sha256"]) + self.assertEqual(resolved["go"]["rdm"]["modules"][1]["Version"], version) + + @unittest.skipUnless((RDM_SCRIPTS / "scripts/build-product.sh").is_file(), "external RDM source was not supplied; host must replay the actual wrapper") + def test_versioned_rdm_product_entry_uses_fixed_composer(self): + # Reuse the real module fixture first; its independent embed test remains + # mandatory even when an external RDM wrapper is unavailable. + self.test_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache() + rdm = self.base / "rdm" + version = self.run_command(["go", "list", "-m", "-f", "{{.Version}}", "example.com/backend"], rdm, + env=self.env | {"GOPROXY": (self.base / "proxy").as_uri(), "GOMODCACHE": str(self.base / "module-cache")}).stdout.strip() + env = self.env | {"GOPROXY": (self.base / "proxy").as_uri(), "GOMODCACHE": str(self.base / "module-cache")} + + # The versioned RDM entry invokes the same fixed Dev composer, even when + # local RDM Go source is dirty. No API-only fallback is allowed. + self.write(rdm, "go.mod", f"module git-ssh.u1680832.nyat.app/weichen/Agent-System-RDM.git\n\ngo 1.23\nrequire example.com/backend {version}\n") + shutil.copy2(RDM_SCRIPTS / "Makefile", rdm / "Makefile") + (rdm / "scripts").mkdir() + shutil.copy2(RDM_SCRIPTS / "scripts/build-product.sh", rdm / "scripts/build-product.sh") + self.commit(rdm) + self.write(rdm, "main.go", "invalid local RDM") + (self.root / "scripts/workspace").mkdir(parents=True) + shutil.copy2(SCRIPT, self.root / "scripts/build-composition.py") + shutil.copy2(SCRIPT.parent / "workspace/transport.py", self.root / "scripts/workspace/transport.py") + self.commit(self.root) + result = self.run_command(["make", "product", "COMPOSITION_ROOT=" + str(self.root)], rdm, env=env, check=False) + self.assertEqual(result.returncode, 0, result.stdout) + self.assertEqual(self.run_command([str(rdm / "bin/agent-system-rdm-product")]).stdout, "immutable-page") + self.assertTrue((rdm / "bin/agent-system-admin").exists()) + self.assertEqual(json.loads((rdm / "bin/PRODUCT_MANIFEST.json").read_text())["kind"], "agent-system-composition/1") + + def test_modified_go_module_cache_is_rejected_before_product_publication(self): + self.test_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache() + cached = next((self.base / "module-cache/example.com").glob("backend@*/web/embed.go")) + cached.chmod(0o644) + cached.write_text(cached.read_text() + "\n// unauthorized cache mutation\n") + result = self.compose(extra=("--rdm-source", str(self.base / "rdm")), + env=self.env | {"GOPROXY": (self.base / "proxy").as_uri(), "GOMODCACHE": str(self.base / "module-cache")}) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("modified", result.stdout) + + def test_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock(self): + self.test_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache() + selected_embed = (self.backend / "web/embed.go").read_text().replace("return string(b)", 'return "selected-rdm:" + string(b)') + self.write(self.backend, "web/embed.go", selected_embed) + selected_sha = self.commit(self.backend) + selected_version = "v0.0.0-" + self.run_command(["git", "show", "-s", "--format=%cd", "--date=format-local:%Y%m%d%H%M%S", selected_sha], self.backend).stdout.strip() + "-" + selected_sha[:12] + proxy = self.base / "proxy/example.com/backend/@v" + (proxy / (selected_version + ".mod")).write_text((self.backend / "go.mod").read_text()) + (proxy / (selected_version + ".info")).write_text(json.dumps({"Version": selected_version, "Time": "2026-10-13T00:00:00Z", "Origin": {"VCS": "git", "URL": str(self.backend), "Hash": selected_sha}})) + with zipfile.ZipFile(proxy / (selected_version + ".zip"), "w") as archive: + for path in self.run_command(["git", "ls-files"], self.backend).stdout.splitlines(): + archive.write(self.backend / path, "example.com/backend@" + selected_version + "/" + path) + rdm = self.base / "rdm" + self.write(rdm, "go.mod", f"module example.com/rdm\n\ngo 1.23\nrequire example.com/backend {selected_version}\n") + env = self.env | {"GOPROXY": (self.base / "proxy").as_uri(), "GOMODCACHE": str(self.base / "module-cache")} + self.run_command(["go", "mod", "download", "all"], rdm, env=env) + self.commit(rdm) + result = self.compose(extra=("--rdm-source", str(rdm)), env=env) + self.assertEqual(result.returncode, 0, result.stdout) + self.assertEqual(self.run_command([str(self.out / "agent-system")]).stdout, "immutable-page") + self.assertEqual(self.run_command([str(self.out / "agent-system-rdm-product")]).stdout, "selected-rdm:immutable-page") + self.assertEqual(self.run_command([str(self.out / "agent-system-admin")]).stdout, "selected-rdm:immutable-page") + resolved = json.loads((self.out / "resolved-manifest.json").read_text()) + self.assertEqual(resolved["applications"]["Agent-System-Backend"]["commit"], self.backend_sha) + self.assertEqual(resolved["go"]["rdm"]["backend_source"]["commit"], selected_sha) + self.assertEqual(resolved["go"]["rdm"]["backend_source"]["version"], selected_version) + admin_version = self.run_command([str(self.out / "agent-system-admin"), "version"]).stdout + self.assertEqual(admin_version, resolved["go"]["rdm"]["admin_version"]) + self.assertIn(selected_sha[:12], admin_version) + self.assertFalse((self.base / "module-cache/example.com" / ("backend@" + selected_version) / "web/dist/index.html").exists()) + + def test_historical_rdm_product_still_builds_from_legacy_pins(self): + rdm = self.base / "legacy-rdm" + rdm.mkdir() + self.run_command(["git", "init", "-q", "-b", "main"], rdm) + self.run_command(["git", "config", "user.email", "fixture@example.invalid"], rdm) + self.run_command(["git", "config", "user.name", "Fixture"], rdm) + self.write(rdm, "go.mod", "module legacy-rdm\n\ngo 1.23\nrequire example.com/backend v0.0.0\nreplace example.com/backend => ./pins/agent-system-backend\n") + self.write(rdm, "main.go", 'package main\nimport ("fmt"; "example.com/backend/web")\nfunc main() { fmt.Print(web.Page()) }\n') + (rdm / "scripts").mkdir() + shutil.copy2(LEGACY_PRODUCT, rdm / "scripts/build-product.sh") + self.commit(rdm) + pins = rdm / "pins" + pins.mkdir() + for name, source in (("agent-system-backend", self.backend), ("agent-system-frontend", self.frontend), ("agent-system-ui", self.frontend)): + self.run_command(["git", "clone", "-q", str(source), str(pins / name)]) + for name in ("agent-system-frontend", "agent-system-ui"): + package = json.loads((pins / name / "package.json").read_text()) + del package["scripts"]["postinstall"] + self.write(pins / name, "package.json", json.dumps(package)) + self.run_command(["npm", "install", "--package-lock-only", "--ignore-scripts", "--no-audit", "--no-fund"], pins / name) + result = self.run_command(["bash", "scripts/build-product.sh"], rdm, check=False) + self.assertEqual(result.returncode, 0, result.stdout) + self.assertEqual(self.run_command([str(rdm / "bin/agent-system-rdm-product")]).stdout, "immutable-page") + self.assertEqual(json.loads((rdm / "bin/PRODUCT_MANIFEST.json").read_text())["kind"], "rdm-product/1") + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_dependency_ci.py b/tests/test_dependency_ci.py new file mode 100644 index 00000000..bddd4228 --- /dev/null +++ b/tests/test_dependency_ci.py @@ -0,0 +1,286 @@ +"""Replay trusted workflow phases with real Git, Go, npm and disposable HTTP repos.""" +import json +import os +from pathlib import Path +import subprocess +import textwrap +import unittest + +from tests import test_ci_credentials as fixture + +ROOT_TOKEN, SUB_TOKEN, SSH, WORKFLOW = fixture.ROOT_TOKEN, fixture.SUB_TOKEN, fixture.SSH, fixture.WORKFLOW + +MODULE = "git-ssh.u1680832.nyat.app/weichen/Logging-System.git" +MIGRATION = WORKFLOW.parents[2] / ".migration" + + +def phase(workflow, name): + return fixture.workflow_script(workflow, name) + + +class DependencyCITests(unittest.TestCase): + setUp = fixture.CheckoutTests.setUp + git = fixture.CheckoutTests.git + publish = fixture.CheckoutTests.publish + run_checkout = fixture.CheckoutTests.run_checkout + + def run_phase(self, name, directory=None, workflow=WORKFLOW, extra=None, after=""): + env = self.env | {"SUBMODULE_TOKEN": SUB_TOKEN, "GITHUB_SERVER_URL": self.url, + "GITHUB_REPOSITORY": "weichen/Agent-System-Dev", + "GOCACHE": str(self.base / "gocache"), + "GOMODCACHE": str(self.base / "gomodcache"), + "npm_config_cache": str(self.base / "npm-cache")} + return subprocess.run(["bash", "-c", phase(workflow, name) + "\n" + after], + cwd=directory or self.checkout, env=env | (extra or {}), + capture_output=True, text=True, timeout=60) + + def commit_fixture(self, name, files): + sha = self.publish(name) + source = self.base / name + for path, content in files.items(): + dest = source / path + dest.parent.mkdir(parents=True, exist_ok=True) + dest.write_text(content) + self.git(source, "add", ".") + subprocess.run(["git", "-C", str(source), "-c", "user.name=Fixture", + "-c", "user.email=fixture@example.invalid", "commit", "-q", "-m", "Package"], + env=self.env | {"GIT_AUTHOR_DATE": "2026-01-02T03:04:05Z", + "GIT_COMMITTER_DATE": "2026-01-02T03:04:05Z"}, check=True) + sha = self.git(source, "rev-parse", "HEAD") + self.git(source, "push", "-q", str(self.published / "weichen" / (name + ".git")), "main") + return sha + + def fixture_checksums(self, module, sha): + """Use Go's checksum algorithm on a local fixture, outside the cache under test.""" + directory = self.base / "checksum-fixture" + directory.mkdir() + version = "v0.0.0-20260102030405-" + sha[:12] + (directory / "go.mod").write_text(f"module checksumfixture\n\ngo 1.25\nrequire {module} {version}\n") + repo = self.published / "weichen/Logging-System.git" + env = self.env | {"GOWORK": "off", "GOTOOLCHAIN": "local", "GOENV": "off", "GOFLAGS": "", + "GOPROXY": "off", "GOSUMDB": "off", "GOMODCACHE": str(self.base / "checksum-cache"), + "GOPRIVATE": "git-ssh.u1680832.nyat.app/weichen", "GONOPROXY": "git-ssh.u1680832.nyat.app/weichen", + "GIT_CONFIG_GLOBAL": "/dev/null", "GIT_CONFIG_COUNT": "3", + "GIT_CONFIG_KEY_0": "protocol.file.allow", "GIT_CONFIG_VALUE_0": "always", + "GIT_CONFIG_KEY_1": "url." + repo.as_uri() + ".insteadOf", + "GIT_CONFIG_VALUE_1": "https://git-ssh.u1680832.nyat.app/weichen/Logging-System", + "GIT_CONFIG_KEY_2": "core.hooksPath", "GIT_CONFIG_VALUE_2": "/dev/null"} + result = subprocess.run(["go", "mod", "download", "-json"], cwd=directory, env=env, + capture_output=True, text=True, check=True) + info = json.loads(result.stdout) + return f"{module} {version} {info['Sum']}\n{module} {version}/go.mod {info['GoModSum']}\n" + + def test_registered_application_lock_materializes_fixed_source(self): + backend = self.publish("Agent-System-Backend") + root = self.commit_fixture("Agent-System-Dev", { + "components.json": json.dumps({"schema": 1, "components": [{ + "id": "Agent-System-Backend", "repo": SSH + "Agent-System-Backend.git", + "path": ".workspace/Agent-System-Backend", "role": "application", "modules": []}, { + "id": "Agent-System-UI", "repo": SSH + "Agent-System-UI.git", + "path": ".workspace/Agent-System-UI", "role": "npm-library", "modules": []}]}), + "components.lock.json": json.dumps({"schema": 1, "components": { + "Agent-System-Backend": {"commit": backend}}})}) + result = self.run_checkout(root) + self.assertEqual(result.returncode, 0, result.stderr) + self.assertTrue((self.checkout / ".workspace/Agent-System-Backend/.git").exists(), + "versioned application source was not materialized") + self.assertEqual(self.git(self.checkout / ".workspace/Agent-System-Backend", "rev-parse", "HEAD"), backend) + self.assertEqual(self.git(self.checkout / ".workspace/Agent-System-Backend", "config", "remote.origin.url"), + SSH + "Agent-System-Backend.git") + + def test_unregistered_source_lock_is_rejected_before_component_fetch(self): + root = self.commit_fixture("Agent-System-Dev", { + "components.json": json.dumps({"schema": 1, "components": [{ + "id": "Agent-System-Backend", "repo": self.url + "/untrusted/receiver", + "path": ".workspace/Agent-System-Backend", "role": "application", "modules": []}]}), + "components.lock.json": json.dumps({"schema": 1, "components": { + "Agent-System-Backend": {"commit": "a" * 40}}})}) + result = self.run_checkout(root) + self.assertNotEqual(result.returncode, 0, "untrusted manifest was accepted") + self.assertFalse(any("Backend" in path or "untrusted" in path for path, _ in self.requests)) + + def test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain(self): + sha = self.commit_fixture("Logging-System", { + "go.mod": f"module {MODULE}\n\ngo 1.25\n", "logging.go": "package logging\nconst Value = 42\n"}) + (self.checkout / "go.mod").write_text( + f"module fixture\n\ngo 1.25\n\nrequire {MODULE} v0.0.0-20260102030405-{sha[:12]}\n") + (self.checkout / "go.sum").write_text(self.fixture_checksums(MODULE, sha)) + (self.checkout / "probe.go").write_text(f'package fixture\nimport logging "{MODULE}"\nvar Value = logging.Value\n') + result = self.run_phase("Prefetch Go modules without executing candidate code", + extra={"GOTOOLCHAIN": "auto", "GIT_TRACE": "1"}) + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + self.assertTrue(self.requests) + for path, auth in self.requests: + self.assertRegex(path, r"^/weichen/Logging-System\.git/") + self.assertEqual(auth, "token " + SUB_TOKEN) + self.assertNotIn(SUB_TOKEN, result.stdout + result.stderr) + tested = subprocess.run(["go", "test", "./..."], cwd=self.checkout, + env=self.env | {"GOTOOLCHAIN": "local", "GOWORK": "off", "GOPROXY": "off", + "GOSUMDB": "off", "GOMODCACHE": str(self.base / "gomodcache"), + "GOCACHE": str(self.base / "gocache")}, capture_output=True, text=True) + self.assertEqual(tested.returncode, 0, tested.stdout + tested.stderr) + for config in self.base.rglob("config"): + if config.is_file(): + self.assertNotIn(SUB_TOKEN, config.read_text(errors="replace")) + + def test_unregistered_go_module_rejected_before_authenticated_request(self): + (self.checkout / "go.mod").write_text( + "module fixture\n\ngo 1.25\nrequire git-ssh.u1680832.nyat.app/weichen/Unlisted.git v1.0.0\n") + result = self.run_phase("Prefetch Go modules without executing candidate code") + self.assertNotEqual(result.returncode, 0) + self.assertFalse(self.requests) + + def test_npm_git_package_installs_committed_output_without_prepare(self): + marker = self.base / "prepare-ran" + sha = self.commit_fixture("Agent-System-Core", { + "package.json": json.dumps({"name": "@agent-system/contracts", "version": "1.0.0", + "files": ["package"], "main": "package/index.js"}), + "package/index.js": "module.exports = {value: 42}\n"}) + spec = "git+" + SSH + "Agent-System-Core.git#" + sha + (self.checkout / "package.json").write_text(json.dumps({"name": "fixture", "version": "1.0.0", + "dependencies": {"@agent-system/contracts": spec}, + "scripts": {"postinstall": f"touch '{marker}'"}})) + (self.checkout / "package-lock.json").write_text(json.dumps({"name": "fixture", "version": "1.0.0", + "lockfileVersion": 3, "requires": True, "packages": {"": {"name": "fixture", "version": "1.0.0", + "dependencies": {"@agent-system/contracts": spec}}, "node_modules/@agent-system/contracts": { + "version": "1.0.0", "resolved": spec}}})) + result = self.run_phase("Prefetch npm packages without lifecycle scripts") + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + self.assertFalse(marker.exists(), "candidate lifecycle ran while credential config was present") + consumer = subprocess.run(["node", "-e", "if(require('@agent-system/contracts').value !== 42)process.exit(1)"], + cwd=self.checkout, env=self.env, capture_output=True, text=True) + self.assertEqual(consumer.returncode, 0, consumer.stderr) + self.assertNotIn(SUB_TOKEN, result.stdout + result.stderr) + for path, auth in self.requests: + self.assertRegex(path, r"^/weichen/Agent-System-Core\.git/") + self.assertEqual(auth, "token " + SUB_TOKEN) + + def test_npm_provider_prepare_is_rejected_without_execution(self): + marker = self.base / "prepare-ran" + sha = self.commit_fixture("Agent-System-Core", { + "package.json": json.dumps({"name": "@agent-system/contracts", "version": "1.0.0", + "files": ["package"], "scripts": {"prepare": f"touch '{marker}'"}}), + "package/index.js": "module.exports = {value: 42}\n"}) + spec = "git+" + SSH + "Agent-System-Core.git#" + sha + (self.checkout / "package.json").write_text(json.dumps({"name": "fixture", "dependencies": {"contracts": spec}})) + (self.checkout / "package-lock.json").write_text(json.dumps({"lockfileVersion": 3, + "packages": {"node_modules/contracts": {"resolved": spec}}})) + result = self.run_phase("Prefetch npm packages without lifecycle scripts") + self.assertNotEqual(result.returncode, 0) + self.assertIn("without acquisition lifecycle", result.stderr) + self.assertFalse(marker.exists()) + + def test_external_npm_git_source_rejected_before_authenticated_request(self): + spec = self.url + "/untrusted/receiver.git#" + "a" * 40 + (self.checkout / "package.json").write_text(json.dumps({"name": "fixture", "dependencies": {"evil": "git+" + spec}})) + (self.checkout / "package-lock.json").write_text(json.dumps({"lockfileVersion": 3, + "packages": {"node_modules/evil": {"resolved": "git+" + spec}}})) + result = self.run_phase("Prefetch npm packages without lifecycle scripts") + self.assertNotEqual(result.returncode, 0) + self.assertFalse(self.requests) + + def test_component_checkout_removes_tokens_before_candidate_executes(self): + for repo in ("Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", "Agent-Intent", + "Agent-Command", "Agent-Squad", "Agent-System-Backend", "Agent-System-UI", + "Agent-System-Frontend", "Agent-System-RDM"): + with self.subTest(repo=repo): + sha = self.publish(repo) + self.checkout = self.base / (repo + "-checkout") + self.checkout.mkdir() + result = self.run_phase("Checkout", workflow=MIGRATION / repo / ".gitea/workflows/ci.yml", + extra={"TOKEN": ROOT_TOKEN, "GITHUB_SHA": sha, "GITHUB_REPOSITORY": "weichen/" + repo}, + after="python3 probe.py") + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + + def test_go_requirement_for_new_toolchain_fails_without_downloading_one(self): + (self.checkout / "go.mod").write_text("module fixture\n\ngo 99.0\n") + result = self.run_phase("Prefetch Go modules without executing candidate code", extra={"GOTOOLCHAIN": "auto"}) + self.assertNotEqual(result.returncode, 0) + self.assertFalse(self.requests) + self.assertIn("GOTOOLCHAIN=local", result.stderr) + + def test_npm_nonregistry_tarball_rejected_before_request(self): + spec = self.url + "/untrusted/payload.tgz" + (self.checkout / "package.json").write_text(json.dumps({"name": "fixture", "dependencies": {"evil": spec}})) + (self.checkout / "package-lock.json").write_text(json.dumps({"lockfileVersion": 3, + "packages": {"node_modules/evil": {"resolved": spec}}})) + result = self.run_phase("Prefetch npm packages without lifecycle scripts") + self.assertNotEqual(result.returncode, 0) + self.assertFalse(self.requests, "candidate tarball source was contacted") + + def test_component_ci_executes_nested_go_module_tests(self): + (self.checkout / "go.mod").write_text("module fixture\n\ngo 1.25\n") + (self.checkout / "main.go").write_text("package fixture\nconst Value = 42\n") + (self.checkout / ".ci-mirrors.env").write_text("export GOTOOLCHAIN=local GOWORK=off GOENV=off\n") + for repo, suffix in (("Logging-System", "examples/trace"), ("Agent-Squad", "adapters/native")): + with self.subTest(repo=repo): + directory = self.checkout / suffix + directory.mkdir(parents=True, exist_ok=True) + (directory / "go.mod").write_text("module nestedfixture\n\ngo 1.25\n") + (directory / "regression_test.go").write_text( + 'package nestedfixture\nimport "testing"\nfunc TestNested(t *testing.T) {t.Fatal("intentional nested regression")}\n') + lines = (MIGRATION / repo / ".gitea/workflows/ci.yml").read_text().splitlines() + command = next(i for i, line in enumerate(lines) if "go vet" in line) + start = max(i for i in range(command) if lines[i].strip().endswith("run: |")) + 1 + end = next((i for i in range(start, len(lines)) + if lines[i].strip() and not lines[i].startswith(" ")), len(lines)) + script = textwrap.dedent("\n".join(lines[start:end])) + result = subprocess.run(["bash", "-c", script], cwd=self.checkout, env=self.env, + capture_output=True, text=True, timeout=60) + self.assertNotEqual(result.returncode, 0, "nested regression was skipped by component CI") + self.assertIn("intentional nested regression", result.stdout + result.stderr) + + def test_go_prefetch_covers_logging_trace_module(self): + sha = self.commit_fixture("Logging-System", { + "go.mod": f"module {MODULE}\n\ngo 1.25\n", "logging.go": "package logging\nconst Value = 42\n"}) + (self.checkout / "go.mod").write_text("module fixture\n\ngo 1.25\n") + example = self.checkout / "examples/trace" + example.mkdir(parents=True) + (example / "go.mod").write_text( + f"module tracefixture\n\ngo 1.27\n\nrequire {MODULE} v0.0.0-20260102030405-{sha[:12]}\n") + (example / "go.sum").write_text(self.fixture_checksums(MODULE, sha)) + before = (example / "go.sum").read_bytes() + result = self.run_phase("Prefetch Go modules without executing candidate code", + workflow=MIGRATION / "Logging-System/.gitea/workflows/ci.yml") + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + self.assertTrue(self.requests, "trace module's private requirement was not prefetched") + self.assertEqual((example / "go.sum").read_bytes(), before, "Go 1.27 prefetch pruned source checksums") + + def test_go_prefetch_rejects_mutation_of_committed_checksums(self): + sha = self.commit_fixture("Logging-System", { + "go.mod": f"module {MODULE}\n\ngo 1.25\n", "logging.go": "package logging\nconst Value = 42\n"}) + (self.checkout / "go.mod").write_text( + f"module fixture\n\ngo 1.25\n\nrequire {MODULE} v0.0.0-20260102030405-{sha[:12]}\n") + (self.checkout / "go.sum").write_text("") + result = self.run_phase("Prefetch Go modules without executing candidate code") + self.assertNotEqual(result.returncode, 0, "private acquisition silently rewrote committed checksums") + self.assertTrue("modified a committed Go dependency file" in result.stderr or "missing go.sum" in result.stderr, + result.stderr) + + def test_rdm_composition_lock_fetches_fixed_dev_without_executing_code(self): + dev = self.commit_fixture("Agent-System-Dev", {"should-not-run.py": "raise RuntimeError('candidate executed')\n"}) + (self.checkout / "composition.dev.json").write_text(json.dumps({ + "schema": 1, "repo": SSH + "Agent-System-Dev.git", "commit": dev})) + result = self.run_phase("Prefetch fixed Dev product composition", + workflow=MIGRATION / "Agent-System-RDM/.gitea/workflows/ci.yml") + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + self.assertEqual(self.git(self.checkout / ".ci-composition-dev", "rev-parse", "HEAD"), dev) + for path, auth in self.requests: + self.assertRegex(path, r"^/weichen/Agent-System-Dev\.git/") + self.assertEqual(auth, "token " + SUB_TOKEN) + self.assertNotIn(SUB_TOKEN, result.stdout + result.stderr) + + def test_rdm_composition_lock_rejects_external_missing_and_malformed_commits(self): + for lock in ({"schema": 1, "repo": self.url + "/untrusted/receiver", "commit": "a" * 40}, + {"schema": 1, "repo": SSH + "Agent-System-Dev.git"}, + {"schema": 1, "repo": SSH + "Agent-System-Dev.git", "commit": "main"}): + with self.subTest(lock=lock): + (self.checkout / "composition.dev.json").write_text(json.dumps(lock)) + result = self.run_phase("Prefetch fixed Dev product composition", + workflow=MIGRATION / "Agent-System-RDM/.gitea/workflows/ci.yml") + self.assertNotEqual(result.returncode, 0) + self.assertFalse(self.requests) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_svc_build_cutover.py b/tests/test_svc_build_cutover.py new file mode 100644 index 00000000..dbf2fb5d --- /dev/null +++ b/tests/test_svc_build_cutover.py @@ -0,0 +1,138 @@ +"""Source adapters exercise real Git/Go/npm builds without starting services.""" +import json +import os +from pathlib import Path +import shutil +import subprocess +import unittest +import zipfile +import test_composition + +SOURCE = Path(__file__).resolve().parents[1] + + +@unittest.skipUnless(all(shutil.which(command) for command in ("git", "go", "node", "npm")), "Git/Go/Node/npm required") +class SvcBuildCutoverTests(unittest.TestCase): + def setUp(self): + self.fixture = test_composition.CompositionTests(methodName="runTest") + self.fixture.setUp() + self.addCleanup(self.fixture.doCleanups) + self.base, self.root, self.env = self.fixture.base, self.fixture.root, self.fixture.env + self.env = self.env.copy() + for key in ("COMPOSITION_ROOT", "DEV_ROOT", "COMPOSITION_SOURCE_MAP"): + self.env.pop(key, None) + (self.root / "scripts/workspace").mkdir(parents=True) + shutil.copy2(SOURCE / "scripts/build-composition.py", self.root / "scripts/build-composition.py") + shutil.copy2(SOURCE / "scripts/workspace/transport.py", self.root / "scripts/workspace/transport.py") + (self.root / ".gitignore").write_text("bin/\nprivate/\n") + (self.root / "Makefile").write_text("build frontend:\n\tpython3 scripts/build-composition.py --root . --target $@\n") + self.sha = self.fixture.commit(self.root) + self.cache = self.base / "cache" + self.call(self.base, "git", "clone", str(self.root), str(self.cache)) + self.runtime = self.base / "runtime" + self.runtime.mkdir() + wrappers = self.base / "tools" + wrappers.mkdir() + git = shutil.which("git") + (wrappers / "git").write_text('#!/usr/bin/env bash\nfor arg in "$@"; do if [ "$arg" = submodule ]; then echo "recursive submodule acquisition forbidden" >&2; exit 63; fi; done\nexec ' + git + ' "$@"\n') + (wrappers / "git").chmod(0o755) + self.env["PATH"] = str(wrappers) + os.pathsep + self.env["PATH"] + + def call(self, cwd, *args, check=True, env=None): + result = subprocess.run(args, cwd=cwd, env=env or self.env, text=True, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, timeout=120) + if check: + self.assertEqual(result.returncode, 0, result.stdout) + return result + + def adapter(self, commands, check=True, env=None): + code = 'source "$1"\nROOT="$2"; SRC_DIR="$3"; RUNTIME="$4"; ENV_NAME=fixture\n' + commands + return self.call(self.base, "bash", "-c", code, "cutover", str(SOURCE / "scripts/svc.sh"), str(self.root), str(self.cache), str(self.runtime), check=check, env=env) + + def test_versioned_dev_materialization_uses_composer_without_submodules(self): + self.adapter('materialize_dev_commit "' + self.sha + '" dev build') + binary = self.runtime / ".worktrees/dev/bin/agent-system" + self.assertEqual(self.call(self.base, str(binary)).stdout, "immutable-page") + resolved = json.loads((binary.parent / "resolved-manifest.json").read_text()) + self.assertEqual(resolved["root"]["commit"], self.sha) + + def test_versioned_static_adapter_resolves_published_frontend_artifact(self): + self.adapter('wt=$(materialize_dev_commit "' + self.sha + '" frontend frontend)\nsvc_frontend_dist "$wt"') + dist = self.runtime / ".worktrees/frontend/bin/frontend-dist" + self.assertEqual((dist / "index.html").read_text(), "immutable-page") + + def test_mismatched_existing_cache_is_rejected_before_candidate_build(self): + path = self.runtime / ".worktrees/reused" + self.call(self.base, "git", "-C", str(self.cache), "worktree", "add", "--detach", str(path), self.sha) + (self.root / "new-marker").write_text("new candidate\n") + new_sha = self.fixture.commit(self.root) + self.call(self.base, "git", "-C", str(self.cache), "fetch", "origin") + result = self.adapter('materialize_dev_commit "' + new_sha + '" reused build', check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertEqual(self.call(path, "git", "rev-parse", "HEAD").stdout.strip(), self.sha) + self.assertFalse((path / "bin").exists()) + + def test_cache_recycling_preserves_ignored_unique_files(self): + path = self.runtime / ".worktrees/unique" + self.call(self.base, "git", "-C", str(self.cache), "worktree", "add", "--detach", str(path), self.sha) + (path / "private").mkdir() + (path / "private/unique").write_text("owner data\n") + self.adapter('recycle_worktree unique') + self.assertTrue((path / "private/unique").is_file()) + self.assertEqual((path / "private/unique").read_text(), "owner data\n") + + def test_versioned_rdm_adapter_passes_fixed_dev_root_to_product_wrapper(self): + rdm = self.base / "rdm" + rdm.mkdir() + self.call(rdm, "git", "init", "-q", "-b", "main") + self.call(rdm, "git", "config", "user.email", "fixture@example.invalid") + self.call(rdm, "git", "config", "user.name", "Fixture") + version = "v0.0.0-" + self.call(self.fixture.backend, "git", "show", "-s", "--format=%cd", "--date=format-local:%Y%m%d%H%M%S", self.fixture.backend_sha).stdout.strip() + "-" + self.fixture.backend_sha[:12] + proxy = self.base / "proxy/example.com/backend/@v" + proxy.mkdir(parents=True) + (proxy / (version + ".mod")).write_text((self.fixture.backend / "go.mod").read_text()) + (proxy / (version + ".info")).write_text(json.dumps({"Version": version, "Time": "2026-10-13T00:00:00Z"})) + (proxy / "list").write_text(version + "\n") + with zipfile.ZipFile(proxy / (version + ".zip"), "w") as archive: + for relative in self.call(self.fixture.backend, "git", "ls-files").stdout.splitlines(): + archive.write(self.fixture.backend / relative, "example.com/backend@" + version + "/" + relative) + (rdm / "go.mod").write_text("module git-ssh.u1680832.nyat.app/weichen/Agent-System-RDM.git\n\ngo 1.23\nrequire example.com/backend " + version + "\n") + (rdm / "main.go").write_text('package main\nimport("fmt";"example.com/backend/web")\nfunc main(){fmt.Print(web.Page())}\n') + (rdm / "Makefile").write_text('build:\n\t@test -n "$(COMPOSITION_ROOT)"\n\tpython3 "$(COMPOSITION_ROOT)/scripts/build-composition.py" --root "$(COMPOSITION_ROOT)" --target build --rdm-source . --output bin\n\tcp bin/agent-system-rdm-product bin/agent-system-rdm\n') + env = self.env | {"GOPROXY": (self.base / "proxy").as_uri(), "GOMODCACHE": str(self.base / "module-cache")} + self.call(rdm, "go", "mod", "download", "all", env=env) + rdm_sha = self.fixture.commit(rdm) + self.adapter('RDM_SRC_DIR="' + str(rdm) + '"\nmaterialize_rdm_commit "' + rdm_sha + '" rdm', env=env) + binary = self.runtime / ".worktrees/rdm-rdm/bin/agent-system-rdm" + self.assertEqual(self.call(self.base, str(binary)).stdout, "immutable-page") + self.assertEqual(json.loads((binary.parent / "resolved-manifest.json").read_text())["root"]["commit"], self.sha) + + def test_e2e_build_only_uses_versioned_sources_without_runtime_or_api_calls(self): + self.test_versioned_rdm_adapter_passes_fixed_dev_root_to_product_wrapper() + rdm = self.base / "rdm" + rdm_sha = self.call(rdm, "git", "rev-parse", "HEAD").stdout.strip() + self.call(rdm, "git", "update-ref", "refs/remotes/origin/main", rdm_sha) + shutil.copytree(SOURCE / "scripts/workspace", self.root / "scripts/workspace", dirs_exist_ok=True) + for name in ("workspace.py", "component-source.py", "svc.sh", "e2e.sh"): + shutil.copy2(SOURCE / "scripts" / name, self.root / "scripts" / name) + (self.root / ".gitignore").write_text("bin/\nprivate/\n.workspace/\ngo.work\n") + self.fixture.commit(self.root) + curl = self.base / "tools/curl" + curl.write_text('#!/usr/bin/env bash\necho "runtime API must not execute in build-only mode" >&2\nexit 71\n') + curl.chmod(0o755) + output = self.base / "e2e" + env = self.env | {"RDM_REPO": str(rdm), "E2E_OUT": str(output), "GOPROXY": (self.base / "proxy").as_uri(), "GOMODCACHE": str(self.base / "module-cache")} + unrelated = subprocess.Popen(["sleep", "60"]) + self.addCleanup(lambda: (unrelated.terminate(), unrelated.wait()) if unrelated.poll() is None else None) + env.update(API_PID=str(unrelated.pid), UI_PID=str(unrelated.pid)) + result = self.call(self.root, "bash", "scripts/e2e.sh", "--build-only", env=env) + self.assertIsNone(unrelated.poll(), "build-only must not kill inherited process identities") + self.assertIn("runtime/browser/model acceptance NOT_RUN", result.stdout) + self.assertEqual(self.call(self.base, str(output / "agent-system-rdm")).stdout, "immutable-page") + self.assertEqual((self.root / "bin/frontend-dist/index.html").read_text(), "immutable-page") + self.assertFalse((output / "data").exists()) + self.assertFalse((output / "cookies.txt").exists()) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_workspace.py b/tests/test_workspace.py index 5ac119c8..e3514988 100644 --- a/tests/test_workspace.py +++ b/tests/test_workspace.py @@ -369,6 +369,102 @@ class WorkspaceTests(unittest.TestCase): for path in (legacy, errors, logging, duplicate): self.assertEqual(self.fingerprint(path), before[str(path)]) + def git_metadata(self, path): + common = Path(self.git(path, "rev-parse", "--path-format=absolute", "--git-common-dir").stdout.strip()) + return {str(file.relative_to(common)): hashlib.sha256(file.read_bytes()).hexdigest() + for file in common.rglob("*") if file.is_file()} + + def preserved_source_refs(self, path): + output = self.git(path, "for-each-ref", "--format=%(refname) %(objectname)", "refs/migration/sources/").stdout + return dict(row.split() for row in output.splitlines()) + + def test_repeated_transition_keeps_alias_tag_versions_and_snapshot_history(self): + legacy, errors, logging = self.nested_legacy() + remote = next(item["repo"] for item in self.manifest["components"] if item["id"] == "Errors") + self.git(logging, "submodule", "add", remote, "deps/errors") + self.git(logging, "commit", "-am", "Add equivalent dependency alias") + self.git(legacy, "add", "deps/logging") + self.git(legacy, "commit", "-m", "Pin alias source") + alias = logging / "deps/errors" + self.git(alias, "tag", "-a", "alias-note", "-m", "First unique alias annotation") + first_tag = self.git(alias, "rev-parse", "refs/tags/alias-note").stdout.strip() + self.cli("transition", "--name", "App", "--apply") + clone = self.root / ".workspace/Errors" + saved_refs = self.preserved_source_refs(clone) + self.assertIn(first_tag, saved_refs.values()) + saved_snapshots = self.state()["components"]["Errors"]["legacy_snapshots"] + self.git(alias, "tag", "-f", "-a", "alias-note", "-m", "Second unique alias annotation") + second_tag = self.git(alias, "rev-parse", "refs/tags/alias-note").stdout.strip() + self.assertNotEqual(first_tag, second_tag) + original = {str(path): self.git_metadata(path) for path in (legacy, errors, logging, alias)} + self.cli("transition", "--name", "App", "--apply") + current_refs = self.preserved_source_refs(clone) + self.assertEqual({name: current_refs.get(name) for name in saved_refs}, saved_refs, + "a new source snapshot must not overwrite any previous preserved reference") + self.assertIn(second_tag, current_refs.values()) + history = self.state()["components"]["Errors"]["legacy_snapshots"] + for snapshot in saved_snapshots: + self.assertIn(snapshot, history, "prior captured metadata must remain available") + # This object was present only through the secondary alias's annotated tag. + # Disposable GC proves it remains reachable after the source tag moves. + self.git(clone, "reflog", "expire", "--expire=now", "--all") + self.git(clone, "gc", "--prune=now") + self.assertEqual(self.git(clone, "cat-file", "-t", first_tag).stdout.strip(), "tag") + self.assertEqual(self.git(clone, "cat-file", "-t", second_tag).stdout.strip(), "tag") + for path in (legacy, errors, logging, alias): + self.assertEqual(self.git_metadata(path), original[str(path)]) + + def test_repeated_transition_preserves_dirty_index_ignored_and_external_git_metadata(self): + legacy = self.legacy() + self.git(legacy, "checkout", "-b", "feature/legacy") + (legacy / "content").write_text("staged source\n") + self.git(legacy, "add", "content") + (legacy / "content").write_text("working source\n") + (legacy / "private").mkdir() + (legacy / "private/unique").write_text("ignored source\n") + external = self.base / "external-owner" + self.git(legacy, "worktree", "add", "-b", "feature/external", str(external)) + (external / "content").write_text("external owner work\n") + metadata = self.git_metadata(legacy) + self.cli("transition", "--name", "App", "--apply") + clone = self.root / ".workspace/App" + refs = self.preserved_source_refs(clone) + self.cli("transition", "--name", "App", "--apply") + self.assertEqual(self.git(clone, "show", ":content").stdout, "staged source\n") + self.assertEqual((clone / "content").read_text(), "working source\n") + self.assertEqual((clone / "private/unique").read_text(), "ignored source\n") + self.assertEqual((external / "content").read_text(), "external owner work\n") + self.assertEqual(self.git_metadata(legacy), metadata) + self.assertEqual(self.preserved_source_refs(clone), refs) + # A unique destination file belongs to its current owner and blocks reuse. + (clone / "private/new-owner-file").write_text("new workspace work\n") + state_before = (self.root / ".workspace/state.json").read_bytes() + result = self.cli("transition", "--name", "App", "--apply", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertIn("conflicting duplicate destination", result.stdout) + self.assertEqual((clone / "private/new-owner-file").read_text(), "new workspace work\n") + self.assertEqual((self.root / ".workspace/state.json").read_bytes(), state_before) + self.assertEqual(self.git_metadata(legacy), metadata) + + def test_repeated_transition_rejects_a_new_source_head_without_switching_destination(self): + legacy = self.legacy() + self.cli("transition", "--name", "App", "--apply") + clone = self.root / ".workspace/App" + refs = self.preserved_source_refs(clone) + state_before = (self.root / ".workspace/state.json").read_bytes() + (legacy / "content").write_text("new legacy head\n") + self.git(legacy, "commit", "-am", "Advance original owner branch") + new_head = self.git(legacy, "rev-parse", "HEAD").stdout.strip() + original_metadata = self.git_metadata(legacy) + result = self.cli("transition", "--name", "App", "--apply", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertIn("conflicting duplicate destination", result.stdout) + self.assertEqual(self.git(clone, "rev-parse", "HEAD").stdout.strip(), self.first) + self.assertEqual(self.git(legacy, "rev-parse", "HEAD").stdout.strip(), new_head) + self.assertEqual(self.preserved_source_refs(clone), refs) + self.assertEqual((self.root / ".workspace/state.json").read_bytes(), state_before) + self.assertEqual(self.git_metadata(legacy), original_metadata) + def npm_fixture(self): remote, author, head = self.component("UI", {"package.json": '{"name":"@agent-system/ui","version":"0.0.0"}\n'}) (author / "package.json").write_text('{"name":"@agent-system/ui","version":"0.0.1"}\n') @@ -446,6 +542,114 @@ class WorkspaceTests(unittest.TestCase): self.assertNotEqual(result.returncode, 0) self.assertEqual(self.git(self.root / ".workspace/App", "rev-parse", "HEAD").stdout.strip(), self.first) + def advance_app_lock(self): + (self.author / "content").write_text("updated locked version\n") + counter = self.author / "revision-counter" + counter.write_text((counter.read_text() if counter.exists() else "") + "next\n") + self.git(self.author, "add", "revision-counter") + self.git(self.author, "commit", "-am", "Advance fixed source") + self.git(self.author, "push", "origin", "main") + head = self.git(self.author, "rev-parse", "HEAD").stdout.strip() + self.lock["components"]["App"]["commit"] = head + self.save_manifest() + return head + + def test_explicit_fixed_refresh_preserves_old_commit_refs_and_reflog(self): + self.cli("prepare") + clone = self.root / ".workspace/App" + refs_before = self.git(clone, "for-each-ref", "--format=%(refname) %(objectname)").stdout.splitlines() + reflog_before = self.git(clone, "reflog", "--format=%H", "HEAD").stdout.splitlines() + head = self.advance_app_lock() + self.cli("prepare", "--name", "App", "--refresh-fixed") + self.assertEqual(self.git(clone, "rev-parse", "HEAD").stdout.strip(), head) + self.assertEqual(self.git(clone, "branch", "--show-current").stdout, "") + self.assertEqual((clone / "content").read_text(), "updated locked version\n") + self.assertEqual(self.state()["components"]["App"]["baseline"], head) + for row in refs_before: + self.assertIn(row, self.git(clone, "for-each-ref", "--format=%(refname) %(objectname)").stdout.splitlines()) + for row in reflog_before: + self.assertIn(row, self.git(clone, "reflog", "--format=%H", "HEAD").stdout.splitlines()) + history = self.state()["components"]["App"]["previous_sources"] + self.assertEqual(history[0]["commit"], self.first) + self.assertEqual(self.git(clone, "rev-parse", history[0]["ref"]).stdout.strip(), self.first) + self.cli("prepare", "--name", "App", "--refresh-fixed") + self.assertEqual(len(self.state()["components"]["App"]["previous_sources"]), 1) + + def test_explicit_fixed_refresh_refuses_dirty_ignored_edited_and_locked_sources(self): + self.cli("prepare") + clone = self.root / ".workspace/App" + self.advance_app_lock() + state_before = (self.root / ".workspace/state.json").read_bytes() + (clone / "content").write_text("unsaved owner change\n") + self.assertNotEqual(self.cli("prepare", "--refresh-fixed", check=False).returncode, 0) + self.assertEqual((clone / "content").read_text(), "unsaved owner change\n") + (clone / "content").write_text("first\n") + (clone / "private").mkdir() + (clone / "private/unique").write_text("ignored owner data\n") + self.assertNotEqual(self.cli("prepare", "--refresh-fixed", check=False).returncode, 0) + self.assertEqual((clone / "private/unique").read_text(), "ignored owner data\n") + (clone / "private/unique").unlink() + (clone / "private").rmdir() + lock = clone / ".git/index.lock" + lock.write_text("another Git owner\n") + self.assertNotEqual(self.cli("prepare", "--refresh-fixed", check=False).returncode, 0) + self.assertEqual(lock.read_text(), "another Git owner\n") + lock.unlink() + self.assertEqual((self.root / ".workspace/state.json").read_bytes(), state_before) + self.lock["components"]["App"]["commit"] = self.first + self.save_manifest() + self.cli("edit", "--name", "App", "--branch", "feature/owner") + self.advance_app_lock() + result = self.cli("prepare", "--refresh-fixed", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertEqual(self.git(clone, "branch", "--show-current").stdout.strip(), "feature/owner") + self.assertEqual(self.git(clone, "rev-parse", "HEAD").stdout.strip(), self.first) + + def test_explicit_fixed_refresh_refuses_shared_or_unregistered_ownership(self): + self.cli("prepare") + clone = self.root / ".workspace/App" + self.advance_app_lock() + external = self.base / "fixed-external-owner" + self.git(clone, "worktree", "add", "-b", "feature/external", str(external)) + (external / "unique").write_text("external owner data\n") + result = self.cli("prepare", "--refresh-fixed", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertEqual(self.git(clone, "rev-parse", "HEAD").stdout.strip(), self.first) + self.assertEqual((external / "unique").read_text(), "external owner data\n") + (external / "unique").unlink() + self.git(clone, "worktree", "remove", str(external)) + data = self.state() + data["components"].pop("App") + (self.root / ".workspace/state.json").write_text(json.dumps(data)) + result = self.cli("prepare", "--refresh-fixed", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertEqual(self.git(clone, "rev-parse", "HEAD").stdout.strip(), self.first) + + def test_failed_explicit_fixed_refresh_keeps_old_binding_and_can_retry(self): + self.cli("prepare") + clone = self.root / ".workspace/App" + self.lock["components"]["App"]["commit"] = "a" * 40 + self.save_manifest() + result = self.cli("prepare", "--refresh-fixed", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertEqual(self.state()["components"]["App"]["baseline"], self.first) + self.assertEqual(self.state()["components"]["App"]["mode"], "versioned") + self.assertEqual(self.git(clone, "rev-parse", "HEAD").stdout.strip(), self.first) + head = self.advance_app_lock() + self.cli("prepare", "--refresh-fixed") + self.assertEqual(self.git(clone, "rev-parse", "HEAD").stdout.strip(), head) + + def test_explicit_fixed_refresh_refuses_index_flags_hiding_owner_changes(self): + self.cli("prepare") + clone = self.root / ".workspace/App" + self.git(clone, "update-index", "--skip-worktree", "content") + (clone / "content").write_text("hidden owner change\n") + self.advance_app_lock() + result = self.cli("prepare", "--refresh-fixed", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertEqual(self.git(clone, "rev-parse", "HEAD").stdout.strip(), self.first) + self.assertEqual((clone / "content").read_text(), "hidden owner change\n") + def test_private_git_metadata_symlink_is_not_adopted(self): self.cli("prepare") clone = self.root / ".workspace/App" diff --git a/tests/test_workspace_cutover.py b/tests/test_workspace_cutover.py new file mode 100644 index 00000000..0c73434b --- /dev/null +++ b/tests/test_workspace_cutover.py @@ -0,0 +1,403 @@ +"""Task cutover protections with real repositories, gitlinks and worktrees.""" +import json +import os +from pathlib import Path +import shutil +import subprocess +import tempfile +import unittest + +SOURCE = Path(__file__).resolve().parents[1] + + +class WorkspaceCutoverTests(unittest.TestCase): + def setUp(self): + self.tmp = tempfile.TemporaryDirectory(prefix="workspace-cutover-") + self.addCleanup(self.tmp.cleanup) + self.base = Path(self.tmp.name) + self.repo = self.base / "repo" + self.env = os.environ.copy() + for key in list(self.env): + if key.startswith("GIT_CONFIG_") or key in ("GIT_DIR", "GIT_WORK_TREE", "GIT_INDEX_FILE", "GOWORK", "PRECHECK_RECEIPT", "RECEIPT", "CMD", "IMPORT_RECEIPT", "COMPOSITION_SOURCE_MAP", "CI_DEPENDENCY_MIRRORS"): + self.env.pop(key, None) + self.env.update({"GIT_CONFIG_NOSYSTEM": "1", "GIT_CONFIG_GLOBAL": "/dev/null", + "GIT_ALLOW_PROTOCOL": "file", "GIT_TERMINAL_PROMPT": "0", + "GIT_AUTHOR_NAME": "Cutover Test", "GIT_AUTHOR_EMAIL": "test@example.invalid", + "GIT_COMMITTER_NAME": "Cutover Test", "GIT_COMMITTER_EMAIL": "test@example.invalid", + "XDG_CACHE_HOME": str(self.base / "cache")}) + self.call(self.base, "git", "init", "--initial-branch=main", str(self.repo)) + shutil.copytree(SOURCE / "scripts", self.repo / "scripts") + (self.repo / "Makefile").write_text("precheck:\n\t@bash scripts/task.sh precheck\n") + (self.repo / ".gitignore").write_text(".workspace/\ngo.work\ngo.work.sum\nmodules/\n") + (self.repo / "tracked").write_text("root\n") + self.git(self.repo, "add", ".") + self.git(self.repo, "commit", "-m", "Old project") + self.remote = self.base / "project.git" + self.call(self.base, "git", "init", "--bare", "--initial-branch=main", str(self.remote)) + self.git(self.remote, "config", "gc.auto", "0") + self.git(self.remote, "config", "receive.autogc", "false") + self.git(self.repo, "remote", "add", "origin", str(self.remote)) + self.git(self.repo, "push", "-u", "origin", "main") + self.app, self.app_sha = self.component("App", {"content": "app v1\n", ".gitignore": "private/\n"}) + self.rules, self.rules_sha = self.component("Rules", {"core/baseline.md": "# Baseline\n", "workflows/delivery.md": "# Delivery\n"}) + + def call(self, cwd, *args, check=True, env=None): + result = subprocess.run(args, cwd=cwd, env=env or self.env, text=True, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, timeout=60) + if check: + self.assertEqual(result.returncode, 0, result.stdout) + return result + + def git(self, cwd, *args, **kwargs): + return self.call(cwd, "git", *args, **kwargs) + + def task(self, cwd, command, *args, **kwargs): + return self.call(cwd, "bash", str(cwd / "scripts/task.sh"), command, *args, **kwargs) + + def component(self, name, files): + path = self.base / name + self.call(self.base, "git", "init", "--initial-branch=main", str(path)) + for relative, content in files.items(): + target = path / relative + target.parent.mkdir(parents=True, exist_ok=True) + target.write_text(content) + self.git(path, "add", ".") + self.git(path, "commit", "-m", name + " v1") + return path, self.git(path, "rev-parse", "HEAD").stdout.strip() + + def adopt(self): + records = [{"id": name, "repo": str(path), "path": ".workspace/" + name, + "legacy_path": "modules/" + name, "role": role, "modules": [], "target": "main"} + for name, path, role in (("App", self.app, "application"), ("Rules", self.rules, "guidelines"))] + (self.repo / "components.json").write_text(json.dumps({"schema": 1, "components": records})) + (self.repo / "components.lock.json").write_text(json.dumps({"schema": 1, "components": {"App": {"commit": self.app_sha}, "Rules": {"commit": self.rules_sha}}})) + self.git(self.repo, "add", "components.json", "components.lock.json") + self.git(self.repo, "commit", "-m", "Adopt source manifests") + self.git(self.repo, "push", "origin", "main") + + def worktree(self, name="feature/old"): + path = self.base / "task" + self.git(self.repo, "worktree", "add", "-b", name, str(path), "origin/main") + return path + + def workspace(self, root, *args): + return self.call(root, "python3", "scripts/workspace.py", "--root", str(root), *args) + + def test_precheck_prepares_fixed_rules_outside_project_before_ready(self): + self.adopt() + result = self.task(self.repo, "precheck") + self.assertIn("[verdict] READY", result.stdout) + self.assertFalse((self.repo / ".workspace").exists()) + self.assertIn("[rules]", result.stdout) + reading = next(line for line in result.stdout.splitlines() if line.startswith("[rules]")) + self.assertIn(self.rules_sha, reading) + self.assertTrue(list((self.base / "cache").rglob("core/baseline.md"))) + self.assertTrue(list((self.base / "cache").rglob("workflows/delivery.md"))) + + def test_precheck_never_claims_ready_for_unavailable_fixed_rules(self): + self.adopt() + (self.rules / "core/baseline.md").unlink() + self.git(self.rules, "commit", "-am", "Rules missing baseline") + document = json.loads((self.repo / "components.lock.json").read_text()) + document["components"]["Rules"]["commit"] = self.git(self.rules, "rev-parse", "HEAD").stdout.strip() + (self.repo / "components.lock.json").write_text(json.dumps(document)) + self.git(self.repo, "commit", "-am", "Pin invalid rules") + self.git(self.repo, "push", "origin", "main") + result = self.task(self.repo, "precheck", check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertNotIn("[verdict] READY", result.stdout) + self.assertFalse((self.repo / ".workspace").exists()) + + def test_start_prepares_fixed_sources_without_recursive_submodule_init(self): + nested, _ = self.component("Nested", {"value": "nested\n"}) + self.git(self.app, "submodule", "add", str(nested), "deps/Nested") + self.git(self.app, "commit", "-am", "Pin nested source") + self.app_sha = self.git(self.app, "rev-parse", "HEAD").stdout.strip() + self.adopt() + receipt = self.base / "precheck.json" + self.call(self.repo, "bash", "scripts/evidence.sh", env=self.env | {"RECEIPT": str(receipt), "CMD": "make precheck"}) + self.task(self.repo, "start", "feature/new", env=self.env | {"PRECHECK_RECEIPT": str(receipt)}) + wt = self.base / "repo-wt-feature-new" + self.assertTrue((wt / ".workspace/App/.git").is_dir(), "fixed App checkout is missing") + self.assertEqual(self.git(wt / ".workspace/App", "rev-parse", "HEAD").stdout.strip(), self.app_sha) + self.assertEqual(self.git(wt / ".workspace/Rules", "rev-parse", "HEAD").stdout.strip(), self.rules_sha) + self.assertFalse((wt / ".workspace/App/deps/Nested/.git").exists()) + self.assertTrue((wt / ".task/feature-new.md").exists()) + + def test_old_task_sync_adopts_new_sources_and_reports_explicit_transition(self): + self.git(self.repo, "-c", "core.excludesfile=/dev/null", "submodule", "add", "--force", str(self.app), "modules/App") + self.git(self.repo, "commit", "-m", "Pin old source") + self.git(self.repo, "push", "origin", "main") + wt = self.worktree() + self.git(wt, "submodule", "update", "--init") + legacy = wt / "modules/App" + self.git(legacy, "switch", "-c", "feature/owned") + before = self.git(legacy, "show-ref").stdout + self.git(self.repo, "rm", "--cached", "modules/App") + self.git(self.repo, "rm", ".gitmodules") + self.git(self.repo, "commit", "-m", "Retire gitlink without removing checkout") + self.adopt() + result = self.task(wt, "sync") + self.assertIn("[transition]", result.stdout) + self.assertEqual(self.git(legacy, "show-ref").stdout, before) + self.assertEqual(self.git(legacy, "branch", "--show-current").stdout.strip(), "feature/owned") + self.assertTrue((wt / ".workspace/App/.git").is_dir()) + self.assertEqual((legacy / "content").read_text(), "app v1\n") + + def test_sync_preserves_edit_branch_and_refuses_changed_declared_source(self): + self.adopt() + wt = self.worktree() + self.workspace(wt, "edit", "--name", "App", "--branch", "feature/owned") + edited = wt / ".workspace/App" + (edited / "content").write_text("local unsaved\n") + self.task(wt, "sync") + (self.app / "content").write_text("app v2\n") + self.git(self.app, "commit", "-am", "App v2") + lock = json.loads((self.repo / "components.lock.json").read_text()) + lock["components"]["App"]["commit"] = self.git(self.app, "rev-parse", "HEAD").stdout.strip() + (self.repo / "components.lock.json").write_text(json.dumps(lock)) + self.git(self.repo, "commit", "-am", "Update application lock") + self.git(self.repo, "push", "origin", "main") + result = self.task(wt, "sync", check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertNotIn("[synced]", result.stdout) + self.assertEqual((edited / "content").read_text(), "local unsaved\n") + self.assertEqual(self.git(edited, "branch", "--show-current").stdout.strip(), "feature/owned") + + def test_finish_preserves_external_worktree_of_retired_legacy_checkout(self): + self.adopt() + wt = self.worktree() + legacy = wt / "modules/App" + self.git(wt, "clone", str(self.app), str(legacy)) + external = self.base / "external" + self.git(legacy, "worktree", "add", "-b", "feature/external", str(external)) + (external / "content").write_text("external unique\n") + self.git(external, "add", "content") + before = self.git(external, "status", "--porcelain").stdout + result = self.task(wt, "finish", check=False, env=self.env | {"TASK_WRITERS_STOPPED": "1"}) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("registered component worktree", result.stdout) + self.assertEqual(self.git(external, "status", "--porcelain").stdout, before) + self.assertEqual((external / "content").read_text(), "external unique\n") + self.assertTrue(wt.exists()) + + def test_verify_detects_active_git_operation_in_nested_retired_root(self): + self.adopt() + wt = self.worktree() + legacy = wt / "modules/App" + self.git(wt, "clone", str(self.app), str(legacy)) + nested = legacy / "retired/nested" + self.git(wt, "clone", str(self.rules), str(nested)) + lock = nested / ".git/index.lock" + lock.write_text("another writer\n") + result = self.call(wt, "python3", "scripts/check-worktree.py", "verify", check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("active Git operation/lock", result.stdout) + self.assertEqual(lock.read_text(), "another writer\n") + + def test_make_workspace_commands_prepare_edit_unlink_and_report(self): + self.adopt() + shutil.copyfile(SOURCE / "Makefile", self.repo / "Makefile") + self.call(self.repo, "make", "workspace-prepare", "NAME=App") + source = self.repo / ".workspace/App" + self.assertEqual((source / "content").read_text(), "app v1\n") + self.call(self.repo, "make", "component-edit", "NAME=App", "BRANCH=feature/from-make") + self.assertEqual(self.git(source, "branch", "--show-current").stdout.strip(), "feature/from-make") + self.call(self.repo, "make", "component-unlink", "NAME=App") + self.assertTrue(source.is_dir()) + status = self.call(self.repo, "make", "workspace-status", "NAME=App") + self.assertIn('"feature/from-make"', status.stdout) + transition = self.call(self.repo, "make", "workspace-transition", "NAME=App") + self.assertIn('"legacy"', transition.stdout) + self.assertFalse((self.repo / "modules/App").exists()) + + def test_finish_preserves_absorbed_metadata_after_legacy_checkout_disappears(self): + self.git(self.repo, "submodule", "add", "--force", str(self.app), "modules/App") + self.git(self.repo, "commit", "-m", "Old gitlink") + self.git(self.repo, "push", "origin", "main") + wt = self.worktree() + self.git(wt, "submodule", "update", "--init") + legacy = wt / "modules/App" + external = self.base / "external" + self.git(legacy, "worktree", "add", "-b", "feature/external", str(external)) + (external / "content").write_text("independent owner\n") + self.git(external, "add", "content") + before = self.git(external, "status", "--porcelain").stdout + self.git(self.repo, "rm", "--cached", "modules/App") + self.git(self.repo, "rm", ".gitmodules") + self.git(self.repo, "commit", "-m", "Remove legacy index entries") + self.adopt() + self.task(wt, "sync") + shutil.rmtree(legacy) # Simulate an absent checkout while its Git metadata remains. + result = self.task(wt, "finish", check=False, env=self.env | {"TASK_WRITERS_STOPPED": "1"}) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("retained metadata", result.stdout) + self.assertEqual(self.git(external, "status", "--porcelain").stdout, before) + self.assertEqual((external / "content").read_text(), "independent owner\n") + + def test_finish_preserves_nonbranch_legacy_refs_without_remote_backup(self): + self.adopt() + wt = self.worktree() + legacy = wt / "modules/App" + self.git(wt, "clone", str(self.app), str(legacy)) + (legacy / "content").write_text("unpublished\n") + self.git(legacy, "commit", "-am", "Unique migration object") + unique = self.git(legacy, "rev-parse", "HEAD").stdout.strip() + self.git(legacy, "update-ref", "refs/migration/unique", unique) + self.git(legacy, "reset", "--hard", "origin/main") + self.git(legacy, "reflog", "expire", "--expire=now", "--all") + result = self.task(wt, "finish", check=False, env=self.env | {"TASK_WRITERS_STOPPED": "1"}) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("unpreserved local refs", result.stdout) + self.assertEqual(self.git(legacy, "rev-parse", "refs/migration/unique").stdout.strip(), unique) + + @unittest.skipUnless(shutil.which("go"), "Go is required for architecture gate") + def test_architecture_gate_preserves_edges_under_workspace_paths_and_new_module_identity(self): + self.adopt() + policy = self.repo / "policy" + policy.mkdir(exist_ok=True) + (policy / "architecture.yaml").write_text("backend:\n root: .workspace/Agent-System-Backend/internal\n import_prefix: git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/\nfrontend:\n root: .workspace/Agent-System-Frontend/src\n groups: components\n") + (policy / "architecture-baseline.json").write_text('["backend/app backend/store"]') + backend = self.repo / ".workspace/Agent-System-Backend" + (backend / "internal/app").mkdir(parents=True) + (backend / "internal/store").mkdir() + (backend / "go.mod").write_text("module git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git\n\ngo 1.23\n") + source = backend / "internal/app/app.go" + source.write_text('package app\nimport _ "git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/store"\n') + (self.repo / ".workspace/Agent-System-Frontend/src").mkdir(parents=True) + self.call(self.repo, "bash", "scripts/lint-architecture.sh") + (backend / "internal/server").mkdir() + source.write_text(source.read_text() + 'import _ "git-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/server"\n') + result = self.call(self.repo, "bash", "scripts/lint-architecture.sh", check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("backend/app backend/server", result.stdout) + self.assertEqual(json.loads((policy / "architecture-baseline.json").read_text()), ["backend/app backend/store"]) + + @unittest.skipUnless(shutil.which("go"), "Go is required for boundary gates") + def test_boundary_gate_uses_isolated_map_and_rejects_new_backend_internal_import(self): + self.adopt() + names = ("Agent-System-Backend", "Agent-System-Frontend", "Agent-Intent", "Agent-Native", "Agent-Squad") + modules = {name: "git-ssh.u1680832.nyat.app/weichen/" + name + ".git" for name in names} + entries = [{"id": name, "repo": str(self.app), "path": ".workspace/" + name, + "role": "application" if name in names[:2] else "go-library", "modules": [], "target": "main"} for name in names] + (self.repo / "components.json").write_text(json.dumps({"schema": 1, "components": entries})) + (self.repo / "components.lock.json").write_text(json.dumps({"schema": 1, "components": {name: {"commit": self.app_sha} for name in names[:2]}})) + policy = self.repo / "policy" + policy.mkdir() + (policy / "architecture.yaml").write_text("backend: .workspace/Agent-System-Backend/internal\nfrontend: .workspace/Agent-System-Frontend/src\ncomponents: {}\n") + (policy / "architecture-baseline.json").write_text("[]") + (policy / "lib-deps-allowlist.txt").write_text("# No sibling-library imports\n") + mapping = {"schema": 1, "root_commit": self.git(self.repo, "rev-parse", "HEAD").stdout.strip(), "components": {}} + for name in names: + path = self.base / "isolated" / name + path.mkdir(parents=True) + if name != "Agent-System-Frontend": + (path / "go.mod").write_text("module " + modules[name] + "\n\ngo 1.23\n") + (path / "source.go").write_text("package fixture\n") + mapping["components"][name] = {"path": str(path), "commit": self.app_sha, "repo": str(self.app)} + backend = self.base / "isolated/Agent-System-Backend" + (backend / "internal/store").mkdir(parents=True) + (backend / "internal/store/store.go").write_text("package store\n") + sdk = backend / "pkg/extension" + sdk.mkdir(parents=True) + source = sdk / "sdk.go" + source.write_text("package extension\n") + (self.base / "isolated/Agent-System-Frontend/src").mkdir() + source_map = self.base / "source-map.json" + source_map.write_text(json.dumps(mapping)) + env = self.env | {"COMPOSITION_SOURCE_MAP": str(source_map)} + self.call(self.repo, "bash", "scripts/lint-boundaries.sh", env=env) + source.write_text('package extension\nimport _ "' + modules["Agent-System-Backend"] + '/internal/store"\n') + result = self.call(self.repo, "bash", "scripts/lint-boundaries.sh", env=env, check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("boundary: pkg/extension imports", result.stdout) + # A forged source identity cannot substitute for the locked application. + source.write_text("package extension\n") + mapping["components"]["Agent-System-Backend"]["commit"] = "0" * 40 + source_map.write_text(json.dumps(mapping)) + result = self.call(self.repo, "bash", "scripts/lint-boundaries.sh", env=env, check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("locked source", result.stdout) + + def test_verify_detects_nested_git_operation_inside_new_workspace(self): + self.adopt() + wt = self.worktree() + self.workspace(wt, "prepare") + nested = wt / ".workspace/App/private/Rules" + self.git(wt, "clone", str(self.rules), str(nested)) + lock = nested / ".git/index.lock" + lock.write_text("active nested writer\n") + result = self.call(wt, "python3", "scripts/check-worktree.py", "verify", check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("active Git operation/lock", result.stdout) + self.assertEqual(lock.read_text(), "active nested writer\n") + + def test_old_task_sync_preserves_unique_legacy_commit_staging_dirty_and_ignored_files(self): + self.git(self.repo, "submodule", "add", "--force", str(self.app), "modules/App") + self.git(self.repo, "commit", "-m", "Old gitlink") + self.git(self.repo, "push", "origin", "main") + wt = self.worktree() + self.git(wt, "submodule", "update", "--init") + legacy = wt / "modules/App" + self.git(legacy, "switch", "-c", "feature/unique") + (legacy / "content").write_text("unpublished commit\n") + self.git(legacy, "commit", "-am", "Unique component history") + (legacy / "content").write_text("staged component change\n") + self.git(legacy, "add", "content") + (legacy / "content").write_text("unstaged component change\n") + (legacy / "private").mkdir() + (legacy / "private/unique").write_text("ignored unique data\n") + before = (self.git(legacy, "show-ref").stdout, self.git(legacy, "ls-files", "--stage").stdout, + self.git(wt, "rev-parse", "HEAD").stdout) + self.git(self.repo, "rm", "--cached", "modules/App") + self.git(self.repo, "rm", ".gitmodules") + self.git(self.repo, "commit", "-m", "Retire old gitlink") + self.adopt() + result = self.task(wt, "sync", check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertNotIn("[synced]", result.stdout) + self.assertEqual((self.git(legacy, "show-ref").stdout, self.git(legacy, "ls-files", "--stage").stdout, + self.git(wt, "rev-parse", "HEAD").stdout), before) + self.assertEqual((legacy / "content").read_text(), "unstaged component change\n") + self.assertEqual((legacy / "private/unique").read_text(), "ignored unique data\n") + + def test_old_task_text_conflict_keeps_legacy_source_and_reports_no_success(self): + self.git(self.repo, "submodule", "add", "--force", str(self.app), "modules/App") + self.git(self.repo, "commit", "-m", "Old gitlink") + self.git(self.repo, "push", "origin", "main") + wt = self.worktree() + self.git(wt, "submodule", "update", "--init") + (wt / "tracked").write_text("task branch choice\n") + self.git(wt, "commit", "-am", "Task text change") + legacy = wt / "modules/App" + before = self.git(legacy, "show-ref").stdout + (self.repo / "tracked").write_text("main branch choice\n") + self.git(self.repo, "commit", "-am", "Main text change") + self.git(self.repo, "rm", "--cached", "modules/App") + self.git(self.repo, "rm", ".gitmodules") + self.git(self.repo, "commit", "-m", "Retire legacy index") + self.adopt() + result = self.task(wt, "sync", check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertNotIn("[synced]", result.stdout) + self.assertTrue(self.git(wt, "ls-files", "-u").stdout.strip()) + self.assertEqual(self.git(legacy, "show-ref").stdout, before) + self.assertEqual((legacy / "content").read_text(), "app v1\n") + + def test_precheck_rejects_borrowed_rules_cache_symlink(self): + self.adopt() + self.task(self.repo, "precheck") + source = next(path for path in (self.base / "cache/agent-system/rules").iterdir() if path.is_dir()) + borrowed = self.base / "borrowed-rules" + source.rename(borrowed) + source.symlink_to(borrowed, target_is_directory=True) + before = self.git(borrowed, "show-ref").stdout + result = self.task(self.repo, "precheck", check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertNotIn("[verdict] READY", result.stdout) + self.assertEqual(self.git(borrowed, "show-ref").stdout, before) + self.assertEqual((borrowed / "core/baseline.md").read_text(), "# Baseline\n") + + +if __name__ == "__main__": + unittest.main() -- 2.54.0 From 7a1ff23341f535483c8abcb8ce3fee67b13519c7 Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 13 Oct 2026 17:24:28 +0000 Subject: [PATCH 10/29] Keep immutable product composition independently executable Why: An attempted shared digest import introduced a workspace package requirement in standalone fixed-root product fixtures. Evidence: SELF task receipts record the actual ModuleNotFoundError followed by all 20 real Git/Go/npm composition cases passing after restoring the local helper. Impact: Preserve standalone operation and retain the behavior-preserving unused parameter/import cleanup. Refs: Agent-System-Dev dependency-workspace U5; SELF composition receipt 5b7c224d67ab248b685da436ebee56638c1945a1dca3666f40e763621c1b8003. --- .task/feature-dependency-workspace.md | 306 +++++++++++++++++++++++++- scripts/build-composition.py | 6 +- 2 files changed, 310 insertions(+), 2 deletions(-) diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md index 3d045532..021c1c41 100644 --- a/.task/feature-dependency-workspace.md +++ b/.task/feature-dependency-workspace.md @@ -93,7 +93,7 @@ ## 代码整理(SELF,自检阶段) -ce-simplify-code 的 reuse/quality/efficiency 三个独立只读扫描完成。采纳已有 digest 的完全等价复用,删除未用内部参数与两处未用 import;不合并有不同信任边界的 CI 校验,不改变 JSON 异常优先级,不引入未经测量的 clone/cache 行为。整理后的实际组合器 fixture 重放由 evidence 记录。此记录不代替正式代码 Review、独立重放或平台准入。 +ce-simplify-code 的 reuse/quality/efficiency 三个独立只读扫描完成。删除未用内部参数与两处未用 import;digest 复用导致独立工具 fixture 缺少 workspace 包,实际失败后已撤回该整理;不合并有不同信任边界的 CI 校验,不改变 JSON 异常优先级,不引入未经测量的 clone/cache 行为。失败与修复后的实际组合器 fixture 重放由 evidence 记录。此记录不代替正式代码 Review、独立重放或平台准入。 ```json @@ -9489,3 +9489,307 @@ ce-simplify-code 的 reuse/quality/efficiency 三个独立只读扫描完成。 "receipt_sha256": "8906c99e54fa7f23f64ed9abfcc36c1742d8502d420ee8bed6d95870f73d6c05" } ``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T17:18:46.676423+00:00", + "command": "PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -p test_composition.py -v", + "command_sha256": "e2dfe5d6f43f53ee79d704ce73bf3a813dd3f0e5c9f9db00262aa9cdf389668c", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "93ac63fb3d3c6d1ba56b0aedda657b73821f3a1e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": " M .task/feature-dependency-workspace.md\n M scripts/build-composition.py\n", + "tracked_diff_sha256": "3ff24824b0bfb828b0ad5c44810f31eb4ed1c1dba82bf9ea68c7949b65b09b06", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7f50152402d0e4bb18f9ce32d5bafca6610ee5971e172a7842b4036866f7eed6", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "93ac63fb3d3c6d1ba56b0aedda657b73821f3a1e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": " M .task/feature-dependency-workspace.md\n M scripts/build-composition.py\n", + "tracked_diff_sha256": "3ff24824b0bfb828b0ad5c44810f31eb4ed1c1dba82bf9ea68c7949b65b09b06", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7f50152402d0e4bb18f9ce32d5bafca6610ee5971e172a7842b4036866f7eed6", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after_error": null, + "exit_code": 0, + "output": "test_developer_package_tarball_overrides_do_not_reach_formal_tests (test_composition.CompositionTests.test_developer_package_tarball_overrides_do_not_reach_formal_tests) ... ok\ntest_dirty_root_lock_is_rejected (test_composition.CompositionTests.test_dirty_root_lock_is_rejected) ... ok\ntest_fixed_commits_embed_assets_without_touching_developer_checkout (test_composition.CompositionTests.test_fixed_commits_embed_assets_without_touching_developer_checkout) ... ok\ntest_fixed_root_governance_and_boundaries_receive_proven_source_map (test_composition.CompositionTests.test_fixed_root_governance_and_boundaries_receive_proven_source_map) ... ok\ntest_frontend_dist_symlink_cannot_import_assets_from_outside_source (test_composition.CompositionTests.test_frontend_dist_symlink_cannot_import_assets_from_outside_source) ... ok\ntest_historical_rdm_product_still_builds_from_legacy_pins (test_composition.CompositionTests.test_historical_rdm_product_still_builds_from_legacy_pins) ... ok\ntest_local_go_replace_is_rejected (test_composition.CompositionTests.test_local_go_replace_is_rejected) ... ok\ntest_locked_missing_revision_is_rejected (test_composition.CompositionTests.test_locked_missing_revision_is_rejected) ... ok\ntest_missing_frontend_assets_fails_before_publishing_binary (test_composition.CompositionTests.test_missing_frontend_assets_fails_before_publishing_binary) ... ok\ntest_modified_go_module_cache_is_rejected_before_product_publication (test_composition.CompositionTests.test_modified_go_module_cache_is_rejected_before_product_publication) ... ok\ntest_npm_local_dependency_overlay_is_rejected (test_composition.CompositionTests.test_npm_local_dependency_overlay_is_rejected) ... ok\ntest_project_test_mode_refuses_missing_boundary_gate (test_composition.CompositionTests.test_project_test_mode_refuses_missing_boundary_gate) ... ok\ntest_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock (test_composition.CompositionTests.test_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock) ... ok\ntest_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache (test_composition.CompositionTests.test_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache) ... ok\ntest_source_path_escape_is_rejected (test_composition.CompositionTests.test_source_path_escape_is_rejected) ... ok\ntest_test_target_checks_fixed_go_library_and_ui_sources (test_composition.CompositionTests.test_test_target_checks_fixed_go_library_and_ui_sources) ... ok\ntest_test_target_runs_real_frontend_and_go_tests (test_composition.CompositionTests.test_test_target_runs_real_frontend_and_go_tests) ... ok\ntest_unused_transitive_zip_does_not_require_consumer_sum_rewrite (test_composition.CompositionTests.test_unused_transitive_zip_does_not_require_consumer_sum_rewrite) ... ok\ntest_version_and_plugin_assets_come_from_committed_root (test_composition.CompositionTests.test_version_and_plugin_assets_come_from_committed_root) ... ok\ntest_versioned_rdm_product_entry_uses_fixed_composer (test_composition.CompositionTests.test_versioned_rdm_product_entry_uses_fixed_composer) ... ok\n\n----------------------------------------------------------------------\nRan 20 tests in 16.522s\n\nOK\n", + "output_sha256": "1a4f5bb991070291f1a7e37a8fe1da3887d219f49a96ef1f084c94c8186be192", + "receipt_sha256": "5b7c224d67ab248b685da436ebee56638c1945a1dca3666f40e763621c1b8003" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T17:19:19.240432+00:00", + "command": "make workspace-prepare REFRESH_FIXED=1", + "command_sha256": "64a31bf70d0564cc9fd41b0296fdf4772c2c772f1cf125206cf19d56bef9f2d0", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "93ac63fb3d3c6d1ba56b0aedda657b73821f3a1e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": " M .task/feature-dependency-workspace.md\n M scripts/build-composition.py\n", + "tracked_diff_sha256": "8eab78125ea5ea22491958fcac0f6d6f2d22fb6c30daa4a54aeb3222b8611a11", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "ad53e90a8542143104ddc7f759c8f8e7b7001924", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "state": "missing" + }, + "Agent-System-Documents": { + "state": "missing" + } + }, + "lock_sha256": "7f50152402d0e4bb18f9ce32d5bafca6610ee5971e172a7842b4036866f7eed6", + "state_sha256": "9f6b12c6d0e66f8e4c67c8dde56600daa0d90b14229d64a1c7140bdaff01ef11" + } + }, + "after": { + "head": "93ac63fb3d3c6d1ba56b0aedda657b73821f3a1e", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": " M .task/feature-dependency-workspace.md\n M scripts/build-composition.py\n", + "tracked_diff_sha256": "8eab78125ea5ea22491958fcac0f6d6f2d22fb6c30daa4a54aeb3222b8611a11", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "6ed7b9322c5733f76b206a35cd78649ba385d83b", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "fffd5790cfab317fadafb40fa55a11bab6e9a847", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "1a842553b6a7432e5a85aaae43a45a7a7ea58195", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "7ba50e5b2dce226b4b962ea787222a4b08f0e94c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "7f50152402d0e4bb18f9ce32d5bafca6610ee5971e172a7842b4036866f7eed6", + "state_sha256": "ac06a71f0e86aa99311f2ccdf0cff3ba6aed282080c7c57b767317a2ec8d14cd" + } + }, + "after_error": null, + "exit_code": 0, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n{\n \"components\": {\n \"Agent-System-Backend\": {\n \"actual\": {\n \"branch\": null,\n \"changes\": [],\n \"common_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Backend/.git\",\n \"dirty\": false,\n \"git_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Backend/.git\",\n \"head\": \"fffd5790cfab317fadafb40fa55a11bab6e9a847\",\n \"ignored\": [],\n \"locks\": [],\n \"operations\": [],\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Backend.git\",\n \"worktrees\": [\n \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Backend\"\n ]\n },\n \"declared\": {\n \"commit\": \"fffd5790cfab317fadafb40fa55a11bab6e9a847\"\n },\n \"path\": \".workspace/Agent-System-Backend\",\n \"registered\": {\n \"baseline\": \"fffd5790cfab317fadafb40fa55a11bab6e9a847\",\n \"branch\": null,\n \"linked\": false,\n \"mode\": \"versioned\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Backend.git\",\n \"owner_root\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace\",\n \"path\": \".workspace/Agent-System-Backend\",\n \"previous_sources\": [\n {\n \"commit\": \"f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c\",\n \"ref\": \"refs/workspace/fixed/f1302ed5b3952aeb4ad386a793c0c78fe90d7a3c\",\n \"source\": {\n \"kind\": \"source-lock\"\n }\n }\n ],\n \"source\": {\n \"kind\": \"source-lock\"\n }\n },\n \"repo\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Backend.git\",\n \"role\": \"application\"\n },\n \"Agent-System-Documents\": {\n \"actual\": {\n \"branch\": null,\n \"changes\": [],\n \"common_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Documents/.git\",\n \"dirty\": false,\n \"git_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Documents/.git\",\n \"head\": \"7ba50e5b2dce226b4b962ea787222a4b08f0e94c\",\n \"ignored\": [],\n \"locks\": [],\n \"operations\": [],\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Documents.git\",\n \"worktrees\": [\n \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Documents\"\n ]\n },\n \"declared\": {\n \"commit\": \"7ba50e5b2dce226b4b962ea787222a4b08f0e94c\"\n },\n \"path\": \".workspace/Agent-System-Documents\",\n \"registered\": {\n \"baseline\": \"7ba50e5b2dce226b4b962ea787222a4b08f0e94c\",\n \"branch\": null,\n \"linked\": false,\n \"mode\": \"versioned\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Documents.git\",\n \"owner_root\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace\",\n \"path\": \".workspace/Agent-System-Documents\",\n \"source\": {\n \"kind\": \"source-lock\"\n }\n },\n \"repo\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Documents.git\",\n \"role\": \"documentation\"\n },\n \"Agent-System-Frontend\": {\n \"actual\": {\n \"branch\": null,\n \"changes\": [],\n \"common_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Frontend/.git\",\n \"dirty\": false,\n \"git_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Frontend/.git\",\n \"head\": \"6ed7b9322c5733f76b206a35cd78649ba385d83b\",\n \"ignored\": [],\n \"locks\": [],\n \"operations\": [],\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Frontend.git\",\n \"worktrees\": [\n \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Frontend\"\n ]\n },\n \"declared\": {\n \"commit\": \"6ed7b9322c5733f76b206a35cd78649ba385d83b\"\n },\n \"path\": \".workspace/Agent-System-Frontend\",\n \"registered\": {\n \"baseline\": \"6ed7b9322c5733f76b206a35cd78649ba385d83b\",\n \"branch\": null,\n \"linked\": false,\n \"mode\": \"versioned\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Frontend.git\",\n \"owner_root\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace\",\n \"path\": \".workspace/Agent-System-Frontend\",\n \"previous_sources\": [\n {\n \"commit\": \"ad53e90a8542143104ddc7f759c8f8e7b7001924\",\n \"ref\": \"refs/workspace/fixed/ad53e90a8542143104ddc7f759c8f8e7b7001924\",\n \"source\": {\n \"kind\": \"source-lock\"\n }\n }\n ],\n \"source\": {\n \"kind\": \"source-lock\"\n }\n },\n \"repo\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Frontend.git\",\n \"role\": \"application\"\n },\n \"Development-Guidelines\": {\n \"actual\": {\n \"branch\": null,\n \"changes\": [],\n \"common_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Development-Guidelines/.git\",\n \"dirty\": false,\n \"git_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Development-Guidelines/.git\",\n \"head\": \"1a842553b6a7432e5a85aaae43a45a7a7ea58195\",\n \"ignored\": [],\n \"locks\": [],\n \"operations\": [],\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Development-Guidelines.git\",\n \"worktrees\": [\n \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Development-Guidelines\"\n ]\n },\n \"declared\": {\n \"commit\": \"1a842553b6a7432e5a85aaae43a45a7a7ea58195\"\n },\n \"path\": \".workspace/Development-Guidelines\",\n \"registered\": {\n \"baseline\": \"1a842553b6a7432e5a85aaae43a45a7a7ea58195\",\n \"branch\": null,\n \"linked\": false,\n \"mode\": \"versioned\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Development-Guidelines.git\",\n \"owner_root\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace\",\n \"path\": \".workspace/Development-Guidelines\",\n \"source\": {\n \"kind\": \"source-lock\"\n }\n },\n \"repo\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Development-Guidelines.git\",\n \"role\": \"guidelines\"\n }\n },\n \"go_work\": null,\n \"root\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace\",\n \"schema\": 1\n}\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n", + "output_sha256": "4468df95034445b300c33fb0c44ee03989f701147c090e3ad654fcb92795e435", + "receipt_sha256": "d65203bc505ba8ed4286fda05a7afe78be5b4cc538018796436e263c27882dfa" +} +``` diff --git a/scripts/build-composition.py b/scripts/build-composition.py index 975d5d8f..3862fbb3 100644 --- a/scripts/build-composition.py +++ b/scripts/build-composition.py @@ -18,7 +18,6 @@ import tarfile import tempfile from urllib.parse import urlsplit -from workspace.common import digest SHA = re.compile(r"[0-9a-f]{40}\Z") @@ -45,6 +44,11 @@ def run(command, cwd, env, *, binary=False, quiet=False): return result.stdout +def digest(path): + # The composer also supports standalone fixed-root wrapper fixtures. + return hashlib.sha256(path.read_bytes()).hexdigest() + + def tree_digest(root): if root.is_symlink(): raise CompositionError(f"artifact root symlink is forbidden: {root.name}") -- 2.54.0 From 88b918132f582ceb0fc32678f4d66c3fa50a0bda Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 13 Oct 2026 17:59:30 +0000 Subject: [PATCH 11/29] Keep credential regressions reproducible in fixed source archives Why: Formal root tests cannot read ignored migration clones, so provider CI regressions failed despite the product and source gates passing. Evidence: SELF receipts record 18 missing-source errors, then all 29 credential cases passing from a real source archive without .migration and with exact host Git-source validation. Impact: Use committed test-only workflow snapshots with full source commits and SHA256 provenance. Real acquisition still executes trusted inline workflows and never reads these fixtures. Refs: Dependency-workspace U5/U7; archive receipt66f01970885b34bbb0f9a2dfb244e4a58618b725e600f85fe765099cf2f3bd36. --- .task/feature-dependency-workspace.md | 898 +++++++++++++++++ .../component-ci/Agent-Command/ci.yml | 498 +++++++++ .../fixtures/component-ci/Agent-Intent/ci.yml | 510 ++++++++++ .../fixtures/component-ci/Agent-Native/ci.yml | 510 ++++++++++ .../fixtures/component-ci/Agent-Squad/ci.yml | 513 ++++++++++ .../component-ci/Agent-System-Backend/ci.yml | 500 +++++++++ .../component-ci/Agent-System-Core/ci.yml | 707 +++++++++++++ .../component-ci/Agent-System-Frontend/ci.yml | 465 +++++++++ .../component-ci/Agent-System-RDM/ci.yml | 949 ++++++++++++++++++ .../component-ci/Agent-System-UI/ci.yml | 465 +++++++++ .../component-ci/Error-Code-System/ci.yml | 508 ++++++++++ .../component-ci/Logging-System/ci.yml | 511 ++++++++++ tests/fixtures/component-ci/provenance.json | 73 ++ tests/test_ci_credentials.py | 43 + tests/test_dependency_ci.py | 81 +- 15 files changed, 7225 insertions(+), 6 deletions(-) create mode 100644 tests/fixtures/component-ci/Agent-Command/ci.yml create mode 100644 tests/fixtures/component-ci/Agent-Intent/ci.yml create mode 100644 tests/fixtures/component-ci/Agent-Native/ci.yml create mode 100644 tests/fixtures/component-ci/Agent-Squad/ci.yml create mode 100644 tests/fixtures/component-ci/Agent-System-Backend/ci.yml create mode 100644 tests/fixtures/component-ci/Agent-System-Core/ci.yml create mode 100644 tests/fixtures/component-ci/Agent-System-Frontend/ci.yml create mode 100644 tests/fixtures/component-ci/Agent-System-RDM/ci.yml create mode 100644 tests/fixtures/component-ci/Agent-System-UI/ci.yml create mode 100644 tests/fixtures/component-ci/Error-Code-System/ci.yml create mode 100644 tests/fixtures/component-ci/Logging-System/ci.yml create mode 100644 tests/fixtures/component-ci/provenance.json diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md index 5ca0a146..53814665 100644 --- a/.task/feature-dependency-workspace.md +++ b/.task/feature-dependency-workspace.md @@ -10705,3 +10705,901 @@ ce-simplify-code 的 reuse/quality/efficiency 三个独立只读扫描完成。 "receipt_sha256": "11be0539e5d021b0ceda9d1e9d1859457e95b8b39dc8d5ca1b48c9108f4f8f12" } ``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T17:38:24.747474+00:00", + "command": "make workspace-prepare NAME=Agent-System-Documents REFRESH_FIXED=1", + "command_sha256": "36a84ee2d289271f066fc128912915be2c59969ca14571934279234009baf6eb", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "98d08347bd24ece91df108f4fc34bf2d94783676", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "6ed7b9322c5733f76b206a35cd78649ba385d83b", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "fffd5790cfab317fadafb40fa55a11bab6e9a847", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "1a842553b6a7432e5a85aaae43a45a7a7ea58195", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "7ba50e5b2dce226b4b962ea787222a4b08f0e94c", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "5492ea46784fcb12d1b93d2cf940bc9bcb20ffc414faab2c7a456460ad21f6f7", + "state_sha256": "ac06a71f0e86aa99311f2ccdf0cff3ba6aed282080c7c57b767317a2ec8d14cd" + } + }, + "after": { + "head": "98d08347bd24ece91df108f4fc34bf2d94783676", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "6ed7b9322c5733f76b206a35cd78649ba385d83b", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "fffd5790cfab317fadafb40fa55a11bab6e9a847", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "1a842553b6a7432e5a85aaae43a45a7a7ea58195", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "4a26798000c39cc59ba0c2cc6328f5c8f10dcb32", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "5492ea46784fcb12d1b93d2cf940bc9bcb20ffc414faab2c7a456460ad21f6f7", + "state_sha256": "198817d990551226344f2e531f14c5e1924b6dcba2425ff3feb60233625c8bd4" + } + }, + "after_error": null, + "exit_code": 0, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n{\n \"components\": {\n \"Agent-System-Documents\": {\n \"actual\": {\n \"branch\": null,\n \"changes\": [],\n \"common_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Documents/.git\",\n \"dirty\": false,\n \"git_dir\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Documents/.git\",\n \"head\": \"4a26798000c39cc59ba0c2cc6328f5c8f10dcb32\",\n \"ignored\": [],\n \"locks\": [],\n \"operations\": [],\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Documents.git\",\n \"worktrees\": [\n \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/.workspace/Agent-System-Documents\"\n ]\n },\n \"declared\": {\n \"commit\": \"4a26798000c39cc59ba0c2cc6328f5c8f10dcb32\"\n },\n \"path\": \".workspace/Agent-System-Documents\",\n \"registered\": {\n \"baseline\": \"4a26798000c39cc59ba0c2cc6328f5c8f10dcb32\",\n \"branch\": null,\n \"linked\": false,\n \"mode\": \"versioned\",\n \"origin\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Documents.git\",\n \"owner_root\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace\",\n \"path\": \".workspace/Agent-System-Documents\",\n \"previous_sources\": [\n {\n \"commit\": \"7ba50e5b2dce226b4b962ea787222a4b08f0e94c\",\n \"ref\": \"refs/workspace/fixed/7ba50e5b2dce226b4b962ea787222a4b08f0e94c\",\n \"source\": {\n \"kind\": \"source-lock\"\n }\n }\n ],\n \"source\": {\n \"kind\": \"source-lock\"\n }\n },\n \"repo\": \"ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Documents.git\",\n \"role\": \"documentation\"\n }\n },\n \"go_work\": null,\n \"root\": \"/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace\",\n \"schema\": 1\n}\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n", + "output_sha256": "56a7d5dfbd72f11b0f2d69053e5c7baf400b411260e680f6ba1cf9c80b07e23c", + "receipt_sha256": "f5e64d80b5794267f13013ae9003d560549f6f14817f6053faa8f9d32d828d7c" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T17:48:18.142925+00:00", + "command": "cd \"$(cat /tmp/dependency-ci-archive-root)\" && python3 -m unittest tests.test_dependency_ci tests.test_ci_credentials -q", + "command_sha256": "bb0a56da82933a4d847392fd3ab7c507441f7852be1670900d89de7e0cab5d10", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "98d08347bd24ece91df108f4fc34bf2d94783676", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": " M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "9010d1a0c6b7886fd4966b35b3bd91b22968b90fb4830201cbab93987df2f643", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "6ed7b9322c5733f76b206a35cd78649ba385d83b", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "fffd5790cfab317fadafb40fa55a11bab6e9a847", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "1a842553b6a7432e5a85aaae43a45a7a7ea58195", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "4a26798000c39cc59ba0c2cc6328f5c8f10dcb32", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "5492ea46784fcb12d1b93d2cf940bc9bcb20ffc414faab2c7a456460ad21f6f7", + "state_sha256": "198817d990551226344f2e531f14c5e1924b6dcba2425ff3feb60233625c8bd4" + } + }, + "after": { + "head": "98d08347bd24ece91df108f4fc34bf2d94783676", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": " M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "9010d1a0c6b7886fd4966b35b3bd91b22968b90fb4830201cbab93987df2f643", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "6ed7b9322c5733f76b206a35cd78649ba385d83b", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "fffd5790cfab317fadafb40fa55a11bab6e9a847", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "1a842553b6a7432e5a85aaae43a45a7a7ea58195", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "4a26798000c39cc59ba0c2cc6328f5c8f10dcb32", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "5492ea46784fcb12d1b93d2cf940bc9bcb20ffc414faab2c7a456460ad21f6f7", + "state_sha256": "198817d990551226344f2e531f14c5e1924b6dcba2425ff3feb60233625c8bd4" + } + }, + "after_error": null, + "exit_code": 1, + "output": "======================================================================\nERROR: test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) (repo='Logging-System')\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 190, in test_component_checkout_removes_tokens_before_candidate_executes\n result = self.run_phase(\"Checkout\", workflow=MIGRATION / repo / \".gitea/workflows/ci.yml\",\n extra={\"TOKEN\": , \"GITHUB_SHA\": sha, \"GITHUB_REPOSITORY\": \"weichen/\" + repo},\n after=\"python3 probe.py\")\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_ci_credentials.py\", line 22, in workflow_script\n lines = workflow.read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Logging-System/.gitea/workflows/ci.yml'\n\n======================================================================\nERROR: test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) (repo='Error-Code-System')\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 190, in test_component_checkout_removes_tokens_before_candidate_executes\n result = self.run_phase(\"Checkout\", workflow=MIGRATION / repo / \".gitea/workflows/ci.yml\",\n extra={\"TOKEN\": , \"GITHUB_SHA\": sha, \"GITHUB_REPOSITORY\": \"weichen/\" + repo},\n after=\"python3 probe.py\")\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_ci_credentials.py\", line 22, in workflow_script\n lines = workflow.read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Error-Code-System/.gitea/workflows/ci.yml'\n\n======================================================================\nERROR: test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) (repo='Agent-System-Core')\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 190, in test_component_checkout_removes_tokens_before_candidate_executes\n result = self.run_phase(\"Checkout\", workflow=MIGRATION / repo / \".gitea/workflows/ci.yml\",\n extra={\"TOKEN\": , \"GITHUB_SHA\": sha, \"GITHUB_REPOSITORY\": \"weichen/\" + repo},\n after=\"python3 probe.py\")\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_ci_credentials.py\", line 22, in workflow_script\n lines = workflow.read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Agent-System-Core/.gitea/workflows/ci.yml'\n\n======================================================================\nERROR: test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) (repo='Agent-Native')\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 190, in test_component_checkout_removes_tokens_before_candidate_executes\n result = self.run_phase(\"Checkout\", workflow=MIGRATION / repo / \".gitea/workflows/ci.yml\",\n extra={\"TOKEN\": , \"GITHUB_SHA\": sha, \"GITHUB_REPOSITORY\": \"weichen/\" + repo},\n after=\"python3 probe.py\")\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_ci_credentials.py\", line 22, in workflow_script\n lines = workflow.read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Agent-Native/.gitea/workflows/ci.yml'\n\n======================================================================\nERROR: test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) (repo='Agent-Intent')\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 190, in test_component_checkout_removes_tokens_before_candidate_executes\n result = self.run_phase(\"Checkout\", workflow=MIGRATION / repo / \".gitea/workflows/ci.yml\",\n extra={\"TOKEN\": , \"GITHUB_SHA\": sha, \"GITHUB_REPOSITORY\": \"weichen/\" + repo},\n after=\"python3 probe.py\")\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_ci_credentials.py\", line 22, in workflow_script\n lines = workflow.read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Agent-Intent/.gitea/workflows/ci.yml'\n\n======================================================================\nERROR: test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) (repo='Agent-Command')\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 190, in test_component_checkout_removes_tokens_before_candidate_executes\n result = self.run_phase(\"Checkout\", workflow=MIGRATION / repo / \".gitea/workflows/ci.yml\",\n extra={\"TOKEN\": , \"GITHUB_SHA\": sha, \"GITHUB_REPOSITORY\": \"weichen/\" + repo},\n after=\"python3 probe.py\")\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_ci_credentials.py\", line 22, in workflow_script\n lines = workflow.read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Agent-Command/.gitea/workflows/ci.yml'\n\n======================================================================\nERROR: test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) (repo='Agent-Squad')\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 190, in test_component_checkout_removes_tokens_before_candidate_executes\n result = self.run_phase(\"Checkout\", workflow=MIGRATION / repo / \".gitea/workflows/ci.yml\",\n extra={\"TOKEN\": , \"GITHUB_SHA\": sha, \"GITHUB_REPOSITORY\": \"weichen/\" + repo},\n after=\"python3 probe.py\")\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_ci_credentials.py\", line 22, in workflow_script\n lines = workflow.read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Agent-Squad/.gitea/workflows/ci.yml'\n\n======================================================================\nERROR: test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) (repo='Agent-System-Backend')\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 190, in test_component_checkout_removes_tokens_before_candidate_executes\n result = self.run_phase(\"Checkout\", workflow=MIGRATION / repo / \".gitea/workflows/ci.yml\",\n extra={\"TOKEN\": , \"GITHUB_SHA\": sha, \"GITHUB_REPOSITORY\": \"weichen/\" + repo},\n after=\"python3 probe.py\")\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_ci_credentials.py\", line 22, in workflow_script\n lines = workflow.read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Agent-System-Backend/.gitea/workflows/ci.yml'\n\n======================================================================\nERROR: test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) (repo='Agent-System-UI')\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 190, in test_component_checkout_removes_tokens_before_candidate_executes\n result = self.run_phase(\"Checkout\", workflow=MIGRATION / repo / \".gitea/workflows/ci.yml\",\n extra={\"TOKEN\": , \"GITHUB_SHA\": sha, \"GITHUB_REPOSITORY\": \"weichen/\" + repo},\n after=\"python3 probe.py\")\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_ci_credentials.py\", line 22, in workflow_script\n lines = workflow.read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Agent-System-UI/.gitea/workflows/ci.yml'\n\n======================================================================\nERROR: test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) (repo='Agent-System-Frontend')\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 190, in test_component_checkout_removes_tokens_before_candidate_executes\n result = self.run_phase(\"Checkout\", workflow=MIGRATION / repo / \".gitea/workflows/ci.yml\",\n extra={\"TOKEN\": , \"GITHUB_SHA\": sha, \"GITHUB_REPOSITORY\": \"weichen/\" + repo},\n after=\"python3 probe.py\")\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_ci_credentials.py\", line 22, in workflow_script\n lines = workflow.read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Agent-System-Frontend/.gitea/workflows/ci.yml'\n\n======================================================================\nERROR: test_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) (repo='Agent-System-RDM')\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 190, in test_component_checkout_removes_tokens_before_candidate_executes\n result = self.run_phase(\"Checkout\", workflow=MIGRATION / repo / \".gitea/workflows/ci.yml\",\n extra={\"TOKEN\": , \"GITHUB_SHA\": sha, \"GITHUB_REPOSITORY\": \"weichen/\" + repo},\n after=\"python3 probe.py\")\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_ci_credentials.py\", line 22, in workflow_script\n lines = workflow.read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Agent-System-RDM/.gitea/workflows/ci.yml'\n\n======================================================================\nERROR: test_component_ci_executes_nested_go_module_tests (tests.test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) (repo='Logging-System')\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 222, in test_component_ci_executes_nested_go_module_tests\n lines = (MIGRATION / repo / \".gitea/workflows/ci.yml\").read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Logging-System/.gitea/workflows/ci.yml'\n\n======================================================================\nERROR: test_component_ci_executes_nested_go_module_tests (tests.test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) (repo='Agent-Squad')\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 222, in test_component_ci_executes_nested_go_module_tests\n lines = (MIGRATION / repo / \".gitea/workflows/ci.yml\").read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Agent-Squad/.gitea/workflows/ci.yml'\n\n======================================================================\nERROR: test_go_prefetch_covers_logging_trace_module (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_covers_logging_trace_module)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 243, in test_go_prefetch_covers_logging_trace_module\n result = self.run_phase(\"Prefetch Go modules without executing candidate code\",\n workflow=MIGRATION / \"Logging-System/.gitea/workflows/ci.yml\")\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_ci_credentials.py\", line 22, in workflow_script\n lines = workflow.read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Logging-System/.gitea/workflows/ci.yml'\n\n======================================================================\nERROR: test_rdm_composition_lock_fetches_fixed_dev_without_executing_code (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_fetches_fixed_dev_without_executing_code)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 264, in test_rdm_composition_lock_fetches_fixed_dev_without_executing_code\n result = self.run_phase(\"Prefetch fixed Dev product composition\",\n workflow=MIGRATION / \"Agent-System-RDM/.gitea/workflows/ci.yml\")\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_ci_credentials.py\", line 22, in workflow_script\n lines = workflow.read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Agent-System-RDM/.gitea/workflows/ci.yml'\n\n======================================================================\nERROR: test_rdm_composition_lock_rejects_external_missing_and_malformed_commits (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) (lock={'schema': 1, 'repo': 'http://127.0.0.1:37187/untrusted/receiver', 'commit': 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'})\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 279, in test_rdm_composition_lock_rejects_external_missing_and_malformed_commits\n result = self.run_phase(\"Prefetch fixed Dev product composition\",\n workflow=MIGRATION / \"Agent-System-RDM/.gitea/workflows/ci.yml\")\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_ci_credentials.py\", line 22, in workflow_script\n lines = workflow.read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Agent-System-RDM/.gitea/workflows/ci.yml'\n\n======================================================================\nERROR: test_rdm_composition_lock_rejects_external_missing_and_malformed_commits (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) (lock={'schema': 1, 'repo': 'ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git'})\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 279, in test_rdm_composition_lock_rejects_external_missing_and_malformed_commits\n result = self.run_phase(\"Prefetch fixed Dev product composition\",\n workflow=MIGRATION / \"Agent-System-RDM/.gitea/workflows/ci.yml\")\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_ci_credentials.py\", line 22, in workflow_script\n lines = workflow.read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Agent-System-RDM/.gitea/workflows/ci.yml'\n\n======================================================================\nERROR: test_rdm_composition_lock_rejects_external_missing_and_malformed_commits (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) (lock={'schema': 1, 'repo': 'ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git', 'commit': 'main'})\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 279, in test_rdm_composition_lock_rejects_external_missing_and_malformed_commits\n result = self.run_phase(\"Prefetch fixed Dev product composition\",\n workflow=MIGRATION / \"Agent-System-RDM/.gitea/workflows/ci.yml\")\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 33, in run_phase\n return subprocess.run([\"bash\", \"-c\", phase(workflow, name) + \"\\n\" + after],\n ~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_dependency_ci.py\", line 18, in phase\n return fixture.workflow_script(workflow, name)\n ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n File \"/tmp/dependency-ci-archive-red-nobngl54/tests/test_ci_credentials.py\", line 22, in workflow_script\n lines = workflow.read_text().splitlines()\n ~~~~~~~~~~~~~~~~~~^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 787, in read_text\n with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f:\n ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/linuxbrew/.linuxbrew/Cellar/python@3.14/3.14.8/lib/python3.14/pathlib/__init__.py\", line 771, in open\n return io.open(self, mode, buffering, encoding, errors, newline)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/tmp/dependency-ci-archive-red-nobngl54/.migration/Agent-System-RDM/.gitea/workflows/ci.yml'\n\n----------------------------------------------------------------------\nRan 24 tests in 14.320s\n\nFAILED (errors=18)\n", + "output_sha256": "297a2275277501862110428373b3eeacf91fdcc2d849fc75a100a1d191145aa5", + "receipt_sha256": "f661504cc6ace0a185448d0cdf867c23b57f933bdb7b52cdea9c6f2bdd5d62aa" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T17:52:08.248128+00:00", + "command": "python3 -m unittest tests.test_dependency_ci tests.test_ci_credentials -v", + "command_sha256": "aec96627d88bea7de31c0a9715632d3316431ef9b5cd6d15741cb16317092664", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "98d08347bd24ece91df108f4fc34bf2d94783676", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": " M .task/feature-dependency-workspace.md\n M tests/test_ci_credentials.py\n M tests/test_dependency_ci.py\n?? tests/fixtures/component-ci/Agent-Command/ci.yml\n?? tests/fixtures/component-ci/Agent-Intent/ci.yml\n?? tests/fixtures/component-ci/Agent-Native/ci.yml\n?? tests/fixtures/component-ci/Agent-Squad/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Backend/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Core/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Frontend/ci.yml\n?? tests/fixtures/component-ci/Agent-System-RDM/ci.yml\n?? tests/fixtures/component-ci/Agent-System-UI/ci.yml\n?? tests/fixtures/component-ci/Error-Code-System/ci.yml\n?? tests/fixtures/component-ci/Logging-System/ci.yml\n?? tests/fixtures/component-ci/provenance.json\n", + "tracked_diff_sha256": "a3ecc3fb7019b47b4294c1d84cedcc6f99353328c1d49b00d511b8c23afa97a1", + "untracked": { + "tests/fixtures/component-ci/Agent-Command/ci.yml": "b12f615219a32dc4c477658e9abedbbe250aee260baf9c8cbffdb9a9d645f24e", + "tests/fixtures/component-ci/Agent-Intent/ci.yml": "c15dde13c41be0437db8d5b7e7e99c4ff37cab1af66515971400bfd7e5c94c55", + "tests/fixtures/component-ci/Agent-Native/ci.yml": "8d0cdab26b2758318b3bffeeb90b9c1ae947bc3f232e89e56ebf2f8edf45420d", + "tests/fixtures/component-ci/Agent-Squad/ci.yml": "641f7e84fae05b99397ffc3b311031099526a29e8c6e39ae6b43617e7e4b9fd4", + "tests/fixtures/component-ci/Agent-System-Backend/ci.yml": "c14a60739881d243cf459e05e8859976e6e86e6df3a272410cd2df3e0d43d063", + "tests/fixtures/component-ci/Agent-System-Core/ci.yml": "6b0b5568bffa26709469fc655dee61210300156dba79bb619a7017162b1846a6", + "tests/fixtures/component-ci/Agent-System-Frontend/ci.yml": "51aeaa0e2ced11bb36fd6b66ac8da66a1f2efdbd6a5d6036302159646cabc3be", + "tests/fixtures/component-ci/Agent-System-RDM/ci.yml": "47693ea41584cae52a32e291fae5fa995b5ca746b41cf150d6dac709e6a83b55", + "tests/fixtures/component-ci/Agent-System-UI/ci.yml": "ef41bf7d981c37246d71fe80c09fa077341802442aad213b14c9f18a17a58694", + "tests/fixtures/component-ci/Error-Code-System/ci.yml": "3fbbc1a91412bcac32a9eec8deaded8ce1b5151e512987a4669030a2cf5b776e", + "tests/fixtures/component-ci/Logging-System/ci.yml": "163d62d87654c98506a97bff6188c6d4c2338c3abfce1bec110b1de6c872cb24", + "tests/fixtures/component-ci/provenance.json": "a396986aa6cbec95e4398f7d480ca4a8adfa48e30940982585310f5de41ee0bf" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "6ed7b9322c5733f76b206a35cd78649ba385d83b", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "fffd5790cfab317fadafb40fa55a11bab6e9a847", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "1a842553b6a7432e5a85aaae43a45a7a7ea58195", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "4a26798000c39cc59ba0c2cc6328f5c8f10dcb32", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "5492ea46784fcb12d1b93d2cf940bc9bcb20ffc414faab2c7a456460ad21f6f7", + "state_sha256": "198817d990551226344f2e531f14c5e1924b6dcba2425ff3feb60233625c8bd4" + } + }, + "after": { + "head": "98d08347bd24ece91df108f4fc34bf2d94783676", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": " M .task/feature-dependency-workspace.md\n M tests/test_ci_credentials.py\n M tests/test_dependency_ci.py\n?? tests/fixtures/component-ci/Agent-Command/ci.yml\n?? tests/fixtures/component-ci/Agent-Intent/ci.yml\n?? tests/fixtures/component-ci/Agent-Native/ci.yml\n?? tests/fixtures/component-ci/Agent-Squad/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Backend/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Core/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Frontend/ci.yml\n?? tests/fixtures/component-ci/Agent-System-RDM/ci.yml\n?? tests/fixtures/component-ci/Agent-System-UI/ci.yml\n?? tests/fixtures/component-ci/Error-Code-System/ci.yml\n?? tests/fixtures/component-ci/Logging-System/ci.yml\n?? tests/fixtures/component-ci/provenance.json\n", + "tracked_diff_sha256": "a3ecc3fb7019b47b4294c1d84cedcc6f99353328c1d49b00d511b8c23afa97a1", + "untracked": { + "tests/fixtures/component-ci/Agent-Command/ci.yml": "b12f615219a32dc4c477658e9abedbbe250aee260baf9c8cbffdb9a9d645f24e", + "tests/fixtures/component-ci/Agent-Intent/ci.yml": "c15dde13c41be0437db8d5b7e7e99c4ff37cab1af66515971400bfd7e5c94c55", + "tests/fixtures/component-ci/Agent-Native/ci.yml": "8d0cdab26b2758318b3bffeeb90b9c1ae947bc3f232e89e56ebf2f8edf45420d", + "tests/fixtures/component-ci/Agent-Squad/ci.yml": "641f7e84fae05b99397ffc3b311031099526a29e8c6e39ae6b43617e7e4b9fd4", + "tests/fixtures/component-ci/Agent-System-Backend/ci.yml": "c14a60739881d243cf459e05e8859976e6e86e6df3a272410cd2df3e0d43d063", + "tests/fixtures/component-ci/Agent-System-Core/ci.yml": "6b0b5568bffa26709469fc655dee61210300156dba79bb619a7017162b1846a6", + "tests/fixtures/component-ci/Agent-System-Frontend/ci.yml": "51aeaa0e2ced11bb36fd6b66ac8da66a1f2efdbd6a5d6036302159646cabc3be", + "tests/fixtures/component-ci/Agent-System-RDM/ci.yml": "47693ea41584cae52a32e291fae5fa995b5ca746b41cf150d6dac709e6a83b55", + "tests/fixtures/component-ci/Agent-System-UI/ci.yml": "ef41bf7d981c37246d71fe80c09fa077341802442aad213b14c9f18a17a58694", + "tests/fixtures/component-ci/Error-Code-System/ci.yml": "3fbbc1a91412bcac32a9eec8deaded8ce1b5151e512987a4669030a2cf5b776e", + "tests/fixtures/component-ci/Logging-System/ci.yml": "163d62d87654c98506a97bff6188c6d4c2338c3abfce1bec110b1de6c872cb24", + "tests/fixtures/component-ci/provenance.json": "a396986aa6cbec95e4398f7d480ca4a8adfa48e30940982585310f5de41ee0bf" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "6ed7b9322c5733f76b206a35cd78649ba385d83b", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "fffd5790cfab317fadafb40fa55a11bab6e9a847", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "1a842553b6a7432e5a85aaae43a45a7a7ea58195", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "4a26798000c39cc59ba0c2cc6328f5c8f10dcb32", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "5492ea46784fcb12d1b93d2cf940bc9bcb20ffc414faab2c7a456460ad21f6f7", + "state_sha256": "198817d990551226344f2e531f14c5e1924b6dcba2425ff3feb60233625c8bd4" + } + }, + "after_error": null, + "exit_code": 0, + "output": "test_all_required_component_snapshots_have_fixed_provenance (tests.test_dependency_ci.ComponentWorkflowFixtureTests.test_all_required_component_snapshots_have_fixed_provenance) ... ok\ntest_missing_component_snapshot_is_not_skipped (tests.test_dependency_ci.ComponentWorkflowFixtureTests.test_missing_component_snapshot_is_not_skipped) ... ok\ntest_modified_workflow_snapshot_is_rejected_before_execution (tests.test_dependency_ci.ComponentWorkflowFixtureTests.test_modified_workflow_snapshot_is_rejected_before_execution) ... ok\ntest_omitted_repository_provenance_is_rejected (tests.test_dependency_ci.ComponentWorkflowFixtureTests.test_omitted_repository_provenance_is_rejected) ... ok\ntest_optional_source_validation_uses_immutable_commit_and_rejects_stale_head (tests.test_dependency_ci.ComponentWorkflowFixtureTests.test_optional_source_validation_uses_immutable_commit_and_rejects_stale_head) ... ok\ntest_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) ... ok\ntest_component_ci_executes_nested_go_module_tests (tests.test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) ... ok\ntest_external_npm_git_source_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_external_npm_git_source_rejected_before_authenticated_request) ... ok\ntest_go_prefetch_covers_logging_trace_module (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_covers_logging_trace_module) ... ok\ntest_go_prefetch_rejects_mutation_of_committed_checksums (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_rejects_mutation_of_committed_checksums) ... ok\ntest_go_prefetch_uses_only_registered_private_repo_and_local_toolchain (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain) ... ok\ntest_go_requirement_for_new_toolchain_fails_without_downloading_one (tests.test_dependency_ci.DependencyCITests.test_go_requirement_for_new_toolchain_fails_without_downloading_one) ... ok\ntest_npm_git_package_installs_committed_output_without_prepare (tests.test_dependency_ci.DependencyCITests.test_npm_git_package_installs_committed_output_without_prepare) ... ok\ntest_npm_nonregistry_tarball_rejected_before_request (tests.test_dependency_ci.DependencyCITests.test_npm_nonregistry_tarball_rejected_before_request) ... ok\ntest_npm_provider_prepare_is_rejected_without_execution (tests.test_dependency_ci.DependencyCITests.test_npm_provider_prepare_is_rejected_without_execution) ... ok\ntest_rdm_composition_lock_fetches_fixed_dev_without_executing_code (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_fetches_fixed_dev_without_executing_code) ... ok\ntest_rdm_composition_lock_rejects_external_missing_and_malformed_commits (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) ... ok\ntest_registered_application_lock_materializes_fixed_source (tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source) ... ok\ntest_unregistered_go_module_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_unregistered_go_module_rejected_before_authenticated_request) ... ok\ntest_unregistered_source_lock_is_rejected_before_component_fetch (tests.test_dependency_ci.DependencyCITests.test_unregistered_source_lock_is_rejected_before_component_fetch) ... ok\ntest_candidate_cannot_read_checkout_credentials (tests.test_ci_credentials.CheckoutTests.test_candidate_cannot_read_checkout_credentials) ... ok\ntest_candidate_submodule_update_commands_are_rejected (tests.test_ci_credentials.CheckoutTests.test_candidate_submodule_update_commands_are_rejected) ... ok\ntest_credential_destination_confined_to_injected_server (tests.test_ci_credentials.CheckoutTests.test_credential_destination_confined_to_injected_server) ... ok\ntest_external_or_unlisted_urls_are_rejected_before_component_fetch (tests.test_ci_credentials.CheckoutTests.test_external_or_unlisted_urls_are_rejected_before_component_fetch) ... ok\ntest_inherited_template_hook_does_not_execute_with_credentials (tests.test_ci_credentials.CheckoutTests.test_inherited_template_hook_does_not_execute_with_credentials) ... ok\ntest_nested_external_url_is_rejected_before_authenticated_fetch (tests.test_ci_credentials.CheckoutTests.test_nested_external_url_is_rejected_before_authenticated_fetch) ... ok\ntest_rdm_pin_fetch_is_three_shas_on_the_allowlist (tests.test_ci_credentials.CheckoutTests.test_rdm_pin_fetch_is_three_shas_on_the_allowlist) ... ok\ntest_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials (tests.test_ci_credentials.CheckoutTests.test_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials) ... ok\ntest_redirects_do_not_forward_credential_or_fetch_unlisted_target (tests.test_ci_credentials.CheckoutTests.test_redirects_do_not_forward_credential_or_fetch_unlisted_target) ... ok\n\n----------------------------------------------------------------------\nRan 29 tests in 18.032s\n\nOK\n", + "output_sha256": "f0a243199114694538ed7550c1c00f9b5be172d60c5b5d5fdec558094b4e7c2f", + "receipt_sha256": "3bc436be6880d5319b08903a9d6f22d8479e0879b362240a6c47db12a6d4aea9" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T17:53:15.894648+00:00", + "command": "cd \"$(cat /tmp/dependency-ci-archive-root)\" && python3 -m unittest tests.test_dependency_ci tests.test_ci_credentials -v", + "command_sha256": "599252c8726aff0b66579d30437c1b5553dcef7392ac085efe39b409bd83605e", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "98d08347bd24ece91df108f4fc34bf2d94783676", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": " M .task/feature-dependency-workspace.md\n M tests/test_ci_credentials.py\n M tests/test_dependency_ci.py\n?? tests/fixtures/component-ci/Agent-Command/ci.yml\n?? tests/fixtures/component-ci/Agent-Intent/ci.yml\n?? tests/fixtures/component-ci/Agent-Native/ci.yml\n?? tests/fixtures/component-ci/Agent-Squad/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Backend/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Core/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Frontend/ci.yml\n?? tests/fixtures/component-ci/Agent-System-RDM/ci.yml\n?? tests/fixtures/component-ci/Agent-System-UI/ci.yml\n?? tests/fixtures/component-ci/Error-Code-System/ci.yml\n?? tests/fixtures/component-ci/Logging-System/ci.yml\n?? tests/fixtures/component-ci/provenance.json\n", + "tracked_diff_sha256": "8031ac6a1dd1115a4859c40a446f1cc91c397581770908dca53f01ab90b58a05", + "untracked": { + "tests/fixtures/component-ci/Agent-Command/ci.yml": "b12f615219a32dc4c477658e9abedbbe250aee260baf9c8cbffdb9a9d645f24e", + "tests/fixtures/component-ci/Agent-Intent/ci.yml": "c15dde13c41be0437db8d5b7e7e99c4ff37cab1af66515971400bfd7e5c94c55", + "tests/fixtures/component-ci/Agent-Native/ci.yml": "8d0cdab26b2758318b3bffeeb90b9c1ae947bc3f232e89e56ebf2f8edf45420d", + "tests/fixtures/component-ci/Agent-Squad/ci.yml": "641f7e84fae05b99397ffc3b311031099526a29e8c6e39ae6b43617e7e4b9fd4", + "tests/fixtures/component-ci/Agent-System-Backend/ci.yml": "c14a60739881d243cf459e05e8859976e6e86e6df3a272410cd2df3e0d43d063", + "tests/fixtures/component-ci/Agent-System-Core/ci.yml": "6b0b5568bffa26709469fc655dee61210300156dba79bb619a7017162b1846a6", + "tests/fixtures/component-ci/Agent-System-Frontend/ci.yml": "51aeaa0e2ced11bb36fd6b66ac8da66a1f2efdbd6a5d6036302159646cabc3be", + "tests/fixtures/component-ci/Agent-System-RDM/ci.yml": "47693ea41584cae52a32e291fae5fa995b5ca746b41cf150d6dac709e6a83b55", + "tests/fixtures/component-ci/Agent-System-UI/ci.yml": "ef41bf7d981c37246d71fe80c09fa077341802442aad213b14c9f18a17a58694", + "tests/fixtures/component-ci/Error-Code-System/ci.yml": "3fbbc1a91412bcac32a9eec8deaded8ce1b5151e512987a4669030a2cf5b776e", + "tests/fixtures/component-ci/Logging-System/ci.yml": "163d62d87654c98506a97bff6188c6d4c2338c3abfce1bec110b1de6c872cb24", + "tests/fixtures/component-ci/provenance.json": "a396986aa6cbec95e4398f7d480ca4a8adfa48e30940982585310f5de41ee0bf" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "6ed7b9322c5733f76b206a35cd78649ba385d83b", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "fffd5790cfab317fadafb40fa55a11bab6e9a847", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "1a842553b6a7432e5a85aaae43a45a7a7ea58195", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "4a26798000c39cc59ba0c2cc6328f5c8f10dcb32", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "5492ea46784fcb12d1b93d2cf940bc9bcb20ffc414faab2c7a456460ad21f6f7", + "state_sha256": "198817d990551226344f2e531f14c5e1924b6dcba2425ff3feb60233625c8bd4" + } + }, + "after": { + "head": "98d08347bd24ece91df108f4fc34bf2d94783676", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": " M .task/feature-dependency-workspace.md\n M tests/test_ci_credentials.py\n M tests/test_dependency_ci.py\n?? tests/fixtures/component-ci/Agent-Command/ci.yml\n?? tests/fixtures/component-ci/Agent-Intent/ci.yml\n?? tests/fixtures/component-ci/Agent-Native/ci.yml\n?? tests/fixtures/component-ci/Agent-Squad/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Backend/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Core/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Frontend/ci.yml\n?? tests/fixtures/component-ci/Agent-System-RDM/ci.yml\n?? tests/fixtures/component-ci/Agent-System-UI/ci.yml\n?? tests/fixtures/component-ci/Error-Code-System/ci.yml\n?? tests/fixtures/component-ci/Logging-System/ci.yml\n?? tests/fixtures/component-ci/provenance.json\n", + "tracked_diff_sha256": "8031ac6a1dd1115a4859c40a446f1cc91c397581770908dca53f01ab90b58a05", + "untracked": { + "tests/fixtures/component-ci/Agent-Command/ci.yml": "b12f615219a32dc4c477658e9abedbbe250aee260baf9c8cbffdb9a9d645f24e", + "tests/fixtures/component-ci/Agent-Intent/ci.yml": "c15dde13c41be0437db8d5b7e7e99c4ff37cab1af66515971400bfd7e5c94c55", + "tests/fixtures/component-ci/Agent-Native/ci.yml": "8d0cdab26b2758318b3bffeeb90b9c1ae947bc3f232e89e56ebf2f8edf45420d", + "tests/fixtures/component-ci/Agent-Squad/ci.yml": "641f7e84fae05b99397ffc3b311031099526a29e8c6e39ae6b43617e7e4b9fd4", + "tests/fixtures/component-ci/Agent-System-Backend/ci.yml": "c14a60739881d243cf459e05e8859976e6e86e6df3a272410cd2df3e0d43d063", + "tests/fixtures/component-ci/Agent-System-Core/ci.yml": "6b0b5568bffa26709469fc655dee61210300156dba79bb619a7017162b1846a6", + "tests/fixtures/component-ci/Agent-System-Frontend/ci.yml": "51aeaa0e2ced11bb36fd6b66ac8da66a1f2efdbd6a5d6036302159646cabc3be", + "tests/fixtures/component-ci/Agent-System-RDM/ci.yml": "47693ea41584cae52a32e291fae5fa995b5ca746b41cf150d6dac709e6a83b55", + "tests/fixtures/component-ci/Agent-System-UI/ci.yml": "ef41bf7d981c37246d71fe80c09fa077341802442aad213b14c9f18a17a58694", + "tests/fixtures/component-ci/Error-Code-System/ci.yml": "3fbbc1a91412bcac32a9eec8deaded8ce1b5151e512987a4669030a2cf5b776e", + "tests/fixtures/component-ci/Logging-System/ci.yml": "163d62d87654c98506a97bff6188c6d4c2338c3abfce1bec110b1de6c872cb24", + "tests/fixtures/component-ci/provenance.json": "a396986aa6cbec95e4398f7d480ca4a8adfa48e30940982585310f5de41ee0bf" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "6ed7b9322c5733f76b206a35cd78649ba385d83b", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "fffd5790cfab317fadafb40fa55a11bab6e9a847", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "1a842553b6a7432e5a85aaae43a45a7a7ea58195", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "4a26798000c39cc59ba0c2cc6328f5c8f10dcb32", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "5492ea46784fcb12d1b93d2cf940bc9bcb20ffc414faab2c7a456460ad21f6f7", + "state_sha256": "198817d990551226344f2e531f14c5e1924b6dcba2425ff3feb60233625c8bd4" + } + }, + "after_error": null, + "exit_code": 0, + "output": "test_all_required_component_snapshots_have_fixed_provenance (tests.test_dependency_ci.ComponentWorkflowFixtureTests.test_all_required_component_snapshots_have_fixed_provenance) ... ok\ntest_missing_component_snapshot_is_not_skipped (tests.test_dependency_ci.ComponentWorkflowFixtureTests.test_missing_component_snapshot_is_not_skipped) ... ok\ntest_modified_workflow_snapshot_is_rejected_before_execution (tests.test_dependency_ci.ComponentWorkflowFixtureTests.test_modified_workflow_snapshot_is_rejected_before_execution) ... ok\ntest_omitted_repository_provenance_is_rejected (tests.test_dependency_ci.ComponentWorkflowFixtureTests.test_omitted_repository_provenance_is_rejected) ... ok\ntest_optional_source_validation_uses_immutable_commit_and_rejects_stale_head (tests.test_dependency_ci.ComponentWorkflowFixtureTests.test_optional_source_validation_uses_immutable_commit_and_rejects_stale_head) ... ok\ntest_component_checkout_removes_tokens_before_candidate_executes (tests.test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) ... ok\ntest_component_ci_executes_nested_go_module_tests (tests.test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) ... ok\ntest_external_npm_git_source_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_external_npm_git_source_rejected_before_authenticated_request) ... ok\ntest_go_prefetch_covers_logging_trace_module (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_covers_logging_trace_module) ... ok\ntest_go_prefetch_rejects_mutation_of_committed_checksums (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_rejects_mutation_of_committed_checksums) ... ok\ntest_go_prefetch_uses_only_registered_private_repo_and_local_toolchain (tests.test_dependency_ci.DependencyCITests.test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain) ... ok\ntest_go_requirement_for_new_toolchain_fails_without_downloading_one (tests.test_dependency_ci.DependencyCITests.test_go_requirement_for_new_toolchain_fails_without_downloading_one) ... ok\ntest_npm_git_package_installs_committed_output_without_prepare (tests.test_dependency_ci.DependencyCITests.test_npm_git_package_installs_committed_output_without_prepare) ... ok\ntest_npm_nonregistry_tarball_rejected_before_request (tests.test_dependency_ci.DependencyCITests.test_npm_nonregistry_tarball_rejected_before_request) ... ok\ntest_npm_provider_prepare_is_rejected_without_execution (tests.test_dependency_ci.DependencyCITests.test_npm_provider_prepare_is_rejected_without_execution) ... ok\ntest_rdm_composition_lock_fetches_fixed_dev_without_executing_code (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_fetches_fixed_dev_without_executing_code) ... ok\ntest_rdm_composition_lock_rejects_external_missing_and_malformed_commits (tests.test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) ... ok\ntest_registered_application_lock_materializes_fixed_source (tests.test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source) ... ok\ntest_unregistered_go_module_rejected_before_authenticated_request (tests.test_dependency_ci.DependencyCITests.test_unregistered_go_module_rejected_before_authenticated_request) ... ok\ntest_unregistered_source_lock_is_rejected_before_component_fetch (tests.test_dependency_ci.DependencyCITests.test_unregistered_source_lock_is_rejected_before_component_fetch) ... ok\ntest_candidate_cannot_read_checkout_credentials (tests.test_ci_credentials.CheckoutTests.test_candidate_cannot_read_checkout_credentials) ... ok\ntest_candidate_submodule_update_commands_are_rejected (tests.test_ci_credentials.CheckoutTests.test_candidate_submodule_update_commands_are_rejected) ... ok\ntest_credential_destination_confined_to_injected_server (tests.test_ci_credentials.CheckoutTests.test_credential_destination_confined_to_injected_server) ... ok\ntest_external_or_unlisted_urls_are_rejected_before_component_fetch (tests.test_ci_credentials.CheckoutTests.test_external_or_unlisted_urls_are_rejected_before_component_fetch) ... ok\ntest_inherited_template_hook_does_not_execute_with_credentials (tests.test_ci_credentials.CheckoutTests.test_inherited_template_hook_does_not_execute_with_credentials) ... ok\ntest_nested_external_url_is_rejected_before_authenticated_fetch (tests.test_ci_credentials.CheckoutTests.test_nested_external_url_is_rejected_before_authenticated_fetch) ... ok\ntest_rdm_pin_fetch_is_three_shas_on_the_allowlist (tests.test_ci_credentials.CheckoutTests.test_rdm_pin_fetch_is_three_shas_on_the_allowlist) ... ok\ntest_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials (tests.test_ci_credentials.CheckoutTests.test_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials) ... ok\ntest_redirects_do_not_forward_credential_or_fetch_unlisted_target (tests.test_ci_credentials.CheckoutTests.test_redirects_do_not_forward_credential_or_fetch_unlisted_target) ... ok\n\n----------------------------------------------------------------------\nRan 29 tests in 17.877s\n\nOK\n", + "output_sha256": "ef9779c04148ddd73b94d6697d09a2cf47a663e32cbc41cd1006b8aa010e8fa6", + "receipt_sha256": "66f01970885b34bbb0f9a2dfb244e4a58618b725e600f85fe765099cf2f3bd36" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-13T17:55:07.434798+00:00", + "command": "COMPONENT_CI_SOURCE_ROOT=\"$PWD/.migration\" python3 -m unittest tests.test_dependency_ci tests.test_ci_credentials -q", + "command_sha256": "f420f3db87d816349ae2773d8c3efc540d3a2408dfbc1a4d8f22db7f5fbd8edb", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "98d08347bd24ece91df108f4fc34bf2d94783676", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": " M .task/feature-dependency-workspace.md\n M tests/test_ci_credentials.py\n M tests/test_dependency_ci.py\n?? tests/fixtures/component-ci/Agent-Command/ci.yml\n?? tests/fixtures/component-ci/Agent-Intent/ci.yml\n?? tests/fixtures/component-ci/Agent-Native/ci.yml\n?? tests/fixtures/component-ci/Agent-Squad/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Backend/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Core/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Frontend/ci.yml\n?? tests/fixtures/component-ci/Agent-System-RDM/ci.yml\n?? tests/fixtures/component-ci/Agent-System-UI/ci.yml\n?? tests/fixtures/component-ci/Error-Code-System/ci.yml\n?? tests/fixtures/component-ci/Logging-System/ci.yml\n?? tests/fixtures/component-ci/provenance.json\n", + "tracked_diff_sha256": "fc9ca183867f2332ca6bdc07d315cf6ad2476f42473b32ecbcd3fd7348c963cf", + "untracked": { + "tests/fixtures/component-ci/Agent-Command/ci.yml": "b12f615219a32dc4c477658e9abedbbe250aee260baf9c8cbffdb9a9d645f24e", + "tests/fixtures/component-ci/Agent-Intent/ci.yml": "c15dde13c41be0437db8d5b7e7e99c4ff37cab1af66515971400bfd7e5c94c55", + "tests/fixtures/component-ci/Agent-Native/ci.yml": "8d0cdab26b2758318b3bffeeb90b9c1ae947bc3f232e89e56ebf2f8edf45420d", + "tests/fixtures/component-ci/Agent-Squad/ci.yml": "641f7e84fae05b99397ffc3b311031099526a29e8c6e39ae6b43617e7e4b9fd4", + "tests/fixtures/component-ci/Agent-System-Backend/ci.yml": "c14a60739881d243cf459e05e8859976e6e86e6df3a272410cd2df3e0d43d063", + "tests/fixtures/component-ci/Agent-System-Core/ci.yml": "6b0b5568bffa26709469fc655dee61210300156dba79bb619a7017162b1846a6", + "tests/fixtures/component-ci/Agent-System-Frontend/ci.yml": "51aeaa0e2ced11bb36fd6b66ac8da66a1f2efdbd6a5d6036302159646cabc3be", + "tests/fixtures/component-ci/Agent-System-RDM/ci.yml": "47693ea41584cae52a32e291fae5fa995b5ca746b41cf150d6dac709e6a83b55", + "tests/fixtures/component-ci/Agent-System-UI/ci.yml": "ef41bf7d981c37246d71fe80c09fa077341802442aad213b14c9f18a17a58694", + "tests/fixtures/component-ci/Error-Code-System/ci.yml": "3fbbc1a91412bcac32a9eec8deaded8ce1b5151e512987a4669030a2cf5b776e", + "tests/fixtures/component-ci/Logging-System/ci.yml": "163d62d87654c98506a97bff6188c6d4c2338c3abfce1bec110b1de6c872cb24", + "tests/fixtures/component-ci/provenance.json": "a396986aa6cbec95e4398f7d480ca4a8adfa48e30940982585310f5de41ee0bf" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "6ed7b9322c5733f76b206a35cd78649ba385d83b", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "fffd5790cfab317fadafb40fa55a11bab6e9a847", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "1a842553b6a7432e5a85aaae43a45a7a7ea58195", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "4a26798000c39cc59ba0c2cc6328f5c8f10dcb32", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "5492ea46784fcb12d1b93d2cf940bc9bcb20ffc414faab2c7a456460ad21f6f7", + "state_sha256": "198817d990551226344f2e531f14c5e1924b6dcba2425ff3feb60233625c8bd4" + } + }, + "after": { + "head": "98d08347bd24ece91df108f4fc34bf2d94783676", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "57bcb17ea212a531186b6e21617a7f3bea65a791", + "status": " M .task/feature-dependency-workspace.md\n M tests/test_ci_credentials.py\n M tests/test_dependency_ci.py\n?? tests/fixtures/component-ci/Agent-Command/ci.yml\n?? tests/fixtures/component-ci/Agent-Intent/ci.yml\n?? tests/fixtures/component-ci/Agent-Native/ci.yml\n?? tests/fixtures/component-ci/Agent-Squad/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Backend/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Core/ci.yml\n?? tests/fixtures/component-ci/Agent-System-Frontend/ci.yml\n?? tests/fixtures/component-ci/Agent-System-RDM/ci.yml\n?? tests/fixtures/component-ci/Agent-System-UI/ci.yml\n?? tests/fixtures/component-ci/Error-Code-System/ci.yml\n?? tests/fixtures/component-ci/Logging-System/ci.yml\n?? tests/fixtures/component-ci/provenance.json\n", + "tracked_diff_sha256": "fc9ca183867f2332ca6bdc07d315cf6ad2476f42473b32ecbcd3fd7348c963cf", + "untracked": { + "tests/fixtures/component-ci/Agent-Command/ci.yml": "b12f615219a32dc4c477658e9abedbbe250aee260baf9c8cbffdb9a9d645f24e", + "tests/fixtures/component-ci/Agent-Intent/ci.yml": "c15dde13c41be0437db8d5b7e7e99c4ff37cab1af66515971400bfd7e5c94c55", + "tests/fixtures/component-ci/Agent-Native/ci.yml": "8d0cdab26b2758318b3bffeeb90b9c1ae947bc3f232e89e56ebf2f8edf45420d", + "tests/fixtures/component-ci/Agent-Squad/ci.yml": "641f7e84fae05b99397ffc3b311031099526a29e8c6e39ae6b43617e7e4b9fd4", + "tests/fixtures/component-ci/Agent-System-Backend/ci.yml": "c14a60739881d243cf459e05e8859976e6e86e6df3a272410cd2df3e0d43d063", + "tests/fixtures/component-ci/Agent-System-Core/ci.yml": "6b0b5568bffa26709469fc655dee61210300156dba79bb619a7017162b1846a6", + "tests/fixtures/component-ci/Agent-System-Frontend/ci.yml": "51aeaa0e2ced11bb36fd6b66ac8da66a1f2efdbd6a5d6036302159646cabc3be", + "tests/fixtures/component-ci/Agent-System-RDM/ci.yml": "47693ea41584cae52a32e291fae5fa995b5ca746b41cf150d6dac709e6a83b55", + "tests/fixtures/component-ci/Agent-System-UI/ci.yml": "ef41bf7d981c37246d71fe80c09fa077341802442aad213b14c9f18a17a58694", + "tests/fixtures/component-ci/Error-Code-System/ci.yml": "3fbbc1a91412bcac32a9eec8deaded8ce1b5151e512987a4669030a2cf5b776e", + "tests/fixtures/component-ci/Logging-System/ci.yml": "163d62d87654c98506a97bff6188c6d4c2338c3abfce1bec110b1de6c872cb24", + "tests/fixtures/component-ci/provenance.json": "a396986aa6cbec95e4398f7d480ca4a8adfa48e30940982585310f5de41ee0bf" + }, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "6ed7b9322c5733f76b206a35cd78649ba385d83b", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "fffd5790cfab317fadafb40fa55a11bab6e9a847", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "1a842553b6a7432e5a85aaae43a45a7a7ea58195", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "4a26798000c39cc59ba0c2cc6328f5c8f10dcb32", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "5492ea46784fcb12d1b93d2cf940bc9bcb20ffc414faab2c7a456460ad21f6f7", + "state_sha256": "198817d990551226344f2e531f14c5e1924b6dcba2425ff3feb60233625c8bd4" + } + }, + "after_error": null, + "exit_code": 0, + "output": "----------------------------------------------------------------------\nRan 29 tests in 18.422s\n\nOK\n", + "output_sha256": "44e4b3c2ff58a1619287e9391a0866f0e06bc0ea8d2a5a02726baa671aa5d027", + "receipt_sha256": "6ac47142d9a15eb30f87ecac499a27fc6c75f216bcfd9b7acc5f46c9ffd53628" +} +``` diff --git a/tests/fixtures/component-ci/Agent-Command/ci.yml b/tests/fixtures/component-ci/Agent-Command/ci.yml new file mode 100644 index 00000000..e7ca8f3b --- /dev/null +++ b/tests/fixtures/component-ci/Agent-Command/ci.yml @@ -0,0 +1,498 @@ +name: ci +on: + push: + branches: [main] + pull_request: + branches: [main] +jobs: + vet-and-test: + runs-on: ubuntu-latest + env: + GOPROXY: https://goproxy.cn,direct + GOTOOLCHAIN: local + GOWORK: "off" + GOPRIVATE: git-ssh.u1680832.nyat.app/weichen + steps: + - name: Checkout + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_1 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def materialize_legacy(directory, depth=0): + if depth > 16: + raise ValueError("Historical submodule depth exceeds the checkout limit") + links = {} + for entry in git(directory, "ls-tree", "-rz", "HEAD").split(b"\0"): + if entry: + metadata, path = entry.split(b"\t", 1) + mode, kind, commit = metadata.decode().split() + if mode == "160000": + links[path.decode()] = commit + if not links: + return + raw = git(directory, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list") + entries = {} + for item in raw.split(b"\0"): + if not item: + continue + key, value = item.decode().split("\n", 1) + match = re.fullmatch(r"submodule\.(.+)\.(path|url)", key) + if not match: + raise ValueError("Unsupported candidate .gitmodules setting") + name, field = match.groups() + if field in entries.setdefault(name, {}): + raise ValueError("Duplicate candidate .gitmodules setting") + entries[name][field] = value + if set(entries) != set(links): + raise ValueError("Submodule names must match fixed gitlink paths") + for name, fields in entries.items(): + repo = LEGACY.get(name) + if not repo or fields.get("path") != name or fields.get("url") not in { + SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"}: + raise ValueError("Historical submodule source is outside the reviewed allowlist") + for name in entries: + repo = LEGACY[name] + sha = links[name] + url = f"{SERVER}/weichen/{repo}.git" + git(directory, "config", f"submodule.{name}.url", url) + # Trusted explicit checkout prevents candidate update commands from running. + git(directory, "submodule", "update", "--init", "--checkout", "--", name, token=component_token, repo=repo) + child = directory / name + if git(child, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Historical submodule does not match its fixed SHA") + mirror(repo, sha, component_token) + materialize_legacy(child, depth + 1) + + def materialize_manifest(directory): + manifest = directory / "components.json" + lock = directory / "components.lock.json" + if not manifest.exists() and not lock.exists(): + materialize_legacy(directory) + return + data = json.loads(manifest.read_text()) + locked = json.loads(lock.read_text()) + if data.get("schema") != 1 or locked.get("schema") != 1: + raise ValueError("Unsupported source manifest schema") + entries = {} + for item in data["components"]: + repo = item["id"] + path = ".workspace/" + repo + if (repo not in REPOS or repo in entries or item["path"] != path or + item["repo"] not in {SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"} or + item.get("role") not in {"go-library", "npm-library", "application", "guidelines", "documentation"}): + raise ValueError("Candidate source manifest is outside the reviewed allowlist") + for module in item.get("modules", []): + if module.get("path") not in GO_MODULES or not module["path"].startswith(GO_PREFIX + repo + ".git"): + raise ValueError("Candidate module mapping is outside the reviewed allowlist") + entries[repo] = item + selected = locked["components"] + if set(selected) - set(entries): + raise ValueError("Source lock refers to an unregistered repository") + for repo, item in entries.items(): + if item["role"] in {"application", "guidelines", "documentation"} and repo not in selected: + raise ValueError("Application and documentation source needs a fixed lock") + for repo, pin in selected.items(): + fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + if destination.exists() or destination.is_symlink() or destination.parent.is_symlink(): + raise ValueError("Source materialization requires a fresh destination") + # Validate the complete lock before any authenticated component fetch. + for repo, pin in selected.items(): + sha = fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + destination.mkdir(parents=True) + url = f"{SERVER}/weichen/{repo}.git" + git(destination, "init", "-q") + git(destination, "remote", "add", "origin", url) + git(destination, "fetch", "--depth=1", "origin", sha, token=component_token, repo=repo) + git(destination, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(destination, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Materialized source differs from the fixed lock") + # Persist the registered identity; process config chooses the transport. + git(destination, "remote", "set-url", "origin", entries[repo]["repo"]) + mirror(repo, sha, component_token) + materialize_legacy(destination) + + try: + if os.environ.get("GITHUB_REPOSITORY") != "weichen/Agent-Command": + raise ValueError("Checkout repository is outside the reviewed allowlist") + sha = fixed_sha(os.environ.get("GITHUB_SHA", "")) + if not root_token: + raise ValueError("Checkout requires TOKEN") + if (root / ".git").exists(): + raise ValueError("Checkout requires a fresh workspace") + git(root, "init", "-q") + git(root, "remote", "add", "origin", SERVER + "/weichen/Agent-Command.git") + git(root, "fetch", "--depth=1", "origin", sha, token=root_token, repo="Agent-Command") + git(root, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(root, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Checked-out commit differs from the platform commit") + if (root / ".ci-mirrors").exists() or (root / ".ci-mirrors.env").exists(): + raise ValueError("Candidate cannot provide trusted prefetch state") + materialize_manifest(root) + mirror_env() + except (ValueError, KeyError, OSError, subprocess.CalledProcessError) as error: + # Do not print child stderr or environment: a failed credential fetch stays redacted. + sys.exit("Checkout refused: " + str(error)) + print("Fixed source checkout complete; credentials were not persisted") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Install Go 1.27.1 + run: | + set -euo pipefail + curl -fsSL -o "$RUNNER_TEMP/go.tgz" https://mirrors.aliyun.com/golang/go1.27.1.linux-amd64.tar.gz + tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz" + ln -sfn /usr/local/go/bin/go /usr/local/bin/go + ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt + - name: Prefetch Go modules without executing candidate code + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_2 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def source_roots(): + bases = [root] + composition = root / ".ci-composition-dev" + if composition.is_dir() and not composition.is_symlink(): + bases.append(composition) + paths = [] + for base in bases: + paths += [base, base / "rdm"] + [base / path for path in LEGACY] + [base / ".workspace" / repo for repo in sorted(REPOS)] + return [path for path in paths if path.is_dir() and not path.is_symlink()] + try: + targets = [] + for source in source_roots(): + for suffix in (".", "examples/trace", "adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad"): + directory = source / suffix + if (directory / "go.mod").is_file() and directory.resolve() not in targets: + targets.append(directory.resolve()) + # Parse using the installed local Go tool without credentials or candidate execution. + original_files = {} + for directory in targets: + parsed_mod = json.loads(subprocess.check_output(["go", "mod", "edit", "-json"], cwd=directory, env=clean)) + canonical = parsed_mod["Module"]["Path"].startswith(GO_PREFIX) + for name in ("go.mod", "go.sum"): + dependency_file = directory / name + if dependency_file.is_file(): + original_files[(directory, name)] = dependency_file.read_bytes() + elif canonical and name == "go.sum": + original_files[(directory, name)] = None + for dep in (parsed_mod.get("Require") or []): + path = dep["Path"] + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go dependency is outside the reviewed module mapping") + for replacement in (parsed_mod.get("Replace") or []): + path = replacement["New"]["Path"] + if canonical and not replacement["New"].get("Version"): + raise ValueError("Canonical module cannot acquire a local path replacement") + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go replacement is outside the reviewed module mapping") + auth = config.copy() + for repo in sorted(GO_REPOS): + url = f"{SERVER}/weichen/{repo}.git" + auth[f"url.{url}.insteadOf"] = "https://" + GO_PREFIX + repo + auth[f"http.{url}.extraheader"] = "AUTHORIZATION: token " + component_token + def objects(output): + decoder = json.JSONDecoder() + remaining = output.strip() + while remaining: + item, end = decoder.raw_decode(remaining) + remaining = remaining[end:].lstrip() + yield item + def unchanged(): + for (owner, name), contents in original_files.items(): + dependency_file = owner / name + current = dependency_file.read_bytes() if dependency_file.exists() else None + if current != contents: + raise ValueError("Go acquisition modified a committed Go dependency file: " + str(dependency_file)) + for directory in targets: + # Resolve private go.mod metadata only through exact repository headers; + # validate the complete selected graph before acquiring module zip files. + graph = subprocess.run(["go", "list", "-mod=readonly", "-m", "-json", "all"], cwd=directory, + env=process_env(auth), capture_output=True, text=True) + if graph.returncode: + raise ValueError("Go selected graph resolution failed: " + graph.stderr.strip()) + for item in objects(graph.stdout): + if item.get("Main"): + continue + selected = item.get("Replace") or item + for path in (item.get("Path", ""), selected.get("Path", "")): + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Selected Go module is outside the reviewed mapping") + unchanged() + # Go 1.27 can prune go.sum even under -mod=readonly for this + # metadata-only command. Use a disposable copy, then validate actual + # package loading against the unchanged committed source locks. + local_replacements = json.loads(subprocess.check_output( + ["go", "mod", "edit", "-json"], cwd=directory, env=clean)).get("Replace") or [] + downloaded = "" + if not any(not item["New"].get("Version") for item in local_replacements): + with tempfile.TemporaryDirectory(prefix="ci-go-prefetch-") as temporary: + download_root = Path(temporary) + for name in ("go.mod", "go.sum"): + if (directory / name).is_file(): + (download_root / name).write_bytes((directory / name).read_bytes()) + result = subprocess.run(["go", "mod", "download", "-json"], cwd=download_root, + env=process_env(auth), capture_output=True, text=True) + if result.returncode: + raise ValueError("Go module acquisition failed: " + result.stderr.strip()) + downloaded = result.stdout + unchanged() + for item in objects(downloaded): + path = item.get("Path", "") + if path.startswith(GO_PREFIX): + if path not in GO_MODULES: + raise ValueError("Resolved Go module is outside the reviewed mapping") + repo = path[len(GO_PREFIX):].split(".git", 1)[0] + origin = item.get("Origin") or json.loads(Path(item["Info"]).read_text()).get("Origin") or {} + mirror(repo, fixed_sha(origin.get("Hash")), component_token) + # Package metadata loads actual test/build dependencies without running + # vet, compilers, package init functions or candidate tests. No CGO tools. + packages = subprocess.run(["go", "list", "-mod=readonly", "-deps", "-test", "./..."], cwd=directory, + env=process_env(auth) | {"CGO_ENABLED": "0"}, capture_output=True, text=True) + if packages.returncode: + raise ValueError("Go test/build dependency acquisition failed: " + packages.stderr.strip()) + unchanged() + mirror_env() + except (ValueError, OSError, subprocess.CalledProcessError) as error: + sys.exit("Go prefetch refused: " + str(error)) + print("Go modules cached with GOTOOLCHAIN=local; no candidate code executed") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Vet, test, and race + run: | + set -euo pipefail + source .ci-mirrors.env + GOWORK=off go vet -mod=readonly ./... && GOWORK=off go test -mod=readonly -count=1 ./... && GOWORK=off go test -mod=readonly -count=1 -race ./... diff --git a/tests/fixtures/component-ci/Agent-Intent/ci.yml b/tests/fixtures/component-ci/Agent-Intent/ci.yml new file mode 100644 index 00000000..41a05d58 --- /dev/null +++ b/tests/fixtures/component-ci/Agent-Intent/ci.yml @@ -0,0 +1,510 @@ +name: ci +on: + push: + branches: [main] + pull_request: + branches: [main] +jobs: + vet-and-test: + runs-on: ubuntu-latest + env: + GOPROXY: https://goproxy.cn,direct + GOTOOLCHAIN: local + GOWORK: "off" + GOPRIVATE: git-ssh.u1680832.nyat.app/weichen + steps: + - name: Checkout + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_1 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def materialize_legacy(directory, depth=0): + if depth > 16: + raise ValueError("Historical submodule depth exceeds the checkout limit") + links = {} + for entry in git(directory, "ls-tree", "-rz", "HEAD").split(b"\0"): + if entry: + metadata, path = entry.split(b"\t", 1) + mode, kind, commit = metadata.decode().split() + if mode == "160000": + links[path.decode()] = commit + if not links: + return + raw = git(directory, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list") + entries = {} + for item in raw.split(b"\0"): + if not item: + continue + key, value = item.decode().split("\n", 1) + match = re.fullmatch(r"submodule\.(.+)\.(path|url)", key) + if not match: + raise ValueError("Unsupported candidate .gitmodules setting") + name, field = match.groups() + if field in entries.setdefault(name, {}): + raise ValueError("Duplicate candidate .gitmodules setting") + entries[name][field] = value + if set(entries) != set(links): + raise ValueError("Submodule names must match fixed gitlink paths") + for name, fields in entries.items(): + repo = LEGACY.get(name) + if not repo or fields.get("path") != name or fields.get("url") not in { + SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"}: + raise ValueError("Historical submodule source is outside the reviewed allowlist") + for name in entries: + repo = LEGACY[name] + sha = links[name] + url = f"{SERVER}/weichen/{repo}.git" + git(directory, "config", f"submodule.{name}.url", url) + # Trusted explicit checkout prevents candidate update commands from running. + git(directory, "submodule", "update", "--init", "--checkout", "--", name, token=component_token, repo=repo) + child = directory / name + if git(child, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Historical submodule does not match its fixed SHA") + mirror(repo, sha, component_token) + materialize_legacy(child, depth + 1) + + def materialize_manifest(directory): + manifest = directory / "components.json" + lock = directory / "components.lock.json" + if not manifest.exists() and not lock.exists(): + materialize_legacy(directory) + return + data = json.loads(manifest.read_text()) + locked = json.loads(lock.read_text()) + if data.get("schema") != 1 or locked.get("schema") != 1: + raise ValueError("Unsupported source manifest schema") + entries = {} + for item in data["components"]: + repo = item["id"] + path = ".workspace/" + repo + if (repo not in REPOS or repo in entries or item["path"] != path or + item["repo"] not in {SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"} or + item.get("role") not in {"go-library", "npm-library", "application", "guidelines", "documentation"}): + raise ValueError("Candidate source manifest is outside the reviewed allowlist") + for module in item.get("modules", []): + if module.get("path") not in GO_MODULES or not module["path"].startswith(GO_PREFIX + repo + ".git"): + raise ValueError("Candidate module mapping is outside the reviewed allowlist") + entries[repo] = item + selected = locked["components"] + if set(selected) - set(entries): + raise ValueError("Source lock refers to an unregistered repository") + for repo, item in entries.items(): + if item["role"] in {"application", "guidelines", "documentation"} and repo not in selected: + raise ValueError("Application and documentation source needs a fixed lock") + for repo, pin in selected.items(): + fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + if destination.exists() or destination.is_symlink() or destination.parent.is_symlink(): + raise ValueError("Source materialization requires a fresh destination") + # Validate the complete lock before any authenticated component fetch. + for repo, pin in selected.items(): + sha = fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + destination.mkdir(parents=True) + url = f"{SERVER}/weichen/{repo}.git" + git(destination, "init", "-q") + git(destination, "remote", "add", "origin", url) + git(destination, "fetch", "--depth=1", "origin", sha, token=component_token, repo=repo) + git(destination, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(destination, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Materialized source differs from the fixed lock") + # Persist the registered identity; process config chooses the transport. + git(destination, "remote", "set-url", "origin", entries[repo]["repo"]) + mirror(repo, sha, component_token) + materialize_legacy(destination) + + try: + if os.environ.get("GITHUB_REPOSITORY") != "weichen/Agent-Intent": + raise ValueError("Checkout repository is outside the reviewed allowlist") + sha = fixed_sha(os.environ.get("GITHUB_SHA", "")) + if not root_token: + raise ValueError("Checkout requires TOKEN") + if (root / ".git").exists(): + raise ValueError("Checkout requires a fresh workspace") + git(root, "init", "-q") + git(root, "remote", "add", "origin", SERVER + "/weichen/Agent-Intent.git") + git(root, "fetch", "--depth=1", "origin", sha, token=root_token, repo="Agent-Intent") + git(root, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(root, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Checked-out commit differs from the platform commit") + if (root / ".ci-mirrors").exists() or (root / ".ci-mirrors.env").exists(): + raise ValueError("Candidate cannot provide trusted prefetch state") + materialize_manifest(root) + mirror_env() + except (ValueError, KeyError, OSError, subprocess.CalledProcessError) as error: + # Do not print child stderr or environment: a failed credential fetch stays redacted. + sys.exit("Checkout refused: " + str(error)) + print("Fixed source checkout complete; credentials were not persisted") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Install Go 1.27.1 + run: | + set -euo pipefail + curl -fsSL -o "$RUNNER_TEMP/go.tgz" https://mirrors.aliyun.com/golang/go1.27.1.linux-amd64.tar.gz + tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz" + ln -sfn /usr/local/go/bin/go /usr/local/bin/go + ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt + - name: Prefetch Go modules without executing candidate code + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_2 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def source_roots(): + bases = [root] + composition = root / ".ci-composition-dev" + if composition.is_dir() and not composition.is_symlink(): + bases.append(composition) + paths = [] + for base in bases: + paths += [base, base / "rdm"] + [base / path for path in LEGACY] + [base / ".workspace" / repo for repo in sorted(REPOS)] + return [path for path in paths if path.is_dir() and not path.is_symlink()] + try: + targets = [] + for source in source_roots(): + for suffix in (".", "examples/trace", "adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad"): + directory = source / suffix + if (directory / "go.mod").is_file() and directory.resolve() not in targets: + targets.append(directory.resolve()) + # Parse using the installed local Go tool without credentials or candidate execution. + original_files = {} + for directory in targets: + parsed_mod = json.loads(subprocess.check_output(["go", "mod", "edit", "-json"], cwd=directory, env=clean)) + canonical = parsed_mod["Module"]["Path"].startswith(GO_PREFIX) + for name in ("go.mod", "go.sum"): + dependency_file = directory / name + if dependency_file.is_file(): + original_files[(directory, name)] = dependency_file.read_bytes() + elif canonical and name == "go.sum": + original_files[(directory, name)] = None + for dep in (parsed_mod.get("Require") or []): + path = dep["Path"] + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go dependency is outside the reviewed module mapping") + for replacement in (parsed_mod.get("Replace") or []): + path = replacement["New"]["Path"] + if canonical and not replacement["New"].get("Version"): + raise ValueError("Canonical module cannot acquire a local path replacement") + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go replacement is outside the reviewed module mapping") + auth = config.copy() + for repo in sorted(GO_REPOS): + url = f"{SERVER}/weichen/{repo}.git" + auth[f"url.{url}.insteadOf"] = "https://" + GO_PREFIX + repo + auth[f"http.{url}.extraheader"] = "AUTHORIZATION: token " + component_token + def objects(output): + decoder = json.JSONDecoder() + remaining = output.strip() + while remaining: + item, end = decoder.raw_decode(remaining) + remaining = remaining[end:].lstrip() + yield item + def unchanged(): + for (owner, name), contents in original_files.items(): + dependency_file = owner / name + current = dependency_file.read_bytes() if dependency_file.exists() else None + if current != contents: + raise ValueError("Go acquisition modified a committed Go dependency file: " + str(dependency_file)) + for directory in targets: + # Resolve private go.mod metadata only through exact repository headers; + # validate the complete selected graph before acquiring module zip files. + graph = subprocess.run(["go", "list", "-mod=readonly", "-m", "-json", "all"], cwd=directory, + env=process_env(auth), capture_output=True, text=True) + if graph.returncode: + raise ValueError("Go selected graph resolution failed: " + graph.stderr.strip()) + for item in objects(graph.stdout): + if item.get("Main"): + continue + selected = item.get("Replace") or item + for path in (item.get("Path", ""), selected.get("Path", "")): + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Selected Go module is outside the reviewed mapping") + unchanged() + # Go 1.27 can prune go.sum even under -mod=readonly for this + # metadata-only command. Use a disposable copy, then validate actual + # package loading against the unchanged committed source locks. + local_replacements = json.loads(subprocess.check_output( + ["go", "mod", "edit", "-json"], cwd=directory, env=clean)).get("Replace") or [] + downloaded = "" + if not any(not item["New"].get("Version") for item in local_replacements): + with tempfile.TemporaryDirectory(prefix="ci-go-prefetch-") as temporary: + download_root = Path(temporary) + for name in ("go.mod", "go.sum"): + if (directory / name).is_file(): + (download_root / name).write_bytes((directory / name).read_bytes()) + result = subprocess.run(["go", "mod", "download", "-json"], cwd=download_root, + env=process_env(auth), capture_output=True, text=True) + if result.returncode: + raise ValueError("Go module acquisition failed: " + result.stderr.strip()) + downloaded = result.stdout + unchanged() + for item in objects(downloaded): + path = item.get("Path", "") + if path.startswith(GO_PREFIX): + if path not in GO_MODULES: + raise ValueError("Resolved Go module is outside the reviewed mapping") + repo = path[len(GO_PREFIX):].split(".git", 1)[0] + origin = item.get("Origin") or json.loads(Path(item["Info"]).read_text()).get("Origin") or {} + mirror(repo, fixed_sha(origin.get("Hash")), component_token) + # Package metadata loads actual test/build dependencies without running + # vet, compilers, package init functions or candidate tests. No CGO tools. + packages = subprocess.run(["go", "list", "-mod=readonly", "-deps", "-test", "./..."], cwd=directory, + env=process_env(auth) | {"CGO_ENABLED": "0"}, capture_output=True, text=True) + if packages.returncode: + raise ValueError("Go test/build dependency acquisition failed: " + packages.stderr.strip()) + unchanged() + mirror_env() + except (ValueError, OSError, subprocess.CalledProcessError) as error: + sys.exit("Go prefetch refused: " + str(error)) + print("Go modules cached with GOTOOLCHAIN=local; no candidate code executed") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Vet, test, and race + run: | + set -euo pipefail + source .ci-mirrors.env + GOWORK=off go vet -mod=readonly ./... && GOWORK=off go test -mod=readonly -count=1 ./... && GOWORK=off go test -mod=readonly -count=1 -race ./... + docker-checkout-hostgateway: + runs-on: ubuntu-latest + options: --add-host gitea:host-gateway + env: + GITHUB_SERVER_URL: http://gitea:3000 + steps: + - name: Checkout + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: *trusted_acquisition_1 + - run: test -f go.mod && echo "docker-mode checkout via host-gateway OK" diff --git a/tests/fixtures/component-ci/Agent-Native/ci.yml b/tests/fixtures/component-ci/Agent-Native/ci.yml new file mode 100644 index 00000000..bb62b4cf --- /dev/null +++ b/tests/fixtures/component-ci/Agent-Native/ci.yml @@ -0,0 +1,510 @@ +name: ci +on: + push: + branches: [main] + pull_request: + branches: [main] +jobs: + vet-and-test: + runs-on: ubuntu-latest + env: + GOPROXY: https://goproxy.cn,direct + GOTOOLCHAIN: local + GOWORK: "off" + GOPRIVATE: git-ssh.u1680832.nyat.app/weichen + steps: + - name: Checkout + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_1 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def materialize_legacy(directory, depth=0): + if depth > 16: + raise ValueError("Historical submodule depth exceeds the checkout limit") + links = {} + for entry in git(directory, "ls-tree", "-rz", "HEAD").split(b"\0"): + if entry: + metadata, path = entry.split(b"\t", 1) + mode, kind, commit = metadata.decode().split() + if mode == "160000": + links[path.decode()] = commit + if not links: + return + raw = git(directory, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list") + entries = {} + for item in raw.split(b"\0"): + if not item: + continue + key, value = item.decode().split("\n", 1) + match = re.fullmatch(r"submodule\.(.+)\.(path|url)", key) + if not match: + raise ValueError("Unsupported candidate .gitmodules setting") + name, field = match.groups() + if field in entries.setdefault(name, {}): + raise ValueError("Duplicate candidate .gitmodules setting") + entries[name][field] = value + if set(entries) != set(links): + raise ValueError("Submodule names must match fixed gitlink paths") + for name, fields in entries.items(): + repo = LEGACY.get(name) + if not repo or fields.get("path") != name or fields.get("url") not in { + SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"}: + raise ValueError("Historical submodule source is outside the reviewed allowlist") + for name in entries: + repo = LEGACY[name] + sha = links[name] + url = f"{SERVER}/weichen/{repo}.git" + git(directory, "config", f"submodule.{name}.url", url) + # Trusted explicit checkout prevents candidate update commands from running. + git(directory, "submodule", "update", "--init", "--checkout", "--", name, token=component_token, repo=repo) + child = directory / name + if git(child, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Historical submodule does not match its fixed SHA") + mirror(repo, sha, component_token) + materialize_legacy(child, depth + 1) + + def materialize_manifest(directory): + manifest = directory / "components.json" + lock = directory / "components.lock.json" + if not manifest.exists() and not lock.exists(): + materialize_legacy(directory) + return + data = json.loads(manifest.read_text()) + locked = json.loads(lock.read_text()) + if data.get("schema") != 1 or locked.get("schema") != 1: + raise ValueError("Unsupported source manifest schema") + entries = {} + for item in data["components"]: + repo = item["id"] + path = ".workspace/" + repo + if (repo not in REPOS or repo in entries or item["path"] != path or + item["repo"] not in {SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"} or + item.get("role") not in {"go-library", "npm-library", "application", "guidelines", "documentation"}): + raise ValueError("Candidate source manifest is outside the reviewed allowlist") + for module in item.get("modules", []): + if module.get("path") not in GO_MODULES or not module["path"].startswith(GO_PREFIX + repo + ".git"): + raise ValueError("Candidate module mapping is outside the reviewed allowlist") + entries[repo] = item + selected = locked["components"] + if set(selected) - set(entries): + raise ValueError("Source lock refers to an unregistered repository") + for repo, item in entries.items(): + if item["role"] in {"application", "guidelines", "documentation"} and repo not in selected: + raise ValueError("Application and documentation source needs a fixed lock") + for repo, pin in selected.items(): + fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + if destination.exists() or destination.is_symlink() or destination.parent.is_symlink(): + raise ValueError("Source materialization requires a fresh destination") + # Validate the complete lock before any authenticated component fetch. + for repo, pin in selected.items(): + sha = fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + destination.mkdir(parents=True) + url = f"{SERVER}/weichen/{repo}.git" + git(destination, "init", "-q") + git(destination, "remote", "add", "origin", url) + git(destination, "fetch", "--depth=1", "origin", sha, token=component_token, repo=repo) + git(destination, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(destination, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Materialized source differs from the fixed lock") + # Persist the registered identity; process config chooses the transport. + git(destination, "remote", "set-url", "origin", entries[repo]["repo"]) + mirror(repo, sha, component_token) + materialize_legacy(destination) + + try: + if os.environ.get("GITHUB_REPOSITORY") != "weichen/Agent-Native": + raise ValueError("Checkout repository is outside the reviewed allowlist") + sha = fixed_sha(os.environ.get("GITHUB_SHA", "")) + if not root_token: + raise ValueError("Checkout requires TOKEN") + if (root / ".git").exists(): + raise ValueError("Checkout requires a fresh workspace") + git(root, "init", "-q") + git(root, "remote", "add", "origin", SERVER + "/weichen/Agent-Native.git") + git(root, "fetch", "--depth=1", "origin", sha, token=root_token, repo="Agent-Native") + git(root, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(root, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Checked-out commit differs from the platform commit") + if (root / ".ci-mirrors").exists() or (root / ".ci-mirrors.env").exists(): + raise ValueError("Candidate cannot provide trusted prefetch state") + materialize_manifest(root) + mirror_env() + except (ValueError, KeyError, OSError, subprocess.CalledProcessError) as error: + # Do not print child stderr or environment: a failed credential fetch stays redacted. + sys.exit("Checkout refused: " + str(error)) + print("Fixed source checkout complete; credentials were not persisted") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Install Go 1.27.1 + run: | + set -euo pipefail + curl -fsSL -o "$RUNNER_TEMP/go.tgz" https://mirrors.aliyun.com/golang/go1.27.1.linux-amd64.tar.gz + tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz" + ln -sfn /usr/local/go/bin/go /usr/local/bin/go + ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt + - name: Prefetch Go modules without executing candidate code + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_2 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def source_roots(): + bases = [root] + composition = root / ".ci-composition-dev" + if composition.is_dir() and not composition.is_symlink(): + bases.append(composition) + paths = [] + for base in bases: + paths += [base, base / "rdm"] + [base / path for path in LEGACY] + [base / ".workspace" / repo for repo in sorted(REPOS)] + return [path for path in paths if path.is_dir() and not path.is_symlink()] + try: + targets = [] + for source in source_roots(): + for suffix in (".", "examples/trace", "adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad"): + directory = source / suffix + if (directory / "go.mod").is_file() and directory.resolve() not in targets: + targets.append(directory.resolve()) + # Parse using the installed local Go tool without credentials or candidate execution. + original_files = {} + for directory in targets: + parsed_mod = json.loads(subprocess.check_output(["go", "mod", "edit", "-json"], cwd=directory, env=clean)) + canonical = parsed_mod["Module"]["Path"].startswith(GO_PREFIX) + for name in ("go.mod", "go.sum"): + dependency_file = directory / name + if dependency_file.is_file(): + original_files[(directory, name)] = dependency_file.read_bytes() + elif canonical and name == "go.sum": + original_files[(directory, name)] = None + for dep in (parsed_mod.get("Require") or []): + path = dep["Path"] + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go dependency is outside the reviewed module mapping") + for replacement in (parsed_mod.get("Replace") or []): + path = replacement["New"]["Path"] + if canonical and not replacement["New"].get("Version"): + raise ValueError("Canonical module cannot acquire a local path replacement") + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go replacement is outside the reviewed module mapping") + auth = config.copy() + for repo in sorted(GO_REPOS): + url = f"{SERVER}/weichen/{repo}.git" + auth[f"url.{url}.insteadOf"] = "https://" + GO_PREFIX + repo + auth[f"http.{url}.extraheader"] = "AUTHORIZATION: token " + component_token + def objects(output): + decoder = json.JSONDecoder() + remaining = output.strip() + while remaining: + item, end = decoder.raw_decode(remaining) + remaining = remaining[end:].lstrip() + yield item + def unchanged(): + for (owner, name), contents in original_files.items(): + dependency_file = owner / name + current = dependency_file.read_bytes() if dependency_file.exists() else None + if current != contents: + raise ValueError("Go acquisition modified a committed Go dependency file: " + str(dependency_file)) + for directory in targets: + # Resolve private go.mod metadata only through exact repository headers; + # validate the complete selected graph before acquiring module zip files. + graph = subprocess.run(["go", "list", "-mod=readonly", "-m", "-json", "all"], cwd=directory, + env=process_env(auth), capture_output=True, text=True) + if graph.returncode: + raise ValueError("Go selected graph resolution failed: " + graph.stderr.strip()) + for item in objects(graph.stdout): + if item.get("Main"): + continue + selected = item.get("Replace") or item + for path in (item.get("Path", ""), selected.get("Path", "")): + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Selected Go module is outside the reviewed mapping") + unchanged() + # Go 1.27 can prune go.sum even under -mod=readonly for this + # metadata-only command. Use a disposable copy, then validate actual + # package loading against the unchanged committed source locks. + local_replacements = json.loads(subprocess.check_output( + ["go", "mod", "edit", "-json"], cwd=directory, env=clean)).get("Replace") or [] + downloaded = "" + if not any(not item["New"].get("Version") for item in local_replacements): + with tempfile.TemporaryDirectory(prefix="ci-go-prefetch-") as temporary: + download_root = Path(temporary) + for name in ("go.mod", "go.sum"): + if (directory / name).is_file(): + (download_root / name).write_bytes((directory / name).read_bytes()) + result = subprocess.run(["go", "mod", "download", "-json"], cwd=download_root, + env=process_env(auth), capture_output=True, text=True) + if result.returncode: + raise ValueError("Go module acquisition failed: " + result.stderr.strip()) + downloaded = result.stdout + unchanged() + for item in objects(downloaded): + path = item.get("Path", "") + if path.startswith(GO_PREFIX): + if path not in GO_MODULES: + raise ValueError("Resolved Go module is outside the reviewed mapping") + repo = path[len(GO_PREFIX):].split(".git", 1)[0] + origin = item.get("Origin") or json.loads(Path(item["Info"]).read_text()).get("Origin") or {} + mirror(repo, fixed_sha(origin.get("Hash")), component_token) + # Package metadata loads actual test/build dependencies without running + # vet, compilers, package init functions or candidate tests. No CGO tools. + packages = subprocess.run(["go", "list", "-mod=readonly", "-deps", "-test", "./..."], cwd=directory, + env=process_env(auth) | {"CGO_ENABLED": "0"}, capture_output=True, text=True) + if packages.returncode: + raise ValueError("Go test/build dependency acquisition failed: " + packages.stderr.strip()) + unchanged() + mirror_env() + except (ValueError, OSError, subprocess.CalledProcessError) as error: + sys.exit("Go prefetch refused: " + str(error)) + print("Go modules cached with GOTOOLCHAIN=local; no candidate code executed") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Vet, test, and race + run: | + set -euo pipefail + source .ci-mirrors.env + go vet -mod=readonly ./... && go test -mod=readonly -count=1 ./... && go test -mod=readonly -count=1 -race ./... + docker-checkout-hostgateway: + runs-on: ubuntu-latest + options: --add-host gitea:host-gateway + env: + GITHUB_SERVER_URL: http://gitea:3000 + steps: + - name: Checkout + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: *trusted_acquisition_1 + - run: test -f go.mod && echo "docker-mode checkout via host-gateway OK" diff --git a/tests/fixtures/component-ci/Agent-Squad/ci.yml b/tests/fixtures/component-ci/Agent-Squad/ci.yml new file mode 100644 index 00000000..ce53c556 --- /dev/null +++ b/tests/fixtures/component-ci/Agent-Squad/ci.yml @@ -0,0 +1,513 @@ +name: ci +on: + push: + branches: [main] + pull_request: + branches: [main] +jobs: + vet-and-test: + runs-on: ubuntu-latest + env: + GOPROXY: https://goproxy.cn,direct + GOTOOLCHAIN: local + GOWORK: "off" + GOPRIVATE: git-ssh.u1680832.nyat.app/weichen + steps: + - name: Checkout + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_1 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def materialize_legacy(directory, depth=0): + if depth > 16: + raise ValueError("Historical submodule depth exceeds the checkout limit") + links = {} + for entry in git(directory, "ls-tree", "-rz", "HEAD").split(b"\0"): + if entry: + metadata, path = entry.split(b"\t", 1) + mode, kind, commit = metadata.decode().split() + if mode == "160000": + links[path.decode()] = commit + if not links: + return + raw = git(directory, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list") + entries = {} + for item in raw.split(b"\0"): + if not item: + continue + key, value = item.decode().split("\n", 1) + match = re.fullmatch(r"submodule\.(.+)\.(path|url)", key) + if not match: + raise ValueError("Unsupported candidate .gitmodules setting") + name, field = match.groups() + if field in entries.setdefault(name, {}): + raise ValueError("Duplicate candidate .gitmodules setting") + entries[name][field] = value + if set(entries) != set(links): + raise ValueError("Submodule names must match fixed gitlink paths") + for name, fields in entries.items(): + repo = LEGACY.get(name) + if not repo or fields.get("path") != name or fields.get("url") not in { + SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"}: + raise ValueError("Historical submodule source is outside the reviewed allowlist") + for name in entries: + repo = LEGACY[name] + sha = links[name] + url = f"{SERVER}/weichen/{repo}.git" + git(directory, "config", f"submodule.{name}.url", url) + # Trusted explicit checkout prevents candidate update commands from running. + git(directory, "submodule", "update", "--init", "--checkout", "--", name, token=component_token, repo=repo) + child = directory / name + if git(child, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Historical submodule does not match its fixed SHA") + mirror(repo, sha, component_token) + materialize_legacy(child, depth + 1) + + def materialize_manifest(directory): + manifest = directory / "components.json" + lock = directory / "components.lock.json" + if not manifest.exists() and not lock.exists(): + materialize_legacy(directory) + return + data = json.loads(manifest.read_text()) + locked = json.loads(lock.read_text()) + if data.get("schema") != 1 or locked.get("schema") != 1: + raise ValueError("Unsupported source manifest schema") + entries = {} + for item in data["components"]: + repo = item["id"] + path = ".workspace/" + repo + if (repo not in REPOS or repo in entries or item["path"] != path or + item["repo"] not in {SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"} or + item.get("role") not in {"go-library", "npm-library", "application", "guidelines", "documentation"}): + raise ValueError("Candidate source manifest is outside the reviewed allowlist") + for module in item.get("modules", []): + if module.get("path") not in GO_MODULES or not module["path"].startswith(GO_PREFIX + repo + ".git"): + raise ValueError("Candidate module mapping is outside the reviewed allowlist") + entries[repo] = item + selected = locked["components"] + if set(selected) - set(entries): + raise ValueError("Source lock refers to an unregistered repository") + for repo, item in entries.items(): + if item["role"] in {"application", "guidelines", "documentation"} and repo not in selected: + raise ValueError("Application and documentation source needs a fixed lock") + for repo, pin in selected.items(): + fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + if destination.exists() or destination.is_symlink() or destination.parent.is_symlink(): + raise ValueError("Source materialization requires a fresh destination") + # Validate the complete lock before any authenticated component fetch. + for repo, pin in selected.items(): + sha = fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + destination.mkdir(parents=True) + url = f"{SERVER}/weichen/{repo}.git" + git(destination, "init", "-q") + git(destination, "remote", "add", "origin", url) + git(destination, "fetch", "--depth=1", "origin", sha, token=component_token, repo=repo) + git(destination, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(destination, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Materialized source differs from the fixed lock") + # Persist the registered identity; process config chooses the transport. + git(destination, "remote", "set-url", "origin", entries[repo]["repo"]) + mirror(repo, sha, component_token) + materialize_legacy(destination) + + try: + if os.environ.get("GITHUB_REPOSITORY") != "weichen/Agent-Squad": + raise ValueError("Checkout repository is outside the reviewed allowlist") + sha = fixed_sha(os.environ.get("GITHUB_SHA", "")) + if not root_token: + raise ValueError("Checkout requires TOKEN") + if (root / ".git").exists(): + raise ValueError("Checkout requires a fresh workspace") + git(root, "init", "-q") + git(root, "remote", "add", "origin", SERVER + "/weichen/Agent-Squad.git") + git(root, "fetch", "--depth=1", "origin", sha, token=root_token, repo="Agent-Squad") + git(root, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(root, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Checked-out commit differs from the platform commit") + if (root / ".ci-mirrors").exists() or (root / ".ci-mirrors.env").exists(): + raise ValueError("Candidate cannot provide trusted prefetch state") + materialize_manifest(root) + mirror_env() + except (ValueError, KeyError, OSError, subprocess.CalledProcessError) as error: + # Do not print child stderr or environment: a failed credential fetch stays redacted. + sys.exit("Checkout refused: " + str(error)) + print("Fixed source checkout complete; credentials were not persisted") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Install Go 1.27.1 + run: | + set -euo pipefail + curl -fsSL -o "$RUNNER_TEMP/go.tgz" https://mirrors.aliyun.com/golang/go1.27.1.linux-amd64.tar.gz + tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz" + ln -sfn /usr/local/go/bin/go /usr/local/bin/go + ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt + - name: Prefetch Go modules without executing candidate code + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_2 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def source_roots(): + bases = [root] + composition = root / ".ci-composition-dev" + if composition.is_dir() and not composition.is_symlink(): + bases.append(composition) + paths = [] + for base in bases: + paths += [base, base / "rdm"] + [base / path for path in LEGACY] + [base / ".workspace" / repo for repo in sorted(REPOS)] + return [path for path in paths if path.is_dir() and not path.is_symlink()] + try: + targets = [] + for source in source_roots(): + for suffix in (".", "examples/trace", "adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad"): + directory = source / suffix + if (directory / "go.mod").is_file() and directory.resolve() not in targets: + targets.append(directory.resolve()) + # Parse using the installed local Go tool without credentials or candidate execution. + original_files = {} + for directory in targets: + parsed_mod = json.loads(subprocess.check_output(["go", "mod", "edit", "-json"], cwd=directory, env=clean)) + canonical = parsed_mod["Module"]["Path"].startswith(GO_PREFIX) + for name in ("go.mod", "go.sum"): + dependency_file = directory / name + if dependency_file.is_file(): + original_files[(directory, name)] = dependency_file.read_bytes() + elif canonical and name == "go.sum": + original_files[(directory, name)] = None + for dep in (parsed_mod.get("Require") or []): + path = dep["Path"] + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go dependency is outside the reviewed module mapping") + for replacement in (parsed_mod.get("Replace") or []): + path = replacement["New"]["Path"] + if canonical and not replacement["New"].get("Version"): + raise ValueError("Canonical module cannot acquire a local path replacement") + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go replacement is outside the reviewed module mapping") + auth = config.copy() + for repo in sorted(GO_REPOS): + url = f"{SERVER}/weichen/{repo}.git" + auth[f"url.{url}.insteadOf"] = "https://" + GO_PREFIX + repo + auth[f"http.{url}.extraheader"] = "AUTHORIZATION: token " + component_token + def objects(output): + decoder = json.JSONDecoder() + remaining = output.strip() + while remaining: + item, end = decoder.raw_decode(remaining) + remaining = remaining[end:].lstrip() + yield item + def unchanged(): + for (owner, name), contents in original_files.items(): + dependency_file = owner / name + current = dependency_file.read_bytes() if dependency_file.exists() else None + if current != contents: + raise ValueError("Go acquisition modified a committed Go dependency file: " + str(dependency_file)) + for directory in targets: + # Resolve private go.mod metadata only through exact repository headers; + # validate the complete selected graph before acquiring module zip files. + graph = subprocess.run(["go", "list", "-mod=readonly", "-m", "-json", "all"], cwd=directory, + env=process_env(auth), capture_output=True, text=True) + if graph.returncode: + raise ValueError("Go selected graph resolution failed: " + graph.stderr.strip()) + for item in objects(graph.stdout): + if item.get("Main"): + continue + selected = item.get("Replace") or item + for path in (item.get("Path", ""), selected.get("Path", "")): + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Selected Go module is outside the reviewed mapping") + unchanged() + # Go 1.27 can prune go.sum even under -mod=readonly for this + # metadata-only command. Use a disposable copy, then validate actual + # package loading against the unchanged committed source locks. + local_replacements = json.loads(subprocess.check_output( + ["go", "mod", "edit", "-json"], cwd=directory, env=clean)).get("Replace") or [] + downloaded = "" + if not any(not item["New"].get("Version") for item in local_replacements): + with tempfile.TemporaryDirectory(prefix="ci-go-prefetch-") as temporary: + download_root = Path(temporary) + for name in ("go.mod", "go.sum"): + if (directory / name).is_file(): + (download_root / name).write_bytes((directory / name).read_bytes()) + result = subprocess.run(["go", "mod", "download", "-json"], cwd=download_root, + env=process_env(auth), capture_output=True, text=True) + if result.returncode: + raise ValueError("Go module acquisition failed: " + result.stderr.strip()) + downloaded = result.stdout + unchanged() + for item in objects(downloaded): + path = item.get("Path", "") + if path.startswith(GO_PREFIX): + if path not in GO_MODULES: + raise ValueError("Resolved Go module is outside the reviewed mapping") + repo = path[len(GO_PREFIX):].split(".git", 1)[0] + origin = item.get("Origin") or json.loads(Path(item["Info"]).read_text()).get("Origin") or {} + mirror(repo, fixed_sha(origin.get("Hash")), component_token) + # Package metadata loads actual test/build dependencies without running + # vet, compilers, package init functions or candidate tests. No CGO tools. + packages = subprocess.run(["go", "list", "-mod=readonly", "-deps", "-test", "./..."], cwd=directory, + env=process_env(auth) | {"CGO_ENABLED": "0"}, capture_output=True, text=True) + if packages.returncode: + raise ValueError("Go test/build dependency acquisition failed: " + packages.stderr.strip()) + unchanged() + mirror_env() + except (ValueError, OSError, subprocess.CalledProcessError) as error: + sys.exit("Go prefetch refused: " + str(error)) + print("Go modules cached with GOTOOLCHAIN=local; no candidate code executed") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Vet, test, and race + run: | + set -euo pipefail + source .ci-mirrors.env + for module in . adapters/native adapters/intent adapters/sqlite adapters/a2a cmd/agent-squad; do + test -f "$module/go.mod" + (cd "$module" && go vet -mod=readonly ./... && go test -mod=readonly -count=1 ./... && go test -mod=readonly -count=1 -race ./...) + done + docker-checkout-hostgateway: + runs-on: ubuntu-latest + options: --add-host gitea:host-gateway + env: + GITHUB_SERVER_URL: http://gitea:3000 + steps: + - name: Checkout + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: *trusted_acquisition_1 + - run: test -f go.mod && echo "docker-mode checkout via host-gateway OK" diff --git a/tests/fixtures/component-ci/Agent-System-Backend/ci.yml b/tests/fixtures/component-ci/Agent-System-Backend/ci.yml new file mode 100644 index 00000000..b7c092af --- /dev/null +++ b/tests/fixtures/component-ci/Agent-System-Backend/ci.yml @@ -0,0 +1,500 @@ +name: ci +on: + push: + branches: [main] + pull_request: + branches: [main] +jobs: + vet-and-test: + runs-on: ubuntu-latest + env: + GOPROXY: https://goproxy.cn,direct + GOTOOLCHAIN: local + GOWORK: "off" + GOPRIVATE: git-ssh.u1680832.nyat.app/weichen + steps: + - name: Checkout + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_1 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def materialize_legacy(directory, depth=0): + if depth > 16: + raise ValueError("Historical submodule depth exceeds the checkout limit") + links = {} + for entry in git(directory, "ls-tree", "-rz", "HEAD").split(b"\0"): + if entry: + metadata, path = entry.split(b"\t", 1) + mode, kind, commit = metadata.decode().split() + if mode == "160000": + links[path.decode()] = commit + if not links: + return + raw = git(directory, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list") + entries = {} + for item in raw.split(b"\0"): + if not item: + continue + key, value = item.decode().split("\n", 1) + match = re.fullmatch(r"submodule\.(.+)\.(path|url)", key) + if not match: + raise ValueError("Unsupported candidate .gitmodules setting") + name, field = match.groups() + if field in entries.setdefault(name, {}): + raise ValueError("Duplicate candidate .gitmodules setting") + entries[name][field] = value + if set(entries) != set(links): + raise ValueError("Submodule names must match fixed gitlink paths") + for name, fields in entries.items(): + repo = LEGACY.get(name) + if not repo or fields.get("path") != name or fields.get("url") not in { + SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"}: + raise ValueError("Historical submodule source is outside the reviewed allowlist") + for name in entries: + repo = LEGACY[name] + sha = links[name] + url = f"{SERVER}/weichen/{repo}.git" + git(directory, "config", f"submodule.{name}.url", url) + # Trusted explicit checkout prevents candidate update commands from running. + git(directory, "submodule", "update", "--init", "--checkout", "--", name, token=component_token, repo=repo) + child = directory / name + if git(child, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Historical submodule does not match its fixed SHA") + mirror(repo, sha, component_token) + materialize_legacy(child, depth + 1) + + def materialize_manifest(directory): + manifest = directory / "components.json" + lock = directory / "components.lock.json" + if not manifest.exists() and not lock.exists(): + materialize_legacy(directory) + return + data = json.loads(manifest.read_text()) + locked = json.loads(lock.read_text()) + if data.get("schema") != 1 or locked.get("schema") != 1: + raise ValueError("Unsupported source manifest schema") + entries = {} + for item in data["components"]: + repo = item["id"] + path = ".workspace/" + repo + if (repo not in REPOS or repo in entries or item["path"] != path or + item["repo"] not in {SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"} or + item.get("role") not in {"go-library", "npm-library", "application", "guidelines", "documentation"}): + raise ValueError("Candidate source manifest is outside the reviewed allowlist") + for module in item.get("modules", []): + if module.get("path") not in GO_MODULES or not module["path"].startswith(GO_PREFIX + repo + ".git"): + raise ValueError("Candidate module mapping is outside the reviewed allowlist") + entries[repo] = item + selected = locked["components"] + if set(selected) - set(entries): + raise ValueError("Source lock refers to an unregistered repository") + for repo, item in entries.items(): + if item["role"] in {"application", "guidelines", "documentation"} and repo not in selected: + raise ValueError("Application and documentation source needs a fixed lock") + for repo, pin in selected.items(): + fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + if destination.exists() or destination.is_symlink() or destination.parent.is_symlink(): + raise ValueError("Source materialization requires a fresh destination") + # Validate the complete lock before any authenticated component fetch. + for repo, pin in selected.items(): + sha = fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + destination.mkdir(parents=True) + url = f"{SERVER}/weichen/{repo}.git" + git(destination, "init", "-q") + git(destination, "remote", "add", "origin", url) + git(destination, "fetch", "--depth=1", "origin", sha, token=component_token, repo=repo) + git(destination, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(destination, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Materialized source differs from the fixed lock") + # Persist the registered identity; process config chooses the transport. + git(destination, "remote", "set-url", "origin", entries[repo]["repo"]) + mirror(repo, sha, component_token) + materialize_legacy(destination) + + try: + if os.environ.get("GITHUB_REPOSITORY") != "weichen/Agent-System-Backend": + raise ValueError("Checkout repository is outside the reviewed allowlist") + sha = fixed_sha(os.environ.get("GITHUB_SHA", "")) + if not root_token: + raise ValueError("Checkout requires TOKEN") + if (root / ".git").exists(): + raise ValueError("Checkout requires a fresh workspace") + git(root, "init", "-q") + git(root, "remote", "add", "origin", SERVER + "/weichen/Agent-System-Backend.git") + git(root, "fetch", "--depth=1", "origin", sha, token=root_token, repo="Agent-System-Backend") + git(root, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(root, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Checked-out commit differs from the platform commit") + if (root / ".ci-mirrors").exists() or (root / ".ci-mirrors.env").exists(): + raise ValueError("Candidate cannot provide trusted prefetch state") + materialize_manifest(root) + mirror_env() + except (ValueError, KeyError, OSError, subprocess.CalledProcessError) as error: + # Do not print child stderr or environment: a failed credential fetch stays redacted. + sys.exit("Checkout refused: " + str(error)) + print("Fixed source checkout complete; credentials were not persisted") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Install Go 1.27.1 + run: | + set -euo pipefail + curl -fsSL -o "$RUNNER_TEMP/go.tgz" https://mirrors.aliyun.com/golang/go1.27.1.linux-amd64.tar.gz + tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz" + ln -sfn /usr/local/go/bin/go /usr/local/bin/go + ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt + - name: Prefetch Go modules without executing candidate code + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_2 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def source_roots(): + bases = [root] + composition = root / ".ci-composition-dev" + if composition.is_dir() and not composition.is_symlink(): + bases.append(composition) + paths = [] + for base in bases: + paths += [base, base / "rdm"] + [base / path for path in LEGACY] + [base / ".workspace" / repo for repo in sorted(REPOS)] + return [path for path in paths if path.is_dir() and not path.is_symlink()] + try: + targets = [] + for source in source_roots(): + for suffix in (".", "examples/trace", "adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad"): + directory = source / suffix + if (directory / "go.mod").is_file() and directory.resolve() not in targets: + targets.append(directory.resolve()) + # Parse using the installed local Go tool without credentials or candidate execution. + original_files = {} + for directory in targets: + parsed_mod = json.loads(subprocess.check_output(["go", "mod", "edit", "-json"], cwd=directory, env=clean)) + canonical = parsed_mod["Module"]["Path"].startswith(GO_PREFIX) + for name in ("go.mod", "go.sum"): + dependency_file = directory / name + if dependency_file.is_file(): + original_files[(directory, name)] = dependency_file.read_bytes() + elif canonical and name == "go.sum": + original_files[(directory, name)] = None + for dep in (parsed_mod.get("Require") or []): + path = dep["Path"] + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go dependency is outside the reviewed module mapping") + for replacement in (parsed_mod.get("Replace") or []): + path = replacement["New"]["Path"] + if canonical and not replacement["New"].get("Version"): + raise ValueError("Canonical module cannot acquire a local path replacement") + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go replacement is outside the reviewed module mapping") + auth = config.copy() + for repo in sorted(GO_REPOS): + url = f"{SERVER}/weichen/{repo}.git" + auth[f"url.{url}.insteadOf"] = "https://" + GO_PREFIX + repo + auth[f"http.{url}.extraheader"] = "AUTHORIZATION: token " + component_token + def objects(output): + decoder = json.JSONDecoder() + remaining = output.strip() + while remaining: + item, end = decoder.raw_decode(remaining) + remaining = remaining[end:].lstrip() + yield item + def unchanged(): + for (owner, name), contents in original_files.items(): + dependency_file = owner / name + current = dependency_file.read_bytes() if dependency_file.exists() else None + if current != contents: + raise ValueError("Go acquisition modified a committed Go dependency file: " + str(dependency_file)) + for directory in targets: + # Resolve private go.mod metadata only through exact repository headers; + # validate the complete selected graph before acquiring module zip files. + graph = subprocess.run(["go", "list", "-mod=readonly", "-m", "-json", "all"], cwd=directory, + env=process_env(auth), capture_output=True, text=True) + if graph.returncode: + raise ValueError("Go selected graph resolution failed: " + graph.stderr.strip()) + for item in objects(graph.stdout): + if item.get("Main"): + continue + selected = item.get("Replace") or item + for path in (item.get("Path", ""), selected.get("Path", "")): + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Selected Go module is outside the reviewed mapping") + unchanged() + # Go 1.27 can prune go.sum even under -mod=readonly for this + # metadata-only command. Use a disposable copy, then validate actual + # package loading against the unchanged committed source locks. + local_replacements = json.loads(subprocess.check_output( + ["go", "mod", "edit", "-json"], cwd=directory, env=clean)).get("Replace") or [] + downloaded = "" + if not any(not item["New"].get("Version") for item in local_replacements): + with tempfile.TemporaryDirectory(prefix="ci-go-prefetch-") as temporary: + download_root = Path(temporary) + for name in ("go.mod", "go.sum"): + if (directory / name).is_file(): + (download_root / name).write_bytes((directory / name).read_bytes()) + result = subprocess.run(["go", "mod", "download", "-json"], cwd=download_root, + env=process_env(auth), capture_output=True, text=True) + if result.returncode: + raise ValueError("Go module acquisition failed: " + result.stderr.strip()) + downloaded = result.stdout + unchanged() + for item in objects(downloaded): + path = item.get("Path", "") + if path.startswith(GO_PREFIX): + if path not in GO_MODULES: + raise ValueError("Resolved Go module is outside the reviewed mapping") + repo = path[len(GO_PREFIX):].split(".git", 1)[0] + origin = item.get("Origin") or json.loads(Path(item["Info"]).read_text()).get("Origin") or {} + mirror(repo, fixed_sha(origin.get("Hash")), component_token) + # Package metadata loads actual test/build dependencies without running + # vet, compilers, package init functions or candidate tests. No CGO tools. + packages = subprocess.run(["go", "list", "-mod=readonly", "-deps", "-test", "./..."], cwd=directory, + env=process_env(auth) | {"CGO_ENABLED": "0"}, capture_output=True, text=True) + if packages.returncode: + raise ValueError("Go test/build dependency acquisition failed: " + packages.stderr.strip()) + unchanged() + mirror_env() + except (ValueError, OSError, subprocess.CalledProcessError) as error: + sys.exit("Go prefetch refused: " + str(error)) + print("Go modules cached with GOTOOLCHAIN=local; no candidate code executed") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Install house-style Python packages + run: python3 -m pip install --break-system-packages -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx python-pptx openpyxl + - name: Vet and test + run: | + set -euo pipefail + source .ci-mirrors.env + GOWORK=off go vet -mod=readonly ./... && GOWORK=off go test -mod=readonly -count=1 ./... diff --git a/tests/fixtures/component-ci/Agent-System-Core/ci.yml b/tests/fixtures/component-ci/Agent-System-Core/ci.yml new file mode 100644 index 00000000..df527cbb --- /dev/null +++ b/tests/fixtures/component-ci/Agent-System-Core/ci.yml @@ -0,0 +1,707 @@ +name: ci +on: + push: + branches: [main] + pull_request: + branches: [main] +jobs: + test: + runs-on: ubuntu-latest + env: + GOPROXY: https://goproxy.cn,direct + GOTOOLCHAIN: local + GOWORK: "off" + GOPRIVATE: git-ssh.u1680832.nyat.app/weichen + steps: + - name: Checkout + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_1 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def materialize_legacy(directory, depth=0): + if depth > 16: + raise ValueError("Historical submodule depth exceeds the checkout limit") + links = {} + for entry in git(directory, "ls-tree", "-rz", "HEAD").split(b"\0"): + if entry: + metadata, path = entry.split(b"\t", 1) + mode, kind, commit = metadata.decode().split() + if mode == "160000": + links[path.decode()] = commit + if not links: + return + raw = git(directory, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list") + entries = {} + for item in raw.split(b"\0"): + if not item: + continue + key, value = item.decode().split("\n", 1) + match = re.fullmatch(r"submodule\.(.+)\.(path|url)", key) + if not match: + raise ValueError("Unsupported candidate .gitmodules setting") + name, field = match.groups() + if field in entries.setdefault(name, {}): + raise ValueError("Duplicate candidate .gitmodules setting") + entries[name][field] = value + if set(entries) != set(links): + raise ValueError("Submodule names must match fixed gitlink paths") + for name, fields in entries.items(): + repo = LEGACY.get(name) + if not repo or fields.get("path") != name or fields.get("url") not in { + SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"}: + raise ValueError("Historical submodule source is outside the reviewed allowlist") + for name in entries: + repo = LEGACY[name] + sha = links[name] + url = f"{SERVER}/weichen/{repo}.git" + git(directory, "config", f"submodule.{name}.url", url) + # Trusted explicit checkout prevents candidate update commands from running. + git(directory, "submodule", "update", "--init", "--checkout", "--", name, token=component_token, repo=repo) + child = directory / name + if git(child, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Historical submodule does not match its fixed SHA") + mirror(repo, sha, component_token) + materialize_legacy(child, depth + 1) + + def materialize_manifest(directory): + manifest = directory / "components.json" + lock = directory / "components.lock.json" + if not manifest.exists() and not lock.exists(): + materialize_legacy(directory) + return + data = json.loads(manifest.read_text()) + locked = json.loads(lock.read_text()) + if data.get("schema") != 1 or locked.get("schema") != 1: + raise ValueError("Unsupported source manifest schema") + entries = {} + for item in data["components"]: + repo = item["id"] + path = ".workspace/" + repo + if (repo not in REPOS or repo in entries or item["path"] != path or + item["repo"] not in {SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"} or + item.get("role") not in {"go-library", "npm-library", "application", "guidelines", "documentation"}): + raise ValueError("Candidate source manifest is outside the reviewed allowlist") + for module in item.get("modules", []): + if module.get("path") not in GO_MODULES or not module["path"].startswith(GO_PREFIX + repo + ".git"): + raise ValueError("Candidate module mapping is outside the reviewed allowlist") + entries[repo] = item + selected = locked["components"] + if set(selected) - set(entries): + raise ValueError("Source lock refers to an unregistered repository") + for repo, item in entries.items(): + if item["role"] in {"application", "guidelines", "documentation"} and repo not in selected: + raise ValueError("Application and documentation source needs a fixed lock") + for repo, pin in selected.items(): + fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + if destination.exists() or destination.is_symlink() or destination.parent.is_symlink(): + raise ValueError("Source materialization requires a fresh destination") + # Validate the complete lock before any authenticated component fetch. + for repo, pin in selected.items(): + sha = fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + destination.mkdir(parents=True) + url = f"{SERVER}/weichen/{repo}.git" + git(destination, "init", "-q") + git(destination, "remote", "add", "origin", url) + git(destination, "fetch", "--depth=1", "origin", sha, token=component_token, repo=repo) + git(destination, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(destination, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Materialized source differs from the fixed lock") + # Persist the registered identity; process config chooses the transport. + git(destination, "remote", "set-url", "origin", entries[repo]["repo"]) + mirror(repo, sha, component_token) + materialize_legacy(destination) + + try: + if os.environ.get("GITHUB_REPOSITORY") != "weichen/Agent-System-Core": + raise ValueError("Checkout repository is outside the reviewed allowlist") + sha = fixed_sha(os.environ.get("GITHUB_SHA", "")) + if not root_token: + raise ValueError("Checkout requires TOKEN") + if (root / ".git").exists(): + raise ValueError("Checkout requires a fresh workspace") + git(root, "init", "-q") + git(root, "remote", "add", "origin", SERVER + "/weichen/Agent-System-Core.git") + git(root, "fetch", "--depth=1", "origin", sha, token=root_token, repo="Agent-System-Core") + git(root, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(root, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Checked-out commit differs from the platform commit") + if (root / ".ci-mirrors").exists() or (root / ".ci-mirrors.env").exists(): + raise ValueError("Candidate cannot provide trusted prefetch state") + materialize_manifest(root) + mirror_env() + except (ValueError, KeyError, OSError, subprocess.CalledProcessError) as error: + # Do not print child stderr or environment: a failed credential fetch stays redacted. + sys.exit("Checkout refused: " + str(error)) + print("Fixed source checkout complete; credentials were not persisted") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Install Go 1.27.1 + run: | + set -euo pipefail + curl -fsSL -o "$RUNNER_TEMP/go.tgz" https://mirrors.aliyun.com/golang/go1.27.1.linux-amd64.tar.gz + tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz" + ln -sfn /usr/local/go/bin/go /usr/local/bin/go + ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt + - name: Prefetch Go modules without executing candidate code + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_2 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def source_roots(): + bases = [root] + composition = root / ".ci-composition-dev" + if composition.is_dir() and not composition.is_symlink(): + bases.append(composition) + paths = [] + for base in bases: + paths += [base, base / "rdm"] + [base / path for path in LEGACY] + [base / ".workspace" / repo for repo in sorted(REPOS)] + return [path for path in paths if path.is_dir() and not path.is_symlink()] + try: + targets = [] + for source in source_roots(): + for suffix in (".", "examples/trace", "adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad"): + directory = source / suffix + if (directory / "go.mod").is_file() and directory.resolve() not in targets: + targets.append(directory.resolve()) + # Parse using the installed local Go tool without credentials or candidate execution. + original_files = {} + for directory in targets: + parsed_mod = json.loads(subprocess.check_output(["go", "mod", "edit", "-json"], cwd=directory, env=clean)) + canonical = parsed_mod["Module"]["Path"].startswith(GO_PREFIX) + for name in ("go.mod", "go.sum"): + dependency_file = directory / name + if dependency_file.is_file(): + original_files[(directory, name)] = dependency_file.read_bytes() + elif canonical and name == "go.sum": + original_files[(directory, name)] = None + for dep in (parsed_mod.get("Require") or []): + path = dep["Path"] + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go dependency is outside the reviewed module mapping") + for replacement in (parsed_mod.get("Replace") or []): + path = replacement["New"]["Path"] + if canonical and not replacement["New"].get("Version"): + raise ValueError("Canonical module cannot acquire a local path replacement") + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go replacement is outside the reviewed module mapping") + auth = config.copy() + for repo in sorted(GO_REPOS): + url = f"{SERVER}/weichen/{repo}.git" + auth[f"url.{url}.insteadOf"] = "https://" + GO_PREFIX + repo + auth[f"http.{url}.extraheader"] = "AUTHORIZATION: token " + component_token + def objects(output): + decoder = json.JSONDecoder() + remaining = output.strip() + while remaining: + item, end = decoder.raw_decode(remaining) + remaining = remaining[end:].lstrip() + yield item + def unchanged(): + for (owner, name), contents in original_files.items(): + dependency_file = owner / name + current = dependency_file.read_bytes() if dependency_file.exists() else None + if current != contents: + raise ValueError("Go acquisition modified a committed Go dependency file: " + str(dependency_file)) + for directory in targets: + # Resolve private go.mod metadata only through exact repository headers; + # validate the complete selected graph before acquiring module zip files. + graph = subprocess.run(["go", "list", "-mod=readonly", "-m", "-json", "all"], cwd=directory, + env=process_env(auth), capture_output=True, text=True) + if graph.returncode: + raise ValueError("Go selected graph resolution failed: " + graph.stderr.strip()) + for item in objects(graph.stdout): + if item.get("Main"): + continue + selected = item.get("Replace") or item + for path in (item.get("Path", ""), selected.get("Path", "")): + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Selected Go module is outside the reviewed mapping") + unchanged() + # Go 1.27 can prune go.sum even under -mod=readonly for this + # metadata-only command. Use a disposable copy, then validate actual + # package loading against the unchanged committed source locks. + local_replacements = json.loads(subprocess.check_output( + ["go", "mod", "edit", "-json"], cwd=directory, env=clean)).get("Replace") or [] + downloaded = "" + if not any(not item["New"].get("Version") for item in local_replacements): + with tempfile.TemporaryDirectory(prefix="ci-go-prefetch-") as temporary: + download_root = Path(temporary) + for name in ("go.mod", "go.sum"): + if (directory / name).is_file(): + (download_root / name).write_bytes((directory / name).read_bytes()) + result = subprocess.run(["go", "mod", "download", "-json"], cwd=download_root, + env=process_env(auth), capture_output=True, text=True) + if result.returncode: + raise ValueError("Go module acquisition failed: " + result.stderr.strip()) + downloaded = result.stdout + unchanged() + for item in objects(downloaded): + path = item.get("Path", "") + if path.startswith(GO_PREFIX): + if path not in GO_MODULES: + raise ValueError("Resolved Go module is outside the reviewed mapping") + repo = path[len(GO_PREFIX):].split(".git", 1)[0] + origin = item.get("Origin") or json.loads(Path(item["Info"]).read_text()).get("Origin") or {} + mirror(repo, fixed_sha(origin.get("Hash")), component_token) + # Package metadata loads actual test/build dependencies without running + # vet, compilers, package init functions or candidate tests. No CGO tools. + packages = subprocess.run(["go", "list", "-mod=readonly", "-deps", "-test", "./..."], cwd=directory, + env=process_env(auth) | {"CGO_ENABLED": "0"}, capture_output=True, text=True) + if packages.returncode: + raise ValueError("Go test/build dependency acquisition failed: " + packages.stderr.strip()) + unchanged() + mirror_env() + except (ValueError, OSError, subprocess.CalledProcessError) as error: + sys.exit("Go prefetch refused: " + str(error)) + print("Go modules cached with GOTOOLCHAIN=local; no candidate code executed") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Vet, test, and race + run: | + set -euo pipefail + source .ci-mirrors.env + GOWORK=off go vet -mod=readonly ./... && GOWORK=off go test -mod=readonly -count=1 ./... && GOWORK=off go test -mod=readonly -count=1 -race ./... + - name: Install Node 22 + run: | + set -euo pipefail + curl -fsSL -o "$RUNNER_TEMP/node.tar.xz" https://npmmirror.com/mirrors/node/v22.23.3/node-v22.23.3-linux-x64.tar.xz + tar -C /usr/local --strip-components=1 -xJf "$RUNNER_TEMP/node.tar.xz" + - name: Prefetch npm packages without lifecycle scripts + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_3 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def source_roots(): + bases = [root] + composition = root / ".ci-composition-dev" + if composition.is_dir() and not composition.is_symlink(): + bases.append(composition) + paths = [] + for base in bases: + paths += [base, base / "rdm"] + [base / path for path in LEGACY] + [base / ".workspace" / repo for repo in sorted(REPOS)] + return [path for path in paths if path.is_dir() and not path.is_symlink()] + def git_package(value): + if not isinstance(value, str): + return None + if value.startswith(("file:", "link:", "workspace:")): + raise ValueError("Formal npm acquisition cannot consume a local package override") + if value.startswith(("http://", "https://")): + registry = urlsplit(value) + if registry.scheme != "https" or registry.hostname != "registry.npmjs.org" or registry.username or registry.password: + raise ValueError("npm tarball source is outside the reviewed public registry") + elif "/" in value and not value.startswith(("git+", "npm:")): + raise ValueError("npm repository shorthand is outside the fixed-SHA package mapping") + if value.startswith("git+") or value.startswith(("git://", "ssh://", "github:", "gitlab:", "bitbucket:")): + for repo in ("Agent-System-Core", "Agent-System-UI"): + prefix = "git+" + SSH + repo + ".git#" + if value.startswith(prefix): + return repo, fixed_sha(value[len(prefix):]) + raise ValueError("npm Git source is outside the reviewed fixed-SHA package mapping") + return None + + try: + targets = [] + selected = set() + for directory in source_roots(): + if not (directory / "package.json").is_file(): + continue + if (directory / ".npmrc").exists(): + raise ValueError("Candidate .npmrc is not allowed during private dependency acquisition") + package = json.loads((directory / "package.json").read_text()) + lock = json.loads((directory / "package-lock.json").read_text()) + if lock.get("lockfileVersion") not in {2, 3}: + raise ValueError("npm acquisition requires a package lock") + for group in ("dependencies", "devDependencies", "optionalDependencies"): + for value in package.get(group, {}).values(): + found = git_package(value) + if found: + selected.add(found) + for entry in lock.get("packages", {}).values(): + found = git_package(entry.get("resolved")) + if found: + selected.add(found) + for group in ("dependencies", "devDependencies", "optionalDependencies"): + for value in entry.get(group, {}).values(): + found = git_package(value) + if found: + selected.add(found) + targets.append(directory) + # Fetch only registered fixed Git package commits. npm never receives token config. + for repo, sha in sorted(selected): + repository = mirror(repo, sha, component_token) + package = json.loads(git(repository, "show", sha + ":package.json")) + forbidden = {"prepare", "prepack", "prepublish", "prepublishOnly", "preinstall", "install", "postinstall"} + if forbidden & set(package.get("scripts", {})): + raise ValueError("Git package provider must commit outputs without acquisition lifecycle scripts") + if not git(repository, "ls-tree", sha, "package/").strip(): + raise ValueError("Git package provider is missing committed package outputs") + no_auth = mirror_env() + empty_config = tempfile.NamedTemporaryFile(prefix="ci-npm-globalrc-") + for directory in targets: + result = subprocess.run(["npm", "ci", "--ignore-scripts", "--no-audit", "--no-fund", + "--userconfig=/dev/null", "--globalconfig=" + empty_config.name], + cwd=directory, env=no_auth, capture_output=True, text=True) + if result.returncode: + raise ValueError("npm dependency acquisition failed: " + result.stderr.strip()) + except (ValueError, OSError, subprocess.CalledProcessError) as error: + sys.exit("npm prefetch refused: " + str(error)) + print("npm packages cached without credentials or lifecycle execution") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Validate package and contracts without credentials + run: | + set -euo pipefail + source .ci-mirrors.env + npm test + npm run typecheck diff --git a/tests/fixtures/component-ci/Agent-System-Frontend/ci.yml b/tests/fixtures/component-ci/Agent-System-Frontend/ci.yml new file mode 100644 index 00000000..df9df1cb --- /dev/null +++ b/tests/fixtures/component-ci/Agent-System-Frontend/ci.yml @@ -0,0 +1,465 @@ +name: ci +on: + push: + branches: [main] + pull_request: + branches: [main] +jobs: + test: + runs-on: ubuntu-latest + env: + GOPROXY: https://goproxy.cn,direct + GOTOOLCHAIN: local + GOWORK: "off" + GOPRIVATE: git-ssh.u1680832.nyat.app/weichen + steps: + - name: Checkout + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_1 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def materialize_legacy(directory, depth=0): + if depth > 16: + raise ValueError("Historical submodule depth exceeds the checkout limit") + links = {} + for entry in git(directory, "ls-tree", "-rz", "HEAD").split(b"\0"): + if entry: + metadata, path = entry.split(b"\t", 1) + mode, kind, commit = metadata.decode().split() + if mode == "160000": + links[path.decode()] = commit + if not links: + return + raw = git(directory, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list") + entries = {} + for item in raw.split(b"\0"): + if not item: + continue + key, value = item.decode().split("\n", 1) + match = re.fullmatch(r"submodule\.(.+)\.(path|url)", key) + if not match: + raise ValueError("Unsupported candidate .gitmodules setting") + name, field = match.groups() + if field in entries.setdefault(name, {}): + raise ValueError("Duplicate candidate .gitmodules setting") + entries[name][field] = value + if set(entries) != set(links): + raise ValueError("Submodule names must match fixed gitlink paths") + for name, fields in entries.items(): + repo = LEGACY.get(name) + if not repo or fields.get("path") != name or fields.get("url") not in { + SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"}: + raise ValueError("Historical submodule source is outside the reviewed allowlist") + for name in entries: + repo = LEGACY[name] + sha = links[name] + url = f"{SERVER}/weichen/{repo}.git" + git(directory, "config", f"submodule.{name}.url", url) + # Trusted explicit checkout prevents candidate update commands from running. + git(directory, "submodule", "update", "--init", "--checkout", "--", name, token=component_token, repo=repo) + child = directory / name + if git(child, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Historical submodule does not match its fixed SHA") + mirror(repo, sha, component_token) + materialize_legacy(child, depth + 1) + + def materialize_manifest(directory): + manifest = directory / "components.json" + lock = directory / "components.lock.json" + if not manifest.exists() and not lock.exists(): + materialize_legacy(directory) + return + data = json.loads(manifest.read_text()) + locked = json.loads(lock.read_text()) + if data.get("schema") != 1 or locked.get("schema") != 1: + raise ValueError("Unsupported source manifest schema") + entries = {} + for item in data["components"]: + repo = item["id"] + path = ".workspace/" + repo + if (repo not in REPOS or repo in entries or item["path"] != path or + item["repo"] not in {SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"} or + item.get("role") not in {"go-library", "npm-library", "application", "guidelines", "documentation"}): + raise ValueError("Candidate source manifest is outside the reviewed allowlist") + for module in item.get("modules", []): + if module.get("path") not in GO_MODULES or not module["path"].startswith(GO_PREFIX + repo + ".git"): + raise ValueError("Candidate module mapping is outside the reviewed allowlist") + entries[repo] = item + selected = locked["components"] + if set(selected) - set(entries): + raise ValueError("Source lock refers to an unregistered repository") + for repo, item in entries.items(): + if item["role"] in {"application", "guidelines", "documentation"} and repo not in selected: + raise ValueError("Application and documentation source needs a fixed lock") + for repo, pin in selected.items(): + fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + if destination.exists() or destination.is_symlink() or destination.parent.is_symlink(): + raise ValueError("Source materialization requires a fresh destination") + # Validate the complete lock before any authenticated component fetch. + for repo, pin in selected.items(): + sha = fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + destination.mkdir(parents=True) + url = f"{SERVER}/weichen/{repo}.git" + git(destination, "init", "-q") + git(destination, "remote", "add", "origin", url) + git(destination, "fetch", "--depth=1", "origin", sha, token=component_token, repo=repo) + git(destination, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(destination, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Materialized source differs from the fixed lock") + # Persist the registered identity; process config chooses the transport. + git(destination, "remote", "set-url", "origin", entries[repo]["repo"]) + mirror(repo, sha, component_token) + materialize_legacy(destination) + + try: + if os.environ.get("GITHUB_REPOSITORY") != "weichen/Agent-System-Frontend": + raise ValueError("Checkout repository is outside the reviewed allowlist") + sha = fixed_sha(os.environ.get("GITHUB_SHA", "")) + if not root_token: + raise ValueError("Checkout requires TOKEN") + if (root / ".git").exists(): + raise ValueError("Checkout requires a fresh workspace") + git(root, "init", "-q") + git(root, "remote", "add", "origin", SERVER + "/weichen/Agent-System-Frontend.git") + git(root, "fetch", "--depth=1", "origin", sha, token=root_token, repo="Agent-System-Frontend") + git(root, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(root, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Checked-out commit differs from the platform commit") + if (root / ".ci-mirrors").exists() or (root / ".ci-mirrors.env").exists(): + raise ValueError("Candidate cannot provide trusted prefetch state") + materialize_manifest(root) + mirror_env() + except (ValueError, KeyError, OSError, subprocess.CalledProcessError) as error: + # Do not print child stderr or environment: a failed credential fetch stays redacted. + sys.exit("Checkout refused: " + str(error)) + print("Fixed source checkout complete; credentials were not persisted") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Install Node 22 + run: | + set -euo pipefail + curl -fsSL -o "$RUNNER_TEMP/node.tar.xz" https://npmmirror.com/mirrors/node/v22.23.3/node-v22.23.3-linux-x64.tar.xz + tar -C /usr/local --strip-components=1 -xJf "$RUNNER_TEMP/node.tar.xz" + - name: Prefetch npm packages without lifecycle scripts + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_2 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def source_roots(): + bases = [root] + composition = root / ".ci-composition-dev" + if composition.is_dir() and not composition.is_symlink(): + bases.append(composition) + paths = [] + for base in bases: + paths += [base, base / "rdm"] + [base / path for path in LEGACY] + [base / ".workspace" / repo for repo in sorted(REPOS)] + return [path for path in paths if path.is_dir() and not path.is_symlink()] + def git_package(value): + if not isinstance(value, str): + return None + if value.startswith(("file:", "link:", "workspace:")): + raise ValueError("Formal npm acquisition cannot consume a local package override") + if value.startswith(("http://", "https://")): + registry = urlsplit(value) + if registry.scheme != "https" or registry.hostname != "registry.npmjs.org" or registry.username or registry.password: + raise ValueError("npm tarball source is outside the reviewed public registry") + elif "/" in value and not value.startswith(("git+", "npm:")): + raise ValueError("npm repository shorthand is outside the fixed-SHA package mapping") + if value.startswith("git+") or value.startswith(("git://", "ssh://", "github:", "gitlab:", "bitbucket:")): + for repo in ("Agent-System-Core", "Agent-System-UI"): + prefix = "git+" + SSH + repo + ".git#" + if value.startswith(prefix): + return repo, fixed_sha(value[len(prefix):]) + raise ValueError("npm Git source is outside the reviewed fixed-SHA package mapping") + return None + + try: + targets = [] + selected = set() + for directory in source_roots(): + if not (directory / "package.json").is_file(): + continue + if (directory / ".npmrc").exists(): + raise ValueError("Candidate .npmrc is not allowed during private dependency acquisition") + package = json.loads((directory / "package.json").read_text()) + lock = json.loads((directory / "package-lock.json").read_text()) + if lock.get("lockfileVersion") not in {2, 3}: + raise ValueError("npm acquisition requires a package lock") + for group in ("dependencies", "devDependencies", "optionalDependencies"): + for value in package.get(group, {}).values(): + found = git_package(value) + if found: + selected.add(found) + for entry in lock.get("packages", {}).values(): + found = git_package(entry.get("resolved")) + if found: + selected.add(found) + for group in ("dependencies", "devDependencies", "optionalDependencies"): + for value in entry.get(group, {}).values(): + found = git_package(value) + if found: + selected.add(found) + targets.append(directory) + # Fetch only registered fixed Git package commits. npm never receives token config. + for repo, sha in sorted(selected): + repository = mirror(repo, sha, component_token) + package = json.loads(git(repository, "show", sha + ":package.json")) + forbidden = {"prepare", "prepack", "prepublish", "prepublishOnly", "preinstall", "install", "postinstall"} + if forbidden & set(package.get("scripts", {})): + raise ValueError("Git package provider must commit outputs without acquisition lifecycle scripts") + if not git(repository, "ls-tree", sha, "package/").strip(): + raise ValueError("Git package provider is missing committed package outputs") + no_auth = mirror_env() + empty_config = tempfile.NamedTemporaryFile(prefix="ci-npm-globalrc-") + for directory in targets: + result = subprocess.run(["npm", "ci", "--ignore-scripts", "--no-audit", "--no-fund", + "--userconfig=/dev/null", "--globalconfig=" + empty_config.name], + cwd=directory, env=no_auth, capture_output=True, text=True) + if result.returncode: + raise ValueError("npm dependency acquisition failed: " + result.stderr.strip()) + except (ValueError, OSError, subprocess.CalledProcessError) as error: + sys.exit("npm prefetch refused: " + str(error)) + print("npm packages cached without credentials or lifecycle execution") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Validate package and contracts without credentials + run: | + set -euo pipefail + source .ci-mirrors.env + npm test + npm run build diff --git a/tests/fixtures/component-ci/Agent-System-RDM/ci.yml b/tests/fixtures/component-ci/Agent-System-RDM/ci.yml new file mode 100644 index 00000000..9d42be10 --- /dev/null +++ b/tests/fixtures/component-ci/Agent-System-RDM/ci.yml @@ -0,0 +1,949 @@ +name: ci +on: + push: + branches: [main] + pull_request: + branches: [main] +jobs: + build-and-test: + runs-on: ubuntu-latest + env: + GOPROXY: https://goproxy.cn,direct + GOTOOLCHAIN: local + GOWORK: "off" + GOPRIVATE: git-ssh.u1680832.nyat.app/weichen + steps: + - name: Checkout + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_1 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def materialize_legacy(directory, depth=0): + if depth > 16: + raise ValueError("Historical submodule depth exceeds the checkout limit") + links = {} + for entry in git(directory, "ls-tree", "-rz", "HEAD").split(b"\0"): + if entry: + metadata, path = entry.split(b"\t", 1) + mode, kind, commit = metadata.decode().split() + if mode == "160000": + links[path.decode()] = commit + if not links: + return + raw = git(directory, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list") + entries = {} + for item in raw.split(b"\0"): + if not item: + continue + key, value = item.decode().split("\n", 1) + match = re.fullmatch(r"submodule\.(.+)\.(path|url)", key) + if not match: + raise ValueError("Unsupported candidate .gitmodules setting") + name, field = match.groups() + if field in entries.setdefault(name, {}): + raise ValueError("Duplicate candidate .gitmodules setting") + entries[name][field] = value + if set(entries) != set(links): + raise ValueError("Submodule names must match fixed gitlink paths") + for name, fields in entries.items(): + repo = LEGACY.get(name) + if not repo or fields.get("path") != name or fields.get("url") not in { + SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"}: + raise ValueError("Historical submodule source is outside the reviewed allowlist") + for name in entries: + repo = LEGACY[name] + sha = links[name] + url = f"{SERVER}/weichen/{repo}.git" + git(directory, "config", f"submodule.{name}.url", url) + # Trusted explicit checkout prevents candidate update commands from running. + git(directory, "submodule", "update", "--init", "--checkout", "--", name, token=component_token, repo=repo) + child = directory / name + if git(child, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Historical submodule does not match its fixed SHA") + mirror(repo, sha, component_token) + materialize_legacy(child, depth + 1) + + def materialize_manifest(directory): + manifest = directory / "components.json" + lock = directory / "components.lock.json" + if not manifest.exists() and not lock.exists(): + materialize_legacy(directory) + return + data = json.loads(manifest.read_text()) + locked = json.loads(lock.read_text()) + if data.get("schema") != 1 or locked.get("schema") != 1: + raise ValueError("Unsupported source manifest schema") + entries = {} + for item in data["components"]: + repo = item["id"] + path = ".workspace/" + repo + if (repo not in REPOS or repo in entries or item["path"] != path or + item["repo"] not in {SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"} or + item.get("role") not in {"go-library", "npm-library", "application", "guidelines", "documentation"}): + raise ValueError("Candidate source manifest is outside the reviewed allowlist") + for module in item.get("modules", []): + if module.get("path") not in GO_MODULES or not module["path"].startswith(GO_PREFIX + repo + ".git"): + raise ValueError("Candidate module mapping is outside the reviewed allowlist") + entries[repo] = item + selected = locked["components"] + if set(selected) - set(entries): + raise ValueError("Source lock refers to an unregistered repository") + for repo, item in entries.items(): + if item["role"] in {"application", "guidelines", "documentation"} and repo not in selected: + raise ValueError("Application and documentation source needs a fixed lock") + for repo, pin in selected.items(): + fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + if destination.exists() or destination.is_symlink() or destination.parent.is_symlink(): + raise ValueError("Source materialization requires a fresh destination") + # Validate the complete lock before any authenticated component fetch. + for repo, pin in selected.items(): + sha = fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + destination.mkdir(parents=True) + url = f"{SERVER}/weichen/{repo}.git" + git(destination, "init", "-q") + git(destination, "remote", "add", "origin", url) + git(destination, "fetch", "--depth=1", "origin", sha, token=component_token, repo=repo) + git(destination, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(destination, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Materialized source differs from the fixed lock") + # Persist the registered identity; process config chooses the transport. + git(destination, "remote", "set-url", "origin", entries[repo]["repo"]) + mirror(repo, sha, component_token) + materialize_legacy(destination) + + try: + if os.environ.get("GITHUB_REPOSITORY") != "weichen/Agent-System-RDM": + raise ValueError("Checkout repository is outside the reviewed allowlist") + sha = fixed_sha(os.environ.get("GITHUB_SHA", "")) + if not root_token: + raise ValueError("Checkout requires TOKEN") + if (root / ".git").exists(): + raise ValueError("Checkout requires a fresh workspace") + git(root, "init", "-q") + git(root, "remote", "add", "origin", SERVER + "/weichen/Agent-System-RDM.git") + git(root, "fetch", "--depth=1", "origin", sha, token=root_token, repo="Agent-System-RDM") + git(root, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(root, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Checked-out commit differs from the platform commit") + if (root / ".ci-mirrors").exists() or (root / ".ci-mirrors.env").exists(): + raise ValueError("Candidate cannot provide trusted prefetch state") + materialize_manifest(root) + mirror_env() + except (ValueError, KeyError, OSError, subprocess.CalledProcessError) as error: + # Do not print child stderr or environment: a failed credential fetch stays redacted. + sys.exit("Checkout refused: " + str(error)) + print("Fixed source checkout complete; credentials were not persisted") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Prefetch fixed Dev product composition + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def materialize_legacy(directory, depth=0): + if depth > 16: + raise ValueError("Historical submodule depth exceeds the checkout limit") + links = {} + for entry in git(directory, "ls-tree", "-rz", "HEAD").split(b"\0"): + if entry: + metadata, path = entry.split(b"\t", 1) + mode, kind, commit = metadata.decode().split() + if mode == "160000": + links[path.decode()] = commit + if not links: + return + raw = git(directory, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list") + entries = {} + for item in raw.split(b"\0"): + if not item: + continue + key, value = item.decode().split("\n", 1) + match = re.fullmatch(r"submodule\.(.+)\.(path|url)", key) + if not match: + raise ValueError("Unsupported candidate .gitmodules setting") + name, field = match.groups() + if field in entries.setdefault(name, {}): + raise ValueError("Duplicate candidate .gitmodules setting") + entries[name][field] = value + if set(entries) != set(links): + raise ValueError("Submodule names must match fixed gitlink paths") + for name, fields in entries.items(): + repo = LEGACY.get(name) + if not repo or fields.get("path") != name or fields.get("url") not in { + SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"}: + raise ValueError("Historical submodule source is outside the reviewed allowlist") + for name in entries: + repo = LEGACY[name] + sha = links[name] + url = f"{SERVER}/weichen/{repo}.git" + git(directory, "config", f"submodule.{name}.url", url) + # Trusted explicit checkout prevents candidate update commands from running. + git(directory, "submodule", "update", "--init", "--checkout", "--", name, token=component_token, repo=repo) + child = directory / name + if git(child, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Historical submodule does not match its fixed SHA") + mirror(repo, sha, component_token) + materialize_legacy(child, depth + 1) + + def materialize_manifest(directory): + manifest = directory / "components.json" + lock = directory / "components.lock.json" + if not manifest.exists() and not lock.exists(): + materialize_legacy(directory) + return + data = json.loads(manifest.read_text()) + locked = json.loads(lock.read_text()) + if data.get("schema") != 1 or locked.get("schema") != 1: + raise ValueError("Unsupported source manifest schema") + entries = {} + for item in data["components"]: + repo = item["id"] + path = ".workspace/" + repo + if (repo not in REPOS or repo in entries or item["path"] != path or + item["repo"] not in {SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"} or + item.get("role") not in {"go-library", "npm-library", "application", "guidelines", "documentation"}): + raise ValueError("Candidate source manifest is outside the reviewed allowlist") + for module in item.get("modules", []): + if module.get("path") not in GO_MODULES or not module["path"].startswith(GO_PREFIX + repo + ".git"): + raise ValueError("Candidate module mapping is outside the reviewed allowlist") + entries[repo] = item + selected = locked["components"] + if set(selected) - set(entries): + raise ValueError("Source lock refers to an unregistered repository") + for repo, item in entries.items(): + if item["role"] in {"application", "guidelines", "documentation"} and repo not in selected: + raise ValueError("Application and documentation source needs a fixed lock") + for repo, pin in selected.items(): + fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + if destination.exists() or destination.is_symlink() or destination.parent.is_symlink(): + raise ValueError("Source materialization requires a fresh destination") + # Validate the complete lock before any authenticated component fetch. + for repo, pin in selected.items(): + sha = fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + destination.mkdir(parents=True) + url = f"{SERVER}/weichen/{repo}.git" + git(destination, "init", "-q") + git(destination, "remote", "add", "origin", url) + git(destination, "fetch", "--depth=1", "origin", sha, token=component_token, repo=repo) + git(destination, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(destination, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Materialized source differs from the fixed lock") + # Persist the registered identity; process config chooses the transport. + git(destination, "remote", "set-url", "origin", entries[repo]["repo"]) + mirror(repo, sha, component_token) + materialize_legacy(destination) + + try: + locked = json.loads((root / "composition.dev.json").read_text()) + if set(locked) != {"schema", "repo", "commit"} or locked["schema"] != 1: + raise ValueError("Unsupported Dev product composition lock") + if locked["repo"] != SSH + "Agent-System-Dev.git": + raise ValueError("Dev product source is outside the reviewed allowlist") + sha = fixed_sha(locked["commit"]) + directory = root / ".ci-composition-dev" + if directory.exists() or directory.is_symlink(): + raise ValueError("Dev product composition requires a fresh destination") + directory.mkdir() + git(directory, "init", "-q") + url = SERVER + "/weichen/Agent-System-Dev.git" + git(directory, "remote", "add", "origin", url) + git(directory, "fetch", "--depth=1", "origin", sha, token=component_token, repo="Agent-System-Dev") + git(directory, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(directory, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Dev composition differs from the fixed lock") + if (directory / ".ci-mirrors").exists() or (directory / ".ci-mirrors.env").exists(): + raise ValueError("Candidate cannot provide trusted prefetch state") + git(directory, "remote", "set-url", "origin", locked["repo"]) + materialize_manifest(directory) + mirror("Agent-System-Dev", sha, component_token) + mirror_env() + except (ValueError, KeyError, OSError, subprocess.CalledProcessError) as error: + sys.exit("Dev product composition prefetch refused: " + str(error)) + print("Fixed Dev product source cached; candidate scripts run only without credentials") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Install Go 1.27.1 + run: | + set -euo pipefail + curl -fsSL -o "$RUNNER_TEMP/go.tgz" https://mirrors.aliyun.com/golang/go1.27.1.linux-amd64.tar.gz + tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz" + ln -sfn /usr/local/go/bin/go /usr/local/bin/go + ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt + - name: Prefetch Go modules without executing candidate code + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_2 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def source_roots(): + bases = [root] + composition = root / ".ci-composition-dev" + if composition.is_dir() and not composition.is_symlink(): + bases.append(composition) + paths = [] + for base in bases: + paths += [base, base / "rdm"] + [base / path for path in LEGACY] + [base / ".workspace" / repo for repo in sorted(REPOS)] + return [path for path in paths if path.is_dir() and not path.is_symlink()] + try: + targets = [] + for source in source_roots(): + for suffix in (".", "examples/trace", "adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad"): + directory = source / suffix + if (directory / "go.mod").is_file() and directory.resolve() not in targets: + targets.append(directory.resolve()) + # Parse using the installed local Go tool without credentials or candidate execution. + original_files = {} + for directory in targets: + parsed_mod = json.loads(subprocess.check_output(["go", "mod", "edit", "-json"], cwd=directory, env=clean)) + canonical = parsed_mod["Module"]["Path"].startswith(GO_PREFIX) + for name in ("go.mod", "go.sum"): + dependency_file = directory / name + if dependency_file.is_file(): + original_files[(directory, name)] = dependency_file.read_bytes() + elif canonical and name == "go.sum": + original_files[(directory, name)] = None + for dep in (parsed_mod.get("Require") or []): + path = dep["Path"] + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go dependency is outside the reviewed module mapping") + for replacement in (parsed_mod.get("Replace") or []): + path = replacement["New"]["Path"] + if canonical and not replacement["New"].get("Version"): + raise ValueError("Canonical module cannot acquire a local path replacement") + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go replacement is outside the reviewed module mapping") + auth = config.copy() + for repo in sorted(GO_REPOS): + url = f"{SERVER}/weichen/{repo}.git" + auth[f"url.{url}.insteadOf"] = "https://" + GO_PREFIX + repo + auth[f"http.{url}.extraheader"] = "AUTHORIZATION: token " + component_token + def objects(output): + decoder = json.JSONDecoder() + remaining = output.strip() + while remaining: + item, end = decoder.raw_decode(remaining) + remaining = remaining[end:].lstrip() + yield item + def unchanged(): + for (owner, name), contents in original_files.items(): + dependency_file = owner / name + current = dependency_file.read_bytes() if dependency_file.exists() else None + if current != contents: + raise ValueError("Go acquisition modified a committed Go dependency file: " + str(dependency_file)) + for directory in targets: + # Resolve private go.mod metadata only through exact repository headers; + # validate the complete selected graph before acquiring module zip files. + graph = subprocess.run(["go", "list", "-mod=readonly", "-m", "-json", "all"], cwd=directory, + env=process_env(auth), capture_output=True, text=True) + if graph.returncode: + raise ValueError("Go selected graph resolution failed: " + graph.stderr.strip()) + for item in objects(graph.stdout): + if item.get("Main"): + continue + selected = item.get("Replace") or item + for path in (item.get("Path", ""), selected.get("Path", "")): + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Selected Go module is outside the reviewed mapping") + unchanged() + # Go 1.27 can prune go.sum even under -mod=readonly for this + # metadata-only command. Use a disposable copy, then validate actual + # package loading against the unchanged committed source locks. + local_replacements = json.loads(subprocess.check_output( + ["go", "mod", "edit", "-json"], cwd=directory, env=clean)).get("Replace") or [] + downloaded = "" + if not any(not item["New"].get("Version") for item in local_replacements): + with tempfile.TemporaryDirectory(prefix="ci-go-prefetch-") as temporary: + download_root = Path(temporary) + for name in ("go.mod", "go.sum"): + if (directory / name).is_file(): + (download_root / name).write_bytes((directory / name).read_bytes()) + result = subprocess.run(["go", "mod", "download", "-json"], cwd=download_root, + env=process_env(auth), capture_output=True, text=True) + if result.returncode: + raise ValueError("Go module acquisition failed: " + result.stderr.strip()) + downloaded = result.stdout + unchanged() + for item in objects(downloaded): + path = item.get("Path", "") + if path.startswith(GO_PREFIX): + if path not in GO_MODULES: + raise ValueError("Resolved Go module is outside the reviewed mapping") + repo = path[len(GO_PREFIX):].split(".git", 1)[0] + origin = item.get("Origin") or json.loads(Path(item["Info"]).read_text()).get("Origin") or {} + mirror(repo, fixed_sha(origin.get("Hash")), component_token) + # Package metadata loads actual test/build dependencies without running + # vet, compilers, package init functions or candidate tests. No CGO tools. + packages = subprocess.run(["go", "list", "-mod=readonly", "-deps", "-test", "./..."], cwd=directory, + env=process_env(auth) | {"CGO_ENABLED": "0"}, capture_output=True, text=True) + if packages.returncode: + raise ValueError("Go test/build dependency acquisition failed: " + packages.stderr.strip()) + unchanged() + mirror_env() + except (ValueError, OSError, subprocess.CalledProcessError) as error: + sys.exit("Go prefetch refused: " + str(error)) + print("Go modules cached with GOTOOLCHAIN=local; no candidate code executed") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Install Node 22 + run: | + set -euo pipefail + curl -fsSL -o "$RUNNER_TEMP/node.tar.xz" https://mirrors.aliyun.com/nodejs-release/v22.14.0/node-v22.14.0-linux-x64.tar.xz + tar -C /usr/local -xJf "$RUNNER_TEMP/node.tar.xz" + ln -sfn /usr/local/node-v22.14.0-linux-x64/bin/node /usr/local/bin/node + - name: Prefetch npm packages without lifecycle scripts + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_3 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def source_roots(): + bases = [root] + composition = root / ".ci-composition-dev" + if composition.is_dir() and not composition.is_symlink(): + bases.append(composition) + paths = [] + for base in bases: + paths += [base, base / "rdm"] + [base / path for path in LEGACY] + [base / ".workspace" / repo for repo in sorted(REPOS)] + return [path for path in paths if path.is_dir() and not path.is_symlink()] + def git_package(value): + if not isinstance(value, str): + return None + if value.startswith(("file:", "link:", "workspace:")): + raise ValueError("Formal npm acquisition cannot consume a local package override") + if value.startswith(("http://", "https://")): + registry = urlsplit(value) + if registry.scheme != "https" or registry.hostname != "registry.npmjs.org" or registry.username or registry.password: + raise ValueError("npm tarball source is outside the reviewed public registry") + elif "/" in value and not value.startswith(("git+", "npm:")): + raise ValueError("npm repository shorthand is outside the fixed-SHA package mapping") + if value.startswith("git+") or value.startswith(("git://", "ssh://", "github:", "gitlab:", "bitbucket:")): + for repo in ("Agent-System-Core", "Agent-System-UI"): + prefix = "git+" + SSH + repo + ".git#" + if value.startswith(prefix): + return repo, fixed_sha(value[len(prefix):]) + raise ValueError("npm Git source is outside the reviewed fixed-SHA package mapping") + return None + + try: + targets = [] + selected = set() + for directory in source_roots(): + if not (directory / "package.json").is_file(): + continue + if (directory / ".npmrc").exists(): + raise ValueError("Candidate .npmrc is not allowed during private dependency acquisition") + package = json.loads((directory / "package.json").read_text()) + lock = json.loads((directory / "package-lock.json").read_text()) + if lock.get("lockfileVersion") not in {2, 3}: + raise ValueError("npm acquisition requires a package lock") + for group in ("dependencies", "devDependencies", "optionalDependencies"): + for value in package.get(group, {}).values(): + found = git_package(value) + if found: + selected.add(found) + for entry in lock.get("packages", {}).values(): + found = git_package(entry.get("resolved")) + if found: + selected.add(found) + for group in ("dependencies", "devDependencies", "optionalDependencies"): + for value in entry.get(group, {}).values(): + found = git_package(value) + if found: + selected.add(found) + targets.append(directory) + # Fetch only registered fixed Git package commits. npm never receives token config. + for repo, sha in sorted(selected): + repository = mirror(repo, sha, component_token) + package = json.loads(git(repository, "show", sha + ":package.json")) + forbidden = {"prepare", "prepack", "prepublish", "prepublishOnly", "preinstall", "install", "postinstall"} + if forbidden & set(package.get("scripts", {})): + raise ValueError("Git package provider must commit outputs without acquisition lifecycle scripts") + if not git(repository, "ls-tree", sha, "package/").strip(): + raise ValueError("Git package provider is missing committed package outputs") + no_auth = mirror_env() + empty_config = tempfile.NamedTemporaryFile(prefix="ci-npm-globalrc-") + for directory in targets: + result = subprocess.run(["npm", "ci", "--ignore-scripts", "--no-audit", "--no-fund", + "--userconfig=/dev/null", "--globalconfig=" + empty_config.name], + cwd=directory, env=no_auth, capture_output=True, text=True) + if result.returncode: + raise ValueError("npm dependency acquisition failed: " + result.stderr.strip()) + except (ValueError, OSError, subprocess.CalledProcessError) as error: + sys.exit("npm prefetch refused: " + str(error)) + print("npm packages cached without credentials or lifecycle execution") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + # Preserve the Go build, workbench guards and real RDM Go tests. + - name: Make test + run: | + set -euo pipefail + source .ci-mirrors.env + export COMPOSITION_ROOT="$PWD/.ci-composition-dev" + GOWORK=off make test diff --git a/tests/fixtures/component-ci/Agent-System-UI/ci.yml b/tests/fixtures/component-ci/Agent-System-UI/ci.yml new file mode 100644 index 00000000..68f9f52a --- /dev/null +++ b/tests/fixtures/component-ci/Agent-System-UI/ci.yml @@ -0,0 +1,465 @@ +name: ci +on: + push: + branches: [main] + pull_request: + branches: [main] +jobs: + test: + runs-on: ubuntu-latest + env: + GOTOOLCHAIN: local + GOWORK: "off" + steps: + - name: Checkout + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_1 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def materialize_legacy(directory, depth=0): + if depth > 16: + raise ValueError("Historical submodule depth exceeds the checkout limit") + links = {} + for entry in git(directory, "ls-tree", "-rz", "HEAD").split(b"\0"): + if entry: + metadata, path = entry.split(b"\t", 1) + mode, kind, commit = metadata.decode().split() + if mode == "160000": + links[path.decode()] = commit + if not links: + return + raw = git(directory, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list") + entries = {} + for item in raw.split(b"\0"): + if not item: + continue + key, value = item.decode().split("\n", 1) + match = re.fullmatch(r"submodule\.(.+)\.(path|url)", key) + if not match: + raise ValueError("Unsupported candidate .gitmodules setting") + name, field = match.groups() + if field in entries.setdefault(name, {}): + raise ValueError("Duplicate candidate .gitmodules setting") + entries[name][field] = value + if set(entries) != set(links): + raise ValueError("Submodule names must match fixed gitlink paths") + for name, fields in entries.items(): + repo = LEGACY.get(name) + if not repo or fields.get("path") != name or fields.get("url") not in { + SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"}: + raise ValueError("Historical submodule source is outside the reviewed allowlist") + for name in entries: + repo = LEGACY[name] + sha = links[name] + url = f"{SERVER}/weichen/{repo}.git" + git(directory, "config", f"submodule.{name}.url", url) + # Trusted explicit checkout prevents candidate update commands from running. + git(directory, "submodule", "update", "--init", "--checkout", "--", name, token=component_token, repo=repo) + child = directory / name + if git(child, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Historical submodule does not match its fixed SHA") + mirror(repo, sha, component_token) + materialize_legacy(child, depth + 1) + + def materialize_manifest(directory): + manifest = directory / "components.json" + lock = directory / "components.lock.json" + if not manifest.exists() and not lock.exists(): + materialize_legacy(directory) + return + data = json.loads(manifest.read_text()) + locked = json.loads(lock.read_text()) + if data.get("schema") != 1 or locked.get("schema") != 1: + raise ValueError("Unsupported source manifest schema") + entries = {} + for item in data["components"]: + repo = item["id"] + path = ".workspace/" + repo + if (repo not in REPOS or repo in entries or item["path"] != path or + item["repo"] not in {SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"} or + item.get("role") not in {"go-library", "npm-library", "application", "guidelines", "documentation"}): + raise ValueError("Candidate source manifest is outside the reviewed allowlist") + for module in item.get("modules", []): + if module.get("path") not in GO_MODULES or not module["path"].startswith(GO_PREFIX + repo + ".git"): + raise ValueError("Candidate module mapping is outside the reviewed allowlist") + entries[repo] = item + selected = locked["components"] + if set(selected) - set(entries): + raise ValueError("Source lock refers to an unregistered repository") + for repo, item in entries.items(): + if item["role"] in {"application", "guidelines", "documentation"} and repo not in selected: + raise ValueError("Application and documentation source needs a fixed lock") + for repo, pin in selected.items(): + fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + if destination.exists() or destination.is_symlink() or destination.parent.is_symlink(): + raise ValueError("Source materialization requires a fresh destination") + # Validate the complete lock before any authenticated component fetch. + for repo, pin in selected.items(): + sha = fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + destination.mkdir(parents=True) + url = f"{SERVER}/weichen/{repo}.git" + git(destination, "init", "-q") + git(destination, "remote", "add", "origin", url) + git(destination, "fetch", "--depth=1", "origin", sha, token=component_token, repo=repo) + git(destination, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(destination, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Materialized source differs from the fixed lock") + # Persist the registered identity; process config chooses the transport. + git(destination, "remote", "set-url", "origin", entries[repo]["repo"]) + mirror(repo, sha, component_token) + materialize_legacy(destination) + + try: + if os.environ.get("GITHUB_REPOSITORY") != "weichen/Agent-System-UI": + raise ValueError("Checkout repository is outside the reviewed allowlist") + sha = fixed_sha(os.environ.get("GITHUB_SHA", "")) + if not root_token: + raise ValueError("Checkout requires TOKEN") + if (root / ".git").exists(): + raise ValueError("Checkout requires a fresh workspace") + git(root, "init", "-q") + git(root, "remote", "add", "origin", SERVER + "/weichen/Agent-System-UI.git") + git(root, "fetch", "--depth=1", "origin", sha, token=root_token, repo="Agent-System-UI") + git(root, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(root, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Checked-out commit differs from the platform commit") + if (root / ".ci-mirrors").exists() or (root / ".ci-mirrors.env").exists(): + raise ValueError("Candidate cannot provide trusted prefetch state") + materialize_manifest(root) + mirror_env() + except (ValueError, KeyError, OSError, subprocess.CalledProcessError) as error: + # Do not print child stderr or environment: a failed credential fetch stays redacted. + sys.exit("Checkout refused: " + str(error)) + print("Fixed source checkout complete; credentials were not persisted") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Install Node 22 + run: | + set -euo pipefail + curl -fsSL -o "$RUNNER_TEMP/node.tar.xz" https://npmmirror.com/mirrors/node/v22.23.3/node-v22.23.3-linux-x64.tar.xz + tar -C /usr/local --strip-components=1 -xJf "$RUNNER_TEMP/node.tar.xz" + - name: Prefetch npm packages without lifecycle scripts + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_2 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def source_roots(): + bases = [root] + composition = root / ".ci-composition-dev" + if composition.is_dir() and not composition.is_symlink(): + bases.append(composition) + paths = [] + for base in bases: + paths += [base, base / "rdm"] + [base / path for path in LEGACY] + [base / ".workspace" / repo for repo in sorted(REPOS)] + return [path for path in paths if path.is_dir() and not path.is_symlink()] + def git_package(value): + if not isinstance(value, str): + return None + if value.startswith(("file:", "link:", "workspace:")): + raise ValueError("Formal npm acquisition cannot consume a local package override") + if value.startswith(("http://", "https://")): + registry = urlsplit(value) + if registry.scheme != "https" or registry.hostname != "registry.npmjs.org" or registry.username or registry.password: + raise ValueError("npm tarball source is outside the reviewed public registry") + elif "/" in value and not value.startswith(("git+", "npm:")): + raise ValueError("npm repository shorthand is outside the fixed-SHA package mapping") + if value.startswith("git+") or value.startswith(("git://", "ssh://", "github:", "gitlab:", "bitbucket:")): + for repo in ("Agent-System-Core", "Agent-System-UI"): + prefix = "git+" + SSH + repo + ".git#" + if value.startswith(prefix): + return repo, fixed_sha(value[len(prefix):]) + raise ValueError("npm Git source is outside the reviewed fixed-SHA package mapping") + return None + + try: + targets = [] + selected = set() + for directory in source_roots(): + if not (directory / "package.json").is_file(): + continue + if (directory / ".npmrc").exists(): + raise ValueError("Candidate .npmrc is not allowed during private dependency acquisition") + package = json.loads((directory / "package.json").read_text()) + lock = json.loads((directory / "package-lock.json").read_text()) + if lock.get("lockfileVersion") not in {2, 3}: + raise ValueError("npm acquisition requires a package lock") + for group in ("dependencies", "devDependencies", "optionalDependencies"): + for value in package.get(group, {}).values(): + found = git_package(value) + if found: + selected.add(found) + for entry in lock.get("packages", {}).values(): + found = git_package(entry.get("resolved")) + if found: + selected.add(found) + for group in ("dependencies", "devDependencies", "optionalDependencies"): + for value in entry.get(group, {}).values(): + found = git_package(value) + if found: + selected.add(found) + targets.append(directory) + # Fetch only registered fixed Git package commits. npm never receives token config. + for repo, sha in sorted(selected): + repository = mirror(repo, sha, component_token) + package = json.loads(git(repository, "show", sha + ":package.json")) + forbidden = {"prepare", "prepack", "prepublish", "prepublishOnly", "preinstall", "install", "postinstall"} + if forbidden & set(package.get("scripts", {})): + raise ValueError("Git package provider must commit outputs without acquisition lifecycle scripts") + if not git(repository, "ls-tree", sha, "package/").strip(): + raise ValueError("Git package provider is missing committed package outputs") + no_auth = mirror_env() + empty_config = tempfile.NamedTemporaryFile(prefix="ci-npm-globalrc-") + for directory in targets: + result = subprocess.run(["npm", "ci", "--ignore-scripts", "--no-audit", "--no-fund", + "--userconfig=/dev/null", "--globalconfig=" + empty_config.name], + cwd=directory, env=no_auth, capture_output=True, text=True) + if result.returncode: + raise ValueError("npm dependency acquisition failed: " + result.stderr.strip()) + except (ValueError, OSError, subprocess.CalledProcessError) as error: + sys.exit("npm prefetch refused: " + str(error)) + print("npm packages cached without credentials or lifecycle execution") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - run: | + set -euo pipefail + source .ci-mirrors.env + npm run typecheck + - run: | + set -euo pipefail + source .ci-mirrors.env + npm test diff --git a/tests/fixtures/component-ci/Error-Code-System/ci.yml b/tests/fixtures/component-ci/Error-Code-System/ci.yml new file mode 100644 index 00000000..2e314b1f --- /dev/null +++ b/tests/fixtures/component-ci/Error-Code-System/ci.yml @@ -0,0 +1,508 @@ +name: ci +on: + push: + branches: [main] + pull_request: + branches: [main] +jobs: + vet-and-test: + runs-on: nightly + env: + GOTOOLCHAIN: local + GOWORK: "off" + GOPROXY: https://goproxy.cn,direct + steps: + - name: Checkout + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_1 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def materialize_legacy(directory, depth=0): + if depth > 16: + raise ValueError("Historical submodule depth exceeds the checkout limit") + links = {} + for entry in git(directory, "ls-tree", "-rz", "HEAD").split(b"\0"): + if entry: + metadata, path = entry.split(b"\t", 1) + mode, kind, commit = metadata.decode().split() + if mode == "160000": + links[path.decode()] = commit + if not links: + return + raw = git(directory, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list") + entries = {} + for item in raw.split(b"\0"): + if not item: + continue + key, value = item.decode().split("\n", 1) + match = re.fullmatch(r"submodule\.(.+)\.(path|url)", key) + if not match: + raise ValueError("Unsupported candidate .gitmodules setting") + name, field = match.groups() + if field in entries.setdefault(name, {}): + raise ValueError("Duplicate candidate .gitmodules setting") + entries[name][field] = value + if set(entries) != set(links): + raise ValueError("Submodule names must match fixed gitlink paths") + for name, fields in entries.items(): + repo = LEGACY.get(name) + if not repo or fields.get("path") != name or fields.get("url") not in { + SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"}: + raise ValueError("Historical submodule source is outside the reviewed allowlist") + for name in entries: + repo = LEGACY[name] + sha = links[name] + url = f"{SERVER}/weichen/{repo}.git" + git(directory, "config", f"submodule.{name}.url", url) + # Trusted explicit checkout prevents candidate update commands from running. + git(directory, "submodule", "update", "--init", "--checkout", "--", name, token=component_token, repo=repo) + child = directory / name + if git(child, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Historical submodule does not match its fixed SHA") + mirror(repo, sha, component_token) + materialize_legacy(child, depth + 1) + + def materialize_manifest(directory): + manifest = directory / "components.json" + lock = directory / "components.lock.json" + if not manifest.exists() and not lock.exists(): + materialize_legacy(directory) + return + data = json.loads(manifest.read_text()) + locked = json.loads(lock.read_text()) + if data.get("schema") != 1 or locked.get("schema") != 1: + raise ValueError("Unsupported source manifest schema") + entries = {} + for item in data["components"]: + repo = item["id"] + path = ".workspace/" + repo + if (repo not in REPOS or repo in entries or item["path"] != path or + item["repo"] not in {SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"} or + item.get("role") not in {"go-library", "npm-library", "application", "guidelines", "documentation"}): + raise ValueError("Candidate source manifest is outside the reviewed allowlist") + for module in item.get("modules", []): + if module.get("path") not in GO_MODULES or not module["path"].startswith(GO_PREFIX + repo + ".git"): + raise ValueError("Candidate module mapping is outside the reviewed allowlist") + entries[repo] = item + selected = locked["components"] + if set(selected) - set(entries): + raise ValueError("Source lock refers to an unregistered repository") + for repo, item in entries.items(): + if item["role"] in {"application", "guidelines", "documentation"} and repo not in selected: + raise ValueError("Application and documentation source needs a fixed lock") + for repo, pin in selected.items(): + fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + if destination.exists() or destination.is_symlink() or destination.parent.is_symlink(): + raise ValueError("Source materialization requires a fresh destination") + # Validate the complete lock before any authenticated component fetch. + for repo, pin in selected.items(): + sha = fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + destination.mkdir(parents=True) + url = f"{SERVER}/weichen/{repo}.git" + git(destination, "init", "-q") + git(destination, "remote", "add", "origin", url) + git(destination, "fetch", "--depth=1", "origin", sha, token=component_token, repo=repo) + git(destination, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(destination, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Materialized source differs from the fixed lock") + # Persist the registered identity; process config chooses the transport. + git(destination, "remote", "set-url", "origin", entries[repo]["repo"]) + mirror(repo, sha, component_token) + materialize_legacy(destination) + + try: + if os.environ.get("GITHUB_REPOSITORY") != "weichen/Error-Code-System": + raise ValueError("Checkout repository is outside the reviewed allowlist") + sha = fixed_sha(os.environ.get("GITHUB_SHA", "")) + if not root_token: + raise ValueError("Checkout requires TOKEN") + if (root / ".git").exists(): + raise ValueError("Checkout requires a fresh workspace") + git(root, "init", "-q") + git(root, "remote", "add", "origin", SERVER + "/weichen/Error-Code-System.git") + git(root, "fetch", "--depth=1", "origin", sha, token=root_token, repo="Error-Code-System") + git(root, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(root, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Checked-out commit differs from the platform commit") + if (root / ".ci-mirrors").exists() or (root / ".ci-mirrors.env").exists(): + raise ValueError("Candidate cannot provide trusted prefetch state") + materialize_manifest(root) + mirror_env() + except (ValueError, KeyError, OSError, subprocess.CalledProcessError) as error: + # Do not print child stderr or environment: a failed credential fetch stays redacted. + sys.exit("Checkout refused: " + str(error)) + print("Fixed source checkout complete; credentials were not persisted") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Install Go 1.27.1 + run: | + set -euo pipefail + curl -fsSL -o "$RUNNER_TEMP/go.tgz" https://mirrors.aliyun.com/golang/go1.27.1.linux-amd64.tar.gz + tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz" + ln -sfn /usr/local/go/bin/go /usr/local/bin/go + ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt + - name: Prefetch Go modules without executing candidate code + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_2 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def source_roots(): + bases = [root] + composition = root / ".ci-composition-dev" + if composition.is_dir() and not composition.is_symlink(): + bases.append(composition) + paths = [] + for base in bases: + paths += [base, base / "rdm"] + [base / path for path in LEGACY] + [base / ".workspace" / repo for repo in sorted(REPOS)] + return [path for path in paths if path.is_dir() and not path.is_symlink()] + try: + targets = [] + for source in source_roots(): + for suffix in (".", "examples/trace", "adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad"): + directory = source / suffix + if (directory / "go.mod").is_file() and directory.resolve() not in targets: + targets.append(directory.resolve()) + # Parse using the installed local Go tool without credentials or candidate execution. + original_files = {} + for directory in targets: + parsed_mod = json.loads(subprocess.check_output(["go", "mod", "edit", "-json"], cwd=directory, env=clean)) + canonical = parsed_mod["Module"]["Path"].startswith(GO_PREFIX) + for name in ("go.mod", "go.sum"): + dependency_file = directory / name + if dependency_file.is_file(): + original_files[(directory, name)] = dependency_file.read_bytes() + elif canonical and name == "go.sum": + original_files[(directory, name)] = None + for dep in (parsed_mod.get("Require") or []): + path = dep["Path"] + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go dependency is outside the reviewed module mapping") + for replacement in (parsed_mod.get("Replace") or []): + path = replacement["New"]["Path"] + if canonical and not replacement["New"].get("Version"): + raise ValueError("Canonical module cannot acquire a local path replacement") + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go replacement is outside the reviewed module mapping") + auth = config.copy() + for repo in sorted(GO_REPOS): + url = f"{SERVER}/weichen/{repo}.git" + auth[f"url.{url}.insteadOf"] = "https://" + GO_PREFIX + repo + auth[f"http.{url}.extraheader"] = "AUTHORIZATION: token " + component_token + def objects(output): + decoder = json.JSONDecoder() + remaining = output.strip() + while remaining: + item, end = decoder.raw_decode(remaining) + remaining = remaining[end:].lstrip() + yield item + def unchanged(): + for (owner, name), contents in original_files.items(): + dependency_file = owner / name + current = dependency_file.read_bytes() if dependency_file.exists() else None + if current != contents: + raise ValueError("Go acquisition modified a committed Go dependency file: " + str(dependency_file)) + for directory in targets: + # Resolve private go.mod metadata only through exact repository headers; + # validate the complete selected graph before acquiring module zip files. + graph = subprocess.run(["go", "list", "-mod=readonly", "-m", "-json", "all"], cwd=directory, + env=process_env(auth), capture_output=True, text=True) + if graph.returncode: + raise ValueError("Go selected graph resolution failed: " + graph.stderr.strip()) + for item in objects(graph.stdout): + if item.get("Main"): + continue + selected = item.get("Replace") or item + for path in (item.get("Path", ""), selected.get("Path", "")): + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Selected Go module is outside the reviewed mapping") + unchanged() + # Go 1.27 can prune go.sum even under -mod=readonly for this + # metadata-only command. Use a disposable copy, then validate actual + # package loading against the unchanged committed source locks. + local_replacements = json.loads(subprocess.check_output( + ["go", "mod", "edit", "-json"], cwd=directory, env=clean)).get("Replace") or [] + downloaded = "" + if not any(not item["New"].get("Version") for item in local_replacements): + with tempfile.TemporaryDirectory(prefix="ci-go-prefetch-") as temporary: + download_root = Path(temporary) + for name in ("go.mod", "go.sum"): + if (directory / name).is_file(): + (download_root / name).write_bytes((directory / name).read_bytes()) + result = subprocess.run(["go", "mod", "download", "-json"], cwd=download_root, + env=process_env(auth), capture_output=True, text=True) + if result.returncode: + raise ValueError("Go module acquisition failed: " + result.stderr.strip()) + downloaded = result.stdout + unchanged() + for item in objects(downloaded): + path = item.get("Path", "") + if path.startswith(GO_PREFIX): + if path not in GO_MODULES: + raise ValueError("Resolved Go module is outside the reviewed mapping") + repo = path[len(GO_PREFIX):].split(".git", 1)[0] + origin = item.get("Origin") or json.loads(Path(item["Info"]).read_text()).get("Origin") or {} + mirror(repo, fixed_sha(origin.get("Hash")), component_token) + # Package metadata loads actual test/build dependencies without running + # vet, compilers, package init functions or candidate tests. No CGO tools. + packages = subprocess.run(["go", "list", "-mod=readonly", "-deps", "-test", "./..."], cwd=directory, + env=process_env(auth) | {"CGO_ENABLED": "0"}, capture_output=True, text=True) + if packages.returncode: + raise ValueError("Go test/build dependency acquisition failed: " + packages.stderr.strip()) + unchanged() + mirror_env() + except (ValueError, OSError, subprocess.CalledProcessError) as error: + sys.exit("Go prefetch refused: " + str(error)) + print("Go modules cached with GOTOOLCHAIN=local; no candidate code executed") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - run: | + set -euo pipefail + source .ci-mirrors.env + GOWORK=off go vet -mod=readonly ./... && go test -mod=readonly -count=1 ./... + docker-checkout-hostgateway: + runs-on: ubuntu-latest + options: --add-host gitea:host-gateway + env: + GITHUB_SERVER_URL: http://gitea:3000 + steps: + - name: Checkout + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: *trusted_acquisition_1 + - run: test -f go.mod && echo "docker-mode checkout via host-gateway OK" diff --git a/tests/fixtures/component-ci/Logging-System/ci.yml b/tests/fixtures/component-ci/Logging-System/ci.yml new file mode 100644 index 00000000..6a24a9b2 --- /dev/null +++ b/tests/fixtures/component-ci/Logging-System/ci.yml @@ -0,0 +1,511 @@ +name: ci +on: + push: + branches: [main] + pull_request: + branches: [main] +jobs: + vet-and-test: + runs-on: nightly + env: + GOTOOLCHAIN: local + GOWORK: "off" + GOPROXY: https://goproxy.cn,direct + steps: + - name: Checkout + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_1 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def materialize_legacy(directory, depth=0): + if depth > 16: + raise ValueError("Historical submodule depth exceeds the checkout limit") + links = {} + for entry in git(directory, "ls-tree", "-rz", "HEAD").split(b"\0"): + if entry: + metadata, path = entry.split(b"\t", 1) + mode, kind, commit = metadata.decode().split() + if mode == "160000": + links[path.decode()] = commit + if not links: + return + raw = git(directory, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list") + entries = {} + for item in raw.split(b"\0"): + if not item: + continue + key, value = item.decode().split("\n", 1) + match = re.fullmatch(r"submodule\.(.+)\.(path|url)", key) + if not match: + raise ValueError("Unsupported candidate .gitmodules setting") + name, field = match.groups() + if field in entries.setdefault(name, {}): + raise ValueError("Duplicate candidate .gitmodules setting") + entries[name][field] = value + if set(entries) != set(links): + raise ValueError("Submodule names must match fixed gitlink paths") + for name, fields in entries.items(): + repo = LEGACY.get(name) + if not repo or fields.get("path") != name or fields.get("url") not in { + SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"}: + raise ValueError("Historical submodule source is outside the reviewed allowlist") + for name in entries: + repo = LEGACY[name] + sha = links[name] + url = f"{SERVER}/weichen/{repo}.git" + git(directory, "config", f"submodule.{name}.url", url) + # Trusted explicit checkout prevents candidate update commands from running. + git(directory, "submodule", "update", "--init", "--checkout", "--", name, token=component_token, repo=repo) + child = directory / name + if git(child, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Historical submodule does not match its fixed SHA") + mirror(repo, sha, component_token) + materialize_legacy(child, depth + 1) + + def materialize_manifest(directory): + manifest = directory / "components.json" + lock = directory / "components.lock.json" + if not manifest.exists() and not lock.exists(): + materialize_legacy(directory) + return + data = json.loads(manifest.read_text()) + locked = json.loads(lock.read_text()) + if data.get("schema") != 1 or locked.get("schema") != 1: + raise ValueError("Unsupported source manifest schema") + entries = {} + for item in data["components"]: + repo = item["id"] + path = ".workspace/" + repo + if (repo not in REPOS or repo in entries or item["path"] != path or + item["repo"] not in {SSH + repo + ".git", f"{SERVER}/weichen/{repo}.git"} or + item.get("role") not in {"go-library", "npm-library", "application", "guidelines", "documentation"}): + raise ValueError("Candidate source manifest is outside the reviewed allowlist") + for module in item.get("modules", []): + if module.get("path") not in GO_MODULES or not module["path"].startswith(GO_PREFIX + repo + ".git"): + raise ValueError("Candidate module mapping is outside the reviewed allowlist") + entries[repo] = item + selected = locked["components"] + if set(selected) - set(entries): + raise ValueError("Source lock refers to an unregistered repository") + for repo, item in entries.items(): + if item["role"] in {"application", "guidelines", "documentation"} and repo not in selected: + raise ValueError("Application and documentation source needs a fixed lock") + for repo, pin in selected.items(): + fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + if destination.exists() or destination.is_symlink() or destination.parent.is_symlink(): + raise ValueError("Source materialization requires a fresh destination") + # Validate the complete lock before any authenticated component fetch. + for repo, pin in selected.items(): + sha = fixed_sha(pin["commit"]) + destination = directory / entries[repo]["path"] + destination.mkdir(parents=True) + url = f"{SERVER}/weichen/{repo}.git" + git(destination, "init", "-q") + git(destination, "remote", "add", "origin", url) + git(destination, "fetch", "--depth=1", "origin", sha, token=component_token, repo=repo) + git(destination, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(destination, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Materialized source differs from the fixed lock") + # Persist the registered identity; process config chooses the transport. + git(destination, "remote", "set-url", "origin", entries[repo]["repo"]) + mirror(repo, sha, component_token) + materialize_legacy(destination) + + try: + if os.environ.get("GITHUB_REPOSITORY") != "weichen/Logging-System": + raise ValueError("Checkout repository is outside the reviewed allowlist") + sha = fixed_sha(os.environ.get("GITHUB_SHA", "")) + if not root_token: + raise ValueError("Checkout requires TOKEN") + if (root / ".git").exists(): + raise ValueError("Checkout requires a fresh workspace") + git(root, "init", "-q") + git(root, "remote", "add", "origin", SERVER + "/weichen/Logging-System.git") + git(root, "fetch", "--depth=1", "origin", sha, token=root_token, repo="Logging-System") + git(root, "checkout", "-q", "--detach", "FETCH_HEAD") + if git(root, "rev-parse", "HEAD").decode().strip() != sha: + raise ValueError("Checked-out commit differs from the platform commit") + if (root / ".ci-mirrors").exists() or (root / ".ci-mirrors.env").exists(): + raise ValueError("Candidate cannot provide trusted prefetch state") + materialize_manifest(root) + mirror_env() + except (ValueError, KeyError, OSError, subprocess.CalledProcessError) as error: + # Do not print child stderr or environment: a failed credential fetch stays redacted. + sys.exit("Checkout refused: " + str(error)) + print("Fixed source checkout complete; credentials were not persisted") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - name: Install Go 1.27.1 + run: | + set -euo pipefail + curl -fsSL -o "$RUNNER_TEMP/go.tgz" https://mirrors.aliyun.com/golang/go1.27.1.linux-amd64.tar.gz + tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz" + ln -sfn /usr/local/go/bin/go /usr/local/bin/go + ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt + - name: Prefetch Go modules without executing candidate code + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: &trusted_acquisition_2 | + set -euo pipefail + python3 - <<'PY_TRUSTED' + # Trusted workflow code only: never import or execute checkout scripts here. + # Token scopes, workflow provenance and runner isolation are platform NOT_RUN. + import json + import os + from pathlib import Path + import re + import shlex + import subprocess + import sys + import tempfile + from urllib.parse import urlsplit + + SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/") + parsed = urlsplit(SERVER) + if (parsed.scheme not in {"http", "https"} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment): + sys.exit("Acquisition requires the platform-injected http(s) server") + SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" + GO_PREFIX = "git-ssh.u1680832.nyat.app/weichen/" + REPOS = {"Agent-System-Dev", "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", + "Agent-Intent", "Agent-Command", "Agent-Squad", "Agent-System-Backend", + "Agent-System-Frontend", "Agent-System-UI", "Agent-System-RDM", + "Development-Guidelines", "Agent-System-Documents"} + LEGACY = { + "modules/core": "Agent-System-Core", "modules/backend": "Agent-System-Backend", + "modules/frontend": "Agent-System-Frontend", "modules/ui": "Agent-System-UI", + "modules/documents": "Agent-System-Documents", "deps/agent-system-core": "Agent-System-Core", + "deps/development-guidelines": "Development-Guidelines", "deps/agent-native": "Agent-Native", + "deps/agent-squad": "Agent-Squad", "deps/agent-intent": "Agent-Intent", + "deps/agent-command": "Agent-Command", "deps/error-code-system": "Error-Code-System", + "deps/logging-system": "Logging-System", "pins/agent-system-backend": "Agent-System-Backend", + "pins/agent-system-core": "Agent-System-Core", "pins/agent-system-frontend": "Agent-System-Frontend", + "pins/agent-system-ui": "Agent-System-UI", + } + GO_REPOS = REPOS - {"Agent-System-Dev", "Agent-System-UI", "Agent-System-Frontend", "Development-Guidelines", "Agent-System-Documents"} + GO_MODULES = {GO_PREFIX + repo + ".git" for repo in GO_REPOS} + GO_MODULES |= {GO_PREFIX + "Agent-Squad.git/" + suffix for suffix in + ("adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad")} + root_token = os.environ.pop("TOKEN", "") + component_token = os.environ.pop("SUBMODULE_TOKEN", "") + # Go environment files and inherited Git tracing/config must not change acquisition. + clean = {k: v for k, v in os.environ.items() + if not k.startswith(("GIT_", "NPM_CONFIG_", "npm_config_")) and + not any(word in k.upper() for word in ("TOKEN", "PASSWORD", "SECRET"))} + clean.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null", GIT_CONFIG_GLOBAL="/dev/null", + GIT_TERMINAL_PROMPT="0", GOENV="off", GOTOOLCHAIN="local", GOWORK="off", GOFLAGS="-mod=readonly", + GOPRIVATE=GO_PREFIX.rstrip("/"), GONOPROXY=GO_PREFIX.rstrip("/"), GONOSUMDB=GO_PREFIX.rstrip("/")) + if os.environ.get("npm_config_cache"): + clean["npm_config_cache"] = os.environ["npm_config_cache"] + config = {"core.hooksPath": "/dev/null", "core.fsmonitor": "false", "init.templateDir": "", + "credential.helper": "", "fetch.recurseSubmodules": "false", "submodule.recurse": "false", + "http.followRedirects": "false", "protocol.allow": "never", "protocol." + parsed.scheme + ".allow": "always"} + root = Path.cwd() + mirrors = root / ".ci-mirrors" + + def process_env(values): + env = clean | {"GIT_CONFIG_COUNT": str(len(values))} + for index, (key, value) in enumerate(values.items()): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + return env + + def git(directory, *args, token="", repo=""): + values = config.copy() + if token: + if repo not in REPOS: + raise ValueError("Credential destination is outside the reviewed repository allowlist") + values[f"http.{SERVER}/weichen/{repo}.git.extraheader"] = "AUTHORIZATION: token " + token + result = subprocess.run(["git", "-C", str(directory), *args], env=process_env(values), + check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return result.stdout + + def fixed_sha(value): + if not isinstance(value, str) or not re.fullmatch(r"[0-9a-fA-F]{40}", value): + raise ValueError("Source acquisition requires a fixed commit SHA") + return value.lower() + + def mirror(repo, sha, token): + sha = fixed_sha(sha) + destination = mirrors / (repo + ".git") + if destination.is_symlink() or mirrors.is_symlink(): + raise ValueError("Mirror directory cannot be a symlink") + mirrors.mkdir(exist_ok=True) + if not destination.exists(): + destination.mkdir() + git(destination, "init", "--bare", "-q") + url = f"{SERVER}/weichen/{repo}.git" + try: + git(destination, "cat-file", "-e", sha + "^{commit}") + except subprocess.CalledProcessError: + git(destination, "fetch", "--depth=200", url, sha, token=token, repo=repo) + git(destination, "update-ref", "refs/heads/main", sha) + git(destination, "symbolic-ref", "HEAD", "refs/heads/main") + git(destination, "update-ref", "refs/ci/" + sha, sha) + return destination + + def mirror_env(): + values = {"protocol.file.allow": "always", "core.hooksPath": "/dev/null", "credential.helper": ""} + # Distinct keys use repeated .insteadOf values, represented as a sequence below. + pairs = list(values.items()) + for repo in sorted(REPOS): + destination = mirrors / (repo + ".git") + if not destination.exists(): + continue + key = "url." + destination.as_uri() + ".insteadOf" + pairs.extend((key, url) for url in (SSH + repo + ".git", "https://" + GO_PREFIX + repo + ".git", + SERVER + "/weichen/" + repo + ".git", "https://" + GO_PREFIX + repo)) + env = clean | {"CI_DEPENDENCY_MIRRORS": str(mirrors), "GIT_CONFIG_COUNT": str(len(pairs))} + for index, (key, value) in enumerate(pairs): + env[f"GIT_CONFIG_KEY_{index}"] = key + env[f"GIT_CONFIG_VALUE_{index}"] = value + exports = {k: v for k, v in env.items() if k.startswith("GIT_CONFIG_") or k == "CI_DEPENDENCY_MIRRORS"} + (root / ".ci-mirrors.env").write_text("".join("export " + k + "=" + shlex.quote(v) + "\n" for k, v in exports.items())) + return env + + def source_roots(): + bases = [root] + composition = root / ".ci-composition-dev" + if composition.is_dir() and not composition.is_symlink(): + bases.append(composition) + paths = [] + for base in bases: + paths += [base, base / "rdm"] + [base / path for path in LEGACY] + [base / ".workspace" / repo for repo in sorted(REPOS)] + return [path for path in paths if path.is_dir() and not path.is_symlink()] + try: + targets = [] + for source in source_roots(): + for suffix in (".", "examples/trace", "adapters/native", "adapters/intent", "adapters/sqlite", "adapters/a2a", "cmd/agent-squad"): + directory = source / suffix + if (directory / "go.mod").is_file() and directory.resolve() not in targets: + targets.append(directory.resolve()) + # Parse using the installed local Go tool without credentials or candidate execution. + original_files = {} + for directory in targets: + parsed_mod = json.loads(subprocess.check_output(["go", "mod", "edit", "-json"], cwd=directory, env=clean)) + canonical = parsed_mod["Module"]["Path"].startswith(GO_PREFIX) + for name in ("go.mod", "go.sum"): + dependency_file = directory / name + if dependency_file.is_file(): + original_files[(directory, name)] = dependency_file.read_bytes() + elif canonical and name == "go.sum": + original_files[(directory, name)] = None + for dep in (parsed_mod.get("Require") or []): + path = dep["Path"] + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go dependency is outside the reviewed module mapping") + for replacement in (parsed_mod.get("Replace") or []): + path = replacement["New"]["Path"] + if canonical and not replacement["New"].get("Version"): + raise ValueError("Canonical module cannot acquire a local path replacement") + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Go replacement is outside the reviewed module mapping") + auth = config.copy() + for repo in sorted(GO_REPOS): + url = f"{SERVER}/weichen/{repo}.git" + auth[f"url.{url}.insteadOf"] = "https://" + GO_PREFIX + repo + auth[f"http.{url}.extraheader"] = "AUTHORIZATION: token " + component_token + def objects(output): + decoder = json.JSONDecoder() + remaining = output.strip() + while remaining: + item, end = decoder.raw_decode(remaining) + remaining = remaining[end:].lstrip() + yield item + def unchanged(): + for (owner, name), contents in original_files.items(): + dependency_file = owner / name + current = dependency_file.read_bytes() if dependency_file.exists() else None + if current != contents: + raise ValueError("Go acquisition modified a committed Go dependency file: " + str(dependency_file)) + for directory in targets: + # Resolve private go.mod metadata only through exact repository headers; + # validate the complete selected graph before acquiring module zip files. + graph = subprocess.run(["go", "list", "-mod=readonly", "-m", "-json", "all"], cwd=directory, + env=process_env(auth), capture_output=True, text=True) + if graph.returncode: + raise ValueError("Go selected graph resolution failed: " + graph.stderr.strip()) + for item in objects(graph.stdout): + if item.get("Main"): + continue + selected = item.get("Replace") or item + for path in (item.get("Path", ""), selected.get("Path", "")): + if path.startswith(GO_PREFIX) and path not in GO_MODULES: + raise ValueError("Selected Go module is outside the reviewed mapping") + unchanged() + # Go 1.27 can prune go.sum even under -mod=readonly for this + # metadata-only command. Use a disposable copy, then validate actual + # package loading against the unchanged committed source locks. + local_replacements = json.loads(subprocess.check_output( + ["go", "mod", "edit", "-json"], cwd=directory, env=clean)).get("Replace") or [] + downloaded = "" + if not any(not item["New"].get("Version") for item in local_replacements): + with tempfile.TemporaryDirectory(prefix="ci-go-prefetch-") as temporary: + download_root = Path(temporary) + for name in ("go.mod", "go.sum"): + if (directory / name).is_file(): + (download_root / name).write_bytes((directory / name).read_bytes()) + result = subprocess.run(["go", "mod", "download", "-json"], cwd=download_root, + env=process_env(auth), capture_output=True, text=True) + if result.returncode: + raise ValueError("Go module acquisition failed: " + result.stderr.strip()) + downloaded = result.stdout + unchanged() + for item in objects(downloaded): + path = item.get("Path", "") + if path.startswith(GO_PREFIX): + if path not in GO_MODULES: + raise ValueError("Resolved Go module is outside the reviewed mapping") + repo = path[len(GO_PREFIX):].split(".git", 1)[0] + origin = item.get("Origin") or json.loads(Path(item["Info"]).read_text()).get("Origin") or {} + mirror(repo, fixed_sha(origin.get("Hash")), component_token) + # Package metadata loads actual test/build dependencies without running + # vet, compilers, package init functions or candidate tests. No CGO tools. + packages = subprocess.run(["go", "list", "-mod=readonly", "-deps", "-test", "./..."], cwd=directory, + env=process_env(auth) | {"CGO_ENABLED": "0"}, capture_output=True, text=True) + if packages.returncode: + raise ValueError("Go test/build dependency acquisition failed: " + packages.stderr.strip()) + unchanged() + mirror_env() + except (ValueError, OSError, subprocess.CalledProcessError) as error: + sys.exit("Go prefetch refused: " + str(error)) + print("Go modules cached with GOTOOLCHAIN=local; no candidate code executed") + PY_TRUSTED + unset TOKEN SUBMODULE_TOKEN + - run: | + set -euo pipefail + source .ci-mirrors.env + for module in . examples/trace; do + test -f "$module/go.mod" + (cd "$module" && go vet -mod=readonly ./... && go test -mod=readonly -count=1 ./...) + done + docker-checkout-hostgateway: + runs-on: ubuntu-latest + options: --add-host gitea:host-gateway + env: + GITHUB_SERVER_URL: http://gitea:3000 + steps: + - name: Checkout + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: *trusted_acquisition_1 + - run: test -f go.mod && echo "docker-mode checkout via host-gateway OK" diff --git a/tests/fixtures/component-ci/provenance.json b/tests/fixtures/component-ci/provenance.json new file mode 100644 index 00000000..cdc35085 --- /dev/null +++ b/tests/fixtures/component-ci/provenance.json @@ -0,0 +1,73 @@ +{ + "schema": 1, + "usage": "test-input-only", + "capture": "git-show", + "components": { + "Logging-System": { + "repository": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Logging-System.git", + "source_sha": "2e2620009fcb21c302369c1125bea33e2a383c71", + "workflow_path": ".gitea/workflows/ci.yml", + "workflow_sha256": "163d62d87654c98506a97bff6188c6d4c2338c3abfce1bec110b1de6c872cb24" + }, + "Error-Code-System": { + "repository": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Error-Code-System.git", + "source_sha": "f55c6b11b6eeda36b9d30fb9e92dcecc44a9fcae", + "workflow_path": ".gitea/workflows/ci.yml", + "workflow_sha256": "3fbbc1a91412bcac32a9eec8deaded8ce1b5151e512987a4669030a2cf5b776e" + }, + "Agent-System-Core": { + "repository": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Core.git", + "source_sha": "dc4440d5d81a7ff9a79349c9c6a390cc2f9cb60a", + "workflow_path": ".gitea/workflows/ci.yml", + "workflow_sha256": "6b0b5568bffa26709469fc655dee61210300156dba79bb619a7017162b1846a6" + }, + "Agent-Native": { + "repository": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Native.git", + "source_sha": "3b550d783dd7d4dd37d30bb312f0c4369a3102a5", + "workflow_path": ".gitea/workflows/ci.yml", + "workflow_sha256": "8d0cdab26b2758318b3bffeeb90b9c1ae947bc3f232e89e56ebf2f8edf45420d" + }, + "Agent-Intent": { + "repository": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Intent.git", + "source_sha": "c29cf6a283d0a2d93099e703d76b08c8a7801c90", + "workflow_path": ".gitea/workflows/ci.yml", + "workflow_sha256": "c15dde13c41be0437db8d5b7e7e99c4ff37cab1af66515971400bfd7e5c94c55" + }, + "Agent-Command": { + "repository": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Command.git", + "source_sha": "63dc7e06412af632c6b9c32ca3d71fb7cd8235fc", + "workflow_path": ".gitea/workflows/ci.yml", + "workflow_sha256": "b12f615219a32dc4c477658e9abedbbe250aee260baf9c8cbffdb9a9d645f24e" + }, + "Agent-Squad": { + "repository": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Squad.git", + "source_sha": "42e1c4cd3296c7c68eef9473f34e50d59ba1412b", + "workflow_path": ".gitea/workflows/ci.yml", + "workflow_sha256": "641f7e84fae05b99397ffc3b311031099526a29e8c6e39ae6b43617e7e4b9fd4" + }, + "Agent-System-Backend": { + "repository": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Backend.git", + "source_sha": "fffd5790cfab317fadafb40fa55a11bab6e9a847", + "workflow_path": ".gitea/workflows/ci.yml", + "workflow_sha256": "c14a60739881d243cf459e05e8859976e6e86e6df3a272410cd2df3e0d43d063" + }, + "Agent-System-UI": { + "repository": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-UI.git", + "source_sha": "bc0a4d33d03728e8726b5c398c4239a87def8eda", + "workflow_path": ".gitea/workflows/ci.yml", + "workflow_sha256": "ef41bf7d981c37246d71fe80c09fa077341802442aad213b14c9f18a17a58694" + }, + "Agent-System-Frontend": { + "repository": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Frontend.git", + "source_sha": "6ed7b9322c5733f76b206a35cd78649ba385d83b", + "workflow_path": ".gitea/workflows/ci.yml", + "workflow_sha256": "51aeaa0e2ced11bb36fd6b66ac8da66a1f2efdbd6a5d6036302159646cabc3be" + }, + "Agent-System-RDM": { + "repository": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-RDM.git", + "source_sha": "8a18dfa86e9afb1be231661e82cde8c0db7ee31b", + "workflow_path": ".gitea/workflows/ci.yml", + "workflow_sha256": "47693ea41584cae52a32e291fae5fa995b5ca746b41cf150d6dac709e6a83b55" + } + } +} diff --git a/tests/test_ci_credentials.py b/tests/test_ci_credentials.py index 83c9bbbe..95222fd9 100644 --- a/tests/test_ci_credentials.py +++ b/tests/test_ci_credentials.py @@ -1,7 +1,10 @@ """Execute the workflow checkout against real disposable HTTP Git repositories.""" import http.server +import hashlib +import json import os from pathlib import Path +import re import subprocess import tempfile import textwrap @@ -15,6 +18,46 @@ SERVER = "https://git-home.u1680832.nyat.app:30319" SSH = "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/" ROOT_TOKEN = "synthetic-root-token-not-a-real-secret" SUB_TOKEN = "synthetic-component-token-not-a-real-secret" +COMPONENT_REPOSITORIES = ( + "Logging-System", "Error-Code-System", "Agent-System-Core", "Agent-Native", "Agent-Intent", + "Agent-Command", "Agent-Squad", "Agent-System-Backend", "Agent-System-UI", + "Agent-System-Frontend", "Agent-System-RDM", +) +COMPONENT_FIXTURES = Path(__file__).resolve().parent / "fixtures/component-ci" + + +def component_workflow(repository, *, snapshots=COMPONENT_FIXTURES, source_root=None): + """Read committed test input; never use these snapshots for real acquisition. + + Optional COMPONENT_CI_SOURCE_ROOT verifies the recorded immutable Git object + and current source HEAD. An archive requires only its committed fixture set. + """ + if repository not in COMPONENT_REPOSITORIES: + raise ValueError("Unknown component workflow fixture") + provenance = json.loads((snapshots / "provenance.json").read_text()) + if provenance.get("schema") != 1 or set(provenance.get("components", {})) != set(COMPONENT_REPOSITORIES): + raise ValueError("Component workflow provenance must cover every reviewed repository") + record = provenance["components"][repository] + if (set(record) != {"repository", "source_sha", "workflow_path", "workflow_sha256"} or + record["repository"] != SSH + repository + ".git" or + record["workflow_path"] != ".gitea/workflows/ci.yml" or + not re.fullmatch(r"[0-9a-f]{40}", record["source_sha"]) or + not re.fullmatch(r"[0-9a-f]{64}", record["workflow_sha256"])): + raise ValueError("Invalid fixed component workflow provenance") + path = snapshots / repository / "ci.yml" + if path.is_symlink() or hashlib.sha256(path.read_bytes()).hexdigest() != record["workflow_sha256"]: + raise ValueError("Component workflow snapshot differs from its recorded source digest") + source_root = source_root or os.environ.get("COMPONENT_CI_SOURCE_ROOT") + if source_root: + source = Path(source_root) / repository + head = subprocess.check_output(["git", "-C", str(source), "rev-parse", "HEAD"], text=True).strip() + if head != record["source_sha"]: + raise ValueError("Component source HEAD differs from fixture provenance") + captured = subprocess.check_output(["git", "-C", str(source), "show", + record["source_sha"] + ":" + record["workflow_path"]]) + if captured != path.read_bytes(): + raise ValueError("Component workflow snapshot differs from its immutable Git source") + return path def workflow_script(workflow, name): diff --git a/tests/test_dependency_ci.py b/tests/test_dependency_ci.py index bddd4228..76e47288 100644 --- a/tests/test_dependency_ci.py +++ b/tests/test_dependency_ci.py @@ -3,6 +3,8 @@ import json import os from pathlib import Path import subprocess +import shutil +import tempfile import textwrap import unittest @@ -11,13 +13,80 @@ from tests import test_ci_credentials as fixture ROOT_TOKEN, SUB_TOKEN, SSH, WORKFLOW = fixture.ROOT_TOKEN, fixture.SUB_TOKEN, fixture.SSH, fixture.WORKFLOW MODULE = "git-ssh.u1680832.nyat.app/weichen/Logging-System.git" -MIGRATION = WORKFLOW.parents[2] / ".migration" def phase(workflow, name): return fixture.workflow_script(workflow, name) +class ComponentWorkflowFixtureTests(unittest.TestCase): + def setUp(self): + self.temporary = tempfile.TemporaryDirectory() + self.addCleanup(self.temporary.cleanup) + self.base = Path(self.temporary.name) + self.snapshots = self.base / "snapshots" + shutil.copytree(fixture.COMPONENT_FIXTURES, self.snapshots) + + def test_all_required_component_snapshots_have_fixed_provenance(self): + for repository in fixture.COMPONENT_REPOSITORIES: + with self.subTest(repository=repository): + path = fixture.component_workflow(repository) + self.assertEqual(path, fixture.COMPONENT_FIXTURES / repository / "ci.yml") + self.assertTrue(phase(path, "Checkout")) + + def test_modified_workflow_snapshot_is_rejected_before_execution(self): + path = self.snapshots / "Agent-Native/ci.yml" + path.write_bytes(path.read_bytes() + b"\n# unexpected workflow replacement\n") + with self.assertRaisesRegex(ValueError, "recorded source digest"): + fixture.component_workflow("Agent-Native", snapshots=self.snapshots) + + def test_missing_component_snapshot_is_not_skipped(self): + (self.snapshots / "Agent-Native/ci.yml").unlink() + with self.assertRaises(FileNotFoundError): + fixture.component_workflow("Agent-Native", snapshots=self.snapshots) + + def test_omitted_repository_provenance_is_rejected(self): + path = self.snapshots / "provenance.json" + provenance = json.loads(path.read_text()) + del provenance["components"]["Agent-Native"] + path.write_text(json.dumps(provenance)) + with self.assertRaisesRegex(ValueError, "every reviewed repository"): + fixture.component_workflow("Agent-Native", snapshots=self.snapshots) + + def test_optional_source_validation_uses_immutable_commit_and_rejects_stale_head(self): + source_root = self.base / "sources" + source = source_root / "Agent-Native" + workflow = source / ".gitea/workflows/ci.yml" + workflow.parent.mkdir(parents=True) + captured = self.snapshots / "Agent-Native/ci.yml" + workflow.write_bytes(captured.read_bytes()) + env = {k: v for k, v in os.environ.items() if not k.startswith("GIT_")} + env.update(GIT_CONFIG_GLOBAL="/dev/null", GIT_CONFIG_SYSTEM="/dev/null") + + def git(*args): + return subprocess.check_output(["git", "-C", str(source), *args], env=env, text=True).strip() + + git("init", "-q") + git("add", ".") + git("-c", "user.name=Fixture", "-c", "user.email=fixture@example.invalid", "commit", "-q", "-m", "Source") + metadata = self.snapshots / "provenance.json" + provenance = json.loads(metadata.read_text()) + provenance["components"]["Agent-Native"]["source_sha"] = git("rev-parse", "HEAD") + metadata.write_text(json.dumps(provenance)) + # A mutable file must not substitute for the committed Git object. + workflow.write_text("uncommitted workflow replacement\n") + self.assertEqual(fixture.component_workflow("Agent-Native", snapshots=self.snapshots, + source_root=source_root), captured) + git("add", ".") + git("-c", "user.name=Fixture", "-c", "user.email=fixture@example.invalid", "commit", "-q", "-m", "Changed") + with self.assertRaisesRegex(ValueError, "source HEAD differs"): + fixture.component_workflow("Agent-Native", snapshots=self.snapshots, source_root=source_root) + provenance["components"]["Agent-Native"]["source_sha"] = git("rev-parse", "HEAD") + metadata.write_text(json.dumps(provenance)) + with self.assertRaisesRegex(ValueError, "immutable Git source"): + fixture.component_workflow("Agent-Native", snapshots=self.snapshots, source_root=source_root) + + class DependencyCITests(unittest.TestCase): setUp = fixture.CheckoutTests.setUp git = fixture.CheckoutTests.git @@ -187,7 +256,7 @@ class DependencyCITests(unittest.TestCase): sha = self.publish(repo) self.checkout = self.base / (repo + "-checkout") self.checkout.mkdir() - result = self.run_phase("Checkout", workflow=MIGRATION / repo / ".gitea/workflows/ci.yml", + result = self.run_phase("Checkout", workflow=fixture.component_workflow(repo), extra={"TOKEN": ROOT_TOKEN, "GITHUB_SHA": sha, "GITHUB_REPOSITORY": "weichen/" + repo}, after="python3 probe.py") self.assertEqual(result.returncode, 0, result.stdout + result.stderr) @@ -219,7 +288,7 @@ class DependencyCITests(unittest.TestCase): (directory / "go.mod").write_text("module nestedfixture\n\ngo 1.25\n") (directory / "regression_test.go").write_text( 'package nestedfixture\nimport "testing"\nfunc TestNested(t *testing.T) {t.Fatal("intentional nested regression")}\n') - lines = (MIGRATION / repo / ".gitea/workflows/ci.yml").read_text().splitlines() + lines = fixture.component_workflow(repo).read_text().splitlines() command = next(i for i, line in enumerate(lines) if "go vet" in line) start = max(i for i in range(command) if lines[i].strip().endswith("run: |")) + 1 end = next((i for i in range(start, len(lines)) @@ -241,7 +310,7 @@ class DependencyCITests(unittest.TestCase): (example / "go.sum").write_text(self.fixture_checksums(MODULE, sha)) before = (example / "go.sum").read_bytes() result = self.run_phase("Prefetch Go modules without executing candidate code", - workflow=MIGRATION / "Logging-System/.gitea/workflows/ci.yml") + workflow=fixture.component_workflow("Logging-System")) self.assertEqual(result.returncode, 0, result.stdout + result.stderr) self.assertTrue(self.requests, "trace module's private requirement was not prefetched") self.assertEqual((example / "go.sum").read_bytes(), before, "Go 1.27 prefetch pruned source checksums") @@ -262,7 +331,7 @@ class DependencyCITests(unittest.TestCase): (self.checkout / "composition.dev.json").write_text(json.dumps({ "schema": 1, "repo": SSH + "Agent-System-Dev.git", "commit": dev})) result = self.run_phase("Prefetch fixed Dev product composition", - workflow=MIGRATION / "Agent-System-RDM/.gitea/workflows/ci.yml") + workflow=fixture.component_workflow("Agent-System-RDM")) self.assertEqual(result.returncode, 0, result.stdout + result.stderr) self.assertEqual(self.git(self.checkout / ".ci-composition-dev", "rev-parse", "HEAD"), dev) for path, auth in self.requests: @@ -277,7 +346,7 @@ class DependencyCITests(unittest.TestCase): with self.subTest(lock=lock): (self.checkout / "composition.dev.json").write_text(json.dumps(lock)) result = self.run_phase("Prefetch fixed Dev product composition", - workflow=MIGRATION / "Agent-System-RDM/.gitea/workflows/ci.yml") + workflow=fixture.component_workflow("Agent-System-RDM")) self.assertNotEqual(result.returncode, 0) self.assertFalse(self.requests) -- 2.54.0 From 0d9f44a7e266ec5d03ff92301a9086293ed6db8c Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 13 Oct 2026 18:15:42 +0000 Subject: [PATCH 12/29] Bind executed build tools and finish acquisition before candidate code Why: A dirty composer could change artifacts under a committed Dev identity, and two CI jobs reacquired credentials after executing candidate build code. Evidence: SELF regressions reproduce both issues before the fixes; all22 real composition cases and21 dependency/CI cases pass after. CI syntax checked; full exact committed replay follows this checkpoint. Impact: Verify executing composer/transport bytes before import and publication, record explicit tooling provenance, order all privileged acquisition first, and model CGO correctly in the nested component race fixture. Existing product and required CI gates remain. Refs: Dependency-workspace early code review; correctness/standards/security P1 findings and R7-R8/R14. --- .gitea/workflows/ci.yaml | 52 +++++++++++++++--------------------- scripts/build-composition.py | 34 ++++++++++++++++++++++- tests/test_composition.py | 30 +++++++++++++++++++++ tests/test_dependency_ci.py | 20 +++++++++++++- 4 files changed, 104 insertions(+), 32 deletions(-) diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index e93208c1..960fa1b7 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -733,10 +733,6 @@ jobs: tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz" ln -sfn /usr/local/go/bin/go /usr/local/bin/go ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt - - name: Prefetch Go modules without executing candidate code - env: - SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} - run: *trusted_acquisition_2 - name: Install house-style Python packages run: python3 -m pip install --break-system-packages -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx python-pptx openpyxl - name: Install PostgreSQL, pgvector and Redis @@ -770,15 +766,6 @@ jobs: pg_as_postgres psql -d agent_test -c "CREATE EXTENSION IF NOT EXISTS pg_trgm" redis-server --daemonize yes --port 6399 --save '' --appendonly no redis-cli -p 6399 ping - - name: Backend tests against real PostgreSQL and Redis (required, no silent skip) - env: - AGENT_PG_TEST_DSN: postgres://ci_agent:ci_job_local_only@127.0.0.1:5432/agent_test?sslmode=disable - AGENT_REDIS_TEST_ADDR: 127.0.0.1:6399 - run: make test-backend-pg - - name: Two-process HTTP acceptance over shared PostgreSQL (U7, required) - env: - AGENT_PG_TEST_DSN: postgres://ci_agent:ci_job_local_only@127.0.0.1:5432/agent_test?sslmode=disable - run: make test-multi-instance - name: RDM lifecycle pin is three fixed SHAs run: python3 -m unittest tests.test_lifecycle_pin -q && bash scripts/fetch-rdm-pin.sh tests/integration/lifecycle/rdm.pin >/dev/null - name: Clone Agent-System-RDM with nested pins (reviewed allowlist addition) @@ -985,6 +972,15 @@ jobs: env: SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} run: *trusted_acquisition_2 + - name: Install Node 22 + run: | + set -euo pipefail + curl -fsSL -o "$RUNNER_TEMP/node.tar.xz" https://npmmirror.com/mirrors/node/v22.23.3/node-v22.23.3-linux-x64.tar.xz + tar -C /usr/local --strip-components=1 -xJf "$RUNNER_TEMP/node.tar.xz" + - name: Prefetch npm packages without lifecycle scripts + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: *trusted_acquisition_3 - name: Build fixed RDM pins without credentials run: | set -euo pipefail @@ -995,20 +991,20 @@ jobs: make -C rdm build sha256sum rdm/bin/agent-system-rdm | awk -v rev="$rev" '{print rev, $1}' >> rdm/pin-build-digests.txt done < .ci-rdm-pins - - name: Install Node 22 - run: | - set -euo pipefail - curl -fsSL -o "$RUNNER_TEMP/node.tar.xz" https://npmmirror.com/mirrors/node/v22.23.3/node-v22.23.3-linux-x64.tar.xz - tar -C /usr/local --strip-components=1 -xJf "$RUNNER_TEMP/node.tar.xz" - - name: Prefetch npm packages without lifecycle scripts - env: - SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} - run: *trusted_acquisition_3 - name: Build the real agent-system binary run: | set -euo pipefail source .ci-mirrors.env make build + - name: Backend tests against real PostgreSQL and Redis (required, no silent skip) + env: + AGENT_PG_TEST_DSN: postgres://ci_agent:ci_job_local_only@127.0.0.1:5432/agent_test?sslmode=disable + AGENT_REDIS_TEST_ADDR: 127.0.0.1:6399 + run: make test-backend-pg + - name: Two-process HTTP acceptance over shared PostgreSQL (U7, required) + env: + AGENT_PG_TEST_DSN: postgres://ci_agent:ci_job_local_only@127.0.0.1:5432/agent_test?sslmode=disable + run: make test-multi-instance - name: Real-combination lifecycle gate (make test-lifecycle, required) env: AGENT_PG_TEST_DSN: postgres://ci_agent:ci_job_local_only@127.0.0.1:5432/agent_test?sslmode=disable @@ -1050,6 +1046,10 @@ jobs: tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz" ln -sfn /usr/local/go/bin/go /usr/local/bin/go ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt + - name: Clone Agent-System-RDM with nested pins (reviewed allowlist addition) + env: + SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} + run: *trusted_acquisition_4 - name: Prefetch Go modules without executing candidate code env: SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} @@ -1068,14 +1068,6 @@ jobs: set -euo pipefail source .ci-mirrors.env make build - - name: Clone Agent-System-RDM with nested pins (reviewed allowlist addition) - env: - SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} - run: *trusted_acquisition_4 - - name: Prefetch Go modules without executing candidate code - env: - SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} - run: *trusted_acquisition_2 - name: Build fixed RDM pins without credentials run: | set -euo pipefail diff --git a/scripts/build-composition.py b/scripts/build-composition.py index 3862fbb3..7c2bbb2b 100644 --- a/scripts/build-composition.py +++ b/scripts/build-composition.py @@ -9,6 +9,7 @@ import hashlib import importlib.util import io import json +import os from pathlib import Path, PurePosixPath import re import shutil @@ -86,6 +87,31 @@ def validate_repo(repo): raise CompositionError("file repository must be local") +def tooling_identity(root): + """Bind executed tools before importing acquisition configuration.""" + env = os.environ.copy() + for key in ("GIT_DIR", "GIT_WORK_TREE", "GIT_INDEX_FILE", "GIT_COMMON_DIR"): + env.pop(key, None) + commit = run(["git", "rev-parse", "HEAD"], root, env, quiet=True).strip() + result = {"root_commit": commit, "files": {}} + for relative in ("scripts/build-composition.py", "scripts/workspace/transport.py"): + executing = Path(__file__).resolve().parent / relative.removeprefix("scripts/") + fixed = subprocess.run(["git", "show", f"{commit}:{relative}"], cwd=root, env=env, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if fixed.returncode == 0: + if executing.is_symlink() or executing.read_bytes() != fixed.stdout: + raise CompositionError(f"executing tooling differs from committed source: {relative}") + mode = "committed-root" + elif (root / relative).exists(): + raise CompositionError(f"root tooling has no committed identity: {relative}") + else: + # A standalone consumer fixture can use an external composer. Its + # exact tool bytes are a separate identity, never the consumer SHA. + mode = "external-tool" + result["files"][relative] = {"sha256": digest(executing), "source": mode} + return result + + def inputs(root, env): commit = run(["git", "rev-parse", "HEAD"], root, env, quiet=True).strip() if not SHA.fullmatch(commit): @@ -391,6 +417,7 @@ def provider_tests(root, root_commit, components, sources, manifest, temporary, def compose(root, target, output, rdm_source=None, source_map_path=None): + tooling = tooling_identity(root) transport_path = Path(__file__).resolve().parent / "workspace/transport.py" spec = importlib.util.spec_from_file_location("composition_transport", transport_path) transport = importlib.util.module_from_spec(spec) @@ -398,9 +425,12 @@ def compose(root, target, output, rdm_source=None, source_map_path=None): fetch_env = transport.environment(root) fetch_env.update(GOWORK="off", GOFLAGS="", GOTOOLCHAIN="local") root_commit, components, lock, input_hashes = inputs(root, fetch_env) + if root_commit != tooling["root_commit"]: + raise CompositionError("root identity changed during tooling validation") clean_env = execution_environment(fetch_env) manifest = {"schema": 1, "kind": "agent-system-composition/1", "target": target, - "root": {"commit": root_commit, "inputs": input_hashes}, "applications": {}, "go": {}, "artifacts": {}, "assets": {}} + "root": {"commit": root_commit, "inputs": input_hashes}, "tooling": tooling, + "applications": {}, "go": {}, "artifacts": {}, "assets": {}} with tempfile.TemporaryDirectory(prefix="agent-system-composition-") as directory: temporary = Path(directory) sources = {} @@ -486,6 +516,8 @@ def compose(root, target, output, rdm_source=None, source_map_path=None): manifest["assets"]["plugins"]["root_commit"] = root_commit for artifact in products.iterdir(): manifest["artifacts"][artifact.name] = {"sha256": digest(artifact), "size": artifact.stat().st_size} + if tooling_identity(root) != tooling: + raise CompositionError("executing tooling changed during composition") # Publish only after all required build/test commands succeeded. output.mkdir(parents=True, exist_ok=True) for artifact in products.iterdir(): diff --git a/tests/test_composition.py b/tests/test_composition.py index ef6d9da6..96fdfb62 100644 --- a/tests/test_composition.py +++ b/tests/test_composition.py @@ -314,6 +314,36 @@ with pathlib.Path(os.environ['COMPOSITION_GATE_MARKER']).open('a') as output: ou self.save_inputs() result = self.compose() self.assertNotEqual(result.returncode, 0, result.stdout) + + def test_dirty_root_composer_cannot_publish_under_committed_identity(self): + tools = self.root / "scripts" + (tools / "workspace").mkdir(parents=True) + shutil.copy2(SCRIPT, tools / "build-composition.py") + shutil.copy2(SCRIPT.parent / "workspace/transport.py", tools / "workspace/transport.py") + self.commit(self.root) + composer = tools / "build-composition.py" + composer.write_text(composer.read_text().replace( + '(destination / ".gitkeep").touch()', + '(destination / ".gitkeep").touch(); (destination / "index.html").write_text("dirty-tool-page")')) + result = self.run_command([sys.executable, str(composer), "--root", str(self.root), + "--target", "build", "--output", str(self.out)], check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("tool", result.stdout) + self.assertFalse((self.out / "agent-system").exists()) + + def test_dirty_root_transport_is_refused_before_import(self): + tools = self.root / "scripts" + (tools / "workspace").mkdir(parents=True) + shutil.copy2(SCRIPT, tools / "build-composition.py") + shutil.copy2(SCRIPT.parent / "workspace/transport.py", tools / "workspace/transport.py") + self.commit(self.root) + marker = self.base / "transport-executed" + (tools / "workspace/transport.py").write_text( + "from pathlib import Path\nPath(" + repr(str(marker)) + ").write_text('executed')\n") + result = self.run_command([sys.executable, str(tools / "build-composition.py"), "--root", str(self.root), + "--target", "build", "--output", str(self.out)], check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertFalse(marker.exists(), "dirty transport executed before source identity validation") self.assertIn("committed", result.stdout) def test_locked_missing_revision_is_rejected(self): diff --git a/tests/test_dependency_ci.py b/tests/test_dependency_ci.py index 76e47288..e7fe860d 100644 --- a/tests/test_dependency_ci.py +++ b/tests/test_dependency_ci.py @@ -1,6 +1,7 @@ """Replay trusted workflow phases with real Git, Go, npm and disposable HTTP repos.""" import json import os +import re from pathlib import Path import subprocess import shutil @@ -88,6 +89,21 @@ class ComponentWorkflowFixtureTests(unittest.TestCase): class DependencyCITests(unittest.TestCase): + def test_privileged_acquisition_finishes_before_candidate_execution_in_each_job(self): + content = WORKFLOW.read_text() + jobs = re.split(r"^ ([A-Za-z0-9_-]+):\n", content, flags=re.M) + for index in range(1, len(jobs), 2): + job, body = jobs[index:index+2] + executed = False + steps = re.split(r"^ - name: ([^\n]+)\n", body, flags=re.M) + for step in range(1, len(steps), 2): + name, script = steps[step:step+2] + with self.subTest(job=job, step=name): + if re.search(r"\$\{\{\s*secrets\.", script): + self.assertFalse(executed, "privileged acquisition follows candidate execution") + if re.search(r"^\s+(?:make\s|go\s+(?:build|test|vet)\s|npm\s+(?:run|test)\s|bash\s+scripts/)", script, re.M): + executed = True + setUp = fixture.CheckoutTests.setUp git = fixture.CheckoutTests.git publish = fixture.CheckoutTests.publish @@ -294,7 +310,9 @@ class DependencyCITests(unittest.TestCase): end = next((i for i in range(start, len(lines)) if lines[i].strip() and not lines[i].startswith(" ")), len(lines)) script = textwrap.dedent("\n".join(lines[start:end])) - result = subprocess.run(["bash", "-c", script], cwd=self.checkout, env=self.env, + # Component CI's race gate uses the native runner C compiler; + # formal product builds independently set CGO_ENABLED=0. + result = subprocess.run(["bash", "-c", script], cwd=self.checkout, env=self.env | {"CGO_ENABLED": "1"}, capture_output=True, text=True, timeout=60) self.assertNotEqual(result.returncode, 0, "nested regression was skipped by component CI") self.assertIn("intentional nested regression", result.stdout + result.stderr) -- 2.54.0 From f2b7a9af68d55c9728779adca2c9144c518106ff Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 13 Oct 2026 18:27:31 +0000 Subject: [PATCH 13/29] Finish acquisition before inline Python and shell verification Why: The lifecycle pin verification step executes candidate Python and shell code even when its YAML run value is inline. Evidence: SELF regression observes three credential-order failures on the prior candidate, then passes after moving pin verification behind all privileged acquisition and recognizing inline run entries. Impact: Retain the pin verification gate while ending credential use before every candidate entry point. Refs: Dependency-workspace independent security and standards validation; R8 and CI phase boundary. --- .gitea/workflows/ci.yaml | 4 ++-- tests/test_dependency_ci.py | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 960fa1b7..30753c30 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -766,8 +766,6 @@ jobs: pg_as_postgres psql -d agent_test -c "CREATE EXTENSION IF NOT EXISTS pg_trgm" redis-server --daemonize yes --port 6399 --save '' --appendonly no redis-cli -p 6399 ping - - name: RDM lifecycle pin is three fixed SHAs - run: python3 -m unittest tests.test_lifecycle_pin -q && bash scripts/fetch-rdm-pin.sh tests/integration/lifecycle/rdm.pin >/dev/null - name: Clone Agent-System-RDM with nested pins (reviewed allowlist addition) env: SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} @@ -981,6 +979,8 @@ jobs: env: SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} run: *trusted_acquisition_3 + - name: RDM lifecycle pin is three fixed SHAs + run: python3 -m unittest tests.test_lifecycle_pin -q && bash scripts/fetch-rdm-pin.sh tests/integration/lifecycle/rdm.pin >/dev/null - name: Build fixed RDM pins without credentials run: | set -euo pipefail diff --git a/tests/test_dependency_ci.py b/tests/test_dependency_ci.py index e7fe860d..e0731a27 100644 --- a/tests/test_dependency_ci.py +++ b/tests/test_dependency_ci.py @@ -101,7 +101,9 @@ class DependencyCITests(unittest.TestCase): with self.subTest(job=job, step=name): if re.search(r"\$\{\{\s*secrets\.", script): self.assertFalse(executed, "privileged acquisition follows candidate execution") - if re.search(r"^\s+(?:make\s|go\s+(?:build|test|vet)\s|npm\s+(?:run|test)\s|bash\s+scripts/)", script, re.M): + # run may be an inline YAML scalar or a multiline block; + # both shell and Python project entry points execute code. + if re.search(r"(?:^|\n)\s*(?:run:\s*)?(?:make\s|go\s+(?:build|test|vet)\s|npm\s+(?:run|test)\s|bash\s+scripts/|python3?\s+(?:-m\s+unittest|scripts/))", script): executed = True setUp = fixture.CheckoutTests.setUp -- 2.54.0 From a408e49167d3554d6e0173e040b65828d9cfc3b0 Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 13 Oct 2026 18:33:21 +0000 Subject: [PATCH 14/29] Prove interrupted nested transitions preserve owner recovery data Why: An interrupted multi-component transition must retain original staged, ignored and external-worktree data after some independent copies have completed. Evidence: SELF scratch fixture interrupts a real nested copy after App is saved and Logging is partially copied; originals and external Git metadata remain identical, recorded partial data persists and retry refuses to discard it. Impact: Add failure-path coverage and clarify reachability checks before component branch cleanup; no transition implementation change. Refs: Dependency-workspace R9/R15 and independent reliability coverage followup. --- policy/dependencies.md | 2 ++ tests/test_workspace.py | 45 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/policy/dependencies.md b/policy/dependencies.md index 99a45e37..d0a9882a 100644 --- a/policy/dependencies.md +++ b/policy/dependencies.md @@ -10,6 +10,8 @@ - npm:消费方 package-lock 固定 Git 提交及包完整性信息;契约由 Core 单一 TS 源码产生,UI 与 Frontend 消费 `@agent-system/contracts`,Frontend 消费 `@agent-system/ui`。 - 正式产物:隔离固定源码装配 frontend dist/backend embed,自动导出解析清单与摘要。RDM 使用隔离 vendor 构建注入固定前端资产,不改 Go module cache,不写本地路径 replace。 +采用的提交在功能仓合入后仍须从批准来源获取。合入方式须保留已锁定的提交对象;回收功能分支前核对这些提交已在主干或受保护归档中可达,不用 squash 或删除唯一引用使现有语言版本失效。发布 tag 与归档删除仍保留原双钥匙边界。 + 新模式是否存在以该提交的 `components.json`/锁为准。历史提交没有这两份文件时继续按照其旧 gitlinks 与脚本构建;不能套用最新来源改变历史候选。 ## 从 Dev 按需编辑 diff --git a/tests/test_workspace.py b/tests/test_workspace.py index e3514988..e0b98bba 100644 --- a/tests/test_workspace.py +++ b/tests/test_workspace.py @@ -8,6 +8,7 @@ import subprocess import sys import tempfile import unittest +from unittest.mock import patch import zipfile SOURCE = Path(__file__).resolve().parents[1] @@ -351,6 +352,50 @@ class WorkspaceTests(unittest.TestCase): self.assertFalse((self.root / ".workspace/Errors").exists()) self.assertEqual(self.fingerprint(legacy), before) + def test_partial_nested_transition_keeps_originals_and_owner_recovery_state(self): + legacy, errors, logging = self.nested_legacy() + self.git(errors, "checkout", "-b", "feature/partial-source") + (errors / "value.go").write_text('package errors\nfunc Value() string { return "staged" }\n') + self.git(errors, "add", "value.go") + (errors / "value.go").write_text('package errors\nfunc Value() string { return "working" }\n') + (errors / "private").mkdir() + (errors / "private/unique").write_text("ignored owner data") + external = self.base / "external-owner" + self.git(errors, "worktree", "add", "--detach", str(external), "HEAD") + originals = {str(path): self.fingerprint(path) for path in (legacy, errors, logging, external)} + metadata = {str(path): self.git_metadata(path) for path in (legacy, errors, logging)} + sys.path.insert(0, str(SOURCE / "scripts")) + self.addCleanup(sys.path.remove, str(SOURCE / "scripts")) + from workspace.cli import main + copy = shutil.copy2 + copied = [] + def interrupt(source, destination, *args, **kwargs): + result = copy(source, destination, *args, **kwargs) + if Path(source).is_relative_to(logging): + copied.append(str(source)) + raise OSError("injected partial nested copy failure") + return result + with patch.dict(os.environ, self.env, clear=True), patch("workspace.transition.shutil.copy2", side_effect=interrupt): + result = main(["--root", str(self.root), "transition", "--name", "App", "--apply"]) + self.assertNotEqual(result, 0) + self.assertTrue(copied) + state = self.state()["components"] + self.assertEqual(state["App"]["mode"], "editable") + # Errors has not been copied when Logging fails; its complete original + # index/worktree/ignored data is still the owner's recovery source. + self.assertIn("staged", self.git(errors, "show", ":value.go").stdout) + self.assertIn("working", (errors / "value.go").read_text()) + self.assertEqual((errors / "private/unique").read_text(), "ignored owner data") + partial = self.root / ".workspace/Logging" + self.assertTrue((partial / ".git").is_dir()) + self.assertIn("partial nested copy", state["Logging"]["error"]) + self.assertNotEqual(self.cli("transition", "--name", "App", "--apply", check=False).returncode, 0) + self.assertTrue(partial.exists(), "owner recovery data must not be removed on retry") + for path in (legacy, errors, logging, external): + self.assertEqual(self.fingerprint(path), originals[str(path)]) + for path in (legacy, errors, logging): + self.assertEqual(self.git_metadata(path), metadata[str(path)]) + def test_equivalent_recursive_nested_sources_share_an_independent_component(self): legacy, errors, logging = self.nested_legacy() remote = next(item["repo"] for item in self.manifest["components"] if item["id"] == "Errors") -- 2.54.0 From d76ec5ded253c5e30dd1dfd54e06edee68c07e70 Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 13 Oct 2026 18:44:39 +0000 Subject: [PATCH 15/29] Finish composition acquisition before running candidate code (U5) Why: Later authenticated source acquisition must never follow a frontend build or provider test. Evidence: SELF host replay passed all 23 real composition fixtures; both acquisition-order regressions failed before the repair. Impact: Prepare fixed sources and Go/npm caches before execution; retain committed tooling checks and RDM-selected Backend versions. Refs: R7, R8, R11, R14; dependency-workspace U5 --- scripts/build-composition.py | 137 ++++++++++++++++++++--------------- tests/test_composition.py | 47 +++++++++++- 2 files changed, 124 insertions(+), 60 deletions(-) diff --git a/scripts/build-composition.py b/scripts/build-composition.py index 7c2bbb2b..118e418d 100644 --- a/scripts/build-composition.py +++ b/scripts/build-composition.py @@ -87,9 +87,9 @@ def validate_repo(repo): raise CompositionError("file repository must be local") -def tooling_identity(root): +def tooling_identity(root, environment=None): """Bind executed tools before importing acquisition configuration.""" - env = os.environ.copy() + env = (os.environ if environment is None else environment).copy() for key in ("GIT_DIR", "GIT_WORK_TREE", "GIT_INDEX_FILE", "GIT_COMMON_DIR"): env.pop(key, None) commit = run(["git", "rev-parse", "HEAD"], root, env, quiet=True).strip() @@ -317,15 +317,17 @@ def provider_revision(module, downloads): raise CompositionError(f"cannot prove source commit for selected Go module: {module['Path']}@{module['Version']}") -def provider_tests(root, root_commit, components, sources, manifest, temporary, - fetch_env, clean_env, rdm=None, source_map_path=None): - """Preserve the full test gates while taking provider identities from consumers.""" +def prepare_provider_tests(root, root_commit, components, sources, manifest, temporary, + fetch_env, rdm=None, rdm_admin=None, source_map_path=None): + """Acquire every provider and cache before constructing the execution plan.""" graph = manifest["go"]["backend"] source_records = {name: {"path": str(path), "commit": manifest["applications"][name]["commit"], "repo": components[name]["repo"]} for name, path in sources.items()} module_sources = {} manifest["test_sources"] = {} manifest["checks"] = [] + go_checks = [{"component": BACKEND, "path": sources[BACKEND], "mode": "readonly"}] + npm_checks = [{"component": FRONTEND, "path": sources[FRONTEND], "commands": [["npm", "test"]]}] for name, component in components.items(): if component.get("role") != "go-library": continue @@ -357,10 +359,7 @@ def provider_tests(root, root_commit, components, sources, manifest, temporary, raise CompositionError(f"declared provider module is missing: {mapping['path']}") module_sources[mapping["path"]] = {"path": str(location), "commit": module_commit, "repo": component["repo"]} manifest["go"][mapping["path"]] = go_dependencies(location, fetch_env) - for action in ("test", "vet"): - command = ["go", action, "-mod=readonly", "./..."] - run(command, location, clean_env) - manifest["checks"].append({"component": name, "module": mapping["path"], "command": command, "result": "PASS"}) + go_checks.append({"component": name, "module": mapping["path"], "path": location, "mode": "readonly"}) # UI is a package provider; its source identity belongs to the npm lock. ui_component = components.get("Agent-System-UI") if ui_component: @@ -379,21 +378,14 @@ def provider_tests(root, root_commit, components, sources, manifest, temporary, continue manifest.setdefault("provider_npm", {})[name] = npm_dependencies(source, components, fetch_env) scripts = json.loads((source / "package.json").read_text()).get("scripts", {}) - for action in ("typecheck", "test"): - if action in scripts: - command = ["npm", "run", action] - run(command, source, clean_env) - manifest["checks"].append({"component": name, "command": command, "result": "PASS"}) - run(["go", "vet", "-mod=readonly", "./..."], sources[BACKEND], clean_env) - manifest["checks"].extend([ - {"component": FRONTEND, "command": ["npm", "test"], "result": "PASS"}, - {"component": BACKEND, "command": ["go", "test", "-mod=readonly", "./..."], "result": "PASS"}, - {"component": BACKEND, "command": ["go", "vet", "-mod=readonly", "./..."], "result": "PASS"}, - ]) + commands = [["npm", "run", action] for action in ("typecheck", "test") if action in scripts] + npm_checks.append({"component": name, "path": source, "commands": commands}) if rdm: source_records["Agent-System-RDM"] = {"path": str(rdm), **{key: manifest["applications"]["Agent-System-RDM"][key] for key in ("commit", "repo")}} - run(["go", "vet", "-mod=vendor", "./..."], rdm, clean_env) - manifest["checks"].extend({"component": "Agent-System-RDM", "command": ["go", action, "-mod=vendor", "./..."], "result": "PASS"} for action in ("test", "vet")) + go_checks.extend([ + {"component": "Agent-System-RDM", "path": rdm, "mode": "vendor"}, + {"component": "RDM-Backend", "path": rdm_admin, "mode": "readonly", "commit": manifest["go"]["rdm"]["backend_source"]["commit"]}, + ]) formal_root = temporary / "Dev-test-root" archive = run(["git", "archive", "--format=tar", root_commit], root, fetch_env, binary=True, quiet=True) extract_archive(archive, formal_root) @@ -401,9 +393,6 @@ def provider_tests(root, root_commit, components, sources, manifest, temporary, map_file = source_map_path or temporary / "composition-sources.json" map_file.parent.mkdir(parents=True, exist_ok=True) map_file.write_text(json.dumps(source_map, indent=2) + "\n") - gate_env = clean_env | {"COMPOSITION_SOURCE_MAP": str(map_file)} - if rdm: - gate_env["COMPOSITION_RDM_SOURCE"] = str(rdm) gates = ((["bash", "scripts/lint-boundaries.sh"], "scripts/lint-boundaries.sh"), (["bash", "scripts/check-pins.sh"], "scripts/check-pins.sh"), (["make", "test-governance"], "Makefile")) @@ -411,9 +400,33 @@ def provider_tests(root, root_commit, components, sources, manifest, temporary, for command, required_path in gates: if project_gates and not (formal_root / required_path).is_file(): raise CompositionError(f"fixed root is missing required test gate: {required_path}") - if (formal_root / required_path).is_file(): - run(command, formal_root, gate_env) - manifest["checks"].append({"component": "Agent-System-Dev", "commit": root_commit, "command": command, "result": "PASS"}) + return {"go": go_checks, "npm": npm_checks, "root": formal_root, "root_commit": root_commit, + "map_file": map_file, "rdm": rdm, + "gates": [command for command, required_path in gates if (formal_root / required_path).is_file()]} + + +def run_provider_tests(prepared, manifest, clean_env): + """Execute a completed plan; this phase has no acquisition environment.""" + for check in prepared["npm"][:1]: + for command in check["commands"]: + run(command, check["path"], clean_env) + manifest["checks"].append({"component": check["component"], "command": command, "result": "PASS"}) + for check in prepared["go"]: + for action in ("test", "vet"): + command = ["go", action, "-mod=" + check["mode"], "./..."] + run(command, check["path"], clean_env) + identity = {key: check[key] for key in ("component", "module", "commit") if key in check} + manifest["checks"].append({**identity, "command": command, "result": "PASS"}) + for check in prepared["npm"][1:]: + for command in check["commands"]: + run(command, check["path"], clean_env) + manifest["checks"].append({"component": check["component"], "command": command, "result": "PASS"}) + gate_env = clean_env | {"COMPOSITION_SOURCE_MAP": str(prepared["map_file"])} + if prepared["rdm"]: + gate_env["COMPOSITION_RDM_SOURCE"] = str(prepared["rdm"]) + for command in prepared["gates"]: + run(command, prepared["root"], gate_env) + manifest["checks"].append({"component": "Agent-System-Dev", "commit": prepared["root_commit"], "command": command, "result": "PASS"}) def compose(root, target, output, rdm_source=None, source_map_path=None): @@ -442,27 +455,17 @@ def compose(root, target, output, rdm_source=None, source_map_path=None): sources[name] = source frontend = sources[FRONTEND] manifest["npm"] = npm_dependencies(frontend, components, fetch_env) - dist, manifest["frontend"] = frontend_assets(frontend, clean_env) - manifest["toolchains"] = {"go": run(["go", "version"], temporary, clean_env, quiet=True).strip(), - "node": run(["node", "--version"], temporary, clean_env, quiet=True).strip(), - "npm": run(["npm", "--version"], temporary, clean_env, quiet=True).strip()} products = temporary / "products" products.mkdir() rdm = None + admin_source = None + vendored_backend = None + test_plan = None manifest["version"] = version(manifest, lock) if target != "frontend": backend = sources[BACKEND] manifest["go"]["backend"] = go_dependencies(backend, fetch_env) manifest["version"] = version(manifest, lock) - inject(dist, backend / "web/dist") - manifest["go"]["backend"]["embed_sha256"] = tree_digest(backend / "web/dist")["sha256"] - if target == "test": - run(["npm", "test"], frontend, clean_env) - run(["go", "test", "-mod=readonly", "./..."], backend, clean_env) - else: - for name, package in (("agent-system", "./cmd/agent-system"), ("storage-migrate", "./cmd/storage-migrate")): - flags = "-s -w" + (" -X main.version=" + manifest["version"] if name == "agent-system" else "") - run(["go", "build", "-mod=readonly", "-trimpath", "-buildvcs=false", "-ldflags=" + flags, "-o", str(products / name), package], backend, clean_env) if rdm_source: rdm_commit = run(["git", "rev-parse", "HEAD"], rdm_source, fetch_env, quiet=True).strip() rdm = temporary / "Agent-System-RDM" @@ -484,39 +487,55 @@ def compose(root, target, output, rdm_source=None, source_map_path=None): temporary, fetch_env, abbreviated=abbreviated) graph["backend_source"] = {**backend_record, "module": backend_module, "version": effective["Version"]} manifest["go"]["rdm_admin"] = go_dependencies(admin_source, fetch_env) - inject(dist, admin_source / "web/dist") - manifest["go"]["rdm_admin"]["embed_sha256"] = tree_digest(admin_source / "web/dist")["sha256"] - graph["admin_version"] = version(manifest, lock, backend_commit=backend_record["commit"], - resolved_go={"rdm": graph["modules"], "admin": manifest["go"]["rdm_admin"]}) run(["go", "mod", "vendor"], rdm, fetch_env) vendored_backend = rdm / "vendor" / backend_module if not (vendored_backend / "web/embed.go").is_file(): raise CompositionError("RDM vendored Backend does not contain the embed package") graph["vendor_modules_sha256"] = digest(rdm / "vendor/modules.txt") graph["vendor_backend_source_sha256"] = tree_digest(vendored_backend)["sha256"] - inject(dist, vendored_backend / "web/dist") - graph["vendor_backend_dist_sha256"] = tree_digest(vendored_backend / "web/dist")["sha256"] - if target == "test": - run(["go", "test", "-mod=vendor", "./..."], rdm, clean_env) - run(["go", "test", "-mod=readonly", "./..."], admin_source, clean_env) - run(["go", "vet", "-mod=readonly", "./..."], admin_source, clean_env) - else: - run(["go", "build", "-mod=vendor", "-trimpath", "-buildvcs=false", "-ldflags=-s -w", "-o", str(products / "agent-system-rdm-product"), "."], rdm, clean_env) - run(["go", "build", "-mod=readonly", "-trimpath", "-buildvcs=false", - "-ldflags=-s -w -X main.version=" + graph["admin_version"], - "-o", str(products / "agent-system-admin"), "./cmd/agent-system"], admin_source, clean_env) if target == "test": - provider_tests(root, root_commit, components, sources, manifest, temporary, - fetch_env, clean_env, rdm, source_map_path) + test_plan = prepare_provider_tests(root, root_commit, components, sources, manifest, temporary, + fetch_env, rdm, admin_source, source_map_path) if target == "build" and run(["git", "ls-tree", root_commit, "--", "plugins"], root, fetch_env, quiet=True).strip(): archive = run(["git", "archive", "--format=tar", root_commit, "plugins"], root, fetch_env, binary=True, quiet=True) root_assets = temporary / "root-assets" extract_archive(archive, root_assets) manifest["assets"]["plugins"] = tree_digest(root_assets / "plugins") manifest["assets"]["plugins"]["root_commit"] = root_commit + + # All fixed sources, package caches, vendor files and root assets are + # acquired above. Candidate commands below receive only clean_env; + # there is no acquisition environment in the execution plan. + del fetch_env + dist, manifest["frontend"] = frontend_assets(frontend, clean_env) + manifest["toolchains"] = {"go": run(["go", "version"], temporary, clean_env, quiet=True).strip(), + "node": run(["node", "--version"], temporary, clean_env, quiet=True).strip(), + "npm": run(["npm", "--version"], temporary, clean_env, quiet=True).strip()} + if target != "frontend": + inject(dist, backend / "web/dist") + manifest["go"]["backend"]["embed_sha256"] = tree_digest(backend / "web/dist")["sha256"] + if rdm: + graph = manifest["go"]["rdm"] + inject(dist, admin_source / "web/dist") + manifest["go"]["rdm_admin"]["embed_sha256"] = tree_digest(admin_source / "web/dist")["sha256"] + graph["admin_version"] = version(manifest, lock, backend_commit=graph["backend_source"]["commit"], + resolved_go={"rdm": graph["modules"], "admin": manifest["go"]["rdm_admin"]}) + inject(dist, vendored_backend / "web/dist") + graph["vendor_backend_dist_sha256"] = tree_digest(vendored_backend / "web/dist")["sha256"] + if target == "test": + run_provider_tests(test_plan, manifest, clean_env) + else: + for name, package in (("agent-system", "./cmd/agent-system"), ("storage-migrate", "./cmd/storage-migrate")): + flags = "-s -w" + (" -X main.version=" + manifest["version"] if name == "agent-system" else "") + run(["go", "build", "-mod=readonly", "-trimpath", "-buildvcs=false", "-ldflags=" + flags, "-o", str(products / name), package], backend, clean_env) + if rdm: + run(["go", "build", "-mod=vendor", "-trimpath", "-buildvcs=false", "-ldflags=-s -w", "-o", str(products / "agent-system-rdm-product"), "."], rdm, clean_env) + run(["go", "build", "-mod=readonly", "-trimpath", "-buildvcs=false", + "-ldflags=-s -w -X main.version=" + graph["admin_version"], + "-o", str(products / "agent-system-admin"), "./cmd/agent-system"], admin_source, clean_env) for artifact in products.iterdir(): manifest["artifacts"][artifact.name] = {"sha256": digest(artifact), "size": artifact.stat().st_size} - if tooling_identity(root) != tooling: + if tooling_identity(root, clean_env) != tooling: raise CompositionError("executing tooling changed during composition") # Publish only after all required build/test commands succeeded. output.mkdir(parents=True, exist_ok=True) diff --git a/tests/test_composition.py b/tests/test_composition.py index 96fdfb62..c34b355b 100644 --- a/tests/test_composition.py +++ b/tests/test_composition.py @@ -105,6 +105,47 @@ if (fs.readFileSync('dist/index.html', 'utf8') !== 'immutable-page') process.exi def compose(self, target="build", extra=(), env=None): return self.run_command([sys.executable, "-B", str(SCRIPT), "--root", str(self.root), "--target", target, "--output", str(self.out), *extra], env=env, check=False) + def acquisition_guard(self, env, *, mark_frontend=True): + """Forward to real tools, refusing acquisition after candidate execution.""" + marker = self.base / "candidate-executed" + tools = self.base / "guarded-tools" + tools.mkdir() + for name in ("git", "go", "npm"): + executable = shutil.which(name) + wrapper = tools / name + wrapper.write_text("#!" + sys.executable + "\n" + '''import os, pathlib, sys +args = sys.argv[1:] +name = pathlib.Path(sys.argv[0]).name +acquisition = (name == 'git' and args and args[0] in {'clone', 'fetch', 'archive'} + or name == 'go' and args and (args[0] == 'mod' or args[0] == 'list') + or name == 'npm' and args and args[0] in {'ci', 'install'}) +if acquisition and pathlib.Path(os.environ['COMPOSITION_EXEC_MARKER']).exists(): + print('acquisition-after-execution: ' + name + ' ' + ' '.join(args[:2]), file=sys.stderr) + sys.exit(86) +''' + "os.execv(" + repr(executable) + ", [" + repr(executable) + ", *args])\n") + wrapper.chmod(0o755) + if mark_frontend: + self.write(self.frontend, "build.cjs", (self.frontend / "build.cjs").read_text() + + "\nrequire('node:fs').writeFileSync(process.env.COMPOSITION_EXEC_MARKER, 'frontend-executed')\n") + self.lock["components"]["Agent-System-Frontend"]["commit"] = self.commit(self.frontend) + self.save_inputs() + self.commit(self.root) + return env | {"PATH": str(tools) + os.pathsep + env["PATH"], + "COMPOSITION_EXEC_MARKER": str(marker), "GITEA_TOKEN": "synthetic-phase-token"} + + def test_all_product_acquisition_precedes_candidate_execution(self): + self.test_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache() + self.write(self.root, "plugins/example/plugin.json", '{"name":"fixed-plugin"}') + self.commit(self.root) + env = self.acquisition_guard(self.env | {"GOPROXY": (self.base / "proxy").as_uri(), + "GOMODCACHE": str(self.base / "module-cache")}) + result = self.compose(extra=("--rdm-source", str(self.base / "rdm")), env=env) + self.assertEqual(result.returncode, 0, result.stdout) + self.assertEqual((self.base / "candidate-executed").read_text(), "frontend-executed") + self.assertEqual(self.run_command([str(self.out / "agent-system-rdm-product")]).stdout, "immutable-page") + self.assertEqual(self.run_command([str(self.out / "agent-system-admin")]).stdout, "immutable-page") + self.assertEqual((self.out / "plugins/example/plugin.json").read_text(), '{"name":"fixed-plugin"}') + def test_fixed_commits_embed_assets_without_touching_developer_checkout(self): # Reading working trees or allowing go.work/npm overlays would produce DIRTY or fail. self.write(self.backend, "web/dist/index.html", "DIRTY") @@ -181,7 +222,10 @@ if (fs.readFileSync('dist/index.html', 'utf8') !== 'immutable-page') process.exi self.write(library, "probe.go", "package probe\nfunc Text() string { return \"\" }\n") self.write(library, "probe_test.go", '''package probe import ("testing"; "os") -func TestFixedLibrary(t *testing.T) { if err:=os.WriteFile(os.Getenv("COMPOSITION_GO_MARKER"), []byte("fixed-go-test"), 0600); err!=nil {t.Fatal(err)} } +func TestFixedLibrary(t *testing.T) { + if err:=os.WriteFile(os.Getenv("COMPOSITION_GO_MARKER"), []byte("fixed-go-test"), 0600); err!=nil {t.Fatal(err)} + if path:=os.Getenv("COMPOSITION_EXEC_MARKER"); path!="" { if err:=os.WriteFile(path, []byte("library-executed"), 0600); err!=nil {t.Fatal(err)} } +} ''') library_sha = self.commit(library) version = "v0.0.0-" + self.run_command(["git", "show", "-s", "--format=%cd", "--date=format-local:%Y%m%d%H%M%S", library_sha], library).stdout.strip() + "-" + library_sha[:12] @@ -221,6 +265,7 @@ func TestFixedLibrary(t *testing.T) { if err:=os.WriteFile(os.Getenv("COMPOSITIO ]) self.save_inputs() self.commit(self.root) + env = self.acquisition_guard(env, mark_frontend=False) result = self.compose("test", env=env) self.assertEqual(result.returncode, 0, result.stdout) self.assertTrue((self.base / "go-tested").is_file(), "resolved Go provider tests were not executed") -- 2.54.0 From d11eae589963b4690f753f9416bd1f5a88378884 Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 13 Oct 2026 18:45:18 +0000 Subject: [PATCH 16/29] Record implementation scope and fixed-candidate evidence handoff Why: Keep implementation, independent review, formal acceptance and main integration distinct. Evidence: Reference immutable early-review scope and actual SELF receipts without upgrading their provenance. Impact: Prepare a source-external final evidence entry while preserving current branches and pending acceptance gates. Refs: R1-R15; dependency-workspace U1-U8; policy/delivery.md --- .task/feature-dependency-workspace.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md index 53814665..ad0a0816 100644 --- a/.task/feature-dependency-workspace.md +++ b/.task/feature-dependency-workspace.md @@ -11,7 +11,7 @@ - 交付模式:authorized-continuous(实施计划细化、U1–U7 重构与自检;正式验收与高后果边界保留) - 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入) - 自动推进授权:用户本次回答「批准,可以进行重构」;授权范围:上轮提出的计划细化、实施与自检连续推进;授权来源:2026-10-13 当前会话;授权终点:可审实现与自检;停止条件:真实传输试点失败、无法保护现场、超出方案/共享部署/发布范围。 -- 当前阶段:实施计划细化及实施与自检;当前增量:U1 起,R15 在途/后续分支平稳过渡纳入验收。 +- 当前阶段:实施与自检候选收尾;U1–U7 的实现已具备,R15 在途/后续分支保护纳入真实回归;正式测试与验收仍未评审。 - 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位) ## 目标与非目标 @@ -73,20 +73,20 @@ ## 结果与验证(完成后填写) - 结果:已实现版本依赖、按需普通 Git 工作区、显式过渡和固定构建的候选;移除已替代 gitlinks 时保留物理目录与 Git 管理数据。源码归属保持独立。 -- 验证:SELF 远端消费、Native 编辑/解除、Go/npm 独立验证及真实仓治理回归收据如下。最终固定组合/new clone/RDM 烟测正在收尾;独立重放、正式验收和平台 CI 尚未放行。 +- 验证:SELF 远端消费、Native 编辑/解除、Go/npm 独立验证及真实仓治理回归收据如下。固定 0d9f44 的完整组合自检通过;98d 普通 clone/Native 联调/构建、真实历史 ee9 候选的 103 gitlinks 隔离物化和旧构建、RDM 固定产品及临时数据库烟测均已实际执行。d76ec5d 补强组合器全部获取先于候选执行,23 个真实夹具通过;冻结后继续精确对象的组合/构建重放。早期独立 Review 的三项 P1 已按固定补充提交闭合;这些结论不代替最终候选 Review、正式验收或平台 CI。 - 影响与剩余项:完成精确候选组合检查、在途保留和新 clone 重放,再提交可审实现;本次不操作共享服务、数据、发布或他人工作区。 ## 规划进展与下一步 - 当前增量:U1–U7,实际产出与失败/通过证据由下方原始收据记录;不将分工报告等同能力证明。 -- 下一步:冻结组件与 Dev 候选,完成固定组合、RDM 真实产物和普通 clone 检查。正式测试验收、Review/GATE CI/合入仍分别记录。 +- 下一步:冻结当前 Dev/组件候选并完成精确对象重放,产出供人工评审的实施与自检交接。之后推荐在本任务推进阶段 7 正式验收,再按当前 HEAD 的独立 Review/GATE CI 和 PR 合入流程执行 U7/U8;不重复启动同范围任务。前置条件为人工确认当前增量、固定组合可获取且在途现场保存;验收条件为 R1–R15 映射与缺项如实记录,平台准入有效。本建议不扩大本次授权。 - 通用规则候选:Development-Guidelines draft.12,固定内容来源由 components.lock.json 定义,其他项目须独立采纳。 - 在途保护:仅本任务工作区与独立 .migration 克隆可写;原共享检出、其他任务及外部 worktree 保持原现场。 ## 合入与清理 -- Review 记录:NOT_RUN(审阅智能体/平台身份、base/head、结论、问题闭合及重放依据) -- 冲突记录:NOT_RUN(最新目标同步、冲突处置、组合兼容核验及复审/补测) +- Review 记录:提前 ce-code-review 已完成,固定 base=57bcb17、head=98d08347;报告 /tmp/compound-engineering-1000/ce-code-review/20261013-175258-5eab89ea。三项 P1 的独立补充闭合对象为 88b918/0d9f44/f2b7a9。新组合器的有界补充复审进行中;不声明整个最终 HEAD 已通过,外部 provider/Guidelines 和平台 CI 不在该提前审阅范围。跨模型 peer 超时且无可用产物,独立覆盖降级。 +- 冲突记录:98d08347 纳入当前 main=57bcb17 的任务恢复/合入调度/IAM 文档等在途成果;未撤销上游变更,既有独立工作区保持现场。最终固定前继续以 evidence 记录 task-sync。 - CI 记录:NOT_RUN(当前 HEAD 完整 SHA、全部必需检查、运行链接、执行身份及 GATE 结果) - 合入记录:NOT_RUN(交付授权范围、PR、被核验 HEAD、合入 SHA、目标分支及内容核验) - 清理记录:NOT_RUN(授权依据、写者退出确认、worktree/分支/任务卡处置) @@ -95,6 +95,10 @@ ce-simplify-code 的 reuse/quality/efficiency 三个独立只读扫描完成。删除未用内部参数与两处未用 import;digest 复用导致独立工具 fixture 缺少 workspace 包,实际失败后已撤回该整理;不合并有不同信任边界的 CI 校验,不改变 JSON 异常优先级,不引入未经测量的 clone/cache 行为。失败与修复后的实际组合器 fixture 重放由 evidence 记录。此记录不代替正式代码 Review、独立重放或平台准入。 +## 固定候选后的证据入口 + +依照 policy/governance.md「候选固定前后」,最终重放使用 /tmp 的唯一源码外收据;不为记录输出反复推进候选 HEAD。最终结果、完整候选 SHA、组件列表、R1–R15 映射和未验证项保存在 `/tmp/dependency-workspace-handoff-20261013-01a1345f.md`,正式验收时核对实际文件及其原始收据。下方既有 JSON 是已记录的历史 SELF,不冒充新对象的通过结果。当前不运行 task-finish,不删除旧目录、Git 管理数据、其他分支或任何共享服务数据。 + ```json { -- 2.54.0 From 0676f30c7bd0eaffa6db4ba6b14beef2978e2e02 Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 13 Oct 2026 18:45:36 +0000 Subject: [PATCH 17/29] Record the sync checkpoint Why: bind the task validation checkpoint to the integration baseline. Evidence: SELF component ownership and fixed-source checks; sync_base=add097d06137c4912a4ed9279e98ca353e4e4cf1; before_record=87c2b9861cdca6f7785d8e1d4e6f7e37a0f1c9fe. Impact: task metadata only. Refs: .task/feature-dependency-workspace.md --- .task/feature-dependency-workspace.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md index ad0a0816..d8bb34bf 100644 --- a/.task/feature-dependency-workspace.md +++ b/.task/feature-dependency-workspace.md @@ -11607,3 +11607,4 @@ ce-simplify-code 的 reuse/quality/efficiency 三个独立只读扫描完成。 "receipt_sha256": "6ac47142d9a15eb30f87ecac499a27fc6c75f216bcfd9b7acc5f46c9ffd53628" } ``` +| 同步(记录前对象) | add097d06137c4912a4ed9279e98ca353e4e4cf1 | 87c2b9861cdca6f7785d8e1d4e6f7e37a0f1c9fe | 2026-10-13T18:45:36Z | -- 2.54.0 From 222687f14970ba176c1b4cdea035a4b923122f38 Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 14 Oct 2026 01:08:02 +0000 Subject: [PATCH 18/29] Record approval and resume formal dependency validation Why: The user approved the fixed implementation and self-check handoff. Evidence: Import the complete startup receipt through task-resume; preserve the fixed 0676 candidate's original receipts and independent review scope. Impact: Advance stage 6 to approved and prepare stage 7 verification without claiming formal acceptance, trusted CI, integration or deployment. Refs: R1-R15; dependency-workspace U1-U8; policy/delivery.md --- .task/feature-dependency-workspace.md | 168 +++++++++++++++++++++++++- 1 file changed, 166 insertions(+), 2 deletions(-) diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md index d8bb34bf..16194c01 100644 --- a/.task/feature-dependency-workspace.md +++ b/.task/feature-dependency-workspace.md @@ -11,7 +11,7 @@ - 交付模式:authorized-continuous(实施计划细化、U1–U7 重构与自检;正式验收与高后果边界保留) - 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入) - 自动推进授权:用户本次回答「批准,可以进行重构」;授权范围:上轮提出的计划细化、实施与自检连续推进;授权来源:2026-10-13 当前会话;授权终点:可审实现与自检;停止条件:真实传输试点失败、无法保护现场、超出方案/共享部署/发布范围。 -- 当前阶段:实施与自检候选收尾;U1–U7 的实现已具备,R15 在途/后续分支保护纳入真实回归;正式测试与验收仍未评审。 +- 当前阶段:实施与自检产物已获用户批准,进入阶段 7 正式验证准备;U1–U7 的实现已具备,R15 在途/后续分支保护纳入真实回归;正式验收结论仍待当前候选结果评审。 - 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位) ## 目标与非目标 @@ -46,7 +46,7 @@ | 需求表确认 | r1(4a7b929)+ R15 | 已批准推进 | 用户 weichen | 2026-10-13 | 本会话「批准,可以进行重构」,并要求在途/后续分支平稳过渡 | | 方案设计 | r1(4a7b929)+ R15 | 已批准推进 | 用户 weichen | 2026-10-13 | 本会话「批准,可以进行重构」,并要求在途/后续分支平稳过渡 | | 实施计划 | U1–U8(30bc86a) | 已授权连续细化/实施 | 用户 weichen | 2026-10-13 | 本会话批准上轮具体方案与实施顺序,覆盖重构、自检 | -| 实施与自检 | 当前任务候选 | 进行中 | Codex;人工正式验收待定 | 2026-10-13 | 原始 SELF 命令收据如下;不等于正式通过 | +| 实施与自检 | 0676f30c7bd0eaffa6db4ba6b14beef2978e2e02 及完整交接 | 通过 | 用户 weichen | 2026-10-14(Asia/Shanghai) | 本会话在实施与自检交接后回复「批准」;批准不代替阶段 7 当前对象正式验收与 GATE CI | | 正式测试与验收 | 待定 | 未评审 | — | — | — | | 代码 Review | 待定 | 未评审 | — | — | — | | 合入 | 待定 | 未评审 | — | — | — | @@ -11608,3 +11608,167 @@ ce-simplify-code 的 reuse/quality/efficiency 三个独立只读扫描完成。 } ``` | 同步(记录前对象) | add097d06137c4912a4ed9279e98ca353e4e4cf1 | 87c2b9861cdca6f7785d8e1d4e6f7e37a0f1c9fe | 2026-10-13T18:45:36Z | + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-14T01:05:01.446125+00:00", + "command": "make precheck", + "command_sha256": "8fd03cdee8adbb8562846a1a114cc0623779a8654412cd20aac9b495e7eb0450", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "0676f30c7bd0eaffa6db4ba6b14beef2978e2e02", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "add097d06137c4912a4ed9279e98ca353e4e4cf1", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "6ed7b9322c5733f76b206a35cd78649ba385d83b", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "fffd5790cfab317fadafb40fa55a11bab6e9a847", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "1a842553b6a7432e5a85aaae43a45a7a7ea58195", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "4a26798000c39cc59ba0c2cc6328f5c8f10dcb32", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "5492ea46784fcb12d1b93d2cf940bc9bcb20ffc414faab2c7a456460ad21f6f7", + "state_sha256": "198817d990551226344f2e531f14c5e1924b6dcba2425ff3feb60233625c8bd4" + } + }, + "after": { + "head": "0676f30c7bd0eaffa6db4ba6b14beef2978e2e02", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "add097d06137c4912a4ed9279e98ca353e4e4cf1", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "6ed7b9322c5733f76b206a35cd78649ba385d83b", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "fffd5790cfab317fadafb40fa55a11bab6e9a847", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "1a842553b6a7432e5a85aaae43a45a7a7ea58195", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "4a26798000c39cc59ba0c2cc6328f5c8f10dcb32", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "5492ea46784fcb12d1b93d2cf940bc9bcb20ffc414faab2c7a456460ad21f6f7", + "state_sha256": "198817d990551226344f2e531f14c5e1924b6dcba2425ff3feb60233625c8bd4" + } + }, + "after_error": null, + "exit_code": 0, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n[repo] branch=feature/dependency-workspace head=0676f30c7b\n[remote] origin/main=add097d061 ahead=20 behind=0\n[tree] clean submodules_drift=0 uninit=0\n[worktrees] linked=17\n[recycle] merged un-recycled branches: feature/card-close-20261012-054727Z feature/card-close-20261012-055452Z feature/card-close-20261012-062835Z feature/card-close-20261012-065217Z feature/card-close-20261012-095620Z feature/card-close-20261012-130704Z feature/card-close-20261012-133217Z feature/card-close-20261012-140049Z feature/card-close-20261012-150228Z feature/card-close-20261012-164920Z feature/card-close-20261012-static-pidcheck feature/card-close-20261013-021816Z feature/card-close-20261013-052211Z feature/card-close-20261013-065538Z feature/card-close-20261013-152849Z feature/card-close-20261013-153026Z feature/card-close-svc-d3-real-scenarios feature/card-close-u7-release-roadmap feature/card-close-u7-release-roadmap-record feature/d1-closeout-evidence feature/iam-i1-permission-boundaries feature/project-member-access feature/rdm-increment-acceptance-note feature/rdm-increment-release-plan feature/svc-d1-identity-flow feature/svc-d3-real-scenarios feature/svc-db-config-recover feature/svc-login-recovery-followup feature/sync-dhf-templates fix/genui-children-repair\n[cards] 闭合分支超过 24 小时未合入:feature/card-close-20261012-123313Z\n[hooks] core.hooksPath=scripts/hooks(pre-commit/post-merge 实际接线)\n[facts] WARN 过期事实:F6(日期格式)——引用前先 make facts-verify 重验并更新登记表\n[required-reading] core/baseline.md, workflows/delivery.md §1, policy/delivery.md\n[R0] add097d061(完整:add097d06137c4912a4ed9279e98ca353e4e4cf1)\n[worktree] before-sync: recursive component checks passed\n[rules] path=/home/weichen/.cache/agent-system/rules/c56b0cd9c8ed88482c9c31e57cd1687ea221738b355e672bcd4982d32558ff58 commit=1a842553b6a7432e5a85aaae43a45a7a7ea58195; required-reading root verified\n[verdict] READY — 保留本次 precheck receipt 后建任务工作区:PRECHECK_RECEIPT=/tmp/task-precheck.json make task-start NAME=feature/your-branch\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n", + "output_sha256": "c7a6bf82d686115383e37a256f3bd5f8ce5019d63289f9896b909a8de36a828d", + "receipt_sha256": "c24e4d9fe2938806963fd58bf3261dd0e4fcb6bd59a94db61feac60695a286c9" +} +``` -- 2.54.0 From 01b7799663ec9734c71ca4645a109fd5da54745f Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 14 Oct 2026 01:44:49 +0000 Subject: [PATCH 19/29] Keep offline package verification reproducible with cold caches (U5) Why: An immutable npm lock caches tarballs but packed consumers also require resolver metadata before candidate execution. Evidence: SELF host replay passed 57 composition and CI credential cases; real npm 10 and 11 cold-cache consumers passed without lock changes. Impact: Acquire only installed exact-version npmjs metadata with clean config, preserve cache paths for offline execution, adopt the repaired Frontend source and record immutable CI fixtures. Refs: R6-R8, R14; dependency-workspace U4/U5; UI 63d289e and Frontend 5467517 --- .gitea/workflows/ci.yaml | 44 ++++- components.lock.json | 2 +- scripts/build-composition.py | 45 ++++++ .../component-ci/Agent-System-Frontend/ci.yml | 44 ++++- .../component-ci/Agent-System-UI/ci.yml | 44 ++++- tests/fixtures/component-ci/provenance.json | 8 +- tests/test_composition.py | 153 +++++++++++++++++- tests/test_dependency_ci.py | 42 +++++ 8 files changed, 364 insertions(+), 18 deletions(-) diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 30753c30..33abf249 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -647,6 +647,24 @@ jobs: raise ValueError("npm Git source is outside the reviewed fixed-SHA package mapping") return None + def registry_package(location, entry): + resolved = entry.get("resolved", "") + if not isinstance(resolved, str) or not resolved.startswith(("https://", "http://")): + return None + # A metadata spec is name@exact-version, never a candidate URL. + source = urlsplit(resolved) + if (source.scheme != "https" or source.netloc != "registry.npmjs.org" or + source.username or source.password or source.query or source.fragment): + raise ValueError("npm tarball source is outside the reviewed public registry") + relative = Path(location) + name = entry.get("name") or location.rsplit("node_modules/", 1)[-1] + version = entry.get("version", "") + if (not location.startswith("node_modules/") or relative.is_absolute() or ".." in relative.parts or + not isinstance(name, str) or not re.fullmatch(r"(?:@[a-z0-9][a-z0-9._~-]*/)?[a-z0-9][a-z0-9._~-]*", name) or + not isinstance(version, str) or not re.fullmatch(r"[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?", version)): + raise ValueError("Invalid locked registry package name or version") + return name + "@" + version + try: targets = [] selected = set() @@ -656,7 +674,8 @@ jobs: if (directory / ".npmrc").exists(): raise ValueError("Candidate .npmrc is not allowed during private dependency acquisition") package = json.loads((directory / "package.json").read_text()) - lock = json.loads((directory / "package-lock.json").read_text()) + lock_bytes = (directory / "package-lock.json").read_bytes() + lock = json.loads(lock_bytes) if lock.get("lockfileVersion") not in {2, 3}: raise ValueError("npm acquisition requires a package lock") for group in ("dependencies", "devDependencies", "optionalDependencies"): @@ -664,7 +683,11 @@ jobs: found = git_package(value) if found: selected.add(found) - for entry in lock.get("packages", {}).values(): + registry_packages = [] + for location, entry in lock.get("packages", {}).items(): + spec = registry_package(location, entry) + if spec: + registry_packages.append((location, spec)) found = git_package(entry.get("resolved")) if found: selected.add(found) @@ -673,7 +696,7 @@ jobs: found = git_package(value) if found: selected.add(found) - targets.append(directory) + targets.append((directory, registry_packages, lock_bytes)) # Fetch only registered fixed Git package commits. npm never receives token config. for repo, sha in sorted(selected): repository = mirror(repo, sha, component_token) @@ -685,12 +708,25 @@ jobs: raise ValueError("Git package provider is missing committed package outputs") no_auth = mirror_env() empty_config = tempfile.NamedTemporaryFile(prefix="ci-npm-globalrc-") - for directory in targets: + for directory, registry_packages, lock_bytes in targets: result = subprocess.run(["npm", "ci", "--ignore-scripts", "--no-audit", "--no-fund", "--userconfig=/dev/null", "--globalconfig=" + empty_config.name], cwd=directory, env=no_auth, capture_output=True, text=True) if result.returncode: raise ValueError("npm dependency acquisition failed: " + result.stderr.strip()) + # npm ci caches tarballs; packed consumers also need resolver + # metadata. Only installed locked registry entries are fetched. + specs = sorted({spec for location, spec in registry_packages if (directory / location).is_dir()}) + if specs: + with tempfile.TemporaryDirectory(prefix="ci-npm-metadata-") as metadata_root: + result = subprocess.run(["npm", "cache", "add", *specs, "--ignore-scripts", + "--registry=https://registry.npmjs.org", "--userconfig=/dev/null", + "--globalconfig=" + empty_config.name], cwd=metadata_root, + env=no_auth, capture_output=True, text=True) + if result.returncode: + raise ValueError("npm metadata acquisition failed: " + result.stderr.strip()) + if (directory / "package-lock.json").read_bytes() != lock_bytes: + raise ValueError("npm acquisition changed the committed package lock") except (ValueError, OSError, subprocess.CalledProcessError) as error: sys.exit("npm prefetch refused: " + str(error)) print("npm packages cached without credentials or lifecycle execution") diff --git a/components.lock.json b/components.lock.json index 1f570e45..e2d02dd5 100644 --- a/components.lock.json +++ b/components.lock.json @@ -2,7 +2,7 @@ "schema": 1, "components": { "Agent-System-Frontend": { - "commit": "6ed7b9322c5733f76b206a35cd78649ba385d83b" + "commit": "5467517e1831e7ca8b58bb5df52494a3a2c9d468" }, "Agent-System-Backend": { "commit": "fffd5790cfab317fadafb40fa55a11bab6e9a847" diff --git a/scripts/build-composition.py b/scripts/build-composition.py index 118e418d..21e06406 100644 --- a/scripts/build-composition.py +++ b/scripts/build-composition.py @@ -25,6 +25,8 @@ SHA = re.compile(r"[0-9a-f]{40}\Z") IDS = re.compile(r"[A-Za-z0-9][A-Za-z0-9_-]*\Z") BACKEND = "Agent-System-Backend" FRONTEND = "Agent-System-Frontend" +NPM_NAME = re.compile(r"(?:@[a-z0-9][a-z0-9._~-]*/)?[a-z0-9][a-z0-9._~-]*\Z") +NPM_VERSION = re.compile(r"[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?\Z") class CompositionError(Exception): @@ -165,6 +167,11 @@ def execution_environment(env): or upper in {"SSH_AUTH_SOCK", "SSH_AGENT_PID", "NODE_OPTIONS", "BASH_ENV", "ENV", "GOFLAGS", "GIT_ASKPASS", "SSH_ASKPASS", "CONTRACTS_TARBALL", "UI_TARBALL"}): del clean[key] clean.update(GOWORK="off", GOTOOLCHAIN="local", GOFLAGS="", CGO_ENABLED="0") + # Cache location is transport-independent state, shared by acquisition and + # offline consumers. Other npm settings can carry credentials or hooks. + for key in ("npm_config_cache", "NPM_CONFIG_CACHE"): + if env.get(key): + clean[key] = env[key] return clean @@ -251,6 +258,24 @@ def go_dependencies(source, fetch_env): "downloads": [{key: value[key] for key in ("Path", "Version", "Sum", "GoModSum", "Origin") if key in value} for value in downloads]} +def npm_registry_package(location, package): + resolved = package.get("resolved", "") + if not isinstance(resolved, str): + raise CompositionError("invalid npm lock dependency") + if not resolved.startswith(("https://", "http://")): + return None + registry = urlsplit(resolved) + if (registry.scheme != "https" or registry.netloc != "registry.npmjs.org" or + registry.username or registry.password or registry.query or registry.fragment): + raise CompositionError("npm tarball source is outside the reviewed public registry") + name = package.get("name") or location.rsplit("node_modules/", 1)[-1] + version = package.get("version", "") + if (not isinstance(name, str) or not NPM_NAME.fullmatch(name) or + not isinstance(version, str) or not NPM_VERSION.fullmatch(version)): + raise CompositionError("invalid locked registry package name or version") + return name + "@" + version + + def npm_dependencies(source, components, fetch_env): path = source / "package-lock.json" lock = json.loads(path.read_text()) @@ -258,7 +283,13 @@ def npm_dependencies(source, components, fetch_env): raise CompositionError("frontend requires a complete npm lock") approved = {component["repo"] for component in components.values()} packages = {} + registry_packages = [] for name, package in lock["packages"].items(): + if name: + safe_relative(source, name) + registry_package = npm_registry_package(name, package) + if registry_package: + registry_packages.append((name, registry_package)) if package.get("link"): raise CompositionError("formal npm build forbids workspace links") for value in [package.get("resolved", ""), *package.get("dependencies", {}).values()]: @@ -273,6 +304,20 @@ def npm_dependencies(source, components, fetch_env): packages[name] = {key: package[key] for key in ("version", "resolved", "integrity") if key in package} before = digest(path) run(["npm", "ci", "--ignore-scripts", "--no-audit", "--no-fund"], source, fetch_env) + # npm ci normally stores tarballs without the packuments required when a + # disposable packed-package consumer re-resolves peers offline. Fetch the + # installed locked versions before candidate execution, from a fixed public + # registry with empty config and no acquisition credentials or candidate rc. + metadata_env = execution_environment(fetch_env) + with tempfile.TemporaryDirectory(prefix="composition-npm-metadata-") as directory: + isolated = Path(directory) + global_config = isolated / "empty-global.npmrc" + global_config.write_text("") + selected = {spec for location, spec in registry_packages if (source / location).is_dir()} + if selected: + run(["npm", "cache", "add", *sorted(selected), "--ignore-scripts", + "--registry=https://registry.npmjs.org", "--userconfig=/dev/null", + "--globalconfig=" + str(global_config)], isolated, metadata_env) if digest(path) != before: raise CompositionError("npm acquisition changed committed lock") result = {"lock_sha256": before, "packages": packages} diff --git a/tests/fixtures/component-ci/Agent-System-Frontend/ci.yml b/tests/fixtures/component-ci/Agent-System-Frontend/ci.yml index df9df1cb..428fd37a 100644 --- a/tests/fixtures/component-ci/Agent-System-Frontend/ci.yml +++ b/tests/fixtures/component-ci/Agent-System-Frontend/ci.yml @@ -408,6 +408,24 @@ jobs: raise ValueError("npm Git source is outside the reviewed fixed-SHA package mapping") return None + def registry_package(location, entry): + resolved = entry.get("resolved", "") + if not isinstance(resolved, str) or not resolved.startswith(("https://", "http://")): + return None + # A metadata spec is name@exact-version, never a candidate URL. + source = urlsplit(resolved) + if (source.scheme != "https" or source.netloc != "registry.npmjs.org" or + source.username or source.password or source.query or source.fragment): + raise ValueError("npm tarball source is outside the reviewed public registry") + relative = Path(location) + name = entry.get("name") or location.rsplit("node_modules/", 1)[-1] + version = entry.get("version", "") + if (not location.startswith("node_modules/") or relative.is_absolute() or ".." in relative.parts or + not isinstance(name, str) or not re.fullmatch(r"(?:@[a-z0-9][a-z0-9._~-]*/)?[a-z0-9][a-z0-9._~-]*", name) or + not isinstance(version, str) or not re.fullmatch(r"[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?", version)): + raise ValueError("Invalid locked registry package name or version") + return name + "@" + version + try: targets = [] selected = set() @@ -417,7 +435,8 @@ jobs: if (directory / ".npmrc").exists(): raise ValueError("Candidate .npmrc is not allowed during private dependency acquisition") package = json.loads((directory / "package.json").read_text()) - lock = json.loads((directory / "package-lock.json").read_text()) + lock_bytes = (directory / "package-lock.json").read_bytes() + lock = json.loads(lock_bytes) if lock.get("lockfileVersion") not in {2, 3}: raise ValueError("npm acquisition requires a package lock") for group in ("dependencies", "devDependencies", "optionalDependencies"): @@ -425,7 +444,11 @@ jobs: found = git_package(value) if found: selected.add(found) - for entry in lock.get("packages", {}).values(): + registry_packages = [] + for location, entry in lock.get("packages", {}).items(): + spec = registry_package(location, entry) + if spec: + registry_packages.append((location, spec)) found = git_package(entry.get("resolved")) if found: selected.add(found) @@ -434,7 +457,7 @@ jobs: found = git_package(value) if found: selected.add(found) - targets.append(directory) + targets.append((directory, registry_packages, lock_bytes)) # Fetch only registered fixed Git package commits. npm never receives token config. for repo, sha in sorted(selected): repository = mirror(repo, sha, component_token) @@ -446,12 +469,25 @@ jobs: raise ValueError("Git package provider is missing committed package outputs") no_auth = mirror_env() empty_config = tempfile.NamedTemporaryFile(prefix="ci-npm-globalrc-") - for directory in targets: + for directory, registry_packages, lock_bytes in targets: result = subprocess.run(["npm", "ci", "--ignore-scripts", "--no-audit", "--no-fund", "--userconfig=/dev/null", "--globalconfig=" + empty_config.name], cwd=directory, env=no_auth, capture_output=True, text=True) if result.returncode: raise ValueError("npm dependency acquisition failed: " + result.stderr.strip()) + # npm ci caches tarballs; packed consumers also need resolver + # metadata. Only installed locked registry entries are fetched. + specs = sorted({spec for location, spec in registry_packages if (directory / location).is_dir()}) + if specs: + with tempfile.TemporaryDirectory(prefix="ci-npm-metadata-") as metadata_root: + result = subprocess.run(["npm", "cache", "add", *specs, "--ignore-scripts", + "--registry=https://registry.npmjs.org", "--userconfig=/dev/null", + "--globalconfig=" + empty_config.name], cwd=metadata_root, + env=no_auth, capture_output=True, text=True) + if result.returncode: + raise ValueError("npm metadata acquisition failed: " + result.stderr.strip()) + if (directory / "package-lock.json").read_bytes() != lock_bytes: + raise ValueError("npm acquisition changed the committed package lock") except (ValueError, OSError, subprocess.CalledProcessError) as error: sys.exit("npm prefetch refused: " + str(error)) print("npm packages cached without credentials or lifecycle execution") diff --git a/tests/fixtures/component-ci/Agent-System-UI/ci.yml b/tests/fixtures/component-ci/Agent-System-UI/ci.yml index 68f9f52a..970f1c44 100644 --- a/tests/fixtures/component-ci/Agent-System-UI/ci.yml +++ b/tests/fixtures/component-ci/Agent-System-UI/ci.yml @@ -406,6 +406,24 @@ jobs: raise ValueError("npm Git source is outside the reviewed fixed-SHA package mapping") return None + def registry_package(location, entry): + resolved = entry.get("resolved", "") + if not isinstance(resolved, str) or not resolved.startswith(("https://", "http://")): + return None + # A metadata spec is name@exact-version, never a candidate URL. + source = urlsplit(resolved) + if (source.scheme != "https" or source.netloc != "registry.npmjs.org" or + source.username or source.password or source.query or source.fragment): + raise ValueError("npm tarball source is outside the reviewed public registry") + relative = Path(location) + name = entry.get("name") or location.rsplit("node_modules/", 1)[-1] + version = entry.get("version", "") + if (not location.startswith("node_modules/") or relative.is_absolute() or ".." in relative.parts or + not isinstance(name, str) or not re.fullmatch(r"(?:@[a-z0-9][a-z0-9._~-]*/)?[a-z0-9][a-z0-9._~-]*", name) or + not isinstance(version, str) or not re.fullmatch(r"[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?", version)): + raise ValueError("Invalid locked registry package name or version") + return name + "@" + version + try: targets = [] selected = set() @@ -415,7 +433,8 @@ jobs: if (directory / ".npmrc").exists(): raise ValueError("Candidate .npmrc is not allowed during private dependency acquisition") package = json.loads((directory / "package.json").read_text()) - lock = json.loads((directory / "package-lock.json").read_text()) + lock_bytes = (directory / "package-lock.json").read_bytes() + lock = json.loads(lock_bytes) if lock.get("lockfileVersion") not in {2, 3}: raise ValueError("npm acquisition requires a package lock") for group in ("dependencies", "devDependencies", "optionalDependencies"): @@ -423,7 +442,11 @@ jobs: found = git_package(value) if found: selected.add(found) - for entry in lock.get("packages", {}).values(): + registry_packages = [] + for location, entry in lock.get("packages", {}).items(): + spec = registry_package(location, entry) + if spec: + registry_packages.append((location, spec)) found = git_package(entry.get("resolved")) if found: selected.add(found) @@ -432,7 +455,7 @@ jobs: found = git_package(value) if found: selected.add(found) - targets.append(directory) + targets.append((directory, registry_packages, lock_bytes)) # Fetch only registered fixed Git package commits. npm never receives token config. for repo, sha in sorted(selected): repository = mirror(repo, sha, component_token) @@ -444,12 +467,25 @@ jobs: raise ValueError("Git package provider is missing committed package outputs") no_auth = mirror_env() empty_config = tempfile.NamedTemporaryFile(prefix="ci-npm-globalrc-") - for directory in targets: + for directory, registry_packages, lock_bytes in targets: result = subprocess.run(["npm", "ci", "--ignore-scripts", "--no-audit", "--no-fund", "--userconfig=/dev/null", "--globalconfig=" + empty_config.name], cwd=directory, env=no_auth, capture_output=True, text=True) if result.returncode: raise ValueError("npm dependency acquisition failed: " + result.stderr.strip()) + # npm ci caches tarballs; packed consumers also need resolver + # metadata. Only installed locked registry entries are fetched. + specs = sorted({spec for location, spec in registry_packages if (directory / location).is_dir()}) + if specs: + with tempfile.TemporaryDirectory(prefix="ci-npm-metadata-") as metadata_root: + result = subprocess.run(["npm", "cache", "add", *specs, "--ignore-scripts", + "--registry=https://registry.npmjs.org", "--userconfig=/dev/null", + "--globalconfig=" + empty_config.name], cwd=metadata_root, + env=no_auth, capture_output=True, text=True) + if result.returncode: + raise ValueError("npm metadata acquisition failed: " + result.stderr.strip()) + if (directory / "package-lock.json").read_bytes() != lock_bytes: + raise ValueError("npm acquisition changed the committed package lock") except (ValueError, OSError, subprocess.CalledProcessError) as error: sys.exit("npm prefetch refused: " + str(error)) print("npm packages cached without credentials or lifecycle execution") diff --git a/tests/fixtures/component-ci/provenance.json b/tests/fixtures/component-ci/provenance.json index cdc35085..c3b09fa8 100644 --- a/tests/fixtures/component-ci/provenance.json +++ b/tests/fixtures/component-ci/provenance.json @@ -53,15 +53,15 @@ }, "Agent-System-UI": { "repository": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-UI.git", - "source_sha": "bc0a4d33d03728e8726b5c398c4239a87def8eda", + "source_sha": "63d289e6bc15b701356cfe2d5b8740210fac0dcc", "workflow_path": ".gitea/workflows/ci.yml", - "workflow_sha256": "ef41bf7d981c37246d71fe80c09fa077341802442aad213b14c9f18a17a58694" + "workflow_sha256": "03fb580f523649db843a21ff70e3d21c5165198c1a8cf0a0bea882c3ec04f8f1" }, "Agent-System-Frontend": { "repository": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Frontend.git", - "source_sha": "6ed7b9322c5733f76b206a35cd78649ba385d83b", + "source_sha": "5467517e1831e7ca8b58bb5df52494a3a2c9d468", "workflow_path": ".gitea/workflows/ci.yml", - "workflow_sha256": "51aeaa0e2ced11bb36fd6b66ac8da66a1f2efdbd6a5d6036302159646cabc3be" + "workflow_sha256": "802e5c199afd8805d87f0fd1958cd001960d8d820a4e6acb14a401007d278012" }, "Agent-System-RDM": { "repository": "ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-RDM.git", diff --git a/tests/test_composition.py b/tests/test_composition.py index c34b355b..98d4e27e 100644 --- a/tests/test_composition.py +++ b/tests/test_composition.py @@ -1,14 +1,20 @@ """Real Git/npm/Go fixtures for immutable product composition.""" +import base64 import hashlib +import importlib.util +import io import json import os from pathlib import Path import shutil import subprocess import sys +import tarfile import tempfile +import threading import unittest import zipfile +from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer SCRIPT = Path(__file__).resolve().parents[1] / "scripts/build-composition.py" @@ -16,6 +22,151 @@ RDM_SCRIPTS = Path(os.environ.get("COMPOSITION_RDM_SOURCE", str(SCRIPT.parent.pa LEGACY_PRODUCT = Path(__file__).resolve().parent / "fixtures/rdm-legacy-product.sh" +class LocalNpmRegistry: + """Real npm cache/registry traffic with no public-network dependency.""" + name = "composition-cold-fixture" + + def __init__(self, base, env): + self.base, self.env = base, env + self.requests = [] + self.tarballs = {} + self.integrities = {} + for version in ("1.0.0", "1.0.1"): + payload = json.dumps({"name": self.name, "version": version, + "scripts": {"install": "node -e 'process.exit(91)'"}}).encode() + stream = io.BytesIO() + with tarfile.open(fileobj=stream, mode="w:gz") as archive: + entry = tarfile.TarInfo("package/package.json") + entry.size = len(payload) + archive.addfile(entry, io.BytesIO(payload)) + self.tarballs[version] = stream.getvalue() + self.integrities[version] = "sha512-" + base64.b64encode(hashlib.sha512(stream.getvalue()).digest()).decode() + registry = self + + class Handler(BaseHTTPRequestHandler): + def do_GET(self): + registry.requests.append((self.path, self.headers.get("Authorization"))) + if self.path == "/" + registry.name: + versions = {v: {"name": registry.name, "version": v, "dist": { + "tarball": registry.url + "/" + registry.name + "/-/" + v + ".tgz", + "integrity": registry.integrities[v]}} for v in registry.tarballs} + body = json.dumps({"name": registry.name, "dist-tags": {"latest": "1.0.1"}, "versions": versions}).encode() + content_type = "application/json" + else: + version = self.path.rsplit("/", 1)[-1].removesuffix(".tgz") + if version not in registry.tarballs: + self.send_error(404) + return + body, content_type = registry.tarballs[version], "application/octet-stream" + self.send_response(200) + self.send_header("Content-Type", content_type) + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def log_message(self, *args): + pass + + self.server = ThreadingHTTPServer(("127.0.0.1", 0), Handler) + self.url = "http://127.0.0.1:" + str(self.server.server_port) + self.thread = threading.Thread(target=self.server.serve_forever, daemon=True) + self.thread.start() + self.cache = base / "cold-npm-cache" + self.global_config = base / "empty-npm-globalrc" + self.global_config.write_text("") + self.home = base / "cold-home" + self.home.mkdir() + self.tools = base / "npm-tools" + self.tools.mkdir() + self.calls = base / "npm-calls.jsonl" + npm = shutil.which("npm") + wrapper = self.tools / "npm" + wrapper.write_text("#!" + sys.executable + "\n" + + "import json, os, sys\nfrom pathlib import Path\nargs = sys.argv[1:]\n" + + "with Path(" + repr(str(self.calls)) + ").open('a') as output:\n" + + " output.write(json.dumps({'args': args, 'credential_keys': [k for k in os.environ if any(w in k.upper() for w in ('TOKEN', 'SECRET', 'PASSWORD'))]}) + '\\n')\n" + + "if args[:2] == ['cache', 'add'] and args[2].startswith(" + repr(self.name + "@") + "):\n" + + " args = [a.replace('https://registry.npmjs.org', " + repr(self.url) + ") for a in args]\n" + + "if args[:1] == ['ci']: args.append('--offline')\n" + + "os.execv(" + repr(npm) + ", [" + repr(npm) + ", *args])\n") + wrapper.chmod(0o755) + self.env = env | {"HOME": str(self.home), "npm_config_cache": str(self.cache), + "PATH": str(self.tools) + os.pathsep + env["PATH"]} + # Seed only the locked tarball, exactly the state produced by npm ci. + tarball = base / "locked.tgz" + tarball.write_bytes(self.tarballs["1.0.0"]) + subprocess.run([npm, "cache", "add", str(tarball), "--ignore-scripts", "--userconfig=/dev/null", + "--globalconfig=" + str(self.global_config)], env=self.env, check=True, capture_output=True) + + def close(self): + self.server.shutdown() + self.server.server_close() + self.thread.join() + + def manifests(self, source): + source.mkdir(exist_ok=True) + manifest = {"name": "fixture", "version": "1.0.0", "dependencies": {self.name: "1.0.0"}} + (source / "package.json").write_text(json.dumps(manifest)) + lock = {"name": "fixture", "version": "1.0.0", "lockfileVersion": 3, "requires": True, + "packages": {"": manifest, "node_modules/" + self.name: { + "version": "1.0.0", "resolved": "https://registry.npmjs.org/" + self.name + "/-/1.0.0.tgz", + "integrity": self.integrities["1.0.0"]}}} + (source / "package-lock.json").write_text(json.dumps(lock)) + return (source / "package-lock.json").read_bytes() + + def consumer(self, directory, env=None): + directory.mkdir(exist_ok=True) + (directory / "package.json").write_text(json.dumps({"dependencies": {self.name: "1.0.0"}})) + return subprocess.run(["npm", "install", "--offline", "--ignore-scripts", "--no-audit", "--no-fund", + "--registry=" + self.url, "--userconfig=/dev/null", "--globalconfig=" + str(self.global_config)], + cwd=directory, env=env or self.env, capture_output=True, text=True) + + +@unittest.skipUnless(shutil.which("npm"), "npm required") +class NpmAcquisitionTests(unittest.TestCase): + def setUp(self): + self.temporary = tempfile.TemporaryDirectory(prefix="composition-cold-npm-") + self.addCleanup(self.temporary.cleanup) + self.base = Path(self.temporary.name) + self.registry = LocalNpmRegistry(self.base, os.environ.copy()) + self.addCleanup(self.registry.close) + spec = importlib.util.spec_from_file_location("cold_npm_composer", SCRIPT) + self.composer = importlib.util.module_from_spec(spec) + spec.loader.exec_module(self.composer) + + def test_locked_metadata_is_acquired_before_offline_consumer_without_credentials(self): + source = self.base / "source" + original = self.registry.manifests(source) + red = self.registry.consumer(self.base / "before") + self.assertNotEqual(red.returncode, 0) + self.assertIn("ENOTCACHED", red.stderr) + self.composer.npm_dependencies(source, {}, self.registry.env | {"GITEA_TOKEN": "synthetic-secret"}) + self.assertEqual((source / "package-lock.json").read_bytes(), original) + green = self.registry.consumer(self.base / "after", self.composer.execution_environment(self.registry.env)) + self.assertEqual(green.returncode, 0, green.stdout + green.stderr) + actual = json.loads((self.base / "after/node_modules" / self.registry.name / "package.json").read_text()) + self.assertEqual(actual["version"], "1.0.0") + calls = [json.loads(line) for line in self.registry.calls.read_text().splitlines()] + metadata = [call for call in calls if call["args"][:2] == ["cache", "add"]] + self.assertTrue(metadata, "tarball acquisition alone does not populate offline resolver metadata") + self.assertEqual(metadata[0]["args"][2], self.registry.name + "@1.0.0") + self.assertFalse(metadata[0]["credential_keys"]) + self.assertTrue(self.registry.requests) + self.assertTrue(all(auth is None for _, auth in self.registry.requests)) + + def test_unreviewed_tarball_source_is_refused_before_acquisition(self): + source = self.base / "source" + self.registry.manifests(source) + path = source / "package-lock.json" + lock = json.loads(path.read_text()) + lock["packages"]["node_modules/" + self.registry.name]["resolved"] = self.registry.url + "/untrusted.tgz" + path.write_text(json.dumps(lock)) + with self.assertRaisesRegex(self.composer.CompositionError, "reviewed public registry"): + self.composer.npm_dependencies(source, {}, self.registry.env | {"GITEA_TOKEN": "synthetic-secret"}) + self.assertFalse(self.registry.requests) + self.assertFalse(self.registry.calls.exists()) + + @unittest.skipUnless(all(shutil.which(c) for c in ("git", "go", "node", "npm")), "Git/Go/Node/npm required") class CompositionTests(unittest.TestCase): def setUp(self): @@ -118,7 +269,7 @@ args = sys.argv[1:] name = pathlib.Path(sys.argv[0]).name acquisition = (name == 'git' and args and args[0] in {'clone', 'fetch', 'archive'} or name == 'go' and args and (args[0] == 'mod' or args[0] == 'list') - or name == 'npm' and args and args[0] in {'ci', 'install'}) + or name == 'npm' and args and (args[0] in {'ci', 'install'} or args[:2] == ['cache', 'add'])) if acquisition and pathlib.Path(os.environ['COMPOSITION_EXEC_MARKER']).exists(): print('acquisition-after-execution: ' + name + ' ' + ' '.join(args[:2]), file=sys.stderr) sys.exit(86) diff --git a/tests/test_dependency_ci.py b/tests/test_dependency_ci.py index e0731a27..52b69995 100644 --- a/tests/test_dependency_ci.py +++ b/tests/test_dependency_ci.py @@ -10,6 +10,7 @@ import textwrap import unittest from tests import test_ci_credentials as fixture +from tests.test_composition import LocalNpmRegistry ROOT_TOKEN, SUB_TOKEN, SSH, WORKFLOW = fixture.ROOT_TOKEN, fixture.SUB_TOKEN, fixture.SSH, fixture.WORKFLOW @@ -242,6 +243,47 @@ class DependencyCITests(unittest.TestCase): self.assertRegex(path, r"^/weichen/Agent-System-Core\.git/") self.assertEqual(auth, "token " + SUB_TOKEN) + def test_npm_prefetch_populates_cold_offline_resolver_metadata_without_credentials(self): + workflows = {"Agent-System-Dev": WORKFLOW, **{repo: fixture.component_workflow(repo) + for repo in ("Agent-System-UI", "Agent-System-Frontend")}} + for repo, workflow in workflows.items(): + with self.subTest(repo=repo): + base = self.base / repo + base.mkdir() + registry = LocalNpmRegistry(base, self.env) + self.addCleanup(registry.close) + original = registry.manifests(self.checkout) + red = registry.consumer(base / "cold-before") + self.assertNotEqual(red.returncode, 0) + self.assertIn("ENOTCACHED", red.stderr) + result = self.run_phase("Prefetch npm packages without lifecycle scripts", workflow=workflow, extra=registry.env) + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + self.assertEqual((self.checkout / "package-lock.json").read_bytes(), original) + green = registry.consumer(base / "cold-after") + self.assertEqual(green.returncode, 0, green.stdout + green.stderr) + installed = json.loads((base / "cold-after/node_modules" / registry.name / "package.json").read_text()) + self.assertEqual(installed["version"], "1.0.0") + calls = [json.loads(line) for line in registry.calls.read_text().splitlines()] + metadata = [call for call in calls if call["args"][:2] == ["cache", "add"]] + self.assertTrue(metadata) + self.assertEqual(metadata[0]["args"][2], registry.name + "@1.0.0") + self.assertFalse(metadata[0]["credential_keys"]) + self.assertTrue(all(auth is None for _, auth in registry.requests)) + + def test_npm_metadata_version_cannot_be_a_destination(self): + (self.checkout / "package.json").write_text(json.dumps({"name": "fixture"})) + (self.checkout / "package-lock.json").write_text(json.dumps({"lockfileVersion": 3, "packages": { + "node_modules/evil": {"version": self.url + "/untrusted.tgz", + "resolved": "https://registry.npmjs.org/evil/-/evil-1.0.0.tgz"}}})) + workflows = {"Agent-System-Dev": WORKFLOW, **{repo: fixture.component_workflow(repo) + for repo in ("Agent-System-UI", "Agent-System-Frontend")}} + for repo, workflow in workflows.items(): + with self.subTest(repo=repo): + result = self.run_phase("Prefetch npm packages without lifecycle scripts", workflow=workflow) + self.assertNotEqual(result.returncode, 0) + self.assertIn("locked registry package", result.stderr) + self.assertFalse(self.requests) + def test_npm_provider_prepare_is_rejected_without_execution(self): marker = self.base / "prepare-ran" sha = self.commit_fixture("Agent-System-Core", { -- 2.54.0 From 94bb648bbf45bb20d960e3d0022ca1be75703451 Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 14 Oct 2026 01:45:38 +0000 Subject: [PATCH 20/29] Record bounded review and formal validation progress Why: Preserve approval, active-branch integration and the cold-cache repair without conflating local evidence with final acceptance. Evidence: Link complete SELF and independent REPLAY records, and fixed-head component platform runs; leave pending gates explicit. Impact: Prepare the final candidate record and WIP component PR links before freezing source-external stage-7 evidence. Refs: R1-R15; dependency-workspace U1-U8; policy/delivery.md --- .task/feature-dependency-workspace.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md index 16194c01..29a31fc7 100644 --- a/.task/feature-dependency-workspace.md +++ b/.task/feature-dependency-workspace.md @@ -99,6 +99,18 @@ ce-simplify-code 的 reuse/quality/efficiency 三个独立只读扫描完成。 依照 policy/governance.md「候选固定前后」,最终重放使用 /tmp 的唯一源码外收据;不为记录输出反复推进候选 HEAD。最终结果、完整候选 SHA、组件列表、R1–R15 映射和未验证项保存在 `/tmp/dependency-workspace-handoff-20261013-01a1345f.md`,正式验收时核对实际文件及其原始收据。下方既有 JSON 是已记录的历史 SELF,不冒充新对象的通过结果。当前不运行 task-finish,不删除旧目录、Git 管理数据、其他分支或任何共享服务数据。 +## 2026-10-14 正式验证准备与反馈 + +- 用户批准阶段 6 的 0676 候选及交接后,原登记任务以本次唯一 precheck 收据运行 task-resume;SELF:`/tmp/dependency-formal-resume-precheck-20261014-01a1345f.json`。实际 task-sync 的 base 为 add097,记录对象为 222687f,changed=0;原始收据 `/tmp/dependency-formal-sync-20261014-01a1345f.json`。未启用队列自动模式,继续既有同步节点。 +- Root 独立补充有效性核验:222687f 固定归档的 101 项最小重放通过,零失败/跳过;审阅者、命令、原始日志及 23 路径覆盖见 `/tmp/dependency-final-validity-n9q5aytw/receipt.json`。此结论受固定对象限制,后续 npm 修复需再复审。 +- Go provider 独立 REPLAY:原 9 仓/15 模块的 test、vet、离线模块图通过;562 个 Go 变更文件为 import 前缀迁移,第三方声明版本未变化。完整固定对象/命令/日志见 `/tmp/dependency-go-provider-review-20261014-01a1345f/report.json`,不扩大为平台 GATE 或产品验收。 +- fresh fetch 发现 RDM main 新增 38 个提交;在本任务普通克隆中合并,保留已合入 IAM、成员、投影、回归与任务归档。SELF 核对合并后的全部 230 个 Go 文件等于 6fcb256 的业务内容,仅规范化 import。独立 REPLAY 对固定 48358df 的完整 test、vet、离线模块图通过,432 个顶层测试 PASS、5 个环境用例 SKIP;报告 `/tmp/dependency-go-provider-review-20261014-01a1345f/new-rdm-48358df/report.json`。未修改其他任务工作区。 +- 前端独立审阅发现两项须整改:冷 npm ci 仅缓存 tarball,离线 consumer 测试缺 registry 元数据(npm10/11 均 RED);UI 无锁 consumer 重解析范围依赖,漂移到 DOMPurify 3.4.17 而正式 lock 为 3.4.16。报告 `/tmp/frontend-rules-replay-20261014-01a1345f-review/review.json`。修复保留离线测试,获取阶段补齐锁定包元数据,临时 consumer 固定来自正式 lock 的版本;不得以加热全局缓存或继续取漂移包替代修复。修复、组合锁集成、固定重放和复审进行中。 +- 已建立 10 个组件/规范/过程仓 WIP PR;真实链接清单 `/tmp/dependency-pr-links-20261014-01a1345f.json`。平台 API 核对 8 个功能仓精确 HEAD 的运行链接、执行账号及 runner/步骤,CI success;原始平台元数据 `/tmp/dependency-platform-ci-20261014-013118-01a1345f.json`,捕获命令的 SELF 收据 `/tmp/dependency-platform-ci-first-20261014-01a1345f.json`。这些运行是相应功能仓的 GATE,不替代尚未建立的最终 Dev/Frontend/UI/RDM 候选 GATE。Gitea URL 不被本应用附件接口接受,实际 PR 链接保留,不伪造 GitHub 地址。 +- 阶段 7 当前候选人工验收尚未通过;WIP PR 未合入。发布、共享部署、业务数据、历史改写、平台保护和回收仍未执行。修复固定后再提交当前组合的正式验证结果与缺项,按 policy/delivery.md 保留人工出口。 + +冷缓存整改已集成到固定代码提交 01b7799:UI=63d289e、Frontend=5467517;Frontend 的 249 个 registry lock 项与原对象完全相同,仅采用修复后的 UI 完整 Git SHA。Root 由两个 provider 的 git show 记录 CI fixture/provenance,不依赖 ignored 迁移源。SELF 主控实际重放 57 个 composition/CI 凭据用例通过,原始收据 `/tmp/dependency-cold-npm-host-targeted-20261014-01a1345f.json`;作者 npm10/npm11 实际隔离冷缓存正反验证与全部文件摘要见 `/tmp/cold-npm-repair-return-20261014.json`。独立整改复审、Node22 平台 GATE 及新固定组合重放仍待结果;不从这些 SELF 推断通过。后续精确对象与平台结果写入源码外阶段 7 报告,不为收据反复推进已固定 HEAD。 + ```json { -- 2.54.0 From 63ba0d40974533bee97010a1b4059b235e6132db Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 14 Oct 2026 02:08:34 +0000 Subject: [PATCH 21/29] Resolve platform HTTP aliases through verified local CI mirrors (U5) Why: Gitea Docker runners inject an HTTP server URL, while ordinary transport rules intentionally reject HTTP sources. Evidence: SELF observed the fixed-runner failure, added a real local Git clone regression with RED then GREEN, and passed 31 transport/composition cases. Impact: Accept only inherited mirror aliases matching the injected server, owner and repository; keep configured HTTP sources, credentials and foreign aliases rejected without global Git changes. Refs: R7-R8, R14; dependency-workspace U5; Dev PR 537 runs 3029/3030 --- scripts/workspace/transport.py | 19 +++++++++++- tests/test_transport.py | 56 ++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/scripts/workspace/transport.py b/scripts/workspace/transport.py index 721f3456..ccf26581 100644 --- a/scripts/workspace/transport.py +++ b/scripts/workspace/transport.py @@ -1,6 +1,7 @@ """Process-local module transport; configuration contains no credentials.""" import json import os +import re from pathlib import Path from urllib.parse import urlsplit, unquote @@ -20,6 +21,22 @@ def _url(value): return value +def _mirror_source(value, target, env): + """Allow injected HTTP only as a verified, credential-free mirror alias.""" + if isinstance(value, str) and value.startswith('http://'): + server = env.get('GITHUB_SERVER_URL', '').rstrip('/') + parsed = urlsplit(server) + owner = env.get('GITHUB_REPOSITORY', '').partition('/')[0] + if (parsed.scheme not in {'http', 'https'} or not parsed.netloc or + parsed.username or parsed.password or parsed.query or parsed.fragment or + not re.fullmatch(r'[A-Za-z0-9][A-Za-z0-9_.-]*', owner) or + not re.fullmatch(r'[A-Za-z0-9][A-Za-z0-9_.-]*\.git', target.name) or + value != server + '/' + owner + '/' + target.name): + raise ValueError('HTTP mirror source must match the injected server and repository') + return value + return _url(value) + + def environment(root=None): root = Path(root) if root is not None else Path(__file__).resolve().parents[2] path = root / 'components.json' @@ -54,7 +71,7 @@ def environment(root=None): target = Path(unquote(urlsplit(key[4:-10]).path)).resolve() if mirrors not in target.parents or not target.is_dir(): raise ValueError('CI mirror source escapes its registered directory') - inherited.append((key, _url(value))) + inherited.append((key, _mirror_source(value, target, env))) # Do not inherit temporary authentication configuration into candidate code. for key in list(env): if key == 'GIT_CONFIG_COUNT' or key.startswith(('GIT_CONFIG_KEY_', 'GIT_CONFIG_VALUE_')): diff --git a/tests/test_transport.py b/tests/test_transport.py index fce6160f..bb50b024 100644 --- a/tests/test_transport.py +++ b/tests/test_transport.py @@ -78,5 +78,61 @@ class TransportTests(unittest.TestCase): self.assertIn(('protocol.file.allow','always'),pairs) self.assertFalse(any('extraheader' in key or 'fake-private' in value for key,value in pairs)) + def test_injected_http_server_maps_to_verified_local_mirror_without_authentication(self): + transport = self.load() + with tempfile.TemporaryDirectory() as td: + root = Path(td) + mirrors = root / 'mirrors' + mirrors.mkdir() + target = mirrors / 'Provider.git' + subprocess.run(['git', 'init', '--bare', '-q', str(target)], check=True) + (root / 'components.json').write_text(json.dumps({'transport': {'git_rewrites': [ + {'from': 'https://code.example/weichen/Provider', 'to': 'ssh://git@code.example:31411/weichen/Provider.git'}]}})) + origin = 'http://127.0.0.1:3000/weichen/Provider.git' + inherited = {'CI_DEPENDENCY_MIRRORS': str(mirrors), 'GITHUB_SERVER_URL': 'http://127.0.0.1:3000', + 'GITHUB_REPOSITORY': 'weichen/Dev', 'GIT_CONFIG_COUNT': '3', + 'GIT_CONFIG_KEY_0': f'url.{target.as_uri()}.insteadOf', 'GIT_CONFIG_VALUE_0': origin, + 'GIT_CONFIG_KEY_1': 'protocol.file.allow', 'GIT_CONFIG_VALUE_1': 'always', + 'GIT_CONFIG_KEY_2': 'http.http://127.0.0.1:3000/.extraheader', + 'GIT_CONFIG_VALUE_2': 'AUTHORIZATION: token synthetic-private'} + before = subprocess.run(['git', 'config', '--global', '--list'], capture_output=True).stdout + with patch.dict(os.environ, inherited): + env = transport.environment(root) + pairs = [(env[f'GIT_CONFIG_KEY_{i}'], env[f'GIT_CONFIG_VALUE_{i}']) for i in range(int(env['GIT_CONFIG_COUNT']))] + self.assertIn((f'url.{target.as_uri()}.insteadOf', origin), pairs) + self.assertFalse(any('extraheader' in key or 'synthetic-private' in value for key, value in pairs)) + cloned = subprocess.run(['git', 'clone', '--no-checkout', origin, str(root / 'cloned')], env=env, capture_output=True, text=True) + self.assertEqual(cloned.returncode, 0, cloned.stdout + cloned.stderr) + after = subprocess.run(['git', 'config', '--global', '--list'], capture_output=True).stdout + self.assertEqual(before, after) + + def test_inherited_http_source_must_match_injected_server_owner_and_repository(self): + transport = self.load() + with tempfile.TemporaryDirectory() as td: + root = Path(td) + mirrors = root / 'mirrors' + mirrors.mkdir() + target = mirrors / 'Provider.git' + target.mkdir() + (root / 'components.json').write_text(json.dumps({'transport': {'git_rewrites': [ + {'from': 'https://code.example/Provider', 'to': 'ssh://git@code.example:31411/Provider.git'}]}})) + inherited = {'CI_DEPENDENCY_MIRRORS': str(mirrors), 'GITHUB_SERVER_URL': 'http://127.0.0.1:3000', + 'GITHUB_REPOSITORY': 'weichen/Dev', 'GIT_CONFIG_COUNT': '1', + 'GIT_CONFIG_KEY_0': f'url.{target.as_uri()}.insteadOf'} + for source in ['http://foreign.test/weichen/Provider.git', 'http://127.0.0.1:3000/other/Provider.git', + 'http://127.0.0.1:3000/weichen/Other.git', 'http://user:password@127.0.0.1:3000/weichen/Provider.git']: + with self.subTest(source=source), patch.dict(os.environ, inherited | {'GIT_CONFIG_VALUE_0': source}): + with self.assertRaises(ValueError): + transport.environment(root) + + def test_ordinary_config_cannot_enable_http_transport(self): + transport = self.load() + with tempfile.TemporaryDirectory() as td: + root = Path(td) + (root / 'components.json').write_text(json.dumps({'transport': {'git_rewrites': [ + {'from': 'http://127.0.0.1:3000/weichen/Provider.git', 'to': 'file:///tmp/mirrors/Provider.git'}]}})) + with self.assertRaises(ValueError): + transport.environment(root) + if __name__ == '__main__': unittest.main() -- 2.54.0 From ed923b3aa58af7360926e4785a33f4a2da39a63b Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 14 Oct 2026 02:10:30 +0000 Subject: [PATCH 22/29] Record platform feedback and approved read-only CI credential setup Why: Final validation needs to distinguish fixed local results, actual platform failures and the user's additional credential authorization. Evidence: Reference sanitized run logs, independent cold-cache closures, the HTTP mirror regression and metadata-only credential receipts. Impact: Keep stage-7 acceptance pending and preserve failed runs rather than treating prior SELF results as current GATE approval. Refs: R7-R8, R14-R15; dependency-workspace U5/U7; user approval 2026-10-14 --- .task/feature-dependency-workspace.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md index 29a31fc7..cd399eba 100644 --- a/.task/feature-dependency-workspace.md +++ b/.task/feature-dependency-workspace.md @@ -111,6 +111,12 @@ ce-simplify-code 的 reuse/quality/efficiency 三个独立只读扫描完成。 冷缓存整改已集成到固定代码提交 01b7799:UI=63d289e、Frontend=5467517;Frontend 的 249 个 registry lock 项与原对象完全相同,仅采用修复后的 UI 完整 Git SHA。Root 由两个 provider 的 git show 记录 CI fixture/provenance,不依赖 ignored 迁移源。SELF 主控实际重放 57 个 composition/CI 凭据用例通过,原始收据 `/tmp/dependency-cold-npm-host-targeted-20261014-01a1345f.json`;作者 npm10/npm11 实际隔离冷缓存正反验证与全部文件摘要见 `/tmp/cold-npm-repair-return-20261014.json`。独立整改复审、Node22 平台 GATE 及新固定组合重放仍待结果;不从这些 SELF 推断通过。后续精确对象与平台结果写入源码外阶段 7 报告,不为收据反复推进已固定 HEAD。 +平台反馈形成新尝试:94bb648 的 SELF 全组合 test(467 用例、19 个显式跳过)、build、普通 clone/Native 联调及 RDM 产品/临时数据烟测通过;原始收据前缀为 `/tmp/dependency-formal-*20261014-01a1345f.json`。独立冷 npm 补充复审闭合 P1/P2,报告 `/tmp/frontend-rules-fix-replay-20261014-01a1345f/closed-review.json`;Root 57 项独立补充通过,报告 `/tmp/dependency-cold-npm-review-7so6nnso/receipt.json`。这些结论绑定 94bb,不冒充后续新 HEAD。 + +实际平台 run 3029/3030 的 Dev 与 run 3033 的 RDM 拒绝 runner 注入的 HTTP 镜像别名;run 3032 的 Frontend 缺跨仓私有依赖凭据。脱敏平台日志保存于 `/tmp/dependency-ci-<仓>-job-<编号>-sanitized.log`。63ba0d4 在保留普通 HTTP 禁止与凭据剥离的条件下,仅接受与注入 server/owner/repository 匹配的本地镜像别名;SELF 真实 Git clone RED→GREEN 与 31 项 transport/composition 重放见 `/tmp/dependency-ci-http-mirror-{red,green}-20261014-01a1345f.json`。 + +用户另行明确批准「创建并配置独立只读凭据」(2026-10-14 Asia/Shanghai):允许独立 `read:repository` token 读取账号可访问的仓库,并仅配置 Frontend Actions 的 `SUBMODULE_TOKEN`。不复用管理 API token、不新增写权限。token 管理 API 要求 BasicAuth,实际通过已安装 Gitea 官方 CLI 的 OS git 用户创建,再经受信 API 配置;没有使用/询问账号密码,未在仓库、日志、聊天或本地文件保存凭据值。仅用途、scope、可用状态保存在 `/tmp/dependency-frontend-ci-read-credential-record-20261014-01a1345f.json`,完整 SELF 收据为 `/tmp/dependency-frontend-ci-read-credential-cli-20261014-01a1345f.json`。后续重跑必须核验实际私有依赖读取成功,不能用 secret 名称存在推断 CI 已通过。正式验收及所有 PR 合入仍待当前候选结果和阶段结论,发布/部署/回收未授权也未执行。 + ```json { -- 2.54.0 From adb6cbcf480e7a6e8d4f0149176aa6e363056431 Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 14 Oct 2026 02:29:36 +0000 Subject: [PATCH 23/29] Keep fixed checks and lifecycle fixtures isolated in CI (U5) Why: Go-to-Python tests leave ignored bytecode in fixed sources, lifecycle clones need a fixed main reference, and boundary gates require ripgrep. Evidence: SELF real byproduct and clone regressions failed before repair; host passed 11 component cases, 4 hook cases and 33 CI credential cases. Impact: Execute versioned Go checks in disposable clones while preserving editable overlays and strict dirty guards; install the boundary prerequisite and seed only isolated pinned lifecycle refs. Refs: R8-R10, R14-R15; dependency-workspace U5; Dev PR 537 run 3036 --- .gitea/workflows/ci.yaml | 15 ++++++ scripts/component-check.py | 38 +++++++++++++- scripts/lint-boundaries.sh | 1 + tests/test_ci_credentials.py | 5 ++ tests/test_component_checks.py | 90 +++++++++++++++++++++++++++++++++- tests/test_dependency_ci.py | 7 +++ 6 files changed, 153 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 33abf249..59cd840b 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -263,6 +263,16 @@ jobs: tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz" ln -sfn /usr/local/go/bin/go /usr/local/bin/go ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt + - name: Install boundary checker prerequisite + run: &install_boundary_prerequisite | + set -euo pipefail + if ! command -v rg >/dev/null 2>&1; then + SUDO="" + if command -v sudo >/dev/null 2>&1 && [ "$(id -u)" != 0 ]; then SUDO=sudo; fi + $SUDO apt-get update -y + $SUDO apt-get install -y ripgrep + fi + rg --version - name: Prefetch Go modules without executing candidate code env: SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} @@ -769,6 +779,8 @@ jobs: tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz" ln -sfn /usr/local/go/bin/go /usr/local/bin/go ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt + - name: Install boundary checker prerequisite + run: *install_boundary_prerequisite - name: Install house-style Python packages run: python3 -m pip install --break-system-packages -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx python-pptx openpyxl - name: Install PostgreSQL, pgvector and Redis @@ -995,6 +1007,7 @@ jobs: # Future lifecycle fetches use only local fixed-source mirrors. git(directory, "remote", "set-url", "origin", (mirrors / "Agent-System-RDM.git").as_uri()) git(directory, "update-ref", "refs/remotes/origin/main", pins["sha"]) + git(directory, "update-ref", "refs/heads/main", pins["sha"]) mirror_env() (root / ".ci-rdm-pins").write_text("\n".join(revisions) + "\n") except (ValueError, OSError, subprocess.CalledProcessError) as error: @@ -1082,6 +1095,8 @@ jobs: tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz" ln -sfn /usr/local/go/bin/go /usr/local/bin/go ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt + - name: Install boundary checker prerequisite + run: *install_boundary_prerequisite - name: Clone Agent-System-RDM with nested pins (reviewed allowlist addition) env: SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }} diff --git a/scripts/component-check.py b/scripts/component-check.py index b9737fa4..41d17209 100644 --- a/scripts/component-check.py +++ b/scripts/component-check.py @@ -1,10 +1,12 @@ #!/usr/bin/env python3 """Prepare selected fixed sources and run explicitly local component checks.""" import argparse +from contextlib import contextmanager import os from pathlib import Path import subprocess import sys +import tempfile from workspace.cli import Workspace, process_environment from workspace.common import WorkspaceError @@ -15,6 +17,8 @@ SINGLE = {"test-backend": "Agent-System-Backend", "test-backend-pg": "Agent-Syst "test-frontend": "Agent-System-Frontend", "test-ui": "Agent-System-UI", "test-multi-instance": "Agent-System-Backend", "eval-deliverables": "Agent-System-Backend", "dev-backend": "Agent-System-Backend", "dev-frontend": "Agent-System-Frontend"} +GO_CHECKS = {"test-backend", "test-backend-pg", "test-core", "test-agentcmd", + "test-libs", "test-multi-instance", "eval-deliverables"} def run(command, cwd, env): @@ -40,6 +44,34 @@ def prepare_local_source(workspace, component): workspace.prepare_one(component) +@contextmanager +def check_sources(workspace, selected, target, overlay): + paths = {component["id"]: workspace.root / component["path"] for component in selected} + fixed = [component for component in selected + if workspace.state.data["components"][component["id"]].get("mode") == "versioned"] + if overlay or target not in GO_CHECKS or not fixed: + yield paths + return + # Go tests can create ignored outputs (including Python bytecode). Keep + # strict source guards and execute fixed commits in owned disposable clones. + # Editable sources and explicit overlays still exercise the owner's code. + with tempfile.TemporaryDirectory(prefix="component-check-") as temporary: + area = Path(temporary) + for component in fixed: + name = component["id"] + source = paths[name] + actual = workspace.git.safe(source, component["repo"]) + commit = workspace.state.data["components"][name]["baseline"] + if actual["head"] != commit or actual["branch"]: + raise WorkspaceError(f"fixed source changed before local check: {name}") + destination = area / name + workspace.git.call(area, "clone", "--no-checkout", "--no-hardlinks", "--", str(source), str(destination)) + workspace.git.call(destination, "checkout", "--detach", commit) + paths[name] = destination + print(f"[component-check] fixed check snapshot {name} commit={commit}", flush=True) + yield paths + + def check(root, target, overlay): root = root.resolve() if target in ("test-backend-pg", "test-multi-instance") and not os.environ.get("AGENT_PG_TEST_DSN"): @@ -67,7 +99,11 @@ def check(root, target, overlay): else: env["GOWORK"] = "off" print(f"[component-check] local developer sources; GOWORK={env['GOWORK']}; registered edit branches and unsaved code retained", flush=True) - paths = {component["id"]: root / component["path"] for component in selected} + with check_sources(workspace, selected, target, overlay) as paths: + run_checks(root, target, selected, names, paths, env) + + +def run_checks(root, target, selected, names, paths, env): if target == "dev": print("Backend: make dev-backend [LOCAL_OVERLAY=1]\nFrontend: make dev-frontend\nPrivate module transport is scoped to those processes.") return diff --git a/scripts/lint-boundaries.sh b/scripts/lint-boundaries.sh index e9c6d682..5c34f72c 100755 --- a/scripts/lint-boundaries.sh +++ b/scripts/lint-boundaries.sh @@ -2,6 +2,7 @@ # Public SDK isolation and sibling-library ratchets use the fixed composition map # when supplied; a manual invocation uses sources prepared by the checkout owner. set -euo pipefail +command -v rg >/dev/null 2>&1 || { echo "boundary: requires ripgrep (rg)" >&2; exit 2; } root=$(cd "$(dirname "$0")/.." && pwd) fail=0 source_path() { python3 "$root/scripts/component-source.py" "$1"; } diff --git a/tests/test_ci_credentials.py b/tests/test_ci_credentials.py index 95222fd9..1c910bed 100644 --- a/tests/test_ci_credentials.py +++ b/tests/test_ci_credentials.py @@ -337,6 +337,11 @@ class CheckoutTests(unittest.TestCase): for sha in shas: self.assertEqual(self.git(work / "rdm", "cat-file", "-t", sha), "commit") self.assertEqual(self.git(work / "rdm", "rev-parse", "HEAD"), shas[2]) + # A lifecycle cache clones this isolated checkout. Local clones copy + # heads, so the fixed source must expose a deterministic main head. + lifecycle = self.base / "lifecycle-source" + self.git(self.base, "clone", "--no-hardlinks", str(work / "rdm"), str(lifecycle)) + self.assertEqual(self.git(lifecycle, "rev-parse", "origin/main"), shas[2]) # Candidate builds are a separate phase: the shell has no checkout token, # and lifecycle source fetches resolve through public local mirror paths. from tests.test_dependency_ci import phase diff --git a/tests/test_component_checks.py b/tests/test_component_checks.py index 77e4ef8e..ca9d4508 100644 --- a/tests/test_component_checks.py +++ b/tests/test_component_checks.py @@ -31,6 +31,7 @@ class ComponentCheckTests(unittest.TestCase): shutil.copyfile(SOURCE / "Makefile", self.root / "Makefile") (self.root / ".gitignore").write_text(".workspace/\ngo.work\ngo.work.sum\ntests/integration/multi-instance/.build/\n") app = self.base / "backend" + self.backend = app app.mkdir() self.call(app, "git", "init", "--initial-branch=main") (app / "go.mod").write_text("module example.com/backend\n\ngo 1.23\n") @@ -77,13 +78,98 @@ class ComponentCheckTests(unittest.TestCase): self.call(self.root, "make", "test-backend-pg", env=self.env | {"AGENT_PG_TEST_DSN": "fixture-dsn", "AGENT_REDIS_TEST_ADDR": "fixture-redis"}) def test_multi_instance_binary_is_built_inside_dev_root_and_reached_by_suite(self): + suite = self.add_multi_instance_suite() + self.call(self.root, "make", "test-multi-instance", env=self.env | {"AGENT_PG_TEST_DSN": "fixture-dsn"}) + self.assertTrue((suite / ".build/agent-system").is_file()) + self.assertFalse((self.root / ".workspace/tests").exists()) + + def add_multi_instance_suite(self): suite = self.root / "tests/integration/multi-instance" suite.mkdir(parents=True) (suite / "go.mod").write_text("module example.com/multi\n\ngo 1.23\n") (suite / "binary_test.go").write_text('package multi\nimport("os";"os/exec";"testing")\nfunc TestBinary(t *testing.T){b,e:=exec.Command(os.Getenv("AGENT_BIN")).Output();if e!=nil||string(b)!="fixed-binary"{t.Fatalf("%s %v",b,e)}}\n') - self.call(self.root, "make", "test-multi-instance", env=self.env | {"AGENT_PG_TEST_DSN": "fixture-dsn"}) + return suite + + def add_go_byproduct_fixture(self, fail=False): + (self.backend / ".gitignore").write_text("__pycache__/\n.fixture-output\n") + (self.backend / "fixture_module.py").write_text("VALUE = 'imported from Go'\n") + (self.backend / "byproduct_test.go").write_text('''package backend +import("os";"os/exec";"testing") +func TestByproducts(t *testing.T) { + if err := os.WriteFile(".fixture-output", []byte("generated by Go test"), 0600); err != nil {t.Fatal(err)} + cmd := exec.Command("python3", "-c", "import fixture_module") + cmd.Env = append(os.Environ(), "PYTHONDONTWRITEBYTECODE=", "PYTHONPYCACHEPREFIX=") + if out, err := cmd.CombinedOutput(); err != nil {t.Fatalf("%s %v", out, err)} +''' + (' t.Fatal("deliberate fixture failure")\n' if fail else '') + '}\n') + self.call(self.backend, "git", "add", ".") + self.call(self.backend, "git", "commit", "-m", "Add Go and Python byproducts fixture") + lock = json.loads((self.root / "components.lock.json").read_text()) + lock["components"]["Agent-System-Backend"]["commit"] = self.call(self.backend, "git", "rev-parse", "HEAD").stdout.strip() + (self.root / "components.lock.json").write_text(json.dumps(lock)) + self.call(self.root, "git", "add", "components.lock.json") + self.call(self.root, "git", "commit", "-m", "Pin byproducts fixture") + self.call(self.root, "python3", "scripts/workspace.py", "--root", str(self.root), "prepare") + return self.root / ".workspace/Agent-System-Backend" + + def source_snapshot(self, child): + return {"head": self.call(child, "git", "rev-parse", "HEAD").stdout, + "branch": self.call(child, "git", "branch", "--show-current").stdout, + "index": (child / ".git/index").read_bytes(), + "status": self.call(child, "git", "status", "--porcelain", "--untracked-files=all").stdout, + "ignored": self.call(child, "git", "ls-files", "--others", "--ignored", "--exclude-standard").stdout, + "files": {path.relative_to(child).as_posix(): path.read_bytes() for path in child.rglob("*") + if path.is_file() and ".git" not in path.relative_to(child).parts}} + + def test_fixed_go_checks_keep_source_clean_across_pg_and_multi_instance(self): + child = self.add_go_byproduct_fixture() + suite = self.add_multi_instance_suite() + before = self.source_snapshot(child) + env = self.env | {"AGENT_PG_TEST_DSN": "fixture-dsn", "AGENT_REDIS_TEST_ADDR": "fixture-redis"} + self.call(self.root, "make", "test-backend-pg", env=env) + generated = self.call(child, "git", "ls-files", "--others", "--ignored", "--exclude-standard").stdout + print("fixed checkout byproducts after PostgreSQL fixture: " + repr(generated), flush=True) + self.call(self.root, "make", "test-multi-instance", env=env) + self.assertEqual(self.source_snapshot(child), before) self.assertTrue((suite / ".build/agent-system").is_file()) - self.assertFalse((self.root / ".workspace/tests").exists()) + + def test_fixed_go_failure_is_reported_without_polluting_source(self): + child = self.add_go_byproduct_fixture(fail=True) + before = self.source_snapshot(child) + result = self.call(self.root, "make", "test-backend", check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("deliberate fixture failure", result.stdout) + self.assertIn("local component command failed (1)", result.stdout) + self.assertEqual(self.source_snapshot(child), before) + + def test_fixed_go_checks_refuse_and_preserve_owner_changes_and_ignored_files(self): + child = self.add_go_byproduct_fixture() + for kind in ("unstaged", "staged", "ignored"): + with self.subTest(kind=kind): + if kind == "ignored": + (child / ".fixture-output").write_text("owner's unique ignored file") + else: + (child / "source.go").write_text('package backend\nfunc Value() string {return "owner-edit"}\n') + if kind == "staged": + self.call(child, "git", "add", "source.go") + before = self.source_snapshot(child) + result = self.call(self.root, "make", "test-backend", check=False) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertIn("dirty or ignored unique files", result.stdout) + self.assertEqual(self.source_snapshot(child), before) + # This fixture owns these files and its index; reset only between cases. + if kind != "ignored": + self.call(child, "git", "restore", "--source=HEAD", "--staged", "--worktree", "source.go") + + def test_pg_and_multi_instance_prerequisites_still_refuse_before_preparing_sources(self): + for target, supplied in (("test-backend-pg", {}), + ("test-backend-pg", {"AGENT_PG_TEST_DSN": "fixture-dsn"}), + ("test-multi-instance", {})): + with self.subTest(target=target, supplied=supplied): + env = {key: value for key, value in self.env.items() + if key not in ("AGENT_PG_TEST_DSN", "AGENT_REDIS_TEST_ADDR")} + result = self.call(self.root, "make", target, check=False, env=env | supplied) + self.assertNotEqual(result.returncode, 0, result.stdout) + self.assertFalse((self.root / ".workspace").exists()) def test_new_pin_gate_validates_fixed_sources_and_rejects_local_replaces(self): self.call(self.root, "python3", "scripts/workspace.py", "--root", str(self.root), "prepare") diff --git a/tests/test_dependency_ci.py b/tests/test_dependency_ci.py index 52b69995..60313452 100644 --- a/tests/test_dependency_ci.py +++ b/tests/test_dependency_ci.py @@ -90,6 +90,13 @@ class ComponentWorkflowFixtureTests(unittest.TestCase): class DependencyCITests(unittest.TestCase): + def test_boundary_gate_refuses_missing_ripgrep_before_resolving_sources(self): + with tempfile.TemporaryDirectory(prefix="boundary-no-tools-") as directory: + result = subprocess.run([shutil.which("bash"), str(WORKFLOW.parents[2] / "scripts/lint-boundaries.sh")], + cwd=directory, env=os.environ | {"PATH": directory}, capture_output=True, text=True) + self.assertEqual(result.returncode, 2, result.stdout + result.stderr) + self.assertIn("requires ripgrep", result.stderr) + def test_privileged_acquisition_finishes_before_candidate_execution_in_each_job(self): content = WORKFLOW.read_text() jobs = re.split(r"^ ([A-Za-z0-9_-]+):\n", content, flags=re.M) -- 2.54.0 From 12d875c615cdd8394b9b8bdb586bbca4c02b4241 Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 14 Oct 2026 02:30:49 +0000 Subject: [PATCH 24/29] Record isolated CI regression repairs before the final attempt Why: Retain actual platform failures and discriminating regression evidence while keeping human acceptance separate. Evidence: Reference complete SELF RED and GREEN receipts, actual private-dependency CI success and the preserved strict source gates. Impact: Freeze the new task record before current-head CI and independent supplemental review, without implying merge or deployment. Refs: R8-R10, R14-R15; dependency-workspace U5/U7 --- .task/feature-dependency-workspace.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md index cd399eba..b1fb2fea 100644 --- a/.task/feature-dependency-workspace.md +++ b/.task/feature-dependency-workspace.md @@ -117,6 +117,8 @@ ce-simplify-code 的 reuse/quality/efficiency 三个独立只读扫描完成。 用户另行明确批准「创建并配置独立只读凭据」(2026-10-14 Asia/Shanghai):允许独立 `read:repository` token 读取账号可访问的仓库,并仅配置 Frontend Actions 的 `SUBMODULE_TOKEN`。不复用管理 API token、不新增写权限。token 管理 API 要求 BasicAuth,实际通过已安装 Gitea 官方 CLI 的 OS git 用户创建,再经受信 API 配置;没有使用/询问账号密码,未在仓库、日志、聊天或本地文件保存凭据值。仅用途、scope、可用状态保存在 `/tmp/dependency-frontend-ci-read-credential-record-20261014-01a1345f.json`,完整 SELF 收据为 `/tmp/dependency-frontend-ci-read-credential-cli-20261014-01a1345f.json`。后续重跑必须核验实际私有依赖读取成功,不能用 secret 名称存在推断 CI 已通过。正式验收及所有 PR 合入仍待当前候选结果和阶段结论,发布/部署/回收未授权也未执行。 +后续平台反馈已定位并整改:Frontend 精确 5467517 的 run3032 新尝试和 UI 精确63d289e 的 run3031 实际 CI success;最终 GATE 链接与身份在源码外平台结果中核验。Dev run3036/RDM run3037 后续失败分别为缺 rg、固定检出被测试副产物污染、隔离 RDM 源缺可克隆 main head、夹具继承 acquisition 的 hooksPath。Root 代码 adb6cbc 保留现场守卫和全部原测试要求,仅将 versioned Go 检查放入一次性提交克隆,在三个 CI job 安装/核验 rg 并令缺工具 fail closed,隔离历史 RDM 仓的 main 指向明确 pin。SELF 实际 Go→Python 副产物 RED、连续检查/失败保留 GREEN 及原四项钩子夹具注入环境 RED→GREEN,见 `/tmp/dependency-u5-{components,hooks}-{red,green}-20261014.json` 和 `/tmp/dependency-u5-actual-backend-byproducts-20261014.json`;主控 11+4 项重放收据为 `/tmp/dependency-ci-isolation-host-green-20261014-01a1345f.json`,33 项 CI/凭据及真实 clone 重放为 `/tmp/dependency-lifecycle-prerequisites-green-20261014-01a1345f.json`。不放宽 dirty/ignored、PG/Redis 前提、认证隔离或 lifecycle 断言。固定后继续精确平台 GATE 和独立受影响复审,当前正式人工验收仍未评审。 + ```json { -- 2.54.0 From 00a3a2609c999caafc2bb6ac880b3f325682103f Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 14 Oct 2026 03:17:33 +0000 Subject: [PATCH 25/29] Keep merge-window test rule aligned with versioned dependencies (U6) Why: The unrelated main merge restored a gitlink-only test instruction in the queue policy, which omits the new language dependencies and application source lock. Evidence: SELF document and link check in /tmp/dependency-queue-terminology-check-20261014-01a1345f.json; git diff --check exits 0. Impact: Documentation wording only; existing manual queue and CI behavior are unchanged. Refs: Dev PR #537; Documents PR #100; R14 --- policy/merge-queue.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/policy/merge-queue.md b/policy/merge-queue.md index 1a59af31..50178684 100644 --- a/policy/merge-queue.md +++ b/policy/merge-queue.md @@ -113,7 +113,7 @@ SYNC_REQUIRED 不整体降级为 READY;local 与 delivery 用独立结果和 2. 在通用仓完成候选修订 Review 与其文档验证,按授权经 PR 合入;宿主采纳完整固定 SHA。 3. 另行提交实施计划,覆盖 task-sync 幂等化、恢复/写守卫兼容、源码外收据、CI 分配和能力矩阵。 4. 在隔离场景完成治理脚本正负例;涉及脚本必须运行 `make test-governance`。 -5. 跨仓 gitlink 正式推进前运行 Dev `make test`;最终对象的 CI/构建及平台准入遵循现行规则。 +5. 跨仓语言依赖或应用源码锁正式推进前运行 Dev `make test`;最终对象的 CI/构建及平台准入遵循现行规则。 6. 完成所有者平台操作和对应验证,登记真实协调者与调度 Issue,才切换新交付模式。 7. 用三个就绪任务试行,记录同步轮数、CI 次数/耗时、废弃运行、排队和恢复,复盘后决定扩大。 -- 2.54.0 From c5068ed82f7c27570b25ee122901772df0b1e15f Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 14 Oct 2026 03:37:54 +0000 Subject: [PATCH 26/29] Select the Frontend source that preserves export controls (U7) Why: Upstream Frontend PR #73 added export controls while the dependency migration branch was open; the fixed composition must include those user-visible changes. Evidence: SELF disposable merge at 74511db passed offline npm install, 264 tests, package consumer and production build in /tmp/dependency-frontend-upstream-replay-{install,test,build}-20261014-01a1345f.json; exact provider platform CI remains to be checked. Impact: Advances only the application Frontend source lock; Go and npm library versions remain under their language graphs. Full Dev combination validation follows before this branch is pushed. Refs: Dev PR #537; Frontend PR #84; upstream Frontend PR #73; R15 --- components.lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components.lock.json b/components.lock.json index 73f19882..e7505797 100644 --- a/components.lock.json +++ b/components.lock.json @@ -2,7 +2,7 @@ "schema": 1, "components": { "Agent-System-Frontend": { - "commit": "5467517e1831e7ca8b58bb5df52494a3a2c9d468" + "commit": "74511db9a6fb12e17954cb0c3f8e8846a6ecf831" }, "Agent-System-Backend": { "commit": "fffd5790cfab317fadafb40fa55a11bab6e9a847" -- 2.54.0 From e3a16cdfe6f4a49914a321f66606171a31462c41 Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 14 Oct 2026 04:03:20 +0000 Subject: [PATCH 27/29] Select the complete versioned-dependency guidance (U6) Why: The fixed general-standard source must include the queue rule that protects language dependencies and source locks from component rollback, alongside the already approved workspace guidance. Evidence: SELF R1-R15 documentation and focused queue/link checks passed in /tmp/dependency-guidelines-complete-doc-check-20261014-01a1345f.json and /tmp/dependency-guidelines-queue-consistency-20261014-01a1345f.json. Impact: Advances only the fixed Guidelines source commit. Runtime code and product dependency selection are unchanged; the final Dev combination must be revalidated before remote delivery. Refs: Dev PR #537; Guidelines PR #6; R13/R14 --- components.lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components.lock.json b/components.lock.json index e7505797..04ea348b 100644 --- a/components.lock.json +++ b/components.lock.json @@ -8,7 +8,7 @@ "commit": "fffd5790cfab317fadafb40fa55a11bab6e9a847" }, "Development-Guidelines": { - "commit": "1a842553b6a7432e5a85aaae43a45a7a7ea58195" + "commit": "db3824bfdbfdcad91d0941495719f04dbeaca053" }, "Agent-System-Documents": { "commit": "1de7d17110efaa5ed2ed30a44d415f28987f89f3" -- 2.54.0 From 3270abff016f2227b8a3894fa69645a5b61c6664 Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 14 Oct 2026 04:17:55 +0000 Subject: [PATCH 28/29] Select the Backend source preserving account transactions (U7) Why: Upstream Backend PR #185 changed account and audit behavior while the dependency branch was open. The fixed Dev app must select a source that includes those changes and the bounded test-gate corrections. Evidence: SELF 343-Go-file upstream parity, full Go test/vet and controlled sandbox RED/GREEN in /tmp/dependency-backend-after-185-{parity,all-go,vet}-20261014-01a1345f.json and /tmp/dependency-sandbox-host-collision-{red,green}-20261014-01a1345f.json. Impact: Advances only Backend application source lock. RDM and Go library versions remain independently selected; full Dev combination and current HEAD CI remain required before delivery. Refs: Dev PR #537; Backend PR #196; upstream Backend PR #185; R15 --- components.lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components.lock.json b/components.lock.json index 04ea348b..40ba6924 100644 --- a/components.lock.json +++ b/components.lock.json @@ -5,7 +5,7 @@ "commit": "74511db9a6fb12e17954cb0c3f8e8846a6ecf831" }, "Agent-System-Backend": { - "commit": "fffd5790cfab317fadafb40fa55a11bab6e9a847" + "commit": "48649a37ee92373c639a384a2c5a9dfaa2ec4bbb" }, "Development-Guidelines": { "commit": "db3824bfdbfdcad91d0941495719f04dbeaca053" -- 2.54.0 From 6a2f7cd3e610a263b6348efe9084e386dc88f30c Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 14 Oct 2026 05:32:44 +0000 Subject: [PATCH 29/29] Record final-window synchronization and local verification Why: Keep the migration task's current main baseline, preserved conflicts, fixed sources, and formal verification state reviewable before candidate CI. Evidence: SELF task-sync, fixed Frontend refresh, full test failures, Core SSH probe, and successful build receipts are recorded in the task card; current-head GATE remains pending. Impact: Record the fixed-port contention and transport stall without claiming a passing full local test or stage 7 acceptance. Refs: #537, #538, mq-dev-20261014-537-01 --- .task/feature-dependency-workspace.md | 668 ++++++++++++++++++++++++++ 1 file changed, 668 insertions(+) diff --git a/.task/feature-dependency-workspace.md b/.task/feature-dependency-workspace.md index b1fb2fea..4e323fd3 100644 --- a/.task/feature-dependency-workspace.md +++ b/.task/feature-dependency-workspace.md @@ -11792,3 +11792,671 @@ ce-simplify-code 的 reuse/quality/efficiency 三个独立只读扫描完成。 "receipt_sha256": "c24e4d9fe2938806963fd58bf3261dd0e4fcb6bd59a94db61feac60695a286c9" } ``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-14T05:11:42.000751+00:00", + "command": "make task-sync", + "command_sha256": "6c0e3c8fbb3f43d01548180c9d9c147ce1c1c32ba1e78d3383961de470fe0d52", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "6160dae6fb0d591ccbfc2d2c17fc003a2ce209b0", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "4f84c2e1630cd0311643529fae1c3a99f1dd5d64", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "74511db9a6fb12e17954cb0c3f8e8846a6ecf831", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "48649a37ee92373c639a384a2c5a9dfaa2ec4bbb", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "db3824bfdbfdcad91d0941495719f04dbeaca053", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "1de7d17110efaa5ed2ed30a44d415f28987f89f3", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "9075ff0f527b00ef8767db99d2e2a11783deace76babbffbff04cfdc5c8d255f", + "state_sha256": "00077b52438250f37b217eb353c2927c17350ca6e5d5ec8249f5f98f02873e2f" + } + }, + "after": { + "head": "6160dae6fb0d591ccbfc2d2c17fc003a2ce209b0", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "4f84c2e1630cd0311643529fae1c3a99f1dd5d64", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "74511db9a6fb12e17954cb0c3f8e8846a6ecf831", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "48649a37ee92373c639a384a2c5a9dfaa2ec4bbb", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "db3824bfdbfdcad91d0941495719f04dbeaca053", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "1de7d17110efaa5ed2ed30a44d415f28987f89f3", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "9075ff0f527b00ef8767db99d2e2a11783deace76babbffbff04cfdc5c8d255f", + "state_sha256": "00077b52438250f37b217eb353c2927c17350ca6e5d5ec8249f5f98f02873e2f" + } + }, + "after_error": null, + "exit_code": 0, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n[worktree] before-sync: recursive component checks passed\n[worktree] before-update: recursive component checks passed\n[workspace] fixed application, documentation and guidelines sources prepared; edit branches preserved\n[transition] retained legacy source deps/logging-system; inspect make workspace-transition NAME=Logging-System before explicit ARGS=--apply\n[transition] retained legacy source deps/error-code-system; inspect make workspace-transition NAME=Error-Code-System before explicit ARGS=--apply\n[transition] retained legacy source modules/core; inspect make workspace-transition NAME=Agent-System-Core before explicit ARGS=--apply\n[transition] retained legacy source modules/ui; inspect make workspace-transition NAME=Agent-System-UI before explicit ARGS=--apply\n[transition] retained legacy source modules/frontend; inspect make workspace-transition NAME=Agent-System-Frontend before explicit ARGS=--apply\n[transition] retained legacy source deps/agent-native; inspect make workspace-transition NAME=Agent-Native before explicit ARGS=--apply\n[transition] retained legacy source deps/agent-intent; inspect make workspace-transition NAME=Agent-Intent before explicit ARGS=--apply\n[transition] retained legacy source deps/agent-command; inspect make workspace-transition NAME=Agent-Command before explicit ARGS=--apply\n[transition] retained legacy source deps/agent-squad; inspect make workspace-transition NAME=Agent-Squad before explicit ARGS=--apply\n[transition] retained legacy source modules/backend; inspect make workspace-transition NAME=Agent-System-Backend before explicit ARGS=--apply\n[transition] retained legacy source deps/development-guidelines; inspect make workspace-transition NAME=Development-Guidelines before explicit ARGS=--apply\n[transition] retained legacy source modules/documents; inspect make workspace-transition NAME=Agent-System-Documents before explicit ARGS=--apply\n[worktree] materialize: recursive component checks passed\n[worktree] after-sync: recursive component checks passed\n[evidence] WARN JSON receipt line 123: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 162: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 200: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 238: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 276: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 314: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 352: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 391: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 429: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 468: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 506: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 544: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 582: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 620: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 658: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 696: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 758: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 820: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 884: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 944: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 1004: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 1070: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 1135: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 1287: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 1439: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 1591: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 1743: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 1873: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 2005: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 2149: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 2291: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 2443: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 2595: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 2747: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 2903: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 3063: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 3229: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 3397: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 3561: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 3725: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 3890: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 4056: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 4222: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 4388: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 4556: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 4724: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 4892: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 5060: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 5228: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 5398: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 5568: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 5736: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 5906: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 6078: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 6250: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 6422: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 6594: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 6766: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 6938: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 7110: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 7282: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 7454: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 7626: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 7798: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 7970: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 8142: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 8314: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 8486: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 8658: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 8830: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 9002: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 9174: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 9346: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 9518: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 9666: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 9822: unverified: receipt has no complete after object ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 9914: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 10078: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 10242: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 10406: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 10570: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 10734: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 10898: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 11062: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 11252: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 11442: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[evidence] WARN JSON receipt line 11633: unverified: recorded ordinary component/source-lock objects differ from the current objects ——关键检查须重跑并以 make evidence 重新写入\n[synced] sync_base=4f84c2e1630cd0311643529fae1c3a99f1dd5d64 tested_head=6160dae6fb0d591ccbfc2d2c17fc003a2ce209b0 checked_at=2026-10-14T05:11:50Z changed=0\n[next] 跑正式验收(make test 等),证据写入任务卡\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n", + "output_sha256": "87dd9f3157056783642fc531a1658071089ff2196164645a6e851fb540829e38", + "receipt_sha256": "7c6335d5e41b3c288b828a2d0c3fa058f1af5ede2e5b6a207f94a97d2cd79a8c" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-14T05:12:21.813701+00:00", + "command": "make test", + "command_sha256": "22cc66aa7d2624b4eb4d5b61658614cd6c32477b123afbf7dbc7fc3d7d0f3713", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "6160dae6fb0d591ccbfc2d2c17fc003a2ce209b0", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "4f84c2e1630cd0311643529fae1c3a99f1dd5d64", + "status": " M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "2539ef0c86ceaf82a2d9bb5b3651e5bf14c986190a4d9f244911048847ecb783", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "74511db9a6fb12e17954cb0c3f8e8846a6ecf831", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "48649a37ee92373c639a384a2c5a9dfaa2ec4bbb", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "db3824bfdbfdcad91d0941495719f04dbeaca053", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "1de7d17110efaa5ed2ed30a44d415f28987f89f3", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "9075ff0f527b00ef8767db99d2e2a11783deace76babbffbff04cfdc5c8d255f", + "state_sha256": "00077b52438250f37b217eb353c2927c17350ca6e5d5ec8249f5f98f02873e2f" + } + }, + "after": { + "head": "6160dae6fb0d591ccbfc2d2c17fc003a2ce209b0", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "4f84c2e1630cd0311643529fae1c3a99f1dd5d64", + "status": " M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "2539ef0c86ceaf82a2d9bb5b3651e5bf14c986190a4d9f244911048847ecb783", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "74511db9a6fb12e17954cb0c3f8e8846a6ecf831", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "48649a37ee92373c639a384a2c5a9dfaa2ec4bbb", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "db3824bfdbfdcad91d0941495719f04dbeaca053", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "1de7d17110efaa5ed2ed30a44d415f28987f89f3", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "9075ff0f527b00ef8767db99d2e2a11783deace76babbffbff04cfdc5c8d255f", + "state_sha256": "00077b52438250f37b217eb353c2927c17350ca6e5d5ec8249f5f98f02873e2f" + } + }, + "after_error": null, + "exit_code": 2, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\npython3 scripts/build-composition.py --root . --target test\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Frontend.git /tmp/agent-system-composition-e2fpjxpc/Agent-System-Frontend-git\nCloning into '/tmp/agent-system-composition-e2fpjxpc/Agent-System-Frontend-git'...\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Backend.git /tmp/agent-system-composition-e2fpjxpc/Agent-System-Backend-git\nCloning into '/tmp/agent-system-composition-e2fpjxpc/Agent-System-Backend-git'...\n[composition] npm ci --ignore-scripts --no-audit --no-fund\nnpm warn deprecated uuid@10.0.0: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).\n\nadded 178 packages in 4s\n[composition] npm cache add @babel/code-frame@7.29.7 @babel/compat-data@7.29.7 @babel/core@7.29.7 @babel/generator@7.29.8 @babel/helper-compilation-targets@7.29.7 @babel/helper-globals@7.29.7 @babel/helper-module-imports@7.29.7 @babel/helper-module-transforms@7.29.7 @babel/helper-plugin-utils@7.29.7 @babel/helper-string-parser@7.29.7 @babel/helper-validator-identifier@7.29.7 @babel/helper-validator-option@7.29.7 @babel/helpers@7.29.7 @babel/parser@7.29.9 @babel/plugin-transform-react-jsx-self@7.29.7 @babel/plugin-transform-react-jsx-source@7.29.7 @babel/template@7.29.7 @babel/traverse@7.29.8 @babel/types@7.29.8 @esbuild/linux-x64@0.25.12 @jridgewell/gen-mapping@0.3.13 @jridgewell/remapping@2.3.5 @jridgewell/resolve-uri@3.1.2 @jridgewell/sourcemap-codec@1.6.0 @jridgewell/trace-mapping@0.3.31 @napi-rs/lzma-linux-x64-gnu@1.5.1 @nodelib/fs.scandir@2.1.5 @nodelib/fs.stat@2.0.5 @nodelib/fs.walk@1.2.8 @oxc-resolver/binding-linux-x64-gnu@11.24.2 @playwright/test@1.64.0 @rolldown/pluginutils@1.0.0-beta.27 @rollup/rollup-linux-x64-gnu@4.63.5 @standard-schema/spec@1.1.0 @types/babel__core@7.20.5 @types/babel__generator@7.27.0 @types/babel__template@7.4.4 @types/babel__traverse@7.28.0 @types/chai@5.2.3 @types/deep-eql@4.0.2 @types/estree@1.0.9 @types/node@22.20.4 @types/react-dom@19.3.0 @types/react@19.3.0 @types/trusted-types@2.0.7 @vitejs/plugin-react@4.7.0 @vitest/expect@4.1.11 @vitest/mocker@4.1.11 @vitest/pretty-format@4.1.11 @vitest/runner@4.1.11 @vitest/snapshot@4.1.11 @vitest/spy@4.1.11 @vitest/utils@4.1.11 @xmldom/xmldom@0.8.15 adler-32@1.3.1 argparse@1.0.10 assertion-error@2.0.1 base64-js@1.5.1 baseline-browser-mapping@2.11.26 braces@3.0.3 browserslist@4.29.3 caniuse-lite@1.0.30001813 cfb@1.2.2 chai@6.2.2 codepage@1.15.0 convert-source-map@2.0.0 core-util-is@1.0.3 crc-32@1.2.2 csstype@3.2.3 debug@4.4.3 dingbat-to-unicode@1.0.2 docx-preview@0.4.1 dompurify@3.4.16 duck@0.1.12 echarts@5.6.0 electron-to-chromium@1.5.440 es-module-lexer@2.3.2 esbuild@0.25.12 escalade@3.2.0 estree-walker@3.0.3 expect-type@1.4.0 fast-glob@3.3.3 fastq@1.20.3 fd-package-json@2.0.0 fdir@6.5.0 fill-range@7.1.1 formatly@0.3.0 frac@1.1.2 gensync@1.0.0-beta.2 glob-parent@5.1.2 immediate@3.0.6 inherits@2.0.4 is-extglob@2.1.1 is-glob@4.0.3 is-number@7.0.0 isarray@1.0.0 jiti@2.7.0 js-tokens@4.0.0 jsesc@3.1.0 json5@2.2.3 jszip@3.10.2 knip@5.88.1 lie@3.3.0 lodash@4.18.1 lop@0.4.2 lru-cache@5.1.1 magic-string@0.30.21 mammoth@1.13.0 marked@15.0.12 merge2@1.4.1 micromatch@4.0.8 minimist@1.2.8 ms@2.1.3 nanoid@3.3.19 node-releases@2.0.57 obug@2.2.1 option@0.2.4 oxc-resolver@11.24.2 pako@1.0.11 pathe@2.0.3 picocolors@1.1.1 picomatch@2.3.2 picomatch@4.0.7 playwright-core@1.64.0 playwright@1.64.0 postcss@8.5.28 pptx-preview@1.0.7 process-nextick-args@2.0.1 queue-microtask@1.2.3 react-dom@19.3.0 react-refresh@0.17.0 react@19.3.0 readable-stream@2.3.8 reusify@1.1.0 rollup@4.63.5 run-parallel@1.2.0 safe-buffer@5.1.2 scheduler@0.28.0 semver@6.3.1 setimmediate@1.0.5 siginfo@2.0.0 smol-toml@1.9.0 source-map-js@1.2.1 sprintf-js@1.0.3 ssf@0.11.2 stackback@0.0.2 std-env@4.3.0 string_decoder@1.1.1 strip-json-comments@5.0.3 tinybench@2.9.0 tinyexec@1.3.1 tinyglobby@0.2.17 tinyrainbow@3.2.0 to-regex-range@5.0.1 tslib@2.3.0 tslib@2.8.1 typescript@5.9.3 unbash@2.2.0 underscore@1.13.8 undici-types@6.21.0 update-browserslist-db@1.3.3 util-deprecate@1.0.2 uuid@10.0.0 vite@6.4.3 vitest@4.1.11 walk-up-path@4.0.0 why-is-node-running@2.3.0 wmf@1.0.2 word@0.3.0 xlsx@0.18.5 xmlbuilder@10.1.1 yallist@3.1.1 yaml@2.9.1 zod@4.6.5 zrender@5.6.1 --ignore-scripts --registry=https://registry.npmjs.org --userconfig=/dev/null --globalconfig=/tmp/composition-npm-metadata-ul904q78/empty-global.npmrc\n[composition] go mod verify\nall modules verified\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Logging-System.git /tmp/agent-system-composition-e2fpjxpc/Logging-System-git\nCloning into '/tmp/agent-system-composition-e2fpjxpc/Logging-System-git'...\n[composition] go mod verify\nall modules verified\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Error-Code-System.git /tmp/agent-system-composition-e2fpjxpc/Error-Code-System-git\nCloning into '/tmp/agent-system-composition-e2fpjxpc/Error-Code-System-git'...\n[composition] go mod verify\nall modules verified\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Core.git /tmp/agent-system-composition-e2fpjxpc/Agent-System-Core-git\nCloning into '/tmp/agent-system-composition-e2fpjxpc/Agent-System-Core-git'...\n[composition] go mod verify\nall modules verified\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Native.git /tmp/agent-system-composition-e2fpjxpc/Agent-Native-git\nCloning into '/tmp/agent-system-composition-e2fpjxpc/Agent-Native-git'...\n[composition] go mod verify\nall modules verified\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Intent.git /tmp/agent-system-composition-e2fpjxpc/Agent-Intent-git\nCloning into '/tmp/agent-system-composition-e2fpjxpc/Agent-Intent-git'...\n[composition] go mod verify\nall modules verified\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Command.git /tmp/agent-system-composition-e2fpjxpc/Agent-Command-git\nCloning into '/tmp/agent-system-composition-e2fpjxpc/Agent-Command-git'...\n[composition] go mod verify\nall modules verified\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Squad.git /tmp/agent-system-composition-e2fpjxpc/Agent-Squad-git\nCloning into '/tmp/agent-system-composition-e2fpjxpc/Agent-Squad-git'...\n[composition] go mod verify\nall modules verified\n[composition] go mod verify\nall modules verified\n[composition] go mod verify\nall modules verified\n[composition] go mod verify\nall modules verified\n[composition] go mod verify\nall modules verified\n[composition] go mod verify\nall modules verified\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-UI.git /tmp/agent-system-composition-e2fpjxpc/Agent-System-UI-git\nCloning into '/tmp/agent-system-composition-e2fpjxpc/Agent-System-UI-git'...\n[composition] npm ci --ignore-scripts --no-audit --no-fund\n\nadded 1 package in 235ms\n[composition] npm cache add typescript@5.9.3 --ignore-scripts --registry=https://registry.npmjs.org --userconfig=/dev/null --globalconfig=/tmp/composition-npm-metadata-ri6ys0x9/empty-global.npmrc\n[composition] npm ci --ignore-scripts --no-audit --no-fund\nnpm warn deprecated whatwg-encoding@3.1.1: Use @exodus/bytes instead for a more spec-conformant and faster implementation\nnpm error An unknown git error occurred\nnpm error signal SIGTERM\nnpm error command git --no-replace-objects ls-remote ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Core.git\nnpm error Terminated\nnpm error A complete log of this run can be found in: /home/weichen/.npm/_logs/2026-10-14T05_12_41_927Z-debug-0.log\ncomposition: command failed (1): npm npm warn deprecated whatwg-encoding@3.1.1: Use @exodus/bytes instead for a more spec-conformant and faster implementation\nnpm error An unknown git error occurred\nnpm error signal SIGTERM\nnpm error command git --no-replace-objects ls-remote ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Core.git\nnpm error Terminated\nnpm error A complete log of this run can be found in: /home/weichen/.npm/_logs/2026-10-14T05_12_41_927Z-debug-0.log\nmake[1]: *** [Makefile:273: test] Error 2\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n", + "output_sha256": "0ae17f6ae23e2660a932af98302cd45b1f7ca1f391947351ef7e464b4153d047", + "receipt_sha256": "4089679f6f14bdc8d9da7ac0d28092864d791d72efcdfda47d9b6ad2d042b772" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-14T05:23:30.802885+00:00", + "command": "GIT_SSH_COMMAND='timeout 180 ssh -o BatchMode=yes -o ConnectTimeout=15 -o ServerAliveInterval=10 -o ServerAliveCountMax=3' make test", + "command_sha256": "16376cc333739a39cd6b975fafed44b0c42239393f8a749e5ac16daf2ac5759f", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "6160dae6fb0d591ccbfc2d2c17fc003a2ce209b0", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "4f84c2e1630cd0311643529fae1c3a99f1dd5d64", + "status": " M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "1b8fbd6f4eb75be43fe127a9d6859d24b90db60192148fb2b365def2aea80c50", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "74511db9a6fb12e17954cb0c3f8e8846a6ecf831", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "48649a37ee92373c639a384a2c5a9dfaa2ec4bbb", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "db3824bfdbfdcad91d0941495719f04dbeaca053", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "1de7d17110efaa5ed2ed30a44d415f28987f89f3", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "9075ff0f527b00ef8767db99d2e2a11783deace76babbffbff04cfdc5c8d255f", + "state_sha256": "00077b52438250f37b217eb353c2927c17350ca6e5d5ec8249f5f98f02873e2f" + } + }, + "after": { + "head": "6160dae6fb0d591ccbfc2d2c17fc003a2ce209b0", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "4f84c2e1630cd0311643529fae1c3a99f1dd5d64", + "status": " M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "1b8fbd6f4eb75be43fe127a9d6859d24b90db60192148fb2b365def2aea80c50", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "74511db9a6fb12e17954cb0c3f8e8846a6ecf831", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "48649a37ee92373c639a384a2c5a9dfaa2ec4bbb", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "db3824bfdbfdcad91d0941495719f04dbeaca053", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "1de7d17110efaa5ed2ed30a44d415f28987f89f3", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "9075ff0f527b00ef8767db99d2e2a11783deace76babbffbff04cfdc5c8d255f", + "state_sha256": "00077b52438250f37b217eb353c2927c17350ca6e5d5ec8249f5f98f02873e2f" + } + }, + "after_error": null, + "exit_code": 2, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\npython3 scripts/build-composition.py --root . --target test\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Frontend.git /tmp/agent-system-composition-b5be4j99/Agent-System-Frontend-git\nCloning into '/tmp/agent-system-composition-b5be4j99/Agent-System-Frontend-git'...\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Backend.git /tmp/agent-system-composition-b5be4j99/Agent-System-Backend-git\nCloning into '/tmp/agent-system-composition-b5be4j99/Agent-System-Backend-git'...\n[composition] npm ci --ignore-scripts --no-audit --no-fund\nnpm warn deprecated uuid@10.0.0: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).\n\nadded 178 packages in 3s\n[composition] npm cache add @babel/code-frame@7.29.7 @babel/compat-data@7.29.7 @babel/core@7.29.7 @babel/generator@7.29.8 @babel/helper-compilation-targets@7.29.7 @babel/helper-globals@7.29.7 @babel/helper-module-imports@7.29.7 @babel/helper-module-transforms@7.29.7 @babel/helper-plugin-utils@7.29.7 @babel/helper-string-parser@7.29.7 @babel/helper-validator-identifier@7.29.7 @babel/helper-validator-option@7.29.7 @babel/helpers@7.29.7 @babel/parser@7.29.9 @babel/plugin-transform-react-jsx-self@7.29.7 @babel/plugin-transform-react-jsx-source@7.29.7 @babel/template@7.29.7 @babel/traverse@7.29.8 @babel/types@7.29.8 @esbuild/linux-x64@0.25.12 @jridgewell/gen-mapping@0.3.13 @jridgewell/remapping@2.3.5 @jridgewell/resolve-uri@3.1.2 @jridgewell/sourcemap-codec@1.6.0 @jridgewell/trace-mapping@0.3.31 @napi-rs/lzma-linux-x64-gnu@1.5.1 @nodelib/fs.scandir@2.1.5 @nodelib/fs.stat@2.0.5 @nodelib/fs.walk@1.2.8 @oxc-resolver/binding-linux-x64-gnu@11.24.2 @playwright/test@1.64.0 @rolldown/pluginutils@1.0.0-beta.27 @rollup/rollup-linux-x64-gnu@4.63.5 @standard-schema/spec@1.1.0 @types/babel__core@7.20.5 @types/babel__generator@7.27.0 @types/babel__template@7.4.4 @types/babel__traverse@7.28.0 @types/chai@5.2.3 @types/deep-eql@4.0.2 @types/estree@1.0.9 @types/node@22.20.4 @types/react-dom@19.3.0 @types/react@19.3.0 @types/trusted-types@2.0.7 @vitejs/plugin-react@4.7.0 @vitest/expect@4.1.11 @vitest/mocker@4.1.11 @vitest/pretty-format@4.1.11 @vitest/runner@4.1.11 @vitest/snapshot@4.1.11 @vitest/spy@4.1.11 @vitest/utils@4.1.11 @xmldom/xmldom@0.8.15 adler-32@1.3.1 argparse@1.0.10 assertion-error@2.0.1 base64-js@1.5.1 baseline-browser-mapping@2.11.26 braces@3.0.3 browserslist@4.29.3 caniuse-lite@1.0.30001813 cfb@1.2.2 chai@6.2.2 codepage@1.15.0 convert-source-map@2.0.0 core-util-is@1.0.3 crc-32@1.2.2 csstype@3.2.3 debug@4.4.3 dingbat-to-unicode@1.0.2 docx-preview@0.4.1 dompurify@3.4.16 duck@0.1.12 echarts@5.6.0 electron-to-chromium@1.5.440 es-module-lexer@2.3.2 esbuild@0.25.12 escalade@3.2.0 estree-walker@3.0.3 expect-type@1.4.0 fast-glob@3.3.3 fastq@1.20.3 fd-package-json@2.0.0 fdir@6.5.0 fill-range@7.1.1 formatly@0.3.0 frac@1.1.2 gensync@1.0.0-beta.2 glob-parent@5.1.2 immediate@3.0.6 inherits@2.0.4 is-extglob@2.1.1 is-glob@4.0.3 is-number@7.0.0 isarray@1.0.0 jiti@2.7.0 js-tokens@4.0.0 jsesc@3.1.0 json5@2.2.3 jszip@3.10.2 knip@5.88.1 lie@3.3.0 lodash@4.18.1 lop@0.4.2 lru-cache@5.1.1 magic-string@0.30.21 mammoth@1.13.0 marked@15.0.12 merge2@1.4.1 micromatch@4.0.8 minimist@1.2.8 ms@2.1.3 nanoid@3.3.19 node-releases@2.0.57 obug@2.2.1 option@0.2.4 oxc-resolver@11.24.2 pako@1.0.11 pathe@2.0.3 picocolors@1.1.1 picomatch@2.3.2 picomatch@4.0.7 playwright-core@1.64.0 playwright@1.64.0 postcss@8.5.28 pptx-preview@1.0.7 process-nextick-args@2.0.1 queue-microtask@1.2.3 react-dom@19.3.0 react-refresh@0.17.0 react@19.3.0 readable-stream@2.3.8 reusify@1.1.0 rollup@4.63.5 run-parallel@1.2.0 safe-buffer@5.1.2 scheduler@0.28.0 semver@6.3.1 setimmediate@1.0.5 siginfo@2.0.0 smol-toml@1.9.0 source-map-js@1.2.1 sprintf-js@1.0.3 ssf@0.11.2 stackback@0.0.2 std-env@4.3.0 string_decoder@1.1.1 strip-json-comments@5.0.3 tinybench@2.9.0 tinyexec@1.3.1 tinyglobby@0.2.17 tinyrainbow@3.2.0 to-regex-range@5.0.1 tslib@2.3.0 tslib@2.8.1 typescript@5.9.3 unbash@2.2.0 underscore@1.13.8 undici-types@6.21.0 update-browserslist-db@1.3.3 util-deprecate@1.0.2 uuid@10.0.0 vite@6.4.3 vitest@4.1.11 walk-up-path@4.0.0 why-is-node-running@2.3.0 wmf@1.0.2 word@0.3.0 xlsx@0.18.5 xmlbuilder@10.1.1 yallist@3.1.1 yaml@2.9.1 zod@4.6.5 zrender@5.6.1 --ignore-scripts --registry=https://registry.npmjs.org --userconfig=/dev/null --globalconfig=/tmp/composition-npm-metadata-onlxupxw/empty-global.npmrc\n[composition] go mod verify\nall modules verified\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Logging-System.git /tmp/agent-system-composition-b5be4j99/Logging-System-git\nCloning into '/tmp/agent-system-composition-b5be4j99/Logging-System-git'...\n[composition] go mod verify\nall modules verified\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Error-Code-System.git /tmp/agent-system-composition-b5be4j99/Error-Code-System-git\nCloning into '/tmp/agent-system-composition-b5be4j99/Error-Code-System-git'...\n[composition] go mod verify\nall modules verified\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Core.git /tmp/agent-system-composition-b5be4j99/Agent-System-Core-git\nCloning into '/tmp/agent-system-composition-b5be4j99/Agent-System-Core-git'...\n[composition] go mod verify\nall modules verified\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Native.git /tmp/agent-system-composition-b5be4j99/Agent-Native-git\nCloning into '/tmp/agent-system-composition-b5be4j99/Agent-Native-git'...\n[composition] go mod verify\nall modules verified\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Intent.git /tmp/agent-system-composition-b5be4j99/Agent-Intent-git\nCloning into '/tmp/agent-system-composition-b5be4j99/Agent-Intent-git'...\n[composition] go mod verify\nall modules verified\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Command.git /tmp/agent-system-composition-b5be4j99/Agent-Command-git\nCloning into '/tmp/agent-system-composition-b5be4j99/Agent-Command-git'...\n[composition] go mod verify\nall modules verified\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-Squad.git /tmp/agent-system-composition-b5be4j99/Agent-Squad-git\nCloning into '/tmp/agent-system-composition-b5be4j99/Agent-Squad-git'...\n[composition] go mod verify\nall modules verified\n[composition] go mod verify\nall modules verified\n[composition] go mod verify\nall modules verified\n[composition] go mod verify\nall modules verified\n[composition] go mod verify\nall modules verified\n[composition] go mod verify\nall modules verified\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-UI.git /tmp/agent-system-composition-b5be4j99/Agent-System-UI-git\nCloning into '/tmp/agent-system-composition-b5be4j99/Agent-System-UI-git'...\n[composition] npm ci --ignore-scripts --no-audit --no-fund\n\nadded 1 package in 158ms\n[composition] npm cache add typescript@5.9.3 --ignore-scripts --registry=https://registry.npmjs.org --userconfig=/dev/null --globalconfig=/tmp/composition-npm-metadata-qu2kyfo2/empty-global.npmrc\n[composition] npm ci --ignore-scripts --no-audit --no-fund\nnpm warn deprecated whatwg-encoding@3.1.1: Use @exodus/bytes instead for a more spec-conformant and faster implementation\n\nadded 163 packages in 1s\n[composition] npm cache add @asamuzakjp/css-color@3.2.0 @babel/code-frame@7.29.7 @babel/helper-validator-identifier@7.29.7 @babel/runtime@7.29.7 @csstools/color-helpers@5.1.0 @csstools/css-calc@2.1.4 @csstools/css-color-parser@3.1.0 @csstools/css-parser-algorithms@3.0.5 @csstools/css-tokenizer@3.0.4 @jridgewell/sourcemap-codec@1.6.0 @nodelib/fs.scandir@2.1.5 @nodelib/fs.stat@2.0.5 @nodelib/fs.walk@1.2.8 @oxc-project/types@0.152.0 @oxc-resolver/binding-linux-x64-gnu@11.24.2 @rolldown/binding-linux-x64-gnu@1.2.12 @rolldown/pluginutils@1.0.1 @standard-schema/spec@1.1.0 @testing-library/dom@10.4.2 @testing-library/react@16.3.3 @types/aria-query@5.0.4 @types/chai@5.2.3 @types/deep-eql@4.0.2 @types/estree@1.0.9 @types/node@22.20.4 @types/react-dom@19.3.0 @types/react@19.3.0 @types/trusted-types@2.0.7 @vitest/expect@4.1.11 @vitest/mocker@4.1.11 @vitest/pretty-format@4.1.11 @vitest/runner@4.1.11 @vitest/snapshot@4.1.11 @vitest/spy@4.1.11 @vitest/utils@4.1.11 agent-base@7.1.4 ansi-regex@5.0.1 ansi-styles@5.2.0 aria-query@5.3.0 assertion-error@2.0.1 asynckit@0.4.0 braces@3.0.3 call-bind-apply-helpers@1.0.2 chai@6.2.2 combined-stream@1.0.8 convert-source-map@2.0.0 cssstyle@4.6.0 csstype@3.2.3 data-urls@5.0.0 debug@4.4.3 decimal.js@10.6.0 delayed-stream@1.0.0 dequal@2.0.3 detect-libc@2.1.2 dom-accessibility-api@0.5.16 dompurify@3.4.16 dunder-proto@1.0.1 entities@6.0.1 es-define-property@1.0.1 es-errors@1.3.0 es-module-lexer@2.3.2 es-object-atoms@1.1.2 es-set-tostringtag@2.1.0 estree-walker@3.0.3 expect-type@1.4.0 fast-glob@3.3.3 fastq@1.20.3 fd-package-json@2.0.0 fdir@6.5.0 fill-range@7.1.1 form-data@4.0.6 formatly@0.3.0 function-bind@1.1.2 get-intrinsic@1.3.0 get-proto@1.0.1 glob-parent@5.1.2 gopd@1.2.0 has-symbols@1.1.0 has-tostringtag@1.0.2 hasown@2.0.4 html-encoding-sniffer@4.0.0 http-proxy-agent@7.0.2 https-proxy-agent@7.0.6 iconv-lite@0.6.3 is-extglob@2.1.1 is-glob@4.0.3 is-number@7.0.0 is-potential-custom-element-name@1.0.1 jiti@2.7.0 js-tokens@4.0.0 jsdom@25.0.1 knip@5.88.1 lightningcss-linux-x64-gnu@1.33.0 lightningcss@1.33.0 lru-cache@10.4.3 lz-string@1.5.0 magic-string@0.30.21 marked@15.0.12 math-intrinsics@1.1.0 merge2@1.4.1 micromatch@4.0.8 mime-db@1.52.0 mime-types@2.1.35 minimist@1.2.8 ms@2.1.3 nanoid@3.3.19 nwsapi@2.2.28 obug@2.2.1 oxc-resolver@11.24.2 parse5@7.3.0 pathe@2.0.3 picocolors@1.1.1 picomatch@2.3.2 picomatch@4.0.7 postcss@8.5.28 pretty-format@27.5.1 punycode@2.3.1 queue-microtask@1.2.3 react-dom@19.3.0 react-is@17.0.2 react@19.3.0 reusify@1.1.0 rolldown@1.2.12 rrweb-cssom@0.7.1 rrweb-cssom@0.8.0 run-parallel@1.2.0 safer-buffer@2.1.2 saxes@6.0.0 scheduler@0.28.0 siginfo@2.0.0 smol-toml@1.9.0 source-map-js@1.2.2 stackback@0.0.2 std-env@4.3.0 strip-json-comments@5.0.3 symbol-tree@3.2.4 tinybench@2.9.0 tinyexec@1.3.1 tinyglobby@0.2.17 tinyrainbow@3.2.0 tldts-core@6.1.86 tldts@6.1.86 to-regex-range@5.0.1 tough-cookie@5.1.2 tr46@5.1.1 typescript@5.9.3 unbash@2.2.0 undici-types@6.21.0 vite@8.3.1 vitest@4.1.11 w3c-xmlserializer@5.0.0 walk-up-path@4.0.0 webidl-conversions@7.0.0 whatwg-encoding@3.1.1 whatwg-mimetype@4.0.0 whatwg-url@14.2.0 why-is-node-running@2.3.0 ws@8.22.0 xml-name-validator@5.0.0 xmlchars@2.2.0 yaml@2.9.1 zod@4.6.5 --ignore-scripts --registry=https://registry.npmjs.org --userconfig=/dev/null --globalconfig=/tmp/composition-npm-metadata-31teyflk/empty-global.npmrc\n[composition] npm run build\n\n(!) Some chunks are larger than 500 kB after minification. Consider:\n- Using dynamic import() to code-split the application\n- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks\n- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.\n\n> agent-system-frontend@0.1.0 build\n> tsc -b && vite build\n\nvite v6.4.3 building for production...\ntransforming...\n✓ 1015 modules transformed.\nrendering chunks...\ncomputing gzip size...\ndist/index.html 0.40 kB │ gzip: 0.27 kB\ndist/assets/index-BWPiL_PS.css 93.18 kB │ gzip: 16.04 kB\ndist/assets/jszip.min-d-4Zmon1.js 0.12 kB │ gzip: 0.12 kB\ndist/assets/docx-preview-6sU_ku0G.js 77.41 kB │ gzip: 21.29 kB\ndist/assets/jszip.min-kSHCEEHx.js 97.26 kB │ gzip: 30.16 kB\ndist/assets/index-DoGujINZ.js 213.14 kB │ gzip: 70.03 kB\ndist/assets/xlsx-CkFp8p6R.js 429.53 kB │ gzip: 143.07 kB\ndist/assets/index-Ctb2bcvo.js 561.83 kB │ gzip: 175.12 kB\ndist/assets/pptx-preview.es-Dtz_cWFU.js 1,255.23 kB │ gzip: 401.46 kB\n✓ built in 4.71s\n[composition] npm test\n(node:2364427) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2364340) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2364335) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2364336) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2364423) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2364432) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2364433) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2364435) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2364520) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2364337) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:2364341) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n\n> agent-system-frontend@0.1.0 test\n> vitest run && npm run test:packages\n\n\n RUN v4.1.11 /tmp/agent-system-composition-b5be4j99/Agent-System-Frontend\n\n\n Test Files 33 passed (33)\n Tests 264 passed (264)\n Start at 05:24:00\n Duration 582ms (transform 2.51s, setup 0ms, import 4.41s, tests 555ms, environment 2ms)\n\n\n> agent-system-frontend@0.1.0 test:packages\n> node --test scripts/test-packages.mjs\n\nnpm warn deprecated uuid@10.0.0: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).\n\nadded 178 packages in 952ms\n\n> agent-system-frontend@0.1.0 build\n> tsc -b && vite build\n\nvite v6.4.3 building for production...\ntransforming...\n✓ 1015 modules transformed.\nrendering chunks...\ncomputing gzip size...\ndist/index.html 0.40 kB │ gzip: 0.27 kB\ndist/assets/index-BWPiL_PS.css 93.18 kB │ gzip: 16.04 kB\ndist/assets/jszip.min-d-4Zmon1.js 0.12 kB │ gzip: 0.12 kB\ndist/assets/docx-preview-6sU_ku0G.js 77.41 kB │ gzip: 21.29 kB\ndist/assets/jszip.min-kSHCEEHx.js 97.26 kB │ gzip: 30.16 kB\ndist/assets/index-DoGujINZ.js 213.14 kB │ gzip: 70.03 kB\ndist/assets/xlsx-CkFp8p6R.js 429.53 kB │ gzip: 143.07 kB\ndist/assets/index-Ctb2bcvo.js 561.83 kB │ gzip: 175.12 kB\ndist/assets/pptx-preview.es-Dtz_cWFU.js 1,255.23 kB │ gzip: 401.46 kB\n\n(!) Some chunks are larger than 500 kB after minification. Consider:\n- Using dynamic import() to code-split the application\n- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks\n- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.\n✓ built in 4.69s\n✔ the application builds from packed dependencies without UI or Core source siblings (8556.699826ms)\nℹ tests 1\nℹ suites 0\nℹ pass 1\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 8594.745333\n[composition] go test -mod=readonly ./...\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/cmd/agent-system\t0.274s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/cmd/storage-migrate\t0.045s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/eval\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/app\t0.483s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/blobstore\t0.005s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/bus\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/cardsvc\t0.180s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/cmdbus\t0.025s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/config\t0.005s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ctxasm\t0.005s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/docgen\t0.007s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/evalgold\t0.004s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/genui\t0.105s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/hostapi\t0.044s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ingest\t0.833s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/intentgate\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/intentsem\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/pgbus\t0.004s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/plugins\t0.311s\n? \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/profiles\t[no test files]\n? \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/projectscope\t[no test files]\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/prompts\t0.078s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/quality\t0.193s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/rag\t0.183s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/ratelimit\t0.254s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/route\t0.004s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/runmgr\t1.179s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/runtime\t1.701s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/server\t9.135s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/settings\t0.020s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/skills\t1.805s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/squadadapter\t0.170s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/store\t4.627s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/surfacesvc\t0.213s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/tools\t13.315s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/wfcompile\t0.049s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/internal/workflow\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/extension\t0.003s\n? \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/extension/link\t[no test files]\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/pkg/identity\t0.041s\n? \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Backend.git/web\t[no test files]\n[composition] go vet -mod=readonly ./...\n[composition] go test -mod=readonly ./...\n? \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git\t[no test files]\nok \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git/cli\t0.004s\nok \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git/config\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git/conformance\t0.041s\nok \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git/logsys\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git/redact\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git/server\t0.054s\nok \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git/sink\t0.013s\nok \tgit-ssh.u1680832.nyat.app/weichen/Logging-System.git/slogadapter\t0.002s\n[composition] go vet -mod=readonly ./...\n[composition] go test -mod=readonly ./...\n? \tgit-ssh.u1680832.nyat.app/weichen/Error-Code-System.git\t[no test files]\nok \tgit-ssh.u1680832.nyat.app/weichen/Error-Code-System.git/cli\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Error-Code-System.git/conformance\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Error-Code-System.git/domains\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Error-Code-System.git/errcode\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Error-Code-System.git/httpx\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Error-Code-System.git/server\t0.003s\n[composition] go vet -mod=readonly ./...\n[composition] go test -mod=readonly ./...\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-System-Core.git\t0.003s\n[composition] go vet -mod=readonly ./...\n[composition] go test -mod=readonly ./...\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/adapters/native\t0.213s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/adapters/pitransport\t0.043s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/catalogcheck\t0.002s\n? \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/cmd/agent-native\t[no test files]\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/conformance\t0.052s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/exec\t0.151s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/rpc\t0.004s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime\t1.398s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/agentspec\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/checkpoint\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/codeorch\t0.104s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/ext\t0.024s\n? \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/ext/pkg\t[no test files]\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/filestate\t0.022s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/gates\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/guardrails\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/hooks\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/llm\t0.242s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/mcp\t13.246s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/memory\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/policy\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/promptx\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/reminders\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/resources\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/session\t0.009s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/skills\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/subagent\t0.004s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/telemetry\t0.004s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/runtime/tools\t11.281s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Native.git/schema\t0.002s\n[composition] go vet -mod=readonly ./...\n[composition] go test -mod=readonly ./...\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Intent.git/catalogcheck\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Intent.git/cmd/intentctl\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Intent.git/conformance\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Intent.git/examples\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Intent.git/intent\t0.006s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Intent.git/schema\t0.002s\n[composition] go vet -mod=readonly ./...\n[composition] go test -mod=readonly ./...\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Command.git\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Command.git/conformance\t0.001s\n[composition] go vet -mod=readonly ./...\n[composition] go test -mod=readonly ./...\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/schema\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/squad\t0.957s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/store\t0.003s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/textextract\t0.002s\n[composition] go vet -mod=readonly ./...\n[composition] go test -mod=readonly ./...\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/adapters/native\t0.002s\n[composition] go vet -mod=readonly ./...\n[composition] go test -mod=readonly ./...\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/adapters/intent\t0.008s\n[composition] go vet -mod=readonly ./...\n[composition] go test -mod=readonly ./...\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/adapters/sqlite\t0.017s\n[composition] go vet -mod=readonly ./...\n[composition] go test -mod=readonly ./...\n? \tgit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/cmd/agent-squad\t[no test files]\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/cmd/agent-squad/cli\t0.002s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/cmd/agent-squad/conformance\t0.004s\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/cmd/agent-squad/server\t0.568s\n[composition] go vet -mod=readonly ./...\n[composition] go test -mod=readonly ./...\nok \tgit-ssh.u1680832.nyat.app/weichen/Agent-Squad.git/adapters/a2a\t0.020s\n[composition] go vet -mod=readonly ./...\n[composition] npm run typecheck\n\n> @agent-system/contracts@0.1.0 typecheck\n> tsc -p tsconfig.package.json --noEmit\n\n[composition] npm run test\n\n> @agent-system/contracts@0.1.0 test\n> npm run check:package && node --test scripts/test-package.mjs\n\n\n> @agent-system/contracts@0.1.0 check:package\n> node scripts/build-package.mjs --check\n\n✔ packed contracts compile in a consumer without the Core checkout (850.069094ms)\nℹ tests 1\nℹ suites 0\nℹ pass 1\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 891.610684\n[composition] npm run typecheck\n\n> @agent-system/ui@0.1.0 typecheck\n> tsc --noEmit\n\n[composition] npm run test\n\n> @agent-system/ui@0.1.0 test\n> vitest run && npm run test:package\n\n\n RUN v4.1.11 /tmp/agent-system-composition-b5be4j99/Agent-System-UI\n\n\n Test Files 18 passed (18)\n Tests 162 passed (162)\n Start at 05:24:49\n Duration 1.15s (transform 995ms, setup 0ms, import 2.51s, tests 2.30s, environment 5.17s)\n\n\n> @agent-system/ui@0.1.0 test:package\n> npm run check:package && node --test scripts/test-package.mjs\n\n\n> @agent-system/ui@0.1.0 check:package\n> node scripts/build-package.mjs --check\n\n✔ packed UI renders and exposes CSS and types without adjacent source checkouts (1446.962577ms)\nℹ tests 1\nℹ suites 0\nℹ pass 1\nℹ fail 0\nℹ cancelled 0\nℹ skipped 0\nℹ todo 0\nℹ duration_ms 1490.06076\n[composition] bash scripts/lint-boundaries.sh\narchitecture ok (85 edges)\narchitecture negative ok\nboundaries ok\n[composition] bash scripts/check-pins.sh\nok fixed source Agent-System-Frontend\nok fixed source Agent-System-Backend\nok fixed source Logging-System\nok fixed source Error-Code-System\nok fixed source Agent-System-Core\nok fixed source Agent-Native\nok fixed source Agent-Intent\nok fixed source Agent-Command\nok fixed source Agent-Squad\nok fixed source Agent-System-UI\nversion authorities ok (source lock / go.mod / npm lock; no gitlink alignment)\n[composition] make test-governance\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_backend_check_prepares_fixed_source_and_replays_owner_edits (test_component_checks.ComponentCheckTests.test_backend_check_prepares_fixed_source_and_replays_owner_edits) ... ok\ntest_explicit_overlay_uses_registered_workspace_and_preserves_default_version_mode (test_component_checks.ComponentCheckTests.test_explicit_overlay_uses_registered_workspace_and_preserves_default_version_mode) ... ok\ntest_fixed_go_checks_keep_source_clean_across_pg_and_multi_instance (test_component_checks.ComponentCheckTests.test_fixed_go_checks_keep_source_clean_across_pg_and_multi_instance) ... ok\ntest_fixed_go_checks_refuse_and_preserve_owner_changes_and_ignored_files (test_component_checks.ComponentCheckTests.test_fixed_go_checks_refuse_and_preserve_owner_changes_and_ignored_files) ... ok\ntest_fixed_go_failure_is_reported_without_polluting_source (test_component_checks.ComponentCheckTests.test_fixed_go_failure_is_reported_without_polluting_source) ... ok\ntest_make_pin_gate_uses_map_in_gitless_formal_root_and_ignores_external_rdm_identity (test_component_checks.ComponentCheckTests.test_make_pin_gate_uses_map_in_gitless_formal_root_and_ignores_external_rdm_identity) ... ok\ntest_multi_instance_binary_is_built_inside_dev_root_and_reached_by_suite (test_component_checks.ComponentCheckTests.test_multi_instance_binary_is_built_inside_dev_root_and_reached_by_suite) ... ok\ntest_new_pin_gate_validates_fixed_sources_and_rejects_local_replaces (test_component_checks.ComponentCheckTests.test_new_pin_gate_validates_fixed_sources_and_rejects_local_replaces) ... ok\ntest_pg_and_multi_instance_prerequisites_still_refuse_before_preparing_sources (test_component_checks.ComponentCheckTests.test_pg_and_multi_instance_prerequisites_still_refuse_before_preparing_sources) ... ok\ntest_pg_gate_requires_environment_and_forwards_it_to_real_go_tests (test_component_checks.ComponentCheckTests.test_pg_gate_requires_environment_and_forwards_it_to_real_go_tests) ... ok\ntest_registered_private_transport_reaches_real_go_process_without_global_change (test_component_checks.ComponentCheckTests.test_registered_private_transport_reaches_real_go_process_without_global_change) ... ok\ntest_before_sync_rejects_component_git_lock (test_component_governance.ComponentGovernanceTests.test_before_sync_rejects_component_git_lock) ... ok\ntest_evidence_captures_ignored_component_revision_and_dirty_bytes (test_component_governance.ComponentGovernanceTests.test_evidence_captures_ignored_component_revision_and_dirty_bytes) ... ok\ntest_new_layout_cannot_use_receipt_without_component_identity (test_component_governance.ComponentGovernanceTests.test_new_layout_cannot_use_receipt_without_component_identity) ... ok\ntest_receipts_reject_component_path_escape (test_component_governance.ComponentGovernanceTests.test_receipts_reject_component_path_escape) ... ok\ntest_startup_receipt_rejects_changed_ignored_component_objects (test_component_governance.ComponentGovernanceTests.test_startup_receipt_rejects_changed_ignored_component_objects) ... ok\ntest_all_product_acquisition_precedes_candidate_execution (test_composition.CompositionTests.test_all_product_acquisition_precedes_candidate_execution) ... ok\ntest_developer_package_tarball_overrides_do_not_reach_formal_tests (test_composition.CompositionTests.test_developer_package_tarball_overrides_do_not_reach_formal_tests) ... ok\ntest_dirty_root_composer_cannot_publish_under_committed_identity (test_composition.CompositionTests.test_dirty_root_composer_cannot_publish_under_committed_identity) ... ok\ntest_dirty_root_lock_is_rejected (test_composition.CompositionTests.test_dirty_root_lock_is_rejected) ... ok\ntest_dirty_root_transport_is_refused_before_import (test_composition.CompositionTests.test_dirty_root_transport_is_refused_before_import) ... ok\ntest_fixed_commits_embed_assets_without_touching_developer_checkout (test_composition.CompositionTests.test_fixed_commits_embed_assets_without_touching_developer_checkout) ... ok\ntest_fixed_root_governance_and_boundaries_receive_proven_source_map (test_composition.CompositionTests.test_fixed_root_governance_and_boundaries_receive_proven_source_map) ... ok\ntest_frontend_dist_symlink_cannot_import_assets_from_outside_source (test_composition.CompositionTests.test_frontend_dist_symlink_cannot_import_assets_from_outside_source) ... ok\ntest_historical_rdm_product_still_builds_from_legacy_pins (test_composition.CompositionTests.test_historical_rdm_product_still_builds_from_legacy_pins) ... ok\ntest_local_go_replace_is_rejected (test_composition.CompositionTests.test_local_go_replace_is_rejected) ... ok\ntest_locked_missing_revision_is_rejected (test_composition.CompositionTests.test_locked_missing_revision_is_rejected) ... ok\ntest_missing_frontend_assets_fails_before_publishing_binary (test_composition.CompositionTests.test_missing_frontend_assets_fails_before_publishing_binary) ... ok\ntest_modified_go_module_cache_is_rejected_before_product_publication (test_composition.CompositionTests.test_modified_go_module_cache_is_rejected_before_product_publication) ... ok\ntest_npm_local_dependency_overlay_is_rejected (test_composition.CompositionTests.test_npm_local_dependency_overlay_is_rejected) ... ok\ntest_project_test_mode_refuses_missing_boundary_gate (test_composition.CompositionTests.test_project_test_mode_refuses_missing_boundary_gate) ... ok\ntest_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock (test_composition.CompositionTests.test_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock) ... ok\ntest_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache (test_composition.CompositionTests.test_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache) ... ok\ntest_source_path_escape_is_rejected (test_composition.CompositionTests.test_source_path_escape_is_rejected) ... ok\ntest_test_target_checks_fixed_go_library_and_ui_sources (test_composition.CompositionTests.test_test_target_checks_fixed_go_library_and_ui_sources) ... ok\ntest_test_target_runs_real_frontend_and_go_tests (test_composition.CompositionTests.test_test_target_runs_real_frontend_and_go_tests) ... ok\ntest_unused_transitive_zip_does_not_require_consumer_sum_rewrite (test_composition.CompositionTests.test_unused_transitive_zip_does_not_require_consumer_sum_rewrite) ... ok\ntest_version_and_plugin_assets_come_from_committed_root (test_composition.CompositionTests.test_version_and_plugin_assets_come_from_committed_root) ... ok\ntest_versioned_rdm_product_entry_uses_fixed_composer (test_composition.CompositionTests.test_versioned_rdm_product_entry_uses_fixed_composer) ... skipped 'external RDM source was not supplied; host must replay the actual wrapper'\ntest_locked_metadata_is_acquired_before_offline_consumer_without_credentials (test_composition.NpmAcquisitionTests.test_locked_metadata_is_acquired_before_offline_consumer_without_credentials) ... ok\ntest_unreviewed_tarball_source_is_refused_before_acquisition (test_composition.NpmAcquisitionTests.test_unreviewed_tarball_source_is_refused_before_acquisition) ... ok\ntest_all_required_component_snapshots_have_fixed_provenance (test_dependency_ci.ComponentWorkflowFixtureTests.test_all_required_component_snapshots_have_fixed_provenance) ... ok\ntest_missing_component_snapshot_is_not_skipped (test_dependency_ci.ComponentWorkflowFixtureTests.test_missing_component_snapshot_is_not_skipped) ... ok\ntest_modified_workflow_snapshot_is_rejected_before_execution (test_dependency_ci.ComponentWorkflowFixtureTests.test_modified_workflow_snapshot_is_rejected_before_execution) ... ok\ntest_omitted_repository_provenance_is_rejected (test_dependency_ci.ComponentWorkflowFixtureTests.test_omitted_repository_provenance_is_rejected) ... ok\ntest_optional_source_validation_uses_immutable_commit_and_rejects_stale_head (test_dependency_ci.ComponentWorkflowFixtureTests.test_optional_source_validation_uses_immutable_commit_and_rejects_stale_head) ... ok\ntest_boundary_gate_refuses_missing_ripgrep_before_resolving_sources (test_dependency_ci.DependencyCITests.test_boundary_gate_refuses_missing_ripgrep_before_resolving_sources) ... ok\ntest_component_checkout_removes_tokens_before_candidate_executes (test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) ... ok\ntest_component_ci_executes_nested_go_module_tests (test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) ... ok\ntest_external_npm_git_source_rejected_before_authenticated_request (test_dependency_ci.DependencyCITests.test_external_npm_git_source_rejected_before_authenticated_request) ... ok\ntest_go_prefetch_covers_logging_trace_module (test_dependency_ci.DependencyCITests.test_go_prefetch_covers_logging_trace_module) ... ok\ntest_go_prefetch_rejects_mutation_of_committed_checksums (test_dependency_ci.DependencyCITests.test_go_prefetch_rejects_mutation_of_committed_checksums) ... ok\ntest_go_prefetch_uses_only_registered_private_repo_and_local_toolchain (test_dependency_ci.DependencyCITests.test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain) ... ok\ntest_go_requirement_for_new_toolchain_fails_without_downloading_one (test_dependency_ci.DependencyCITests.test_go_requirement_for_new_toolchain_fails_without_downloading_one) ... ok\ntest_npm_git_package_installs_committed_output_without_prepare (test_dependency_ci.DependencyCITests.test_npm_git_package_installs_committed_output_without_prepare) ... ok\ntest_npm_metadata_version_cannot_be_a_destination (test_dependency_ci.DependencyCITests.test_npm_metadata_version_cannot_be_a_destination) ... ok\ntest_npm_nonregistry_tarball_rejected_before_request (test_dependency_ci.DependencyCITests.test_npm_nonregistry_tarball_rejected_before_request) ... ok\ntest_npm_prefetch_populates_cold_offline_resolver_metadata_without_credentials (test_dependency_ci.DependencyCITests.test_npm_prefetch_populates_cold_offline_resolver_metadata_without_credentials) ... ok\ntest_npm_provider_prepare_is_rejected_without_execution (test_dependency_ci.DependencyCITests.test_npm_provider_prepare_is_rejected_without_execution) ... ok\ntest_privileged_acquisition_finishes_before_candidate_execution_in_each_job (test_dependency_ci.DependencyCITests.test_privileged_acquisition_finishes_before_candidate_execution_in_each_job) ... ok\ntest_rdm_composition_lock_fetches_fixed_dev_without_executing_code (test_dependency_ci.DependencyCITests.test_rdm_composition_lock_fetches_fixed_dev_without_executing_code) ... ok\ntest_rdm_composition_lock_rejects_external_missing_and_malformed_commits (test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) ... ok\ntest_registered_application_lock_materializes_fixed_source (test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source) ... ok\ntest_unregistered_go_module_rejected_before_authenticated_request (test_dependency_ci.DependencyCITests.test_unregistered_go_module_rejected_before_authenticated_request) ... ok\ntest_unregistered_source_lock_is_rejected_before_component_fetch (test_dependency_ci.DependencyCITests.test_unregistered_source_lock_is_rejected_before_component_fetch) ... 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) ... FAIL\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) ... To /tmp/svc-db-regress-_9hozas8/rdmremote.git\n 8dff2e3..6681a9a 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_cache_recycling_preserves_ignored_unique_files (test_svc_build_cutover.SvcBuildCutoverTests.test_cache_recycling_preserves_ignored_unique_files) ... ok\ntest_e2e_build_only_uses_versioned_sources_without_runtime_or_api_calls (test_svc_build_cutover.SvcBuildCutoverTests.test_e2e_build_only_uses_versioned_sources_without_runtime_or_api_calls) ... ok\ntest_mismatched_existing_cache_is_rejected_before_candidate_build (test_svc_build_cutover.SvcBuildCutoverTests.test_mismatched_existing_cache_is_rejected_before_candidate_build) ... ok\ntest_versioned_dev_materialization_uses_composer_without_submodules (test_svc_build_cutover.SvcBuildCutoverTests.test_versioned_dev_materialization_uses_composer_without_submodules) ... ok\ntest_versioned_rdm_adapter_passes_fixed_dev_root_to_product_wrapper (test_svc_build_cutover.SvcBuildCutoverTests.test_versioned_rdm_adapter_passes_fixed_dev_root_to_product_wrapper) ... ok\ntest_versioned_static_adapter_resolves_published_frontend_artifact (test_svc_build_cutover.SvcBuildCutoverTests.test_versioned_static_adapter_resolves_published_frontend_artifact) ... 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) ... FAIL\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 应回收并拉起新进程。 ... FAIL\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_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_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_local_recovery_refuses_missing_fixed_rules_before_readiness (test_task_recovery.WorkspaceRecoveryTests.test_local_recovery_refuses_missing_fixed_rules_before_readiness) ... ok\ntest_local_recovery_verifies_fixed_rules_without_sync_or_application_materialization (test_task_recovery.WorkspaceRecoveryTests.test_local_recovery_verifies_fixed_rules_without_sync_or_application_materialization) ... ok\ntest_local_resume_preserves_registered_edit_branch_and_unsaved_component (test_task_recovery.WorkspaceRecoveryTests.test_local_resume_preserves_registered_edit_branch_and_unsaved_component) ... ok\ntest_resume_rechecks_fixed_rules_before_importing_receipt (test_task_recovery.WorkspaceRecoveryTests.test_resume_rechecks_fixed_rules_before_importing_receipt) ... ok\ntest_credentials_in_transport_url_are_rejected (test_transport.TransportTests.test_credentials_in_transport_url_are_rejected) ... ok\ntest_inherited_http_source_must_match_injected_server_owner_and_repository (test_transport.TransportTests.test_inherited_http_source_must_match_injected_server_owner_and_repository) ... ok\ntest_injected_http_server_maps_to_verified_local_mirror_without_authentication (test_transport.TransportTests.test_injected_http_server_maps_to_verified_local_mirror_without_authentication) ... ok\ntest_ordinary_config_cannot_enable_http_transport (test_transport.TransportTests.test_ordinary_config_cannot_enable_http_transport) ... ok\ntest_remote_revision_download_without_global_git_change (test_transport.TransportTests.test_remote_revision_download_without_global_git_change) ... ok\ntest_verified_local_mirror_mapping_survives_without_authentication (test_transport.TransportTests.test_verified_local_mirror_mapping_survives_without_authentication) ... ok\ntest_actual_go_version_baseline_overlay_and_unlink_restore_version_consumption (test_workspace.WorkspaceTests.test_actual_go_version_baseline_overlay_and_unlink_restore_version_consumption) ... ok\ntest_conflicting_duplicate_nested_component_stops_before_cloning (test_workspace.WorkspaceTests.test_conflicting_duplicate_nested_component_stops_before_cloning) ... ok\ntest_edit_registers_branch_and_prepare_preserves_work (test_workspace.WorkspaceTests.test_edit_registers_branch_and_prepare_preserves_work) ... ok\ntest_equivalent_recursive_nested_sources_share_an_independent_component (test_workspace.WorkspaceTests.test_equivalent_recursive_nested_sources_share_an_independent_component) ... ok\ntest_existing_fixed_checkout_is_not_switched_after_lock_change (test_workspace.WorkspaceTests.test_existing_fixed_checkout_is_not_switched_after_lock_change) ... ok\ntest_explicit_fixed_refresh_preserves_old_commit_refs_and_reflog (test_workspace.WorkspaceTests.test_explicit_fixed_refresh_preserves_old_commit_refs_and_reflog) ... ok\ntest_explicit_fixed_refresh_refuses_dirty_ignored_edited_and_locked_sources (test_workspace.WorkspaceTests.test_explicit_fixed_refresh_refuses_dirty_ignored_edited_and_locked_sources) ... ok\ntest_explicit_fixed_refresh_refuses_index_flags_hiding_owner_changes (test_workspace.WorkspaceTests.test_explicit_fixed_refresh_refuses_index_flags_hiding_owner_changes) ... ok\ntest_explicit_fixed_refresh_refuses_shared_or_unregistered_ownership (test_workspace.WorkspaceTests.test_explicit_fixed_refresh_refuses_shared_or_unregistered_ownership) ... ok\ntest_failed_explicit_fixed_refresh_keeps_old_binding_and_can_retry (test_workspace.WorkspaceTests.test_failed_explicit_fixed_refresh_keeps_old_binding_and_can_retry) ... ok\ntest_fresh_library_edit_resolves_fixed_consumer_and_preserves_consumer_manifest (test_workspace.WorkspaceTests.test_fresh_library_edit_resolves_fixed_consumer_and_preserves_consumer_manifest) ... ok\ntest_git_operation_is_reported_and_not_removed (test_workspace.WorkspaceTests.test_git_operation_is_reported_and_not_removed) ... ok\ntest_ignored_unique_files_and_shared_worktrees_block_branch_changes (test_workspace.WorkspaceTests.test_ignored_unique_files_and_shared_worktrees_block_branch_changes) ... ok\ntest_library_baseline_resolves_transitive_selected_module (test_workspace.WorkspaceTests.test_library_baseline_resolves_transitive_selected_module) ... ok\ntest_library_legacy_baseline_uses_gitlink_not_current_head (test_workspace.WorkspaceTests.test_library_legacy_baseline_uses_gitlink_not_current_head) ... ok\ntest_missing_fixed_source_never_falls_back_to_remote_main (test_workspace.WorkspaceTests.test_missing_fixed_source_never_falls_back_to_remote_main) ... ok\ntest_npm_library_edit_uses_consumer_lock_git_sha_not_remote_main (test_workspace.WorkspaceTests.test_npm_library_edit_uses_consumer_lock_git_sha_not_remote_main) ... ok\ntest_npm_library_rejects_wrong_lock_origin_and_competing_manual_lock (test_workspace.WorkspaceTests.test_npm_library_rejects_wrong_lock_origin_and_competing_manual_lock) ... ok\ntest_partial_initialization_is_retained_and_retry_is_safe (test_workspace.WorkspaceTests.test_partial_initialization_is_retained_and_retry_is_safe) ... ok\ntest_partial_nested_transition_keeps_originals_and_owner_recovery_state (test_workspace.WorkspaceTests.test_partial_nested_transition_keeps_originals_and_owner_recovery_state) ... workspace: injected partial nested copy failure\nok\ntest_prepare_pins_fixed_commit_and_reuses_without_advancing (test_workspace.WorkspaceTests.test_prepare_pins_fixed_commit_and_reuses_without_advancing) ... ok\ntest_private_git_metadata_symlink_is_not_adopted (test_workspace.WorkspaceTests.test_private_git_metadata_symlink_is_not_adopted) ... ok\ntest_rejects_mismatched_origin_dirty_and_git_lock_without_changes (test_workspace.WorkspaceTests.test_rejects_mismatched_origin_dirty_and_git_lock_without_changes) ... ok\ntest_rejects_paths_and_symlink_escape (test_workspace.WorkspaceTests.test_rejects_paths_and_symlink_escape) ... ok\ntest_rejects_unknown_component_and_bad_branch_without_source_creation (test_workspace.WorkspaceTests.test_rejects_unknown_component_and_bad_branch_without_source_creation) ... ok\ntest_repeated_transition_keeps_alias_tag_versions_and_snapshot_history (test_workspace.WorkspaceTests.test_repeated_transition_keeps_alias_tag_versions_and_snapshot_history) ... ok\ntest_repeated_transition_preserves_dirty_index_ignored_and_external_git_metadata (test_workspace.WorkspaceTests.test_repeated_transition_preserves_dirty_index_ignored_and_external_git_metadata) ... ok\ntest_repeated_transition_rejects_a_new_source_head_without_switching_destination (test_workspace.WorkspaceTests.test_repeated_transition_rejects_a_new_source_head_without_switching_destination) ... ok\ntest_status_does_not_expose_credentials_from_an_unmatched_actual_origin (test_workspace.WorkspaceTests.test_status_does_not_expose_credentials_from_an_unmatched_actual_origin) ... ok\ntest_status_reports_dirty_and_verify_rejects_it (test_workspace.WorkspaceTests.test_status_reports_dirty_and_verify_rejects_it) ... ok\ntest_transition_known_nested_repositories_preserves_external_worktree_and_runs_go (test_workspace.WorkspaceTests.test_transition_known_nested_repositories_preserves_external_worktree_and_runs_go) ... ok\ntest_transition_preserves_committed_symlink_deletion_and_file_type_change (test_workspace.WorkspaceTests.test_transition_preserves_committed_symlink_deletion_and_file_type_change) ... ok\ntest_transition_preserves_staged_blob_internal_symlink_and_reflog_commit (test_workspace.WorkspaceTests.test_transition_preserves_staged_blob_internal_symlink_and_reflog_commit) ... ok\ntest_transition_refuses_initialized_nested_repository (test_workspace.WorkspaceTests.test_transition_refuses_initialized_nested_repository) ... ok\ntest_transition_rejects_external_symlinks_preserving_both_locations (test_workspace.WorkspaceTests.test_transition_rejects_external_symlinks_preserving_both_locations) ... ok\ntest_transition_report_is_readonly_apply_preserves_unique_commits_refs_and_files (test_workspace.WorkspaceTests.test_transition_report_is_readonly_apply_preserves_unique_commits_refs_and_files) ... ok\ntest_unlink_refuses_manual_overlay_changes_without_changing_registration (test_workspace.WorkspaceTests.test_unlink_refuses_manual_overlay_changes_without_changing_registration) ... ok\ntest_workspace_operation_lock_and_user_go_work_are_preserved (test_workspace.WorkspaceTests.test_workspace_operation_lock_and_user_go_work_are_preserved) ... ok\ntest_architecture_gate_preserves_edges_under_workspace_paths_and_new_module_identity (test_workspace_cutover.WorkspaceCutoverTests.test_architecture_gate_preserves_edges_under_workspace_paths_and_new_module_identity) ... ok\ntest_boundary_gate_uses_isolated_map_and_rejects_new_backend_internal_import (test_workspace_cutover.WorkspaceCutoverTests.test_boundary_gate_uses_isolated_map_and_rejects_new_backend_internal_import) ... ok\ntest_finish_preserves_absorbed_metadata_after_legacy_checkout_disappears (test_workspace_cutover.WorkspaceCutoverTests.test_finish_preserves_absorbed_metadata_after_legacy_checkout_disappears) ... ok\ntest_finish_preserves_external_worktree_of_retired_legacy_checkout (test_workspace_cutover.WorkspaceCutoverTests.test_finish_preserves_external_worktree_of_retired_legacy_checkout) ... ok\ntest_finish_preserves_nonbranch_legacy_refs_without_remote_backup (test_workspace_cutover.WorkspaceCutoverTests.test_finish_preserves_nonbranch_legacy_refs_without_remote_backup) ... ok\ntest_make_workspace_commands_prepare_edit_unlink_and_report (test_workspace_cutover.WorkspaceCutoverTests.test_make_workspace_commands_prepare_edit_unlink_and_report) ... ok\ntest_old_task_sync_adopts_new_sources_and_reports_explicit_transition (test_workspace_cutover.WorkspaceCutoverTests.test_old_task_sync_adopts_new_sources_and_reports_explicit_transition) ... ok\ntest_old_task_sync_preserves_unique_legacy_commit_staging_dirty_and_ignored_files (test_workspace_cutover.WorkspaceCutoverTests.test_old_task_sync_preserves_unique_legacy_commit_staging_dirty_and_ignored_files) ... ok\ntest_old_task_text_conflict_keeps_legacy_source_and_reports_no_success (test_workspace_cutover.WorkspaceCutoverTests.test_old_task_text_conflict_keeps_legacy_source_and_reports_no_success) ... ok\ntest_precheck_never_claims_ready_for_unavailable_fixed_rules (test_workspace_cutover.WorkspaceCutoverTests.test_precheck_never_claims_ready_for_unavailable_fixed_rules) ... ok\ntest_precheck_prepares_fixed_rules_outside_project_before_ready (test_workspace_cutover.WorkspaceCutoverTests.test_precheck_prepares_fixed_rules_outside_project_before_ready) ... ok\ntest_precheck_rejects_borrowed_rules_cache_symlink (test_workspace_cutover.WorkspaceCutoverTests.test_precheck_rejects_borrowed_rules_cache_symlink) ... ok\ntest_start_prepares_fixed_sources_without_recursive_submodule_init (test_workspace_cutover.WorkspaceCutoverTests.test_start_prepares_fixed_sources_without_recursive_submodule_init) ... ok\ntest_sync_preserves_edit_branch_and_refuses_changed_declared_source (test_workspace_cutover.WorkspaceCutoverTests.test_sync_preserves_edit_branch_and_refuses_changed_declared_source) ... ok\ntest_verify_detects_active_git_operation_in_nested_retired_root (test_workspace_cutover.WorkspaceCutoverTests.test_verify_detects_active_git_operation_in_nested_retired_root) ... ok\ntest_verify_detects_nested_git_operation_inside_new_workspace (test_workspace_cutover.WorkspaceCutoverTests.test_verify_detects_nested_git_operation_inside_new_workspace) ... 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======================================================================\nFAIL: test_auth_preflight_aligns_with_effective_env_dsn (test_svc.SvcDbRecoveryTests.test_auth_preflight_aligns_with_effective_env_dsn)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/agent-system-composition-b5be4j99/Dev-test-root/tests/test_svc.py\", line 474, in test_auth_preflight_aligns_with_effective_env_dsn\n self.assertIn(\"拒绝启动\", result.stdout)\n ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: '拒绝启动' not found in '\\x1b[1;33m[svc]\\x1b[0m [nl3] 跳过 manifest 迁移:需 python3 与 scripts/svc_manifest.py\\n\\x1b[1;31m[svc]\\x1b[0m [nl3] 端口被占用(非本服务):LISTEN 0 5 127.0.0.1:18803 0.0.0.0:* users:((\"python3\",pid=2487150,fd=3)) \\n\\x1b[1;31m[svc]\\x1b[0m 处理:停掉该进程,或换端口(--port / --addr)\\n'\n\n======================================================================\nFAIL: test_caller_identity_env_does_not_reach_serve (test_svc_lifecycle_isolation.LifecycleIsolationTests.test_caller_identity_env_does_not_reach_serve)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/agent-system-composition-b5be4j99/Dev-test-root/tests/test_svc_lifecycle_isolation.py\", line 25, in test_caller_identity_env_does_not_reach_serve\n self.svc(\"iso\", \"start\", env=env)\n ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/tmp/agent-system-composition-b5be4j99/Dev-test-root/tests/test_svc_recover.py\", line 248, in svc\n self.assertEqual(proc.returncode, 0, proc.stdout)\n ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 1 != 0 : \u001b[1;32m[svc]\u001b[0m [iso] manifest:已迁移 rev=1 instance_id=svc-iso-7ecae8f6eb14 data=/tmp/svc-autorecover-w1qcsyvk/runtime/iso/data\n\u001b[1;31m[svc]\u001b[0m [iso] 端口被占用(非本服务):LISTEN 0 5 127.0.0.1:9461 0.0.0.0:* users:((\"python3\",pid=2550772,fd=3)) \n\u001b[1;31m[svc]\u001b[0m 处理:停掉该进程,或换端口(--port / --addr)\n\n\n======================================================================\nFAIL: test_start_reclaims_own_orphan_without_pidfile (test_svc_recover.SvcAutoRecoverTests.test_start_reclaims_own_orphan_without_pidfile)\n模拟 update 误清 pidfile 后本 bin 仍占口:裸 start 应回收并拉起新进程。\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/agent-system-composition-b5be4j99/Dev-test-root/tests/test_svc_recover.py\", line 484, in test_start_reclaims_own_orphan_without_pidfile\n self.start_ok(\"dev\")\n ~~~~~~~~~~~~~^^^^^^^\n File \"/tmp/agent-system-composition-b5be4j99/Dev-test-root/tests/test_svc_recover.py\", line 279, in start_ok\n result = self.svc(name, \"start\")\n File \"/tmp/agent-system-composition-b5be4j99/Dev-test-root/tests/test_svc_recover.py\", line 248, in svc\n self.assertEqual(proc.returncode, 0, proc.stdout)\n ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 1 != 0 : \u001b[1;33m[svc]\u001b[0m [dev] 跳过 manifest 迁移:需 python3 与 scripts/svc_manifest.py\n\u001b[1;31m[svc]\u001b[0m [dev] 端口被占用(非本服务):LISTEN 0 5 127.0.0.1:18812 0.0.0.0:* users:((\"python3\",pid=2577636,fd=3)) \n\u001b[1;31m[svc]\u001b[0m 处理:停掉该进程,或换端口(--port / --addr)\n\n\n----------------------------------------------------------------------\nRan 476 tests in 300.750s\n\nFAILED (failures=3, skipped=19)\nmake[2]: *** [Makefile:254: test-governance] Error 1\ncomposition: command failed (2): make test_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_backend_check_prepares_fixed_source_and_replays_owner_edits (test_component_checks.ComponentCheckTests.test_backend_check_prepares_fixed_source_and_replays_owner_edits) ... ok\ntest_explicit_overlay_uses_registered_workspace_and_preserves_default_version_mode (test_component_checks.ComponentCheckTests.test_explicit_overlay_uses_registered_workspace_and_preserves_default_version_mode) ... ok\ntest_fixed_go_checks_keep_source_clean_across_pg_and_multi_instance (test_component_checks.ComponentCheckTests.test_fixed_go_checks_keep_source_clean_across_pg_and_multi_instance) ... ok\ntest_fixed_go_checks_refuse_and_preserve_owner_changes_and_ignored_files (test_component_checks.ComponentCheckTests.test_fixed_go_checks_refuse_and_preserve_owner_changes_and_ignored_files) ... ok\ntest_fixed_go_failure_is_reported_without_polluting_source (test_component_checks.ComponentCheckTests.test_fixed_go_failure_is_reported_without_polluting_source) ... ok\ntest_make_pin_gate_uses_map_in_gitless_formal_root_and_ignores_external_rdm_identity (test_component_checks.ComponentCheckTests.test_make_pin_gate_uses_map_in_gitless_formal_root_and_ignores_external_rdm_identity) ... ok\ntest_multi_instance_binary_is_built_inside_dev_root_and_reached_by_suite (test_component_checks.ComponentCheckTests.test_multi_instance_binary_is_built_inside_dev_root_and_reached_by_suite) ... ok\ntest_new_pin_gate_validates_fixed_sources_and_rejects_local_replaces (test_component_checks.ComponentCheckTests.test_new_pin_gate_validates_fixed_sources_and_rejects_local_replaces) ... ok\ntest_pg_and_multi_instance_prerequisites_still_refuse_before_preparing_sources (test_component_checks.ComponentCheckTests.test_pg_and_multi_instance_prerequisites_still_refuse_before_preparing_sources) ... ok\ntest_pg_gate_requires_environment_and_forwards_it_to_real_go_tests (test_component_checks.ComponentCheckTests.test_pg_gate_requires_environment_and_forwards_it_to_real_go_tests) ... ok\ntest_registered_private_transport_reaches_real_go_process_without_global_change (test_component_checks.ComponentCheckTests.test_registered_private_transport_reaches_real_go_process_without_global_change) ... ok\ntest_before_sync_rejects_component_git_lock (test_component_governance.ComponentGovernanceTests.test_before_sync_rejects_component_git_lock) ... ok\ntest_evidence_captures_ignored_component_revision_and_dirty_bytes (test_component_governance.ComponentGovernanceTests.test_evidence_captures_ignored_component_revision_and_dirty_bytes) ... ok\ntest_new_layout_cannot_use_receipt_without_component_identity (test_component_governance.ComponentGovernanceTests.test_new_layout_cannot_use_receipt_without_component_identity) ... ok\ntest_receipts_reject_component_path_escape (test_component_governance.ComponentGovernanceTests.test_receipts_reject_component_path_escape) ... ok\ntest_startup_receipt_rejects_changed_ignored_component_objects (test_component_governance.ComponentGovernanceTests.test_startup_receipt_rejects_changed_ignored_component_objects) ... ok\ntest_all_product_acquisition_precedes_candidate_execution (test_composition.CompositionTests.test_all_product_acquisition_precedes_candidate_execution) ... ok\ntest_developer_package_tarball_overrides_do_not_reach_formal_tests (test_composition.CompositionTests.test_developer_package_tarball_overrides_do_not_reach_formal_tests) ... ok\ntest_dirty_root_composer_cannot_publish_under_committed_identity (test_composition.CompositionTests.test_dirty_root_composer_cannot_publish_under_committed_identity) ... ok\ntest_dirty_root_lock_is_rejected (test_composition.CompositionTests.test_dirty_root_lock_is_rejected) ... ok\ntest_dirty_root_transport_is_refused_before_import (test_composition.CompositionTests.test_dirty_root_transport_is_refused_before_import) ... ok\ntest_fixed_commits_embed_assets_without_touching_developer_checkout (test_composition.CompositionTests.test_fixed_commits_embed_assets_without_touching_developer_checkout) ... ok\ntest_fixed_root_governance_and_boundaries_receive_proven_source_map (test_composition.CompositionTests.test_fixed_root_governance_and_boundaries_receive_proven_source_map) ... ok\ntest_frontend_dist_symlink_cannot_import_assets_from_outside_source (test_composition.CompositionTests.test_frontend_dist_symlink_cannot_import_assets_from_outside_source) ... ok\ntest_historical_rdm_product_still_builds_from_legacy_pins (test_composition.CompositionTests.test_historical_rdm_product_still_builds_from_legacy_pins) ... ok\ntest_local_go_replace_is_rejected (test_composition.CompositionTests.test_local_go_replace_is_rejected) ... ok\ntest_locked_missing_revision_is_rejected (test_composition.CompositionTests.test_locked_missing_revision_is_rejected) ... ok\ntest_missing_frontend_assets_fails_before_publishing_binary (test_composition.CompositionTests.test_missing_frontend_assets_fails_before_publishing_binary) ... ok\ntest_modified_go_module_cache_is_rejected_before_product_publication (test_composition.CompositionTests.test_modified_go_module_cache_is_rejected_before_product_publication) ... ok\ntest_npm_local_dependency_overlay_is_rejected (test_composition.CompositionTests.test_npm_local_dependency_overlay_is_rejected) ... ok\ntest_project_test_mode_refuses_missing_boundary_gate (test_composition.CompositionTests.test_project_test_mode_refuses_missing_boundary_gate) ... ok\ntest_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock (test_composition.CompositionTests.test_rdm_product_and_admin_follow_its_selected_backend_not_dev_source_lock) ... ok\ntest_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache (test_composition.CompositionTests.test_rdm_vendored_remote_backend_embeds_assets_without_mutating_module_cache) ... ok\ntest_source_path_escape_is_rejected (test_composition.CompositionTests.test_source_path_escape_is_rejected) ... ok\ntest_test_target_checks_fixed_go_library_and_ui_sources (test_composition.CompositionTests.test_test_target_checks_fixed_go_library_and_ui_sources) ... ok\ntest_test_target_runs_real_frontend_and_go_tests (test_composition.CompositionTests.test_test_target_runs_real_frontend_and_go_tests) ... ok\ntest_unused_transitive_zip_does_not_require_consumer_sum_rewrite (test_composition.CompositionTests.test_unused_transitive_zip_does_not_require_consumer_sum_rewrite) ... ok\ntest_version_and_plugin_assets_come_from_committed_root (test_composition.CompositionTests.test_version_and_plugin_assets_come_from_committed_root) ... ok\ntest_versioned_rdm_product_entry_uses_fixed_composer (test_composition.CompositionTests.test_versioned_rdm_product_entry_uses_fixed_composer) ... skipped 'external RDM source was not supplied; host must replay the actual wrapper'\ntest_locked_metadata_is_acquired_before_offline_consumer_without_credentials (test_composition.NpmAcquisitionTests.test_locked_metadata_is_acquired_before_offline_consumer_without_credentials) ... ok\ntest_unreviewed_tarball_source_is_refused_before_acquisition (test_composition.NpmAcquisitionTests.test_unreviewed_tarball_source_is_refused_before_acquisition) ... ok\ntest_all_required_component_snapshots_have_fixed_provenance (test_dependency_ci.ComponentWorkflowFixtureTests.test_all_required_component_snapshots_have_fixed_provenance) ... ok\ntest_missing_component_snapshot_is_not_skipped (test_dependency_ci.ComponentWorkflowFixtureTests.test_missing_component_snapshot_is_not_skipped) ... ok\ntest_modified_workflow_snapshot_is_rejected_before_execution (test_dependency_ci.ComponentWorkflowFixtureTests.test_modified_workflow_snapshot_is_rejected_before_execution) ... ok\ntest_omitted_repository_provenance_is_rejected (test_dependency_ci.ComponentWorkflowFixtureTests.test_omitted_repository_provenance_is_rejected) ... ok\ntest_optional_source_validation_uses_immutable_commit_and_rejects_stale_head (test_dependency_ci.ComponentWorkflowFixtureTests.test_optional_source_validation_uses_immutable_commit_and_rejects_stale_head) ... ok\ntest_boundary_gate_refuses_missing_ripgrep_before_resolving_sources (test_dependency_ci.DependencyCITests.test_boundary_gate_refuses_missing_ripgrep_before_resolving_sources) ... ok\ntest_component_checkout_removes_tokens_before_candidate_executes (test_dependency_ci.DependencyCITests.test_component_checkout_removes_tokens_before_candidate_executes) ... ok\ntest_component_ci_executes_nested_go_module_tests (test_dependency_ci.DependencyCITests.test_component_ci_executes_nested_go_module_tests) ... ok\ntest_external_npm_git_source_rejected_before_authenticated_request (test_dependency_ci.DependencyCITests.test_external_npm_git_source_rejected_before_authenticated_request) ... ok\ntest_go_prefetch_covers_logging_trace_module (test_dependency_ci.DependencyCITests.test_go_prefetch_covers_logging_trace_module) ... ok\ntest_go_prefetch_rejects_mutation_of_committed_checksums (test_dependency_ci.DependencyCITests.test_go_prefetch_rejects_mutation_of_committed_checksums) ... ok\ntest_go_prefetch_uses_only_registered_private_repo_and_local_toolchain (test_dependency_ci.DependencyCITests.test_go_prefetch_uses_only_registered_private_repo_and_local_toolchain) ... ok\ntest_go_requirement_for_new_toolchain_fails_without_downloading_one (test_dependency_ci.DependencyCITests.test_go_requirement_for_new_toolchain_fails_without_downloading_one) ... ok\ntest_npm_git_package_installs_committed_output_without_prepare (test_dependency_ci.DependencyCITests.test_npm_git_package_installs_committed_output_without_prepare) ... ok\ntest_npm_metadata_version_cannot_be_a_destination (test_dependency_ci.DependencyCITests.test_npm_metadata_version_cannot_be_a_destination) ... ok\ntest_npm_nonregistry_tarball_rejected_before_request (test_dependency_ci.DependencyCITests.test_npm_nonregistry_tarball_rejected_before_request) ... ok\ntest_npm_prefetch_populates_cold_offline_resolver_metadata_without_credentials (test_dependency_ci.DependencyCITests.test_npm_prefetch_populates_cold_offline_resolver_metadata_without_credentials) ... ok\ntest_npm_provider_prepare_is_rejected_without_execution (test_dependency_ci.DependencyCITests.test_npm_provider_prepare_is_rejected_without_execution) ... ok\ntest_privileged_acquisition_finishes_before_candidate_execution_in_each_job (test_dependency_ci.DependencyCITests.test_privileged_acquisition_finishes_before_candidate_execution_in_each_job) ... ok\ntest_rdm_composition_lock_fetches_fixed_dev_without_executing_code (test_dependency_ci.DependencyCITests.test_rdm_composition_lock_fetches_fixed_dev_without_executing_code) ... ok\ntest_rdm_composition_lock_rejects_external_missing_and_malformed_commits (test_dependency_ci.DependencyCITests.test_rdm_composition_lock_rejects_external_missing_and_malformed_commits) ... ok\ntest_registered_application_lock_materializes_fixed_source (test_dependency_ci.DependencyCITests.test_registered_application_lock_materializes_fixed_source) ... ok\ntest_unregistered_go_module_rejected_before_authenticated_request (test_dependency_ci.DependencyCITests.test_unregistered_go_module_rejected_before_authenticated_request) ... ok\ntest_unregistered_source_lock_is_rejected_before_component_fetch (test_dependency_ci.DependencyCITests.test_unregistered_source_lock_is_rejected_before_component_fetch) ... 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) ... FAIL\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) ... To /tmp/svc-db-regress-_9hozas8/rdmremote.git\n 8dff2e3..6681a9a 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_cache_recycling_preserves_ignored_unique_files (test_svc_build_cutover.SvcBuildCutoverTests.test_cache_recycling_preserves_ignored_unique_files) ... ok\ntest_e2e_build_only_uses_versioned_sources_without_runtime_or_api_calls (test_svc_build_cutover.SvcBuildCutoverTests.test_e2e_build_only_uses_versioned_sources_without_runtime_or_api_calls) ... ok\ntest_mismatched_existing_cache_is_rejected_before_candidate_build (test_svc_build_cutover.SvcBuildCutoverTests.test_mismatched_existing_cache_is_rejected_before_candidate_build) ... ok\ntest_versioned_dev_materialization_uses_composer_without_submodules (test_svc_build_cutover.SvcBuildCutoverTests.test_versioned_dev_materialization_uses_composer_without_submodules) ... ok\ntest_versioned_rdm_adapter_passes_fixed_dev_root_to_product_wrapper (test_svc_build_cutover.SvcBuildCutoverTests.test_versioned_rdm_adapter_passes_fixed_dev_root_to_product_wrapper) ... ok\ntest_versioned_static_adapter_resolves_published_frontend_artifact (test_svc_build_cutover.SvcBuildCutoverTests.test_versioned_static_adapter_resolves_published_frontend_artifact) ... 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) ... FAIL\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 应回收并拉起新进程。 ... FAIL\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_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_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_local_recovery_refuses_missing_fixed_rules_before_readiness (test_task_recovery.WorkspaceRecoveryTests.test_local_recovery_refuses_missing_fixed_rules_before_readiness) ... ok\ntest_local_recovery_verifies_fixed_rules_without_sync_or_application_materialization (test_task_recovery.WorkspaceRecoveryTests.test_local_recovery_verifies_fixed_rules_without_sync_or_application_materialization) ... ok\ntest_local_resume_preserves_registered_edit_branch_and_unsaved_component (test_task_recovery.WorkspaceRecoveryTests.test_local_resume_preserves_registered_edit_branch_and_unsaved_component) ... ok\ntest_resume_rechecks_fixed_rules_before_importing_receipt (test_task_recovery.WorkspaceRecoveryTests.test_resume_rechecks_fixed_rules_before_importing_receipt) ... ok\ntest_credentials_in_transport_url_are_rejected (test_transport.TransportTests.test_credentials_in_transport_url_are_rejected) ... ok\ntest_inherited_http_source_must_match_injected_server_owner_and_repository (test_transport.TransportTests.test_inherited_http_source_must_match_injected_server_owner_and_repository) ... ok\ntest_injected_http_server_maps_to_verified_local_mirror_without_authentication (test_transport.TransportTests.test_injected_http_server_maps_to_verified_local_mirror_without_authentication) ... ok\ntest_ordinary_config_cannot_enable_http_transport (test_transport.TransportTests.test_ordinary_config_cannot_enable_http_transport) ... ok\ntest_remote_revision_download_without_global_git_change (test_transport.TransportTests.test_remote_revision_download_without_global_git_change) ... ok\ntest_verified_local_mirror_mapping_survives_without_authentication (test_transport.TransportTests.test_verified_local_mirror_mapping_survives_without_authentication) ... ok\ntest_actual_go_version_baseline_overlay_and_unlink_restore_version_consumption (test_workspace.WorkspaceTests.test_actual_go_version_baseline_overlay_and_unlink_restore_version_consumption) ... ok\ntest_conflicting_duplicate_nested_component_stops_before_cloning (test_workspace.WorkspaceTests.test_conflicting_duplicate_nested_component_stops_before_cloning) ... ok\ntest_edit_registers_branch_and_prepare_preserves_work (test_workspace.WorkspaceTests.test_edit_registers_branch_and_prepare_preserves_work) ... ok\ntest_equivalent_recursive_nested_sources_share_an_independent_component (test_workspace.WorkspaceTests.test_equivalent_recursive_nested_sources_share_an_independent_component) ... ok\ntest_existing_fixed_checkout_is_not_switched_after_lock_change (test_workspace.WorkspaceTests.test_existing_fixed_checkout_is_not_switched_after_lock_change) ... ok\ntest_explicit_fixed_refresh_preserves_old_commit_refs_and_reflog (test_workspace.WorkspaceTests.test_explicit_fixed_refresh_preserves_old_commit_refs_and_reflog) ... ok\ntest_explicit_fixed_refresh_refuses_dirty_ignored_edited_and_locked_sources (test_workspace.WorkspaceTests.test_explicit_fixed_refresh_refuses_dirty_ignored_edited_and_locked_sources) ... ok\ntest_explicit_fixed_refresh_refuses_index_flags_hiding_owner_changes (test_workspace.WorkspaceTests.test_explicit_fixed_refresh_refuses_index_flags_hiding_owner_changes) ... ok\ntest_explicit_fixed_refresh_refuses_shared_or_unregistered_ownership (test_workspace.WorkspaceTests.test_explicit_fixed_refresh_refuses_shared_or_unregistered_ownership) ... ok\ntest_failed_explicit_fixed_refresh_keeps_old_binding_and_can_retry (test_workspace.WorkspaceTests.test_failed_explicit_fixed_refresh_keeps_old_binding_and_can_retry) ... ok\ntest_fresh_library_edit_resolves_fixed_consumer_and_preserves_consumer_manifest (test_workspace.WorkspaceTests.test_fresh_library_edit_resolves_fixed_consumer_and_preserves_consumer_manifest) ... ok\ntest_git_operation_is_reported_and_not_removed (test_workspace.WorkspaceTests.test_git_operation_is_reported_and_not_removed) ... ok\ntest_ignored_unique_files_and_shared_worktrees_block_branch_changes (test_workspace.WorkspaceTests.test_ignored_unique_files_and_shared_worktrees_block_branch_changes) ... ok\ntest_library_baseline_resolves_transitive_selected_module (test_workspace.WorkspaceTests.test_library_baseline_resolves_transitive_selected_module) ... ok\ntest_library_legacy_baseline_uses_gitlink_not_current_head (test_workspace.WorkspaceTests.test_library_legacy_baseline_uses_gitlink_not_current_head) ... ok\ntest_missing_fixed_source_never_falls_back_to_remote_main (test_workspace.WorkspaceTests.test_missing_fixed_source_never_falls_back_to_remote_main) ... ok\ntest_npm_library_edit_uses_consumer_lock_git_sha_not_remote_main (test_workspace.WorkspaceTests.test_npm_library_edit_uses_consumer_lock_git_sha_not_remote_main) ... ok\ntest_npm_library_rejects_wrong_lock_origin_and_competing_manual_lock (test_workspace.WorkspaceTests.test_npm_library_rejects_wrong_lock_origin_and_competing_manual_lock) ... ok\ntest_partial_initialization_is_retained_and_retry_is_safe (test_workspace.WorkspaceTests.test_partial_initialization_is_retained_and_retry_is_safe) ... ok\ntest_partial_nested_transition_keeps_originals_and_owner_recovery_state (test_workspace.WorkspaceTests.test_partial_nested_transition_keeps_originals_and_owner_recovery_state) ... workspace: injected partial nested copy failure\nok\ntest_prepare_pins_fixed_commit_and_reuses_without_advancing (test_workspace.WorkspaceTests.test_prepare_pins_fixed_commit_and_reuses_without_advancing) ... ok\ntest_private_git_metadata_symlink_is_not_adopted (test_workspace.WorkspaceTests.test_private_git_metadata_symlink_is_not_adopted) ... ok\ntest_rejects_mismatched_origin_dirty_and_git_lock_without_changes (test_workspace.WorkspaceTests.test_rejects_mismatched_origin_dirty_and_git_lock_without_changes) ... ok\ntest_rejects_paths_and_symlink_escape (test_workspace.WorkspaceTests.test_rejects_paths_and_symlink_escape) ... ok\ntest_rejects_unknown_component_and_bad_branch_without_source_creation (test_workspace.WorkspaceTests.test_rejects_unknown_component_and_bad_branch_without_source_creation) ... ok\ntest_repeated_transition_keeps_alias_tag_versions_and_snapshot_history (test_workspace.WorkspaceTests.test_repeated_transition_keeps_alias_tag_versions_and_snapshot_history) ... ok\ntest_repeated_transition_preserves_dirty_index_ignored_and_external_git_metadata (test_workspace.WorkspaceTests.test_repeated_transition_preserves_dirty_index_ignored_and_external_git_metadata) ... ok\ntest_repeated_transition_rejects_a_new_source_head_without_switching_destination (test_workspace.WorkspaceTests.test_repeated_transition_rejects_a_new_source_head_without_switching_destination) ... ok\ntest_status_does_not_expose_credentials_from_an_unmatched_actual_origin (test_workspace.WorkspaceTests.test_status_does_not_expose_credentials_from_an_unmatched_actual_origin) ... ok\ntest_status_reports_dirty_and_verify_rejects_it (test_workspace.WorkspaceTests.test_status_reports_dirty_and_verify_rejects_it) ... ok\ntest_transition_known_nested_repositories_preserves_external_worktree_and_runs_go (test_workspace.WorkspaceTests.test_transition_known_nested_repositories_preserves_external_worktree_and_runs_go) ... ok\ntest_transition_preserves_committed_symlink_deletion_and_file_type_change (test_workspace.WorkspaceTests.test_transition_preserves_committed_symlink_deletion_and_file_type_change) ... ok\ntest_transition_preserves_staged_blob_internal_symlink_and_reflog_commit (test_workspace.WorkspaceTests.test_transition_preserves_staged_blob_internal_symlink_and_reflog_commit) ... ok\ntest_transition_refuses_initialized_nested_repository (test_workspace.WorkspaceTests.test_transition_refuses_initialized_nested_repository) ... ok\ntest_transition_rejects_external_symlinks_preserving_both_locations (test_workspace.WorkspaceTests.test_transition_rejects_external_symlinks_preserving_both_locations) ... ok\ntest_transition_report_is_readonly_apply_preserves_unique_commits_refs_and_files (test_workspace.WorkspaceTests.test_transition_report_is_readonly_apply_preserves_unique_commits_refs_and_files) ... ok\ntest_unlink_refuses_manual_overlay_changes_without_changing_registration (test_workspace.WorkspaceTests.test_unlink_refuses_manual_overlay_changes_without_changing_registration) ... ok\ntest_workspace_operation_lock_and_user_go_work_are_preserved (test_workspace.WorkspaceTests.test_workspace_operation_lock_and_user_go_work_are_preserved) ... ok\ntest_architecture_gate_preserves_edges_under_workspace_paths_and_new_module_identity (test_workspace_cutover.WorkspaceCutoverTests.test_architecture_gate_preserves_edges_under_workspace_paths_and_new_module_identity) ... ok\ntest_boundary_gate_uses_isolated_map_and_rejects_new_backend_internal_import (test_workspace_cutover.WorkspaceCutoverTests.test_boundary_gate_uses_isolated_map_and_rejects_new_backend_internal_import) ... ok\ntest_finish_preserves_absorbed_metadata_after_legacy_checkout_disappears (test_workspace_cutover.WorkspaceCutoverTests.test_finish_preserves_absorbed_metadata_after_legacy_checkout_disappears) ... ok\ntest_finish_preserves_external_worktree_of_retired_legacy_checkout (test_workspace_cutover.WorkspaceCutoverTests.test_finish_preserves_external_worktree_of_retired_legacy_checkout) ... ok\ntest_finish_preserves_nonbranch_legacy_refs_without_remote_backup (test_workspace_cutover.WorkspaceCutoverTests.test_finish_preserves_nonbranch_legacy_refs_without_remote_backup) ... ok\ntest_make_workspace_commands_prepare_edit_unlink_and_report (test_workspace_cutover.WorkspaceCutoverTests.test_make_workspace_commands_prepare_edit_unlink_and_report) ... ok\ntest_old_task_sync_adopts_new_sources_and_reports_explicit_transition (test_workspace_cutover.WorkspaceCutoverTests.test_old_task_sync_adopts_new_sources_and_reports_explicit_transition) ... ok\ntest_old_task_sync_preserves_unique_legacy_commit_staging_dirty_and_ignored_files (test_workspace_cutover.WorkspaceCutoverTests.test_old_task_sync_preserves_unique_legacy_commit_staging_dirty_and_ignored_files) ... ok\ntest_old_task_text_conflict_keeps_legacy_source_and_reports_no_success (test_workspace_cutover.WorkspaceCutoverTests.test_old_task_text_conflict_keeps_legacy_source_and_reports_no_success) ... ok\ntest_precheck_never_claims_ready_for_unavailable_fixed_rules (test_workspace_cutover.WorkspaceCutoverTests.test_precheck_never_claims_ready_for_unavailable_fixed_rules) ... ok\ntest_precheck_prepares_fixed_rules_outside_project_before_ready (test_workspace_cutover.WorkspaceCutoverTests.test_precheck_prepares_fixed_rules_outside_project_before_ready) ... ok\ntest_precheck_rejects_borrowed_rules_cache_symlink (test_workspace_cutover.WorkspaceCutoverTests.test_precheck_rejects_borrowed_rules_cache_symlink) ... ok\ntest_start_prepares_fixed_sources_without_recursive_submodule_init (test_workspace_cutover.WorkspaceCutoverTests.test_start_prepares_fixed_sources_without_recursive_submodule_init) ... ok\ntest_sync_preserves_edit_branch_and_refuses_changed_declared_source (test_workspace_cutover.WorkspaceCutoverTests.test_sync_preserves_edit_branch_and_refuses_changed_declared_source) ... ok\ntest_verify_detects_active_git_operation_in_nested_retired_root (test_workspace_cutover.WorkspaceCutoverTests.test_verify_detects_active_git_operation_in_nested_retired_root) ... ok\ntest_verify_detects_nested_git_operation_inside_new_workspace (test_workspace_cutover.WorkspaceCutoverTests.test_verify_detects_nested_git_operation_inside_new_workspace) ... 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======================================================================\nFAIL: test_auth_preflight_aligns_with_effective_env_dsn (test_svc.SvcDbRecoveryTests.test_auth_preflight_aligns_with_effective_env_dsn)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/agent-system-composition-b5be4j99/Dev-test-root/tests/test_svc.py\", line 474, in test_auth_preflight_aligns_with_effective_env_dsn\n self.assertIn(\"拒绝启动\", result.stdout)\n ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: '拒绝启动' not found in '\\x1b[1;33m[svc]\\x1b[0m [nl3] 跳过 manifest 迁移:需 python3 与 scripts/svc_manifest.py\\n\\x1b[1;31m[svc]\\x1b[0m [nl3] 端口被占用(非本服务):LISTEN 0 5 127.0.0.1:18803 0.0.0.0:* users:((\"python3\",pid=2487150,fd=3)) \\n\\x1b[1;31m[svc]\\x1b[0m 处理:停掉该进程,或换端口(--port / --addr)\\n'\n\n======================================================================\nFAIL: test_caller_identity_env_does_not_reach_serve (test_svc_lifecycle_isolation.LifecycleIsolationTests.test_caller_identity_env_does_not_reach_serve)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/agent-system-composition-b5be4j99/Dev-test-root/tests/test_svc_lifecycle_isolation.py\", line 25, in test_caller_identity_env_does_not_reach_serve\n self.svc(\"iso\", \"start\", env=env)\n ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/tmp/agent-system-composition-b5be4j99/Dev-test-root/tests/test_svc_recover.py\", line 248, in svc\n self.assertEqual(proc.returncode, 0, proc.stdout)\n ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 1 != 0 : \u001b[1;32m[svc]\u001b[0m [iso] manifest:已迁移 rev=1 instance_id=svc-iso-7ecae8f6eb14 data=/tmp/svc-autorecover-w1qcsyvk/runtime/iso/data\n\u001b[1;31m[svc]\u001b[0m [iso] 端口被占用(非本服务):LISTEN 0 5 127.0.0.1:9461 0.0.0.0:* users:((\"python3\",pid=2550772,fd=3)) \n\u001b[1;31m[svc]\u001b[0m 处理:停掉该进程,或换端口(--port / --addr)\n\n\n======================================================================\nFAIL: test_start_reclaims_own_orphan_without_pidfile (test_svc_recover.SvcAutoRecoverTests.test_start_reclaims_own_orphan_without_pidfile)\n模拟 update 误清 pidfile 后本 bin 仍占口:裸 start 应回收并拉起新进程。\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"/tmp/agent-system-composition-b5be4j99/Dev-test-root/tests/test_svc_recover.py\", line 484, in test_start_reclaims_own_orphan_without_pidfile\n self.start_ok(\"dev\")\n ~~~~~~~~~~~~~^^^^^^^\n File \"/tmp/agent-system-composition-b5be4j99/Dev-test-root/tests/test_svc_recover.py\", line 279, in start_ok\n result = self.svc(name, \"start\")\n File \"/tmp/agent-system-composition-b5be4j99/Dev-test-root/tests/test_svc_recover.py\", line 248, in svc\n self.assertEqual(proc.returncode, 0, proc.stdout)\n ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAssertionError: 1 != 0 : \u001b[1;33m[svc]\u001b[0m [dev] 跳过 manifest 迁移:需 python3 与 scripts/svc_manifest.py\n\u001b[1;31m[svc]\u001b[0m [dev] 端口被占用(非本服务):LISTEN 0 5 127.0.0.1:18812 0.0.0.0:* users:((\"python3\",pid=2577636,fd=3)) \n\u001b[1;31m[svc]\u001b[0m 处理:停掉该进程,或换端口(--port / --addr)\n\n\n----------------------------------------------------------------------\nRan 476 tests in 300.750s\n\nFAILED (failures=3, skipped=19)\nmake[2]: *** [Makefile:254: test-governance] Error 1\nmake[2]: Entering directory '/tmp/agent-system-composition-b5be4j99/Dev-test-root'\nPYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -p 'test_*.py' -v\nfixed checkout byproducts after PostgreSQL fixture: ''\n[composition] npm ci --ignore-scripts --no-audit --no-fund\n\nadded 1 package in 94ms\n[composition] npm cache add composition-cold-fixture@1.0.0 --ignore-scripts --registry=https://registry.npmjs.org --userconfig=/dev/null --globalconfig=/tmp/composition-npm-metadata-imsmcb7b/empty-global.npmrc\n[main 6681a9a] rdm v2\n 1 file changed, 1 insertion(+)\n create mode 100644 marker\nmake[2]: Leaving directory '/tmp/agent-system-composition-b5be4j99/Dev-test-root'\nmake[1]: *** [Makefile:273: test] Error 2\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n", + "output_sha256": "3964f57f5c36d760750e89a90f04400325b5524b54e531cf465d5c45848e5bc6", + "receipt_sha256": "8af14b7b1f30aadbc6a5d99cea322502b3ba172b0cbaa87d953930c65b1da9df" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-14T05:30:21.396999+00:00", + "command": "GIT_SSH_COMMAND='timeout 180 ssh -o BatchMode=yes -o ConnectTimeout=15 -o ServerAliveInterval=10 -o ServerAliveCountMax=3' make build", + "command_sha256": "0cb93883f389c8d32c3dec87c3988326a4195b80f19fe7e005a220b58fb2694d", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "6160dae6fb0d591ccbfc2d2c17fc003a2ce209b0", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "4f84c2e1630cd0311643529fae1c3a99f1dd5d64", + "status": " M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "ca5c9578bb242503eb2cf1125eb998b7b9e81f4324babb60bd1e206b8a13b638", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "74511db9a6fb12e17954cb0c3f8e8846a6ecf831", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "48649a37ee92373c639a384a2c5a9dfaa2ec4bbb", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "db3824bfdbfdcad91d0941495719f04dbeaca053", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "1de7d17110efaa5ed2ed30a44d415f28987f89f3", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "9075ff0f527b00ef8767db99d2e2a11783deace76babbffbff04cfdc5c8d255f", + "state_sha256": "00077b52438250f37b217eb353c2927c17350ca6e5d5ec8249f5f98f02873e2f" + } + }, + "after": { + "head": "6160dae6fb0d591ccbfc2d2c17fc003a2ce209b0", + "branch": "feature/dependency-workspace", + "target_branch": "main", + "target_head": "4f84c2e1630cd0311643529fae1c3a99f1dd5d64", + "status": " M .task/feature-dependency-workspace.md\n", + "tracked_diff_sha256": "ca5c9578bb242503eb2cf1125eb998b7b9e81f4324babb60bd1e206b8a13b638", + "untracked": {}, + "submodules": "", + "components": { + "manifest_sha256": "c8cddfff753bee796e6a75f9c22b5392f4b2cfeee340dadc61ff82e71238318b", + "components": { + "Logging-System": { + "state": "missing" + }, + "Error-Code-System": { + "state": "missing" + }, + "Agent-System-Core": { + "state": "missing" + }, + "Agent-System-UI": { + "state": "missing" + }, + "Agent-System-Frontend": { + "head": "74511db9a6fb12e17954cb0c3f8e8846a6ecf831", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Native": { + "head": "6ddd3da8df5ccc532f5b06f0aa8d49662e6f049e", + "branch": "feature/dependency-live-edit-probe", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-Intent": { + "state": "missing" + }, + "Agent-Command": { + "state": "missing" + }, + "Agent-Squad": { + "state": "missing" + }, + "Agent-System-Backend": { + "head": "48649a37ee92373c639a384a2c5a9dfaa2ec4bbb", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Development-Guidelines": { + "head": "db3824bfdbfdcad91d0941495719f04dbeaca053", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + }, + "Agent-System-Documents": { + "head": "1de7d17110efaa5ed2ed30a44d415f28987f89f3", + "branch": "", + "status": "", + "tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "untracked": {} + } + }, + "lock_sha256": "9075ff0f527b00ef8767db99d2e2a11783deace76babbffbff04cfdc5c8d255f", + "state_sha256": "00077b52438250f37b217eb353c2927c17350ca6e5d5ec8249f5f98f02873e2f" + } + }, + "after_error": null, + "exit_code": 0, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\npython3 scripts/build-composition.py --root . --target build\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Frontend.git /tmp/agent-system-composition-963wuwfl/Agent-System-Frontend-git\nCloning into '/tmp/agent-system-composition-963wuwfl/Agent-System-Frontend-git'...\n[composition] git clone --no-checkout --no-hardlinks -- ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Backend.git /tmp/agent-system-composition-963wuwfl/Agent-System-Backend-git\nCloning into '/tmp/agent-system-composition-963wuwfl/Agent-System-Backend-git'...\n[composition] npm ci --ignore-scripts --no-audit --no-fund\nnpm warn deprecated uuid@10.0.0: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).\n\nadded 178 packages in 3s\n[composition] npm cache add @babel/code-frame@7.29.7 @babel/compat-data@7.29.7 @babel/core@7.29.7 @babel/generator@7.29.8 @babel/helper-compilation-targets@7.29.7 @babel/helper-globals@7.29.7 @babel/helper-module-imports@7.29.7 @babel/helper-module-transforms@7.29.7 @babel/helper-plugin-utils@7.29.7 @babel/helper-string-parser@7.29.7 @babel/helper-validator-identifier@7.29.7 @babel/helper-validator-option@7.29.7 @babel/helpers@7.29.7 @babel/parser@7.29.9 @babel/plugin-transform-react-jsx-self@7.29.7 @babel/plugin-transform-react-jsx-source@7.29.7 @babel/template@7.29.7 @babel/traverse@7.29.8 @babel/types@7.29.8 @esbuild/linux-x64@0.25.12 @jridgewell/gen-mapping@0.3.13 @jridgewell/remapping@2.3.5 @jridgewell/resolve-uri@3.1.2 @jridgewell/sourcemap-codec@1.6.0 @jridgewell/trace-mapping@0.3.31 @napi-rs/lzma-linux-x64-gnu@1.5.1 @nodelib/fs.scandir@2.1.5 @nodelib/fs.stat@2.0.5 @nodelib/fs.walk@1.2.8 @oxc-resolver/binding-linux-x64-gnu@11.24.2 @playwright/test@1.64.0 @rolldown/pluginutils@1.0.0-beta.27 @rollup/rollup-linux-x64-gnu@4.63.5 @standard-schema/spec@1.1.0 @types/babel__core@7.20.5 @types/babel__generator@7.27.0 @types/babel__template@7.4.4 @types/babel__traverse@7.28.0 @types/chai@5.2.3 @types/deep-eql@4.0.2 @types/estree@1.0.9 @types/node@22.20.4 @types/react-dom@19.3.0 @types/react@19.3.0 @types/trusted-types@2.0.7 @vitejs/plugin-react@4.7.0 @vitest/expect@4.1.11 @vitest/mocker@4.1.11 @vitest/pretty-format@4.1.11 @vitest/runner@4.1.11 @vitest/snapshot@4.1.11 @vitest/spy@4.1.11 @vitest/utils@4.1.11 @xmldom/xmldom@0.8.15 adler-32@1.3.1 argparse@1.0.10 assertion-error@2.0.1 base64-js@1.5.1 baseline-browser-mapping@2.11.26 braces@3.0.3 browserslist@4.29.3 caniuse-lite@1.0.30001813 cfb@1.2.2 chai@6.2.2 codepage@1.15.0 convert-source-map@2.0.0 core-util-is@1.0.3 crc-32@1.2.2 csstype@3.2.3 debug@4.4.3 dingbat-to-unicode@1.0.2 docx-preview@0.4.1 dompurify@3.4.16 duck@0.1.12 echarts@5.6.0 electron-to-chromium@1.5.440 es-module-lexer@2.3.2 esbuild@0.25.12 escalade@3.2.0 estree-walker@3.0.3 expect-type@1.4.0 fast-glob@3.3.3 fastq@1.20.3 fd-package-json@2.0.0 fdir@6.5.0 fill-range@7.1.1 formatly@0.3.0 frac@1.1.2 gensync@1.0.0-beta.2 glob-parent@5.1.2 immediate@3.0.6 inherits@2.0.4 is-extglob@2.1.1 is-glob@4.0.3 is-number@7.0.0 isarray@1.0.0 jiti@2.7.0 js-tokens@4.0.0 jsesc@3.1.0 json5@2.2.3 jszip@3.10.2 knip@5.88.1 lie@3.3.0 lodash@4.18.1 lop@0.4.2 lru-cache@5.1.1 magic-string@0.30.21 mammoth@1.13.0 marked@15.0.12 merge2@1.4.1 micromatch@4.0.8 minimist@1.2.8 ms@2.1.3 nanoid@3.3.19 node-releases@2.0.57 obug@2.2.1 option@0.2.4 oxc-resolver@11.24.2 pako@1.0.11 pathe@2.0.3 picocolors@1.1.1 picomatch@2.3.2 picomatch@4.0.7 playwright-core@1.64.0 playwright@1.64.0 postcss@8.5.28 pptx-preview@1.0.7 process-nextick-args@2.0.1 queue-microtask@1.2.3 react-dom@19.3.0 react-refresh@0.17.0 react@19.3.0 readable-stream@2.3.8 reusify@1.1.0 rollup@4.63.5 run-parallel@1.2.0 safe-buffer@5.1.2 scheduler@0.28.0 semver@6.3.1 setimmediate@1.0.5 siginfo@2.0.0 smol-toml@1.9.0 source-map-js@1.2.1 sprintf-js@1.0.3 ssf@0.11.2 stackback@0.0.2 std-env@4.3.0 string_decoder@1.1.1 strip-json-comments@5.0.3 tinybench@2.9.0 tinyexec@1.3.1 tinyglobby@0.2.17 tinyrainbow@3.2.0 to-regex-range@5.0.1 tslib@2.3.0 tslib@2.8.1 typescript@5.9.3 unbash@2.2.0 underscore@1.13.8 undici-types@6.21.0 update-browserslist-db@1.3.3 util-deprecate@1.0.2 uuid@10.0.0 vite@6.4.3 vitest@4.1.11 walk-up-path@4.0.0 why-is-node-running@2.3.0 wmf@1.0.2 word@0.3.0 xlsx@0.18.5 xmlbuilder@10.1.1 yallist@3.1.1 yaml@2.9.1 zod@4.6.5 zrender@5.6.1 --ignore-scripts --registry=https://registry.npmjs.org --userconfig=/dev/null --globalconfig=/tmp/composition-npm-metadata-v8qyfz1u/empty-global.npmrc\n[composition] go mod verify\nall modules verified\n[composition] npm run build\n\n(!) Some chunks are larger than 500 kB after minification. Consider:\n- Using dynamic import() to code-split the application\n- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks\n- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.\n\n> agent-system-frontend@0.1.0 build\n> tsc -b && vite build\n\nvite v6.4.3 building for production...\ntransforming...\n✓ 1015 modules transformed.\nrendering chunks...\ncomputing gzip size...\ndist/index.html 0.40 kB │ gzip: 0.27 kB\ndist/assets/index-BWPiL_PS.css 93.18 kB │ gzip: 16.04 kB\ndist/assets/jszip.min-d-4Zmon1.js 0.12 kB │ gzip: 0.12 kB\ndist/assets/docx-preview-6sU_ku0G.js 77.41 kB │ gzip: 21.29 kB\ndist/assets/jszip.min-kSHCEEHx.js 97.26 kB │ gzip: 30.16 kB\ndist/assets/index-DoGujINZ.js 213.14 kB │ gzip: 70.03 kB\ndist/assets/xlsx-CkFp8p6R.js 429.53 kB │ gzip: 143.07 kB\ndist/assets/index-Ctb2bcvo.js 561.83 kB │ gzip: 175.12 kB\ndist/assets/pptx-preview.es-Dtz_cWFU.js 1,255.23 kB │ gzip: 401.46 kB\n✓ built in 4.84s\n[composition] go build -mod=readonly -trimpath -buildvcs=false -ldflags=-s -w -X main.version=6160dae6fb0d+backend=48649a37ee92+frontend=74511db9a6fb+deps=1771de583882 -o /tmp/agent-system-composition-963wuwfl/products/agent-system ./cmd/agent-system\n[composition] go build -mod=readonly -trimpath -buildvcs=false -ldflags=-s -w -o /tmp/agent-system-composition-963wuwfl/products/storage-migrate ./cmd/storage-migrate\n[composition] complete: build; manifest=/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace/bin/resolved-manifest.json\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-dependency-workspace'\n", + "output_sha256": "1cb9224a3d153b958f332cd3d1820d6a66e0186f621d528444d833127fc2d379", + "receipt_sha256": "0d58ae51c1379b7ef56233bf957b7f732077ba4141ff2425d96ceb5138d23d42" +} +``` + +## 2026-10-14 #537 正式窗口与阶段 7 待验收对象 + +用户授权本会话在 #518 先完成 #538 窗口交接,再接管 #537;该授权只覆盖 #537 的最终同步与验证,不替代阶段 7 人工验收。权威窗口 `mq-dev-20261014-537-01` 已领取,前一任务卡闭合 PR #538 实际合入后,Dev main=`4f84c2e1630cd0311643529fae1c3a99f1dd5d64`。本任务的正式合并提交 `6160dae6fb0d591ccbfc2d2c17fc003a2ce209b0` 包含该 main 和迁移候选 `3270abff016f2227b8a3894fa69645a5b61c6664`;当前阶段 7 结论仍为未评审,迁移 PR 未合入。 + +冲突处理只将旧 `modules/backend`、`modules/frontend` gitlink 从主仓索引退役,原物理目录与各自 `.git` 保留;`scripts/e2e.sh` 采用此前隔离浏览器重放过的语义合并,保留 #488 的首次设密、显式 `audit.read`、进程 PID 清理、审计与普通基座浏览器用例,并改用固定依赖构建。#538 对该脚本无新增修改;其任务卡闭合、`scripts/task.sh` 与治理回归已纳入。`make task-sync` 的初次冲突和固定 Frontend 工作区旧版拒绝原始收据分别在 `/tmp/dependency-537-final-sync-20261014-01a1345f.json`、`/tmp/dependency-537-sync-confirm-20261014-01a1345f.json`;旧版以显式 `REFRESH_FIXED=1` 保留引用后刷新到 `74511db9a6fb12e17954cb0c3f8e8846a6ecf831`,再跑同基线 task-sync 得 `changed=0`。成功的完整 SELF 输出已由 `IMPORT_RECEIPT` 原样导入本卡;外部原件 `/tmp/dependency-537-sync-confirm-2-20261014-01a1345f.json`。 + +当前固定的提供方版本:Frontend `74511db9a6fb12e17954cb0c3f8e8846a6ecf831`、Backend `48649a37ee92373c639a384a2c5a9dfaa2ec4bbb`、Guidelines `db3824bfdbfdcad91d0941495719f04dbeaca053`、Documents `1de7d17110efaa5ed2ed30a44d415f28987f89f3`;版本来源与 14 条消费记录的先前审计见 `/tmp/dependency-versioned-source-reachability-20261014-01a1345f.json`,最终提交仍需重验。RDM 本地 `1844df1d3ec453f8d1a4097596fa9b787c05d1c9` 已含上游业务及任务卡归档,但远端 #363 尚未推此对象;其固定 Dev composer `c5068ed` 待本分支正常推送后才能在平台取得。 + +本地 `make build` 在合并提交 6160dae 上通过,完整 SELF 输出已由 `make evidence` 写入本卡,receipt_sha256=`0d58ae51c1379b7ef56233bf957b7f732077ba4141ff2425d96ceb5138d23d42`。首次完整测试在私有 Core SSH 连接长时间无收发后受控退出,原始失败 SELF receipt_sha256=`4089679f6f14bdc8d9da7ac0d28092864d791d72efcdfda47d9b6ad2d042b772`;Core 单独 SSH 读取随后成功,原件 `/tmp/dependency-537-core-ssh-probe-20261014-01a1345f.json`。有界 SSH 的完整测试继续到 476 项治理回归,19 项显式跳过、3 项因固定端口 `18803`、`9461`、`18812` 被 Python 进程占用失败;同一时段另有其他工作区测试并行,具体占口 PID 归属未固化。该次失败完整 SELF 输出亦由 `make evidence` 写入本卡,receipt_sha256=`8af14b7b1f30aadbc6a5d99cea322502b3ba172b0cbaa87d953930c65b1da9df`,不标为通过。 + +阶段 7 仍需:当前最终 HEAD 的受信 CI(test、test-pg、svc-realcombo),固定组合清单与必要局部重放,RDM 当前 HEAD 的实际 GATE,以及 R1–R15 的完整证据/缺项表。源码外阶段 7 索引为 `/tmp/dependency-stage7-readiness-20261014-01a1345f.md`,将按最终 SHA、平台结果更新后提交人工审阅。前述隔离普通克隆、按需 Native 修改与解除、旧 gitlink 候选重建、浏览器 5+2 重放仍只属于各自原对象的 SELF/REPLAY,不能代替当前候选的 CI 或人工结论。共享服务、业务数据、发布、历史改写、保护设置、迁移 PR 合入及工作区回收均未执行。 -- 2.54.0