diff --git a/.task/feature-svc-db-config-recover.md b/.task/feature-svc-db-config-recover.md index fd554b39..882cd698 100644 --- a/.task/feature-svc-db-config-recover.md +++ b/.task/feature-svc-db-config-recover.md @@ -7,46 +7,61 @@ - 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 80a518628c526fd6ddece4abeb707ab4bb0b5618 - 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover(worktree);分支:feature/svc-db-config-recover -- 授权与交付终点:<本次允许的动作与终点;未授权事项写明> -- 交付模式:manual(逐阶段人工评审);明确授权后可记为 authorized-continuous +- 授权与交付终点:用户 2026-10-11 会话消息批准「数据库配置可恢复、所有启动入口统一解析、绑定失效时拒绝启动」修复方案并要求补连续重启回归测试;本任务终点 = 代码修复 + 回归测试 + 文档 + 隔离验证 + PR 合入。**dev 运行环境的部署验收不在本任务内**(用户明确"另行确认部署范围后"单独执行)。 +- 交付模式:manual(逐阶段人工评审);阶段 1–5 经上述消息一次性确认(方案含实施顺序) - 自动推进授权:无;授权范围:无;授权来源:无;授权终点:无;停止条件:无(未授权) -- 当前阶段:需求拆解;当前增量:I1(待定义) +- 当前阶段:实施与自检(代码/测试/文档/隔离验证完成,证据已入卡);当前增量:I1 - 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位) ## 目标与非目标 -<预期结果、受影响入口/模块/契约;明确不做什么。> +修复 scripts/svc.sh 数据库配置在重启链路丢失的缺陷(2026-10-05/10-11 dev 事故): +根因 = 复用 exec= 分支的 G1-7 迁移把 --dsn 剥入进程环境后 record_state 写回不含 +DSN 的 exec=,而 dbref 兜底只在显式参数重建分支存在——重新绑定后的第二次裸 +restart 即丢库(回环地址下静默回退 SQLite)。实现:数据库配置可恢复持久化 +(dbref=/dsn=/db= 专键)、start/restart/deploy/update/db 统一解析、绑定失效/配置 +冲突拒绝启动(绝不静默回退 SQLite)、认证预检按最终有效 DSN 判定、存量 exec= DSN +幂等迁移、连续重启回归测试与文档更新。 + +非目标:不改动 modules/backend(后端 team 档缺 DSN 拒启为既有第二道防线,本任务只 +按源码引用其口径);不做 dev 运行环境部署(另行授权后单独执行);不自动生成全局 +.svc.env(现有 $ROOT/.svc.env 自动加载机制保持)。 ## 关联方向与规划 -- 适用状态:待核对(无适用规划时说明原因) -- 主记录路径/版本:待核对(路径按仓库根目录定位,归档后不变;只引用唯一正文) -- 对应里程碑:待核对 +- 适用状态:无适用规划(事故修复,无 modules/documents/docs/proposals/ 对应方案) +- 主记录路径/版本:不适用;事故时间线与方案 = 用户 2026-10-11 会话消息(本卡为唯一仓内主记录) +- 对应里程碑:不适用 ## 需求分析 | ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 | |---|---|---|---|---|---|---| -| R1 | 待填写 | 待评估 | 待定 | 待定义 | 待确认 | 待评审 | +| R1 | 存量 exec= DSN 迁移为可恢复配置(dbref= 或受保护 dsn=),幂等 | 符合(migrate_legacy_db_config;命中实例升级托管绑定,密码不重复保存) | P0 | 连续启动两次均恢复同一数据库配置;exec= 与进程命令行无秘密 | — | 已实现+已验证 | +| R2 | start/restart/deploy/update/db 共用统一解析;改端口/地址/版本不改变数据库选择 | 符合(resolve_db_config 单点;env_config 按实例重置解析态防批量串用;重建保留 conffile) | P0 | 裸 restart/deploy/update 保留绑定;restart --addr 后数据库与 auth 不变 | R1 | 已实现+已验证 | +| R3 | 绑定失效/冲突拒启:dbref 实例缺失或登记不全、pg 无可恢复 DSN、直接 DSN 与 dbref 不同库、conffile dsn 不一致、mock 共存、产物不消费环境 DSN | 符合(resolve+agent_static_preflight;移除"无法重建 DSN 按无绑定启动"降级;restart/deploy 停旧前静态预检) | P0 | 各场景返回非零、不启动进程、不建 SQLite、登记可恢复;运行中服务预检拒绝不停机 | R2 | 已实现+已验证 | +| R4 | 认证预检按最终有效 DSN 与 auth 判定(对齐 AuthEnabled:on/off/auto,含环境与配置文件来源) | 符合(db_auth_enabled 取代命令行 --dsn 匹配) | P1 | auto+环境 DSN 预检放行;off+DSN 拒绝 | R2 | 已实现+已验证 | +| R5 | 显式解绑记录明确 SQLite 选择,阻止环境残留重新选库 | 符合(db=sqlite;解析层忽略 SVC_*_DSN 残留;CLI 显式 --dsn 可覆盖) | P1 | 解绑后带残留环境变量启动仍为内嵌档 | R2 | 已实现+已验证 | +| R6 | 回归测试 + 文档(tests/test_svc.py 由 test-governance 自动发现;docs/svc.md 与脚本帮助) | 符合(11 用例;对修复前脚本 10/11 失败,复现缺陷成立) | P0 | 新代码全过;旧代码复现失败;字段/优先级/拒启规则文档化 | R1–R5 | 已实现+已验证 | ## 方案与计划 -- 方案引用:待填写(含对象版本) -- 实施计划引用:待填写(含增量与需求 ID) -- 测试计划引用:待填写(含需求 ID 与验收条件) +- 方案引用:用户 2026-10-11 会话消息(根因修正、持久化规则表、统一解析、拒启清单、验收场景表、实施顺序);对象版本 R0=80a518628c +- 实施计划:I1 = svc.sh 改造(R1–R5)+ tests/test_svc.py(R6)+ docs/svc.md 与脚本帮助 + 隔离验证,单一增量 +- 测试计划:bash -n / make test-governance(含新 11 用例)/ make test / make build / 隔离环境真实 PostgreSQL+真实产物验证(连续重启、deploy、库身份 psql 直查、库不可用拒启、凭据不泄露);全部经 make evidence 入卡 ## 阶段评审 | 阶段 | 对象版本 | 结论 | 评审人 | 时间 | 依据 | |---|---|---|---|---|---| -| 需求拆解 | 待定 | 未评审 | — | — | — | -| 需求评估 | 待定 | 未评审 | — | — | — | -| 需求表确认 | 待定 | 未评审 | — | — | — | -| 方案设计 | 待定 | 未评审 | — | — | — | -| 实施计划 | 待定 | 未评审 | — | — | — | -| 实施与自检 | 待定 | 未评审 | — | — | — | -| 正式测试与验收 | 待定 | 未评审 | — | — | — | -| 代码 Review | 待定 | 未评审 | — | — | — | +| 需求拆解 | 80a518628c | 通过 | weichen | 2026-10-11 | 会话消息(目标/边界/非目标一致) | +| 需求评估 | 80a518628c | 通过 | weichen | 2026-10-11 | 会话消息(可行性/风险/实施顺序) | +| 需求表确认 | 80a518628c | 通过 | weichen | 2026-10-11 | 会话消息验收场景表 | +| 方案设计 | 80a518628c | 通过 | weichen | 2026-10-11 | 会话消息「建议采用…修复方案」(含两处关联缺陷修正) | +| 实施计划 | 80a518628c | 通过 | weichen | 2026-10-11 | 会话消息第 5 节实施与上线顺序 | +| 实施与自检 | 任务分支 HEAD | 通过(作者自检,SELF) | Agent | 2026-10-11 | 证据表:bash -n / test-governance / make test / make build | +| 正式测试与验收 | 任务分支 HEAD | 通过(SELF;CI 于 PR HEAD 复跑升 GATE) | Agent | 2026-10-11 | 证据表:隔离真实 PG 验证 27/27 | +| 代码 Review | 任务分支 HEAD | 待 PR/CI | — | — | PR diff + CI(GATE);按既定自主闭环惯例推进 | | 合入 | 待定 | 未评审 | — | — | — | | 合入核验与收口 | 待定 | 未评审 | — | — | — | @@ -54,7 +69,8 @@ | 增量/试验 | 假设 | 范围 | 判断和停止条件 | 批准依据 | 结果 | 变更影响 | 需重审补测 | |---|---|---|---|---|---|---|---| -| 待定义 | — | — | — | 未批准 | NOT_RUN | 待评估 | 待评估 | +| I1 实施内迭代 | 见需求表 | svc.sh + tests + docs;临时目录/隔离 PG | 全部验收条件通过或记录缺项 | 用户方案消息(覆盖实施范围) | 复现确认:旧脚本 10/11 用例失败;修复后 11/11 过 | 无范围变更 | — | +| 真实产物能力探测 | config explain 反映 AGENT_SYSTEM_DSN(用户名可见)可用于探测 | bin_env_dsn_supported | 真实二进制实测命中 | 方案消息"启用前必须验证实际部署二进制支持" | PASS(v0.3.0-224 实测 `dsn postgresql://svcprobe:***@… env`) | — | — | ## 同步记录 @@ -70,19 +86,34 @@ ## 结果与验证(完成后填写) -- 结果: -- 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表> -- 影响与剩余项: +- 结果:R1–R6 全部实现。svc.sh 新增统一解析(resolve_db_config / migrate_legacy_db_config / + agent_static_preflight / db_auth_enabled / bin_env_dsn_supported),svc.env 新增 db=/dsn= 专键 + 并原子写入,restart/deploy 停旧前静态预检,db 绑定/解绑按托管形态落键;新增 + tests/test_svc.py(11 用例);docs/svc.md §4.5/§9/§10/§11/§13 与脚本帮助同步更新。 +- 验证:PASS——bash -n(exit 0);make test-governance 115 用例全过(含新 11); + make test 全绿;make build exit 0;隔离环境真实 PostgreSQL 18.6 + 真实产物 + v0.3.0-224 验证 27/27(连续两次裸 restart + 第三次 start 保绑定且 DSN 经环境交付、 + API 写入标记经 psql 直查 pgx/agent 证实真实库身份、deploy --from local 后标记仍在、 + 库不可用 restart 失败 rc=1 且 dbref/db=pg 保留、库恢复后回到同一库、命令行/日志/ + 历史无密码、data 目录无 SQLite 误建)。复现性:同一测试对修复前脚本(main@80a5186) + 10/11 失败。以上均由 make evidence 写入证据表(SELF;CI 于 PR HEAD 复跑 make + test+make build 为 GATE)。 +- 影响与剩余项:行为变化——(a) 旧产物(不消费 AGENT_SYSTEM_DSN)在需要交付数据库 + 配置时从"静默按内嵌档跑"改为拒绝;(b) mock 与绑定共存从"忽略绑定"改为拒绝; + (c) 绑定失效从"按无绑定启动(回环下静默 SQLite)"改为拒绝。dev 运行环境部署验收 + 未执行(未授权范围,另行安排:换新脚本 → 核验数据库身份与 weichen 登录 → 裸 + restart 复验;现有 SQLite 文件保留待只读核对)。 ## 规划进展与下一步 -- 本次推进/剩余:待核对(依据实际成果更新适用方案/规划) -- 首选下一任务:待核对(无适用规划、已完成或受阻时如实说明,不虚构任务) -- 推荐依据:待填写 -- 前置条件/待确认:待核对 -- 预期产物/验收条件:待定义 -- 重复任务核对:待核对(已有/在途任务、PR 与规划记录) -- 启动授权:未授权(建议不自动启动新任务,仍须明确授权) +- 本次推进/剩余:无适用规划;本任务为独立事故修复,已实现+已验证,合入状态见下 +- 首选下一任务:dev 运行环境部署验收(应用本修复到运行中的 dev 服务:快照→换脚本→ + 核验 PostgreSQL 身份与登录→裸 restart 复验),属新授权范围 +- 推荐依据:方案消息第 5.3 节实施顺序;修复未部署则事故可复发 +- 前置条件/待确认:用户确认部署范围与时间窗;现有误写 SQLite 数据是否需迁移(只读核对后定) +- 预期产物/验收条件:dev 服务连续裸 restart 后仍连目标 PG(库身份核验 + 登录成功) +- 重复任务核对:无覆盖该工作的已有/在途任务 +- 启动授权:未授权(须用户明确授权后另行启动) ## 合入与清理 @@ -126,3 +157,213 @@ "receipt_sha256": "5a9ab811a6fb220ae86955ea51e29f0be6dc3476c8008021b91acb5740c79fd0" } ``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-11T09:11:36.239687+00:00", + "command": "bash -n scripts/svc.sh", + "command_sha256": "af9ef10e61d7f7a8d1bef7a5ebb6334e3c68470f4c21dd8928dbee3e146e5d61", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "6332767c39466defd073f599a69d3fac0529f2f5", + "branch": "feature/svc-db-config-recover", + "target_branch": "main", + "target_head": "b3b48f5efa2a6a25f16f6413d8b9c89715f22960", + "status": " M docs/svc.md\n M scripts/svc.sh\n?? tests/test_svc.py\n", + "tracked_diff_sha256": "28b138b050e8f3b68ee6ff53142ba955ecc83fbe5466fc45bd69cd6b6b193d5a", + "untracked": { + "tests/test_svc.py": "fcdd05455cdabdb91e7052b640c05401b0aec07544f4db4ba203a66d2260ceff" + }, + "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 c8d66ca3cd21b055a8605e9eb4d8e525037618a6 modules/backend (v0.3.0-40-gc8d66ca)\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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/backend/deps/agent-system-core (v0.3.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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/core (v0.3.0)\n 5ac58dcd7e3058c8caa9e3768bc7155d5370e91f modules/documents (remotes/origin/feature/collab-storage-u3-budget-authz-1-g5ac58dc)\n 3ed10e122042a64180fb24a42d9cc6438cd2d2d6 modules/frontend (v0.3.0-4-g3ed10e1)\n 76d6633736a7abb36ac1ecca42fe4e6f120d0558 modules/ui (v0.3.0)\n" + }, + "after": { + "head": "6332767c39466defd073f599a69d3fac0529f2f5", + "branch": "feature/svc-db-config-recover", + "target_branch": "main", + "target_head": "b3b48f5efa2a6a25f16f6413d8b9c89715f22960", + "status": " M docs/svc.md\n M scripts/svc.sh\n?? tests/test_svc.py\n", + "tracked_diff_sha256": "28b138b050e8f3b68ee6ff53142ba955ecc83fbe5466fc45bd69cd6b6b193d5a", + "untracked": { + "tests/test_svc.py": "fcdd05455cdabdb91e7052b640c05401b0aec07544f4db4ba203a66d2260ceff" + }, + "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 c8d66ca3cd21b055a8605e9eb4d8e525037618a6 modules/backend (v0.3.0-40-gc8d66ca)\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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/backend/deps/agent-system-core (v0.3.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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/core (v0.3.0)\n 5ac58dcd7e3058c8caa9e3768bc7155d5370e91f modules/documents (remotes/origin/feature/collab-storage-u3-budget-authz-1-g5ac58dc)\n 3ed10e122042a64180fb24a42d9cc6438cd2d2d6 modules/frontend (v0.3.0-4-g3ed10e1)\n 76d6633736a7abb36ac1ecca42fe4e6f120d0558 modules/ui (v0.3.0)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "", + "output_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "receipt_sha256": "23cd3904543793305d50b48e6809ce6c8d7522660d36ec85b2ce16ac2c0d2a96" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-11T09:11:50.497832+00:00", + "command": "make test-governance", + "command_sha256": "9776a8dfcfb8f4c95abc94c40cae3a2c0e91e8f4b91fe95d98085c290e929158", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "6332767c39466defd073f599a69d3fac0529f2f5", + "branch": "feature/svc-db-config-recover", + "target_branch": "main", + "target_head": "b3b48f5efa2a6a25f16f6413d8b9c89715f22960", + "status": " M .task/feature-svc-db-config-recover.md\n M docs/svc.md\n M scripts/svc.sh\n?? tests/test_svc.py\n", + "tracked_diff_sha256": "99504a146c6a29566b00234d72ef66db30c7657e2b0f8a0f74bfc41f6304d2b6", + "untracked": { + "tests/test_svc.py": "fcdd05455cdabdb91e7052b640c05401b0aec07544f4db4ba203a66d2260ceff" + }, + "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 c8d66ca3cd21b055a8605e9eb4d8e525037618a6 modules/backend (v0.3.0-40-gc8d66ca)\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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/backend/deps/agent-system-core (v0.3.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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/core (v0.3.0)\n 5ac58dcd7e3058c8caa9e3768bc7155d5370e91f modules/documents (remotes/origin/feature/collab-storage-u3-budget-authz-1-g5ac58dc)\n 3ed10e122042a64180fb24a42d9cc6438cd2d2d6 modules/frontend (v0.3.0-4-g3ed10e1)\n 76d6633736a7abb36ac1ecca42fe4e6f120d0558 modules/ui (v0.3.0)\n" + }, + "after": { + "head": "6332767c39466defd073f599a69d3fac0529f2f5", + "branch": "feature/svc-db-config-recover", + "target_branch": "main", + "target_head": "b3b48f5efa2a6a25f16f6413d8b9c89715f22960", + "status": " M .task/feature-svc-db-config-recover.md\n M docs/svc.md\n M scripts/svc.sh\n?? tests/test_svc.py\n", + "tracked_diff_sha256": "99504a146c6a29566b00234d72ef66db30c7657e2b0f8a0f74bfc41f6304d2b6", + "untracked": { + "tests/test_svc.py": "fcdd05455cdabdb91e7052b640c05401b0aec07544f4db4ba203a66d2260ceff" + }, + "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 c8d66ca3cd21b055a8605e9eb4d8e525037618a6 modules/backend (v0.3.0-40-gc8d66ca)\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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/backend/deps/agent-system-core (v0.3.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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/core (v0.3.0)\n 5ac58dcd7e3058c8caa9e3768bc7155d5370e91f modules/documents (remotes/origin/feature/collab-storage-u3-budget-authz-1-g5ac58dc)\n 3ed10e122042a64180fb24a42d9cc6438cd2d2d6 modules/frontend (v0.3.0-4-g3ed10e1)\n 76d6633736a7abb36ac1ecca42fe4e6f120d0558 modules/ui (v0.3.0)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover'\nPYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -p 'test_*.py' -v\ntest_candidate_cannot_read_checkout_credentials (test_ci_credentials.CheckoutTests.test_candidate_cannot_read_checkout_credentials) ... ok\ntest_candidate_submodule_update_commands_are_rejected (test_ci_credentials.CheckoutTests.test_candidate_submodule_update_commands_are_rejected) ... ok\ntest_credential_destination_confined_to_injected_server (test_ci_credentials.CheckoutTests.test_credential_destination_confined_to_injected_server) ... ok\ntest_external_or_unlisted_urls_are_rejected_before_component_fetch (test_ci_credentials.CheckoutTests.test_external_or_unlisted_urls_are_rejected_before_component_fetch) ... ok\ntest_inherited_template_hook_does_not_execute_with_credentials (test_ci_credentials.CheckoutTests.test_inherited_template_hook_does_not_execute_with_credentials) ... ok\ntest_nested_external_url_is_rejected_before_authenticated_fetch (test_ci_credentials.CheckoutTests.test_nested_external_url_is_rejected_before_authenticated_fetch) ... ok\ntest_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials (test_ci_credentials.CheckoutTests.test_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials) ... ok\ntest_redirects_do_not_forward_credential_or_fetch_unlisted_target (test_ci_credentials.CheckoutTests.test_redirects_do_not_forward_credential_or_fetch_unlisted_target) ... ok\ntest_after_snapshot_failure_keeps_command_exit_and_output (test_evidence.EvidenceTests.test_after_snapshot_failure_keeps_command_exit_and_output) ... ok\ntest_all_persisted_and_displayed_text_is_sanitized (test_evidence.EvidenceTests.test_all_persisted_and_displayed_text_is_sanitized) ... ok\ntest_authorization_forms_are_redacted_in_capture_console_and_import (test_evidence.EvidenceTests.test_authorization_forms_are_redacted_in_capture_console_and_import) ... ok\ntest_authorization_forms_are_redacted_on_direct_card_capture (test_evidence.EvidenceTests.test_authorization_forms_are_redacted_on_direct_card_capture) ... ok\ntest_before_after_heads_do_not_relabel_changed_command (test_evidence.EvidenceTests.test_before_after_heads_do_not_relabel_changed_command) ... ok\ntest_capture_does_not_overwrite_an_existing_receipt (test_evidence.EvidenceTests.test_capture_does_not_overwrite_an_existing_receipt) ... ok\ntest_capture_without_card_and_import_without_rerun (test_evidence.EvidenceTests.test_capture_without_card_and_import_without_rerun) ... ok\ntest_child_failure_code_is_preserved (test_evidence.EvidenceTests.test_child_failure_code_is_preserved) ... ok\ntest_command_line_token_arguments_are_redacted (test_evidence.EvidenceTests.test_command_line_token_arguments_are_redacted) ... ok\ntest_dirty_and_untracked_contents_have_object_digests (test_evidence.EvidenceTests.test_dirty_and_untracked_contents_have_object_digests) ... ok\ntest_failed_child_exit_survives_receipt_write_failure (test_evidence.EvidenceTests.test_failed_child_exit_survives_receipt_write_failure) ... ok\ntest_full_output_is_preserved_not_only_tail (test_evidence.EvidenceTests.test_full_output_is_preserved_not_only_tail) ... ok\ntest_import_missing_card_fails_without_losing_receipt (test_evidence.EvidenceTests.test_import_missing_card_fails_without_losing_receipt) ... ok\ntest_import_rejects_unredacted_authorization_with_valid_checksums (test_evidence.EvidenceTests.test_import_rejects_unredacted_authorization_with_valid_checksums) ... ok\ntest_import_retry_is_idempotent (test_evidence.EvidenceTests.test_import_retry_is_idempotent) ... ok\ntest_invalid_field_types_and_forged_source_are_rejected (test_evidence.EvidenceTests.test_invalid_field_types_and_forged_source_are_rejected) ... ok\ntest_known_secret_environment_value_is_redacted_without_label (test_evidence.EvidenceTests.test_known_secret_environment_value_is_redacted_without_label) ... ok\ntest_linked_worktree_import_preserves_source_identity (test_evidence.EvidenceTests.test_linked_worktree_import_preserves_source_identity) ... ok\ntest_missing_card_does_not_execute (test_evidence.EvidenceTests.test_missing_card_does_not_execute) ... ok\ntest_missing_required_snapshot_fields_are_rejected (test_evidence.EvidenceTests.test_missing_required_snapshot_fields_are_rejected) ... ok\ntest_nested_cwd_records_untracked_files_from_repository_root (test_evidence.EvidenceTests.test_nested_cwd_records_untracked_files_from_repository_root) ... ok\ntest_output_digest_checked_even_if_receipt_digest_recomputed (test_evidence.EvidenceTests.test_output_digest_checked_even_if_receipt_digest_recomputed) ... ok\ntest_pipeline_failure_is_recorded_and_returned (test_evidence.EvidenceTests.test_pipeline_failure_is_recorded_and_returned) ... ok\ntest_quoted_credentials_with_spaces_are_fully_redacted (test_evidence.EvidenceTests.test_quoted_credentials_with_spaces_are_fully_redacted) ... ok\ntest_receipt_write_failure_cannot_claim_success (test_evidence.EvidenceTests.test_receipt_write_failure_cannot_claim_success) ... ok\ntest_recorder_environment_does_not_leak_into_nested_commands (test_evidence.EvidenceTests.test_recorder_environment_does_not_leak_into_nested_commands) ... ok\ntest_source_cannot_be_promoted_by_environment (test_evidence.EvidenceTests.test_source_cannot_be_promoted_by_environment) ... ok\ntest_tamper_is_rejected_before_card_append (test_evidence.EvidenceTests.test_tamper_is_rejected_before_card_append) ... ok\ntest_unrelated_repo_cannot_import (test_evidence.EvidenceTests.test_unrelated_repo_cannot_import) ... ok\ntest_validate_precheck_checks_result_and_current_base (test_evidence.EvidenceTests.test_validate_precheck_checks_result_and_current_base) ... ok\ntest_validate_precheck_rejects_successful_arbitrary_command (test_evidence.EvidenceTests.test_validate_precheck_rejects_successful_arbitrary_command) ... ok\ntest_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_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_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_sequential_restarts_no_cross_dsn_and_no_secret_leak (test_svc.SvcDbRecoveryTests.test_sequential_restarts_no_cross_dsn_and_no_secret_leak) ... ok\ntest_update_preserves_binding (test_svc.SvcDbRecoveryTests.test_update_preserves_binding) ... 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_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 115 tests in 33.432s\n\nOK\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover'\n", + "output_sha256": "26a75f79c38150be59670bf6d34a2893f7f4d2fdb71b579ebea249ca02544778", + "receipt_sha256": "13895d887ff54e5e1157995f6b8689979e294d482a654dd71aced324e4176585" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-11T09:12:30.339474+00:00", + "command": "make test", + "command_sha256": "22cc66aa7d2624b4eb4d5b61658614cd6c32477b123afbf7dbc7fc3d7d0f3713", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "6332767c39466defd073f599a69d3fac0529f2f5", + "branch": "feature/svc-db-config-recover", + "target_branch": "main", + "target_head": "b3b48f5efa2a6a25f16f6413d8b9c89715f22960", + "status": " M .task/feature-svc-db-config-recover.md\n M docs/svc.md\n M scripts/svc.sh\n?? tests/test_svc.py\n", + "tracked_diff_sha256": "46cf4a4eb3855031919e4b3ea8bf68795ba1077e6fd3b6d465b87fa5e9be6c2b", + "untracked": { + "tests/test_svc.py": "fcdd05455cdabdb91e7052b640c05401b0aec07544f4db4ba203a66d2260ceff" + }, + "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 c8d66ca3cd21b055a8605e9eb4d8e525037618a6 modules/backend (v0.3.0-40-gc8d66ca)\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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/backend/deps/agent-system-core (v0.3.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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/core (v0.3.0)\n 5ac58dcd7e3058c8caa9e3768bc7155d5370e91f modules/documents (remotes/origin/feature/collab-storage-u3-budget-authz-1-g5ac58dc)\n 3ed10e122042a64180fb24a42d9cc6438cd2d2d6 modules/frontend (v0.3.0-4-g3ed10e1)\n 76d6633736a7abb36ac1ecca42fe4e6f120d0558 modules/ui (v0.3.0)\n" + }, + "after": { + "head": "6332767c39466defd073f599a69d3fac0529f2f5", + "branch": "feature/svc-db-config-recover", + "target_branch": "main", + "target_head": "b3b48f5efa2a6a25f16f6413d8b9c89715f22960", + "status": " M .task/feature-svc-db-config-recover.md\n M docs/svc.md\n M scripts/svc.sh\n?? tests/test_svc.py\n", + "tracked_diff_sha256": "46cf4a4eb3855031919e4b3ea8bf68795ba1077e6fd3b6d465b87fa5e9be6c2b", + "untracked": { + "tests/test_svc.py": "fcdd05455cdabdb91e7052b640c05401b0aec07544f4db4ba203a66d2260ceff" + }, + "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 c8d66ca3cd21b055a8605e9eb4d8e525037618a6 modules/backend (v0.3.0-40-gc8d66ca)\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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/backend/deps/agent-system-core (v0.3.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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/core (v0.3.0)\n 5ac58dcd7e3058c8caa9e3768bc7155d5370e91f modules/documents (remotes/origin/feature/collab-storage-u3-budget-authz-1-g5ac58dc)\n 3ed10e122042a64180fb24a42d9cc6438cd2d2d6 modules/frontend (v0.3.0-4-g3ed10e1)\n 76d6633736a7abb36ac1ecca42fe4e6f120d0558 modules/ui (v0.3.0)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover'\npython3 scripts/check-worktree.py verify\n[worktree] verify: recursive component checks passed\nPYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -p 'test_*.py' -v\ntest_candidate_cannot_read_checkout_credentials (test_ci_credentials.CheckoutTests.test_candidate_cannot_read_checkout_credentials) ... ok\ntest_candidate_submodule_update_commands_are_rejected (test_ci_credentials.CheckoutTests.test_candidate_submodule_update_commands_are_rejected) ... ok\ntest_credential_destination_confined_to_injected_server (test_ci_credentials.CheckoutTests.test_credential_destination_confined_to_injected_server) ... ok\ntest_external_or_unlisted_urls_are_rejected_before_component_fetch (test_ci_credentials.CheckoutTests.test_external_or_unlisted_urls_are_rejected_before_component_fetch) ... ok\ntest_inherited_template_hook_does_not_execute_with_credentials (test_ci_credentials.CheckoutTests.test_inherited_template_hook_does_not_execute_with_credentials) ... ok\ntest_nested_external_url_is_rejected_before_authenticated_fetch (test_ci_credentials.CheckoutTests.test_nested_external_url_is_rejected_before_authenticated_fetch) ... ok\ntest_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials (test_ci_credentials.CheckoutTests.test_recursive_gitlinks_materialize_exact_sha_without_persisting_credentials) ... ok\ntest_redirects_do_not_forward_credential_or_fetch_unlisted_target (test_ci_credentials.CheckoutTests.test_redirects_do_not_forward_credential_or_fetch_unlisted_target) ... ok\ntest_after_snapshot_failure_keeps_command_exit_and_output (test_evidence.EvidenceTests.test_after_snapshot_failure_keeps_command_exit_and_output) ... ok\ntest_all_persisted_and_displayed_text_is_sanitized (test_evidence.EvidenceTests.test_all_persisted_and_displayed_text_is_sanitized) ... ok\ntest_authorization_forms_are_redacted_in_capture_console_and_import (test_evidence.EvidenceTests.test_authorization_forms_are_redacted_in_capture_console_and_import) ... ok\ntest_authorization_forms_are_redacted_on_direct_card_capture (test_evidence.EvidenceTests.test_authorization_forms_are_redacted_on_direct_card_capture) ... ok\ntest_before_after_heads_do_not_relabel_changed_command (test_evidence.EvidenceTests.test_before_after_heads_do_not_relabel_changed_command) ... ok\ntest_capture_does_not_overwrite_an_existing_receipt (test_evidence.EvidenceTests.test_capture_does_not_overwrite_an_existing_receipt) ... ok\ntest_capture_without_card_and_import_without_rerun (test_evidence.EvidenceTests.test_capture_without_card_and_import_without_rerun) ... ok\ntest_child_failure_code_is_preserved (test_evidence.EvidenceTests.test_child_failure_code_is_preserved) ... ok\ntest_command_line_token_arguments_are_redacted (test_evidence.EvidenceTests.test_command_line_token_arguments_are_redacted) ... ok\ntest_dirty_and_untracked_contents_have_object_digests (test_evidence.EvidenceTests.test_dirty_and_untracked_contents_have_object_digests) ... ok\ntest_failed_child_exit_survives_receipt_write_failure (test_evidence.EvidenceTests.test_failed_child_exit_survives_receipt_write_failure) ... ok\ntest_full_output_is_preserved_not_only_tail (test_evidence.EvidenceTests.test_full_output_is_preserved_not_only_tail) ... ok\ntest_import_missing_card_fails_without_losing_receipt (test_evidence.EvidenceTests.test_import_missing_card_fails_without_losing_receipt) ... ok\ntest_import_rejects_unredacted_authorization_with_valid_checksums (test_evidence.EvidenceTests.test_import_rejects_unredacted_authorization_with_valid_checksums) ... ok\ntest_import_retry_is_idempotent (test_evidence.EvidenceTests.test_import_retry_is_idempotent) ... ok\ntest_invalid_field_types_and_forged_source_are_rejected (test_evidence.EvidenceTests.test_invalid_field_types_and_forged_source_are_rejected) ... ok\ntest_known_secret_environment_value_is_redacted_without_label (test_evidence.EvidenceTests.test_known_secret_environment_value_is_redacted_without_label) ... ok\ntest_linked_worktree_import_preserves_source_identity (test_evidence.EvidenceTests.test_linked_worktree_import_preserves_source_identity) ... ok\ntest_missing_card_does_not_execute (test_evidence.EvidenceTests.test_missing_card_does_not_execute) ... ok\ntest_missing_required_snapshot_fields_are_rejected (test_evidence.EvidenceTests.test_missing_required_snapshot_fields_are_rejected) ... ok\ntest_nested_cwd_records_untracked_files_from_repository_root (test_evidence.EvidenceTests.test_nested_cwd_records_untracked_files_from_repository_root) ... ok\ntest_output_digest_checked_even_if_receipt_digest_recomputed (test_evidence.EvidenceTests.test_output_digest_checked_even_if_receipt_digest_recomputed) ... ok\ntest_pipeline_failure_is_recorded_and_returned (test_evidence.EvidenceTests.test_pipeline_failure_is_recorded_and_returned) ... ok\ntest_quoted_credentials_with_spaces_are_fully_redacted (test_evidence.EvidenceTests.test_quoted_credentials_with_spaces_are_fully_redacted) ... ok\ntest_receipt_write_failure_cannot_claim_success (test_evidence.EvidenceTests.test_receipt_write_failure_cannot_claim_success) ... ok\ntest_recorder_environment_does_not_leak_into_nested_commands (test_evidence.EvidenceTests.test_recorder_environment_does_not_leak_into_nested_commands) ... ok\ntest_source_cannot_be_promoted_by_environment (test_evidence.EvidenceTests.test_source_cannot_be_promoted_by_environment) ... ok\ntest_tamper_is_rejected_before_card_append (test_evidence.EvidenceTests.test_tamper_is_rejected_before_card_append) ... ok\ntest_unrelated_repo_cannot_import (test_evidence.EvidenceTests.test_unrelated_repo_cannot_import) ... ok\ntest_validate_precheck_checks_result_and_current_base (test_evidence.EvidenceTests.test_validate_precheck_checks_result_and_current_base) ... ok\ntest_validate_precheck_rejects_successful_arbitrary_command (test_evidence.EvidenceTests.test_validate_precheck_rejects_successful_arbitrary_command) ... ok\ntest_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_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_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_sequential_restarts_no_cross_dsn_and_no_secret_leak (test_svc.SvcDbRecoveryTests.test_sequential_restarts_no_cross_dsn_and_no_secret_leak) ... ok\ntest_update_preserves_binding (test_svc.SvcDbRecoveryTests.test_update_preserves_binding) ... 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_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 115 tests in 35.464s\n\nOK\nbash scripts/lint-boundaries.sh\nwarn: architecture edges no longer present; delete them from the baseline\n backend/runmgr backend/cmdbus\narchitecture ok (77 edges)\narchitecture negative ok\nboundaries ok\nbash scripts/check-pins.sh\nok modules/backend agent-command\nok modules/backend agent-intent\nok modules/backend agent-native\nok modules/backend agent-squad\nok modules/backend agent-system-core\nok modules/backend error-code-system\nok modules/backend logging-system\nok deps/agent-native agent-intent\nwarn: deps/agent-native deps/development-guidelines is 26b562d2e34f, Dev is af199eeaa23c\nok deps/agent-native error-code-system\nok deps/agent-native logging-system\nok deps/agent-squad agent-intent\nok deps/agent-squad agent-native\nwarn: deps/agent-squad deps/development-guidelines is 26b562d2e34f, Dev is af199eeaa23c\nok deps/agent-squad error-code-system\nok deps/agent-squad logging-system\nwarn: deps/agent-intent deps/development-guidelines is 26b562d2e34f, Dev is af199eeaa23c\nok deps/agent-intent error-code-system\nok deps/agent-intent logging-system\npins ok\ncd deps/agent-intent && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./...\nok \tagent-intent/catalogcheck\t0.002s\nok \tagent-intent/cmd/intentctl\t0.002s\nok \tagent-intent/conformance\t0.002s\nok \tagent-intent/examples\t0.002s\nok \tagent-intent/intent\t0.006s\nok \tagent-intent/schema\t0.002s\ncd deps/agent-native && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./...\nok \tagent-native/adapters/native\t0.196s\nok \tagent-native/adapters/pitransport\t0.036s\nok \tagent-native/catalogcheck\t0.002s\n? \tagent-native/cmd/agent-native\t[no test files]\nok \tagent-native/conformance\t0.052s\nok \tagent-native/exec\t0.154s\nok \tagent-native/rpc\t0.003s\nok \tagent-native/runtime\t1.368s\nok \tagent-native/runtime/agentspec\t0.002s\nok \tagent-native/runtime/checkpoint\t0.003s\nok \tagent-native/runtime/codeorch\t0.075s\nok \tagent-native/runtime/ext\t0.024s\n? \tagent-native/runtime/ext/pkg\t[no test files]\nok \tagent-native/runtime/filestate\t0.022s\nok \tagent-native/runtime/gates\t0.004s\nok \tagent-native/runtime/guardrails\t0.002s\nok \tagent-native/runtime/hooks\t0.001s\nok \tagent-native/runtime/llm\t0.307s\nok \tagent-native/runtime/mcp\t13.272s\nok \tagent-native/runtime/memory\t0.003s\nok \tagent-native/runtime/policy\t0.002s\nok \tagent-native/runtime/promptx\t0.002s\nok \tagent-native/runtime/reminders\t0.003s\nok \tagent-native/runtime/resources\t0.003s\nok \tagent-native/runtime/session\t0.009s\nok \tagent-native/runtime/skills\t0.003s\nok \tagent-native/runtime/subagent\t0.004s\nok \tagent-native/runtime/telemetry\t0.003s\nok \tagent-native/runtime/tools\t11.283s\nok \tagent-native/schema\t0.002s\ncd deps/agent-squad && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./...\nok \tagent-squad/schema\t0.002s\nok \tagent-squad/squad\t0.960s\nok \tagent-squad/store\t0.003s\nok \tagent-squad/textextract\t0.001s\ncd deps/agent-squad/adapters/intent && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./...\nok \tagent-squad/adapters/intent\t0.006s\ncd deps/agent-squad/adapters/native && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./...\nok \tagent-squad/adapters/native\t0.003s\ncd deps/agent-squad/adapters/sqlite && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./...\nok \tagent-squad/adapters/sqlite\t0.018s\ncd deps/agent-squad/cmd/agent-squad && GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./...\n? \tagent-squad/cmd/agent-squad\t[no test files]\nok \tagent-squad/cmd/agent-squad/cli\t0.003s\nok \tagent-squad/cmd/agent-squad/conformance\t0.005s\nok \tagent-squad/cmd/agent-squad/server\t0.569s\ncd modules/core && go test ./...\nok \tagent-system-core\t0.003s\ncd modules/backend && go test ./...\n? \tagent-system-backend/cmd/agent-system\t[no test files]\nok \tagent-system-backend/eval\t0.003s\nok \tagent-system-backend/internal/app\t0.082s\nok \tagent-system-backend/internal/blobstore\t0.002s\nok \tagent-system-backend/internal/bus\t0.002s\nok \tagent-system-backend/internal/cardsvc\t0.068s\nok \tagent-system-backend/internal/cmdbus\t0.012s\nok \tagent-system-backend/internal/config\t0.003s\nok \tagent-system-backend/internal/ctxasm\t0.005s\nok \tagent-system-backend/internal/docgen\t0.004s\nok \tagent-system-backend/internal/evalgold\t0.002s\nok \tagent-system-backend/internal/hostapi\t0.021s\nok \tagent-system-backend/internal/ingest\t0.550s\nok \tagent-system-backend/internal/intentgate\t0.003s\nok \tagent-system-backend/internal/intentsem\t0.003s\nok \tagent-system-backend/internal/pgbus\t0.003s\nok \tagent-system-backend/internal/plugins\t0.180s\n? \tagent-system-backend/internal/profiles\t[no test files]\nok \tagent-system-backend/internal/prompts\t0.035s\nok \tagent-system-backend/internal/quality\t0.102s\nok \tagent-system-backend/internal/rag\t0.104s\nok \tagent-system-backend/internal/ratelimit\t0.254s\nok \tagent-system-backend/internal/route\t0.002s\nok \tagent-system-backend/internal/runmgr\t0.557s\nok \tagent-system-backend/internal/runtime\t1.221s\nok \tagent-system-backend/internal/server\t5.705s\nok \tagent-system-backend/internal/settings\t0.012s\nok \tagent-system-backend/internal/skills\t1.228s\nok \tagent-system-backend/internal/squadadapter\t0.101s\nok \tagent-system-backend/internal/store\t0.747s\nok \tagent-system-backend/internal/tools\t13.190s\nok \tagent-system-backend/internal/wfcompile\t0.055s\nok \tagent-system-backend/internal/workflow\t0.017s\nok \tagent-system-backend/pkg/extension\t0.017s\n? \tagent-system-backend/pkg/extension/link\t[no test files]\n? \tagent-system-backend/web\t[no test files]\ncp modules/core/ts/types.ts modules/frontend/src/contracts.ts.tmp\n{ echo \"// 从 Agent-System-Core ts/types.ts 同步(make contracts 生成;Core 为权威)。\"; cat modules/frontend/src/contracts.ts.tmp; } > modules/frontend/src/contracts.ts\nrm modules/frontend/src/contracts.ts.tmp\ncp modules/core/ts/types.ts modules/ui/src/contracts.ts.tmp\n{ echo \"// 从 Agent-System-Core ts/types.ts 同步(make contracts 生成;Core 为权威)。\"; cat modules/ui/src/contracts.ts.tmp; } > modules/ui/src/contracts.ts\nrm modules/ui/src/contracts.ts.tmp\ncd modules/frontend && npm ci --no-fund --no-audit && npx vitest run && node scripts/check-knip.mjs\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 173 packages in 972ms\nnpm warn install-scripts 1 package has install scripts not yet covered by allowScripts:\nnpm warn install-scripts esbuild@0.25.12 (postinstall: node install.js)\nnpm warn install-scripts\nnpm warn install-scripts Run `npm install-scripts ls` to review, or `npm install-scripts approve ` to allow.\n\n RUN v4.1.11 /home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover/modules/frontend\n\n ✓ test/contracts.test.ts (5 tests) 3ms\n ✓ test/design-guard.test.ts (6 tests) 5ms\n(node:822664) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n ✓ test/previewfit.test.ts (4 tests) 4ms\n ✓ test/toolkind.test.ts (5 tests) 4ms\n ✓ test/tasklist.test.ts (6 tests) 4ms\n ✓ test/messageparts.test.ts (11 tests) 6ms\n ✓ test/html-sinks.test.ts (1 test) 4ms\n ✓ test/scrollsync.test.ts (2 tests) 3ms\n ✓ test/live.test.ts (19 tests) 7ms\n ✓ test/theme.test.ts (3 tests) 3ms\n ✓ test/workspaces.test.ts (3 tests) 3ms\n ✓ test/outbox.test.ts (3 tests) 4ms\n ✓ test/previewtabs.test.ts (2 tests) 4ms\n ✓ test/preview-empty-state.test.ts (3 tests) 3ms\n ✓ test/auth.test.ts (4 tests) 24ms\n(node:822740) 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:822737) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.\n(Use `node --trace-warnings ...` to show where the warning was created)\n ✓ test/send.test.ts (4 tests) 2ms\n ✓ test/notice.test.ts (2 tests) 6ms\n ✓ src/runstate.test.ts (2 tests) 282ms\n\n Test Files 18 passed (18)\n Tests 85 passed (85)\n Start at 09:13:43\n Duration 467ms (transform 887ms, setup 0ms, import 1.37s, tests 371ms, environment 1ms)\n\nknip unused exports 42 <= 43\ncd modules/ui && npm ci --no-fund --no-audit && npx tsc --noEmit && npx vitest run && node scripts/check-knip.mjs\nnpm warn deprecated whatwg-encoding@3.1.1: Use @exodus/bytes instead for a more spec-conformant and faster implementation\n\nadded 162 packages in 661ms\n\n RUN v4.1.11 /home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover/modules/ui\n\n ✓ test/contrast-guard.test.ts (19 tests) 12ms\n ✓ test/html-sinks.test.ts (1 test) 4ms\n ✓ test/design-guard.test.ts (9 tests) 6ms\n ✓ test/collapsible.test.tsx (5 tests) 67ms\n ✓ test/safe-html.test.tsx (3 tests) 42ms\nstderr | test/file-preview.test.tsx > OfficePreview 注入槽 > renders via injected loader and surfaces errors\n[preview:docx] 坏.docx Error: bad zip\n at docx (/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover/modules/ui/test/file-preview.test.tsx:69:61)\n at /home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover/modules/ui/src/FilePreview.tsx:169:5\n at Object.react_stack_bottom_frame (/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover/modules/ui/node_modules/react-dom/cjs/react-dom-client.development.js:28656:20)\n at runWithFiberInDEV (/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover/modules/ui/node_modules/react-dom/cjs/react-dom-client.development.js:1048:13)\n at commitHookEffectListMount (/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover/modules/ui/node_modules/react-dom/cjs/react-dom-client.development.js:13748:29)\n at commitHookPassiveMountEffects (/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover/modules/ui/node_modules/react-dom/cjs/react-dom-client.development.js:13835:11)\n at commitPassiveMountOnFiber (/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover/modules/ui/node_modules/react-dom/cjs/react-dom-client.development.js:16906:13)\n at recursivelyTraversePassiveMountEffects (/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover/modules/ui/node_modules/react-dom/cjs/react-dom-client.development.js:16851:13)\n at commitPassiveMountOnFiber (/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover/modules/ui/node_modules/react-dom/cjs/react-dom-client.development.js:17183:11)\n at recursivelyTraversePassiveMountEffects (/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover/modules/ui/node_modules/react-dom/cjs/react-dom-client.development.js:16851:13)\n\n ✓ test/ui.test.tsx (6 tests) 61ms\n ✓ test/tabstrip.test.tsx (3 tests) 86ms\n ✓ test/toolblock.test.tsx (4 tests) 81ms\n ✓ test/overlay-host.test.tsx (6 tests) 61ms\n ✓ test/file-preview.test.tsx (9 tests) 83ms\n ✓ test/inbox.test.tsx (13 tests) 80ms\n ✓ test/card-anchor.test.tsx (4 tests) 86ms\n ✓ test/inline-confirm.test.tsx (7 tests) 97ms\n ✓ test/capability.test.tsx (14 tests) 149ms\n\n Test Files 14 passed (14)\n Tests 103 passed (103)\n Start at 09:13:47\n Duration 613ms (transform 342ms, setup 0ms, import 1.22s, tests 916ms, environment 3.31s)\n\nknip unused exports 55 <= 55\ncd deps/agent-command && go vet ./... && go test -count=1 ./...\nok \tagent-command\t0.002s\nok \tagent-command/conformance\t0.002s\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover'\n", + "output_sha256": "b2c297ea4ed0b341e957f6b50752b28c25188e69df5b6ac6ee298f9bfc85cd66", + "receipt_sha256": "4ba027052a1c09e6b90821469fc38fa5ab21b0434e4dbdb8b72d625eda3ade42" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-11T09:14:10.427318+00:00", + "command": "make build", + "command_sha256": "d1121e35fa7adab170fe1ee4b6226e4bd5059535e24dc4767f1bf2b62d957399", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "6332767c39466defd073f599a69d3fac0529f2f5", + "branch": "feature/svc-db-config-recover", + "target_branch": "main", + "target_head": "b3b48f5efa2a6a25f16f6413d8b9c89715f22960", + "status": " M .task/feature-svc-db-config-recover.md\n M docs/svc.md\n M scripts/svc.sh\n?? tests/test_svc.py\n", + "tracked_diff_sha256": "2cd05ffec3661cc0c83ba498f1a33eb54e256438a09dc057d989858776efb89b", + "untracked": { + "tests/test_svc.py": "fcdd05455cdabdb91e7052b640c05401b0aec07544f4db4ba203a66d2260ceff" + }, + "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 c8d66ca3cd21b055a8605e9eb4d8e525037618a6 modules/backend (v0.3.0-40-gc8d66ca)\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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/backend/deps/agent-system-core (v0.3.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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/core (v0.3.0)\n 5ac58dcd7e3058c8caa9e3768bc7155d5370e91f modules/documents (remotes/origin/feature/collab-storage-u3-budget-authz-1-g5ac58dc)\n 3ed10e122042a64180fb24a42d9cc6438cd2d2d6 modules/frontend (v0.3.0-4-g3ed10e1)\n 76d6633736a7abb36ac1ecca42fe4e6f120d0558 modules/ui (v0.3.0)\n" + }, + "after": { + "head": "6332767c39466defd073f599a69d3fac0529f2f5", + "branch": "feature/svc-db-config-recover", + "target_branch": "main", + "target_head": "b3b48f5efa2a6a25f16f6413d8b9c89715f22960", + "status": " M .task/feature-svc-db-config-recover.md\n M docs/svc.md\n M scripts/svc.sh\n?? tests/test_svc.py\n", + "tracked_diff_sha256": "2cd05ffec3661cc0c83ba498f1a33eb54e256438a09dc057d989858776efb89b", + "untracked": { + "tests/test_svc.py": "fcdd05455cdabdb91e7052b640c05401b0aec07544f4db4ba203a66d2260ceff" + }, + "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 c8d66ca3cd21b055a8605e9eb4d8e525037618a6 modules/backend (v0.3.0-40-gc8d66ca)\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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/backend/deps/agent-system-core (v0.3.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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/core (v0.3.0)\n 5ac58dcd7e3058c8caa9e3768bc7155d5370e91f modules/documents (remotes/origin/feature/collab-storage-u3-budget-authz-1-g5ac58dc)\n 3ed10e122042a64180fb24a42d9cc6438cd2d2d6 modules/frontend (v0.3.0-4-g3ed10e1)\n 76d6633736a7abb36ac1ecca42fe4e6f120d0558 modules/ui (v0.3.0)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover'\npython3 scripts/check-worktree.py verify\n[worktree] verify: recursive component checks passed\ncp modules/core/ts/types.ts modules/frontend/src/contracts.ts.tmp\n{ echo \"// 从 Agent-System-Core ts/types.ts 同步(make contracts 生成;Core 为权威)。\"; cat modules/frontend/src/contracts.ts.tmp; } > modules/frontend/src/contracts.ts\nrm modules/frontend/src/contracts.ts.tmp\ncp modules/core/ts/types.ts modules/ui/src/contracts.ts.tmp\n{ echo \"// 从 Agent-System-Core ts/types.ts 同步(make contracts 生成;Core 为权威)。\"; cat modules/ui/src/contracts.ts.tmp; } > modules/ui/src/contracts.ts\nrm modules/ui/src/contracts.ts.tmp\ncd modules/ui && npm ci --no-fund --no-audit\nnpm warn deprecated whatwg-encoding@3.1.1: Use @exodus/bytes instead for a more spec-conformant and faster implementation\n\nadded 162 packages in 619ms\ncd modules/frontend && npm ci --no-fund --no-audit && npm run build\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 173 packages in 989ms\nnpm warn install-scripts 1 package has install scripts not yet covered by allowScripts:\nnpm warn install-scripts esbuild@0.25.12 (postinstall: node install.js)\nnpm warn install-scripts\nnpm warn install-scripts Run `npm install-scripts ls` to review, or `npm install-scripts approve ` to allow.\n\n> agent-system-frontend@0.1.0 build\n> tsc -b && vite build\n\nvite v6.4.3 building for production...\ntransforming...\n✓ 1001 modules transformed.\nrendering chunks...\ncomputing gzip size...\ndist/index.html 0.40 kB │ gzip: 0.27 kB\ndist/assets/index-ZdELBsP2.css 73.92 kB │ gzip: 13.06 kB\ndist/assets/jszip.min-BteFFylP.js 0.09 kB │ gzip: 0.10 kB\ndist/assets/docx-preview-D6Q6boko.js 77.39 kB │ gzip: 21.27 kB\ndist/assets/jszip.min-BQxX6Wbn.js 97.97 kB │ gzip: 30.39 kB\ndist/assets/index-Nn8f3pmI.js 213.11 kB │ gzip: 70.02 kB\ndist/assets/xlsx-CkFp8p6R.js 429.53 kB │ gzip: 143.07 kB\ndist/assets/index-Ckv5bXj_.js 461.96 kB │ gzip: 145.18 kB\ndist/assets/pptx-preview.es-BFWl25rD.js 1,255.20 kB │ gzip: 401.44 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.60s\nrm -rf modules/backend/web/dist && mkdir -p modules/backend/web/dist && cp -r modules/frontend/dist/* modules/backend/web/dist/ && touch modules/backend/web/dist/.gitkeep\ncd modules/backend && CGO_ENABLED=0 go build -trimpath -ldflags \"-s -w -X main.version=v0.3.0-224-g6332767-dirty+core=a253a40+backend=c8d66ca+frontend=3ed10e1+ui=76d6633+agentcmd=4f583ca+documents=5ac58dc+native=c348441+squad=490b0b2+intent=343b1e6\" -o ../../bin/agent-system ./cmd/agent-system\nOK: bin/agent-system(版本 v0.3.0-224-g6332767-dirty+core=a253a40+backend=c8d66ca+frontend=3ed10e1+ui=76d6633+agentcmd=4f583ca+documents=5ac58dc+native=c348441+squad=490b0b2+intent=343b1e6;随附插件目录 plugins/)\nmake[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover'\n", + "output_sha256": "b24cece88f2b3c36dc546f2bdd468812bd4e1c5081a219acbf167976ed7fbc06", + "receipt_sha256": "cdd0c5e31b74818f9f9529e569105148a4e588c63d589d8bed903107a0ff3c13" +} +``` + + +```json +{ + "schema": 1, + "source": "SELF", + "timestamp": "2026-10-11T09:14:38.709916+00:00", + "command": "bash /tmp/svc-iso-validate.sh", + "command_sha256": "e56b23891696dfdce2d62fd1dace1bf67b01956df832782099256c544d21fd6c", + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-svc-db-config-recover", + "common_dir": "/home/weichen/projects/Agent-System-Dev/.git", + "before": { + "head": "6332767c39466defd073f599a69d3fac0529f2f5", + "branch": "feature/svc-db-config-recover", + "target_branch": "main", + "target_head": "b3b48f5efa2a6a25f16f6413d8b9c89715f22960", + "status": " M .task/feature-svc-db-config-recover.md\n M docs/svc.md\n M scripts/svc.sh\n?? tests/test_svc.py\n", + "tracked_diff_sha256": "c86d38d157147916a4229f692c1793ad119f14a885b38476d8172d901d2af29c", + "untracked": { + "tests/test_svc.py": "fcdd05455cdabdb91e7052b640c05401b0aec07544f4db4ba203a66d2260ceff" + }, + "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 c8d66ca3cd21b055a8605e9eb4d8e525037618a6 modules/backend (v0.3.0-40-gc8d66ca)\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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/backend/deps/agent-system-core (v0.3.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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/core (v0.3.0)\n 5ac58dcd7e3058c8caa9e3768bc7155d5370e91f modules/documents (remotes/origin/feature/collab-storage-u3-budget-authz-1-g5ac58dc)\n 3ed10e122042a64180fb24a42d9cc6438cd2d2d6 modules/frontend (v0.3.0-4-g3ed10e1)\n 76d6633736a7abb36ac1ecca42fe4e6f120d0558 modules/ui (v0.3.0)\n" + }, + "after": { + "head": "6332767c39466defd073f599a69d3fac0529f2f5", + "branch": "feature/svc-db-config-recover", + "target_branch": "main", + "target_head": "b3b48f5efa2a6a25f16f6413d8b9c89715f22960", + "status": " M .task/feature-svc-db-config-recover.md\n M docs/svc.md\n M scripts/svc.sh\n?? tests/test_svc.py\n", + "tracked_diff_sha256": "c86d38d157147916a4229f692c1793ad119f14a885b38476d8172d901d2af29c", + "untracked": { + "tests/test_svc.py": "fcdd05455cdabdb91e7052b640c05401b0aec07544f4db4ba203a66d2260ceff" + }, + "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 c8d66ca3cd21b055a8605e9eb4d8e525037618a6 modules/backend (v0.3.0-40-gc8d66ca)\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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/backend/deps/agent-system-core (v0.3.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 a253a40b8e5563119b00c4e71fb61fe0d11d6d6a modules/core (v0.3.0)\n 5ac58dcd7e3058c8caa9e3768bc7155d5370e91f modules/documents (remotes/origin/feature/collab-storage-u3-budget-authz-1-g5ac58dc)\n 3ed10e122042a64180fb24a42d9cc6438cd2d2d6 modules/frontend (v0.3.0-4-g3ed10e1)\n 76d6633736a7abb36ac1ecca42fe4e6f120d0558 modules/ui (v0.3.0)\n" + }, + "after_error": null, + "exit_code": 0, + "output": "== 1) db create + start(真实 initdb/pg_ctl)\n[OK] db create pgx\n[OK] pgx start\n== 2) 登记 dev 服务(真实产物)并绑定 pgx\n[OK] dev db pgx 绑定\n[OK] dbref=pgx/agent 已登记\n[OK] exec 无 --dsn\n== 3) 第一次启动:健康 + DSN 经环境交付 + 命令行无秘密\n[OK] start#1\n[OK] 命令行无 DSN/密码\n[OK] 环境变量交付 DSN\n[OK] HTTP 健康\n== 4) 写入库内标记(真实 API → 真实 PostgreSQL)\n[OK] 写入标记\n[OK] 标记确实落在 pgx/agent 库(真实库身份)\n== 5) 连续两次裸 restart:标记仍在(同一数据库)+ 绑定不丢\n[OK] restart#1 后标记仍在(读回)\n[OK] restart#1 后 dbref 保留\n[OK] restart#1 DSN 经环境交付\n[OK] restart#2 后标记仍在(读回)\n[OK] restart#2 后 dbref 保留\n[OK] restart#2 DSN 经环境交付\n== 6) deploy --from local(换产物路径):数据库选择不变\n[OK] deploy --from local\n[OK] deploy 后标记仍在(数据库未变)\n[OK] deploy 后 dbref 保留\n== 7) 数据目录无 SQLite 误建\n[OK] data 下无 SQLite 文件\n== 8) 库不可用:restart 拒启/失败,不降级、配置保留\n[OK] 库不可用 restart 失败 rc=1\n[OK] 失败后 dbref 保留(可恢复)\n[OK] 失败后 db=pg 保留\n== 9) 库恢复后重启:回到同一数据库\n[OK] 库恢复后 restart\n[OK] 标记仍在(连续重启/部署/故障恢复真实链路)\n== 10) 凭据不进日志/历史\n[OK] svc.log/history 无密码\n===== 汇总:PASS=27 FAIL=0 =====\n", + "output_sha256": "0b5c58fcdd6e8ddcc4a8e4a4f1f10d1fc10afabbc0ba8bf45d2a7707aa48922d", + "receipt_sha256": "bbd557b9769ea675372fe9eb0543687247f894542575edffa7ff124c9fb84e96" +} +``` diff --git a/docs/svc.md b/docs/svc.md index c70fd7b8..9fd50aa7 100644 --- a/docs/svc.md +++ b/docs/svc.md @@ -230,18 +230,21 @@ scripts/svc.sh db --no-restart # 只改登记,下次 start scripts/svc.sh db --clear # 解除绑定(回内嵌 SQLite 档) ``` -每个 agent 服务都可以对应一个数据库实例中的库;绑定后 DSN 持久化在 `svc.env` -(`exec=` 的 `--dsn` + `dbref=/<库名>`,权限 600),跨重启保留。 +每个 agent 服务都可以对应一个数据库实例中的库;绑定登记在 `svc.env` +(`dbref=/<库名>` + `db=pg`,权限 600),跨重启保留——**DSN 不落 `exec=`**, +启动时由实例登记重建并经 `AGENT_SYSTEM_DSN` 环境变量交付(实例端口/密码变更自动跟随)。 - **缺库自动建**:实例运行中且目标库不存在时自动 `CREATE DATABASE`(幂等); 实例未运行且目标库非其默认库 → 提示先 `start` 实例; -- **运行中自动重启生效**(复用新 `exec=`);`--no-restart` 只写登记; -- **旧产物预检**:当前二进制不识别 `--dsn` 时警告(绑定已登记但重启按内嵌档跑); +- **运行中自动重启生效**(按新登记重建 DSN);`--no-restart` 只写登记; +- **产物能力预检**:当前二进制不消费环境变量 DSN 时拒绝绑定(先 deploy 新版本); + mock 档与绑定共存同样拒绝(先 `--clear` 或去 mock); - 展示:`list` 的 **DB 列**、`status` 的"数据库"行、`info` 数据库节的**绑定服务**行 (反向映射:哪些服务指向该实例)都能看到服务↔数据库对应关系; -- 未用本命令、直接 `deploy --dsn` 的服务,显示层会按 DSN 的 host:port 反查匹配已 - 登记实例(显示 `/<库>`;匹配不上显示 `外部@host:port`); -- `--clear` 后服务回到内嵌 SQLite 档(数据在原 `--data` 目录,切回即见旧数据)。 +- 未用本命令、直接 `deploy --dsn` 的服务:命中本机实例登记的会升级为托管绑定 + (`dbref=`),否则持久化为 `dsn=` 字段并在显示层标注 `外部@host:port`; +- `--clear` 显式解绑:记录 `db=sqlite`、清除 `dbref`/`dsn`(数据在原 `--data` 目录, + 切回即见旧数据);此后残留 `SVC_*_DSN` 不再悄悄重新选库。 ### 4.6 config(agent 服务的配置文件更新/生效) @@ -549,11 +552,17 @@ scripts/svc.sh db copy pgdev pgprod --db app --force # 目标非空时覆盖 ``` 命令行参数 > --config FILE(--env FILE 别名) - > svc.env 持久化(addr=、exec=) + > svc.env 持久化(addr=、exec=、dbref=/dsn=/db=——数据库配置专键) > SVC__* 环境变量(.svc.env 自动加载,同层) > 默认值 ``` +数据库配置由脚本在启动时**统一解析**(`start`/`restart`/`deploy`/`update`/`db` +共用单点):托管绑定(`dbref=`)从实例登记重建 DSN,外部直连读受保护 `dsn=` 字段, +配置文件读 `conffile` 内的 `dsn` 键。连接串不进 `exec=` 与命令行,经 +`AGENT_SYSTEM_DSN` 环境变量交付进程。**修改端口、监听地址或部署版本不改变数据库 +选择**;绑定失效或配置冲突时拒绝启动,绝不静默回退内嵌 SQLite(见 §9.4)。 + ### 9.2 配置文件 dotenv 格式:`KEY=VALUE`,支持 `#` 注释、成对引号、`export` 前缀;只识别合法变量名, @@ -578,10 +587,21 @@ scripts/svc.sh prod deploy --env .env.prod # 等价 ### 9.4 持久化语义 -- `deploy`/`start` 成功后把当前态写入 `svc.env`(600):`addr`、`exec`(agent 上次 - 完整启动参数)等; +- `deploy`/`start` 成功后把当前态写入 `svc.env`(600,临时文件原子替换):`addr`、 + `exec`(agent 上次完整启动参数,**只存非敏感项**)等;启动失败不覆盖上次配置; - 裸 `start`/`restart` 复用 `exec=`;任何显式参数(CLI、`--config`、`SVC_*`)出现即 - **整体重建**启动参数; + **整体重建**启动参数;两种路径共用同一数据库配置解析——数据库选择与认证设置不随 + 端口/地址/版本变化,`conffile` 引用随重建保留; +- **数据库配置可恢复**:托管绑定 `dbref=/<库>` 在启动时由实例登记重建 DSN + (实例端口/密码变更自动跟随,密码不重复保存);显式外部直连(`deploy --dsn`)持久化 + 为受保护 `dsn=` 字段;显式解绑记录 `db=sqlite`(清除 `dbref`/`dsn`,此后残留的 + `SVC_*_DSN` 不再悄悄重新选库,显式 `--dsn` 仍可覆盖);存量 `exec=` 里的 `--dsn` + 首次启动时自动迁移为上述形态(幂等); +- **绑定失效拒绝启动**(返回非零并输出脱敏原因,不静默回退内嵌 SQLite): + `dbref` 实例未登记/类型错误/登记字段不全、已选 PostgreSQL 但无可恢复 DSN、直接 + DSN 与 `dbref` 指向不同库、配置文件 `dsn` 与绑定不一致、mock 档与数据库配置共存、 + 产物不消费环境变量 DSN(`AGENT_SYSTEM_DSN`,旧制品)。`restart`/`deploy` 在停止 + 旧进程**之前**完成这些静态检查——配置性拒绝不制造停机窗口; - 标签合并去重、跨重启保留;postgres 的用户/密码/库名/认证模式持久化,重启不丢。 ## 10. 登记文件与事件流 @@ -599,8 +619,10 @@ scripts/svc.sh prod deploy --env .env.prod # 等价 | `version` | 产物版本串(`agent-system version` 输出) | | `started` | 最近启动时间 | | `pidcheck` | 进程判定标记(见 §6.1) | -| `exec` | agent 上次完整启动参数(含 `--dsn`,密码在其中) | -| `dbref` | agent 数据库绑定 `/<库名>`(` db` 命令写入,跨重启保留;见 §4.5) | +| `exec` | agent 上次完整启动参数(非敏感项;DSN 不在其中,经环境变量交付) | +| `db` | agent 数据库模式:`pg` / `sqlite`(显式解绑)/ `mock`;从未配置则无此键 | +| `dbref` | agent 托管数据库绑定 `/<库名>`(启动时由实例登记重建 DSN;见 §4.5) | +| `dsn` | agent 外部直连 DSN(受保护;未命中本机实例登记的直连存放于此) | | `conffile` | agent 配置文件绝对路径(` config` 命令写入,跨重启保留;见 §4.6) | | `user` / `password` / `dbname` / `authmode` / `pgdata` | postgres 专属 | | `htdocs` | static 专属 | @@ -635,7 +657,9 @@ scripts/svc.sh prod deploy --env .env.prod # 等价 - **秘密与数据**:`svc.env`(含 DB 密码)与备份 600;环境/数据目录 700;DSN 默认掩码; dotenv 不执行文件内容;`restore`/`copy` 覆盖非空库必须显式 `--force`;备份/克隆只增不删。 - **兼容承诺**:`kind=` 缺省视为 agent;旧格式 `svc.env`(仅 addr/data)在 `list`/ - `status` 正常显示;旧产物二进制不识别的 `--dsn/--auth` 自动省略并提示。 + `status` 正常显示;存量 `exec=` 里的 `--dsn` 首次启动自动迁移为可恢复配置(幂等); + 旧产物二进制不识别的 `--auth`/`--config` 自动省略并提示;不消费环境变量 DSN 的 + 旧产物在需要交付数据库配置时**拒绝启动/部署**(不静默按内嵌 SQLite 运行)。 ## 12. 退出码 @@ -652,7 +676,12 @@ scripts/svc.sh prod deploy --env .env.prod # 等价 | `端口被占用(非本服务)` | 按提示的占用者处理,或换端口(`--port` / `set --port --apply`) | | `进程启动后即退出` | `scripts/svc.sh logs 200` / postgres 看 `runtime//pg.log`;history 里有 fail 记录 | | `20s 健康检查未通过` | 进程活着但未响应:查日志与端口;agent 常见原因是 DSN 指向未启动的库 | -| `该产物不支持 --dsn/--auth` | 提示而非错误:旧版本制品自动省略了不支持的 flag;需要该能力请部署新提交 | +| `该产物不支持部分启动参数` | 提示而非错误:旧版本制品自动省略了不支持的 flag;需要该能力请部署新提交 | +| `拒绝启动:dbref=… 无法重建 DSN` | 实例未登记/登记不全:恢复实例登记,或 `db ` 重新绑定;不会回退 SQLite | +| `拒绝启动:直接 DSN 与 dbref 指向不同数据库` | 配置冲突:重新绑定或 `db --clear` 后重新直连,二者取一 | +| `拒绝启动:产物不消费环境变量 DSN` | 旧制品:deploy 新提交,或改用携带 dsn 的配置文件(` config`) | +| `拒绝启动:mock 档与数据库配置冲突` | 先 `db --clear` 再用 mock,或去掉 `--mock` / `SVC_*_MOCK` | +| `拒绝启动:非回环地址且认证判定为关` | 绑定数据库 / 显式 `--auth on` / 回环地址 / `SVC_*_INSECURE_LISTEN=1` 显式放行 | | `环境产物缺失` | 该环境没有部署过(或旧版脚本部署):先 `deploy` | | `pg_ctl start 失败` | 看 pg.log 常见:端口被占、pgdata 权限(须 700)、postmaster 残留 | | `pidfile 指向的进程已不存在` | 脚本自动清理 pidfile;直接重新 start 即可 | diff --git a/scripts/svc.sh b/scripts/svc.sh index 63a9797e..39457719 100755 --- a/scripts/svc.sh +++ b/scripts/svc.sh @@ -53,10 +53,15 @@ # db copy:--db X --force set:--port N --host H --apply --tag T # # ════════════════════ 配置优先级 ════════════════════ -# 命令行 > --config/--env 文件 > svc.env 持久化(exec=/addr=)> SVC__* 环境变量 -# (.svc.env 自动加载,同层)> 默认值。裸 start/restart 复用上次启动配置;显式参数 -# 出现即覆盖。任意环境 X 的变量名:SVC__ADDR/DATA/DSN/AUTH/MOCK, -# 以及 INSECURE_LISTEN / ALLOWED_HOSTS(传给进程的 AGENT_SYSTEM_*,旧二进制会忽略)。 +# 命令行 > --config/--env 文件 > svc.env 持久化(exec=/addr=/dbref=/dsn=/db=) +# > SVC__* 环境变量(.svc.env 自动加载,同层)> 默认值。裸 start/restart 复用 +# 上次启动配置;显式参数出现即覆盖。任意环境 X 的变量名:SVC__ +# ADDR/DATA/DSN/AUTH/MOCK,以及 INSECURE_LISTEN / ALLOWED_HOSTS(传给进程的 +# AGENT_SYSTEM_*,旧二进制会忽略)。 +# 数据库配置统一解析:托管绑定(dbref=)从实例登记重建 DSN,外部直连存受保护 +# dsn= 字段;连接串不进 exec=/命令行,经 AGENT_SYSTEM_DSN 环境变量交付。绑定失效 +# 或配置冲突(直接 DSN 与 dbref 不同库、mock 与绑定并存、db=pg 无可恢复 DSN)时 +# 拒绝启动,绝不静默回退内嵌 SQLite;显式解绑(db=sqlite)后环境残留不再重新选库。 # # ════════════════════ 服务模型与登记 ════════════════════ # - 服务名 ^[a-z][a-z0-9-]{0,15}$(保留字不可用);dev=8788 / prod=8787 默认端口, @@ -202,7 +207,11 @@ svc.env 字段: version 产物版本串(agent-system version 输出) started 最近启动时间 pidcheck 进程判定标记(agent=二进制路径、postgres=pgdata 路径、static=--directory) - exec agent 上次完整启动参数(裸 start/restart 复用;显式参数出现即重建) + exec agent 上次完整启动参数(裸 start/restart 复用;显式参数出现即重建)。 + 只存非敏感参数——DSN 不在其中,数据库配置走 db=/dbref=/dsn= 专键 + db agent 数据库模式:pg | sqlite(显式解绑)| mock;从未配置则无此键 + dbref agent 托管数据库绑定 /<库名>(启动时由实例登记重建 DSN) + dsn agent 外部直连 DSN(受保护,600;未命中本机实例时使用) user/password/dbname/authmode/pgdata postgres 专属(密码 600 保存) htdocs static 专属 @@ -248,7 +257,9 @@ EOF 行为细节: - deploy 前自动停止旧实例(只停自己 pidfile+cmdline 校验的进程) - agent 启动后等健康检查(20s),随后按 --model-*/--tavily-keys 播种设置(幂等) - - 旧版本产物不认识 --dsn/--auth 时自动省略(探测 serve 用法)并提示 + - 旧版本产物不认识 --auth/--config 时自动省略(探测 serve 用法)并提示; + 不消费环境变量 DSN(AGENT_SYSTEM_DSN)的旧产物在需要交付数据库配置时 + 拒绝部署/启动(不静默按内嵌 SQLite 运行) - static 的 release 源不支持(制品内嵌前端);--dir PATH 可直接登记并服务 既有目录(不构建、不复制,source=dir@<路径>) - deploy 全程事件入 history.jsonl(begin/ok/fail) @@ -268,9 +279,10 @@ EOF scripts/svc.sh stop 停止(agent/static: TERM→KILL;postgres: pg_ctl -m fast) scripts/svc.sh restart 停止 + 启动(裸 restart 复用上次配置) scripts/svc.sh db [pg名|--clear] [--db X] agent 数据库绑定:缺省查看当前 - 绑定与可用实例;给 pg名=绑定/切换(DSN 写入 exec=,dbref= 登记, - 实例运行中缺库自动建,服务运行中自动重启生效);--clear 解绑回内嵌 - SQLite 档;--no-restart 只改登记 + 绑定与可用实例;给 pg名=绑定/切换(dbref= 登记,启动时由实例登记 + 重建 DSN 并经环境变量交付,实例运行中缺库自动建,服务运行中自动 + 重启生效);--clear 显式解绑(db=sqlite,清除直接 DSN,环境残留 + SVC_*_DSN 不再重新选库);--no-restart 只改登记 scripts/svc.sh config [file|--clear] [--no-restart] agent 配置文件:缺省查看当前 文件与生效值;给 file=更换(agent 二进制 --config,JSON schema 校验 通过才切换,运行中自动重启即时生效);--clear 移除回命令行参数形态。 @@ -335,9 +347,9 @@ EOF scripts/svc.sh prod db pg1 --db prod # 绑定 pg1/prod 库(缺库自动建) scripts/svc.sh prod db pg2 --no-restart # 切换实例但暂不重启(下次 start 生效) scripts/svc.sh prod db # 查看当前绑定 + 可用实例 - scripts/svc.sh prod db --clear # 解绑回内嵌 SQLite 档 - 绑定写入 svc.env(exec= 的 --dsn + dbref=,600);info / list 的 DB 列与数据库节 - "绑定服务"行展示服务↔实例对应关系。 + scripts/svc.sh prod db --clear # 显式解绑(db=sqlite,回内嵌档) + 绑定登记于 svc.env(dbref= + db=pg,600;DSN 启动时由实例登记重建,经环境变量 + 交付);info / list 的 DB 列与数据库节 "绑定服务" 行展示服务↔实例对应关系。 密码管理:密码明文存 runtime//svc.env(600);--password 未给时自动生成 (head -c 18 /dev/urandom)。auth-mode 默认 scram-sha-256(pg_hba 全线)。 @@ -383,7 +395,7 @@ EOF 优先级(高 → 低): 1. 命令行参数(--port/--dsn/--tag/...) 2. --config FILE(或 --env FILE,兼容别名;=FILE 写法亦可) - 3. svc.env 持久化(addr=、exec=——上次启动的实际参数) + 3. svc.env 持久化(addr=、exec=、dbref=/dsn=/db=——数据库配置专键) 4. SVC__* 环境变量与 .svc.env(自动加载,同层) 5. 默认值(dev=8788 / prod=8787 / 其余派生端口) @@ -401,11 +413,18 @@ dotenv 格式:KEY=VALUE,支持 # 注释、成对引号、export 前缀;只 播种幂等:设置持久化在 agent 数据目录,播过一次后续启动无需再传。 持久化语义: - - deploy/start 成功(健康探测通过)后把当前态写入 svc.env(600);启动失败不覆盖 - 上次配置——裸 start 仍按上次可用参数重试 + - deploy/start 成功(健康探测通过)后把当前态写入 svc.env(600,临时文件原子替换); + 启动失败不覆盖上次配置——裸 start 仍按上次可用参数重试 - 裸 start/restart 复用 exec=(上次完整参数);任何显式参数(或 --config 文件、 - SVC_* 变量)出现即整体重建参数——重建时 dbref 绑定的 --dsn 自动从实例登记 - 重建保留(mock 档或显式 --dsn 除外) + SVC_* 变量)出现即整体重建参数;两种路径共用同一数据库配置解析——改端口/地址/ + 版本不改变数据库选择,conffile 引用随重建保留 + - 数据库配置可恢复:托管绑定 dbref= 在启动时由实例登记重建 DSN(实例端口/密码 + 变更自动跟随);外部直连存受保护 dsn= 字段;显式解绑记 db=sqlite(环境残留 + SVC_*_DSN 不再重新选库)。DSN 经 AGENT_SYSTEM_DSN 环境变量交付,不进 exec= + 与命令行;存量 exec= 内的 --dsn 启动时自动迁移(幂等) + - 绑定失效或配置冲突时拒绝启动(不静默回退 SQLite):dbref 实例缺失/登记不全、 + 直接 DSN 与 dbref 指向不同库、mock 与绑定并存、db=pg 无可恢复 DSN、产物不 + 消费环境 DSN;restart/deploy 在停止旧进程前先做这些静态检查 - tags 随每次登记合并去重,跨重启保留 服务级配置文件(与上述 svc.sh dotenv 层不同——这是 agent 二进制自己的 JSON 配置): @@ -661,21 +680,43 @@ svc_merge_tags() { printf '%s' "$out" } -# record_state EXTRA_KEY=VALUE...:把当前态+持久化配置写入 svc.env(600)。 -# 基本键:kind/env/pid/addr/tags/source/version/started/pidcheck/exec + dbref/ -# conffile(跨重启保留的数据库绑定与配置文件);kind 特有键(user/password/dbname/ -# authmode/pgdata/htdocs...)经参数追加。 +# record_state EXTRA_KEY=VALUE...:把当前态+持久化配置写入 svc.env(600,临时文件 +# 原子替换,避免截断/半写)。基本键:kind/env/pid/addr/tags/source/version/started/ +# pidcheck/exec + db/dbref/dsn/conffile(跨重启保留的数据库配置与配置文件引用); +# kind 特有键(user/password/dbname/authmode/pgdata/htdocs...)经参数追加。 +# agent 服务经统一解析启动后按生效态写 db=(pg/mock;显式 sqlite)与 dbref=/dsn= +# (托管绑定不重复存 DSN,外部直连存受保护 dsn=);未走解析的调用保持旧值。 record_state() { - # 先读完旧文件再开重定向(块内 {} > svc.env 会先截断文件,读旧值必须在其之前)。 - local pid prev_src prev_dbref prev_conffile merged_tags + local pid prev_src prev_dbref prev_conffile prev_db prev_dsn merged_tags pid="$(read_pid)" prev_src="" [ -f "$ENV_DIR/svc.env" ] && prev_src="$(svc_get source)" prev_dbref="$(svc_get dbref)" prev_conffile="$(svc_get conffile)" + prev_db="$(svc_get db)" + prev_dsn="$(svc_get dsn)" SVC_SOURCE="${SRC_LABEL:-${prev_src:-}}" merged_tags="$(svc_merge_tags)" + local db_out="" dbref_out="" dsn_out="" + if [ "${SVC_KIND:-agent}" = agent ]; then + if [ -n "${SVC_DB_MODE:-}" ]; then + case "$SVC_DB_MODE" in + pg) + # 只在有可恢复来源(dbref=/dsn=/conffile)时记 pg 标记——纯环境层来源 + # 不落标记,环境撤除后回到原语义,不产生"db=pg 却无可恢复 DSN"的死锁。 + [ -n "$SVC_DB_REF" ] || [ -n "$SVC_DB_DSN_SAVE" ] || [ "$SVC_DB_SOURCE" = conffile ] && db_out=pg + ;; + mock) db_out=mock ;; + sqlite) [ "$SVC_DB_SOURCE" != none ] && db_out=sqlite ;; # 显式解绑才记;从未配置不写 + esac + dbref_out="${SVC_DB_REF:-}" + dsn_out="${SVC_DB_DSN_SAVE:-}" + else + db_out="$prev_db"; dbref_out="$prev_dbref"; dsn_out="$prev_dsn" + fi + fi mkdir -p "$ENV_DIR" + local tmp="$ENV_DIR/svc.env.tmp.$$" { printf 'kind=%s\n' "${SVC_KIND:-agent}" printf 'env=%s\n' "$ENV_NAME" @@ -687,11 +728,14 @@ record_state() { printf 'started=%s\n' "$(date -Is)" printf 'pidcheck=%s\n' "${SVC_PIDCHECK:-}" printf 'exec=%s\n' "${SVC_EXEC:-}" - [ -n "$prev_dbref" ] && printf 'dbref=%s\n' "$prev_dbref" + [ -n "$db_out" ] && printf 'db=%s\n' "$db_out" + [ -n "$dbref_out" ] && printf 'dbref=%s\n' "$dbref_out" + [ -n "$dsn_out" ] && printf 'dsn=%s\n' "$dsn_out" [ -n "$prev_conffile" ] && printf 'conffile=%s\n' "$prev_conffile" [ $# -gt 0 ] && printf '%s\n' "$@" - } > "$ENV_DIR/svc.env" - chmod 600 "$ENV_DIR/svc.env" + } > "$tmp" + chmod 600 "$tmp" + mv -f "$tmp" "$ENV_DIR/svc.env" } # ---- pid 管理(泛化:pidfile + cmdline 标记双校验)---- @@ -756,6 +800,8 @@ env_config() { ENV_LOG="$ENV_DIR/svc.log" ENV_BIN_DIR="$ENV_DIR/bin" ENV_BIN="$ENV_BIN_DIR/agent-system" + # 数据库配置解析态按实例重置——批量 update/restart 逐服务解析时不串用上一服务的 DB_*。 + SVC_DB_MODE=""; SVC_DB_SOURCE=""; SVC_DB_REF=""; SVC_DB_DSN_SAVE="" local registered="" [ -f "$ENV_DIR/svc.env" ] && registered="$(svc_kind "$name")" SVC_KIND="${registered:-agent}" @@ -810,7 +856,7 @@ agent_has_explicit_cfg() { return 1 } -# adjust_args_for_bin BIN ARGS:按二进制 serve 用法过滤旧产物不认识的 --dsn/--auth。 +# adjust_args_for_bin BIN ARGS:按二进制 serve 用法过滤旧产物不认识的 --auth/--config。 # 匹配按"去横线的旗标名 + 1-2 个横线"(Go flag 帮助打印单横线 -dsn,2026-10-04 实测 # 旧实现 grep -- '--dsn' 永不命中,把现役二进制的 --dsn/--auth 误当不支持而丢弃)。 adjust_args_for_bin() { @@ -819,7 +865,7 @@ adjust_args_for_bin() { local filtered="" w drop_next=0 flag for w in $args; do case "$w" in - --dsn|--auth) + --auth|--config) flag="${w#--}" if printf '%s\n' "$out" | grep -Eq -- "(^|[[:space:]])-{1,2}${flag}([[:space:]]|=|$)"; then filtered="$filtered $w" @@ -1087,6 +1133,12 @@ materialize_release() { agent_do_deploy() { resolve_source if [ "$CLI_DRYRUN" = 1 ]; then print_agent_plan; return 0; fi + # 停旧之前的静态配置验证:数据库配置可解析(绑定有效/无冲突)、conffile 存在、 + # 现产物承接能力——配置性问题不制造停机窗口(登记保持可恢复,失败直接返回)。 + if ! agent_static_preflight; then + hist_event deploy fail "$(read_pid)" "预检拒绝:数据库配置/配置文件无效(登记未变更)" + return 1 + fi hist_event deploy begin "$(read_pid)" "from=$SRC_LABEL" do_stop_quiet local wt @@ -1108,6 +1160,13 @@ agent_do_deploy() { materialize_release || { hist_event deploy fail "$(read_pid)" "物化/校验失败($SRC_LABEL)"; return 1; } ;; esac + # 新产物承接能力复核(环境 DSN 交付):不支持即失败——绑定保持可恢复,不降级启动。 + if [ "$DB_MODE" = pg ] && [ "$DB_SOURCE" != conffile ] && ! bin_env_dsn_supported "$ENV_BIN"; then + c_err "[$ENV_NAME] 新产物不消费环境变量 DSN(AGENT_SYSTEM_DSN)——部署中止;旧绑定保留在 svc.env" + c_err " 恢复:换部署版本,或改用携带 dsn 的配置文件(scripts/svc.sh $ENV_NAME config )" + hist_event deploy fail "$(read_pid)" "新产物不支持环境 DSN($SRC_LABEL)" + return 1 + fi agent_do_start || { hist_event deploy fail "$(read_pid)" "启动失败($SRC_LABEL)"; return 1; } hist_event deploy ok "$(read_pid)" "from=$SRC_LABEL" return 0 @@ -1198,15 +1257,253 @@ addr_is_loopback() { esac } -# agent_args_authed ARGS:按二进制 AuthEnabled 口径判断启动参数是否开启认证 -# (--auth on;或未显式 off 且带 --dsn——auto+PG 即开)。--mock 只影响存储档不影响认证。 -agent_args_authed() { - case "$1" in - *--auth[=\ ]on*) return 0 ;; - *--auth[=\ ]off*) return 1 ;; - *--dsn\ *) return 0 ;; - *) return 1 ;; +# dsn_target DSN → host:port/db(配置一致性比较用;解析失败回空串)。 +dsn_target() { + local t="${1%%\?*}" + case "$t" in *://*) t="${t#*://}" ;; esac + case "$t" in *@*) t="${t#*@}" ;; esac + local hostport="${t%%/*}" db="${t#*/}" + [ "$db" = "$t" ] && db="" + printf '%s/%s' "$hostport" "$db" +} + +# dsn_ref_match DSN:DSN 的 host:port/db 命中已登记 postgres 实例时回显 /(无匹配回空)。 +dsn_ref_match() { + local tgt pg paddr + tgt="$(dsn_target "$1")" + [ -n "$tgt" ] || return 0 + while IFS= read -r pg; do + [ "$(svc_kind "$pg")" = postgres ] || continue + paddr="$(env_kv_of "$pg" addr)" + [ -n "$paddr" ] || continue + if [ "$tgt" = "$paddr/${tgt#*/}" ]; then + printf '%s/%s' "$pg" "${tgt#*/}" + return 0 + fi + done < <(registered_names) + return 0 +} + +# auth_pick CLI ENV PERSISTED:生效认证方式(缺省 auto)。 +auth_pick() { + case "${1:-}" in ?*) printf '%s' "$1"; return ;; esac + case "${2:-}" in ?*) printf '%s' "$2"; return ;; esac + case "${3:-}" in ?*) printf '%s' "$3"; return ;; esac + printf auto +} + +# migrate_legacy_db_config:存量 exec= 的 --dsn 迁移为可恢复配置(dbref=/dsn=)并从 exec +# 剥离——此后 exec= 只存非敏感启动参数,DSN 经环境变量传递(G1-7)。幂等:再次运行时 +# exec= 已无 --dsn,直接返回。命中已登记实例 → dbref(密码经实例登记存放,不重复保存); +# 否则 → 受保护 dsn= 字段。已有 dbref= 时 exec 的 DSN 只作历史残留处理,直接剥离。 +migrate_legacy_db_config() { + local exec_old dsn new_exec ref + [ -f "$ENV_DIR/svc.env" ] || return 0 + exec_old="$(svc_get exec)" + case "$exec_old" in *--dsn\ *) ;; *) return 0 ;; esac + dsn="$(printf '%s' "$exec_old" | sed -n 's/.*--dsn \([^ ]*\).*/\1/p')" + new_exec="$(printf '%s' "$exec_old" | sed -E 's/(^| )--dsn [^ ]+//; s/ +/ /g; s/^ //; s/ $//')" + svc_set_key exec "$new_exec" + if [ -n "$(svc_get dbref)" ]; then + c_info "[$ENV_NAME] 存量 exec DSN 与 dbref=$(svc_get dbref) 并存,已剥离 exec 残留(绑定不受影响)" + return 0 + fi + ref="$(dsn_ref_match "$dsn")" + if [ -n "$ref" ]; then + svc_set_key dbref "$ref" + svc_set_key db pg + c_info "[$ENV_NAME] 存量 exec DSN 已迁移为托管绑定 dbref=$ref(DSN 改由实例登记重建)" + else + svc_set_key dsn "$dsn" + svc_set_key db pg + c_info "[$ENV_NAME] 存量 exec DSN 已迁移至受保护 dsn= 字段(未命中本机实例登记)" + fi + return 0 +} + +# ---- 数据库配置统一解析(start/restart/deploy/update/db 共用单点)---- +# 核心约束:修改端口、监听地址或部署版本不改变数据库选择;绑定失效或配置冲突时 +# 拒绝启动(返回 1),绝不静默回退内嵌 SQLite。 +# 结果全局变量(入口全部重置——批量 update 逐服务重解析,不串用): +# DB_MODE pg | sqlite | mock +# DB_SOURCE cli | env | dbref | dsn | conffile | db | mock | none +# DB_REF /(命中/保持托管绑定时;否则空) +# DB_DSN 有效连接串(sqlite/mock 为空;conffile 来源=文件内值,仅用于判定不外传) +# DB_AUTH on | off | auto(生效值,对齐二进制 AuthEnabled 口径) +# DB_DSN_SAVE 需持久化到 dsn= 的外部直连 DSN(仅 cli/dsn 来源且未命中实例) +resolve_db_config() { + DB_MODE="sqlite"; DB_SOURCE="none"; DB_REF=""; DB_DSN=""; DB_AUTH="auto"; DB_DSN_SAVE="" + + migrate_legacy_db_config + + local env_auth env_mock env_dsn + env_auth="$(env_var "$ENV_NAME" AUTH)" + env_mock="$(env_var "$ENV_NAME" MOCK)" + env_dsn="$(env_var "$ENV_NAME" DSN)" + + local p_dbref p_dsn p_db p_conf p_exec p_auth + p_dbref="$(svc_get dbref)" + p_dsn="$(svc_get dsn)" + p_db="$(svc_get db)" + p_conf="$(svc_get conffile)" + p_exec="$(svc_get exec)" + p_auth="$(printf '%s' "$p_exec" | sed -n 's/.*--auth \([^ ]*\).*/\1/p')" + [ -n "$p_auth" ] || p_auth="$(svc_get auth)" + + DB_AUTH="$(auth_pick "$CLI_AUTH" "$env_auth" "$p_auth")" + case "$DB_AUTH" in on|off|auto) ;; *) + c_err "[$ENV_NAME] 拒绝启动:无效 auth 值「$DB_AUTH」(可用 on/off/auto)" + return 1 ;; esac + + local mock=0 + { [ "$CLI_MOCK" = 1 ] || [ "$env_mock" = "1" ]; } && mock=1 + [ "$mock" = 0 ] && case "$p_exec" in *--mock*) mock=1 ;; esac + + # conffile 的 dsn 键(二进制自行读文件,连接串不经环境重复传递)。 + local cf_dsn="" + if [ -n "$p_conf" ] && [ -f "$p_conf" ]; then + cf_dsn="$(grep -oE '"dsn"[[:space:]]*:[[:space:]]*"[^"]*"' "$p_conf" 2>/dev/null | head -1 | sed -E 's/.*"([^"]*)"$/\1/')" + fi + + # mock 档与数据库配置共存 = 冲突,拒绝(行为要明确,不隐式降级)。 + if [ "$mock" = 1 ]; then + if [ -n "$p_dbref" ] || [ -n "$p_dsn" ] || [ -n "$CLI_DSN" ] || { [ -n "$env_dsn" ] && [ "$p_db" != "sqlite" ]; }; then + c_err "[$ENV_NAME] 拒绝启动:mock 档与数据库配置冲突(dbref=${p_dbref:-无}、dsn=${p_dsn:+已设、}CLI/环境 DSN=${CLI_DSN:+已设}${env_dsn:+已设})" + c_err " 先解绑(scripts/svc.sh $ENV_NAME db --clear)再用 mock,或去掉 --mock / SVC_$(printf '%s' "$ENV_NAME" | tr 'a-z-' 'A-Z_')_MOCK" + return 1 + fi + DB_MODE=mock; DB_SOURCE=mock + return 0 + fi + + # 显式解绑(db=sqlite):残留 SVC_*_DSN 不再悄悄重新选库;CLI 显式 --dsn 仍可覆盖。 + if [ -n "$env_dsn" ] && [ "$p_db" = "sqlite" ] && [ -z "$CLI_DSN" ]; then + c_info "[$ENV_NAME] 已显式解绑(db=sqlite),忽略环境层 SVC_*_DSN 残留(显式 --dsn 或重新绑定可覆盖)" + env_dsn="" + fi + + # 有效 DSN 选择:CLI > 环境 > 持久化(dbref / dsn) > conffile > 无(SQLite)。 + local eff_dsn="" eff_src="" bt + if [ -n "$CLI_DSN" ]; then + eff_dsn="$CLI_DSN"; eff_src=cli + elif [ -n "$env_dsn" ]; then + eff_dsn="$env_dsn"; eff_src=env + elif [ -n "$p_dbref" ] && [ -n "$p_dsn" ]; then + bt="$(dsn_from_dbref "$p_dbref" 2>/dev/null || true)" + if [ -n "$bt" ] && [ "$(dsn_target "$bt")" = "$(dsn_target "$p_dsn")" ]; then + eff_dsn="$p_dsn"; eff_src=dsn + else + c_err "[$ENV_NAME] 拒绝启动:配置冲突——dbref=$p_dbref 与 dsn= 指向不同数据库,不能静默取其一" + c_err " 保留其一:重新绑定(scripts/svc.sh $ENV_NAME db )或 db --clear 后重新直连" + return 1 + fi + elif [ -n "$p_dbref" ]; then + if ! eff_dsn="$(dsn_from_dbref "$p_dbref")"; then + c_err "[$ENV_NAME] 拒绝启动:dbref=$p_dbref 无法重建 DSN(实例未登记 / 类型错误 / addr·user·password 登记不全)" + c_err " 恢复实例登记或重新绑定(scripts/svc.sh $ENV_NAME db );不回退内嵌 SQLite" + return 1 + fi + eff_src=dbref + elif [ -n "$p_dsn" ]; then + eff_dsn="$p_dsn"; eff_src=dsn + elif [ -n "$cf_dsn" ]; then + eff_dsn="$cf_dsn"; eff_src=conffile + fi + + # 直接 DSN(CLI/环境/持久化)与 dbref 并存:目标库必须一致,否则配置冲突。 + if [ -n "$eff_dsn" ] && [ -n "$p_dbref" ] && [ "$eff_src" != dbref ]; then + if ! bt="$(dsn_from_dbref "$p_dbref")"; then + c_err "[$ENV_NAME] 拒绝启动:dbref=$p_dbref 无效(无法重建 DSN)且存在直接 DSN——先修复或解除绑定" + return 1 + fi + if [ "$(dsn_target "$bt")" != "$(dsn_target "$eff_dsn")" ]; then + c_err "[$ENV_NAME] 拒绝启动:直接 DSN($(mask_dsn "$eff_dsn"))与 dbref=$p_dbref 指向不同数据库,不能静默取其一" + return 1 + fi + fi + + # conffile 一致性:文件内 dsn 与有效来源并存时必须同库。 + if [ -n "$cf_dsn" ] && [ "$eff_src" != conffile ] && [ -n "$eff_dsn" ] \ + && [ "$(dsn_target "$cf_dsn")" != "$(dsn_target "$eff_dsn")" ]; then + c_err "[$ENV_NAME] 拒绝启动:配置文件 dsn($(mask_dsn "$cf_dsn"))与数据库绑定指向不同库——先对齐(改文件或换绑定)" + return 1 + fi + + # 已选 PostgreSQL 但拿不到任何有效 DSN → 拒绝(不降级 SQLite)。 + if [ -z "$eff_dsn" ] && [ "$p_db" = "pg" ]; then + c_err "[$ENV_NAME] 拒绝启动:已登记 db=pg 但无可恢复 DSN(dbref/dsn/conffile 均缺失)" + c_err " 重新绑定(scripts/svc.sh $ENV_NAME db )或 db --clear 显式回内嵌 SQLite" + return 1 + fi + + if [ -n "$eff_dsn" ]; then + DB_MODE=pg; DB_DSN="$eff_dsn"; DB_SOURCE="$eff_src" + local ref="" + case "$eff_src" in + cli|dsn) + if [ -n "$p_dbref" ]; then + DB_REF="$p_dbref" # 一致性已验证:保持既有托管绑定 + else + ref="$(dsn_ref_match "$eff_dsn")" + if [ -n "$ref" ]; then DB_REF="$ref" # 直连命中本机实例 → 升级托管绑定(密码不重复保存) + else DB_DSN_SAVE="$eff_dsn" + fi + fi + ;; + env) + [ -n "$p_dbref" ] && DB_REF="$p_dbref" # 环境层本身不持久化;已有绑定/直连保持 + [ -n "$p_dsn" ] && DB_DSN_SAVE="$p_dsn" # 环境覆盖不丢已持久化的直连配置 + ;; + dbref) + DB_REF="$p_dbref" + ;; + esac + else + DB_MODE=sqlite + [ "$p_db" = "sqlite" ] && DB_SOURCE=db # 显式解绑的选择跨重启保留 + fi + return 0 +} + +# db_auth_enabled:启动预检的认证判定,对齐二进制 AuthEnabled:显式 on → 开; +# 显式 off → 关;auto → 存在有效 DSN(含环境与配置文件来源)即开。 +db_auth_enabled() { + case "$DB_AUTH" in + on) return 0 ;; + off) return 1 ;; + *) [ -n "$DB_DSN" ] ;; + esac +} + +# bin_env_dsn_supported BIN:二进制是否消费环境层 AGENT_SYSTEM_DSN(经 config explain +# 探测:explain 对 DSN 值脱敏但用户名保留,探测标记用户即可)。旧产物不支持环境层时 +# 返回 1——调用方拒绝以环境传递 DSN(防静默按内嵌 SQLite 运行)。 +bin_env_dsn_supported() { + local out + out="$(AGENT_SYSTEM_DSN='postgresql://svcprobe:svcprobe@127.0.0.1:9/svcprobe' "$1" config explain 2>/dev/null || true)" + case "$out" in *svcprobe*) return 0 ;; esac + return 1 +} + +# agent_static_preflight:停止旧进程 / 更换产物之前可静态检查的配置验证——数据库配置 +# 可解析(含绑定有效性与冲突)、conffile 存在、现产物能承接环境 DSN。失败返回 1(输出 +# 脱敏原因;除存量迁移外不写登记)。 +agent_static_preflight() { + resolve_db_config || return 1 + local cf + cf="$(svc_get conffile)" + if [ -n "$cf" ] && [ ! -f "$cf" ]; then + c_err "[$ENV_NAME] 拒绝启动:配置文件不存在:$cf(恢复文件或 config --clear)" + return 1 + fi + if [ "$DB_MODE" = pg ] && [ "$DB_SOURCE" != conffile ] && [ -x "$ENV_BIN" ] \ + && ! bin_env_dsn_supported "$ENV_BIN"; then + c_err "[$ENV_NAME] 拒绝启动:当前产物不消费环境变量 DSN(AGENT_SYSTEM_DSN),无法按绑定非降级交付数据库配置" + c_err " 更新产物(deploy 新版本),或改用携带 dsn 的配置文件(scripts/svc.sh $ENV_NAME config )" + return 1 + fi + return 0 } agent_do_start() { @@ -1218,52 +1515,34 @@ agent_do_start() { return 1 fi SVC_VERSION="$("$ENV_BIN" version 2>/dev/null || true)" - # 组装启动参数:显式配置 → 重建;否则复用上次持久化 exec=。 + # 统一解析数据库配置(复用与重建两路共用;失败拒绝启动,绝不静默回退 SQLite)。 + # 2026-10-11 修复:复用 exec= 分支此前不查 dbref——G1-7 迁移把 --dsn 剥入环境后 + # record_state 写回不含 DSN 的 exec=,重新绑定后的第二次裸 restart 即丢库。 + if ! resolve_db_config; then + hist_event start fail "" "数据库配置解析拒绝(绑定失效/配置冲突)" + return 1 + fi + SVC_DB_MODE="$DB_MODE"; SVC_DB_SOURCE="$DB_SOURCE"; SVC_DB_REF="$DB_REF"; SVC_DB_DSN_SAVE="$DB_DSN_SAVE" + # 组装启动参数:显式配置 → 重建;否则复用上次持久化 exec=(DSN 已由解析迁移出 exec)。 local exec_args if ! agent_has_explicit_cfg && [ -n "$(svc_get exec)" ]; then exec_args="$(svc_get exec)" - # G1-7:存量 exec= 里的 --dsn 剥离到环境变量(迁移;命令行不再可见明文)。 - case "$exec_args" in - *--dsn\ *) - DSN_ENV="$(printf '%s' "$exec_args" | sed -n 's/.*--dsn \([^ ]*\).*/\1/p')" - exec_args="$(printf '%s' "$exec_args" | sed 's/--dsn [^ ]*//' | sed 's/[[:space:]]\{2,\}/ /g; s/^ //; s/ $//')" - c_info "[$ENV_NAME] DSN 已从命令行迁移到环境变量(G1-7)" - ;; - esac - c_info "[$ENV_NAME] 复用上次配置(svc.env exec=;显式参数可覆盖):$(mask_dsn "$exec_args")" + c_info "[$ENV_NAME] 复用上次配置(svc.env exec=;显式参数可覆盖):$(mask_dsn "$exec_args")" else - local args="" - if [ "$CLI_MOCK" = 1 ] || [ "$(env_var "$ENV_NAME" MOCK)" = "1" ]; then + local args="" explicit_auth="${CLI_AUTH:-$(env_var "$ENV_NAME" AUTH)}" + if [ "$DB_MODE" = mock ]; then args="--mock" - else - local dsn="${CLI_DSN:-$(env_var "$ENV_NAME" DSN)}" - local auth="${CLI_AUTH:-$(env_var "$ENV_NAME" AUTH)}" - # dbref 兜底:显式参数重建启动参数时,持久化的数据库绑定不再静默丢失 - #(2026-10-05 dev 事故:restart --addr 走重建分支丢 --dsn → auto 判认证关 → 守卫拒启)。 - if [ -z "$dsn" ] && [ -n "$(svc_get dbref)" ]; then - local bound_dsn - if bound_dsn="$(dsn_from_dbref "$(svc_get dbref)")"; then - dsn="$bound_dsn" - c_info "[$ENV_NAME] 数据库绑定 $(svc_get dbref) 随参数重建保留" - else - c_warn "[$ENV_NAME] dbref=$(svc_get dbref) 无法重建 DSN(实例缺失或登记不全),按无数据库绑定启动" - fi - fi - # G1-7:DSN 经环境变量传入(AGENT_SYSTEM_DSN),不再进命令行——命令行对 - # 同机任何进程可见(含智能体生成脚本的 /proc//cmdline),2026-10-09 - # 方案 §3.4 实测。基座 config 优先级 CLI>env,旧 exec= 里的 --dsn 仍生效 - # (向后兼容),但新建/重建的启动配置从此不带 DSN 明文。 - DSN_ENV="$dsn" - if [ -n "$dsn" ] || [ -n "$auth" ] || [ "$ENV_NAME" != dev ]; then - [ -z "$auth" ] && auth=auto - args="$args --auth $auth" - fi + elif [ "$DB_MODE" = pg ] || [ -n "$explicit_auth" ] || [ "$ENV_NAME" != dev ]; then + args="--auth $DB_AUTH" fi + # 保留既有配置文件引用:显式参数重建时不丢 --config(conffile= 持久化跨重启)。 + local conf; conf="$(svc_get conffile)" + [ -n "$conf" ] && [ -f "$conf" ] && args="$args --config $conf" local adjusted; adjusted="$(adjust_args_for_bin "$ENV_BIN" "$args")" - # adjust_args_for_bin 返回值已去首空格——比较前对 args 同样归一,否则每次 - # 带 --dsn/--auth 的重建都会误报"旧版本二进制已自动省略"(参数实际全保留)。 + # adjust_args_for_bin 返回值已去首空格——比较前对 args 同样归一,否则每次带 + # --auth/--config 的重建都会误报"旧版本二进制已自动省略"(参数实际全保留)。 if [ "$adjusted" != "${args# }" ]; then - c_warn "[$ENV_NAME] 该产物不支持 --dsn/--auth(旧版本二进制),已自动省略:$(mask_dsn "${args:-<无>}") → $(mask_dsn "${adjusted:-<无>}")" + c_warn "[$ENV_NAME] 该产物不支持部分启动参数(旧版本二进制),已自动省略:${args:-<无>} → ${adjusted:-<无>}" fi args="$adjusted" exec_args="--addr $ENV_ADDR --data $ENV_DATA --plugins ${CLI_PLUGINS:-$ENV_DIR/plugins} $args $CLI_EXTRA" @@ -1278,9 +1557,12 @@ agent_do_start() { [ -n "$hosts" ] && guard_env+=("AGENT_SYSTEM_ALLOWED_HOSTS=$hosts") # 预检(快速拦截):非回环地址且认证判定为关时提前拒绝,报错可操作—— # 不等二进制 listen guard 以"进程即退"暴露;二进制守卫仍是权威。 + # 认证判定依据统一解析的最终有效 DSN 与 auth(含环境变量与配置文件来源), + # 与二进制 AuthEnabled 口径一致(2026-10-11 修复:此前只看命令行 --dsn, + # DSN 迁入环境变量后 auto 被误判为未开认证)。 local pf_addr; pf_addr="$(printf '%s' "$exec_args" | sed -n 's/.*--addr \([^ ]*\).*/\1/p')" pf_addr="${pf_addr:-$ENV_ADDR}" - if ! addr_is_loopback "${pf_addr%:*}" && [ -z "$insecure" ] && ! agent_args_authed "$exec_args"; then + if ! addr_is_loopback "${pf_addr%:*}" && [ -z "$insecure" ] && ! db_auth_enabled; then c_err "[$ENV_NAME] 拒绝启动:非回环地址 $pf_addr 且认证判定为关(auto 无 DSN 即关)。" c_err " 任选其一:--addr 127.0.0.1:${pf_addr##*:};数据库绑定 scripts/svc.sh $ENV_NAME db ;" c_err " 显式 --auth on;或环境 SVC_$(printf '%s' "$ENV_NAME" | tr 'a-z-' 'A-Z_')_INSECURE_LISTEN=1 显式放行。" @@ -1294,8 +1576,19 @@ agent_do_start() { fi # 直接 nohup 简单命令:$! 即服务进程本身,pidfile 语义才成立。 # 守卫变量走环境,不写进 exec=;旧二进制不认识这两个变量,会忽略。 - # G1-7:DSN 同样走环境(AGENT_SYSTEM_DSN;基座 config 环境档已支持)。 - [ -n "${DSN_ENV:-}" ] && guard_env+=("AGENT_SYSTEM_DSN=$DSN_ENV") + # G1-7:DSN 经环境变量传入(AGENT_SYSTEM_DSN),不进命令行——命令行对同机任何 + # 进程可见(含智能体生成脚本的 /proc//cmdline)。conffile 来源由二进制自行 + # 读文件,不重复传递。环境层交付前再核一次产物能力(start 可能紧跟 deploy 换产物), + # 不支持即拒绝——绝不静默按内嵌 SQLite 运行。 + if [ "$DB_MODE" = pg ] && [ "$DB_SOURCE" != conffile ]; then + if ! bin_env_dsn_supported "$ENV_BIN"; then + c_err "[$ENV_NAME] 拒绝启动:产物不消费环境变量 DSN(AGENT_SYSTEM_DSN),无法按绑定交付数据库配置(不回退 SQLite)" + c_err " 更新产物(deploy 新版本),或改用携带 dsn 的配置文件(scripts/svc.sh $ENV_NAME config )" + hist_event start fail "" "产物不支持环境 DSN,拒绝启动" + return 1 + fi + guard_env+=("AGENT_SYSTEM_DSN=$DB_DSN") + fi if [ "${#guard_env[@]}" -gt 0 ];then nohup env "${guard_env[@]}" "$ENV_BIN" serve $exec_args >> "$ENV_DIR/svc.log" 2>&1 & else @@ -1671,13 +1964,16 @@ check_port_available() { return 0 } -# svc_set_key KEY VALUE:改写当前服务 svc.env 的单键(先读后写,避开重定向截断陷阱)。 +# svc_set_key KEY VALUE:改写当前服务 svc.env 的单键(先读后写 + 临时文件原子替换, +# 避免重定向截断与半写)。 svc_set_key() { - local key="$1" val="$2" rest + local key="$1" val="$2" rest tmp [ -f "$ENV_DIR/svc.env" ] || { c_err "svc.env 不存在:$ENV_DIR"; return 1; } rest="$(grep -v "^$key=" "$ENV_DIR/svc.env" || true)" - { [ -n "$rest" ] && printf '%s\n' "$rest"; printf '%s=%s\n' "$key" "$val"; } > "$ENV_DIR/svc.env" - chmod 600 "$ENV_DIR/svc.env" + tmp="$ENV_DIR/svc.env.tmp.$$" + { [ -n "$rest" ] && printf '%s\n' "$rest"; printf '%s=%s\n' "$key" "$val"; } > "$tmp" + chmod 600 "$tmp" + mv -f "$tmp" "$ENV_DIR/svc.env" return 0 } @@ -2134,9 +2430,10 @@ EOF # ---- agent 服务的数据库绑定( db ...)---- # svc_db_bind [pg名] [--db X] [--clear] [--no-restart]:查看 / 绑定切换 / 解除 -# agent 服务的数据库。绑定 = 目标实例的 DSN 写入持久化 exec=(--dsn,密码 600 存放) -# 并登记 dbref=/<库>;实例运行中时确保目标库存在(缺则建);服务运行中则自动 -# 重启生效(--no-restart 只改登记)。--clear 解除绑定(回内嵌 SQLite 档)。 +# agent 服务的数据库。绑定 = dbref=/<库> + db=pg 登记(600);DSN 不落 exec=, +# 启动时由实例登记重建并经 AGENT_SYSTEM_DSN 环境变量交付(实例运行中缺库自动建; +# 服务运行中自动重启生效,--no-restart 只改登记)。--clear 显式解绑:db=sqlite、 +# 清除 dbref 与直接 dsn=,残留 SVC_*_DSN 不再悄悄重新选库。 svc_db_bind() { [ "$SVC_KIND" = agent ] || { c_err "[$ENV_NAME] kind=$SVC_KIND 无数据库绑定(仅 agent 服务)"; return 2; } [ -f "$ENV_DIR/svc.env" ] || { c_err "[$ENV_NAME] 无登记(先 deploy)"; return 2; } @@ -2151,7 +2448,7 @@ svc_db_bind() { [$ENV_NAME] 数据库绑定: scripts/svc.sh $ENV_NAME db 查看当前绑定与可用实例 scripts/svc.sh $ENV_NAME db [--db X] [--no-restart] 绑定/切换(运行中自动重启生效) - scripts/svc.sh $ENV_NAME db --clear [--no-restart] 解除绑定(回内嵌 SQLite 档) + scripts/svc.sh $ENV_NAME db --clear [--no-restart] 解除绑定(显式回内嵌 SQLite 档) EOF return 0 ;; -*) c_err "[$ENV_NAME] db 未知参数:$1(可用: | --clear,--db X,--no-restart)"; return 2 ;; @@ -2162,12 +2459,17 @@ EOF # 无参:查看当前绑定 + 可用实例。 if [ -z "$target" ] && [ "$clear" = 0 ]; then - local ref dsn pg st + local ref dsn pg st mode + mode="$(svc_get db)" ref="$(db_ref_of "$ENV_NAME")" if [ -n "$ref" ]; then printf ' [%s] 数据库绑定:%s\n' "$ENV_NAME" "$ref" - dsn="$(printf '%s' "$(svc_get exec)" | sed -n 's/.*--dsn \([^ ]*\).*/\1/p')" + dsn="$(svc_get dsn)" + [ -z "$dsn" ] && dsn="$(printf '%s' "$(svc_get exec)" | sed -n 's/.*--dsn \([^ ]*\).*/\1/p')" + [ -z "$dsn" ] && [ -n "$(svc_get dbref)" ] && dsn="$(dsn_from_dbref "$(svc_get dbref)" 2>/dev/null || true)" [ -n "$dsn" ] && printf ' DSN %s\n' "$(mask_dsn "$dsn")" + elif [ "$mode" = "sqlite" ]; then + printf ' [%s] 数据库绑定:已显式解绑(db=sqlite,data=%s;残留 SVC_*_DSN 不再自动选库)\n' "$ENV_NAME" "$ENV_DATA" else printf ' [%s] 数据库绑定:无(内嵌 SQLite 档,data=%s)\n' "$ENV_NAME" "$ENV_DATA" fi @@ -2185,7 +2487,7 @@ EOF return 0 fi - # 解除绑定。 + # 解除绑定(显式选择 SQLite:清除 dbref 与直接 dsn,环境残留不再重新选库)。 if [ "$clear" = 1 ]; then [ -n "$target" ] && { c_err "--clear 不接受服务名参数"; return 2; } local exec_old new_exec @@ -2195,8 +2497,10 @@ EOF svc_set_key exec "$new_exec" fi svc_del_key dbref + svc_del_key dsn + svc_set_key db sqlite hist_event set ok "$(read_pid)" "db unbind" - c_ok "[$ENV_NAME] 已解除数据库绑定(内嵌 SQLite 档;数据目录 $ENV_DATA)" + c_ok "[$ENV_NAME] 已解除数据库绑定(显式 db=sqlite;数据目录 $ENV_DATA)" if [ "$restart" = 1 ] && [ -n "$(read_pid)" ] && pid_alive "$(read_pid)"; then do_stop; do_start || { c_err "[$ENV_NAME] 重启失败——解绑已登记,排查后 start"; return 1; } c_ok "[$ENV_NAME] 已重启(内嵌 SQLite 档)" @@ -2217,7 +2521,21 @@ EOF tpass="$(env_kv_of "$target" password)" regdb="$(env_kv_of "$target" dbname)" tdb="${CLI_DB_NAME:-$regdb}" - { [ -n "$tuser" ] && [ -n "$tpass" ]; } || { c_err "[$target] 登记缺 user/password(重新 db create)"; return 2; } + { [ -n "$tuser" ] && [ -n "$tpass" ] && [ -n "$taddr" ]; } || { c_err "[$target] 登记缺 addr/user/password(重新 db create)"; return 2; } + # mock 档与绑定冲突:拒绝——绑定后按 mock 运行等于静默丢库。 + local exec_now mock_now=0 + exec_now="$(svc_get exec)" + { [ "$CLI_MOCK" = 1 ] || [ "$(env_var "$ENV_NAME" MOCK)" = "1" ]; } && mock_now=1 + case "$exec_now" in *--mock*) mock_now=1 ;; esac + if [ "$mock_now" = 1 ]; then + c_err "[$ENV_NAME] 拒绝绑定:当前为 mock 档(--mock)与数据库配置冲突;先去 mock(重新 deploy 不带 --mock)或保持 mock 不绑定" + return 2 + fi + # 产物承接能力预检:绑定后 DSN 经环境变量交付,产物须消费 AGENT_SYSTEM_DSN。 + if [ -x "$ENV_BIN" ] && ! bin_env_dsn_supported "$ENV_BIN"; then + c_err "[$ENV_NAME] 拒绝绑定:当前产物不消费环境变量 DSN(AGENT_SYSTEM_DSN),绑定后无法生效;先更新产物再绑定" + return 2 + fi # 实例运行中:确保目标库存在(缺则建,幂等)。 st="$(svc_pid_state "$target")" if [ "${st%% *}" = alive ]; then @@ -2232,26 +2550,19 @@ EOF c_warn "[$target] 未运行——库 $tdb 暂未创建(先 start $target 再重跑,或绑定默认库 $regdb)" fi dsn="postgresql://$tuser:$tpass@$thost:$tport/$tdb" - # 产物支持预检(旧二进制不识别 --dsn 时提示;重启复用 exec 不会自动过滤)。 - if [ -x "$ENV_BIN" ]; then - local adj - adj="$(adjust_args_for_bin "$ENV_BIN" "--dsn $dsn")" - [ "$adj" != "--dsn $dsn" ] && \ - c_warn "[$ENV_NAME] 当前产物不识别 --dsn(旧版本二进制)——绑定已登记,但重启后将按内嵌档运行" + # 写持久化配置(托管绑定形态):dbref= + db=pg;清除直接 dsn=;剥离 exec 残留 --dsn。 + # DSN 不落 exec=——启动时由实例登记重建(实例端口/密码变更自动跟随,密码不重复保存)。 + if printf '%s' "$exec_now" | grep -q -- '--dsn '; then + local new_exec + new_exec="$(printf '%s' "$exec_now" | sed -E 's/(^| )--dsn [^ ]+//; s/ +/ /g; s/^ //; s/ $//')" + svc_set_key exec "$new_exec" fi - # 写持久化配置:exec= 的 --dsn 替换或追加;dbref= 登记。 - local exec_old new_exec - exec_old="$(svc_get exec)" - if printf '%s' "$exec_old" | grep -q -- '--dsn '; then - new_exec="$(printf '%s' "$exec_old" | sed -E "s|--dsn [^ ]+|--dsn $dsn|")" - else - new_exec="${exec_old:+$exec_old }--dsn $dsn" - fi - svc_set_key exec "$new_exec" svc_set_key dbref "$target/$tdb" + svc_set_key db pg + svc_del_key dsn hist_event set ok "$(read_pid)" "db bind → $target/$tdb" - c_ok "[$ENV_NAME] 数据库绑定:$target/$tdb(DSN $(mask_dsn "$dsn");svc.env 600 保存,info 可查)" - # 运行中:重启生效(start 复用新 exec=)。 + c_ok "[$ENV_NAME] 数据库绑定:$target/$tdb(启动时由实例登记重建 DSN:$(mask_dsn "$dsn");svc.env 600 保存,info 可查)" + # 运行中:重启生效(start 按新登记重建 DSN 交付)。 if [ "$restart" = 1 ] && [ -n "$(read_pid)" ] && pid_alive "$(read_pid)"; then c_info "[$ENV_NAME] 重启以切换数据库……" do_stop @@ -2370,6 +2681,17 @@ do_stop_quiet() { return 0 } +# do_restart:agent 先完成可静态检查的配置验证(数据库绑定可解析、conffile 存在、 +# 产物承接能力)再停旧进程——配置性拒绝不制造停机窗口,登记保持可恢复;其余类型 +# 直接停止后启动。 +do_restart() { + if [ "$SVC_KIND" = agent ]; then + agent_static_preflight || { hist_event start fail "" "restart 预检拒绝(数据库配置/配置文件无效)"; return 1; } + fi + do_stop + do_start +} + cmd_rm() { local name="${1:-}" [ -n "$name" ] || { c_err "用法:scripts/svc.sh rm [--purge]"; exit 2; } @@ -2427,6 +2749,7 @@ db_ref_of() { ref="$(env_kv_of "$name" dbref)" if [ -n "$ref" ]; then printf '%s' "$ref"; return 0; fi dsn="$(printf '%s' "$(env_kv_of "$name" exec)" | sed -n 's/.*--dsn \([^ ]*\).*/\1/p')" + [ -z "$dsn" ] && dsn="$(env_kv_of "$name" dsn)" if [ -z "$dsn" ]; then cf="$(env_kv_of "$name" conffile)" [ -z "$cf" ] && cf="$(printf '%s' "$(env_kv_of "$name" exec)" | sed -n 's/.*--config \([^ ]*\).*/\1/p')" @@ -2564,13 +2887,13 @@ mask_dsn() { printf '%s' "$1" | sed -E 's#(postgres(ql)?://[^:/@[:space:]]+:)[^@[:space:]]+@#\1***@#g' } -# mask_kv LINE:KEY=VALUE 行的敏感值掩码——password 键与键名含 KEY/PASS/SECRET/ +# mask_kv LINE:KEY=VALUE 行的敏感值掩码——password/dsn 键与键名含 KEY/PASS/SECRET/ # TOKEN/DSN 的值整段掩为 ***;其余行只掩值内 DSN 密码(exec= 里可能带完整连接串)。 mask_kv() { local line="$1" k="${1%%=*}" if [ "$k" != "$1" ]; then case "$k" in - password|*KEY*|*PASS*|*SECRET*|*TOKEN*|*DSN*) + password|dsn|*KEY*|*PASS*|*SECRET*|*TOKEN*|*DSN*) printf '%s=***' "$k"; return 0 ;; esac fi @@ -3066,7 +3389,7 @@ main() { esac ;; stop) do_stop ;; start) do_start ;; - restart) do_stop; do_start ;; + restart) do_restart ;; status) env_status_detail ;; logs) [ -f "$ENV_LOG" ] && tail -n "${CLI_LOGS_N:-50}" -f "$ENV_LOG" || c_warn "[$ENV_NAME] 暂无日志" ;; esac diff --git a/tests/test_svc.py b/tests/test_svc.py new file mode 100644 index 00000000..67cd4ed1 --- /dev/null +++ b/tests/test_svc.py @@ -0,0 +1,567 @@ +"""svc.sh 数据库配置可恢复性与启动门禁回归(2026-10-11 修复)。 + +对 scripts/svc.sh 的数据库配置统一解析做端到端验证:连续重启 / 部署 / 更新保绑定、 +绑定失效拒绝启动(绝不静默回退内嵌 SQLite)、认证预检与环境变量 DSN 对齐、显式 +解绑阻止环境残留重新选库、凭据不进命令行与日志。全部使用临时目录 + 桩二进制 +(bash + python3 http.server 模拟 agent-system),不触碰真实 runtime/ 与真实数据库。 +真实 PostgreSQL + 真实产物的验证在隔离环境另行执行并记录于任务卡。 +""" +import os +import shutil +import subprocess +import tempfile +import unittest +from pathlib import Path + +SOURCE = Path(__file__).resolve().parents[1] +SVC_SCRIPT = SOURCE / "scripts" / "svc.sh" + +# 桩 agent-system:version / config explain(环境层 DSN 感知,供能力探测)/ serve +# (记录参数与 AGENT_SYSTEM_* 环境后用 http.server 应答健康探测)。TERM 转发给子 +# 进程保证 stop 干净;bash 自身不 exec——pidcheck(二进制路径)须留在 cmdline。 +# SVC_STUB_NO_ENV_DSN=1 模拟不支持 AGENT_SYSTEM_DSN 的旧产物。 +STUB = r"""#!/usr/bin/env bash +set -u +trace_dir="${SVC_STUB_TRACE:-$PWD/.svc-stub-trace}" +mkdir -p "$trace_dir" +case "${1:-}" in + version) + echo "stub-agent-system 1.0" + exit 0 ;; + config) + if [ "${2:-}" = "explain" ]; then + echo "config file: (none)" + echo "field value source" + if [ -n "${AGENT_SYSTEM_DSN:-}" ] && [ -z "${SVC_STUB_NO_ENV_DSN:-}" ]; then + printf 'dsn postgresql://%s env\n' "$AGENT_SYSTEM_DSN" + else + echo "dsn - default" + fi + exit 0 + fi + exit 0 ;; + serve) + shift + case "${1:-}" in + -h|--help) + echo "Usage: agent-system serve -addr H:P -data DIR -plugins DIR -auth MODE -config FILE" + exit 0 ;; + esac + { + printf 'args: %s\n' "$*" + [ -n "${AGENT_SYSTEM_DSN:-}" ] && printf 'AGENT_SYSTEM_DSN=%s\n' "$AGENT_SYSTEM_DSN" + [ -n "${AGENT_SYSTEM_AUTH:-}" ] && printf 'AGENT_SYSTEM_AUTH=%s\n' "$AGENT_SYSTEM_AUTH" + } > "$trace_dir/serve.txt" + addr="" + while [ $# -gt 0 ]; do + case "$1" in --addr) addr="$2"; shift 2 ;; *) shift ;; esac + done + port="${addr##*:}"; host="${addr%:*}" + trap 'kill "$child" 2>/dev/null; exit 0' TERM INT + python3 -m http.server "$port" --bind "$host" --directory "$trace_dir" >/dev/null 2>&1 & + child=$! + wait "$child" + ;; + *) + exit 0 ;; +esac +""" + + +class SvcDbRecoveryTests(unittest.TestCase): + def setUp(self): + tmp = tempfile.mkdtemp(prefix="svc-db-regress-") + self.addCleanup(shutil.rmtree, tmp, True) + self.root = Path(tmp) + (self.root / "scripts").mkdir(parents=True) + shutil.copy2(SVC_SCRIPT, self.root / "scripts" / "svc.sh") + self.trace = self.root / "trace" + self.stub = self.root / "stub-agent-system" + self.stub.write_text(STUB) + self.stub.chmod(0o755) + (self.root / "plugins").mkdir() + (self.root / "Makefile").write_text( + "build:\n\tmkdir -p bin\n\tcp %s bin/agent-system\n" % self.stub) + self.env = os.environ.copy() + self.env.update({ + "GIT_CONFIG_NOSYSTEM": "1", "GIT_CONFIG_GLOBAL": "/dev/null", + "GIT_ALLOW_PROTOCOL": "file", "GIT_TERMINAL_PROMPT": "0", + "GIT_AUTHOR_NAME": "svc regression", "GIT_COMMITTER_NAME": "svc regression", + "GIT_AUTHOR_EMAIL": "svc-test@example.invalid", + "GIT_COMMITTER_EMAIL": "svc-test@example.invalid", + "SVC_STUB_TRACE": str(self.trace), + "SVC_SRC_DIR": str(self.root / "srccache"), + }) + for key in list(self.env): + if key.startswith("SVC_") and key not in ("SVC_STUB_TRACE", "SVC_SRC_DIR"): + self.env.pop(key) + for key in ("GIT_DIR", "GIT_WORK_TREE", "GIT_INDEX_FILE"): + self.env.pop(key, None) + # 根目录须为 git 仓(deploy --from local 取 HEAD 作 source 标签)。 + self.git(self.root, "init", "--initial-branch=main", ".") + self.git(self.root, "add", ".") + self.git(self.root, "commit", "-m", "fixture") + + def git(self, cwd, *args): + proc = subprocess.run(["git", *args], cwd=cwd, env=self.env, text=True, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, timeout=60) + self.assertEqual(proc.returncode, 0, proc.stdout) + return proc + + def tearDown(self): + # 兜底清理:停掉本测试遗留的服务进程,避免端口跨用例泄漏。 + runtime = self.root / "runtime" + if runtime.is_dir(): + for d in sorted(runtime.iterdir()): + if (d / "svc.pid").exists(): + subprocess.run( + ["bash", str(self.root / "scripts" / "svc.sh"), d.name, "stop"], + cwd=self.root, env=self.env, timeout=60, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + + # ---- 夹具 ---- + + def svc(self, *args, check=True, env=None): + proc = subprocess.run( + ["bash", str(self.root / "scripts" / "svc.sh"), *map(str, args)], + cwd=self.root, env=env if env is not None else self.env, text=True, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, timeout=120) + if check: + self.assertEqual(proc.returncode, 0, proc.stdout) + return proc + + def runtime(self, name): + return self.root / "runtime" / name + + def kv(self, name, key): + envfile = self.runtime(name) / "svc.env" + if not envfile.exists(): + return None + for line in envfile.read_text().splitlines(): + if line.startswith(key + "="): + return line[len(key) + 1:] + return None + + def register_pg(self, name, port, password="pgpw-A1", user="agent", + dbname="agent", complete=True): + d = self.runtime(name) + d.mkdir(parents=True, exist_ok=True) + rows = [("kind", "postgres"), ("env", name), ("addr", "127.0.0.1:%d" % port), + ("tags", ""), ("source", "postgres@local"), ("version", "16"), + ("user", user)] + if complete: + rows.append(("password", password)) + rows += [("dbname", dbname), ("authmode", "scram-sha-256"), + ("pgdata", str(d / "pgdata"))] + (d / "svc.env").write_text("".join("%s=%s\n" % kv for kv in rows)) + + def seed_agent(self, name, port, exec_args, extra_rows=(), addr=None): + d = self.runtime(name) + (d / "bin").mkdir(parents=True, exist_ok=True) + (d / "data").mkdir(exist_ok=True) + (d / "plugins").mkdir(exist_ok=True) + shutil.copy2(self.stub, d / "bin" / "agent-system") + rows = [("kind", "agent"), ("env", name), ("pid", ""), + ("addr", addr or ("127.0.0.1:%d" % port)), ("tags", ""), + ("source", "local@deadbee"), ("version", "stub"), ("started", ""), + ("pidcheck", str(d / "bin" / "agent-system")), + ("exec", exec_args)] + merged = dict(rows) + merged.update(dict(extra_rows)) # extra 覆盖基础键(如 source/version) + (d / "svc.env").write_text( + "".join("%s=%s\n" % kv for kv in merged.items())) + + def serve_record(self): + f = self.trace / "serve.txt" + return f.read_text() if f.exists() else "" + + def clear_serve_record(self): + f = self.trace / "serve.txt" + if f.exists(): + f.unlink() + + def start_ok(self, name, *args): + self.clear_serve_record() + result = self.svc(name, "start", *args) + self.assertIn("已启动", result.stdout) + return result + + def pid_alive(self, name): + pidf = self.runtime(name) / "svc.pid" + if not pidf.exists(): + return False + try: + os.kill(int(pidf.read_text().strip()), 0) + return True + except (ValueError, ProcessLookupError, PermissionError): + return False + + # ---- 1. 存量 exec= DSN:连续启动两次均恢复,进程参数无秘密 ---- + + def test_legacy_exec_dsn_survives_consecutive_restarts(self): + self.register_pg("pg1", 18890, password="legacy-pw-1") + dsn = "postgresql://agent:legacy-pw-1@127.0.0.1:18890/agent" + d = self.runtime("dev") + self.seed_agent("dev", 18791, + "--addr 127.0.0.1:18791 --data %s --plugins %s --auth auto --dsn %s" + % (d / "data", d / "plugins", dsn)) + for _ in range(2): + self.clear_serve_record() + self.svc("dev", "restart") + record = self.serve_record() + self.assertIn("AGENT_SYSTEM_DSN=%s" % dsn, record) + self.assertNotIn("--dsn", record.splitlines()[0]) + self.assertNotIn("legacy-pw-1", record.splitlines()[0]) + self.assertEqual(self.kv("dev", "dbref"), "pg1/agent") + self.assertEqual(self.kv("dev", "db"), "pg") + self.assertNotIn("--dsn", self.kv("dev", "exec")) + self.assertIsNone(self.kv("dev", "dsn")) + # 停止后的第三次裸 start 同样恢复同一数据库配置。 + self.svc("dev", "stop") + self.start_ok("dev") + self.assertIn("AGENT_SYSTEM_DSN=%s" % dsn, self.serve_record()) + self.assertEqual(self.kv("dev", "dbref"), "pg1/agent") + + # ---- 2. 仅 dbref:裸 restart 与重新部署均保留绑定 ---- + + def test_dbref_binding_survives_bare_restart_and_redeploy(self): + self.register_pg("pg1", 18891, password="bind-pw-2") + dsn = "postgresql://agent:bind-pw-2@127.0.0.1:18891/agent" + d = self.runtime("dev") + self.seed_agent("dev", 18792, + "--addr 127.0.0.1:18792 --data %s --plugins %s --auth auto" + % (d / "data", d / "plugins"), + extra_rows=[("dbref", "pg1/agent"), ("db", "pg")]) + self.clear_serve_record() + self.svc("dev", "restart") + self.assertIn("AGENT_SYSTEM_DSN=%s" % dsn, self.serve_record()) + self.assertEqual(self.kv("dev", "dbref"), "pg1/agent") + # 重新部署(换产物)不改变数据库选择。 + self.clear_serve_record() + self.svc("dev", "deploy", "--from", "local") + self.assertIn("AGENT_SYSTEM_DSN=%s" % dsn, self.serve_record()) + self.assertEqual(self.kv("dev", "dbref"), "pg1/agent") + self.assertEqual(self.kv("dev", "db"), "pg") + # 查看视图展示托管绑定。 + view = self.svc("dev", "db") + self.assertIn("pg1/agent", view.stdout) + + # ---- 3. 改地址不改数据库与认证 ---- + + def test_addr_change_keeps_database_and_auth(self): + self.register_pg("pg1", 18892, password="addr-pw-3") + dsn = "postgresql://agent:addr-pw-3@127.0.0.1:18892/agent" + d = self.runtime("dev") + self.seed_agent("dev", 18793, + "--addr 127.0.0.1:18793 --data %s --plugins %s --auth auto" + % (d / "data", d / "plugins"), + extra_rows=[("dbref", "pg1/agent"), ("db", "pg")]) + self.clear_serve_record() + self.svc("dev", "restart", "--addr", "127.0.0.1:18794") + record = self.serve_record() + self.assertIn("AGENT_SYSTEM_DSN=%s" % dsn, record) + self.assertIn("--auth auto", record) + self.assertEqual(self.kv("dev", "dbref"), "pg1/agent") + self.assertEqual(self.kv("dev", "addr"), "127.0.0.1:18794") + self.assertIn("--addr 127.0.0.1:18794", self.kv("dev", "exec")) + self.assertEqual(self.kv("dev", "db"), "pg") + + # ---- 4. 外部直连与配置文件来源:后续无参数启动仍恢复 ---- + + def test_external_dsn_and_conffile_recover_on_bare_start(self): + d = self.runtime("dev") + self.seed_agent("dev", 18795, + "--addr 127.0.0.1:18795 --data %s --plugins %s --auth auto" + % (d / "data", d / "plugins")) + external = "postgresql://extu:ext-pw-4@10.9.8.7:5432/extdb" + self.clear_serve_record() + self.svc("dev", "deploy", "--from", "local", "--dsn", external) + self.assertEqual(self.kv("dev", "dsn"), external) + self.assertEqual(self.kv("dev", "db"), "pg") + self.assertIsNone(self.kv("dev", "dbref")) + self.assertIn("AGENT_SYSTEM_DSN=%s" % external, self.serve_record()) + self.svc("dev", "stop") + self.start_ok("dev") + self.assertIn("AGENT_SYSTEM_DSN=%s" % external, self.serve_record()) + # 显式重新绑定 = 切换(托管绑定替换直连,dsn= 清除,不视为冲突)。 + self.register_pg("pgother", 18893, password="other-pw") + self.svc("dev", "db", "pgother", "--no-restart") + self.assertEqual(self.kv("dev", "dbref"), "pgother/agent") + self.assertIsNone(self.kv("dev", "dsn")) + + # conffile 来源:DSN 由文件提供,不经环境重复传递;db=pg 标记保留。 + conf = self.root / "conf-db.json" + conf.write_text('{"dsn": "postgresql://cfu:cf-pw-5@127.0.0.1:18894/cfdb",' + ' "auth": "auto"}') + self.svc("dev", "db", "--clear", "--no-restart") + self.svc("dev", "config", conf, "--no-restart") + self.assertEqual(self.kv("dev", "conffile"), str(conf)) + self.svc("dev", "stop") + self.start_ok("dev") + self.assertNotIn("AGENT_SYSTEM_DSN=", self.serve_record()) + self.assertEqual(self.kv("dev", "db"), "pg") + self.assertEqual(self.kv("dev", "conffile"), str(conf)) + self.svc("dev", "stop") + self.start_ok("dev") + self.assertNotIn("AGENT_SYSTEM_DSN=", self.serve_record()) + self.assertEqual(self.kv("dev", "conffile"), str(conf)) + + # ---- 5. 拒启场景:不降级 SQLite、不启动进程、登记可恢复、停机前发现 ---- + + def test_refusals_keep_registration_without_sqlite_fallback(self): + d = self.runtime("a1") + self.seed_agent("a1", 18796, + "--addr 127.0.0.1:18796 --data %s --plugins %s --auth auto" + % (d / "data", d / "plugins"), + extra_rows=[("dbref", "pgmissing/agent"), ("db", "pg")]) + self.clear_serve_record() + result = self.svc("a1", "restart", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertIn("拒绝", result.stdout) + self.assertEqual(self.serve_record(), "") # 未启动任何进程 + self.assertEqual(self.kv("a1", "dbref"), "pgmissing/agent") # 可恢复配置保留 + + # 实例登记不全(缺 password)→ 拒启。 + self.register_pg("pginc", 18895, complete=False) + d = self.runtime("a2") + self.seed_agent("a2", 18797, + "--addr 127.0.0.1:18797 --data %s --plugins %s --auth auto" + % (d / "data", d / "plugins"), + extra_rows=[("dbref", "pginc/agent"), ("db", "pg")]) + result = self.svc("a2", "restart", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertIn("拒绝", result.stdout) + + # dbref 与 dsn= 指向不同库 → 配置冲突拒启。 + self.register_pg("pg1", 18896, password="clash-pw") + d = self.runtime("a3") + self.seed_agent("a3", 18798, + "--addr 127.0.0.1:18798 --data %s --plugins %s --auth auto" + % (d / "data", d / "plugins"), + extra_rows=[("dbref", "pg1/agent"), ("db", "pg"), + ("dsn", "postgresql://u:p@127.0.0.1:18999/otherdb")]) + result = self.svc("a3", "restart", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertIn("拒绝", result.stdout) + + # db=pg 但无可恢复 DSN → 拒启。 + d = self.runtime("a4") + self.seed_agent("a4", 18799, + "--addr 127.0.0.1:18799 --data %s --plugins %s --auth auto" + % (d / "data", d / "plugins"), + extra_rows=[("db", "pg")]) + result = self.svc("a4", "restart", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertIn("拒绝", result.stdout) + self.assertEqual(self.kv("a4", "db"), "pg") + + def test_restart_refusal_happens_before_stopping_running_service(self): + self.register_pg("pg1", 18897, password="run-pw") + d = self.runtime("a5") + self.seed_agent("a5", 18800, + "--addr 127.0.0.1:18800 --data %s --plugins %s --auth auto" + % (d / "data", d / "plugins"), + extra_rows=[("dbref", "pg1/agent"), ("db", "pg")]) + self.start_ok("a5") + self.assertTrue(self.pid_alive("a5")) + # 破坏实例登记(去掉 password)后 restart:预检拒绝发生在停止旧进程之前。 + self.register_pg("pg1", 18897, password="run-pw", complete=False) + self.clear_serve_record() + result = self.svc("a5", "restart", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertIn("拒绝", result.stdout) + self.assertTrue(self.pid_alive("a5")) # 服务未被停止 + self.assertEqual(self.serve_record(), "") # 也没有重启新进程 + self.assertEqual(self.kv("a5", "dbref"), "pg1/agent") + + # ---- 6. 认证预检与后端口径一致(环境变量 DSN 覆盖 auto)---- + + def test_auth_preflight_aligns_with_effective_env_dsn(self): + # 非回环 + auto + 无任何 DSN → 预检快速拒绝,不启动进程。 + d = self.runtime("nl1") + self.seed_agent("nl1", 18801, + "--addr 10.255.255.1:18801 --data %s --plugins %s --auth auto" + % (d / "data", d / "plugins")) + self.clear_serve_record() + result = self.svc("nl1", "start", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertIn("拒绝启动", result.stdout) + self.assertEqual(self.serve_record(), "") + + # 环境变量提供 DSN → auto 判为已开认证:预检放行(桩绑定非回环地址失败即退, + # 区别于预检拒绝——证明进入启动路径且 DSN 经环境交付)。 + d = self.runtime("nl2") + self.seed_agent("nl2", 18802, + "--addr 10.255.255.1:18802 --data %s --plugins %s --auth auto" + % (d / "data", d / "plugins"), addr="10.255.255.1:18802") + env_dsn = "postgresql://envu:env-pw@127.0.0.1:18898/agent" + env2 = dict(self.env, SVC_NL2_DSN=env_dsn) + self.clear_serve_record() + result = self.svc("nl2", "start", check=False, env=env2) + self.assertNotEqual(result.returncode, 0) + self.assertNotIn("拒绝启动", result.stdout) + self.assertIn("AGENT_SYSTEM_DSN=%s" % env_dsn, self.serve_record()) + + # 显式 auth=off 覆盖环境 DSN → 仍拒绝。 + d = self.runtime("nl3") + self.seed_agent("nl3", 18803, + "--addr 10.255.255.1:18803 --data %s --plugins %s --auth off" + % (d / "data", d / "plugins"), addr="10.255.255.1:18803") + self.clear_serve_record() + result = self.svc("nl3", "start", check=False, + env=dict(self.env, SVC_NL3_DSN=env_dsn)) + self.assertNotEqual(result.returncode, 0) + self.assertIn("拒绝启动", result.stdout) + self.assertEqual(self.serve_record(), "") + + # ---- 7. 显式解绑:环境残留不再悄悄重新选库 ---- + + def test_explicit_unbind_blocks_residual_env_dsn(self): + self.register_pg("pg1", 18899, password="unbind-pw") + d = self.runtime("dev") + self.seed_agent("dev", 18804, + "--addr 127.0.0.1:18804 --data %s --plugins %s" + % (d / "data", d / "plugins")) + self.svc("dev", "db", "pg1", "--no-restart") + self.assertEqual(self.kv("dev", "dbref"), "pg1/agent") + self.assertEqual(self.kv("dev", "db"), "pg") + self.assertIsNone(self.kv("dev", "dsn")) + self.assertNotIn("--dsn", self.kv("dev", "exec") or "") + + residual = "postgresql://other:other-pw@127.0.0.1:18901/other" + env_residual = dict(self.env, SVC_DEV_DSN=residual) + # 绑定状态下环境残留指向别库 → 冲突拒绝,不静默选其一。 + result = self.svc("dev", "restart", check=False, env=env_residual) + self.assertNotEqual(result.returncode, 0) + self.assertIn("拒绝", result.stdout) + + # 显式解绑后:同一环境残留被忽略,按内嵌档启动。 + self.svc("dev", "db", "--clear", "--no-restart") + self.assertIsNone(self.kv("dev", "dbref")) + self.assertIsNone(self.kv("dev", "dsn")) + self.assertEqual(self.kv("dev", "db"), "sqlite") + self.clear_serve_record() + self.svc("dev", "restart", env=env_residual) + self.assertNotIn("AGENT_SYSTEM_DSN=", self.serve_record()) + self.assertEqual(self.kv("dev", "db"), "sqlite") + + # ---- 8. mock 冲突与旧产物:行为明确,不隐式降级 ---- + + def test_mock_conflict_and_legacy_binary_refuse(self): + self.register_pg("pg1", 18902, password="mock-pw") + d = self.runtime("mk1") + self.seed_agent("mk1", 18805, + "--addr 127.0.0.1:18805 --data %s --plugins %s --auth auto" + % (d / "data", d / "plugins"), + extra_rows=[("dbref", "pg1/agent"), ("db", "pg")]) + result = self.svc("mk1", "deploy", "--from", "local", "--mock", check=False) + self.assertNotEqual(result.returncode, 0) + self.assertIn("mock", result.stdout) + self.assertIn("拒绝", result.stdout) + self.assertEqual(self.kv("mk1", "dbref"), "pg1/agent") + + # 旧产物(不消费环境变量 DSN)绑定服务 restart → 拒绝,提示可操作出路。 + d = self.runtime("lb1") + self.seed_agent("lb1", 18806, + "--addr 127.0.0.1:18806 --data %s --plugins %s --auth auto" + % (d / "data", d / "plugins"), + extra_rows=[("dbref", "pg1/agent"), ("db", "pg")]) + env_legacy = dict(self.env, SVC_STUB_NO_ENV_DSN="1") + result = self.svc("lb1", "restart", check=False, env=env_legacy) + self.assertNotEqual(result.returncode, 0) + self.assertIn("环境变量 DSN", result.stdout) + self.assertEqual(self.kv("lb1", "dbref"), "pg1/agent") + + # ---- 9. 多实例顺序更新不串用 DSN;凭据不进日志与历史 ---- + + def test_sequential_restarts_no_cross_dsn_and_no_secret_leak(self): + self.register_pg("pg1", 18903, password="iso-pw-one") + self.register_pg("pg2", 18904, password="iso-pw-two") + d1, d2 = self.runtime("dev"), self.runtime("prod") + self.seed_agent("dev", 18807, + "--addr 127.0.0.1:18807 --data %s --plugins %s --auth auto" + % (d1 / "data", d1 / "plugins"), + extra_rows=[("dbref", "pg1/agent"), ("db", "pg")]) + self.seed_agent("prod", 18808, + "--addr 127.0.0.1:18808 --data %s --plugins %s --auth auto" + % (d2 / "data", d2 / "plugins"), + extra_rows=[("dbref", "pg2/agent"), ("db", "pg")]) + dsn1 = "postgresql://agent:iso-pw-one@127.0.0.1:18903/agent" + dsn2 = "postgresql://agent:iso-pw-two@127.0.0.1:18904/agent" + for name, dsn in (("dev", dsn1), ("prod", dsn2)): + self.clear_serve_record() + self.svc(name, "restart") + self.assertIn("AGENT_SYSTEM_DSN=%s" % dsn, self.serve_record()) + self.assertEqual(self.kv(name, "dbref"), + "pg1/agent" if name == "dev" else "pg2/agent") + # 交叉重启仍正确(验证解析态不跨实例串用)。 + self.clear_serve_record() + self.svc("prod", "restart") + self.assertIn("AGENT_SYSTEM_DSN=%s" % dsn2, self.serve_record()) + + # 凭据不进 svc.log、history.jsonl 与 exec=(命令行断言见各启动用例的 serve 记录)。 + for name in ("dev", "prod"): + log = self.runtime(name) / "svc.log" + hist = self.runtime(name) / "history.jsonl" + blob = (log.read_text() if log.exists() else "") \ + + (hist.read_text() if hist.exists() else "") \ + + (self.kv(name, "exec") or "") + self.assertNotIn("iso-pw-one", blob) + self.assertNotIn("iso-pw-two", blob) + # 最后一次 serve 的命令行参数行同样无秘密。 + args_line = self.serve_record().splitlines()[0] if self.serve_record() else "" + self.assertNotIn("iso-pw-two", args_line) + self.assertNotIn("--dsn", args_line) + # svc.env 权限 600。 + mode = (self.runtime("dev") / "svc.env").stat().st_mode & 0o777 + self.assertEqual(mode, 0o600) + + # ---- 10. update(dev 源)保留绑定 ---- + + def make_src_repo(self): + remote = self.root / "srcremote.git" + work = self.root / "srcwork" + src = self.root / "srccache" + run = lambda cwd, *args: subprocess.run( + ["git", *args], cwd=cwd, env=self.env, text=True, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, timeout=60, + check=True) + run(self.root, "init", "--bare", "--initial-branch=main", str(remote)) + run(self.root, "init", "--initial-branch=main", str(work)) + makefile = "build:\n\tmkdir -p bin\n\tcp %s bin/agent-system\n" % self.stub + (work / "Makefile").write_text(makefile) + run(work, "add", ".") + run(work, "commit", "-m", "v1") + (work / "marker").write_text("v2\n") + run(work, "add", ".") + run(work, "commit", "-m", "v2") + run(work, "remote", "add", "origin", str(remote)) + run(work, "push", "-u", "origin", "main") + run(self.root, "clone", str(remote), str(src)) + shas = run(src, "log", "--format=%h", "origin/main").stdout.split() + return shas[1], shas[0] # (旧, 新) + + def test_update_preserves_binding(self): + old_sha, new_sha = self.make_src_repo() + self.register_pg("pg1", 18905, password="upd-pw") + dsn = "postgresql://agent:upd-pw@127.0.0.1:18905/agent" + d = self.runtime("dev") + self.seed_agent("dev", 18809, + "--addr 127.0.0.1:18809 --data %s --plugins %s --auth auto" + % (d / "data", d / "plugins"), + extra_rows=[("dbref", "pg1/agent"), ("db", "pg"), + ("source", "dev@%s" % old_sha)]) + self.clear_serve_record() + self.svc("update", "dev") + self.assertEqual(self.kv("dev", "source"), "dev@%s" % new_sha) + self.assertEqual(self.kv("dev", "dbref"), "pg1/agent") + self.assertEqual(self.kv("dev", "db"), "pg") + self.assertIn("AGENT_SYSTEM_DSN=%s" % dsn, self.serve_record()) + # 更新后裸 restart 仍保绑定。 + self.clear_serve_record() + self.svc("dev", "restart") + self.assertIn("AGENT_SYSTEM_DSN=%s" % dsn, self.serve_record()) + + +if __name__ == "__main__": + unittest.main()