/athena-runtime-verify — 运行时验证环 (v9.8.0, Codex)
为什么存在 (痛点)
PACE 到 impl 为止, review + 单测只验证 "想的问题实现没 / 单测过没", 不验证 实际运行. 单测全绿 ≠ 真实接口跑得通 / 边界数据不炸 / 换环境不挂. 本 skill 在 impl 与 review 之间插 运行时验证环: 写完 → 实跑 → 自测自改 → 直到真能跑. 把"人盯着跑测试、贴日志、让它改"换成 系统自己跑、自己发现、自己改 (Loop Engineering).
触发 (按 PACE 级别)
| 路径 | runtime-verify | Goals 承载范围 | |---|---|---| | Hotfix | 跳过 (救火) | — | | Bugfix / Quick | 跳过 (单测够) | — | | Feature | 可选 (碰外部接口/有状态/多环境 → 做) | impl+runtime (可选) | | Refactor | 强制 | impl+runtime | | System | 强制 + 完整 Sprint | 全程 PACE |
小改动不强制 (铁律[不过度工程]).
核心: 用 Codex Goals 承载, 不自造 loop
Codex Goals (0.133+ 默认开启 [官方 release 0.133]) 是 CX 端的 objective-driven loop: 持续执行直到完成条件满足. 本 skill 不重新发明 loop, 把"运行时验证"写成 Goals 完成条件, 让 Codex 自驱.
Step 0 · 开环前自检 (Loop Readiness · 借 cobusgreyling/loop-engineering loop-audit)
把 Goals 这种自驱 loop 放出去前, 主 thread 先给自己打分 —— "agent in loop and check" 把 check 前移: 让 loop 跑之前就有能说 no 的东西, 而不是烧完 token 才发现没护栏。三项全绿才进 Step 1。
| 自检项 | 不通过则 | |---|---| | CHECKER 能说 no? 有 test / typecheck / lint / delivery-gate 能判失败 | 无硬验证 → 先补一个会失败的断言再开环 | | 预算护栏有硬数字? turn/时间上限 (大任务) token 预算 | 没写 → 补上限; 大任务额外估 token (借 loop-cost 思路) | | 状态落盘点? 进展写 .ai_state 而非只在 context | 不落盘 → 一断片就失忆; 配 /athena-checkpoint |
把 loop-audit 的 "Loop Readiness Score" 做成 agent 自评的一次性 gate —— 不引外部 CLI, 不自造轮子。
Step 1 · 主 thread 设 Goals (impl 完成后)
完成条件三件套:
- 可测终态: 实跑结果可判定 (HTTP 200 / 退出码 0 / 边界用例全过)
- stated check (怎么证明 — 见陷阱): 把实跑命令 + 输出晒进对话
- 约束 + turn 上限护栏: 改哪些不能动 + turn/时间上限 (Goals continuation 撞 usage limit/重复 blocker 自动停, 但上限仍要写)
⚠️ 完成判定只看对话里展示的 (致命陷阱)
同 CC /goal: 完成判定基于 agent 在对话里实际展示的东西, 不读文件. → 完成条件必须写成"输出能演示的", 每次实跑把 命令 + 输出 晒进对话.
| ❌ 错误 | ✅ 正确 |
|---|---|
| "接口测试通过" | "运行 curl ... \| jq .status → 输出 200" |
| "边界都覆盖了" | 5 个用例的实跑命令 + 实际输出逐条贴出 |
Step 2 · 主 thread 在 Goals 循环内自驱 (DOER + CHECKER)
每轮自己决定下一步 (即"自己给自己提要求"):
- 写测试场景: 实际接口调用 / 模拟数据 (正常+边界+异常) / 不同环境
- 实跑 (按类型):
- 前端 / E2E →
$playwrightskill (优先, 可落 repeatable tests); browser/computer-use plugin 仅作探索或人工式冒烟 - 后端 / API →
curl/ 真实 HTTP / 测试库真实读写 (shell) - CLI → 实际命令 + 退出码 + stdout 断言
- 前端 / E2E →
- 测出问题 → 自己改 → 复跑 (自测自改)
- 循环到完成条件满足
Step 3 · 执行者判定 (CX 本平台 Goals 主路径)
默认 CX 本平台 Goals. 密集测试想隔离/省 token → spawn_agent generator.toml 分派 (multi-agent v2), opt-in.
Step 4 · reflect (写完先自测, 再想哪里没完善)
Goals 跑完, 触发结构化反思 (Loop Engineering "系统自己发现任务"):
- 对照 design.md 验收 + 实跑暴露的现实, 列 "还有哪些没覆盖 / 没完善"
- 写 runtime-verify.md 的
## Reflect段 - 决策: 发现缺口 → 回 impl 补 (写进 checklist.yaml 新 task); 够了 → next_action=review
reflect 不发散新需求 (那是项目级 brainstorm); 只查本 sprint 落地完整性.
产出
sprints/{slug}/runtime-verify.md (用 apply_patch 写): 含 ## /goal 完成条件 ## 测试场景 (实跑) (表格: 场景/类型/命令/实际输出/判定) ## 自测自改记录 ## Reflect ## VERDICT.
delivery-gate 联动
System/Refactor + stage=ship 时, delivery-gate.py 检查 runtime-verify.md 存在 + 含 ## 测试场景 段. 缺失 → block.
与单测/review 分工
| | 单测 (impl) | runtime-verify (本) | review | |---|---|---|---| | 验什么 | 函数逻辑 | 真实运行 | 代码质量+spec | | 怎么验 | mock+断言 | 实跑+真实数据+自测自改 | 读代码对照 design/checklist |
不做
- ❌ 不自造 loop (用 Codex Goals)
- ❌ 不替代单测 (单测在 impl)
- ❌ 不无限循环 (turn 上限护栏必写)
- ❌ Hotfix/Bugfix/Quick 不强制
- ❌ reflect 不发散新需求
例外
- 纯库/纯算法 (无接口无 UI): 降级为"真实数据跑示例 + 边界", 不强求起服务
_index.skip_runtime_verify = true: 跳过 (不推荐 System/Refactor 跳)