小学生向け理科教材づくり:実験器具バッチを完了し、植物分野8トピックの生成に着手した日
中学受験向け理科参考書の100トピックを教材化するプロジェクトの続き。今日はバッチ6(実験器具)を完了させ、別セッションでバッチ7(植物分野)に着手した。
午前は「ごめん、これまだダメなの?」とターミナルに打ち込みながらエージェントの完了を待ち、午後は「Your tool call was malformed and could not be parsed」の連発と格闘した。最後は計画書に「このタスクは Fable 5 で実行する」と明記させて終えた。
バッチ6(実験器具): 待って、検証して、閉じる
529 Overloaded を待つ
計画書(memo/2026-07-02 の教材化計画)を単一情報源として進めた。冒頭で計画書の「次セッション開始時の注意」「実装パイプライン」「バッチ運用の知見」の節を読み込ませ、素材の書き出しと現状確認を並列で済ませてから、生成エージェント2体を並列起動した。
ここから待ち時間に入ったが、API が 529 Overloaded を返し続けて応答が止まった。「リアルになってますけど、繋がってますか?」「ごめん、これまだダメなの?」と何度か確認を打ち込むことになった。サーバー側の一時的な問題なので、待つ以外にできることがない。
登録から表示確認まで
エージェント完了後は計画書の手順どおり、登録 → registry テスト → 原文混入チェック → ブラウザでの表示確認と進めた。
表示確認はデバッグ用 Chrome を立ち上げて実施。ポート9222が塞がっていたので掃除してから temp profile で起動し、セクションを巡回しながらスクリーンショットで確かめた。顕微鏡の図は各部の上下配置とラベルを1つずつ目視で確認し、チャレンジ問題も1問実際に回答してみた。コンソールエラーは0件。
事実チェックで指摘されていた修正も反映を確かめた。クイズ修正3点(設問の書き直し・explanation の修正・問題の差し替え)は反映済み。倒立像の説明文は「レンズを2回通ったため」という誤った因果が削られ、「実物と上下も左右も反対になった像が見えます」に直っていた。
並行セッションの発覚と引き継ぎ
途中で、別の Claude Code セッションが同じバッチ6を並行実装して先にコミットしていたことが分かった。同じファイルに収束していたので衝突はなく、こちらの SVG 修正分だけ追いコミットする形で収まったが、バッチ7でも並行して走らせると二重作業とコンフリクトになる。
ここで一旦区切ることにして、dev サーバーを止めさせ、引き継ぎドキュメントを作らせて終了した。バッチ6は3コミット(生成物・SVG修正・計画書更新)で完結し、未コミットの作業残りはゼロ。デバッグ用の一時 Chrome も閉じて、メインの Chrome には触らせなかった。
バッチ7(植物分野): 8トピックを同期並列で生成
別セッションでバッチ7に着手した。対象は種子のつくり・発芽・光合成・蒸散・呼吸・根と茎・花のつくり・葉のつくりの8トピック。
生成エージェント8体を同期並列で起動し、各エージェントに素材チャンク・分担の境界(種子散布はどちらのトピックに含めるか、気孔の開閉はどのトピックが主か等)・著作権ゲート・SVG幾何検算・原文混入チェッカーの自己実行を指示として渡した。
成果物は Vue コンポーネント32本とクイズデータ8ファイル。原文混入チェッカーは全ファイル合格だった。ただし、ここからが荒れた。
malformed 連発でツール出力が信用できなくなる
崩れた読み取りと実在しないレジストリ
途中から「Your tool call was malformed and could not be parsed」が連発し、セッションが不安定になった。grep の読み取り出力に同じ行が二重に並ぶなど表示そのものが崩れ、「レジストリが3ファイルに分離されている」という実在しない構造の報告まで返ってくる始末。実際には登録はすべて categories.ts 内の4箇所で完結する、計画書どおりの構造だった。
崩れた読み取りに基づいてレジストリを編集するのは危険なので、git で HEAD と作業ツリーを突き合わせ、確定した事実だけを並べ直してから作業を再開させた。「HEAD が壊れている」という報告も検証したら誤りで、作成されかけた issue は撤回させた。Edit ツールが old_string の完全一致を要求する仕様は、誤った推測に基づく編集を無害に失敗させる安全弁として働いた。
指示違反の登録を巻き戻す
もう1つの混乱は、一部の生成エージェントが「登録はするな」という指示に反して自分でレジストリに登録していたこと。8トピック中2トピック(花のつくりと蒸散)だけが登録された中途半端な状態になっていた。
レジストリを一度クリーンに戻し、残り6トピックを4箇所(import・sectionComponents・quizDataRegistry・各トピックの sections)に登録し直させた。登録済み2トピックの書式を読ませ、同じ形式に正確に合わせる方針で9箇所の編集がすべて成功。integrity テスト587件がすべて pass し、32コンポーネント参照と8 quiz import も数で確認した。
「走っています」を出力ファイルで裏取りする
進捗報告も事実と食い違う場面があった。「事実チェック8体が走っています」という報告に対して出力ファイルの存在で裏を取らせたら、8体とも何も出力せずに孤立・停止していた。セッション切り替えの巻き添えで、起動はしたが結果を残さず消えていた。
完了通知と出力ファイルの存在は別物。以後は「通知が来ても、ファイルの存在を確認してから結果を扱う」運用に変えさせた。
モデルが勝手に切り替わっていた
不安定さをしのぐため途中でモデルを切り替えて続行したのだが、終了間際にもう1つ気づいた。Fable 5 を指定していたのに、いつの間にか Opus 4.8 に切り替わっていた。理由を確認しても「ハーネス内部のモデル切り替え挙動は見えないので確かなことは分からない」との回答で、原因は特定できず。
そこで、計画書に「このタスクは Fable 5 で実行する」と明記させた。文書内の Opus 記述6箇所をすべて洗い出させて Fable 5 に統一し、次のセッションが別モデルで走り出す余地を文書レベルで塞いだ。口頭で指定しても、セッションをまたげば消える。単一情報源に書くのが確実だと分かった。
最後に事実チェックの第1波4体(SVG幾何リスクの高い呼吸・根と茎・葉・花)を再起動したが、生存確認が取れないまま時間切れ。4体を停止し、進捗を計画書に書き残して終了した。
今日の確定成果
- バッチ6(実験器具2トピック): 登録・検証・表示確認・3コミットまで完了
- バッチ7(植物8トピック): Vue 32本+クイズデータ8ファイルを生成、原文混入チェック合格
- バッチ7の登録: categories.ts の4箇所に8トピック分を登録、integrity テスト587件 pass
- 計画書のモデル指定を Fable 5 に統一(6箇所)、進捗トラッカーを更新
- バッチ7の事実チェック2系統: 未完了(次セッションに持ち越し)
学び
- 529 Overloaded の連発はサーバー側の問題。「まだダメなの?」と何度確認しても、待つ以外の手はない
- malformed が連発したら、ツールの読み取り出力を信用しない。git の HEAD と突き合わせて、確定した事実だけで状態を再構築する
- Edit の old_string 完全一致は、崩れた読み取りに基づく誤編集を無害に失敗させる安全弁になる
- サブエージェントの「完了通知」と「出力ファイルの存在」は別物。ファイルの存在を確認してから結果を扱う
- 生成エージェントには「登録はするな」と指示しても違反することがある。レジストリ登録は自分の管理下で一括実行し、テストで数を確認する
- モデル指定・並行セッションの禁止など、セッションをまたぐ約束事は計画書(単一情報源)に書く
次セッションでやること
- 素材チャンクを scratchpad に再書き出しする(前セッションの scratchpad は消えている)
- 植物8トピックの事実チェック2系統を完走させる(SVG幾何リスクの高い4トピックから)
- 事実チェックの指摘を反映してコミットし、計画書のバッチ7トラッカーを完了に更新する