无人值守自动修复报告 (2026-07-07 03:33 定时任务)#
分支: fix/governance-closedloop-20260707(19 个 commit,未 merge、未 push)
结果: 计划 22 项全部完成(T0.1–T4.4 + 本报告),无跳过、无失败。
测试: 325 passed(新增 ~92 个用例,全部离线 fake/mock,不依赖真实
Redis/Docker/Postgres/飞书)。.env 未改动(仅 .env.example 增占位)。
一、逐项结果#
Tier 0 安全硬化#
| 项 | Commit | 改动文件 | 默认策略 | 测试 |
|---|
| T0.1 审批超时降级 | da8059d | app/runtime/approval_timeout.py(新), approvals.py, tool_runner.py, config.py | escalate_then_deny(拍板):超时→催办+续等一轮→二次超时 deny;永不自动放行 | 9 ✅ |
| T0.2 BYPASS 启动断言 | 000c45f | config.py | 非 debug 环境配 bypass → Settings 实例化即 raise | 4 ✅ |
| T0.3 max_iters 优雅收尾 | a9feb19 | tool_runner.py | 撞限→补 pending 占位+裸模型禁工具收尾轮,无半成品 | 4 ✅ |
| T0.4 预算熔断进 loop | 91a8eeb | tool_runner.py | 每轮进门查预算,超限→收尾退出;预算未配置(=0)行为完全不变 | 3 ✅ |
Tier 1 Agent 基建 + Harness#
| 项 | Commit | 要点 | 测试 |
|---|
| T1.1 类型化错误 | 8201df7 | app/runtime/errors.py(新) 5 类异常;classify_error isinstance 优先,字符串兜底保留 | 3 ✅ |
| T1.2 工具熔断器 | 7994b30 | per-run 连续失败≥3(可配)短路”暂不可用”;成功复位;≤0 关闭 | 5 ✅ |
| T1.3 参数级权限 | a9cae7a | tool(param=glob) 语法;deny 强于 ask 且 BYPASS 不豁免;空规则 no-op(默认) | 8 ✅ |
| T1.4 context 压缩 | 72c8317 | 对话级 auto-compact,阈值 80k 字符(短对话零影响);不拆 tool 配对;失败 fail-open | 5 ✅ |
| T1.5 Subagent 护栏 | 81fe3dd | delegate 并发信号量(默认2) + token_ledger.py(新) ContextVar 台账,子 Agent 花费触发主熔断 | 4 ✅ |
Tier 2 处置引擎升级#
| 项 | Commit | 要点 | 测试 |
|---|
| T2.1 多步 Saga | b4135c3 | saga.py(新):已提交栈+逆序补偿;不可回滚/占位未回填拒盲补;4 终态 | 8 ✅ |
| T2.2 锁+幂等 | 8e6e100 | locks.py(新):URI 级互斥(内存默认/Redis 可选自动降级)+幂等键 | 9 ✅ |
| T2.3 plan-only+钩子 | 4a06d59 | run_transaction(plan_only=True) 零变更预览(planned);recovery_plan 钩子默认 no-op 绝不自动执行 | 5 ✅ |
| T2.4 回归验证 | 1bfd360 | regression.py(新):资源态复核(失败判失败)+告警消退(后端抖动 inconclusive 不误判) | 6 ✅ |
Tier 3 真闭环接线(核心,按拍板默认开)#
| 项 | Commit | 要点 | 测试 |
|---|
| T3.1 闭环执行层 | bdfc0df | closed_loop.py(新):幂等→锁→事务→回归验证;多步走 Saga;worker 接线,REMEDIATION_CLOSED_LOOP=true(默认),False 回退旧路径 | 9 ✅ (含全链路: 执行→verify失败→逆序补偿) |
| T3.2 飞书审批通道 | d767f69 | approval_notifier.py(新):创建卡+催办卡+跳转按钮;FEISHU_APPROVAL_CHAT_ID 空→仅日志;发送失败绝不阻塞审批 | 5 ✅ |
| T3.3 可观测 stats | 0d55f16 | stats.py(新) 纯函数聚合 + GET /api/v1/remediation/stats | 5 ✅ |
| T3.4 处置去重 | 83fab99 | find_inflight:同资源/同 incident 进行中→duplicate_inflight;DB 异常 fail-open(锁+幂等兜底) | 4 ✅ |
| T3.5 经验回灌 | 841f6ed | ingest_remediation:确定性追加到诊断同源 pattern 页”## 处置记录”(成功/回滚教训/回归未通过) | 5 ✅ |
Tier 4 文档更新#
| 项 | Commit | 产出 |
|---|
| T4.1-T4.4 | 2fea899 | 内部文档补充 |
二、新增配置一览(均已写入 .env.example)#
| 配置 | 默认值 | 说明 |
|---|
APPROVALS_TIMEOUT_POLICY | escalate_then_deny | 超时策略(拍板默认) |
APPROVALS_ESCALATE_EXTEND_SEC | 0(=再等一个周期) | 催办续等时长 |
APPROVALS_MAX_ESCALATIONS | 1 | 最多催办轮数 |
FEISHU_APPROVAL_CHAT_ID | 空 | 待你填:审批群 chat_id (oc_ 开头),空=仅日志 |
APPROVAL_CENTER_URL | 空 | 卡片跳转地址,空=http://127.0.0.1:<port>/approvals |
REMEDIATION_CLOSED_LOOP | true | 闭环执行总开关(拍板默认开) |
REMEDIATION_REGRESSION_ENABLED / _SETTLE_SEC | true / 3.0 | 回归验证 |
REMEDIATION_DEDUP_ENABLED | true | incident/资源级去重 |
TOOL_CIRCUIT_BREAKER_THRESHOLD | 3 | 工具熔断阈值 |
SUBAGENT_MAX_CONCURRENCY | 2 | delegate 并发上限 |
AGENT_CONTEXT_COMPACT_THRESHOLD_CHARS / _KEEP_RECENT | 80000 / 4 | 对话级压缩 |
PERMISSION_PARAM_DENY_RULES / _ALLOW_RULES | 空(=no-op) | 参数级权限规则 |
三、需要你醒后处理的清单(按优先级)#
- 填
FEISHU_APPROVAL_CHAT_ID(.env):审批群 chat_id;并在飞书开放平台确认
自建应用有 im:message 权限、机器人已入群。没填前通知自动降级为日志,不报错。
- 验收后决定是否 merge:
git diff main...fix/governance-closedloop-20260707 审查,
或先跑一次真实链路(起服务→触发一条处置→看审批卡/催办/闭环执行/stats/wiki 回灌)。
- 可调参数拍板:催办续等时长(当前=再等一个
APPROVALS_TIMEOUT_SEC=300s 周期)、
回归验证 settle 3s 是否够(告警评估周期通常 15-60s,建议真实环境调到 ≥30s)。
- 已知残留 gap(本次未做,属生产化边界):
- Redis 锁 release 是 GET+DEL 非原子(生产应换 Lua);
- 回归验证的告警关联是宽匹配(资源 id 子串),生产应走告警指纹;
- 飞书卡片内批准(需公网回调)未做,维持”通知+跳转”形态;
execute_transaction_with_approval inline 路径仍走旧 wait_for_decision
单轮超时(deep 图 interrupt 模式有自己的等待机制)——escalate-then-deny 已接
tool_runner 同步 ask 路径与解耦 worker 主路径,inline deep 旧路径如需同样策略
可后续一行接入。
- 审批页前端:
APPROVAL_CENTER_URL 默认猜的 /approvals 路由,请确认前端实际路由后配置。
四、执行纪律自查#
- ✅ 全程在新分支,逐项独立 commit(19 个),main 未动、未 push
- ✅ 每项
pytest tests/ -x -q 全绿后才 commit(最终 325 passed)
- ✅ 单测全离线;
.env 未改;未开任何 MCP 写闸(DOCKER_ALLOW_WRITE 等保持原样)
- ✅ 拍板决策照办:escalate-then-deny 默认 / 飞书占位+mock / 闭环默认开
- ✅ 额度充足,未触发优雅停