AIタスク #10494
未完了エピック #10493: [WEBサイト自動販売機] 操作可能MVP:ヒアリングからサイト生成・プレビューまで
[VEND-MVP-00] 正本化・秘密値ローテーション・再現可能ビルド
100%
本文の受入基準を正本とする。試験・Gitコミット・Claude Codeレビューapprove・Redmine証跡が必須。
説明
親Epic: #10493
識別子: VEND-MVP-00
先行: なし
後続: VEND-MVP-01
目的¶
稼働コンテナ、Git正本、Redmine、秘密値管理を一致させ、後続開発を安全に開始できる状態にする。
作業¶
- /root/website-vending-machine配下の未コミット差分を分類
- module-index.json v0.2.0とDockerfile差分を検証し必要分のみコミット
- /root/vend01旧実装の扱いをADRに記録
- 作業中に出力された可能性のあるANTHROPIC/Claude系キーをローテーション
- .env、Nginx、ログ、Git履歴に秘密値が残っていないか検査
- 稼働イメージをGit HEADから再ビルドできることを確認
- DBバックアップ・復元手順を文書化
受入基準¶
- git statusで本プロジェクト担当差分が0
- 稼働コンテナのソースcommitを特定可能
- 旧キー失効、新キー設定、疎通成功
- リポジトリとNginxに平文秘密値なし
- docker compose build/up後に/health、sessions、diagnosisが回帰しない
- ADR、運用手順、試験結果、Gitコミット、Claude CodeレビューapproveをRedmineへ記録
担当想定: Codex実装、Claude Codeセキュリティレビュー
Redmine Admin さんが12日前に更新
- トラッカー を 機能 から AIタスク に変更
- 担当者 を Codex Pool にセット
- 優先度 を 通常 から 高め に変更
- 親チケット を #10493 にセット
- 自動実行 を はい にセット
- acceptance_criteria を更新 (差分)
- assigned_role を worker にセット
- human_gate を いいえ にセット
- chain_root_id を 10493 にセット
- wave_id を vend-mvp-00 にセット
Redmine Admin さんが12日前に更新
PMスコープ整理(2026-07-26): 外部APIキーの失効・再発行は秘密値をAIへ渡さないため#10501へ分離。本チケットでは、未コミット差分の正本化、秘密値参照箇所の安全化・漏えいスキャン(値は表示しない)、再現可能ビルド、旧実装ADR、DBバックアップ/復元手順を担当する。
Redmine Admin さんが12日前に更新
[クロスレビュー] レビュアー種別: claude
VERDICT: needs_revision
以下、指摘事項です(解決策は提示せず、指摘のみ)。
1. 起票意図への回答としての不足¶
秘密値ローテーション範囲と検査範囲の不一致
- 「作業」欄では「作業中に出力された可能性のあるANTHROPIC/Claude系キーをローテーション」とClaude/Anthropic系キーのみに対象を限定している。
- 一方「作業」欄の次項目では「.env、Nginx、ログ、Git履歴に秘密値が残っていないか検査」と、対象を秘密値全般に広げている。
- 受入基準側も「旧キー失効、新キー設定、疎通成功」「リポジトリとNginxに平文秘密値なし」と、こちらも秘密値全般を指しているように読める。
- つまり「ローテーションすべき対象」はClaude系キーに限定されているのに、「検査・除去すべき対象」は秘密値全般になっており、検査でClaude以外の秘密値(DBパスワード、他API키等)が見つかった場合にそれをローテーションまで行うのか、検査・除去のみで良いのかがチケット本文からは判断できない。担当者が独自解釈で範囲を狭める/広げるリスクがある。
2. 誤解・見落としの懸念¶
human_gate設定と作業内容のリスクレベルの不整合
- cf18(human_gate)=0、cf19(gate_type)=空のため、このチケットは自律連鎖で自動closeされる設定になっている。
- しかし本チケットの受入基準には「docker compose build/up後に/health、sessions、diagnosisが回帰しないこと」という、稼働環境に対する最終検証(起票ルール7章でいう「最終試験」に相当しうる内容)が含まれている。加えて秘密値ローテーションという本番環境に直接影響する作業を含む。
- 起票ルール7章では「最終試験(受け入れ前の最終検証)」を人間ゲート必須カテゴリの一つとして明示しているが、本チケットはgate_typeが未設定のまま自律連鎖に委ねられている。この判断(人間ゲート不要とする判断)が意図的なものか、単なる設定漏れかがチケットから読み取れない。
先行/後続関係が本文記載のみで実関係フィールドと確認できない
- 本文に「先行: なし / 後続: VEND-MVP-01」と記載があるが、起票ルール3章の連鎖機構(precedes/follows)はRedmineの実際の関係フィールドに依存する。本文のプレーンテキスト記載だけでは、VEND-MVP-01側の自動起動条件(全先行がcloseした時)が機能するか判断できない。実際にissue relationとして設定されているかどうかがチケット情報からは確認できない。
VERDICT: needs_revision
Redmine Admin さんが12日前に更新
PM監督ログ: 初回Codexジョブは担当外の/root配下を依存検索し始めたため、秘密値出力前に停止。作業コピーを再初期化し、現在ディレクトリ外の読取・検索を禁止した再実行ジョブ 20260726-150823-6f9f94 を開始。
Redmine Admin さんが12日前に更新
[Claude Codeクロスレビュー] VERDICT: needs_revision
Blocking:
- package-lock.jsonなし+npm installでは間接依存が固定されず、再現可能ビルド未達。package-lock同梱+npm ciが必要。
- composeのenv_file required:falseは.env欠落を黙殺し、秘密値なし起動を許す。fail-fastへ戻す必要あり。
- OPERATIONSの公開URLが実環境と不一致。現行はhealth=/vend/01/api/health、診断=/vend/01/api/api/diagnosis。
Non-blocking: node:20-alpineのdigest未固定、SQLite手順へのcheckpoint補強。
Codexへ最小修正を再委任する。
Redmine Admin さんが12日前に更新
[本番前ビルド検証] needs_revision
commit 6230e1aのDockerfileで COPY server.js db.js prompts.js crawlability.js scoring.js . がclassic Docker builderにより拒否された。
エラー: 複数sourceのCOPY destinationはディレクトリとして末尾/が必要。
初期未コミット差分の./が正しかった。Codex判断とレビュー報告を実ビルドが覆したため、COPY ... ./へ修正して再検証する。稼働中コンテナは停止しておらず影響なし。
Redmine Admin さんが12日前に更新
[PM最終検収 2026-07-27 JST]
Claude Code VERDICT: approve / Blockingなし。
成果:
- commit 6230e1a: 正本ADR、運用手順、ignore、空欄.env.example、module-index v0.2.0、package-lock、npm ci化
- commit 322c79d: classic Docker builder対応(複数source COPY先を ./ へ修正)
- 新image: sha256:56d96f45173aeba1564e9156557b8e7cb22d0e64c68037674bfb8532bc96d149
- 旧imageは vend01-vend01-api:pre-10494 として保全
- DB backup: /root/backup/website-vending-machine/20260727-0037/vend01.db
- backup integrity=ok、SHA256記録済み
- 出所不明のscoring.js並行差分は /root/backup/website-vending-machine/20260727-0034 へ退避し、#10503で検収管理。未レビュー差分は本番へ混入させていない。
回帰:
- container healthy
- 公開health 200
- 既存session GET 200
- 公開diagnosis 200、Claude成功、score保存
- DB integrity ok
- ログ重大エラー0、秘密値パターン0
- project working tree clean
残課題:
- 外部LLMキー失効・再発行はhuman gate #10501
- Gemini Gateway経由化は#10503
- node:20-alpine digest固定はnon-blocking改善項目
本チケットの改訂スコープは完了。
Redmine Admin さんが12日前に更新
- ステータス を 実行中 から 解決 に変更
- 進捗率 を 0 から 100 に変更
PM管理補正: Codex実装・Claude Code approve・本番回帰合格のため解決。