AIタスク #10495
未完了エピック #10493: [WEBサイト自動販売機] 操作可能MVP:ヒアリングからサイト生成・プレビューまで
[VEND-MVP-01] 公開フロント基盤とURL診断画面
100%
本文の受入基準を正本とする。試験・Gitコミット・Claude Codeレビューapprove・Redmine証跡が必須。
説明
親Epic: #10493
識別子: VEND-MVP-01
先行: #10494
後続: VEND-MVP-02
目的¶
現在404の https://html.call2arm.com/vend/01/ に、利用者が操作できるフロント基盤を公開する。
作業¶
- vend01配下に軽量フロントを実装
- サービス説明、URL診断入力、診断中、結果、再診断画面
- /vend/01/api/health と /api/diagnosis 接続
- total_score=null、gate、Claude/Gemini容量制限等の表示分岐
- 連打防止、入力URL検証、タイムアウト・再試行
- 1440/768/390px対応
- Nginx静的配信または同一コンテナ配信をADRで決定
受入基準¶
- /vend/01/ が200で表示
- URL入力から診断結果表示までブラウザで完走
- 正常、クロール不可、LLM失敗、容量制限を適切に表示
- APIキー・内部URLをブラウザへ露出しない
- keyboard操作と主要labelを確認
- 自動試験、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-01 にセット
Redmine Admin さんが12日前に更新
- 期日 を 2026-07-27 にセット
- 開始日 を 2026-07-26 から 2026-07-27 に変更
- 次のチケットに後続 AIタスク #10494: [VEND-MVP-00] 正本化・秘密値ローテーション・再現可能ビルド を追加
Redmine Admin さんが12日前に更新
[クロスレビュー] レビュアー種別: claude
VERDICT: needs_revision
クロスレビュー結果(ticket #10495 [VEND-MVP-01])¶
指摘1: cf3(自動実行フラグ)が空欄 — 起票意図と設定の不整合(重大)¶
本文には「担当想定: Codexフロント実装、Claude Codeレビュー」とあり、cf18(human_gate)=0、cf16に検証可能な受入基準を明記済みで、体裁は自律実行チェーンに乗せる前提で書かれている。しかし cf3 が空欄のままであり、ルール1章5「起動フラグ=自動実行(cf3)が真」を満たしていない。cf16(acceptance_criteria)を書き込んだだけでは実行トリガーにならないことは背景(0章)で明示的に警告されている失敗パターン(#10204と同型)であり、このまま起票すると RedminePoller の is_eligible を通過せず新規のまま拾われない。担当者(bot_user_ids)へのアサインとあわせて cf3 の値が実際に設定されているか要確認。
指摘2: 「Nginx静的配信または同一コンテナ配信をADRで決定」が設計判断だが人間ゲート未設定¶
作業項目に配信方式をADRで決定する旨があるが、これは7章でいう「仕様確定(design_approval)」に該当しうる判断である。にもかかわらず cf19(gate_type)は空欄、cf18=0で人間ゲートが無効になっており、この設計判断が自律実行の中でレビュー待ちなしに確定されてしまう構成になっている。既に親Epic(#10493)や先行(#10494)で配信方式が確定済みでこのチケットは実装のみを行うのであれば問題ないが、そうでなければ、誰が最終的にこの設計判断を承認するのかがチケット上に示されていない。
上記2点は「起票意図に対して正しく答えているか」「回答漏れがないか」という観点での不備であり、担当者による追加要素の是非(gold-plating)には踏み込んでいない。
VERDICT: needs_revision
Redmine Admin さんが12日前に更新
- ステータス を 新規 から 実行中 に変更
[PM実装方針 2026-07-27 JST]
- フロント正本: /root/website-vending-machine/vend01/frontend
- html.call2arm.comの既存静的rootへ /vend/01/ として配置
- 同一origin相対APIを使用し、内部URL・APIキーをブラウザへ露出しない
- backendへ /diagnosis と /diagnosis/:id alias追加。既存 /api/diagnosis は互換維持
- 公開 /vend/01/api/diagnosis と旧 /vend/01/api/api/diagnosis の双方を成立
- 画面: 説明、URL入力、診断中、結果、再診断、正常/クロール不可/LLM障害/容量制限
- 連打防止、URL正規化、timeout、再試行、1440/768/390px、keyboard、label、aria-live
- 外部CDN・外部フォントなし
- Node built-in test、実ブラウザsmoke、Codex実装、Claude Codeレビュー、PM実環境検収
Redmine Admin さんが12日前に更新
- ステータス を 実行中 から 解決 に変更
- 進捗率 を 0 から 100 に変更
[PM最終検収 2026-07-27 JST]
VERDICT: approve / Blockingなし
実装コミット:
- ソース 26de5a0 feat(vend): add public diagnosis frontend
- MIME修正 2eaf954 fix(vend): serve frontend modules as JavaScript
- 静的公開 1e9be4c / MIME修正 150ade2
- API image sha256:bb2e68e31cf30d0374be9d281f21c30e48946d7be3b98c9e2a9dc5a0b2e53df1
- 旧image vend01-vend01-api:pre-10495
公開結果:
- https://html.call2arm.com/vend/01/ = 200
- /styles.css, /app.js, /app-core.js = 200
- JavaScript MIME = application/javascript
- health = 200
- 正規診断URL /vend/01/api/diagnosis = 200、Claude採点成功
- 新GET /vend/01/api/diagnosis/:id と旧互換 /vend/01/api/api/diagnosis/:id の双方200
ブラウザ検収:
- Chromium CDP、390x844 / 768x1024 / 1440x1000
- 全幅でscrollWidth=viewport、横溢れ0
- JavaScript実行、health「API 正常」
- 実フォーム送信→score=5、provider=claude、crawl=取得可能、結果表示完走
- module/MIME/JSエラー0
品質:
- Node試験10件合格
- 構文、bash、diff check合格
- DOM innerHTMLなし、内部URL/APIキー露出なし
- 公開先にtest/package.jsonなし
- DB integrity=ok、ログ重大エラー0、秘密値パターン0
既知の残課題:
本チケットの受入基準を満たしたため解決。