Pre-alpha 文档
重试提交,恢复同一个 Agent Run。
使用租户隔离的持久化幂等记录,再按 Run ID 或 Submission Key 读取完整重校验的公开 Run/Result Snapshot。
让 Key 与 Run 在同一事务提交
先认证 Tenant、冻结 Policy 与 Deployment Input,再调用 submit。Key Mapping 与新原子 Admission 在同一 Transaction Commit,因此成功
Mapping 不可能指向只创建了一半的 Run。
let runs = DurableAgentRuns::new(store.clone(), executable_registry)?;
let key = AgentSubmissionKey::generate();
let request = DurableAgentAdmissionRequest::new(
tenant_id.clone(),
AgentRunIds::generate(),
agent_descriptor,
agent_request,
evaluated_budget_layers,
graph_reference,
admission_authority,
initial_state,
)?;
let admitted = runs.submit(&key, request).await?;
let run_id = admitted.snapshot().provenance().run_id();
默认 Key 包含 148 位随机量。外部 Key 必须由 [A-Za-z0-9._~-] 中的
16–128 个字节组成,并提供至少 128 位不可预测性。PostgreSQL 只保存 Tenant-scoped
Digest;Raw Key 不进入持久化 Row,也不会出现在 Debug 中。
重试 Logical Content,而不是 Candidate Identity
结果不明时,复用同一 Key 与所有不可变 Logical
Input:Agent、Request、Budget、Graph、 Authorization Evidence 和 Initial
State。新尝试可以重新生成 Run/
// 重建相同 Logical Content;Candidate ID 可以全新生成。
let retry = DurableAgentAdmissionRequest::new(
tenant_id.clone(),
AgentRunIds::generate(),
retained_agent_descriptor,
retained_agent_request,
retained_budget_layers,
retained_graph_reference,
retained_authority,
retained_initial_state,
)?;
let resolved = runs.submit(&key, retry).await?;
assert_eq!(resolved.snapshot().provenance().run_id(), original_run_id);
let current = runs.load_by_key(&tenant_id, &key).await?; Logical Content 变化会返回 Conflict;同一 Run 换第二个 Key 也会 Conflict。完成本地 Deployment 重校验后,持久化 Key Evidence 会先于新的数据库时钟与 Initial-checkpoint Admission Check;有效 Lost-ACK Retry 跨过原 Deadline 后仍只解析到 原 Run,缺少精确 Executable Code 时则 Fail Closed。
轮询封闭的公开 Snapshot
- Observation Identity
-
使用
(run_id, revision);Revision 单调,相同 Revision 表示同一个 Lifecycle Observation。 - Nonterminal State
-
active、waiting与cancellation_requested必须显式返回outcome: null。 - Terminal State
-
succeeded返回经过 Schema 与 Budget 校验的AgentResult;failed与cancelled返回 Public-safe Failure、Completion Time 与累计 Usage。 - Quarantine
- Quarantined Run 仍可观察,但不会被静默表示为可执行工作。
Response 不含 Request Input、Authorization Evidence、Graph State、Lease、Scheduler Internal 或 Private Diagnostic。每次 Load 都会重查不可变 Deployment、Schema、 Admission Anchor、Lifecycle、Provenance、Output 与 Accounting 后再返回。
每次 Lookup 前都先授权
Tenant ID、Run ID 与 Submission Key 是关联 Identity,不是访问凭据。调用
load 或 load_by_key 前先认证并授权 Caller,把 PostgreSQL
Credential 留在可信 Service 内,并转换 Not-found/Conflict Response,避免泄漏
Cross-tenant 资源是否存在。
发布 Migration 16,但不能削弱 Retry
使用独立 Role 执行 Migration,启动时强制校验精确 Checksum 与 Schema Object,再部署冻结 Executable Registry 后开启流量。Client 仍可能 Retry 时绝不能删除 Key Mapping,否则会允许第二个 Run。未来 Retention 必须在 Retry Guarantee 到期后同时移除 Run、Admission 与 Key Evidence。
PostgreSQL 16/17 验证覆盖带数据的 v15→v16 Upgrade、24 路收敛、Changed-content 与 Second-key Conflict、Raw Key 不落库、Tamper 拒绝、晚期 Transaction Rollback,以及通过公开 Facade 验证 Succeeded、Failed 与已确认 Cancelled Result。采用该公共预览 API 前,请阅读完整集成契约。