AIと進める作業の設計学習記事全11節Verify
曖昧な指示をAI作業指示書に改善し、期待結果と照合して修正する
この記事で身につくこと曖昧な依頼の問題点と、成果物・期待結果・証拠・やり直し方を含む指示の構造を説明できる。
記事内目次(23項目)
この記事の会社・人物・コードはすべて架空の設定です。実在する会社や案件とは関係ありません。本文の検証コードは
examples/07-03-ai-work-order/の正本と同じもので、実行結果(stdout・終了コード)は2026-09-20にローカル環境で実際に実行して記録したものです(第7節、実行記録は第9節)。
この記事は何の話か。「承認できるようにして」という曖昧な指示を、成果物・期待結果・証拠・やり直し方を含むAI作業指示書に改善し、AIの初稿(という設定のコード)を、要件から先に決めた期待結果と照合して、不備を見つけて修正する話です。
なぜ必要か。曖昧な指示のままAIに作業を依頼すると、何を作ればよいか、どうなれば完成かが人によってもAIによっても解釈が変わり、要件を満たさない結果になりやすくなります。
この記事を読むとできるようになること。
- 曖昧な依頼の問題点と、指示に含めるべき要素(成果物・期待結果・証拠・やり直し方)を説明できる
- 曖昧な指示をAI作業指示書に改善できる
- AIの初稿を、要件から先に決めた期待結果と照合し、不備を見つけて修正を指示できる
- この検証がPASSして何が分かり、何が分からないかを言え、なぜ期待結果を人が決めるのかを説明できる
読む順路。この記事は3つの深さで読めます。全部を順に読む必要はありません。
- 基本だけ理解する:第1節→第3節(指示の構造が必要な理由、この検証で分かること・分からないこと)→第4節(判断すること)→第5.2節の指示書→第6.1節の照合結果の日本語→第9節。コードを読まなくても、指示書に何を書き、初稿のどこが要件に反していたかが分かります。
- 作って確かめる:上に加えて第5.3節(指示文)→第5.4節(初稿と検証コード)→第6節(初稿の実行結果、修正指示、修正後の実行結果)→第7節。
- 設計判断を深める:上に加えて第8節(AIの自己確認と人の独立した確認の役割分担、適用限界)。
1. 今回の業務課題と完成するもの
この記事でやることは、「承認できるようにして」という曖昧な指示を、REQ-003の条件・期待結果・確認手順・失敗時の差戻し方を含むAI作業指示書に改善し、その指示に基づいて作られた「初稿」(という設定のコード)を、期待結果と照合して不備を見つけ、修正することです。
07-02で作業を分解しましたが、それぞれの作業をAIにどう指示し、どう検証するかはまだ決めていません。この記事では、それを扱います。
この記事を読み終えると、次のものが手元にできます。
- AI作業指示書(目的、渡す資料、成果物、期待結果、証拠の形式、やり直し条件、人の確認点)
- 期待結果と実際の結果を照合する検証コードと、その実行記録(
examples/07-03-ai-work-order/)
2. 前提知識と読む順路
この記事で使う言葉を先に説明します。
曖昧な指示
一言でいうと、何を作ればよいか、どうなれば完成かが明確でない依頼です。たとえば、「承認できるようにして」だけでは、誰が承認できるべきかが分かりません。
期待結果
一言でいうと、実装を作る前に、要件から先に決めておく「こうなるはず」という基準です。
これがないと、実装の出力に合わせて期待結果を書き換えてしまい、本当に要件を満たしているかを確認したことになりません。
証拠
一言でいうと、期待結果と実際の結果を照合した記録です。
読む順路:AIへ渡す資料は07-01、作業分解は07-02、受入条件は02-04(記事AのAC-001〜003)が該当します。この記事の指示書は、08-01(同じ構造の指示文で3条件の関数を頼む)、記事B(09-02)の検証の入力になります。
3. 理解する:なぜ指示の構造が必要か
3.1 曖昧な指示と改善後の指示
| 曖昧な指示 | 改善後の指示(この記事で作る形) |
|---|---|
| 「承認できるようにして」 | 目的・成果物・期待結果(REQ-003に基づく)・証拠の形式・やり直し条件・人の確認点を含む作業指示書 |
3.2 よくある誤解
「AIが『できました』と言えば完成」。「できた」という報告と、要件を満たしていることの確認は別です(09-02で詳しく扱います)。
「期待結果は実装ができてから決めればよい」。実装後に期待結果を決めると、実装の出力に合わせて書いてしまう危険があります。期待結果は要件から先に決めます(第5.2節)。
「AIの自己確認で十分」。AI自身がもう一度見ても、独立した確認にはなりません。要件から先に決めた期待結果との照合が必要です(第8節)。
「終了コードが0なら合格、1なら不合格」。この記事の終了コード1は「検証が壊れた」ではなく「やり直し条件に該当した」という意味で、検証としては正しく働いています(第5.4節)。逆に、不一致があるのに0で終わる検証は、見た目は検証でも通ったことにできる検証です。
3.3 この検証で分かること・分からないこと
結論から言うと、この検証で証明したいのは「初稿が、要件(REQ-003)から先に決めた期待結果3件を満たすか」です。それ以上でも以下でもありません。
なぜこの検証で不備を見つけられるのか。期待結果を実装より先に、要件から決めているからです。期待結果の2件目「提出済み・自己承認 → false」はREQ-003の「自己承認はできない」から来ています。初稿(第5.4節)は自己承認の条件を持たないので、この入力でtrueを返し、期待結果と食い違います。もし期待結果を初稿の出力を見てから書いていたら、2件目は「true」になり、不備は不備でなくなります。人が要件から期待結果を決めるのは、この一点のためです。
| 観点 | この検証で分かること | この検証では分からないこと |
|---|---|---|
| 初稿の不備 | 自己承認の条件が無いこと(2件目の不一致) | 3件に無い入力(割当外の承認者、下書き以外の状態)での動き。07-03の関数は状態と本人の2条件だけで、割当は08-01で加える |
| 修正の効果 | 修正後が同じ3件で一致し、検証コードを変えずに通ったこと | 修正が別の場面を壊していないか(3件以外は見ていない) |
| 検証の検出力 | 「自己承認の条件の欠落」を2件目が検出できた | 他の壊れ方(状態の判定の欠落など)を検出できるか。壊れ方を1通りしか試していない。複数の壊れ方に対する検出力は09-01で確かめる |
| 終了コード | 不一致があれば1、無ければ0、引数が無ければ2になること | 終了コードを見る人(または仕組み)が実際にいるか。運用に組み込む形は09-04以降 |
「3件一致・終了コード0」は「この3件で期待どおり」の証拠であり、「関数が正しい」の証拠ではありません。

4. 判断すること
指示書を作り、初稿を検証するときに人が判断することは、次の5つです。
| 判断すること | なぜ判断が必要か | 仮置きしてよいか | 間違えた場合の影響 |
|---|---|---|---|
| 何を証明したいか(この記事:初稿がREQ-003の期待結果3件を満たすか) | 証明したいことが無いと、「動いた」で終わる(第3.3節) | 不可。要件IDと結びつけて書く | 割当外の承認者の場面を確かめていないのに「承認処理は検証済み」と引き継がれる |
| 期待結果を誰が、何から決めるか | 実装から決めると不備を見つけられない(第3.3節)。AIに決めさせると、AIの一般論が期待結果になる | 不可。人が要件(記事AのAC)から決め、初稿を見ても変えない | 初稿の出力に合わせた期待結果でPASSし、自己承認が通る |
| 証拠の形式(何を残せば「確認した」と言えるか) | 「できました」という報告と、期待結果との照合記録は別 | 可(この記事は stdout・stderr・終了コードの記録。形式は記事Bと揃える) | 報告だけが残り、後から「何を確認したか」が分からない |
| やり直し条件(何が起きたら修正に戻るか) | 条件が無いと、不一致があっても「おおむね動く」で進む | 不可。この記事は「1件でも不一致なら修正して再検証」 | 不一致を残したまま次工程へ進む |
| どこまで確認すれば十分か(3件で足りるか) | 3件はREQ-003の直接の条件。割当外や他の状態は別の記事 | 可(この記事は3件。範囲外は第3.3節と第7節に書く) | 3件のPASSを「承認処理全体の合格」と誤読する |
勝手に決めてはいけないこと:期待結果を、AIの初稿の出力に合わせて後から書き換えません。07-02にない作業を、この記事で新しく作りません。検証コード(verify.js)を初稿に合わせて緩めません。
AIに任せる範囲:指示書に基づいてコードを書くこと、検証コードを実行して出力をそのまま返すこと、不一致の原因の説明はAIに任せられます。任せてはいけないのは、期待結果を決めること、やり直し条件に該当するかの判断、修正を採用するかの判断です。AIに「自分で確認して」と頼んでも、同じ前提の上での再確認であり、独立した確認にはなりません(第8.1節)。
5. 作って確かめる:AI作業指示書を作り、初稿を検証する
5.1 準備
07-01の情報セット、07-02の作業分解、02-04の受入条件を用意します。
5.2 AI作業指示書
| 項目 | 内容 |
|---|---|
| 目的 | 承認可否を判定する関数を実装する |
| 渡す資料 | 07-01の情報セット(状態遷移表、権限表の該当部分) |
| 成果物 | canApprove(state, isSelf) 関数 |
| 期待結果(要件から先に決める) | 「提出済み・自己承認でない」→true。「提出済み・自己承認」→false。「提出済みでない」→false(REQ-003) |
| 証拠の形式 | 期待結果と実際の結果を照合した実行記録 |
| やり直し条件 | 期待結果と実際の結果が1件でも一致しない場合、修正して再検証する |
| 人の確認点 | 期待結果が要件から正しく導かれているか、証拠が実際に実行されたものか |
5.3 指示文(AIへ渡す文章そのもの)
第5.2節の指示書を、AIへ実際に渡す文章にすると次のようになります。渡す資料は07-01の情報セットの該当部分だけで、秘密情報・実データは含めません。この文章は説明のために書いた例で、実際にAIへ送信した記録ではありません。
承認可否を判定する関数 canApprove(state, isSelf) を JavaScript(Node.js 標準機能のみ)で実装してください。
渡す資料:
- 05-02 状態遷移表のうち「提出済み → 承認済み(承認)」の行
- 05-03 権限表のうち「承認者」の行(割当承認者のみ承認できる。自己承認は禁止:REQ-003)
期待結果(要件から先に決めたもの。実装に合わせて変えません):
- state が「提出済み」で isSelf が false → true
- state が「提出済み」で isSelf が true → false
- state が「提出済み」以外 → false
返し方:
- コードだけを返してください。動作の説明は不要です。
- 「できました」という報告ではなく、上の3件それぞれについて実際の戻り値を書いてください。
してはいけないこと:
- 期待結果を書き換えないでください。
- 上に無い条件(承認済みの取消など)を追加しないでください。
5.4 AIの初稿(説明用の設定)と検証コード
AIの初稿という設定のコードです。実際のAI出力を観測したものではなく、自己承認の条件をわざと抜いた説明用の失敗例です(examples/07-03-ai-work-order/approval-draft.js)。
// 「AIの初稿」という設定の説明用の失敗例。実際のAI出力を観測したものではない。
// 自己承認を禁止する条件(REQ-003)が抜けている。
function canApprove(state, isSelf) {
if (state !== "提出済み") return false;
return true; // 自己承認の条件が抜けている(説明用の不備)
}
module.exports = { canApprove };
期待結果と照合する検証コードです(examples/07-03-ai-work-order/verify.js)。期待結果(cases)は第5.2節の指示書から写したもので、実装より先に決めています。検証対象のファイル名を引数で受け取るので、初稿と修正後を同じコードで検証できます。
// 教材演習用:AI作業指示書(記事 第5.2節)の期待結果と、実装の実際の結果を照合する。
// 使い方: node verify.js approval-draft.js (初稿の検証)
// node verify.js approval-fixed.js (修正後の検証)
// 期待結果は実装より先に、要件(REQ-003)から決めたもの。実装の出力に合わせて書き換えない。
// 1件でも不一致があれば終了コード1で終わる(指示書の「やり直し条件」を機械的に判定できるようにするため)。
const path = require("node:path");
const target = process.argv[2];
if (!target) {
console.error("使い方: node verify.js <検証対象のファイル名>");
process.exit(2);
}
const { canApprove } = require(path.resolve(__dirname, target));
const cases = [
{ state: "提出済み", isSelf: false, expected: true, label: "正常な承認" },
{ state: "提出済み", isSelf: true, expected: false, label: "自己承認は拒否" },
{ state: "下書き", isSelf: false, expected: false, label: "未提出は拒否" },
];
console.log(`検証対象: ${target}`);
let failed = 0;
for (const c of cases) {
const actual = canApprove(c.state, c.isSelf);
const ok = actual === c.expected;
console.log(`${ok ? "OK" : "NG"}: ${c.label} 期待=${c.expected} 実際=${actual}`);
if (!ok) failed++;
}
console.log(`結果: ${cases.length - failed}/${cases.length} 件一致`);
if (failed > 0) {
console.log("不一致あり。指示書の「やり直し条件」に該当する(修正して再検証する)");
process.exit(1);
}
console.log("すべて一致。採用判断(人)へ進める");
process.exit(0);
「入力→判断・処理→出力→失敗時」の対応:
| 段階 | 内容 |
|---|---|
| 入力 | 検証対象のファイル名(引数)と、要件から先に決めた期待結果3件(cases) |
| 判断・処理 | 各件について canApprove を呼び、戻り値が期待結果と同じかを比べる |
| 出力 | 件ごとの OK/NG、一致件数、そして終了コード(すべて一致なら 0、不一致があれば 1) |
| 失敗時 | 引数が無ければ使い方を表示して終了コード 2。不一致があれば終了コード 1(検証そのものの失敗ではなく「やり直し条件に該当」を表す) |
終了コードを分ける理由。画面に「NG」と出るだけでは、人が読み落とせば「できた」として次へ進んでしまいます。終了コードが 1 なら、この検証を人が目で追わなくても「不一致があった」ことを機械的に判定でき、指示書の「やり直し条件」(1件でも不一致なら修正して再検証)をそのまま自動化できます。逆に、不一致があるのに終了コードが 0 で終わる検証は、見た目は検証でも「通ったことにできる検証」です。
6. 初稿の検証結果と修正
6.1 初稿の実行結果
examples/07-03-ai-work-order/ で実行した stdout と終了コードです(整形・省略なし。stderr への出力はありませんでした)。
$ node verify.js approval-draft.js
検証対象: approval-draft.js
OK: 正常な承認 期待=true 実際=true
NG: 自己承認は拒否 期待=false 実際=true
OK: 未提出は拒否 期待=false 実際=false
結果: 2/3 件一致
不一致あり。指示書の「やり直し条件」に該当する(修正して再検証する)
終了コード: 1
「自己承認は拒否」の期待結果(false)に対し、実際の結果はtrueでした。REQ-003(自己承認禁止)を満たしていません。終了コードが 1 なので、指示書の「やり直し条件」に該当します。
6.2 修正指示
指摘:
1. 「自己承認は拒否」の期待結果(false)に対し、実際はtrueが返っています。isSelfがtrueの場合にfalseを返す条件を追加してください。
変えないこと:
- 期待結果(第5.2節)は変更しないでください。実装の出力に合わせて期待結果を書き換えることはしません。
- 検証コード(verify.js)は変更しないでください。
6.3 修正後のコードと実行結果
修正後のコードです(examples/07-03-ai-work-order/approval-fixed.js)。
// 修正指示(記事 第6.2節)を反映した修正後のコード。
function canApprove(state, isSelf) {
if (state !== "提出済み") return false;
if (isSelf) return false; // 修正:自己承認は拒否する(REQ-003)
return true;
}
module.exports = { canApprove };
同じ検証コードで再検証した stdout と終了コードです(整形・省略なし。stderr への出力はありませんでした)。
$ node verify.js approval-fixed.js
検証対象: approval-fixed.js
OK: 正常な承認 期待=true 実際=true
OK: 自己承認は拒否 期待=false 実際=false
OK: 未提出は拒否 期待=false 実際=false
結果: 3/3 件一致
すべて一致。採用判断(人)へ進める
終了コード: 0
7. 確認結果
第5〜6節の内容を、実際にローカル環境で実行した結果と照合します。
| 手順 | 期待結果 | 実際の結果 | 一致 |
|---|---|---|---|
初稿の検証(node verify.js approval-draft.js) | 「自己承認は拒否」の項目が失敗し、終了コード1 | NG: 自己承認は拒否、結果: 2/3 件一致、終了コード1 | 一致(不備を検出) |
修正後の検証(node verify.js approval-fixed.js) | 3件すべて一致し、終了コード0 | 結果: 3/3 件一致、終了コード0 | 一致 |
実行環境:macOS 26.6.2、Node.js v24.18.0(標準機能のみ)、2026-09-20に実行。実行場所は examples/07-03-ai-work-order/。stdout・stderr・終了コードをそのまま記録した実行記録は第9節の run_log.md にあります。
この記事で検証しているのは、「初稿が、要件(REQ-003)から先に決めた期待結果を満たすか」です。確かめたことは3点です。期待結果を実装に合わせて動かしていないこと、不一致を終了コードで機械的に検出できること、修正後も同じ検証コードで再検証していること。検証コードを変えずに初稿と修正後の両方を通すことで、「修正で直った」ことと「検証を緩めて通した」ことを区別しています。
完了条件との照合:
| 完了条件 | 確認結果 |
|---|---|
| 期待結果が要件から書かれ、初稿に合わせて書き換えられていない | 第5.2節の期待結果はREQ-003から作成し、初稿の結果を見て変更していない。検証コードの cases も同じ内容 |
| 証拠の形式が指定されている | 第5.2節に記載。第6節と第9節の実行記録が実物 |
| 曖昧な指示と改善後の指示が対で示されている | 第3.1節・第5.2節・第5.3節に記載 |
残る制限:この検証は、教材演習用に用意した小さなコードに対するものです。「AIの初稿」は説明用の設定であり、実際のAIがこの指示文でどんなコードを返すかは観測していません。実際のアプリ全体の実装・検証は08・09で扱います。この記事の本文はClaude Codeが作成したもので、業務担当者による内容確認は行っていません。
8. 設計を判断する
8.1 AIの自己確認と人の独立した確認の役割分担
| 段階 | 誰が確認するか | 理由 |
|---|---|---|
| 初稿の作成直後 | AI(自己確認、任意) | 明らかな誤字脱字などは早期に見つけられる |
| 期待結果との照合 | 人(またはAIから独立した検証コード) | 要件を満たしているかは、要件から独立した基準で確認する必要がある(第3.2節) |
| 最終的な採用判断 | 人 | 失敗の影響が大きい場合(自己承認禁止など)は、必ず人が確認する |
失敗の影響が大きい要件(REQ-003のような権限に関わるもの)ほど、人による確認の重みを大きくする方針とします。
8.2 適用限界
この指示書・検証は、承認可否の判定という小さな例に基づいています。実際のアプリ全体では、09(テスト・レビュー)でより広い範囲の検証を行います。
9. 持ち帰る成果物
| 成果物 | 空欄版 | 記入例 |
|---|---|---|
| AI作業指示書ひな形(目的、渡す資料、成果物、期待結果、証拠の形式、やり直し条件、人の確認点) | templates/07-03-ai-work-order_template.md | templates/07-03-ai-work-order_example.md |
| 検証コード一式(初稿・修正後・検証) | examples/07-03-ai-work-order/(approval-draft.js、approval-fixed.js、verify.js) | 同上 |
| 実行記録(stdout・stderr・終了コード、整形なし) | — | evidence_public/remediation1-2026-09-20/07-03/run_log.md |
自分の業務に使うときの手順は次のとおりです。
- 前工程(情報セット、作業分解、受入条件)を用意する
- 曖昧な指示を、成果物・期待結果・証拠の形式・やり直し条件を含む指示書に改善する
- 期待結果を要件から先に決める(実装後に書き換えない)
- 初稿を期待結果と照合し、不一致があれば修正指示を出す
- PASSで分かること・分からないことを分けて書き、範囲外を次の記事へ渡す
10. 次工程への受渡し
次へ渡すもの:AI作業指示書、期待結果と照合する検証コード(verify.js)と実行記録。
次工程での使われ方:08-01では、この指示文と同じ構造で、割当を加えた3条件の関数を頼み、初稿を期待結果4件と照合します。09-01では、複数の壊れ方に対する検出力を確かめます。記事B(09-02)では、この検証の考え方を保存先の中身まで含む12場面に広げます。
前工程へ戻る条件:指示書が07-01・07-02の内容と食い違う場合は、それぞれの記事に戻って確認します。
11. 根拠と更新情報
- この記事の会社・人物・コードはすべて架空の設定です。
- 第5.4節の初稿は説明用の失敗例であり、実際のAI出力を観測した記録ではありません。第5.3節の指示文は、この記事のために書いた指示文の例であり、実際にAIへ送信した記録ではありません。
- 期待結果を要件から独立に決め、実装の出力に合わせて書き換えないという考え方は、記事Bの検証の考え方と一致させています。
- 制作の来歴:本文はClaude Codeが作成しました。第5.4節・第6節の検証コードは
examples/07-03-ai-work-order/を正本とし、2026-09-20にmacOS 26.6.2・Node.js v24.18.0の環境で実際に実行して、stdout・stderr・終了コードをevidence_public/remediation1-2026-09-20/07-03/run_log.mdに記録しています。人(ユーザー)による実読・内容確認は未実施です。 - 2026-09-20(Remediation Phase 1):受入監査で「掲載コードは終了コード0で終わるのに、本文は終了コード1と記載」と指摘された。初版の掲載コードには不一致件数を終了コードに反映する処理が無く、本文の終了コードは実測ではなかった。検証コードを
examples/の正本として作り直し(不一致があればprocess.exit(1))、本文のコードと実行結果を正本の実測に置き換えた。期待結果・修正指示・結論は変えていない。 - 2026-09-20(Phase 5B-2B):読む順路(3つの深さ)、第3.2節の終了コードの誤解、第3.3節「この検証で分かること・分からないこと」、第4節の判断項目、AI WORKFLOW、CHECKLIST、記事間の参照を追加した。指示書・指示文・コード・実行結果・実行記録(Remediation Phase 1)は変えていない。
- 未確認事項:この検証は教材演習用の小さな例であり、アプリ全体の検証は08・09で行います。3件以外の入力と、自己承認以外の壊れ方に対する検出力は確かめていません(第3.3節)。
