Отделяйте 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.
- Intent: work item записан
- Execute: worker с lease
- Record: artifact и receipt
- Advance: status и next ready set
- 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.
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.