GPT-6 Astra時代のコンテキスト剪定入門——SkillsとAGENTS.mdを軽くする
OpenAI DevelopersのGPT-6 Astra向け指針をもとに、肥大化したSkills、AGENTS.md、プロンプトを棚卸しし、Next.js + Firestore + GitHub Actionsで継続監査する方法を解説します。

はじめに
AIコーディングエージェントを長く使っていると、リポジトリ内の指示がだんだん増えていきます。
| よくある増え方 | 起きる問題 |
|---|---|
AGENTS.md に全体ルールを追記し続ける | 軽い修正でも不要なドキュメントを読ませてしまう |
| Skillsの説明文が長くなる | どのスキルを使うべきかの判断材料が薄まる |
| 「必ず」「毎回」「絶対」を増やす | エージェントが安全な作業でも立ち止まりやすくなる |
| 過去モデル向けの細かい手順を残す | 新しいモデルの判断力をかえって縛る |
2026年9月11日、OpenAI Developersは「Rethinking skills and prompts for GPT-6 Astra」を公開しました。要点は、GPT-6 Astraのような高性能モデルでは、過去に必要だった細かい足場かけをそのまま残すと、コンテキストを圧迫し、作業を遅くし、不要な慎重さを生むことがある、という話です。
また、OpenAI APIのモデルガイドでは、GPT-6 Astraはソフトウェアエンジニアリングや複数ステップの作業に強く、Responses APIでは model に gpt-6-astra を指定すると説明されています。加えて、async tool calling、mid-turn steering、reasoning effortの途中変更なども新しい要素として挙げられています。
本記事では、架空の問い合わせ管理SaaS「HelpDeskHub」を題材に、Next.js + Firestore + GitHub Actionsで、SkillsとAGENTS.mdを継続的に棚卸しする仕組みを作ります。
参考にした一次情報は次の通りです。
何を変えるべきか
今回のテーマは「AI向けの指示をもっと増やす」ではありません。むしろ、指示の読み込み条件を明確にして、不要なものを削ることです。
OpenAI Developersの記事では、スキル説明は短く、いつ使うべきかが分かる形にすること、複数ワークフローを持つスキルはルート文書を薄いルーターにすること、AGENTS.mdでは全タスクに毎回読む資料を積まないことが勧められています。
HelpDeskHubでは、次の3種類に分けて整理します。
| 置き場所 | 役割 | 書きすぎないコツ |
|---|---|---|
AGENTS.md | リポジトリ共通の最低限ルール | 「毎回読む」ではなく「必要な時に参照する」と書く |
docs/ai/*.md | Firestore設計、デプロイ、認可などの詳細 | 見出しと用途を明確にして、参照条件を分ける |
.codex/skills/*/SKILL.md | 特定ワークフローの入口 | 説明文は短く、本文はルーターにする |
| GitHub Issue本文 | 今回だけの要件 | 完了条件と検証コマンドを明示する |
ハンズオン1: AGENTS.mdを条件付きルーターにする
まず、肥大化したAGENTS.mdを短くします。全部を削るのではなく、いつ読むかを決めます。
# AGENTS.md
## Project
HelpDeskHub is a Next.js App Router application using TypeScript,
Tailwind CSS, Firebase Authentication, and Firestore.
## Default Rules
- Prefer Server Components unless client state or browser APIs are required.
- Keep Firestore writes behind Server Actions or trusted server routes.
- Run `yarn build` before publishing user-facing changes.
- Do not use real customer names, tickets, or production data in examples.
## Read When Needed
- Use `docs/ai/firestore-model.md` when changing collections, indexes, or security rules.
- Use `docs/ai/release-flow.md` when editing GitHub Actions or deployment behavior.
- Use `docs/ai/ui-patterns.md` when adding dashboard screens.
ポイントは、docs/ai/firestore-model.md を「必ず最初に読む」と書かないことです。タイポ修正や文言変更では不要だからです。モデルに全部読ませるのではなく、作業内容に応じて探せる地図を渡します。
ハンズオン2: 指示ファイルをFirestoreに棚卸しする
次に、AI向け指示のメタ情報をFirestoreへ保存します。目的は、長すぎる指示、曖昧なトリガー、古いモデル名を見つけることです。
// scripts/audit-ai-instructions.mjs
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
import { join } from "node:path";
import { FieldValue, getFirestore } from "firebase-admin/firestore";
function collectMarkdownFiles(dir) {
if (!existsSync(dir)) return [];
return readdirSync(dir).flatMap((entry) => {
const path = join(dir, entry);
const stat = statSync(path);
if (stat.isDirectory()) {
return collectMarkdownFiles(path);
}
return path.endsWith(".md") ? [path] : [];
});
}
function inspectFile(path) {
const text = readFileSync(path, "utf8");
const lines = text.split("\n");
return {
path,
lineCount: lines.length,
charCount: text.length,
hasAlwaysRead: /always read|必ず.*読む|毎回.*読む/i.test(text),
mentionsModel: /gpt-5|gpt-6|astra|sonnet|opus|codex/i.test(text),
};
}
export async function saveInstructionAudit() {
const db = getFirestore();
const files = [
"AGENTS.md",
...collectMarkdownFiles("docs/ai"),
...collectMarkdownFiles(".codex/skills").filter((path) =>
path.endsWith("SKILL.md"),
),
].filter((path) => existsSync(path));
const records = files.map(inspectFile);
const auditRef = db.collection("aiInstructionAudits").doc();
await auditRef.set({
createdAt: FieldValue.serverTimestamp(),
records,
summary: {
fileCount: records.length,
longFileCount: records.filter((record) => record.lineCount > 120).length,
alwaysReadCount: records.filter((record) => record.hasAlwaysRead).length,
modelMentionCount: records.filter((record) => record.mentionsModel).length,
},
});
}
このスクリプトは、公式に存在しないCLIやAPIに依存しません。Node.jsの標準ライブラリとFirebase Admin SDKだけで、指示ファイルの状態を記録します。
ハンズオン3: Next.jsで監査結果を見る
保存した監査結果は、管理画面で見えるようにします。まずは最新1件を読むServer Componentを作ります。
// src/app/admin/ai-instructions/page.tsx
import { getFirestore } from "firebase-admin/firestore";
type AuditSummary = {
fileCount: number;
longFileCount: number;
alwaysReadCount: number;
modelMentionCount: number;
};
async function getLatestAudit(): Promise<AuditSummary | null> {
const snapshot = await getFirestore()
.collection("aiInstructionAudits")
.orderBy("createdAt", "desc")
.limit(1)
.get();
const doc = snapshot.docs.at(0);
return doc?.data().summary as AuditSummary | null;
}
export default async function AiInstructionsPage() {
const summary = await getLatestAudit();
if (!summary) {
return <p className="text-sm text-slate-500">No audit result yet.</p>;
}
return (
<main className="space-y-6">
<h1 className="text-2xl font-semibold">AI Instruction Audit</h1>
<dl className="grid gap-4 md:grid-cols-4">
<Metric label="Files" value={summary.fileCount} />
<Metric label="Long files" value={summary.longFileCount} />
<Metric label="Always-read hints" value={summary.alwaysReadCount} />
<Metric label="Model mentions" value={summary.modelMentionCount} />
</dl>
</main>
);
}
function Metric({ label, value }: { label: string; value: number }) {
return (
<div className="rounded border border-slate-200 p-4">
<dt className="text-sm text-slate-500">{label}</dt>
<dd className="mt-2 text-3xl font-semibold">{value}</dd>
</div>
);
}
modelMentionCount は悪ではありません。ただし、特定モデル向けに書いた指示は、モデル更新時に棚卸し対象になります。今回のOpenAI Developersの記事がまさにその例で、GPT-6 Astraへ切り替えるなら、GPT-5.6 Sol時代の過剰な補助線を見直す価値があります。
ハンズオン4: GitHub Actionsで週次チェックする
最後に、毎週月曜に監査を走らせます。GitHub ActionsのcronはUTCなので、JSTの月曜朝9時なら日曜深夜の 0 0 * * 1 です。
name: Audit AI Instructions
on:
schedule:
- cron: "0 0 * * 1"
workflow_dispatch:
jobs:
audit:
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "22"
cache: "yarn"
- run: yarn install --frozen-lockfile
- name: Run instruction audit
env:
FIREBASE_SERVICE_ACCOUNT_JSON: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_JSON }}
run: node scripts/audit-ai-instructions.mjs
運用では、いきなり失敗条件を厳しくしすぎないのがおすすめです。まずはFirestoreに記録し、2〜3週間分の推移を見てから、「120行を超えるSKILL.mdはレビュー対象」「必ず読む が増えたらIssueを立てる」のようにチームの基準へ落とします。
Astra向けプロンプトの書き方
GPT-6 Astraの公式ガイドでは、曖昧な部分を文脈で補い、結果に影響する場合は絞った質問をし、途中の要件変更にも追従しやすいことが説明されています。だからこそ、プロンプト側では「全部先回りして縛る」より、「完了条件」と「判断境界」を明確にします。
| 書き方 | 例 |
|---|---|
| 完了条件 | 実装、影響範囲の確認、yarn build まで終えたら完了 |
| 読む条件 | Firestoreスキーマを変える場合だけ docs/ai/firestore-model.md を読む |
| 立ち止まる条件 | 認可、課金、ユーザーデータ削除に関わる変更は事前に確認する |
| 続けてよい条件 | ローカルの型エラーとテスト失敗は、依頼範囲に原因があれば修正して再実行する |
OpenAI APIでAstraを直接使う場合は、公式ガイドにある通りResponses APIの model に gpt-6-astra を指定します。ただし、この記事の監査フロー自体は特定APIに依存しません。まずはリポジトリの指示を軽くするだけでも、Codexや他のエージェントに渡る文脈はかなり整います。
まとめ
GPT-6 Astra時代のAI開発では、「指示を増やす力」だけでなく「指示を剪定する力」が重要になります。
- Skillsの説明は短く、いつ使うかを明確にする
- AGENTS.mdは全ファイルを毎回読ませる場所ではなく、条件付きの地図にする
- 過去モデル向けの過剰な手順や停止条件は、モデル更新時に見直す
- Next.js + Firestore + GitHub Actionsで、AI向け指示の棚卸しを継続運用にする
AIエージェントの精度は、モデル性能だけで決まりません。リポジトリが渡すコンテキストの鮮度と軽さも、同じくらい効きます。次に大きな機能を任せる前に、まずは AGENTS.md とSkillsを一度剪定してみてください。