Study Notes / 2026 ・ No.06

Vibe Coding覚書

大きなシステムで、AGENTS.md の外側に置くもの

公開

この回で答えること

Q1AGENTS.md のほかに、何が要るのか Q2仕様(SPEC)やルール集は、どこに置いて、どう回すのか Q3やや大きなウェブシステムでの、いまのベストプラクティスは

結論を先に言うと、「仕様・規則・検証を、ファイルと仕組みに分けて置く」です

前回は、エージェントに渡す「約束ごと」の AGENTS.md を書きました。
ただ、画面が数十枚あるような業務システムを AI と作るなら、それだけでは足りません。
何をどこに置き、どう進めるのかを、受発注システムを例にまとめます。

一

Vibe Coding の現在地

CORE

「Vibe Coding」は、2025年2月に Andrej Karpathy 氏が名付けた言葉です。元の定義は「雰囲気に身をまかせ、コードが存在することさえ忘れる」書き方で、本人も使い捨ての試作や遊びに向くものとして紹介していました。

1年後の2026年2月、同じ Karpathy 氏は、仕事で使う形に別の名前を付けています。「エージェンティック・エンジニアリング」── コードを自分で書くのは1%で、残りはエージェントに書かせて監督する。「エンジニアリング」と呼ぶのは、そこに技術と専門性があるからだ、という説明です。実務で「Vibe Coding」と言うときは、こちらの意味で使われることも多くなりました。この記事も、その意味で書きます。

監督が要る理由は、データにも出ています。

調査分かったこと
METR
(2025年7月)
経験豊富な OSS 開発者16人のランダム化比較試験で、AI ツールを使うと作業時間が19%長くなった。本人たちは速くなったと感じていた
Veracode
(2026年3月)
150以上のモデルが書いたコードのうち、セキュリティ検査を通ったのは55%。文法的な正しさは95%以上に上がったのに、安全性は2025年からほぼ横ばい。XSS 対策は15%しか通らない

AI は「動くコード」をとても上手に書くようになりました。けれど「正しい仕様どおりか」「安全か」「前に決めたことと矛盾しないか」は、放っておくと保証されません。規模が大きくなるほど、この差が効いてきます。

二

AGENTS.md の外側に要るもの ── Q1 の答え

WHAT

AGENTS.md は「毎回読ませる約束」です。短くしか書けない以上、それ以外は別の場所に置きます。足りないのは大きく三つ。何を作るか(仕様)、どこでどう書くか(分野別のルールと手順書)、そしてできたかを確かめる仕組みです。

置くもの中身例
仕様(spec)機能ごとに、目的・対象外・受け入れ条件specs/012-order-approval/spec.md
計画・タスクどう作るか、どんな順で作るかplan.md、tasks.md
ADR決めたことと、その理由(設計判断の記録)docs/adr/0007-approval-state.md
プロダクトの説明何のためのシステムか、用語集、全体の構成docs/product.md、architecture.md
分野別のルールAPI・画面・DB など、その場所でだけ効く規則.claude/rules/api.md
スキル(手順書)繰り返す作業の手順新機能の始め方、リリース手順
確かめる仕組みテスト、型、lint、E2E、CI、フック保存するたびに lint、PR ごとに CI
外部とのつなぎDB、チケット、ブラウザなどを AI から触るMCP サーバー

ポイントは、読み込まれるタイミングが違うことです。全部を AGENTS.md に詰めると、毎回すべてを読ませることになり、前回の研究のとおり、かえって成績が落ちます。

置いたものが、いつ読み込まれるか

毎回読む AGENTS.md 該当ファイルで ルール:API ルール:DB 必要なときに 仕様・設計・ADR スキル 必ず実行 フック CI・テスト AI への文脈 (お願い) 仕組み (強制)

上の3段は「お願い」で、守られないこともある。下の段だけが、必ず効く

三

仕様駆動という進め方

SDD

いまの主流は仕様駆動開発(Spec-Driven Development)です。コードを書かせる前に、何を作るか(仕様)→ どう作るか(計画)→ 作業の分解(タスク)を文書にし、人が確かめてから実装に入ります。

道具も出そろってきました。代表的な二つを並べます。

GitHub Spec KitKiro(AWS)
形オープンソースの CLI + 各エージェント向けのコマンド。30以上のエージェントで使える(2026年に v1.0)仕様の機能を組み込んだ IDE
作る文書constitution.md(原則)、spec.md、plan.md、tasks.md。必要に応じて research.md・data-model.md・contracts/requirements.md(または bugfix.md)、design.md、tasks.md
置き場所specs/NNN-機能名/.kiro/specs/機能名/
流れconstitution → specify → clarify → plan → tasks → analyze → implement要件から始めるか、設計から始めるかを選べる

名前は違っても、中身はほぼ同じです。仕様・計画・タスクの三つの文書を機能ごとのフォルダに置き、段階ごとに人が確かめる。とくに大事なのは次の二つです。

  • AI に質問させる段階を入れる ── Spec Kit の clarify のように、書きかけの仕様を AI に読ませて「決まっていないこと」を洗い出させます。仕様の穴は、コードになってから見つかるほど高くつきます
  • 仕様は機能ごとに分ける ── Kiro の公式も、1つの巨大な仕様ではなく「認証」「商品一覧」「カート」のように機能ごとに分けるよう勧めています。1つが小さいほど、AI も人も読み切れます

道具を入れなくても、同じ形のフォルダと Markdown を手で作れば、どのエージェントでも同じ進め方ができます。次の章の配置は、道具に依存しない形にしてあります。

四

ファイルの配置 ── Q2 の答え

例として、社内向けの受発注管理システムを考えます。画面は30枚ほど、フロントとAPIとDBがあり、購買・営業・経理が使う、というくらいの規模です。リポジトリはこう分けます。

order-system/ ├─ AGENTS.md ← 全体の約束(100行以内) ├─ CLAUDE.md ← 「@AGENTS.md」の1行だけ ├─ docs/ │ ├─ product.md ← 何のためのシステムか・用語集 │ ├─ architecture.md ← 全体の構成と、層の境界 │ └─ adr/ │ ├─ 0001-use-postgresql.md │ └─ 0007-approval-state.md ├─ specs/ │ ├─ 012-order-approval/ │ │ ├─ spec.md ← 何を・なぜ(受け入れ条件) │ │ ├─ plan.md ← どう作るか │ │ └─ tasks.md ← 作業の分解と進み具合 │ └─ 013-invoice-export/ ├─ .claude/ │ ├─ rules/ │ │ ├─ api.md ← apps/api/ を触るときだけ │ │ ├─ web.md ← apps/web/ を触るときだけ │ │ └─ db.md ← db/ を触るときだけ │ ├─ skills/new-feature/ ← 新機能を仕様から始める手順 │ └─ settings.json ← フック(lint・危ない操作の禁止) ├─ apps/web/ apps/api/ ├─ db/migrations/ └─ tests/e2e/

置き方の原則は五つです。

  • 毎回読むものは薄く、必要なときに読むものは厚く ── AGENTS.md は入口と約束だけ。詳しいことは docs/ と specs/ に置き、AGENTS.md から場所を示します
  • 仕様は機能ごとに番号つきのフォルダ ── 012、013 と番号を振ると、順番と履歴が分かり、ブランチ名や PR とも対応させやすい
  • 決めたことは ADR に、理由と一緒に ── 「なぜ PostgreSQL か」「なぜ承認を状態遷移で持つか」。AI が勝手に設計を変えそうになったとき、根拠として効きます
  • 分野別のルールは、パスで限定する ── API の規則は API を触るときだけ読ませる。毎回読ませない
  • 同じことを二か所に書かない ── ルールから docs を参照する。写すと、片方だけが古くなります

入口になる AGENTS.md は、たとえばこうです。前回の例と違うのは、「仕様がないものは作らない」という進め方そのものを約束にしている点です。

# AGENTS.md — order-system 社内向けの受発注管理システム。用語は docs/product.md の用語集に従う。 ## 進め方 - 新しい機能は、specs/ に仕様フォルダがあるものだけ作る。なければ作らずに相談する - 作業は specs/<番号>/tasks.md の順に、1タスク1コミット - 設計の判断を変えるときは、先に docs/adr/ に ADR を足す ## コマンド - テスト: pnpm test / E2E: pnpm e2e / 型: pnpm typecheck - 完了の条件: この3つがすべて通ること ## 守ること - 本番の DB と本番の環境変数には触らない - 適用済みのマイグレーションは書き換えない。新しいファイルを足す

道具ごとの置き場所の違いは、次のとおりです。

役割Claude CodeCursorKiro
毎回読む約束AGENTS.md(または CLAUDE.md)AGENTS.md、Always のルール.kiro/steering/
分野別のルール.claude/rules/(paths で限定).cursor/rules/(globs で限定)steering の読み込み条件
仕様specs/(形は自由)specs/(形は自由).kiro/specs/機能名/
五

1つの機能を通してみる ── Q3 の例

受発注システムに「発注の承認フロー」を足す場面で、仕様から検証までを通してみます。進め方は6段階で、そのうち3か所で人が承認します。

1つの機能の進め方

STEP 1 仕様を書く spec.md 人が書き、AI が質問 ✓ STEP 2 計画を立てる plan.md・ADR AI が案、人が判断 ✓ STEP 3 タスクに分ける tasks.md AI が分解 STEP 4 実装する 1タスク=1コミット AI、テストと一緒に STEP 5 検証する CI・E2E・レビュー 仕組み+人の目 ✓ STEP 6 仕様を閉じる spec.md を更新 ずれを仕様に戻す 次の機能へ ✓ 人の承認が要る段階(ここを飛ばさない)

段階を飛ばしたくなるのは、たいてい急いでいるとき。そのときほど手戻りが大きい

STEP 1 仕様を書く(spec.md)

目的と受け入れ条件は、人が書きます。業務の事情を知っているのは人だけだからです。書けたら AI に読ませて、「決まっていないことを質問して」と頼みます。

# 012 発注の承認フロー ## 目的 購買担当が作った発注を、金額に応じて上長が承認してから確定できるようにする。 いまは Excel とメールで回していて、承認漏れの発注が月に数件ある。 ## 対象外 - 仕入先への送信(既存の EDI 連携をそのまま使う) - 予算の管理 ## 受け入れ条件 1. 合計が50万円以上の発注で「承認依頼」を押すと、状態は「承認待ち」になり、 部門の上長に通知が届く 2. 50万円未満の発注は、承認依頼なしで「発注確定」にできる 3. 上長が差し戻すときは、理由の入力が必須。状態は「下書き」に戻る 4. 承認待ちの発注は、作成者でも明細を変更できない 5. 状態の変更はすべて、誰が・いつ・何から何へ、を履歴に残す ## 未決事項 - [ ] 上長が不在のときの代理承認は要るか(業務部に確認中)

受け入れ条件は、そのままテストにできる書き方にします。「使いやすく」ではなく「50万円以上なら承認待ちになる」。条件と結果が一文ずつ対応していれば、STEP 5 で AI にも人にも判定できます。

STEP 2 計画を立てる(plan.md と ADR)

計画は AI に書かせ、人が判断します。見るべきは「既存の構成を壊していないか」「決めてあることと矛盾しないか」。状態の持ち方のような後から変えにくい判断は ADR に残します。

# 012 計画 - 状態: 下書き → 承認待ち → 承認済み → 発注確定、差し戻しで下書きへ 状態遷移は orders ドメインの OrderStatus に集める(ADR-0007) - DB: orders に status・approved_by・approved_at を追加、 order_status_logs を新設(マイグレーション1本) - API: POST /orders/{id}/request-approval, /approve, /reject - 画面: 発注詳細にボタン、「承認待ち一覧」を新設 - 通知: 既存の NotificationService(メール)を使う - テスト: 状態遷移の単体テストを先に。E2E は受け入れ条件1〜4

STEP 3 タスクに分ける(tasks.md)

1タスクは1回のやりとりで終わり、終わったと確かめられる大きさにします。テストを書くタスクを実装より前に置くのがコツです。

# 012 タスク - [x] T1 OrderStatus の遷移表の単体テストを書く(受け入れ条件1〜4) - [x] T2 OrderStatus を実装して、T1 を通す - [ ] T3 マイグレーション(status 列・履歴テーブル) - [ ] T4 API 3本と権限チェック(承認は上長ロールだけ) - [ ] T5 画面:詳細のボタン、承認待ち一覧 - [ ] T6 E2E:承認・差し戻し・50万円未満の確定 - [ ] T7 spec.md の未決事項を反映し、docs/architecture.md を更新

STEP 4〜6 実装・検証・仕様を閉じる

  • 実装 ── tasks.md を上から1つずつ。1タスク1コミットにしておくと、おかしくなったときに戻る場所がはっきりします。広く調べる作業(影響範囲の洗い出しなど)はサブエージェントに任せ、本筋の会話を散らかさない
  • 検証 ── 「テスト・型・E2E が通る」を完了の条件にし、CI で必ず回します。人のレビューは差分より先に、受け入れ条件と照らして。権限チェックの漏れや XSS のような安全性は、明示的に見る(第一章の数字のとおり、放っておくと半分近くが素通りします)
  • 仕様を閉じる ── 実装中に決まったこと(代理承認は不要、など)を spec.md に戻して、仕様とコードを一致させて終えます。ずれた仕様は、次の機能で AI を間違った方向に導きます
六

ルールとフック

RULES

分野別のルールは、その場所を触るときだけ読ませるのが基本です。Claude Code なら .claude/rules/ のファイルの先頭に paths を書くと、一致するファイルを読んだときだけ読み込まれます。Cursor の .cursor/rules/ も、globs で同じことができます。

# .claude/rules/api.md --- paths: - "apps/api/**" --- # API のルール - 入力は必ずスキーマで検証する(apps/api/src/schemas/) - エラーは共通の形で返す: { code, message }(docs/architecture.md 参照) - 権限チェックはコントローラでなく usecase 層で行う - 金額は整数(円)で扱う。浮動小数点を使わない - HTML を組み立てて返さない。画面側でエスケープする前提を崩さない

ルールは「お願い」です。必ず守らせたいことは、フックや CI に移します。Claude Code の公式ドキュメントも「『.env を編集しない』と書くのはお願いで、保証ではない。毎回守られるべきならフックにせよ」と書いています。たとえば、ファイルを書き換えるたびに lint を走らせるフックはこうです。

// .claude/settings.json { "hooks": { "PostToolUse": [ { "matcher": "Edit|Write", "hooks": [ { "type": "command", "command": "pnpm lint --silent" } ] } ] } }
こうなったら足すもの
同じ間違いを2回されたAGENTS.md に1行、または分野別のルール
同じ手順を3回説明したスキル(手順書)
毎回必ず起きてほしいフック
絶対に起きてはいけない権限の設定、ブランチ保護、CI
調べものが会話を埋めるサブエージェント

この表は Claude Code 公式の「少しずつ育てる」ための目安をもとにしています。最初から全部そろえる必要はありません。

七

いまのベストプラクティス ── Q3 の答え

BEST

やや大きなウェブシステムを AI と作るときの、2026年9月時点のやり方を10項目にまとめます。共通しているのは、人は「何を作るか」と「できたか」を握り、「どう書くか」を AI に任せるという分担です。

やること
01機能ごとに、仕様から始める。受け入れ条件はテストにできる書き方で
02人の関門を3つ置く。仕様・計画・検証。ここを飛ばさない
03AI に質問させてから計画する。仕様の穴はコードになる前に塞ぐ
04タスクは小さく、検証方法つきで。1タスク1コミット
05テストを先に、少なくとも同時に。「テストが通る」を完了の定義にする
06毎回読むものは薄く。AGENTS.md は入口と約束だけ、分野別の規則はパスで限定
07繰り返す手順はスキルに、必ず守らせることはフック・CI・権限に
08決めたことは ADR に、理由と一緒に
09安全性は明示的に見る。セキュリティの規則をルールに書き、CI に静的解析を入れ、レビューで権限と入出力を確かめる
10仕様とコードのずれを残さない。機能を閉じるときに仕様を更新する

逆に、避けたいことも三つ挙げておきます。

  • 巨大な仕様書を一度に書かせる ── 読み切れない仕様は、誰も確かめていない仕様です
  • AI が書いた文書を読まずにコミットする ── 前回の研究のとおり、自動生成のまま置いた指示はかえって成績を下げます
  • 画面で動いたから完成とする ── 「動く」と「正しい」「安全」は別物です

道具や名前は、これからも変わっていきます。ここで挙げたのは、Spec Kit や Kiro、Claude Code や Cursor の公式ドキュメントに共通している考え方を、道具に依存しない形にまとめたものです。

結 — 一枚まとめ

  1. 「Vibe Coding」は、仕事ではAI に書かせて人が監督する形(Karpathy 氏の言う「エージェンティック・エンジニアリング」)になった。AI のコードは動くが、正しさと安全は放っておくと保証されない。
  2. AGENTS.md の外側に置くのは、仕様(spec・plan・tasks)、ADR、プロダクトの説明、分野別のルール、スキル、確かめる仕組み。読み込まれるタイミングで置き場所を分ける。
  3. 仕様は specs/番号-機能名/ に機能ごと。決めたことは docs/adr/。分野別のルールはパスで限定。
  4. 1つの機能は仕様 → 計画 → タスク → 実装 → 検証 → 仕様を閉じる。仕様・計画・検証で人が承認する。
  5. 必ず守らせたいことは、書くだけでなくフック・CI・権限で止める。安全性は明示的に確かめる。

参考

Vibe Coding覚書 — 全七章 / 2026.09

← 記事一覧へ