テーマはここで変更できます
テーマ
ライトモード
Classic Beige Slate Sakana Botanical Shell White
ダークモード
Carbon Synthwave Hacker Tidal Viper
逆引き

こんなことが起きている → どうするか

題ではなく症状から引きます。「どうするか」の下のリンクで、その打ち手を書いた節へ飛びます。 全記事の目次はこのページの下にあります。

この表は Claude Code(Anthropic のコーディングエージェント)を前提にしています。hook・CLAUDE.md・subagent・auto memory はその機能名です。

スポンサー
こんなことが起きている どうするか
AI がテストを走らせるたび、数万行の出力がコンテキストに流れ込む

テスト実行をラッパースクリプト 1 本に集約し、全出力はログファイルへ落として、AI に返すのは失敗の要約だけにします。

→ 読まなくなったもの 読まない技術 第1回:テスト結果を読まない技術

コンテキスト = context window(AI が 1 回の応答で読む作業記憶(指示ファイル・メモリ・会話・ツール出力の全部)) ラッパー = wrapper script(素のコマンドの代わりに打たせるスクリプト(例: scripts/test.sh)) 件数の行 = fixed-prefix count line ([observed])(固定の接頭辞を付けた件数の行。逐語でコピーさせる)

AI が知見メモを保存するほど、以後の全セッションが読む量が増えていく

メモリへの書き込み直前に走る PreToolUse hook でチェックリストを読ませます。指示ファイル(CLAUDE.md)に置くのは「書く前に読む」の 1 行だけにします。

→ 読まなくなったもの 読まない技術 第2回:メモリを読まない技術

索引 = MEMORY.md(メモリの一覧。毎セッション読まれるのはこれだけ) 常駐 = loaded at session start(セッション開始時に毎回コンテキストへ入るもの(CLAUDE.md・MEMORY.md)) 薄まる / 足すほど薄まる = context rot(コンテキストが長くなるほど 1 行の指示が効かなくなること)

テストは通っているが、それが本当に何かを守っているのか分からない

mutation testing(テストをわざと壊して落ちるか見る手法)の方針を 1 枚のドキュメントにして、テストの点検を依頼するときに読ませます。

→ 読まなくなったもの 読まない技術 第3回:単体テストを読まない技術

変異注入 = mutation testing(わざと壊して検査が落ちるかを見る(手動・抜き取り)) 陽性対照 = positive control(検査が「走ったこと」を確かめる下限の件数) 空回り / 0 件で合格 = vacuous truth(対象が 0 件でも緑になること)

登録したスキルを、AI が使うときと使わないときがある

コマンドは通常のスクリプトのまま置き、誤った呼び出し方を PreToolUse hook で止めて、読むべきドキュメントを案内します。

→ 読まなくなったもの 読まない技術 第4回:スキルを使わない技術

入口 = PreToolUse hook (Bash matcher)(コマンドを実行する前に止める場所) 案内 = hook stderr + exit 2(hook が止めるときに AI へ返す文(読むべきドキュメントを指す)) 用途 / mission = mission(サブエージェントの用途名(プロンプト先頭に書く))

サブエージェントに投げた仕事は、終わるまで何が起きているか見えない

サブエージェントに委譲してよいタスクと、起動前に必要な入力ファイルを YAML で定義し、hook で起動前に検査します。

→ 仕組みは一つ: 第 4 回と同じものを当てるだけ 読まない技術 第5回:サブエージェントの出力だけは読め

サブエージェント = subagent (Agent tool)(親のセッションから起動する別の AI。親の会話を持たない) 会話を引き継がない作業者 = subagent (no parent context)(親の会話を持たないサブエージェント) 契約 = contract (inputs / outputs / acceptance)(サブエージェントへの発注の取り決め(入力・出力・受け入れ条件))

指示ファイルにルールを足すほど、前に足したルールが守られなくなる

「〜しないこと」というルールを 1 件ずつ、違反を検出できる自動テスト(Minitest)に書き換えます。

→ 読まなくなったもの 読まない技術 第6回:ルールを読まない技術

指示ファイル = CLAUDE.md(毎セッション読み込まれるルールの置き場) hook = Claude Code hooks (PreToolUse / PostToolUse / Stop / SubagentStop)(ツール実行の前後などで自動で走るスクリプト) 読んでいなければ動けない = hook contract (proof of reading)(読んだ形跡が無いと起動しない、という hook の条件)

並列で走るセッションが共有するメモリが荒れる。方針を読ませても効かない

同じ方針ファイルを PostToolUse hook へ移し、保存後の差分と一緒に提示します。読ませる内容は変えず、タイミングだけ変えます。

→ 読まなくなったもの 読まない技術 第7回:共有メモリを整理しない技術

索引 = MEMORY.md(メモリの一覧。毎セッション読まれるのはこれだけ) 並列実行 = concurrent test runs(テストの並走(サブエージェントに走らせない理由)) 機構 = hooks / automated tests(AI が読まなくても動く仕組み(hook・自動テスト・ラチェット))

同じ失敗への対処を書いておいても、AI は次にまた同じ失敗をする

リトライ時の方針を数行のファイルにまとめ、失敗を検知した hook から自動で挿入します。

→ 読まなくなったもの 読まない技術 第8回:修正履歴を読まない技術

行動ルール = auto memory (feedback_*)(メモリのうち、行動のルールを書いたもの) 二度目(同じ失敗の二度目で仕組みに格上げする、という線) 格上げ(メモリ → 却下ドキュメント → 自動テスト の三段)

引き継ぎ文と完了報告を読んでも、都合の悪いことが落ちている

完了報告の隣に、git diff --stat などで機械的に取得した数値を毎回並べます。

→ 読まなくなったもの 読まない技術 第9回:引き継ぎを読まない技術

引き継ぎ = handoff(次のセッションに渡す文(セッションは独立で会話を持ち越さない)) 要約 = test summary line (full log in a file)(テストの要約行。全文はログファイル(例: tmp/test_last.log)) 数は落ちない(機械が出した数字は要約で落とさず、そのまま運ぶ)

機械が数えた数字が、報告に着くまでに別の数へ変わっている

数値の行に固定の接頭辞を付け、それが逐語でコピーされているかを hook で検査します。

→ 読まなくなったもの 読まない技術 第10回:AIに要約しろと言わない技術

観測点 / 機械の数字 = machine-counted numbers ([observed] / git diff --stat)(AI の自己申告ではなく、スクリプトが出した数字) 要約 = test summary line (full log in a file)(テストの要約行。全文はログファイル(例: tmp/test_last.log)) 自己申告 / 完了に寄る = self-report (bias toward completion)(AI の完了報告は「終わった」側に寄ること)

作業中の AI に口を挟むと、そのあとの動きが崩れる

作業中に人が口を挟む代わりに、保存直後に方針を返す PostToolUse hook と、失敗を検知して差し戻す hook に介入させます。人は区切りまで待ちます。

→ 言わなくなったもの 読まない技術 第11回:口を挟まない技術

口を挟む = user message during a task(作業中の AI に人が送るメッセージ(直近のものが最優先になる)) 差し込む瞬間 = recency(会話の末尾に近い指示ほど強く効くこと) コンテキスト = context window(AI が 1 回の応答で読む作業記憶(指示ファイル・メモリ・会話・ツール出力の全部))

セッションの終わりに、何を読んで何を読まなくてよいのか決まっていない

成果物も作業ログも読まず、テストやリンターの終了コード(exit code)による合否だけを見ます。

→ 読まなくなったもの 読まない技術 第12回:作業結果を読まない技術

自己申告 / 完了に寄る = self-report (bias toward completion)(AI の完了報告は「終わった」側に寄ること) 観測点 / 機械の数字 = machine-counted numbers ([observed] / git diff --stat)(AI の自己申告ではなく、スクリプトが出した数字) 二値 = exit code (pass / fail)(テストやリンターの終了コードによる合否)

一度断った提案が、次のセッションでまた出てくる

却下した判断を、決まったフォーマットで 1 つのドキュメントに集約します。

→ 説明しなくなったもの AIの意見を聞かない技術 第1回:提案を検討しない技術

却下(却下した判断を記録した 1 つのドキュメント(例: non_goals.md)) 置かなかったものの一覧(却下ドキュメント末尾の「採用しなかった案」の節) 判断のコスト(人が判断する回数のコスト)

禁止の 1 行を書いたのに、拡大解釈も縮小解釈もされる

却下した判断をまとめた 1 つのドキュメント(例: non_goals.md)で、禁止事項ごとに「理由」の見出しを設け、結論と併記します。

→ 思い出さなくなったもの AIの意見を聞かない技術 第2回:禁止を書かない技術

理由(禁止事項ごとの「理由」の節) 適用範囲 / 判定軸(禁止事項ごとの「適用範囲」の節(境界のケースを列挙)) 境界(適用範囲の境界にあるケース)

禁止が正しく書いてあるのに守られない。そのたびに相談が来る

却下ドキュメントの禁止事項ごとに「適用範囲」の見出しを設け、判断に迷う境界のケースを 1 行ずつ列挙します。

→ 相談されなくなったもの AIの意見を聞かない技術 第3回:禁止ルールを作らない技術

解除の条件(禁止を解除してよい条件の節) 迂回路 / 隙間 = gap between goal pressure and spec(禁止をすり抜ける経路(目標と仕様の隙間)) 機械検証 = rule-to-test mapping(ルールごとに、対応する自動テストの有無を書いた対応表)

同じ指示を複数のサブエージェントに配ると、返ってくる形が体ごとに違う

サブエージェントに渡してよいタスクの一覧に、起動前に用意すべき入力ファイルを明記します。

→ 仕組み: 用途カタログに、契約を書く AIの意見を聞かない技術 第4回:サブエージェントの入力だけは、確かめろ

用途カタログ = subagent mission catalog + launch hook(サブエージェントに任せてよい用途の一覧(YAML)と、それ以外の起動を止める hook) 契約 = contract (inputs / outputs / acceptance)(サブエージェントへの発注の取り決め(入力・出力・受け入れ条件)) requires = required input files(起動前に実在していなければならない入力ファイル)

自動テストの無い禁止事項が、書いてあるだけのまま積み上がる

却下ドキュメントの一覧に「機械検証」の見出しを追加し、対応する自動テスト(Minitest)の有無を項目ごとに明示します。

→ 読み直さなくなったもの AIの意見を聞かない技術 第5回:自動テストを書かない技術

機械検証: なし(「機械検証: なし」= 人が見ると決めた項目) 書いてあるだけの禁止(自動テストの無いルール) 毎回わずかに負ける = probabilistic compliance (p^n)(1 回ごとに少しずつ守られなくなる確率の積)

AI の作業が毎回「画面を開いて確認してください」で終わる

Playwright でスモークテストを 1 本用意し、合否は画面の見た目ではなく DB に残ったレコードで判定します。

→ 確認しなくなったもの AIの意見を聞かない技術 第6回:AIの確認依頼を断る技術

目視確認(「画面を開いて確認してください」で終わる締め) 踏んだ人から届く = automatic error report from users(実ユーザーが踏んだエラーが自動で届く仕組み) 最初の 1 人(最初にそのエラーを踏んだ 1 人)

AI が少しズレたことを言うたび、こちらが説明して直している

ズレを人が説明して直す代わりに、指摘を hook の stderr(exit 2)と自動テストの失敗メッセージに書き、AI に届く経路をそちらに揃えます。

→ 指摘しなくなったもの AIの意見を聞かない技術 第7回:AIの話を聞かない技術

差し戻し = SendMessage (retry)(起動済みのサブエージェントに続きを頼むこと(リトライ)) 判断のコスト(人が判断する回数のコスト) 出来事と判断(出来事(メモリ)と判断(却下ドキュメント)を分けて置くこと)

断った判断の一覧が増え続けて、いつか読まれなくなりそう

却下ドキュメントの末尾に「採用しなかった案」の節を設け、却下した提案はそこへ記録します。

→ 整理しなくなったもの AIの意見を聞かない技術 第8回:ルールを整理しない技術

索引 = MEMORY.md(メモリの一覧。毎セッション読まれるのはこれだけ) 働いている重複(ルールと検査を対応表で紐づけ、重複を「働いている」ものにする) 薄まる / 足すほど薄まる = context rot(コンテキストが長くなるほど 1 行の指示が効かなくなること)

指示ファイルの「必ず実行してください」が、減らないまま残っている

指示ファイルが「必ず実行」と書いているコマンドが pre-commit hook にも存在するかを、突き合わせる自動テストで検証します。

→ 頼まなくなったもの 言わない技術 第1回:検証を指示しない技術

指示ファイル = CLAUDE.md(毎セッション読み込まれるルールの置き場) 自動テスト = Minitest(test/reference/*_test.rb のように、ルールを機械で確かめるテスト) 機構 = hooks / automated tests(AI が読まなくても動く仕組み(hook・自動テスト・ラチェット))

やり方まで書いて渡しているのに、そのとおりには直ってこない

手順を指示する代わりに、サブエージェントの起動前に存在していなければならない入力ファイルを、用途ごとに定義します。

→ 書かなくなったもの 言わない技術 第2回:具体的な指示を出さない技術

手引き = per-mission guide document(用途ごとの手引き(1 枚のドキュメント)) 前提 = presupposition(質問に埋め込まれた前提(AI はそれを疑わない)) 丸投げ = launch without a contract(契約の無い起動)

不具合を伝えるのに、毎回こちらが手順と症状を書き起こしている

不具合報告フォームを設置し、人が入力するのは症状の一文だけにして、URL・操作履歴・ブラウザ情報は JavaScript で自動収集します。

→ 書かなくなったもの 言わない技術 第3回:不具合詳細を書かない技術

不具合報告のフォーム = bug report form (JS collects URL / actions / browser)(人は症状の一文だけ、URL・操作履歴・ブラウザ情報は JavaScript が集める) 症状の一文(人が書くのは症状の一文だけ) 事実(機械が集めた事実(URL・操作履歴・ブラウザ情報))

「まず計画を出して」と打つ手間が、毎回かかっている

新たな実装は不要です。設計ドキュメントを 1 本置けば、AI は既存のドキュメントを読んで同じ体裁を踏襲します。

→ 要求しなくなったもの 言わない技術 第4回:計画を書けと言わない技術

計画書(設計ドキュメント(docs/plan/*.md)) 判断待ち(計画書に置いた、人の判断を待つ項目) 前例(リポジトリにある現物(AI はこれに倣う))

守ってほしい行ほど強く書いているのに、効いているか分からない

効果測定はやめて、指示ファイル内の強調表現を含む行数を数え、基準値を超えたら失敗する自動テスト(ratchet)を置きます。

→ 押さなくなったもの 言わない技術 第5回:念を押さない技術

強調 = emphasis count in CLAUDE.md(指示ファイルの強調表現(** / ⚠️ / 必ず)の行数) 追従 = sycophancy(人の言い方に合わせて答えを変えること) 走査 = Dir.glob scan(実物のファイルを列挙して確かめる型のテスト)

サブエージェントの成果物が、こちらの想定と違う形で返ってくる

サブエージェントの用途ごとに、成果物の受け入れ条件(ファイル名・形式・必須項目)を 1 枚のドキュメントに定義します。

→ 仕組み: 完了の形を、1 枚に書き切る 言わない技術 第6回:サブエージェントの出力だけは、細かく指示しろ

サブエージェント = subagent (Agent tool)(親のセッションから起動する別の AI。親の会話を持たない) 契約 = contract (inputs / outputs / acceptance)(サブエージェントへの発注の取り決め(入力・出力・受け入れ条件)) 自己申告 / 完了に寄る = self-report (bias toward completion)(AI の完了報告は「終わった」側に寄ること)

間違いを見つけると「ちゃんと読みましたか」と問い詰めたくなる

問い詰める代わりに、依頼の 2 文目を「〜ではないですか?」の疑問形テンプレートに固定します。

→ 打たなくなったもの 言わない技術 第7回:AI を問い詰めない技術

問い詰め(「ちゃんと読みましたか」型の詰問) 追従 = sycophancy(人の言い方に合わせて答えを変えること) 疑問形(「〜ではないですか?」の疑問形のテンプレート)

返ってきた答えに「そうじゃなくて」と返しても、良くならない

指摘する代わりに、代替案のない禁止事項を PostToolUse hook から保存直後の差分と一緒に提示します。

→ 言わなくなったもの 言わない技術 第8回:AI にダメ出ししない技術

差し戻し = SendMessage (retry)(起動済みのサブエージェントに続きを頼むこと(リトライ)) 名指し + 目印 = guarded_by + marker(ルールがどの検査に守られているかの名指しと、コード側の印) 過剰な反応 / 念押し = over-triggering(強く書いた指示に過剰に反応すること)

AI が、開いていないファイルの中身を開いたかのように話す

参照先の文書とコードの両方に対応する印(marker)を書かせ、印が実在するかを自動テストで検証します。

→ 考えさせなくなったもの 言わない技術 第9回:AI に考えさせない技術

推測 = hallucination(開いていないファイルの中身を話すなどの作り話) 逃げ道 = escape hatch (SKIP_*= / --no-verify)(検査を飛ばせる抜け道。AI も使う) 目印 = marker(参照した証拠としてコードや文書に書かせる印の行)

AI から「A と B どちらにしますか」と聞かれ続けて、手が止まる

即答するのをやめ、選択肢の判定が自動テストや hook の側で決まるようにします。

→ 答えなくなったもの 言わない技術 第10回:質問に答えない技術

選択肢 / 二択(AI が出す「A と B どちらにしますか」の二択) 決めていない場所 / 地図(計画書の「判断待ち」の節) 判断待ち(計画書に置いた、人の判断を待つ項目)

AI にレビューをさせているが、何を見ていないのかが分からない

ファイルを走査しているのに件数の下限(assert_operator ... :>=)を持たない自動テストを、外から数える自動テストで検出します。

→ させなくなったもの 言わない技術 第11回:AI にレビューをさせない技術

自動テスト = Minitest(test/reference/*_test.rb のように、ルールを機械で確かめるテスト) 空回り / 0 件で合格 = vacuous truth(対象が 0 件でも緑になること) 走査 = Dir.glob scan(実物のファイルを列挙して確かめる型のテスト)

撮影画像が溜まっていくが、どれが何を確かめた 1 枚か分からない

画面確認の前に「何を検証するか」「なぜ安い手段では済まないか」の 2 問に答えさせ、単体テスト → 結合テスト → E2E の順に安い手段から試す指針を 1 枚置きます。

→ 眺めなくなったもの 確かめない技術 第1回:スクリーンショットを撮らない技術

撮影 = Playwright screenshot(画面の撮影(Playwright)) はしご(安い手段) = verification ladder (unit → integration → E2E)(安い手段から順に試す) 宣言(撮影前の) = verification declaration file + PreToolUse hook(撮影や E2E の前に「何を検証するか」を書くファイル(例: tmp/visual_verification.md)。無ければ hook が止める)

書かせる工程を置いたのに、書かずに走った実行の数を数えられない

撮影や E2E の前に「何を検証するか」を書く宣言ファイル(例: tmp/visual_verification.md)を置き、その存在を PreToolUse hook の実行条件にして、無ければ撮影や E2E が起動しないようにします。

→ 読まなくなったもの 確かめない技術 第2回:宣言を信じない技術

宣言(撮影前の) = verification declaration file + PreToolUse hook(撮影や E2E の前に「何を検証するか」を書くファイル(例: tmp/visual_verification.md)。無ければ hook が止める) hook = Claude Code hooks (PreToolUse / PostToolUse / Stop / SubagentStop)(ツール実行の前後などで自動で走るスクリプト) 入口 = PreToolUse hook (Bash matcher)(コマンドを実行する前に止める場所)

コードを変えていないのに同じテストが走り、そのぶん待たされる

テストのラッパースクリプトに --last オプションを追加し、前回のログを再表示して再実行を不要にします。

→ 待たなくなったもの 確かめない技術 第3回:テストを再実行しない技術

--last = --last (replay the previous result)(ラッパーの、前回の結果を再表示するオプション) 鮮度 = mtime check(ファイルの更新時刻で「今回のものか」を判定すること) 高くつく入口 = expensive entry point (screenshot / E2E / production)(間違えると高くつく操作(撮影・E2E・本番)の入口)

何も壊していないのに、見覚えのないエラーがずらりと並ぶ

テストのラッパースクリプトで排他ロック(mkdir の原子性を利用)を取り、取得できなければ実行しないようにします。

→ 生まれなくなったもの 確かめない技術 第4回:偽の失敗を読まない技術

偽の失敗 = flaky failure(壊していないのに落ちる失敗) ロック = mkdir lock(mkdir の原子性を使った排他ロック) 並列実行 = concurrent test runs(テストの並走(サブエージェントに走らせない理由))

「テストは通っています」の報告に、走らなかったぶんが書かれていない

重い E2E に領域名のタグを付けて既定では skip し、実行しなかった領域の一覧を毎回出力します。

→ 走らせなくなったもの 確かめない技術 第5回:全部走らせない技術

領域 = E2E area (E2E=<area>)(E2E テストの領域名。1 領域ずつ走らせる) 走らせていない領域の一覧 = skipped-area count line(走らせなかった E2E 領域の一覧(毎回出す)) 合否 = pass / fail by DB record(スモークテストの合否。画面の見た目ではなく DB のレコードで判定)

進め方を指定した指示が、守られたのかどうか後から見分けられない

手順を守らせたいときは指示の書き方を強めず、その手順を踏んだ痕跡が成果物として残る形に変更します(例: 開いたファイルごとに 1 行出力させる)。

→ 書き直さなくなったもの 動かさない技術 第1回:手順を守らせない技術

追従 = sycophancy(人の言い方に合わせて答えを変えること) 形跡 / 生成物 = file existence check(手順を踏んだ証拠として残るファイル(在るかだけを見る)) 手数 = tool_use count(ツール呼び出しの回数)

置いたラッパーが、途中から素のコマンドに戻されている

ラッパーを使わせたいときは指示を強めず、素のコマンドへ戻る必要が残っていないか(ラッパーの機能が不足していないか)を確認します。

→ 書き直さなくなったもの 動かさない技術 第2回:ラッパーを使わせない技術

ラッパー = wrapper script(素のコマンドの代わりに打たせるスクリプト(例: scripts/test.sh)) 標準コマンド = the raw command the model defaults to(モデルが既定で打ちたがる素のコマンド(例: bin/rails test)) 止められると探す = workaround after exit 2(hook に止められた直後に別のやり方を探す振る舞い)

同じ問いを何度も投げると答えが毎回違う。まとめると何かが消える

複数の回答を 1 つに集約する前に、指摘の種類ごとの出現数(何件中何件が挙げたか)を出力します。

→ 集めなくなったもの 動かさない技術 第3回:集めない技術

種類の収束(同じ問いを何度も投げると、答えの種類が収束すること) 体 = one subagent run(サブエージェントの 1 起動) 正解表 = answer key(実験で採点に使う正解の表)

「必要なら〜してください」と書いた行が、発火したのか分からない

「必要なら〜してください」という条件付きの指示は書かず、その工程を経ないと次へ進めない hook で強制します。

→ 書かなくなったもの 動かさない技術 第4回:役に立たない技術

機械検証 = rule-to-test mapping(ルールごとに、対応する自動テストの有無を書いた対応表) hook = Claude Code hooks (PreToolUse / PostToolUse / Stop / SubagentStop)(ツール実行の前後などで自動で走るスクリプト) 形跡 / 生成物 = file existence check(手順を踏んだ証拠として残るファイル(在るかだけを見る))

「もう一度考えて」と返すと答えが変わるが、納得したのか分からない

「もう一度考えてください」と差し戻さず、どの前提が誤っているかを具体的に指摘します。

→ 選び直させなくなったもの 動かさない技術 第5回:選び直させない技術

追従 = sycophancy(人の言い方に合わせて答えを変えること) 差し戻し = SendMessage (retry)(起動済みのサブエージェントに続きを頼むこと(リトライ)) 名指し + 目印 = guarded_by + marker(ルールがどの検査に守られているかの名指しと、コード側の印)

「推測するな」と書いたら、AI が何も作らずに帰ってくるようになった

禁止だけを渡さず、「該当しない場合は『該当なし』と出力してください」のように、代わりの出力先を併記します。

→ 塞がなくなったもの 動かさない技術 第6回:逃げ道を塞がない技術

逃げ道 = escape hatch (SKIP_*= / --no-verify)(検査を飛ばせる抜け道。AI も使う) ガードレール = hooks + automated tests + ratchet(hook・自動テスト・ラチェットを合わせた呼び名) 推測 = hallucination(開いていないファイルの中身を話すなどの作り話)

うまくいっている会話を続けていると、確かめる手間が増えていく

タスクの区切りでセッションを終了し、次のタスクは新しいセッションで開始します。

→ 続けなくなったもの 動かさない技術 第7回:セッションを続けない技術

コンテキスト = context window(AI が 1 回の応答で読む作業記憶(指示ファイル・メモリ・会話・ツール出力の全部)) トークン = input / output / cache read tokens(読ませた量・書いた量・使い回した量の単位) 追従 = sycophancy(人の言い方に合わせて答えを変えること)

成果物は全部正しいのに、そこに残らない無駄が積み上がっている

成果物が揃った時点で、作業ログ(transcript)の側をスクリプトで 1 回集計します。

→ 見なくなったもの 動かさない技術 第8回:成果物で判断しない技術

形跡 / 生成物 = file existence check(手順を踏んだ証拠として残るファイル(在るかだけを見る)) 観測点 / 機械の数字 = machine-counted numbers ([observed] / git diff --stat)(AI の自己申告ではなく、スクリプトが出した数字) 走査 = Dir.glob scan(実物のファイルを列挙して確かめる型のテスト)

次の人のために書き残した知見が、実物と食い違って古くなる

知見はドキュメントに書き残さず、自動テストの失敗メッセージや hook の停止メッセージに埋め込んで、必要な瞬間に出力されるようにします。

→ 残さなくなったもの 動かさない技術 第9回:知見を残さない技術

引き継ぎ = handoff(次のセッションに渡す文(セッションは独立で会話を持ち越さない)) 索引 = MEMORY.md(メモリの一覧。毎セッション読まれるのはこれだけ) 鮮度 = mtime check(ファイルの更新時刻で「今回のものか」を判定すること)

原因を掘り続けて、答えが出たあとも読み続けている

作業ログから「何も変えないまま続いた読み取りの連続」を数え、掘り始める前に終わりの条件を 1 行で書きます。

→ 深追いしなくなったもの 追わない技術 第1回:深追いしない技術

観測点 / 機械の数字 = machine-counted numbers ([observed] / git diff --stat)(AI の自己申告ではなく、スクリプトが出した数字) トークン = input / output / cache read tokens(読ませた量・書いた量・使い回した量の単位) 走査 = Dir.glob scan(実物のファイルを列挙して確かめる型のテスト)

単価がいちばん安いモデルを、用途を測らずに既定にしている

同じ課題を安いモデルと高いモデルの両方へ渡し、完了までの手番と、新しく読ませた量・使い回した量(cache read)・書いた量を別々に数えてから決めます。

→ 既定にしなくなったもの 追わない技術 第2回:一番安いモデルを使わない技術

機械検証 = rule-to-test mapping(ルールごとに、対応する自動テストの有無を書いた対応表) 自動テスト = Minitest(test/reference/*_test.rb のように、ルールを機械で確かめるテスト) 観測点 / 機械の数字 = machine-counted numbers ([observed] / git diff --stat)(AI の自己申告ではなく、スクリプトが出した数字)

うまくいかないと、仕組みではなくモデルを上げに行っている

同じ課題を高い側と安い側の両方へ渡し、安い側だけが落ちた箇所を検査にして置きます。

→ 乗り換えなくなったもの 追わない技術 第3回:最新モデルを使わない技術

機械検証 = rule-to-test mapping(ルールごとに、対応する自動テストの有無を書いた対応表) 自動テスト = Minitest(test/reference/*_test.rb のように、ルールを機械で確かめるテスト) 観測点 / 機械の数字 = machine-counted numbers ([observed] / git diff --stat)(AI の自己申告ではなく、スクリプトが出した数字)

本体で終わる調べものを、念のためサブエージェントへ渡している

渡す前に「その前提を親のエージェントがもう持っているか」を見ます。持っているなら親のエージェントで続け、持っていない大量の読み取りだけサブエージェントに渡します。

→ 渡さなくなったもの 追わない技術 第4回:サブエージェントを使わない技術

サブエージェント = subagent (Agent tool)(親のセッションから起動する別の AI。親の会話を持たない) コンテキスト = context window(AI が 1 回の応答で読む作業記憶(指示ファイル・メモリ・会話・ツール出力の全部)) トークン = input / output / cache read tokens(読ませた量・書いた量・使い回した量の単位)

とりあえず 4 つに割って、同時に走らせている

サブエージェント 1 つに渡すのは、1 回の応答で返せる大きさまでにします。費用を決めるのは数ではなく、分割した先の 1 つが親のエージェントと何往復するかです。

→ 割らなくなったもの 追わない技術 第5回:エージェントチームを使わない技術

サブエージェント = subagent (Agent tool)(親のセッションから起動する別の AI。親の会話を持たない) トークン = input / output / cache read tokens(読ませた量・書いた量・使い回した量の単位) 観測点 / 機械の数字 = machine-counted numbers ([observed] / git diff --stat)(AI の自己申告ではなく、スクリプトが出した数字)

作業の途中で「ここも見て」と外から差し込んでいる

作業の区切りまで待ってから、範囲を狭めて追加の依頼を入れます。AI 本人に不足点を聞くときは「足りているなら足りていると書いてください」を必ず添えます。不足点をひねり出さずに済む逃げ道(escape hatch)を用意するためです。

→ 差し込まなくなったもの 追わない技術 第6回:途中でレビューさせない技術

サブエージェント = subagent (Agent tool)(親のセッションから起動する別の AI。親の会話を持たない) 優先順位 / 最優先 = instruction priority (position / recency / system vs user)(複数の指示が競合したとき、どれが勝つかの順) 過剰な反応 / 念押し = over-triggering(強く書いた指示に過剰に反応すること)

どのモデルを使うかを、比べて決めようとしている

モデルを比べ始める前に、その比較が hook や自動テスト何本ぶんの手間かを数えます。書き出せる仕組みのほうが多いなら、比較より先にそれを置きます。

→ 比べなくなったもの 追わない技術 第7回:モデルを選ばない技術

トークン = input / output / cache read tokens(読ませた量・書いた量・使い回した量の単位) 機械検証 = rule-to-test mapping(ルールごとに、対応する自動テストの有無を書いた対応表) 判断のコスト(人が判断する回数のコスト)

「差はありませんでした」で、検証を畳もうとしている

「差はありませんでした」で畳む前に 2 つ数えます。集計から外した結果(失敗したサブエージェントなど)があるなら戻して数え直し、全条件で 0 の項目が半分以上なら課題の言い方を変えて測り直します。

→ 諦めさせなくなったもの 追わない技術 第8回:諦めさせない技術

観測点 / 機械の数字 = machine-counted numbers ([observed] / git diff --stat)(AI の自己申告ではなく、スクリプトが出した数字) 空回り / 0 件で合格 = vacuous truth(対象が 0 件でも緑になること) 判断のコスト(人が判断する回数のコスト)

全記事の目次

連載ごとに、序論から最終回までの並びです。

はじめに —— 3 つの連載を、1 冊に

  1. はじめに —— 3 つの連載を、1 冊に

バイブコーディングにおける読まない技術

  1. 読まない技術 序論 AIの出力を、もうほとんど読んでいない
  2. 読まない技術 第1回 テスト結果を読まない技術
  3. 読まない技術 第2回 メモリを読まない技術
  4. 読まない技術 第3回 単体テストを読まない技術
  5. 読まない技術 第4回 スキルを使わない技術
  6. 読まない技術 第5回 サブエージェントの出力だけは読め
  7. 読まない技術 第6回 ルールを読まない技術
  8. 読まない技術 第7回 共有メモリを整理しない技術
  9. 読まない技術 第8回 修正履歴を読まない技術
  10. 読まない技術 第9回 引き継ぎを読まない技術
  11. 読まない技術 第10回 AIに要約しろと言わない技術
  12. 読まない技術 第11回 口を挟まない技術
  13. 読まない技術 第12回 作業結果を読まない技術
  14. 読まない技術 最終回 AIの出力を、ほとんど読まなくなった

AIの意見を聞かない技術

  1. AIの意見を聞かない技術 序論 断ったはずの提案が、また来る
  2. AIの意見を聞かない技術 第1回 提案を検討しない技術
  3. AIの意見を聞かない技術 第2回 禁止を書かない技術
  4. AIの意見を聞かない技術 第3回 禁止ルールを作らない技術
  5. AIの意見を聞かない技術 第4回 サブエージェントの入力だけは、確かめろ
  6. AIの意見を聞かない技術 第5回 自動テストを書かない技術
  7. AIの意見を聞かない技術 第6回 AIの確認依頼を断る技術
  8. AIの意見を聞かない技術 第7回 AIの話を聞かない技術
  9. AIの意見を聞かない技術 第8回 ルールを整理しない技術
  10. AIの意見を聞かない技術 最終回 選択肢を選ばない技術

言わない技術

  1. 言わない技術 序論 AI に指示することが、ほとんどなくなった
  2. 言わない技術 第1回 検証を指示しない技術
  3. 言わない技術 第2回 具体的な指示を出さない技術
  4. 言わない技術 第3回 不具合詳細を書かない技術
  5. 言わない技術 第4回 計画を書けと言わない技術
  6. 言わない技術 第5回 念を押さない技術
  7. 言わない技術 第6回 サブエージェントの出力だけは、細かく指示しろ
  8. 言わない技術 第7回 AI を問い詰めない技術
  9. 言わない技術 第8回 AI にダメ出ししない技術
  10. 言わない技術 第9回 AI に考えさせない技術
  11. 言わない技術 第10回 質問に答えない技術
  12. 言わない技術 第11回 AI にレビューをさせない技術
  13. 言わない技術 最終回 何もしない技術

付録

  1. あとがき —— 私は、忘れるのが得意です
  2. 付録 A 1 ターンの解剖 —— リクエストに何が載っているか
  3. 付録 B コンテキストの寿命 —— 圧縮・キャッシュ・サブエージェント
  4. 付録 C hook の契約 —— イベント・exit code・JSON
  5. 付録 D 指示ファイル・ルール・メモリ・スキルの読み込み時点
  6. 付録 E サブエージェントの機構と測定法
  7. 付録 F 自動テストの 8 つの型
  8. 付録 G git とプロセスの機構
  9. 付録 H 画面と本番の検証のはしご
  10. 付録 I AI の性質の出典
  11. 付録 J 用語集 —— 連載の造語と技術名称
  12. 結び —— 依存はどこにあるか

はじめに —— 前巻の続きを、もう 1 冊に

  1. はじめに —— 前巻の続きを、もう 1 冊に

確かめない技術

  1. 確かめない技術 序論 AI のいうことを、もう確かめていない
  2. 確かめない技術 第1回 スクリーンショットを撮らない技術
  3. 確かめない技術 第2回 宣言を信じない技術
  4. 確かめない技術 第3回 テストを再実行しない技術
  5. 確かめない技術 第4回 偽の失敗を読まない技術
  6. 確かめない技術 第5回 全部走らせない技術
  7. 確かめない技術 最終回 その場で決めない技術

動かさない技術

  1. 動かさない技術 序論 確かめるために、プロダクトを動かすことがなくなった
  2. 動かさない技術 第1回 手順を守らせない技術
  3. 動かさない技術 第2回 ラッパーを使わせない技術
  4. 動かさない技術 第3回 集めない技術
  5. 動かさない技術 第4回 役に立たない技術
  6. 動かさない技術 第5回 選び直させない技術
  7. 動かさない技術 第6回 逃げ道を塞がない技術
  8. 動かさない技術 第7回 セッションを続けない技術
  9. 動かさない技術 第8回 成果物で判断しない技術
  10. 動かさない技術 第9回 知見を残さない技術
  11. 動かさない技術 最終回 実験しない技術

追わない技術

  1. 追わない技術 序論 新しいモデルが出ても、もう乗り換えていない
  2. 追わない技術 第1回 深追いしない技術
  3. 追わない技術 第2回 一番安いモデルを使わない技術
  4. 追わない技術 第3回 最新モデルを使わない技術
  5. 追わない技術 第4回 サブエージェントを使わない技術
  6. 追わない技術 第5回 エージェントチームを使わない技術
  7. 追わない技術 第6回 途中でレビューさせない技術
  8. 追わない技術 第7回 モデルを選ばない技術
  9. 追わない技術 第8回 諦めさせない技術
  10. 追わない技術 最終回 振り回されない技術

番外編

  1. 番外編 A-1 整理する技術 —— 記録が増えたときに、何が起きているか
  2. 番外編 A-2 指示を残す技術 —— 「調べるだけ」が通らなかった日
  3. 番外編 A-3 参照するタイミングを変える技術 —— 2,000 行の壁
  4. 番外編 A-4 導出を依頼者の言葉と分ける技術 —— 誰も言っていない条件が、memory に載った日
  5. 番外編 A-5 memory を要約しない技術 —— 整理から、要約を抜く
  6. 番外編 A-6 責務で線を引く技術 —— 仕組みが増えたときに、どれを消すか
  7. 番外編 A-7 読まれたかを確かめる技術 —— 確かめるのをやめて、読めていない形を止めた
  8. 番外編 A-8 面積で数える技術 —— 読ませた量で数えていたら、102 倍外していました
  9. 番外編 A-9 ルールを短くする技術 —— 読みに来るのは、止められた直後の人です
  10. 番外編 B-1 連載を本にする技術 —— 本単位のスイッチでは、足りなかった日
  11. 番外編 C-1 校正の方法に、先に本編を当てる技術 —— 方法を決める文が、本文と同じ地雷を踏んでいた日
  12. 番外編 C-2 仕組みと人を分ける技術 —— 検査を置いたその手で、検査の外側で 2 度転んだ日
  13. 番外編 C-3 要素ごとに観点を変える技術 —— 一様に当てた点検が、要素をまたいだところで数を落としていた
  14. 番外編 C-4 指示の揺れを、事故として残す技術 —— 事故を見て置いた仕組みは、まだ一度も鳴っていない
  15. 番外編 C-5 作業の流れを見る技術 —— 終わりにしたつもりの日に、まだ起きていたこと
  16. 番外編 C-6 作業を進める技術 —— 選ぶ場面が、1 つも残らなかった日
  17. 番外編 C-7 基準の出どころを見る技術 —— 2 分前に開いたページに、答えが書いてありました
  18. あとがき —— 本当の事実はどうでもいい話
スポンサー

連載の目次へ

広告ブロックが検出されました

TypingTubeは広告収入で運営しています。サイトの継続のため、広告の表示を許可していただけると助かります。