run-html-1page Pure Python 検証報告
日付: 2026-05-10 Plans.md: Phase 2.5 結論: ✅ 完全 deterministic + sonnet 呼び出し 0 回 を確認
検証目的
Plans.md Phase 2.5 DoD:
任意の md (例: 既存の archive Plans.md) で
/run-html-1pageを 2 回連続実行し、生成 HTML 2 つのdiffが完全に空であることを確認。sonnet 呼び出しが 0 回であることをログで確認
ADR-075 の Pure Python (B 案) 採用後、上記が達成可能であることを実証する。
検証 1: deterministic (diff 空)
異なる md 2 種類について各 2 回ずつ render を実行し、出力 HTML を diff -q で比較。
| 入力 md | style | 1 回目 | 2 回目 | diff 結果 | 行数 |
|---|---|---|---|---|---|
Plans.md.archive-2026-05-09-p-review-2phase.md |
report | OK | OK | ✅ identical | 362 |
reports/run-html-1page-python-spike-2026-05-10.md |
spec | OK | OK | ✅ identical | 481 |
実行コマンド:
bash /Users/i/.claude.harness-v2/skills/run-html-1page/bin/render.sh \
/Users/i/.claude.harness-v2/Plans.md.archive-2026-05-09-p-review-2phase.md \
--style report \
--out /tmp/run-html-test-archive-1.html
# 同コマンドを 2 回目で /tmp/run-html-test-archive-2.html に出力
diff -q /tmp/run-html-test-archive-1.html /tmp/run-html-test-archive-2.html
# (no output) → 完全一致
→ deterministic guarantee 成立。
検証 2: sonnet 呼び出し 0 回
active flow 内に LLM 呼び出しが構造的に存在しないことを grep で確認 (artifact 内の歴史記述は除く)。
| 対象ファイル | パターン | 検出 | 内訳 |
|---|---|---|---|
skills/run-html-1page/operations/workflow.md |
sonnet|Agent |
3 件 | すべて「Architecture 注記」「廃止された旧フロー」節内の歴史記述。active step 4 (bin/render.sh 直起動) には登場せず |
skills/run-html-1page/SKILL.md |
sonnet|Agent |
0 件 | active flow に LLM 呼び出しなし |
skills/run-html-1page/bin/render.py |
anthropic|claude|sonnet|opus|openai|gpt |
0 件 | API client import なし |
→ sonnet/LLM 呼び出し 0 回が構造的に保証されている。
検証 3: 自己完結性 (補足)
html-constraints.md の制約遵守を確認。
| 制約 | 検証 | 結果 |
|---|---|---|
| 外部 CDN ゼロ | `grep -E 'src="https?:// | @import url'` を出力 HTML に対し実行 |
inline <style> のみ |
head に <style> ブロック、外部 link なし |
✅ |
| dark mode 対応 | @media (prefers-color-scheme: dark) の存在 |
✅ CSS 変数 7 種を上書き |
| 印刷フレンドリー | @media print の存在 |
✅ ToC/footer 非表示、pre wrap |
| ToC 自動生成 | h2/h3 から anchor 付き ul を生成 | ✅ archive Plans (8 entries) / spike report (15 entries) で確認 |
結論
Phase 2.5 DoD を全項目クリア:
- ✅ 同 md → 同 HTML (2 種類 × 2 回、両ペア完全一致)
- ✅ sonnet 呼び出し 0 回 (ソース上ゼロ、active flow にも登場なし)
- ✅ html-constraints.md 制約遵守 (外部 CDN なし、dark mode、印刷対応)
Phase 2 (Python 化) は完了。次は Phase 3 (Cloudflare Pages 連携) に進める状態。
Reference
- spike report:
reports/run-html-1page-python-spike-2026-05-10.md(commit 0a5008f) - pivot ADR:
decisions/2026-05-10-run-html-1page-pure-python-pivot.md(ADR-075, commit 4c5df0a) - render.py 実装: commit a047c5e
- workflow.md 書き換え: commit 74b3a57