# AIOS V2R1 Hermes 生命周期最终验证报告 - 报告版本:`V2R1-hermes-lifecycle-20260721.3` - 日期:`2026-07-21` - 分支:`patch/chatgpt/AIOS-V2R1-HERMES-LIFECYCLE-20260721` - 固定验证 OID:`95d2e52cb55c7b913e89bc6bed2bcdacf67512d4` - 总体状态:`PARTIAL / BLOCKED_GLOBAL_WORKTREE_CLEANLINESS` - 发布决策:`STOP_PREPRODUCTION` - 生产发布:`NOT_APPROVED` ## 1. 执行结论 `BLK-LIVE-HERMES-FULL-LIFECYCLE-EVIDENCE-MISSING` 的 Hermes 功能与证据子条件已在固定 OID 上全部通过。候选实现复用现有 Hermes Adapter、Queue、Lease、Task 与 Orchestrator 状态机,新增持久 SQLite Store 和默认关闭的受保护内部生命周期接口。Hermes 完整生命周期 `17/17`、候选测试 `49/49`、Gate A、Gate B `10/10`、离线 Acceptance `8/0/1`、真实 OpenClaw HTTP、重启恢复、双向回滚和最终健康检查均通过。 但 Owner 指令规定只有全部 Acceptance 条件同时满足时才允许正式解除该 Blocker。由于“所有 Worktree clean”失败,本报告不得把它标记为正式 `RESOLVED`;准确状态是 `EVIDENCE_COMPLETE / FORMAL_CLOSURE_BLOCKED`。 最终发布门禁仍失败:权威 Bare Repo 登记的 88 个 worktree 中有 10 个脏 worktree。候选 worktree 和活动 Controller worktree 均 clean,且无 locked/prunable;但 Owner 的验收条件要求所有 worktree clean,因此不得准备 RC、不得发起 Tag Approval Request、不得进入预生产评审。 ## 2. 关键实现 - `SQLiteHermesStore` 持久保存 Job、Result、Idempotency 与 Worker Heartbeat。 - 现有 `HermesAdapter` 保持唯一 Queue/Lease 状态机,支持指定 Job claim、租约到期 requeue、重启恢复与严格终态冲突。 - 生命周期身份绑定覆盖 tenant、task、trace、principal、provenance、run、dispatch、job、cell、profile。 - start/heartbeat/complete/fail 强制 Lease Owner;complete/fail/cancel 通过 `ExecutionOrchestrator.reconcile_hermes` 更新 Task 与 Dispatch。 - cancel 仅允许同时具备 `runtime` 与 `platform_admin` 的 AIOS Control Plane,要求 `cancellation_source=aios-control-plane`,并拒绝携带 `worker_id`,Worker 只能观察取消。 - 所有成功生命周期操作写入 Audit/Event/Execution Evidence;接口由 `AIOS_HERMES_LIFECYCLE_API_ENABLED` 控制,默认关闭。 ## 3. 固定 OID 验证 | 项目 | 结果 | |---|---| | Python syntax/import | PASS | | 全部 candidate tests | `49/49` | | Grant isolation | `11/11` | | Dispatch recovery | `1/1` | | Hermes lifecycle | `17/17` | | Docs code gate / Gate A | `0 errors / 0 warnings` | | Secret scan | `547 tracked files / 0 violations` | | SQLite quick_check | `2/2 ok` | | Gate B | `10/10` | | Offline Acceptance | `8 passed / 0 failed / 1 expected warning` | | OpenClaw real HTTP | `COMPLETED` | | Hermes full live rerun | `17/17` | | Restart recovery | `2/2` | | Previous → Current rollback/forward | PASS | | State preservation | `STATE_PRESERVED_EXACTLY=PASS` | | Corrected final health (`16R`) | PASS,三服务 active | 原 `16.log` 由非服务用户执行健康脚本,打印 state-dir 权限失败后被外层脚本错误覆盖为退出码 0,因此不作为通过证据。纠错后的 `16R.log` 使用受控 `sudo env`,子 shell 保留失败码,所有健康项实际 PASS 且 `EXIT_CODE=0`。原文件保留用于审计。 回滚日志中的短暂 connection-refused 发生于 systemd 重启窗口内,受 `AIOS_V2_ROLLBACK_HEALTH_RETRIES=30` 与 1 秒间隔限制;前后两次均在界限内达到健康、输出 `ROLLBACK_COMPLETE`,并完成状态文件精确哈希对账。 ## 4. Evidence - 根目录:`/var/lib/aios-gitops/acceptance/aios-v2r1-hermes-lifecycle-20260721T054205Z` - `steps.tsv` SHA256:`b2ad20585ba7f576e85657827a0b1db6f252887bbd73bcd718df38623e9d95cf` - `final-live-gate.log` SHA256:`82040c674759dacf587658c5e936c313a1f50e8e2425be48ad891927befdf4fa` - `16R.log` SHA256:`641246927a372ebaa9e6dde8b018b88275b2ba15a442473759b23fb1f215d9cf` - `15.log` SHA256:`b0a474e2a74164f560c4f7572091911f32011c75faccd37a3c7315046275011e` - `13.log` SHA256:`b9f637cca6e97ed893bf38530e05cd33b78e324c5e8865d4c602dfeac22a7710` - `12R2.log` SHA256:`0c431f5f5f1c1b17acda160c917b08c7f4036485016c23e1236b9b6f4a78de67` 证据只记录身份、状态、命令、时间、退出码与 Hash,不记录 Secret 值。 ## 5. Git 与运行态门禁 | 门禁 | 当前值 | 结果 | |---|---|---| | Bare/Gitea/Candidate OID | 全部 `95d2e52cb55c7b913e89bc6bed2bcdacf67512d4` | PASS | | Candidate worktree | clean | PASS | | Active Controller | `6188da26453505dacde9d6d298191437164c8d27`,detached、clean | PASS | | Locked worktree | `0` | PASS | | Prunable worktree | `0` | PASS | | 全局 worktree clean | `10 dirty / 88 total` | FAIL | | 当前隔离 Release | `b158041b8633e658c34ce182f3c8aa97b4bf5f9a` | 已恢复 | | AIOS/OpenClaw/Controller services | active | PASS | 10 个脏 worktree 均不属于本任务允许清理的范围: 1. `chatgpt/TASK-V2R1-PERSONAL-WEIXIN-GOLDEN-CONTRACT-R2-20260715`(36) 2. `chatgpt/TASK-V2R1-PERSONAL-WEIXIN-PORTAL-ADAPTER-20260715`(2) 3. `chatgpt/TASK-WORKTREE-CONCURRENCY-CHATGPT-20260715T055106UTC8`(2) 4. `codex`(56) 5. `codex/TASK-CODEX-AIOS-SPARK-RUNNER-PROVISIONING-20260717T103500UTC8`(6) 6. `controller`(11) 7. `openclaw`(5) 8. `openclaw/TASK-OPENCLAW-V2R1-PERSONAL-WEIXIN-B3-EVIDENCE-HARDEN-20260716T133000UTC8`(3) 9. `openclaw/TASK-V2R1-OPENCLAW-WEIXIN-WEB-LOGIN-CONTRACT-20260715`(20) 10. `openclaw/TASK-WORKTREE-CONCURRENCY-OPENCLAW-20260715T055106UTC8`(3) ## 6. Reviewer 独立 Spark Reviewer 首先发现 cancel 权限边界不够明确;该问题已在 `95d2e52` 修复并新增三条 HTTP 断言。纠错后 Reviewer 确认代码安全边界、16 步证据与有界回滚均 PASS。对发布门禁的最终布尔复核为:`DIRTY_WORKTREE_COUNT=10` 且 `GLOBAL_WORKTREE_CLEAN=false`,所以全局门禁 FAIL,不能进入预生产评审。 ## 7. Blocker 与发布决策 - 功能与证据子条件通过、正式关闭受阻:`BLK-LIVE-HERMES-FULL-LIFECYCLE-EVIDENCE-MISSING` - 直接阻断条件:`BLK-GLOBAL-WORKTREE-CLEANLINESS` - 状态:`BLOCKED_EVIDENCE_REQUIRED` - 决策:`STOP_PREPRODUCTION` 本轮未修改 `main`、未创建 Tag、未 Force Push、未切换生产流量、未部署新 RC、未输出 Secret。 下一步唯一允许动作:由各 worktree Owner 审查并提交、归档或可信清理上述 10 个脏 worktree,然后重新执行全局 Git 门禁。只有全局 dirty 数量降为 0 后,才允许准备 RC 与 Tag Approval Request。