Глава 20

Отделяйте agent loop от durable orchestration

Длинная задача переживает process crash только тогда, когда состояние и эффекты сохраняются вне памяти worker, а шаги можно безопасно воспроизвести. Agent SDK может управлять model loop, но production workflow дополнительно должен переживать restart, network partition, delayed approval и deployment: checkpoints фиксируют state после значимых переходов, а orchestration runtime восстанавливает ready work из durable records.

  1. Intent: work item записан
  2. Execute: worker с lease
  3. Record: artifact и receipt
  4. Advance: status и next ready set
  5. Resume: replay после crash

Temporal определяет Workflow Execution как durable, reliable и scalable function execution и использует event history для восстановления после infrastructure failures. Это не значит, что Temporal автоматически исправит semantic error модели - он даёт надёжную основу для ожиданий, retries и resume, а application-level policy остаётся вашей. В companion-проекте основа для replayable state - тот же append-only event log.

TypeScript
import type { EventRecord, RunEvent } from "./types.js";

export class EventLog {
  readonly #records: EventRecord[] = [];
  readonly #clock: () => number;

  public constructor(clock: () => number = Date.now) {
    this.#clock = clock;
  }

  public append(event: RunEvent): EventRecord {
    const record: EventRecord = {
      sequence: this.#records.length + 1,
      timestamp: this.#clock(),
      event
    };
    this.#records.push(record);
    return record;
  }

  public records(): readonly EventRecord[] {
    return this.#records.map((record) => ({ ...record }));
  }
}

Checkpoint должен содержать версию workflow и контрактов, statuses work items и attempts, immutable-ссылки на inputs и outputs, остаток budget, approvals и idempotency receipts, а при необходимости - версии model, prompt и tool для аудита.

Resume не равен replay model calls. Не повторяйте уже оплаченный и принятый model output без необходимости. Сохраняйте validated artifact и продолжайте с ближайшей безопасной границы.

Durability обеспечена. Дальше - безопасность: каждому worker выдаётся минимальная identity, а не просто другой prompt.

Ссылки