Windows で無人 LLM CLI に長いプロンプトを渡すと spawn ENAMETOOLONG で即死する — stdin 渡しへの根治と単発故障を1件で検知するヘルス判定
Windows の argv 上限で子CLIへの長いプロンプトがspawn即死。stdin渡しへの修正とテスト、単発故障を1件で検知する監視の閾値修正
約7,500トークンの節約 (API料金換算で約11円分)。 要件定義・技術調査・試行錯誤ぶんのトークンがまるごと不要になります。※ 出品者申告とレビューに基づく推定値。モデル・タスク内容により変動します。
この巻物について
「Windows で無人 LLM CLI に長いプロンプトを渡すと spawn ENAMETOOLONG で即死する — stdin 渡しへの根治と単発故障を1件で検知するヘルス判定」は、業務自動化カテゴリのAI指示書(MDファイル)です。Windows の argv 上限で子CLIへの長いプロンプトがspawn即死。stdin渡しへの修正とテスト、単発故障を1件で検知する監視の閾値修正この巻物をAIに読み込ませると、ゼロから設計・調査する場合に比べて 約7,500トークン(API料金換算で約11円)・83%のトークンを節約できます。
- カテゴリ
- 業務自動化
- 対応AI
- claude-code、cursor、codex-cli
- ライセンス
- 商用利用可 (再販不可)
- 価格
- 無料
- ゼロから開発時
- 約9,000トークン
- この巻物使用時
- 約1,500トークン
- 節約量
- 約7,500トークン (約11円)
- 更新日
- 2026-09-22
使い方 (AIに渡す3つの方法)
いちばん簡単なのはワンライナー。Claude Code のターミナルに貼るだけです。
claude "https://makimono-md.vercel.app/api/v1/files/windows-llm-cli-spawn-enametoolong-stdin-1/raw を読み込んで、この指示書どおりに実装して"
中身
Windows で無人 LLM CLI に長いプロンプトを渡すと spawn ENAMETOOLONG で即死する
症状
Node.js から無人の LLM CLI(<自作の委譲ツール> のように、コーディングエージェント CLI を -p <prompt> --model <model> の形で呼ぶラッパー)を child_process.spawn で起動すると、プロンプト本文が長い(数万字クラス)ときだけ起動直後に落ちる。エラーは Error: spawn ENAMETOOLONG (errno: -4064, syscall: 'spawn')。子プロセスは1行も出力せず、stdout・stderr ともに空のまま exit code 1 で終わる。短いプロンプトでは再現しないため、「たまに落ちる原因不明の委譲失敗」として見過ごされやすい。
実測: プロンプト本文 47,499 文字を argv に含めたところ、生成された引数文字列が 47,622 文字となり、Windows のコマンドライン長上限(約 32,767 文字)を超えて spawn システムコールがそもそも起動できずに失敗した。
原因
Windows は CreateProcess に渡せるコマンドライン全体の長さに約 32KB の上限がある。Node.js の child_process.spawn(cmd, args) は args を内部で1本のコマンドライン文字列に結合してから OS に渡すため、args の中にプロンプト全文のような長い文字列を含めると、上限超過時に ENAMETOOLONG で 子プロセスが起動する前に 失敗する。Unix 系では上限がずっと大きい(数MB)ため同じコードでも再現せず、開発機(Mac/Linux)では気づけない。
修正: プロンプトは argv でなく stdin で渡す
Before(argv にプロンプト本体を積む=上限に当たる):
const child = spawn(cliPath, ['-p', promptText, '--model', model]);
After(プロンプトは stdin へ、argv は固定長の短い引数だけにする):
const child = spawn(cliPath, ['-p', '--model', model], {
stdio: ['pipe', 'pipe', 'pipe'],
});
// stdin への書き込みエラー(子が早期終了した場合のEPIPE等)で
// プロセス全体を落とさないためのガード
child.stdin.on('error', () => {});
child.stdin.end(promptText);
これで argv は ['-p', '--model', model] のような数十文字に収まり、プロンプトが何文字あっても ENAMETOOLONG を起こさない。呼び出す CLI 側が -p 単体(引数なし)または標準入力を読む対応をしていることが前提なので、対象 CLI のヘルプで「stdin からプロンプトを読めるか」を先に確認すること。
回帰テストの書き方
--dry-run のようなモードを持つラッパーであれば、実際に子プロセスを起動せず「これから渡す argv」と「プロンプトの受け渡し経路」を出力させ、それを assert する。
// dry-run 出力例: { promptVia: 'stdin', promptChars: 40000, argv: [...] }
const result = buildSpawnPlan({ promptText: 'x'.repeat(40000), model: 'm' });
assert.equal(result.promptVia, 'stdin');
assert.ok(JSON.stringify(result.argv).length < 300);
「4万字クラスの長い指示を渡しても argv の JSON 化長が300字未満に収まる」ことをテストにしておけば、将来 argv 渡しに戻す変更が入っても即座に検知できる。
監視側の落とし穴: 単発の spawn 失敗が「healthy」に見える
委譲の成否を監視するヘルスチェックが「フォールバック経路(安いモデル等への切替)の低成果」を2件以上連続という閾値でしか検出していない設計だと、spawn 自体が失敗して0件しか実行されなかった単発の事故が「サンプル数不足」扱いになり、翌朝も healthy 判定のまま見過ごされる。spawn 失敗は成果物の質の問題ではなく起動の問題なので、閾値を待たずに1件で即座に別カテゴリとして検知すべきもの。
判定式(台帳の1行が以下を満たしたら即発火、severity: medium):
provider === 'fallback'
&& out === 0
&& /syscall: 'spawn'|spawn E[A-Z]+|code: 'E[A-Z]{4,}'/.test(stderrTail)
台帳行の例:
{"provider":"fallback","out":0,"status":1,
"stderrTail":"... { errno: -4064, code: 'ENAMETOOLONG', syscall: 'spawn' }"}
検証手順
- dry-run: 上記のような長大プロンプトを渡して
promptVia: 'stdin'とargvの短さを確認する。 - 実起動 (E2E): 実際に長いプロンプト(数万字)で子 CLI を起動し、stdin 経由で応答が返ってくることを確認する(
ENAMETOOLONGが再発しないこと)。 - 実台帳での検知確認: 上の判定式が実際の履歴データ(過去の失敗事例を含む台帳)に対して1件から発火し、誤検知(正常応答をfalse positiveで拾う)がないことを確認する。
よくある質問
+「Windows で無人 LLM CLI に長いプロンプトを渡すと spawn ENAMETOOLONG で即死する — stdin 渡しへの根治と単発故障を1件で検知するヘルス判定」とは何ですか?
Windows の argv 上限で子CLIへの長いプロンプトがspawn即死。stdin渡しへの修正とテスト、単発故障を1件で検知する監視の閾値修正
+どれくらいトークン(費用)を節約できますか?
ゼロから開発すると約9,000トークンかかりますが、この巻物を使えば約1,500トークンで済みます。差し引き約7,500トークン(API料金換算で約11円)・83%の節約です。
+どうやって使いますか?
無料です。MDファイルを Claude Code などのAIに読み込ませるだけ。ワンライナーをターミナルに貼れば実装が始まります。要件定義や技術調査を省いて実装だけにトークンを使えます。
+どのAIツールに対応していますか?
claude-code、cursor、codex-cli に対応しています。
+商用利用できますか?
ライセンスは「商用利用可 (再販不可)」です。
🤝 自分でAIを動かすのは、まだ不安…という方へ
この巻物の内容を、AIを使うプロに丸ごと任せることもできます。姉妹サービスAI代行堂なら「LINEで頼むだけで、仕事が完成」。
関連する巻物
Google Meet 自動参加&動画配信Bot 開発指示書
指定した時刻に Google Meet へ自動参加し、動画を再生しながら画面共有する Bot を、Claude Code に一発で作らせる開発指示 MD。朝会の定例動画配信・ウェビナーの自動放送に。
受信メール添付を案件フォルダへ自動取込するパイプライン
メールを読むアプリとドライブに書くアプリが別、という現実的な構成で顧客メールの添付を案件フォルダへ無人保存する設計。権限追加を避ける理由、実行時間制限下の予算3本立て、二重の重複防止、base64url/行数上限/変換判定などの実装罠、案件と顧客のマッチング、名寄せは候補提示+人の承認にする型まで。
Gmail 自動仕分け&返信ドラフト生成MD
受信メールを AI が分類 (要返信/情報/営業/スパム) してラベル付けし、要返信メールには返信ドラフトまで自動生成する仕組みを作らせる指示書。DWD (ドメイン全体委任) 設定手順込み。
この巻物、誰かのトークンも救えます
𝕏 で節約レシートをシェア