個人family-trips

大分・熊本の家族旅行ガイドを agent-browser で量産した日

8月の家族旅行は大分・熊本方面に決めている。動き出しの口火は1枚の宿泊予約画面だった。スマホのスクリーンショットを Claude Code に渡して「8/20、ここに泊まる。空港からの道のりと今回の宿の条件を旅行日程に反映しておいて。アプリの中のカレンダーにも入れて」と頼んだ。そこから一日かけて、旅程アプリへの反映と、観光ガイドの量産が始まった。

最初に断っておくと、この日の作業は最後まで滑らかには進まなかった。Your tool call was malformed and could not be parsed. という一文が、数えるのも嫌になるほど割り込んできた。それでも合間を縫ってガイドを4本立ち上げたので、その過程を残す。

まず宿を旅程に落とし込む

渡したのは「日田温泉 はなの樹 RIVER TERRACE」の予約画面だった。8/20チェックイン。これまで阿蘇エリアの初日の宿が空欄のままだったので、ここが埋まった意味は大きい。

宿の場所を地図で確かめると、日田は空港と阿蘇のちょうど中間にあった。初日の運転を短く区切れる位置取りだ。空港から日田までは大分道経由でおよそ100km、1時間半から1時間45分。19時のチェックインに十分間に合う。元かんぽの宿で、日田ICから国道212号に乗って8分、駐車場は135台ぶん無料。子連れで荷物が多い我が家には、車を停める場所を探さなくていいだけで肩の力が抜ける。

この情報を、旅程の3か所に手分けして書き込んでもらった。

  • frontmatter のタイムライン(アプリ内カレンダー)に8/20の1泊目を確定として刻む
  • 本文の宿泊先候補セクションに、予約内容・空港からの道のり・宿の条件・採用理由を追記する
  • 地図ピンの JSON に日田の宿を1本足し、未定だったアソキャンの注記を更新する

3ファイルを書き換えたあと、frontmatter のスキーマが壊れていないかをビルドで通して確かめた。型チェック用の追加依存を入れる流れになりかけたので、それは断って実ビルドで検証する方に切り替えた。スキーマは無事に通った。「ちょっと立ち上げておいて」と言われて開発サーバーを起こし、画面で日田が反映されているのを一緒に確認した。

日田の観光ガイドを独立ページにする

宿が決まると、次は「日田の観光名所をレポートして、マークダウンで保存して」だった。

agent-browser に複数の角度から日田を調べさせた。出てきたのは、宿が三隈川沿いにあって豆田町まで車で5分という立地の良さ、そして8/20〜21がちょうど鵜飼シーズンの真っ最中だという事実だった(鵜飼は5/20〜10月末)。滞在は実質「8/20の夜と8/21の朝」しかない。だから夜は川辺の屋形船、朝は豆田町の散歩、という現実的な組み立てにした。

最初はメモディレクトリに1枚のマークダウンとして保存した。ところがここで「これ、どこで記事を確認すればいいの」「URLを教えて。私はどこにアクセスすれば見られるの」という質問が続いた。メモのマークダウンには URL がない。そこで「独立したページにして」という指示に切り替わった。

先行して作ってあった福岡ガイドの作りを調べると、コンテンツコレクションではなく静的なページ(src/pages/guides/*.astro)で組まれていた。同じ BaseLayout と scoped style に揃えて日田ガイドのページを起こし、ヘッダーナビと旅程ページの両方から導線を張った。本番ビルドを通すとページ数が増えて、エラーは出なかった。これで日田は URL を持つ1本のガイドになった。

「麻生エリア」は阿蘇エリアだった

続いて「熊本の麻生エリアも調査レポートを、独立したドキュメントとして作って」と言われた。

音声入力の「あそ」が「麻生」に化けただけで、指しているのは阿蘇エリアだ。旅程では8/21〜23にアソキャンで2泊する場所にあたる。日田ガイドと同じ作りで阿蘇のガイドを起こすことにした。

agent-browser の調査で1つ重要な制約が出てきた。中岳火口は2026年5月時点で遊覧ヘリの事故の影響により見学が規制されていて、行けるのは草千里と火山博物館まで。この点はガイドに明記した。阿蘇は2泊3日でゆっくり回れるので、子連れ向けにカドリー・ドミニオン(アソキャンと同じ阿蘇市黒川にあって近い)も入れた。

ナビに「阿蘇ガイド」を足し、旅程の観光地リストから両ガイドへ飛べるようにした。表示確認の途中で、阿蘇神社の説明に変換ミスを見つけた。「水基(みずき)」と書くべきところが「水basin」と化けていた。すぐ直した。これは agent-browser の調査結果をそのまま貼ると起きる類の崩れで、画面を見て自分が拾わないと気づけない。

  • 日田ガイドを独立ページとして作成(ナビ・旅程ページから導線)
  • 阿蘇ガイドを独立ページとして作成(中岳火口の規制を明記)
  • 阿蘇神社の変換ミス(水basin → 水基)を画面で発見して修正

インデックスに載っていなかった

ここで指摘が入った。「/guides/aso-sightseeing/ にアクセスするリンクがインデックスにないと思うんだけど。あと、下も」。

トップページを読むと、原因はすぐ分かった。トップの「滞在ガイド」カードは src/data/guides.json から生成される作りで、登録済みは福岡だけだった。日田と阿蘇は JSON に未登録のまま、それぞれの URL は存在するのにトップから辿れない状態になっていた。各ページを作ることと、入口に並べることは別の作業だと思い知らされた一幕だった。

両方を active で JSON に追加した。ところがトップを開いてもカードが出ない。キャッシュを無視してリロードしても変わらない。JSON の import は HMR が効かないケースがあって、開発サーバーが古い JSON を握ったままだった。サーバーを再起動したらカードが2枚とも現れた。

この再起動の待ち時間を使って、追加の依頼にも着手した。「九重"夢"大吊橋を訪問済みにする」フラグと、「全カードに写真を付ける」だ。写真は Wikimedia Commons の実在画像を使うため、別エージェントを並列で走らせて URL の収集と検証をさせた。

写真を集めて貼る

画像収集の結果はこうだった。

  • 日田: 7件すべて取得・検証済み
  • 阿蘇: 12件取得。押戸石・カドリー・あそ☆ビバの3件は Commons に画像がなくテキストのまま

画像エリアと訪問済みバッジを各ガイドに組み込み、九重"夢"大吊橋には「✅ 訪問済み」を立てた。集めた URL を各スポットに貼り、本番ビルドを通したあと、ホットリンクが本当にブラウザで表示されるかをスクリーンショットで自分の目でも確かめた。日田は7枚すべて、阿蘇は12枚すべて写真が出た。Wikimedia のホットリンクは成功していた。

ここで効いたのが並列化だった。画像収集を別エージェントに投げて走らせながら、本体ではレイアウトとバッジを先に組む。片方が止まっていてももう片方が進む。malformed が割り込んでくる日には、待ち時間を別の仕事で埋められる構成がそのまま保険になった。

malformed と戦いながら量産する

この日の体感を一番正直に書くと、半分は malformed との我慢比べだった。

Your tool call was malformed and could not be parsed. が宿の反映中にも、日田の調査中にも、阿蘇の表示確認中にも、写真の反映中にも顔を出した。2回はリトライも失敗して The model's tool call could not be parsed (retry also failed). まで行った。それでも崩れたのはツール呼び出しの引数の構造であって、書きかけのガイドそのものが消えるわけではない。

崩れたあとに効いたのは、次の一手を小さく単純にすることだった。たとえば日田の画像を貼る編集が一度インデント不一致で空振りしたとき、勢いで7件まとめて貼ろうとせず、正確な箇所を1つ確かめてから4件・3件と小分けに反映した。阿蘇の12件も4件ずつ3回に割った。一度に詰め込まないこと、それだけで malformed の谷をまたぎやすくなる。

最後の杉乃井パレスのガイドは、本体とナビ・トップ・旅程への導線まで組んで、ビルド検証の直前で retry also failed に当たって途切れた。「杉乃井パレス」は実在の施設名で、杉乃井ホテル(別府)の大型エンタメ棟だ。中に棚湯・アクアガーデン・アクアビート・SUGINOI BOWL & PARK・シーダパレスが入っていて、8月はアクアビートも営業中、プールと温泉は宿泊者なら無料。8/25〜26に泊まる予定なので、ここも写真付きの独立ガイドに仕立てる。本体と導線までは生きているので、続きは画像の収集と反映、そして表示確認から再開すればいい。

この日のチェックリスト

  • 8/20の宿(日田)を旅程・タイムライン・地図ピンに反映、ビルドで検証
  • 日田ガイドを写真付き独立ページとして公開(7枚)
  • 阿蘇ガイドを写真付き独立ページとして公開(12枚、中岳火口の規制を明記)
  • トップの guides.json に日田・阿蘇を登録して入口に並べる
  • 九重"夢"大吊橋に訪問済みバッジを追加
  • 杉乃井パレスのガイドを写真付きで仕上げる(本体・導線は作成済み、画像反映と表示確認が残り)

残った教訓

  • 個別ページを作ることと、インデックスに載せることは別の作業。URL があっても入口に並べないと誰も辿り着けない
  • agent-browser の調査結果をそのまま貼ると「水basin」のような変換崩れが混ざる。画面で読んで違和感を拾うのは人間の係
  • malformed が連発する日は、編集を小分けにして一手を単純に保つ。並列で別エージェントを走らせておくと、詰まりが致命傷になりにくい