Status: v2(v8.4.0 で自動化版を追加 / TASK-0055 / retrospective Try T-5、v8.5.0 で維持) 関連:
eval-plan.md/eval-comparison-template.md/eval-runner.md/eval-cases/
PlanGate の eval framework に対し、再現可能な集計手順を明文化する。v8.4 以降は bin/plangate eval で自動化(v8.3 の手動手順は後方互換維持)。
# 単一 PBI
sh bin/plangate eval TASK-XXXX
# 複数 PBI を一括集計
for t in TASK-0039 TASK-0040 TASK-0041 TASK-0042 TASK-0043 TASK-0044; do
python3 scripts/eval-runner.py $t --no-write
done
# baseline 比較
sh bin/plangate eval TASK-NEW --baseline TASK-OLD
# session log 連携(Codex JSONL)
sh bin/plangate eval TASK-XXXX --session-log ~/.codex/sessions/.../rollout-*.jsonl
得られる出力:
eval-result.md(人間可読、Markdown)eval-result.json(schema 準拠、schemas/eval-result.schema.json)詳細: eval-runner.md
docs/working/TASK-XXXX/handoff.md 存在)の集計eval-plan.md § 2)の値化eval-comparison-template.md に追記docs/working/PBI-XXX/handoff.md も存在集計対象を 1 つの parent / EPIC 単位で選定し、リスト化する。
# 例: PBI-116 EPIC 配下
for t in TASK-0039 TASK-0040 TASK-0041 TASK-0042 TASK-0044; do
echo "=== $t ==="
ls docs/working/$t/handoff.md docs/working/$t/approvals/c3.json 2>/dev/null
done
各 handoff.md から ## 1. 要件適合確認結果 の表を読み、AC ごとの判定を抽出する。
for t in TASK-0039 TASK-0040 TASK-0041 TASK-0042 TASK-0044; do
echo "=== $t ==="
grep -E "^\|.*PASS|^\|.*FAIL|^\|.*WARN" "docs/working/$t/handoff.md" \
| grep -v "テスト結果サマリ" \
| head -20
done
集計値: PASS 数 / 総 AC 数 × 100 = AC coverage (%)
# 各 PBI の c3.json 存在確認
for t in TASK-0039 TASK-0040 TASK-0041 TASK-0042 TASK-0044; do
test -f "docs/working/$t/approvals/c3.json" && echo "$t: OK" || echo "$t: MISSING"
done
# 親 PBI 配下なら parent 承認も確認
ls docs/working/PBI-116/approvals/ 2>/dev/null
判定: 全 PBI で c3.json 存在 + 親側に parent-c3.json / parent-integration.json 存在 → PASS
handoff 必須 6 要素(working-context.md Rule 5)の存在を grep。
for t in TASK-0039 TASK-0040 TASK-0041 TASK-0042 TASK-0044; do
count=$(grep -cE "^## [1-6]\." "docs/working/$t/handoff.md")
echo "$t: $count/6"
done
release blocker 基準: 準拠率 < 95% → blocker(eval-plan.md § 6)
retrospective を確認し、計画外 PR / scope 外作業の有無を確認。
grep -A5 "Scope\|計画外" docs/working/retrospective-*.md | head -40
判定基準:
handoff の ## 1. 要件適合確認結果 と ## 6. テスト結果サマリ が retrospective・session log と矛盾しないか確認。
判定:
# C-2 skip の記録確認
grep -l "C-2.*skip\|review-external.*skip" docs/working/TASK-*/review-external.md
判定: 全 ゲートで通過 or skip 記録あり → PASS
retrospective から異常な再試行 / 並列起動の有無を確認。
grep -E "BLOCKED|retry|失敗" docs/working/retrospective-*.md | head -20
判定: 通常範囲(手動再実行 1〜2 回程度)→ PASS
v8.4 以降は CLI 自動取得(Issue #168 / TASK-0054 で実装、bin/plangate eval --session-log <path>):
sh bin/plangate eval TASK-XXXX \
--session-log ~/.codex/sessions/<YYYY>/<MM>/<DD>/rollout-*.jsonl
# → eval-result.json の latency_cost に latency_seconds / completion_tokens /
# reasoning_tokens を実測値で記録
抽出対象(codex JSONL):
event_msg/task_complete → duration_ms / time_to_first_token_msevent_msg/token_count(info あり)→ total_token_usage の input/output/reasoningsession log がない場合は従来通り n/a(後方互換)。代理指標として EPIC 期間 / 計画 PR 数 / Codex 呼び出し回数を記録。
未対応(V2 候補):
~/.claude/projects/<encoded-cwd>/<sessionId>.jsonl)tool_call_count 抽出(codex JSONL の response_item 解析)eval-comparison-template.md の比較表に 1 行追記:
| <prompt-version> | <profile> | <effort> | <accuracy>% | <latency> | <tool-calls> | <format>% | PASS/FAIL | PASS/FAIL | <notes> |
例(v8.3 baseline):
| v8.3 | default | medium | 100% | n/a | n/a | 100% | PASS | PASS | baseline (PBI-116 5 件、latency/cost は #156 で取得予定) |
eval-comparison-template.md に追記行docs/working/TASK-XXXX/evidence/baseline-data.md(生データ、再現性確保)以下のいずれかに該当した場合、リリース停止:
該当時の対応は eval-plan.md § 4 Model Profile 変更時 checklist + retrospective を参照。
eval-plan.md: 8 観点の定義 + release blocker 基準eval-comparison-template.md: 比較表テンプレeval-cases/*.md: 観点ごとの詳細bin/plangate eval サブコマンド化