成功しているのに『スキップ』と出るバグの潰し方(ディスパッチャの戻り値規約)
ボタン一覧→コマンド関数をディスパッチする型のツールで、状態フラグと明細配列に同じキー名を使うと空配列がtruthyで常に成立し、成功しても『スキップ』表示になる。原因特定の順序・修正・文言そのものをテストする退行防止まで
約2.1万トークンの節約 (API料金換算で約31円分)。 要件定義・技術調査・試行錯誤ぶんのトークンがまるごと不要になります。※ 出品者申告とレビューに基づく推定値。モデル・タスク内容により変動します。
この巻物について
「成功しているのに『スキップ』と出るバグの潰し方(ディスパッチャの戻り値規約)」は、開発プロセスカテゴリのAI指示書(MDファイル)です。ボタン一覧→コマンド関数をディスパッチする型のツールで、状態フラグと明細配列に同じキー名を使うと空配列がtruthyで常に成立し、成功しても『スキップ』表示になる。原因特定の順序・修正・文言そのものをテストする退行防止までこの巻物をAIに読み込ませると、ゼロから設計・調査する場合に比べて 約2.1万トークン(API料金換算で約31円)・94%のトークンを節約できます。
- カテゴリ
- 開発プロセス
- 対応AI
- claude-code、cursor、codex-cli
- ライセンス
- 商用利用可 (再販不可)
- 価格
- 無料
- ゼロから開発時
- 約2.2万トークン
- この巻物使用時
- 約1,300トークン
- 節約量
- 約2.1万トークン (約31円)
- 更新日
- 2026-08-25
使い方 (AIに渡す3つの方法)
いちばん簡単なのはワンライナー。Claude Code のターミナルに貼るだけです。
claude "https://makimono-md.vercel.app/api/v1/files/md-2035de73/raw を読み込んで、この指示書どおりに実装して"
中身
「成功しているのに『スキップ』と表示される」を最短で突き止める
シート/管理画面のボタン一覧 → コマンド関数をディスパッチする型のツール (Google Apps Script のコマンドキュー、社内管理UI、CLI のサブコマンド表など) で 必ず一度は踏むバグとその潰し方。エラーは一切出ないので、放置すると 「この機能は壊れている」と現場に誤解されたまま何日も動き続ける。
症状
- 実行は成功していて成果物も出来ている。なのに画面の状態列だけが 「スキップされました」「未実行」等になる
- ログにもエラーが無い。例外も飛んでいない
- 特定の1機能だけで起きる(他の機能は正常に「完了」と出る)
原因(最初にここを見る)
ディスパッチャが戻り値を真偽値のフラグとして読んでいるのに、 そのコマンドだけ**同じキー名で配列(明細)**を返している。
// 呼び出し元(全コマンド共通の表示ロジック)
const ret = commands[name].apply(null, args);
if (ret && ret.skipped) { // ← 真偽値のつもり
status = 'スキップ';
message = ret.reason || 'スキップされました';
}
// あるコマンドの実装
return { ok: true, saved: [...], skipped: [], errors: [] }; // ← 明細の配列
JavaScript では 空配列 [] も truthy なので if (ret.skipped) は常に成立する。
reason は無いので既定文が出る。型が無い言語(GAS/素のJS/Python の dict)では
コマンドを1つ足した時点で、既存の全機能の表示規約を黙って壊せる。
同じ形の別バリエーション:
errors: []をif (ret.errors)で読んで常にエラー表示warnings: {}を truthy 判定(空オブジェクトも truthy)- Python なら逆に
[]が falsy なので「明細があるのに成功扱い」に化ける
修正
- 分岐を厳格化する。truthy 判定に頼らない。
if (ret && ret.skipped === true) { ... }
-
フラグと明細でキー名を共有しない。
skipped(bool) とskippedItems(array) に分ける。 名前を共有した瞬間に壊れる、が本質。 -
既定の表示文を上書きできる口を用意する。共通の固定文 (「完了(詳細は別シート参照)」等)は、成果物の置き場が違う機能では 別の意味で誤誘導になる。コマンドが
panelResultのような1行サマリを返せるようにし、 あればそれを表示する。
} else if (ret && ret.panelResult) {
cell.setValue(String(ret.panelResult).slice(0, 200));
} else {
cell.setValue('完了');
}
- 明細の件数は人の言葉に畳んで返す。読む人は配列を読めない。
保存 2件 / 既に取込済み 1件 / エラー 0件 → 保存先フォルダのように、 「何件どうなって、どこに置いたか」を1行で。
再発防止(ここまでやらないと必ず再発する)
表示文言そのものをテストする。 この種のバグは例外を出さないので、 戻り値のテストでは捕まらない。安いのはソース原文の検査:
import { readFileSync } from 'node:fs';
const src = (f) => readFileSync(new URL('../src/' + f, import.meta.url), 'utf8');
test('ディスパッチャの判定が === true で書かれている', () => {
for (const f of ['Dispatcher.js', 'Queue.js']) {
assert.match(src(f), /if \(ret && ret\.skipped === true\) \{/);
assert.doesNotMatch(src(f), /if \(ret && ret\.skipped\) \{/); // 退行検知
}
});
test('配列を返すコマンドの戻り値をスキップと誤判定しない', () => {
const isSkip = (ret) => Boolean(ret && ret.skipped === true);
assert.equal(isSkip({ ok: true, saved: [{}], skipped: [], errors: [] }), false);
assert.equal(isSkip({ skipped: true, reason: '対象が無いので実行しません' }), true);
});
規約が真偽値なのか明細なのかを、コマンド一覧の隣にコメントで1行書いておく。 コマンドを足す人はディスパッチャを読まない。
調査のコツ(順序を守ると数分で終わる)
- 表示文言を原文のままコードベース全文検索する(
スキップされました等)。 要約・言い換えをすると当たらない - ヒットした分岐の判定式だけを見る。ここで
if (ret && ret.xxx)の形なら ほぼ確定。ログや外部APIを疑うのは後回し - その機能の実装の
return文を見て、同名キーの型を確かめる - 直したら本番の1件で実際に実行し、表示セル/画面を read-back して確認する。 「たぶん直った」で閉じると、表示バグは誰も気付かないまま残る
よくある質問
+「成功しているのに『スキップ』と出るバグの潰し方(ディスパッチャの戻り値規約)」とは何ですか?
ボタン一覧→コマンド関数をディスパッチする型のツールで、状態フラグと明細配列に同じキー名を使うと空配列がtruthyで常に成立し、成功しても『スキップ』表示になる。原因特定の順序・修正・文言そのものをテストする退行防止まで
+どれくらいトークン(費用)を節約できますか?
ゼロから開発すると約2.2万トークンかかりますが、この巻物を使えば約1,300トークンで済みます。差し引き約2.1万トークン(API料金換算で約31円)・94%の節約です。
+どうやって使いますか?
無料です。MDファイルを Claude Code などのAIに読み込ませるだけ。ワンライナーをターミナルに貼れば実装が始まります。要件定義や技術調査を省いて実装だけにトークンを使えます。
+どのAIツールに対応していますか?
claude-code、cursor、codex-cli に対応しています。
+商用利用できますか?
ライセンスは「商用利用可 (再販不可)」です。
🤝 自分でAIを動かすのは、まだ不安…という方へ
この巻物の内容を、AIを使うプロに丸ごと任せることもできます。姉妹サービスAI代行堂なら「LINEで頼むだけで、仕事が完成」。
関連する巻物
ドキュメント駆動開発プロセス CLAUDE.md — 作るものを固めてから書かせる
「AIが暴走して意図と違うものを作る」を根絶する開発プロセス指示書。UI仕様→機能設計→実装の順をAIに強制し、1ファイルごとに承認ゲートを挟む。受託開発・チーム開発向け。
AIに指示書マーケットを自動参照させ、終了時に自動出品させるMD
開発依頼を受けた瞬間にマーケットの完成済み指示書を検索してAIに読ませ、セッション終了時には汎用ノウハウを自動出品させる仕組みの作り方。全台配布・秘密情報スキャン・実際に踏んだ配布バグ3つの回避込み。
「そのPCにしか直せない障害」をAIに自分で気付かせて着手させる
特定の1台にしかリポジトリが無い機能は、修正手順を書いても誰にも実行されず放置される。SessionStart hook で当該PCのAIだけに指示を出し、完了後は指示書へ状態を書き戻して再実装事故を防ぐ型。走査の時間予算とセッション跨ぎの再開、メール一致だけの自動承認がなりすまされる理由と署名キー方式、状態問い合わせAPI、鍵の自動配布、no-op通知の抑止まで、実際に94件の滞留を解消した実例に基づく手順。
この巻物、誰かのトークンも救えます
𝕏 で節約レシートをシェア