【検証レポート】Codex × AGENT.md × Amplify Gen2
1. はじめに(この記事で伝えたいこと)
AI コーディング支援(Codex / Copilot / Cursor など)は
コードを書く能力そのものは非常に高い一方で、以下のような問題が起きがちです。
- 仕様を勝手に変える
- 不要な依存を追加する
- 設計や責務が崩れる
- テストやドキュメントが後回しになる
本記事では、
AGENT.md を使って AI の行動を制御し、
実際のアプリ開発を通して「どこまで再現性のある開発ができるか」を検証する
という目的で、
AWS Amplify Gen2 + Vite + React + TypeScript を用いて、ChatGPTと一緒に食事管理アプリ(Meal Tracker)を Sprint 形式 で構築・検証した記録をまとめます。
2. 検証のゴールと評価観点
以下の 5 点を、机上ではなく 実装ベース で検証しました。
- スマホ対応を前提にレスポンシブ UI を作れるか
- DevSecOps 文脈でテストを同時に作れるか
- Amplify Gen2(同一リポジトリ内 backend / CDK)と整合した構成を保てるか
- 初見の人が理解できる 仕様書・README を作れるか
- Atomic Design をどこまで守り、再利用性を維持できるか
3. 技術スタック
フロントエンド
- Vite
- React
- TypeScript
テスト
- Node.js 標準
node:test
バックエンド
- AWS Amplify Gen2(同一リポジトリ内で管理)
AI / 開発支援
- Codex(VS Code 拡張)
- AGENT.md(日本語で定義)
4. AGENT.md とは何か(なぜ必要か)
AGENT.md は AI に対する「プロジェクト憲法」 として使いました。
主なルール
- 不要な npm 依存を追加しない
- UI / 仕様を勝手に変更しない
- ロジックは
src/libに集約する - 機能追加時は
docs / READMEを必ず更新する - テストを追加したら
npm testが実行可能な状態にする
ポイント
「お願い」ではなく、
禁止事項・必須条件を明文化することで、AI の暴走を防げた のが最大の効果でした。
5. Sprint 1:初期構築の検証
5.1 目的
- Atomic Design の骨格を作れるか
- モバイルファーストな UI を維持できるか
- docs / README が同時に作られるか
5.2 実装内容
-
Atomic Design 構成
- atoms / molecules / organisms / pages
-
モバイル縦並び → デスクトップ 2 カラム
-
docs
- overview
- requirements
- architecture
-
README
-
プロンプト
目的:
- 食事管理アプリ(Meal Tracker)の初期構築を行う(Vite + React + TypeScript)
- Atomic Design の骨格と docs 雛形を作る
- モバイルファーストで最低限レスポンシブなベースUIを作る
制約:
- AGENT.md を必ず遵守
- 新規npm依存を追加しない(必要なら追加はせず、提案だけする)
- CSSフレームワーク導入など大きな方針変更はしない
- 既存のテンプレートコードの削除・大改造は最小限
作業範囲:
- src/components/{atoms,molecules,organisms,pages}
- src/styles/globals.css
- src/lib/env.ts(雛形だけでOK)
- src/app/App.tsx もしくは src/App.tsx(既存構成に合わせる)
- docs/{overview,requirements,architecture}.md
- README.md
要件:
1) 画面
- Homeページ(Meal Trackerのトップ)を作る
- フォームの見た目だけ先に作る(入力はまだ保存しなくて良い)
- 料理名(テキスト)
- カロリー(数値)
- メモ(テキスト/textarea)
- 追加ボタン
- フォームはスマホ幅(320px)で崩れない縦並び
- 画面幅が広い場合は、フォームと「ダミーの一覧エリア(カード表示の枠だけ)」が2カラムになる
2) Atomic Design
- atoms: Button, Input, Textarea(必要ならLabelも)
- molecules: FormField(label + input + helper/error領域)
- organisms: MealForm(フォームをまとめる)
- pages: HomePage(ページとして組み立てる)
3) CSS(最小)
- globals.css に最小限の共通スタイル(フォント/余白/フォーム部品)
- レスポンシブはメディアクエリ1つでOK
4) docs
- docs/overview.md: アプリ概要(何ができるか、画面構成)
- docs/requirements.md: 要件/非要件(MVP範囲)
- docs/architecture.md: フォルダ構成(Atomic + lib)と、将来 localStorage→Amplify backend移行方針を1段落で
5) README
- 目的、ローカル起動手順、主要ディレクトリ説明を簡潔に書く
出力:
- 追加/変更したファイル一覧と役割を短く説明
- 依存追加が必要だと思った場合は「提案」だけ書く(実行はしない)
5.3 結果と学び
- ✅ ファイル構成・UI・Atomic Design は想定通り
- ⚠️ docs は作られたが、後続 Sprint で更新されない兆候あり
対応策
→ 「機能追加時は docs / README 更新必須」を AGENT.md に追加。
6. Sprint 2:保存・ドメイン・テストの検証
6.1 目的
- localStorage 保存を実装できるか
- ロジックを UI から分離できるか
- テストを同時に生成できるか
6.2 実装内容
-
domain
- バリデーション
- 日別カロリー集計
-
storage
-
MealRepositoryinterface - localStorage 実装
-
-
tests
- domain / repository のユニットテスト
-
プロンプト
目的:
- Meal Tracker のMVPとして「保存(localStorage)→一覧表示→日別合計」を実装する
- 併せてユニットテストを作成する(DevSecOpsの検証)
制約:
- AGENT.mdを必ず遵守
- 新規npm依存を追加しない(必要なら提案に留める)
- Atomic Designを維持する(pagesは組み立て、ロジックはlibへ)
- 既存のUIデザインは大きく変えない(必要最小限の表示追加のみ)
対象:
- src/lib/domain(型・バリデーション・集計)
- src/lib/storage(保存境界:interface + localStorage実装)
- src/components/organisms(MealFormのsubmit処理など最小結線)
- src/components/organisms(MealListなど必要なら追加)
- tests/unit(既存のテスト配置方針に従う)
要件:
- データ: MealRecord { id, eatenAt(ISO日付), name, calories, note? }
- バリデーション: name必須、caloriesは正の整数
- 保存: MealRepository interface を定義し、LocalStorageMealRepository を実装
- 取得: eatenAtの日付で並べ替えて表示(新しい順)
- 集計: 日別合計カロリーを計算する関数を用意して画面に表示
- テスト: バリデーション、集計、Repository(保存→取得)のユニットテストを追加
出力:
- 追加/変更したファイル一覧と役割
- テストが保証する内容を短く説明
- 依存追加が必要だと思った場合は提案のみ(実行しない)
6.3 問題①:npm test が動かない
原因
- Node 標準
node:testを使用していたが -
package.jsonに test script が無かった
対処
{
"scripts": {
"test": "node --test"
}
}
学び
コードが正しくても「運用入口」が無いと DevSecOps 的には失敗
7. Sprint 3:Amplify Gen2 と差し替え設計の検証
7.1 目的
- Backend を同一リポジトリ内に置けるか
- フロントを壊さず差し替え入口を作れるか
- 設計・資料が破綻しないか
7.2 実装内容
-
createMealRepository() -
VITE_MEAL_REPOSITORYで切り替え -
デフォルトは localStorage
-
backend はスタブ
-
docs 更新
- 差し替えキー
- 移行方針
- CLI 手順案
-
README 更新
- MVP 範囲
- テスト実行方法
- ロードマップ
-
プロンプト
目的:
- Amplify Gen2 のバックエンド雛形を amplify/ 配下に追加し、将来 localStorage から移行できる構造を作る
- フロントは壊さず、MealRepository の差し替え入口を追加する
- DevSecOps観点で、差し替え入口のテストと docs 更新も行う
制約:
- AGENT.md を必ず遵守
- 新規npm依存は追加しない(必要なら提案に留める)
- 既存のUI/挙動は変更しない(デフォルトは localStorage のまま)
- Atomic Design 配下(components)は原則触らない(必要なら最小)
作業範囲:
- amplify/ 配下(Amplify Gen2 backend の定義)
- src/lib/storage(Repository差し替え入口の追加)
- src/lib/env.ts(必要なら VITE_* の読み取り補助)
- tests/unit(差し替え入口のテスト)
- docs/architecture.md、docs/requirements.md、docs/overview.md、README.md(更新必須)
要件:
1) Amplify Gen2 backend
- amplify/ 配下に MealRecord 相当のデータモデル(id, eatenAt, name, calories, note)を定義する雛形を追加
- 具体的なCLI実行手順が必要なら docs に「手順案」として記載する(この場でCLIを実行はしない)
2) Repository差し替え入口
- MealRepository interface は維持する
- createMealRepository() を追加し、import.meta.env.VITE_MEAL_REPOSITORY が "backend" の場合のみ BackendMealRepository を返す
- VITE_MEAL_REPOSITORY 未設定の場合は LocalStorageMealRepository を返す(現状維持)
- BackendMealRepository は現時点ではスタブ実装でよい(例: 未実装エラー or ダミー)。ただしUIからは呼ばれないようにする(デフォルトLocal)
3) テスト
- createMealRepository() が未設定時に LocalStorageMealRepository を返すこと
- "backend" 指定時に BackendMealRepository を返すこと
- 既存の node:test 方針を維持し、npm test で実行可能にする(scriptsの整備も含む)
4) docs / README(更新必須)
- docs/architecture.md: local→Amplify移行方針、Repository差し替え点、環境変数(VITE_MEAL_REPOSITORY)を追記
- docs/requirements.md / overview.md: 現状の保存方式(localStorage)と将来移行前提を整理
- README: 現状のMVP範囲、テスト実行方法(npm test)、次にやること(ロードマップ)を追記
出力:
- 追加/変更したファイル一覧と役割
- 依存追加が必要だと思った場合は提案のみ(実行しない)
8. Sprint 3 時点での総合評価
| 観点 | 評価 |
|---|---|
| レスポンシブ | ✅ |
| Atomic Design | ✅ |
| テスト同時作成 | ✅ |
| Docs / README | ✅ |
| Amplify Gen2 整合 | 🟨(設計は合格、実体は次 Sprint) |
9. 検証から得られた知見まとめ
Codex は「設計があると強い」
- AGENT.md があると暴走しない
- 無いと依存追加・過剰リファクタが起きやすい
AI は「運用入口」を作らない
npm test- CI
- README の実行手順
→ 必須として明示しないと抜ける
ドキュメントは「完了条件」に含める
- 「更新する」では弱い
- 「更新されていること」を完了条件にする
Amplify Gen2 は差し替え設計と相性が良い
- Repository パターンが有効
- スタブ → 本実装への移行が安全
10. まとめ
-
AGENT.md は AI 開発における設計ガードレール
-
Sprint 形式で検証すると
- 失敗が早く
- 修正が小さく
- 知見が蓄積される
「AI に全部任せる」のではなく
「AI が守るべきルールを先に作る」ことが重要
参考
今回作成したAGENT.md
# AGENT.md
## 役割
あなたはこのリポジトリのシニアフロントエンド/クラウドエンジニアです。
最小変更・保守性・セキュリティ・テスト容易性・ドキュメント整備を最優先に作業してください。
## 最重要ルール
- 新規npm依存を勝手に追加してはならない(必要なら理由と候補を提案に留める)
- 大規模な方針変更(CSSフレームワーク導入、状態管理導入、アーキ大変更)を勝手に実装してはならない
- 既存ファイルを不必要に書き換えてはならない(差分は最小)
- 変更対象は指示された範囲に限定する
## 技術前提
- Vite + React(TypeScriptを優先)
- 環境変数は import.meta.env を使用し、envアクセスは src/lib/env.ts に集約する
- Amplify Gen2 のバックエンドは amplify/ 配下で管理する(同一リポジトリ)
## セキュリティ/DevSecOps
- シークレット/トークンをハードコードしない
- CIで自動実行される前提(対話入力に依存しない)
- ロジック変更にはテスト(ユニット)を追加/更新する
- テストを追加した場合、npm test で実行できる状態を必ず整える
## Atomic Design
- src/components は atoms/molecules/organisms/pages に従う
- 再利用可能なUIは atoms/molecules に切り出す
## ドキュメント
- docs/ に概要・要件・構成を追加/更新し、初見でも把握できる状態にする
- documentは日本語で記述する
- 機能追加/仕様変更を行った場合、docs/ と README の該当箇所を必ず更新する(更新できない場合は理由を明記する)
## 出力
- 変更点を短く説明し、追加ファイルの役割を列挙する