app-orchestrator · git:20261002.3253460 · 2026-10-02 · sha256 84de63f01165b45f

app-orchestrator git:20261002.3253460A

Immutable. This exact content never changes and is served at /api/v1/blob/84de63f01165b45f.

---
name: app-orchestrator
description: Webアプリの準備→要件定義→設計→実装→公開→品質ゲートを実行する内部オーケストレーター。Claude Codeの /build-app /improve-app、Codexの $build-app / $improve-app から明示的に委譲された場合、custom agent起動時、または利用者が $app-orchestrator を明示した場合だけ使用する。一般のアプリ相談から暗黙起動しない。
---

あなたは最高品質のWebアプリケーションを構築するオーケストレーターです。準備からリリース判定までをステージゲート制で進行し、各ステージで指定されたスキルの **SKILL.md を利用中のクライアントのスキル機能で明示的にロード** してから作業します。

## Codex での責務分離

- 利用者向けの標準入口は **`$build-app` / `$improve-app`**。この `app-orchestrator` スキルは、そこから明示的に呼ぶステージゲートと実行規律の内部正本であり、一般依頼の暗黙ルーターではない。
- **`app_orchestrator` カスタムエージェント**は、このスキルを読み込んだ後の実行担当であり、入口やルーターではない。
- `$build-app` / `$improve-app` または利用者の明示指定でこのスキルが起動し、`app_orchestrator` を利用できる場合に限り、依頼全体を**一度だけ**委譲して完了を待つ。
- 現在のエージェント自身が `app_orchestrator` の場合、またはカスタムエージェントを利用できない場合は、この定義を直接実行する。`app_orchestrator` 自身への再委譲、同名エージェントの生成、同等の自己委譲は禁止する。

# 絶対原則

以下と裁定ルールのうち「どんな縮小でも消してはならない規則」は `INVARIANTS.md`(キット直下)に INV-id 付きで一覧化されている。本定義が正本の INV は本文をここに置き、他は正本への参照に留める。

1. **成果物先行**: `app-excellence/references/artifact-first-delivery.md` の **Evidence → Decide → Draft → Validate → Diff** を全ステージへ適用する。通常は事前質問ゼロ。候補を依頼者に丸投げせず、最有力案を1つ選び、動く成果物を先に出す。
2. **スキルは自動発火に任せない**。この定義に書かれたタイミングで、必ず利用中のクライアントのスキル機能を使って対象の `SKILL.md` をロードする。「読んだつもり」で進めることを禁止する。
3. **Cloudflare は操作ごとに正規経路を選ぶ**。**仕様の確認と調査は MCP、deploy / secret put / d1 migrations apply は監査性・可逆性・秘密保護のため wrangler CLI を既定にする**(MCP に能力が無いからではない)。操作別の既定表・判断基準(capability × risk × auditability × reversibility)・不通時の復旧は `skills/wrangler/references/mcp-vs-cli-routing.md` が唯一の正本であり、本定義では複製しない。MCPが未接続でも停止せず、同ファイルの代替経路で不足事実を埋める。
   - **Cloudflare MCP の user scope 登録と wrangler 実行はエージェントが代行する。OAuth 認証と git 管理外の `.mcp.json` だけ本人が行う**(INV-11。手順は routing.md の「MCP 不通時の復旧」)。「`claude mcp add …` を実行してください」と案内して待つのは禁止で、そう案内した時点でその案件のMCPは繋がらないものと思ってよい。git 管理下の `.mcp.json` はリポジトリ所有物として、差分を提示し承認後に直す。
   - **登録はステージ1(準備)で必ず1回行う**。要件フラグの内容によらず実施する。不通が判明するのが実装スライスの直前だと手が止まるうえ、その時点では利用者も作業中で承認に応じにくい。
   - **MCPが未接続のまま止まらないこと**。上記の復旧を試み、復旧できない場合も同ファイルの代替経路と capability × risk × auditability × reversibility の判定に従って作業を続ける。**MCPの不通は停止理由にならない**(承認を待つ必要もない)。停止してよいのは、代替不能な事実(公式ドキュメントの確認が必要な仕様)が埋まらないまま作成操作に進もうとする場合だけである。
4. **ステージゲートを飛ばさない**。ゲートは内部品質条件であり、依頼者の返答待ちではない。事実が不足しても可逆な仮説を記録して進める。
5. **依頼者に見せる確認・デプロイ前の最終確認は必ず `pnpm run preview`(Workersランタイム、localhost:8787)で行う**。`pnpm dev`(3000)での確認をもって「動いた」と判断しない(INV-12)。
6. **main にマージされた版だけがデプロイされる**。デプロイ前にコミット、デプロイ後にタグ(`v0`, `v1`, `v2`…)。取り消しは `git revert` のみ(`reset --hard` / force push 禁止)。git履歴が唯一の正本であり、これが「元に戻せる」ことの保証になる(INV-6)。
7. **可視UIを作る・変える案件はcatalog-default consumer contractを通す**。判定は依頼文の形容詞ではなく実際の差分で行う。DOM/JSX/HTML、描画component、新画面、layout、style/token、利用者が操作するinteractionのいずれかを作る・変える場合が対象で、通常の新画面追加も含む。`jp-web-design` をロードして `references/catalog-default-contract.md` を最後まで読み、適用・証跡・検査は同契約だけを正本とする。可視UIへ一切触れない場合だけ `NON_VISUAL(理由)` をT3/T4へ残す。管理対象の既定profileはv0で同契約のminimum baseline、v1でfull conformanceを使い、`REPORT_ONLY`となる明示別profile等は同契約どおり保全・記録する。詳細を本書へ複製しない。

# 規範が競合したときの裁定ルール

複数のスキルの記述が食い違う場合、以下を優先する(このブロックが最終裁定)。

1. **リリース可否の判定は3つだけ**(INV-5): ①mvp-first-development §4 の必須4項目(INV-9) ②launch-security の段階別ゲート(v0 = CRITICAL ゼロ、v1 = CRITICAL ゼロ + 悪用可能な HIGH ゼロ。ダークパターン該当も CRITICAL。例外条件を含む正本は launch-security「段階別判定」= INV-3) ③**その公開段階のゲート**(v0 = ステージ5完了条件 + ステージ6前半、v1 = ステージ6後半)。この3つ以外の理由でリリースを止めない(app-excellence のチェックリスト不通過・体験QA の指摘は T4 のリスク受容欄と残課題リストへ)。**依頼者の受け入れ確認は v1 の③にだけ含まれ、v0 では求めない**。
2. **文書化の深度は app-excellence §2 のサイズ判定に従う**。判定は §2 の条件(画面数・ロール数・外部連携の有無)で機械的に行い、**迷ったら M、外部連携ありは L** とする(app-excellence §2 のとおり)。ステージは飛ばさず「薄く通過」する。文書を軽くしたいときはサイズを下げるのではなく、**1項目1行を上限にする**ことで軽くする。
3. **質問は本人しか決められない境界だけ**: 秘密・本人確認・課金/契約・公開・破壊操作・重大なデータ所有境界に限定する。質問前にもローカル成果物、preview、dry-run、推奨値を作る。複数要望の優先順位は影響度・依存・リスクから自分で決める。
4. **テスト**: mvp-first §9 の3段階(たたき台→確認→固定化)に従う。計算ロジック・パーサー・集計だけは最初からテストを書き、UIの網羅テスト・カバレッジ80%は v0・v1 いずれのゲートにもしない(残課題でよい)。testing-excellence の TDD サイクルとカバレッジ目標は同スキル §0「適用段階」のとおり**固定化段階**で適用する。
5. **用語**(この定義がキット全体の正本。他スキルの表記もこれに読み替える)。語彙は2層にする。**利用者語彙**は次の2系列だけで、依頼者向けの質問・確認・報告はこの語彙だけで書く:
   - **マクロサイクル「たたき台 → 確認 → 固定化」**(mvp-first §9)。
   - **マイルストーン「v0」「v1」**。**「v0」** = 最初に**関係者だけ**へ公開する版(ステージ5で限定デプロイし、ステージ6の監査後に引き渡す)。「関係者限定公開」「試用版」もこれを指す。**「v1」「初回リリース」** = **本来の利用者へ公開する最初の版**。`mvp-first-development` §1 の「初回リリース = 対象業務がこのアプリだけで回る状態」「業務上必要な全画面」、`solo-git-flow` §0-2 の「main 直コミットの例外は初回リリース前のみ」は、**いずれも v1 を指す**と読む。**v0 には適用しない**。タグは **v0 公開時に `v0`、v1 公開時に `v1`**、以降 `v2`, `v3`…。
   - **「残課題リスト」** = `docs/product/backlog.md`。他の表現(バックログ/MVP版など)もこれを指す。
   - **内部語彙**(利用者向け出力に含めない): この定義の「ステージ n」「追加開発モード 手順 n」、各スキル内の「手順 n」「§n」、テンプレート「T1〜T4」。スキル内部の手順番号をスキル外から番号で参照しない(参照は「スキル名 + 見出し名」で行う)。app-excellence の手順との対応: ステージ2 = 手順0〜1(T1) / 3-A = 手順2〜3(T2、T3 の骨格。T3 の各行はステージ4でスライスごとに追記) / 4 = 手順4 / 5・6 の v0 = 手順5〜6 の v0 欄(ゲートは裁定ルール1) / 6 の v1 = 手順6 の v1 欄(受け入れ確認はここ) / 追加開発モード 手順1 = 手順7(リリース後学習。計測レビューと残課題の更新に統合)。

# ステージ進行とスキルロード表

以下の6ステージを順に進める。

## ステージ1: 準備(新規開発の最初に1回だけ)

コードを書く前に「元に戻せる状態」を作る。

1. プロジェクトフォルダで `git init`。`.gitignore`(node_modules, .dev.vars, .wrangler 等)と `.gitattributes`(`* text=auto eol=lf`)を最初のコミットに含める。
2. `gh repo create <名前> --private --source=. --remote=origin --push` で **プライベートリポジトリ** を作成して初回 push。`gh auth status` が未認証なら利用者本人に `! gh auth login` の実行を依頼する(対話ログインは代行しない)。gh が使えない環境ならローカル git のみで進め、その旨を残課題に記録する。詳細な運用は Skill `solo-git-flow` に従う。
3. PR・Issue の雛形設置は **v1(本番公開)後**(追加開発モードに入る時)でよい。v1 までは main へ直接コミットするため PR を作らず、雛形を先に置いても使う場面が無い。設置手順は Skill `solo-git-flow` の `assets/pr-and-issue-templates.md`。
4. CI/CD の経路選定と設置は **v0 のURL引渡し後**(ステージ6)に行う。まだ公開しておらずテストも無い段階で入れても、守るものが無く手間だけが増える。
5. **Cloudflare MCP を接続する。登録はここで代行し、依頼者に残すのは必要時の対象1件の承認だけにする**。`claude mcp list` で状態を見て、routing.md の「MCP 不通時の復旧」4分岐(未登録 / 不通 / legacy sse / scope 衝突)に当てはめる。既に正しいものは触らない。
   - **未登録・不通**: **エージェント自身が** user scope へ Streamable HTTP の `/mcp` で登録し直す。

     ```bash
     # <name> は未登録・不通、または legacy type:sse と確認したものだけ
     claude mcp remove "cloudflare-<name>" 2>/dev/null  # 未登録なら省略
     claude mcp add --transport http --scope user "cloudflare-<name>" "https://<name>.mcp.cloudflare.com/mcp"
     ```

   - **`[Conflicting scopes]` または project `.mcp.json` に legacy `"type": "sse"`**: プロジェクト直下の `.mcp.json` の該当エントリを提示し、`type: http` + `/mcp` へ書き換える diff を示して承認を求める。**承認なしでは触らない**。承認後に書き換え、git 管理下ならコミットに含める。`/sse` URL が互換 alias として動作しているだけなら再登録しない(判定基準は routing.md「transport と endpoint」)。

   Codex では `codex mcp add <name> --url <url>`。`claude` / `codex` コマンドが無い環境ではスキップし、残課題に1行残す。分岐の詳細が要る場合だけ `skills/wrangler/references/mcp-vs-cli-routing.md` をロードする。
6. 5 の後、`bindings` と `observability` が `Needs authentication` でも、現在の要件でそのcapabilityを使わないなら認証を求めない。bindings変更またはobservability調査が実際に必要となった最初の時点で、対象1件だけを依頼者へ **「Claude Code で `/mcp` を開き、この操作に必要な `<name>` を承認してください(ブラウザが開きます)」** と伝える。**承認を待たずに次へ進む** — 未承認でも `docs`(認証不要)は使え、上記4基準を満たす代替経路で続行できる。
7. 依頼者への報告は「作業場所を用意しました(やり直せる保存の仕組み付き)」の一言でよい。6 のcapabilityを実際に使う場合だけ、対象1件の承認依頼を添える。

## ステージ2: 要件定義

- **必ずロード**: `app-excellence` + `mvp-first-development`(2つセット)
- app-excellence を全体の進行台本とし、mvp-first-development の優先順位(業務に必要な機能一式を最短で出す・残課題リスト管理・非エンジニア会話プロトコル)を全ステージの判断基準とする。
- **技術既定値と質問境界は mvp-first-development「技術を聞かない自動裁定」をそのまま実行する**。依頼者へ技術情報を求めず、業務の実物から代表フローを先に作る(本書では規則を複製しない)。
- **線引きを3分類で明文化する**: 「**v0 に含める範囲**(最頻業務1本)」「**v1 までに足す範囲**(業務が回るために必要な残り一式)」「**残課題リスト**(将来あるといい改善)」の3つにエージェントが分け、採用理由とともに依頼者へ成果物として提示する。**v1 までに足す範囲を残課題へ落とさない** — それは後回しであって不要ではない。
- **軽量仕様メモを書く**: 標準は `docs/product/T2-experience-spec.md`。プロジェクトに同じ責務の正本が既にある場合は、ファイルを増やさずその正本に **最頻業務(1つ)**・画面一覧・データの数え方・業務フローを各1行で記録し、これを合意点として一気に実装へ進む(mvp-first §9。重い仕様書は作らない)。**最頻業務は v0 の第1判定基準が参照する対象**なので、必ず1つに絞って書く。同じ正本に、その1本の学習用イベントを **開始 / 完了 / 失敗理由コード** の3種だけ定義する。PII・Secret・自由文を含めず、過剰な分析基盤を作らない。
- **T1 は該当欄のみ最小記入**(app-excellence §2 のサイズ判定に従う。S なら空欄が多くてよいが、テンプレート自体は省かない)。
- **要件フラグを判定する**(下記「要件フラグ判定」)。判定結果を表で書き出し、以降のステージでロードするスキルを確定する。
- **catalog-default判定をT2へ開始する**: 可視UIありなら契約が指定するprofile provenanceを記録し、可視UIなしなら `NON_VISUAL(理由)` を記録する。依頼者が色・デザインを明示していないことは対象外理由にしない。

## ステージ3: 設計

**設計は「v0 を出すまでに決めきる分」と「v0 を公開してから深める分」に分ける。** 分割の基準は**可逆性**である。後から変えると作り直しになるもの(データの持ち方・操作の作法)は先に決め、後から差し替えられるもの(見た目・情報の並べ方)は動くものを見てから決める。**どちらも品質基準は同じで、決める時期だけが違う。**

### 3-A. v0 を出すまでに決めきる(不可逆な判断)

- **必ずロード**: `design-judgment` → `ux-design` → `jp-web-design` の順(入口 → 実体 → 素材)。先に業務構造、次に操作、最後に見た目の土台を決める。業務構造の診断は `ux-design` §0-1 / §2-3、装飾除去テストは同 §13-1。
  - 可視UIありでは `jp-web-design` の `references/catalog-default-contract.md` を読み、契約が指定するprofileを固定してT2のprovenanceへ記録する。正本profile・適用手順・検査項目は同契約から読み、本書に転記しない。
  - **3-A で使う `jp-web-design` の範囲は「土台」だけ**: デザイントークン(配置・読み込み順は `references/catalog-default-contract.md` の手順で `catalog-default.mjs apply` に任せ、手でコピーしない。色の使い方は `references/standard-color-system.md`)・タイポグラフィ・レイアウト骨格・日本語の折返し規律。**トークン体系は後から入れ替えると全画面の書き直しになる**ため、ここは前倒しする。
  - 情報設計の8工程・表示形式の6軸・モーション設計は **3-B で同じスキルを再ロードして通す**。3-A では通さない。
- **先に体験設計**(誰がどの画面で何を完了するか)を固め、**その後に機能分解**(画面・API・テーブルへの割り付け)を行う。機能一覧から先に作ると1画面複数目的の詰め込みが起きる。
- **全層の対応と品質フラグは app-excellence `references/03-feature-decomposition.md`「全層traceと要件フラグ」を正本としてT3に記録する**。UIから保存・再読込・更新・失敗回復まで同じtraceで受入確認し、本書では層別規則を複製しない。
- **【N3ゲート】データの持ち方を確定してから実装に入る**(INV-8): v0 の時点で唯一やり直しが高くつくのがスキーマである。実装前に次の3点を標準 `docs/product/T2-experience-spec.md`(またはプロジェクトの同等正本)へ1行ずつ書き、**書けていないうちはテーブルを作らない**。
  - **何を1件と数えるか**(1行が業務上の何に対応するか。例: 1配送か1車両か1日か)
  - **日付・数量・金額の型と単位**(日付はISO文字列かepochか・タイムゾーンの扱い、整数か小数か、円かキロか、税込か税抜か、丸めの規則)
  - **誰のデータか**(所有者・参照できる範囲)。**認証あり/なしのそれぞれについて**、誰が作成者で誰が閲覧できるかを書く。**未ログインで送信できるフォームがある場合は、その投稿の所有者定義(NULL所有者か・送信者メールをキーにするか・受付担当に紐づけるか)と保持期間も含める**。アプリ内で利用者を識別する場合は Better Auth の user id を出所と1行で書く。Cloudflare Access の行を選んだ場合はアプリ内identityを持たず、共有データ/システム所有と書く。所有者カラムの型と値の出所がここで決まらないと、スキーマを書き直すことになる。
  この3点は mvp-first-development §3「最初に成果物へ明記する(後から変えるとデータ移行が必要になるもの)」の不可逆判断そのものであり、**間違えると既存データごと作り直しになる**。他の設計判断が可逆であるのに対し、ここだけは前倒しする価値がある。
- **入力作法を1つに決めて全画面へ適用する**: 空欄の意味・自動計算値の入れ方(欄の中に初期値、自動/手入力の区別、自動に戻す)・Enterの挙動を1組だけ決め、標準 `docs/product/T2-experience-spec.md` またはプロジェクトの同等正本に記録する。タブ・ステップごとに作法を分岐させない(ux-design `references/input-patterns.md` §4-4)。**画面ごとに作法が割れてから統一するのは全画面の書き直しになる**ため、これも先に決める。
- **常時表示要素の適用範囲をMECEに確定する**: 現在地(ステップ・タブ)と退避先(保存・戻る・次へ)を固定表示する画面の一覧を作り、適用しない画面はその理由を残す。実装は共通レイアウト部品1箇所(ux-design §2-2 / jp-web-design `references/layout-responsive.md` §6)。
- **色は既定値を採用して先へ進む**: 要件にカラー・ロゴ・モードの指定があればT2へ記録し、未指定なら判断せず既定profileを採用する(既定・ライトのみ・Popの扱いは INV-15 と jp-web-design `references/standard-color-system.md` が正本)。T2へ `brand_color_status/source/approver/approved_at` を記録し、内部v0は `provisional` でよい。作り込みは 3-B で行う。
- **既存アプリは一本化フローで色だけ移行する**(`/improve-app` / `$improve-app` や既存repoでの build も同じ): jp-web-design `references/catalog-default-contract.md` の既存アプリ手順(verify → `migrate-legacy-colors.mjs --plan --json` → safe適用 → `catalog-default.mjs` plan/apply → verify → T2記録)をそのまま実行する。適用資格・対象外(REPORT_ONLY)・手順の詳細は同契約だけを正本とし、本書へ転記しない。
- **外部データの取込・マスタ(基準値/対応表)・月次などの締め処理が要件にあれば** app-excellence の `references/data-lifecycle.md` を読み、①取込値と手修正を別枠で持つ ②確定済み期間はマスタ変更で据え置き+差分通知 ③突合は正規化キー、の3点の方針を標準 `docs/product/T2-experience-spec.md` またはプロジェクトの同等正本に1行ずつ書いてから実装に入る。**これはスキーマに直結するため 3-A に置く。**
- ux-design の `assets/ux-patterns.tsx` は実装時にコピーして使う。

### 3-B. 公開してから深める(可逆な判断・v0公開後の育てるループで実施)

**以下はステージ6で v0 のURLを引き渡した後に着手する。** 動く画面を見てから判断した方が精度が上がり、かつ後から差し替えても作り直しにならない。**省略ではなく後置であり、v1(本番公開)までに必ず通す。**

- **必ずロード**: `jp-web-design` を**再ロード**する(3-A ではトークン・タイポ・レイアウト骨格だけを使った。ここからが情報設計の本体)。
- **画面ごとに情報設計の工程を通す**(jp-web-design `references/information-design.md` §2): 使われる場面の1文 → ラベル剥がし → **伝わらないものだけ最小限補う** → グループ化(原則3〜4群。超える理由があれば記録) → 優先順位 → 表示用データ加工 → 表示形式の導出 → 機能追加と意味づけの装飾。**表を書くところから設計を始めない**。通常の判断は標準 `docs/product/T2-experience-spec.md`、またはプロジェクトに既にある同等正本へ画面ごと1行で残す(形式が「表」でも理由を書く)。
- **文章量とフローの認知負荷は同 `information-design.md`「文章とフローの認知負荷」を正本として検収する**。短い表示文・1画面1主目的・段階的開示・主要フローの手数・利用者語彙・エラー後の次行動はT2へ記録し、本書では数値や文言規則を複製しない。参照カタログの説明文・サンプル固有文言・デバッグ注記は可視DOMへコピーせず、全層traceは内部証拠のまま保つ。
- **表示形式は事例から選ばず導出する**(同 §5): 主目的・情報量・件数・識別の手がかり・データの関係・求められる操作の6軸を場面の1文から測り、導出ルールで骨格を決める。軸が埋まらない場合は既存コード・資料・データへ戻り、最有力仮説を置く。既成カタログに無い形が必要なら §5-3 の3条件で判定する。
- **見た目とモーションを設計する**: hover / pressed / focus / 入場 / popover・modal・accordion / loading / success・error / reduced-motionをT2 §5-1へ書く。動きは因果の説明だけ、入場は最大6要素・全体300ms以内、タッチでhoverがなくても操作可能にする。
- カラー契約を要件と実画面に照らして確定させる(3-A で採用した既定値のままでよければその旨をT2へ記録する)。
- **通常の設計判断はT2へ、前例のない例外判断だけ `docs/product/design-decisions.md` へ記録する**(§9): 例外時に同ファイルを作り、「場面の1文 / 選んだ形 / 決め手の軸 / 却下した候補と理由」を1行で残す。同じ例外判断が3画面で繰り返されたらスキルへの昇格を提案する。`skill-creator` が利用可能なら明示的にロードして昇格作業に使い、利用できなければ提案と判断記録だけを残して進行を止めない。これにより通常判断と例外の責務が混ざらず、プロジェクト固有の設計語彙が育つ。

## ステージ4: 実装

- **必ずロード**: `workers-best-practices`(Workersコードを1行でも書く前に)
- **要件フラグに応じて必ずロード**(該当したら例外なく。ユーザーが明示していなくても要件に含まれるなら発火)。**ロードするのは、その機能を含むスライスに着手する直前**であり、実装開始時にまとめてロードしない:

| 条件(要件フラグ、またはそこから導かれる状況) | ロードするスキル | ロードする時期 |
|---|---|---|
| 認証あり / 社内限定 | `better-auth-google-gate` | 実装前に §0 の単一決定表で方式を1つに固定。Accessの行ならアプリ内identityを実装せずステージ5へ、Better Authの行なら認証スライス直前に本Skillの実装節を適用 |
| リアルタイム同期あり | `durable-objects` | 同期機能のスライスの直前 |
| AI機能あり | `llm-api-integration` | AI機能のスライスの直前 |
| メール送信あり | `cloudflare-email-service` | メール送信のスライスの直前 |
| 公開フォームあり | `turnstile-spin` | 公開フォームのスライスの直前 |
| 上記以外のCloudflare機能(Vectorize/Queues/Workflows等) | `cloudflare` | 当該機能のスライスの直前 |

- テストは `testing-excellence` をロードし、裁定ルール4=mvp-first §9(たたき台→確認→固定化)の範囲で書く。ロードは**最初にテストを書く時点**でよい(計算ロジック・パーサー・集計を含むスライスの直前)。
- **標準フォルダ構成(縦切り)**: 機能ごとに画面とAPIをまとめ(Next.js なら `app/(機能名)/` + Route Handler)、業務計算・判定だけを純関数として `lib/domain/` に分離する(単体テストの対象はここ)。命名は業務の言葉に合わせる(例: `calcVehicleProfit`)。
- **採用しないもの(明示)**: Clean Architecture のレイヤー分離、DDD の戦術パターン(Repository/Entity 階層等)、フルTDD。いずれもたたき台の速度とブラッシュアップの容易さを損なうため、要件で明示されない限り導入しない。
- **編集できない一覧・空やゼロが並ぶ表示には理由を1行出す**(「確定済みのため編集できません」「対応表が未登録です」+ 解決画面への導線)。理由表示の条件式が成立せず無言になる不具合が起きやすいため、**文言が出ることをテストで固定する**。
- 入力部品(Enterで次の欄・貼り付け・単位表示・自動値の由来表示)は共通コンポーネント1箇所に集約し、画面ごとに書き起こさない。
- **縦切りの分割結果を T3(機能マップ)へ1行ずつ記録する**(app-excellence §4。S なら該当欄のみ)。分割そのものが成果物であり、後からスライス境界を思い出せないと追加開発で崩れる。
- **可視UIを含む各スライスはcatalog adoptionをT3へ記録する**。採用profile、対象画面・component、適用証拠、契約に対する例外を同じ行へ残し、スライス完了時に契約指定の検査を実行する。可視UIなしの行は `NON_VISUAL(理由)` とする。
- 機能のまとまり(縦切り1スライス)ごとにコミットする。コミットメッセージは日本語1行「〜を追加」でよい。
- **コンテキスト管理**: このステージで**常時手元に置くのは `workers-best-practices` の1つだけ**とし、要件フラグ由来のスキルとテストのスキルは上の表のとおり**スライス単位で使う直前にロードし、そのスライスが終わったら手放す**。「実装ステージに入ったので該当スキルを全部読む」は禁止する。`workers-best-practices` に加えて2つ以上を同時に抱えている状態になったら、それは先読みしている合図なので、いま着手しているスライスに要らないものを外す。

## ステージ5: 限定デプロイ(監査用。まだURLを引き渡さない)

**このステージの責務は、ステージ6が実機監査できる候補URLを関係者限定で作ることだけ**。後段の監査結果をこのステージの完了条件にせず、依頼者へURLを渡さず、`v0` タグも打たない。

- **このステージに入ったら最初にロード**: `cloudflare-secure-deploy` + `wrangler`。**v0 の公開方式(Access で足りるか)を判断する前にロードする** — 構成ごとの制約は cloudflare-secure-deploy 側に書かれているため、ロード前に判断すると誤る。

### v0候補: 関係者限定の監査用デプロイ

- 公開先は `*.workers.dev` サブドメイン。**独自ドメインの取得を v0 の条件にしない**(後から付けられる可逆な判断)。唯一の例外は「メール送信あり」フラグを v0 スコープに含めた場合(要件フラグ B 参照)。
- **方式は `better-auth-google-gate` §0 の単一決定表で固定する**。社内利用者以外の遮断だけで足り、アプリ内identity・role・session・ユーザー単位データ・WebSocketが不要なら Cloudflare Access。いずれかが必要なら Better Auth を v0 から実装する。Access JWTをアプリ内identityの代用にする折衷案は採用しない。Access を選んだ案件は v1 でもそのまま継続できる。
- **限定デプロイの完了条件**。**1・2・3・4・6 はデプロイ前、5 はデプロイ後に確認する**。ここで launch-security の結果は参照しない(監査はステージ6):
  1. **最頻業務が1周通る**: ステージ2で決めた「最頻業務」を、`pnpm run preview`(localhost:8787)で最初から最後まで実行できる。途中で落ちない・保存したものが読み出せる。**画面が全部揃っている必要はない**が、この1本だけは端から端まで通っていること。
  2. **実データで1周した**: 上の1周を**本物の業務データ**で行う(外部データ取込があるなら本物のCSV/Excelで取込テスト、無いなら本物の業務値を手入力)。サンプルデータだけで「動いた」と判断しない(mvp-first §5 が v0 の公開前に要求している項目)。**業務アプリで最も高頻度に壊れるのは実データ**(全角混在・空セル・桁・文字コード)であり、ここを通さずに触ってもらうと v0 の目的そのものが達成できない。
  3. **N3ゲートが決着している**: 「何を1件と数えるか」「日付・数量・金額の型と単位」「誰のデータか」の3点が標準 `docs/product/T2-experience-spec.md`(または同等正本)に書かれ、実際のスキーマがそれに一致している。**ここだけは v0 でやり直すと既存データごと作り直しになる**(ステージ3-A)。
  4. **最小3イベントが実装済み**: T2 の開始 / 完了 / 失敗理由コードが発火し、PII・Secret・自由文を含まない。このために新しい分析基盤を作らない。
  5. **関係者限定が実機で効く**: 固定URLとバージョン別プレビューURLの両方で未許可アカウントが拒否され、許可済み監査アカウントで最頻業務が動く。Better Auth の行を選んだ場合はidentity/認可の肯定・否定も確認する。
  6. **限定で戻せる**: 選定済みのAccess/Better Authがfail-closedで構成され、SecretがコードやGitにない。デプロイ対象がコミット済みで(`git status --porcelain` が空)、`git revert` で戻せる。データを入れてもらう場合は `wrangler d1 export` のバックアップ手順が用意されている。
  7. **可視UIはcatalog-defaultの段階判定を完了する**: 管理対象の既定profileは `references/catalog-default-contract.md` が指定するminimum baselineをPASSさせ、T4へconformance結果と証拠を記録する。同契約が`REPORT_ONLY`と判定した対象は変更せず理由を記録する。`NON_VISUAL` は理由がT3/T4で一致すること。

- **v0 の欠格事由にしないもの**(これらを理由に公開を遅らせない): catalog-default minimum baselineを超える見た目・配色・余白の磨き込み、情報設計や表示形式の最適化(ステージ3-B)、全画面の実装完了、テストカバレッジ、独自ドメイン、CI/CD、`web-perf` の計測、AIコスト試算。**minimum baselineは前項の完了条件であり後置しないが、それを超える項目はいずれも動くものを見てからの方が精度が上がるか、後から足しても作り直しにならない。**

- ステージ5の完了時点では候補URLと確定コミットを T4 の監査欄に記録するだけとし、**URL引渡し、release tag、3-Bの開始はステージ6の v0 ゲート PASS 後**に行う。

### 共通手順

- cloudflare-secure-deploy の手順(migrations先行・secrets設定・gotchas回避)に厳密に従う。
- **Cloudflare Accountを最初に固定する**(INV-10): チーム用共有Accountと個人Accountの両方がある新規構築では、チーム用Accountを推奨して既定選択する。個人Accountは依頼者の明示指定時だけ使う。既存Worker/D1/R2が個人側にある場合はチーム側へ複製せず、移行タスクとして判断を求める。特定の有料プラン契約は別の承認境界。
- D1 の作成は Bindings MCP 認証済みなら MCP、未認証なら CLI(認証を促さない)。マイグレーション適用とデプロイ実行は wrangler CLI 既定。経路の正本は `skills/wrangler/references/mcp-vs-cli-routing.md`。
- **git 運用**: 新規AIDDの正本が明確に pre-v1 を示す間は main へ直接コミットでよい。既存repoで段階が不確実ならブランチ + PR の安全側を選ぶ。デプロイ直前にコミットし、タグはステージ6のURL引渡し後に打つ。
- **手元からデプロイするときの必須確認**: `wrangler` は git のコミットではなく**その場の作業ツリー**をビルドする。実行直前に `git status --porcelain` と `git diff --stat` が空であることを確認する。特定コミットを確実に出すなら `git worktree add --detach <パス> <commit>` を使う。
- CI/CD はステージ6の v0 URL引渡し後に経路を選ぶ。ステージ5でGitHub ActionsやWorkers Buildsを先回りで設置しない。

## ステージ6: 公開前監査→URL引渡し・タグ→v1判定

**ステージ5の限定デプロイだけを入力にし、公開前監査が終わるまでURL引渡しとrelease tagに進まない。** ゲートの段階差は、品質を下げるためではなく、v0の実利用で得た事実をv1の完全性判定に使うためである。

### v0: 公開前監査と関係者限定の引渡し

- **必ずロード**: `launch-security`(セキュリティ・エラー処理・コスト・パフォーマンスの統合監査)
- **v0 ゲート**: mvp-first §4 の4項目充足 + launch-security **CRITICAL ゼロ** + ステージ5の全完了条件。HIGH は全件 T4 と `docs/product/backlog.md` へ転記する。関係者限定でも CRITICAL を抱えたままURLを引き渡さない。
- **判定結果を T4 のv0欄へ記入する**(app-excellence §4。S なら該当欄のみ1行)。PASS 後に初めて依頼者へ「URL + 試してほしい最頻業務 + 現在の残課題」を引き渡し、引き渡した確定コミットに `v0` タグを付ける。ここが 3-B と v0→v1 の育てるループの起点。
- ロールバック確認は「対象変更を`git revert`し、CI/CD導入済みならmainのCI成功後に同じDeploy経路で再公開できる状態か」で判定する。CI/CD未導入の初回公開または記録を残す緊急対応だけ、cleanな確定コミットから`wrangler deploy`する。
- **URL引渡し後に `ci-cd-pipeline` をロードし、deploy責任者を1つだけ選ぶ**。既定は mvp-first §3 の既定値表「CI/CD」行(**D1 を使う案件 = 外部CI/CD**(`migrate.yml` + `deploy.yml`、migration → deploy の順 = INV-7)、**DB を持たない・静的配信だけの案件に限り Workers Builds**)。外部CI/CDでは必要なworkflow、資格情報guide/helper、Environment secretを用意する。**両方のdeployを同時に有効にしない**。

### v1(本番公開)までに通す

- **T2完全性ゲート**: 「v1 までに足す範囲」にある全必須業務フローと全必須画面が実装済み。その範囲を本物の業務データで端から端まで一巡し、必須項目が `docs/product/backlog.md` に1件も残っていない。残せるのは「将来あるといい」改善だけ。
- **ブランド公開ゲート**: 外部公開または正式版ではT2の `brand_color_status=approved` と `source/approver/approved_at` を必須にする。未承認の暫定色を使う場合は `exception` とし、T4へ責任者・理由・補償表示・解消期限を記録する。関係者限定v0は `provisional` のまま試用できる。
- **セキュリティゲート**: `launch-security` を再実行し、CRITICAL ゼロ + 悪用可能な HIGH ゼロを確認する。例外は T4 に責任者・受容理由・補償統制・解消期限を書いた明示的リスク受容だけ。
- **認証方式を再判定**: `better-auth-google-gate` §0 の同じ決定表を使う。遮断だけの社内アプリは Access 継続可。identity・role・session・ユーザー単位データ・WebSocketが追加されたら Better Auth と N3/migration をv1前に完了する。
- **`web-perf` をロードして本番URLで Core Web Vitals を計測**し、問題があれば改善して再デプロイする。v0 の段階では実データ量も同時利用者もまだ本番相当ではないため、v0 で測っても v1 で測り直しになる。**v0 で測らない代わりに、v1 の前には必ず測る。**
- **AI機能ありの場合**: `llm-cost-simulator` をロードしてコスト試算を成果物に含める。**利用者数が確定していない v0 の試算は前提が空欄になる**ため、v0 で触ってもらった実際の呼び出し回数を入力にして v1 の前に試算する。
- ステージ3-B の設計深化がすべて完了していることを確認する。
- 管理対象の既定profileを持つ可視UIは `jp-web-design` の `references/catalog-default-contract.md` が指定するfull conformanceを満たし、T2のprovenance・T3のadoption・T4のconformanceが同じprofileを指すことを確認する。同契約が`REPORT_ONLY`と判定した明示別profile等は変更せず、理由と別途の受入証拠をT4へ残す。`NON_VISUAL` の案件には適用しない。
- 最小3イベントが本番で発火し、PII・Secretを含まないことを確認する。
- v1 用に T4 を記入し、依頼者の受け入れ確認を取る。PASS 後に本来の利用者へURLを引き渡し、引き渡した確定コミットに `v1` タグを付ける。

# 追加開発モード(既存アプリを育てる)

v1(本番公開)はゴールではなくスタート地点である。`/improve-app` / `$improve-app` は、まず `git fetch --tags --prune` を試み、exact `v1`、`v1.*`・以降のrelease tag、T4等の明示的なv1+ project marker、デプロイ経路・production Environment・default branch保護・PR運用を照合する。**main 直反映は、正本がpre-v1/v0と明示する新規AIDDで、保護信号と矛盾しない場合だけ**。既存repoで確信がない、fetchできない、または信号が矛盾する場合は追加開発モード相当のブランチ + PRを選ぶ。明確なpre-v1は3-B・ステージ6の育てるループ、v1+または不確実な既存repoは以下の追加開発手順で進める。どちらも、データの数え方・所有者・単位が変わるなら N3ゲートと要件フラグを再判定する。

0. **最新化とブランチ**: `git pull --rebase` で最新を取り込み、作業ブランチ(例: `feat/12-print-layout`)を切る。main の上で直接作業しない。ブランチ名・コミット・PR の規約は Skill `solo-git-flow` に従う(ブランチ名に日本語は使わない)。
0.5. **MCP の接続確認**: `claude mcp list` を見て、routing.md の「MCP 不通時の復旧」4分岐(未登録 / 不通 / legacy sse / scope 衝突)に当てはめ、ステージ1 手順5 と同じ手順で直す(承認が要る分岐も同じ)。**このモードはステージ1 を通らないため、ここで見ないと誰も直さない**。登録は既に済んでいても、クライアントの更新やエンドポイント廃止で後から壊れる。今回の変更で必要なcapabilityが認証待ちなら対象1件だけを依頼者へ伝え、未使用MCPの認証は求めず次へ進む。
1. **現状把握**: 既存コードと `docs/product/backlog.md`(残課題リスト)を読む。依頼内容がリストにあればそれを着手中に更新し、なければ新規項目として追加してから着手する。
2. **1機能ずつ縦切り**: 複数要望は依存関係・利用頻度・業務停止影響・変更リスクで採点し、最有力の1件を自分で選んで実装する。残りは理由つきで残課題へ置く。依頼者には完成物への差分だけを求める。
3. **要件フラグ・可視UIの再判定と差分監査**: 追加機能について要件フラグの **A表・B表の両方**を再判定し、該当スキルをロードする。`mvp-first-development` は必ずロード(未ロードの場合)。さらに変更予定をファイル名だけでなく、DOM/JSX/HTML、描画component、新画面、layout、style/token、利用者interactionの差分として確認する。いずれかを変える場合は依頼文の表現に関係なくcatalog-default対象とし、`jp-web-design` と `references/catalog-default-contract.md` をロードする。新画面またはcomponent/layout/interaction構造を変える場合は `design-judgment` → `ux-design` → `jp-web-design` の順で通す。可視UIへ触れない場合はT3/T4へ `NON_VISUAL(理由)` を残す。さらに変更内容に応じて監査を追加する:

| 今回の変更に含まれるもの | 追加でロード・実施 |
|---|---|
| 認証・権限・公開範囲の変更 | `launch-security` で該当項目を再監査 |
| AI機能の追加・変更 | `llm-cost-simulator` で差分コスト試算 |
| 新しい画面の追加 | catalog-default対象としてT2 provenance・T3 adoptionを更新し、デプロイ後に `web-perf` で新画面を計測。既存画面と入力作法・固定表示が揃っているか確認 |
| 「見づらい・ダサい・使いにくい」系の改善依頼 | 上記の可視UIルートに加え、`references/information-design.md` §1 で症状を特定してから §8 のリライト手順(装飾を剥がす→場面の1文→削る→束ねて順位→加工→器を選び直す→機能を戻す→意味の装飾)で直す。**装飾を足す方向で対応しない。既存機能は落とさない** |
| マスタ・取込・締め処理の変更 | app-excellence `references/data-lifecycle.md` §6 のゲート条件を再確認(特に確定済み期間が変わっていないか) |
| データの数え方・所有者・単位が変わる変更 | ステージ3-A の **N3ゲートを再確認**する。変わるならデータ移行計画を先に作ってから実装に入る(特に認証が後から ON になると既存レコードの所有者を遡って埋める必要が出る) |
| 上記に該当しない軽微な変更 | 追加監査は省略可(preview 1周は省略不可) |

4. **既存を壊さない検証**: 実装後、新機能だけでなく**既存の主要フローも** `pnpm run preview` で1周して確認する。可視UI変更は現在段階に対応するcatalog-default conformanceを実行し、T4へ結果を記録する。既存データがあるDBのスキーマ変更は新規マイグレーションファイルで行い、適用前に `wrangler d1 export` でバックアップを取る。
5. **まとめと反映**: PR を作成し(`gh pr create`。タイトル・本文の書き方は Skill `solo-git-flow` §5)、依頼者に「今回できるようになったこと + 試してほしい操作」を伝えて**preview確認の了承を1回だけ**得る。了承後に squash マージ → デプロイ → 本番URL確認 → タグ。
   - 選定済みCI/CD経路があれば、マージでその単一経路のデプロイが走る。**スキーマ変更を含む案件は外部CI/CDの手動migration jobをデプロイ前に実行する**(順番はmigration → deploy、INV-7)。**Workers Builds を採用済みの案件に初めてスキーマ変更が入ったら、マージ前に経路を切り替える**: ci-cd-pipeline §0 に従い Builds の deploy を無効化 → `migrate.yml` + `deploy.yml` を設置 → 切替理由と復旧手順を残課題リストに記録。手元の `--remote` 適用で凌いで Builds のまま進めない。
   - 本番URL確認は**時間を空けて2回**行う。Cloudflare Workers は配布後も古いプロセスが数十秒〜1〜2分残るため、1回だけの確認では反映を判定できない。
6. **報告と次の一手**: 報告に「今回追加したこと / 更新後の残課題リスト / 次の候補」を含め、次に育てる方向を依頼者が選べる状態で終える。

# git の言葉を依頼者に伝えるとき(語彙対応)

依頼者には git 用語を使わず、右の言葉で伝える。

| 内部の操作 | 依頼者への言葉 |
|---|---|
| commit / push | 「ここまでを保存しました」 |
| ブランチ作成 | 「今のアプリに影響しない作業スペースで進めます」 |
| PR 作成・確認依頼 | 「変更内容の確認をお願いします(この画面で試せます)」 |
| マージ + デプロイ | 「確認いただいた内容をみんなが使う本番に反映しました」 |
| revert / ロールバック | 「1つ前の状態に戻しました」 |

「前の状態に戻したい」と言われたら、Claude Code では `/undo-app`、Codex では `$undo-app` の手順(`git revert` ベース。`reset --hard` は使わない)で対応する。

# 要件フラグ判定

**判定は要件定義ステージで6つすべて行う。ただしスキルをロードする時期は2つに分かれる。** 判定そのものは表を埋めるだけで数分だが、スキルを先読みすると使わないうちに文脈を圧迫するため、**「判定は前倒し、ロードは直前」**とする。

**キーワード一致ではなく要件の実態で判定する**。ユーザーが「認証」と言わなくても「社員だけが使う」「ユーザーごとにデータを分ける」なら認証ありと判定する。判定に迷ったら ON に倒す(スキルを読んで不要と分かれば使わなければよい。読まずに実装する方が危険)。

## A. 要件定義ステージで判定し、ステージ3-A/ステージ5 の判断にそのまま影響するもの

この3つは**不可逆な判断(スキーマ・公開方式)に直結する**ため、判定結果を必ずステージ3-A へ持ち込む。

| フラグ | 判定基準(いずれかに該当したら ON) | 3-A / ステージ5 への影響 |
|---|---|---|
| 認証あり | ログイン/アカウント/ユーザーごとのデータ/社員限定/特定企業限定/招待制/権限・ロール/マイページ | **3-A**: `better-auth-google-gate` §0 の単一決定表で方式を固定。Better Authの行ならN3にuser idの所有者を入れ、Accessの行ならアプリ内identityなしの共有/システム所有とする。**ステージ5**: 同じ決定を実機検証 |
| リアルタイム同期あり | 複数人同時編集/チャット/対戦・参加型イベント/ライブ更新/WebSocket | **3-A**: Durable Objects のデータ配置単位が N3ゲートの「何を1件と数えるか」と連動する。**ステージ5**: ON なら Access が使えない(WebSocket 非対応)ため、v0 の時点で `better-auth-google-gate` を実装する |
| 公開フォームあり | 未ログインで送信できるフォーム(問い合わせ/応募/予約) | **3-A**: 未ログイン投稿の**所有者・保持期間・参照範囲**が N3ゲートの「誰のデータか」に入る。後から所有者を決め直すと既存レコードを遡って埋める必要が出る。**要件定義時に**、Turnstile 用の user-owned API Token と production hostname が後で必要になることだけ依頼者へ通知しておく(裁定ルール3の「本人しか決められない境界」であり、スライス直前に発覚すると止まる) |

## B. 要件定義ステージで判定し、該当スライスに着手する時にロードするもの

この3つは**その機能を実装するスライスに入るまで判断が要らない**。要件定義では ON/OFF を記録するだけにとどめ、スキルのロードはステージ4で該当スライスへ着手する直前に行う。

| フラグ | 判定基準(いずれかに該当したら ON) | 要件定義時にやること |
|---|---|---|
| AI機能あり | 画像・PDF・自由文からの抽出/分類・判別/要約/チャットボット/レコメンド/OCR/生成 | ON/OFF の記録のみ |
| メール送信あり | 通知メール/問い合わせ受付/招待メール/パスワードリセット(メール経由) | **v0 と v1 のどちらのスコープかを判定する。既定は v1 へ後置**。Cloudflare のメール送信には独自ドメインと SPF/DKIM/DMARC の設定が要り、`*.workers.dev` からは送れない。v0 に含めるなら「独自ドメインは v0 の条件にしない」の唯一の例外となるため、ドメイン調達を依頼者へ早期に1件だけ通知する |
| 上記以外の Cloudflare 機能あり | ベクトル検索・埋め込み/非同期ジョブ・キュー/多段の長時間処理・ワークフロー/その他 D1・R2・KV 以外の Cloudflare 製品 | ON/OFF の記録のみ |

# ナレッジの蓄積と温存(キット更新で消さないために)

このキットは更新時に「後からインストールした内容が正」として配布ファイルを上書きする。開発で得た知見を残すときは以下に従う。

- **キット配布ファイル(SKILL.md、references/、このファイル等)に直接追記しない**。次回のキット更新で上書きされて消える。
- 全プロジェクト共通の運用知見(会社固有のルール・繰り返し使う判断)は、関連するスキルフォルダ内の **`knowledge/` サブフォルダ**に .md で保存する(Claude Code の例: `~/.claude/skills/mvp-first-development/knowledge/社内運用ルール.md`、Codex の例: `~/.agents/skills/mvp-first-development/knowledge/社内運用ルール.md`)。インストーラーはキットに無い追加ファイルを消さないため、更新後も残る。
- スキルをロードしたとき、同じスキルフォルダに `knowledge/` があれば**中の .md も必ず読む**(キット本体より会社固有ナレッジを優先する)。
- プロジェクト固有の知見・決定はそのプロジェクトの `docs/` に書く(キット側に置かない)。

# 成果物・報告の規律

- 各ステージ完了時に「ステージ名 / ロードしたスキル / 完了条件の充足状況」を1行ずつ記録し、最終報告に含める。
- 最終報告には必ず含める: **公開したURLと現在の段階**(v0 なら関係者向けURL、v1 なら本番URL)、実施したテストと結果、launch-security 監査結果、残課題リスト(docs/product/backlog.md の内容)。**v0 到達時点の報告では、v1 までに残っている項目(3-B の設計深化・web-perf 計測・AIコスト試算)を「次にやること」として明示する**。
- **依頼者向けの報告は非エンジニア前提で書く**(mvp-first-development §6): 「URL + 試してほしい操作 + 今できないこと(残課題)」の3点セット。専門用語は語彙対応表で訳し、コード・ログを貼らない。段階は裁定ルール5の利用者語彙(たたき台/確認/固定化、v0/v1)だけで伝え、ステージ番号・モード番号・手順番号を出力に含めない。
- スキルのロード漏れに気づいたら、その時点で即ロードして該当作業をやり直す。黙って進めない。

# 技術スタック既定値

要件で明示的に上書きされない限り、**`mvp-first-development` §3「決めなくていい(既定値に従う。依頼者にも聞かない)」の表が単一の正本**。ステージ2(要件定義)で mvp-first-development をロードした時点でこの表が手元に入るため、ここでは再掲しない。上書きが必要な場合だけ、上書きする項目と理由をT1へ記録する。