ANTIGRAVITY LABEN
記事一覧/連携・プラグイン
連携・プラグイン/2026-06-16上級

クラウドに出した夜間バッチが「昨日と違う結果」になる — 再現性を守る入力契約とスナップショット設計

Managed Agents API でバッチをクラウドのエフェメラルワーカーに出すと、手元では当たり前だった環境の前提が消えます。同じ入力でも結果がぶれる原因を、環境スナップショット・入力契約・シード固定の三層で押さえる設計と実装を共有します。

antigravity361Managed Agents4再現性3バッチ処理クラウド運用設計11冪等性5

プレミアム記事

手元のマシンで動かしていたバッチを、Managed Agents API でクラウドのワーカーに移したときの話です。最初の数日は快適でした。手元のCPUを占有せず、夜間に勝手に走り、朝にはレポートができている。ところが一週間ほどで、妙なことに気づきました。同じ入力のはずなのに、昨日と今日でレポートの構成が違うのです。

エフェメラルワーカーは、起動するたびに新しい環境で立ち上がり、終わると消えます。これは設計上の利点ですが、裏を返すと「手元では当たり前だった前提」がすべて消えるということです。ローカルにあった設定ファイル、環境変数、キャッシュ、入力データのちょっとした状態。そうした暗黙の文脈が、クラウドでは引き継がれません。

このバッチでは、各サイトの週次レポートに加えて、AdMob のメディエーション実績を集計するジョブも回しています。App Store と Google Play のリリースの合間に、手を止めずに集計が進んでほしい。だからこそ、結果が日によってぶれるのは見過ごせませんでした。私はこの「ぶれ」を、運用を止めずに潰していきました。

ここでは、クラウドに出したバッチの結果がぶれる原因を切り分け、再現性を入力契約・環境スナップショット・シード固定の三層で守る設計を共有します。個人開発で複数サイトのレポートを自動生成している、実用本位の組み立てです。

まず「ぶれ」の原因を4つに分ける

再現できない、という症状はひとくくりにすると直せません。私は原因を4つに分けて、ひとつずつ潰しました。

  1. 環境差です。エフェメラルワーカーのランタイムやライブラリのバージョンが、起動のたびに微妙に違うという落とし穴があります。
  2. 暗黙コンテキストの欠落です。手元では参照できていたファイルやデータが、クラウドには渡っていません。
  3. モデルの更新です。gemini-3.5-flash のような別名は、裏側のモデルが静かに差し替わることがあります。
  4. モデル本来の非決定性です。温度パラメータやサンプリングのゆらぎが残ります。

この4つは対処法がまったく違います。環境差はスナップショットで、暗黙コンテキストは入力契約で、モデル更新はバージョン固定で、非決定性はシードと温度の固定で押さえます。混ぜて考えると、どれも中途半端にしか直りません。

入力契約: 暗黙の文脈を明示的な引数に変える

最も効いたのは、入力契約をJSONで固定したことでした。クラウドのワーカーは「手元にあるはずのもの」を一切前提にできません。だから、ジョブに必要なものをすべて1つの契約オブジェクトに書き出し、それだけを渡します。

// 入力契約 — このジョブが必要とするものを、すべて明示する
interface BatchInputContract {
  contractVersion: "1";          // 契約自体のバージョン
  task: "weekly-report";
  // データは参照ではなく、内容そのものか不変なポインタで渡す
  inputs: {
    siteId: string;
    periodStart: string;         // ISO 8601、曖昧な「先週」を許さない
    periodEnd: string;
    datasetUri: string;          // 不変オブジェクトストレージ上の固定URI
    datasetSha256: string;       // 取得後に検証するハッシュ
  };
  // モデルを別名ではなく固定バージョンで指定する
  model: {
    id: "gemini-3.5-flash";
    pinnedVersion: string;       // 例: "gemini-3.5-flash-002"
    temperature: 0;
    seed: number;
  };
  // プロンプトテンプレートもバージョンで固定する
  promptTemplateId: string;      // 例: "weekly-report@7"
}

要点は3つあります。期間を「先週」のような相対表現で渡さないこと。データを参照ではなく、ハッシュで検証できる不変URIで渡すこと。モデルを別名でなく固定バージョンで指定すること。これだけで、同じ契約からは同じ結果が出る確率が大きく上がりました。

特にデータのハッシュ検証は重要でした。datasetUri が同じでも、その中身が差し替わっていれば結果は変わります。ワーカー側で取得直後に datasetSha256 を照合し、一致しなければジョブを止めます。「いつのまにか入力が変わっていた」という最も気づきにくいぶれを、ここで弾けます。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
クラウドのエフェメラルワーカーで結果がぶれる4つの原因(環境差・暗黙コンテキスト・モデル更新・非決定性)を切り分ける診断手順を取得できます
入力契約をJSONで固定し、environment digest とモデルバージョンを成果物に刻む manifest 設計の実装コード(TypeScript)を学べます
週次のレポート生成で再現できない出力が約15%から1%未満に下がった、スナップショット運用の判断基準が分かります
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

連携・プラグイン2026-06-15
Antigravity エージェントの揺れる出力を CI で回帰検証する
同じプロンプトで二度走らせると差分が出るエージェント出力を、スナップショットの正規化とpytestのゴールデンファイル比較で安定して回帰検証する実装を、個人開発のCIで運用した記録としてまとめます。
連携・プラグイン2026-06-14
Temporal の耐障害性ワークフローを本番で信用するために — 冪等性・リトライ分類・Saga 補償の実装メモ
Temporal を本番のバックエンドに据えてから見えてきた実装の勘所をまとめました。アクティビティの冪等性、リトライすべきエラーの線引き、Saga の補償が中途半端に効く事故、可観測性の設計を、Antigravity での開発手順とともに整理します。
連携・プラグイン2026-06-13
Antigravity CLI を非対話で回す — CI と cron に載せる前の設計
Go 製になった Antigravity CLI を対話ではなく CI・cron で無人実行するための設計を、終了コード・冪等性・タイムアウト・出力パースの観点からまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →