[{"data":1,"prerenderedAt":322},["ShallowReactive",2],{"content-/tool-call-malformed-subagent-workflow":3,"all-pages-for-dir":320,"og-image-/tool-call-malformed-subagent-workflow":321},{"id":4,"title":5,"body":6,"category":302,"description":303,"extension":304,"meta":305,"navigation":215,"ogImage":306,"path":307,"project_name":308,"published":309,"publishedAt":310,"seo":311,"stem":312,"tags":313,"todo":306,"unpublished":309,"updatedAt":306,"__hash__":319},"pages/2026-05/2026-05-31/tool-call-malformed-subagent-workflow.md","tool-call-malformed と一日戦って、予防策を /make-diary に焼き込んだ",{"type":7,"value":8,"toc":287},"minimark",[9,13,17,28,31,38,42,50,53,70,77,80,83,86,93,101,108,111,128,131,134,137,142,149,152,156,170,174,181,188,192,198,201,204,251,254,281,284],[10,11,5],"h1",{"id":12},"tool-call-malformed-と一日戦って予防策を-make-diary-に焼き込んだ",[14,15,16],"p",{},"朝、画面に同じ一行が並びはじめた。",[18,19,24],"pre",{"className":20,"code":22,"language":23},[21],"language-text","The model's tool call could not be parsed (retry also failed).\n","text",[25,26,22],"code",{"__ignoreMap":27},"",[14,29,30],{},"最初は一度きりの瞬きだと思って流した。だが昨日の積み残しを拾おうとファイルを開いた途端、また出た。散布図ページに GAAP/Non-GAAP 切替を実装している最中にも出た。テストを走らせようとした手前で止まり、データファイルを書き出そうとした瞬間にまた止まった。一日中、作業の節目という節目で同じ一行が割り込んできた。",[14,32,33,34,37],{},"この記事は、その一行の正体を追い、原因についての自分の思い込みを捨て、予防策を組み立て、それを次回以降も効くように ",[25,35,36],{},"/make-diary"," スラッシュコマンドへ焼き込むまでの記録だ。コードは出てこない。これは運用の話だ。",[39,40,41],"h2",{"id":41},"まず何が起きていたか",[14,43,44,45,49],{},"症状はいつも同じ形をしていた。Bash でテストを走らせたり、大きめのファイルを Write しようとしたり、サブエージェントをまとめて起動しようとしたり――つまり",[46,47,48],"strong",{},"重い操作の直前","で、セッションが「ツール呼び出しを解析できなかった」と言って固まる。",[14,51,52],{},"GAAP 切替の実装ログを後から見返すと、malformed が出たのはこういう場面だった。",[54,55,56,60,67],"ul",{},[57,58,59],"li",{},"純粋関数を切り出してテストを走らせようとした手前",[57,61,62,63,66],{},"9 銘柄分のデータを 1 つの大きな ",[25,64,65],{},"Write"," で書き出そうとした瞬間",[57,68,69],{},"サブエージェントを 3 銘柄ずつバッチ起動しようとした境目",[14,71,72,73,76],{},"面白いのは、malformed が出ても",[46,74,75],{},"ファイルへの書き込みや取得そのものは成功していた","ことだ。表示上は壊れているのに、裏では処理が通っている。だから「待っていればいいのか？」と何度も自分に問い直すことになった。答えは「待ちは不要、表示が壊れているだけ」だったが、それを確信するまでに時間を溶かした。",[39,78,79],{"id":79},"自分の思い込みが間違っていた",[14,81,82],{},"ここが今日いちばんの収穫だ。",[14,84,85],{},"これまで自分は「コンテキスト汚染＝数十 MB の巨大ファイルがセッションに溜まること」だと信じていた。スクリーンショットや画像を Read で大量に読むと、セッションが膨れて落ちる――そう理解していた。だから対策は「重いファイルを読まない」「画像を貼りすぎない」だと思っていた。",[14,87,88,89,92],{},"調べたら、これが",[46,90,91],{},"ひっくり返った","。",[54,94,95,98],{},[57,96,97],{},"画像 base64 で 48 MB まで膨れたセッションは、parse 失敗ゼロで最後まで完走していた",[57,99,100],{},"一方、0.1 MB しかない小さなセッションが、parse 失敗を何度も起こして落ちていた",[14,102,103,104,107],{},"サイズは犯人ではなかった。落ちる真因は、",[46,105,106],{},"モデルが生成するツール呼び出しの引数構造そのものが壊れること","だった。malformed の直前に渡そうとしていたデータは、わずか数 KB の小さなものだった例さえある。Bash の実行結果を受け取った直後、次のツール呼び出しを組み立てる段階で構造が崩れる。それが「進まない」の正体だった。",[14,109,110],{},"つまり「汚染」は二種類に分けて扱わないといけない。",[54,112,113,119],{},[57,114,115,118],{},[46,116,117],{},"(A) 肥大化","：画像 base64 でディスクとトークンを食う。これは掃除の対象だが、落ちる原因ではない",[57,120,121,124,125],{},[46,122,123],{},"(B) parse 失敗で落ちる","：ツール呼び出しの引数構造の破綻。",[46,126,127],{},"こっちが今日の犯人",[14,129,130],{},"この区別を取り違えていたから、これまで的外れな対策（ファイルサイズばかり気にする）をしていた。調べた内容はその場でマークダウンに書き留めて、誤解を解いた経緯ごと残した。",[39,132,133],{"id":133},"何をすれば防げるのか",[14,135,136],{},"正体が分かれば、打ち手も変わる。一日かけて、効く順に三つの予防策が固まった。",[138,139,141],"h3",{"id":140},"_1-重い読み込みはサブエージェントに投げる予防の本命","1. 重い読み込みはサブエージェントに投げる（予防の本命）",[14,143,144,145,148],{},"メインのセッションに大きな探索や大量の取得を抱えさせると、ツール呼び出しの引数が膨らんで構造が壊れやすくなる。だから",[46,146,147],{},"重い読み込みを別のサブエージェントに切り出す","。メインは結果の要約だけを受け取り、生のログや大きな突き合わせ作業はサブエージェント側に閉じ込める。",[14,150,151],{},"GAAP の 9 銘柄取得では、3 銘柄ずつ 3 バッチに分けてサブエージェントを並列起動した。重い Web 取得をメインから引き剥がしたことで、メインのコンテキストは軽いまま保てた。これがいちばん効いた。",[138,153,155],{"id":154},"_2-作業を小分けにする","2. 作業を小分けにする",[14,157,158,159,161,162,165,166,169],{},"1 回のツール呼び出しに、たくさんのファイルパスやコード断片や特殊文字を一気に詰め込まない。9 銘柄分のデータを 1 つの大きな ",[25,160,65],{}," で吐こうとして malformed が出たので、型定義と 2 銘柄ずつの ",[25,163,164],{},"Edit"," に割って投入し直したら通った。",[46,167,168],{},"大きな塊を小さな塊に割る","だけで破綻率が下がる。",[138,171,173],{"id":172},"_3-引き継ぎドキュメントを作って別セッションで継続する","3. 引き継ぎドキュメントを作って別セッションで継続する",[14,175,176,177,180],{},"malformed が連発しはじめたら、そのセッションはもう泥沼だ。深掘りをやめて、",[46,178,179],{},"確定事項と作業内容を復帰プロンプト付きのマークダウンに書き出し","、新しいクリーンなセッションで続ける。壊れたコンテキストを引きずったまま環境だけ変えても、同じことが起きる。区切ることがいちばん確実な復旧だった。",[14,182,183,184,187],{},"ここで注意がひとつ。別セッションで調査役を立てるときは「",[46,185,186],{},"コンテキスト汚染の可能性あり。巨大ファイルを全 Read するな。複雑な jq を避けろ","」と必ず伝える。伝えないと、調査役も同じ穴に落ちる。",[39,189,191],{"id":190},"予防策を-make-diary-に焼き込んだ","予防策を /make-diary に焼き込んだ",[14,193,194,195,197],{},"知見を頭の中に置いておくだけでは、明日の自分は同じ失敗を繰り返す。そこで、確立した予防策を ",[25,196,36],{}," スラッシュコマンドの中に書き込んだ。日記生成のような長いパイプライン作業こそ malformed が出やすいので、コマンド自身に「重い読み込みはサブエージェントへ」「作業を小分けに」「複雑な jq を避けろ」という指針を埋め込んでおく。次回からはコマンドを呼ぶだけで予防が効く。",[14,199,200],{},"これで、今日溶かした時間が次回以降の貯金になる。",[39,202,203],{"id":203},"今日やったこと",[54,205,208,218,224,230,236,242],{"className":206},[207],"contains-task-list",[57,209,212,217],{"className":210},[211],"task-list-item",[213,214],"input",{"checked":215,"disabled":215,"type":216},true,"checkbox"," 一日中出ていた malformed の発生場面を特定した（重い操作の直前で固まる）",[57,219,221,223],{"className":220},[211],[213,222],{"checked":215,"disabled":215,"type":216}," セッションログを解析し、確定エラーではなくモデル側の出力生成の破綻だと突き止めた",[57,225,227,229],{"className":226},[211],[213,228],{"checked":215,"disabled":215,"type":216}," 「汚染＝巨大ファイル」という思い込みを捨て、真因がツール呼び出しの引数構造の破綻だと理解し直した",[57,231,233,235],{"className":232},[211],[213,234],{"checked":215,"disabled":215,"type":216}," 調べた内容を誤解の経緯ごとマークダウンにドキュメント化した",[57,237,239,241],{"className":238},[211],[213,240],{"checked":215,"disabled":215,"type":216}," 予防策を三つ（サブエージェント分離・作業分割・引き継ぎ別セッション）に整理した",[57,243,245,247,248,250],{"className":244},[211],[213,246],{"checked":215,"disabled":215,"type":216}," その予防策を ",[25,249,36],{}," スラッシュコマンドに反映した",[39,252,253],{"id":253},"明日以降への申し送り",[54,255,257,263,269,275],{"className":256},[207],[57,258,260,262],{"className":259},[211],[213,261],{"disabled":215,"type":216}," malformed が出たら、ファイルサイズより先に直前のツール呼び出しの引数を疑う",[57,264,266,268],{"className":265},[211],[213,267],{"disabled":215,"type":216}," 重い探索は最初からサブエージェントに切り出して、メインを軽く保つ",[57,270,272,274],{"className":271},[211],[213,273],{"disabled":215,"type":216}," 連発したら粘らず、復帰プロンプト付きメモを残して新セッションへ移る",[57,276,278,280],{"className":277},[211],[213,279],{"disabled":215,"type":216}," 調査役を別セッションで立てるときは「全 Read 禁止・複雑な jq 禁止」を必ず伝える",[39,282,283],{"id":283},"今日の小さな教訓",[14,285,286],{},"便利な思い込みほど検証しないまま握り続けてしまう。「汚染＝巨大ファイル」は分かりやすかったぶん、間違っていることに気づくのが遅れた。画面に同じエラーが並びはじめたら、症状を眺めて納得する前に、直前に自分が何を渡そうとしたかを一度立ち止まって見る。それだけで、無駄に溶ける一日は減らせる。",{"title":27,"searchDepth":288,"depth":288,"links":289},2,[290,291,292,298,299,300,301],{"id":41,"depth":288,"text":41},{"id":79,"depth":288,"text":79},{"id":133,"depth":288,"text":133,"children":293},[294,296,297],{"id":140,"depth":295,"text":141},3,{"id":154,"depth":295,"text":155},{"id":172,"depth":295,"text":173},{"id":190,"depth":288,"text":191},{"id":203,"depth":288,"text":203},{"id":253,"depth":288,"text":253},{"id":283,"depth":288,"text":283},"dev","「The model's tool call could not be parsed」が一日中頻発した。原因の誤解を解き、サブエージェントと作業分割という予防策を確立し、それをスラッシュコマンドに反映するまでの記録。","md",{},null,"/tool-call-malformed-subagent-workflow","claude-code-tools",false,"2026-05-31T00:00:00.000Z",{"title":5,"description":303},"2026-05/2026-05-31/tool-call-malformed-subagent-workflow",[314,315,316,317,318],"claude-code","tool-call-malformed","subagent","context","workflow","kwkKkbnyJBTIcH4SjDhWJC_OJS71hgIq49zh-6zZ6Co",[],"https://log.eurekapu.com/og/blog/tool-call-malformed-subagent-workflow.png?v=2026-05-31T00%3A00%3A00.000Z&title=tool-call-malformed%20%E3%81%A8%E4%B8%80%E6%97%A5%E6%88%A6%E3%81%A3%E3%81%A6%E3%80%81%E4%BA%88%E9%98%B2%E7%AD%96%E3%82%92%20%2Fmake-diary%20%E3%81%AB%E7%84%BC%E3%81%8D%E8%BE%BC%E3%82%93%E3%81%A0&author=Kei%20Komatsu&sig=18688f5c63772e4f",1782528846096]