@yielded/agent-testing 0.1.0-beta.172 → 0.1.0-beta.174

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -319,7 +319,7 @@ const makeCell = Effect.fnUntraced(function* (scenario, slug) {
319
319
  }
320
320
  case "durable-steps": {
321
321
  const binding = Agent.withModel(stepsDefinition, promptShapeModel("certify-steps", "{\"answer\":\"reserved\"}", toolTurn(toolCallPart("itinerary-1", "itinerary", { ref: `trip-${slug}` }))));
322
- const toolLayer = itineraryToolkit.toLayer({ itinerary: ({ ref }) => Effect.gen(function* () {
322
+ const toolLayer = itineraryToolkit.toLayer({ itinerary: Effect.fnUntraced(function* ({ ref }) {
323
323
  const step = yield* DurableStep;
324
324
  return { state: `${yield* step.do("reserve-flight", Schema.String, Effect.succeed(`flight-${ref}`))}+${yield* step.do("reserve-lodging", Schema.String, Effect.succeed(`lodging-${ref}`))}` };
325
325
  }) });
@@ -1 +1 @@
1
- {"version":3,"file":"Certification.mjs","names":["runStorageLayer"],"sources":["../src/internal/certification-report.ts","../src/Certification.ts"],"sourcesContent":["import { CertificationReport } from \"@yielded/agent/testing/certification\";\n\n/** Fold executed results without acquiring adapters or claiming coverage from citations. */\nexport const makeCertificationReport = (\n results: Pick<CertificationReport, \"adapter\" | \"generatedAt\" | \"tier1\" | \"tier2\" | \"tier3\">,\n): CertificationReport => {\n const { adapter, tier1, tier2, tier3 } = results;\n\n const ok =\n tier1.every((result) => result.status === \"passed\") &&\n tier2.every((result) => result.status !== \"failed\") &&\n tier3.cases.every((result) => result.status === \"passed\");\n\n return CertificationReport.make({\n format: \"effect-agent/certification@2\",\n ...results,\n ok,\n fullyCertified:\n ok &&\n adapter.durability !== \"non-durable\" &&\n tier3.status === \"exercised\" &&\n tier3.cases.length > 0 &&\n tier3.cases.every((result) => result.suite === \"real-loss\"),\n });\n};\n","import * as Agent from \"@yielded/agent/agent\";\nimport { AgentPolicy } from \"@yielded/agent/agent-policy\";\nimport { DurableWorkerBinding, type ResolvedBinding } from \"@yielded/agent/agent-registration\";\nimport {\n DurableAgentRuntime,\n DurableRuntimeConfig,\n type DurableSubmitFailure,\n type DurableSubmitOptions,\n type Receipt,\n} from \"@yielded/agent/durable-agent-runtime\";\nimport {\n DurableRuntimeFailpointError,\n DurableRuntimeFailpointLocation,\n} from \"@yielded/agent/durable-failpoint\";\nimport { DurableStep, DurableStepError } from \"@yielded/agent/durable-step\";\nimport { IdGenerator } from \"@yielded/agent/id-generator\";\nimport { ThreadId, RunId, ToolCallId, TurnId, type AgentId } from \"@yielded/agent/identifiers\";\nimport { DefinitionDigests, DeploymentId, Digest, ProducerId } from \"@yielded/agent/records\";\nimport { childThreadIdFor } from \"@yielded/agent/run-journal\";\nimport { RunToolAuthorization } from \"@yielded/agent/run-options\";\nimport { layer as runStorageLayer, type StorageOwner } from \"@yielded/agent/run-storage\";\nimport type { SettlementPublisher } from \"@yielded/agent/settlement-publisher\";\nimport * as Subagent from \"@yielded/agent/subagent\";\nimport { SubagentPolicy } from \"@yielded/agent/subagent\";\nimport { SubagentReservationsMemoryLive } from \"@yielded/agent/subagent-reservations\";\nimport {\n ApprovalDecisionCommand,\n IdempotencyKey,\n Principal,\n ResolutionSafeToRetry,\n SubmissionLedger,\n SubmissionLookupById,\n UnknownResolutionCommand,\n} from \"@yielded/agent/submission-ledger\";\nimport {\n type CertificationCaseResult,\n type CertificationReport,\n CertificationSweepResult,\n CertificationTierThreeReport,\n CertifiedAdapterIdentity,\n certifyPorts,\n type CertificationScenario,\n} from \"@yielded/agent/testing/certification\";\nimport { DurableRuntimeFailpointTestControl } from \"@yielded/agent/testing/durable-failpoint-test-control\";\nimport { ThreadStore, ThreadReader, ThreadStoreError } from \"@yielded/agent/thread-store\";\nimport { ToolReconciler } from \"@yielded/agent/tool-reconciler\";\nimport { WakeScheduler } from \"@yielded/agent/wake-scheduler\";\nimport type { Crypto } from \"effect\";\nimport {\n Cause,\n Clock,\n DateTime,\n Duration,\n Effect,\n Exit,\n Layer,\n Option,\n Ref,\n Schema,\n Stream,\n} from \"effect\";\nimport { LanguageModel, Model, Tool, Toolkit, type Response } from \"effect/ai\";\n\nimport { makeCertificationReport } from \"./internal/certification-report.ts\";\n\n/**\n * P7 WP2 — `certifyDurableAdapters` (plan §1): the one certification entry point a durable\n * adapter pair runs to earn a Schema-encoded certificate.\n *\n * - **Tier 1 — port contract**: the two shared conformance case arrays, verbatim, through\n * `certifyPorts` (TEST-004/STORE-010).\n * - **Tier 2 — coordinator protocol + failpoint convergence**: the durable coordinator is\n * assembled over the CANDIDATE Layer pair with a scripted deterministic model; every\n * reached `DurableRuntimeFailpointLocation` is armed one-shot across the six scenario shapes\n * (plain / uncertain-tool / durable-steps / approval / join / delegation). Unreached locations\n * share a verified clean run per shape; new unaccounted-for locations get a full sweep.\n * After the injected fault the runner asserts the state stays CLASSIFIABLE (recovery +\n * the public unblocking operations `resolveUnknown`/`resolveApproval` are the only levers\n * used) and that the re-drive CONVERGES to `verifyThreadInvariants` with `requireAllSettled`,\n * including schema, identity, order and active state from native paged verification.\n * - **Tier 3 — real loss lever**: recorded honestly. A durable adapter either supplies a\n * `CertificationCrashLever` executed in this run, cites its committed real-loss evidence\n * (process-kill / eviction suites), or the certificate says `not-exercised`. A non-durable\n * reference adapter records `not-applicable`.\n *\n * The runner is adapter-neutral and platform-neutral: it imports nothing Node-only, so the\n * same entry point runs under `@effect/vitest` on Node and inside workerd (storage-cloudflare's\n * in-workerd runner). Tier 1 uses a TestClock to show that elapsed time cannot replace a live\n * owner; only `Crypto.Crypto` is required from the environment.\n */\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\n/**\n * A real-loss lever supplied by an adapter that wants Tier 3 exercised IN this certification\n * run (kill/evict/reopen around a designated row subset). Rows report with\n * `suite: \"real-loss\"`. Failures must be captured per-row — the lever's error channel is\n * `never` so a certificate is always produced.\n */\nexport type CertificationCrashLever = Effect.Effect<ReadonlyArray<CertificationCaseResult>>;\n\nexport interface CertifyDurableAdaptersOptions<LedgerE = never, StoreE = never> {\n /** Adapter pair identity named by the certificate (durability is read from the ledger). */\n readonly adapter: {\n readonly name: string;\n readonly version?: string | undefined;\n };\n /**\n * The candidate Layer pair. The ledger Layer also supplies its co-owned settlement publisher.\n * When both ports must share one connection root (the ADR-0011\n * \"same file\" rule), pass the SAME combined Layer instance for both fields — Layer\n * memoization builds it once. A candidate may require `Crypto.Crypto` (the memory reference\n * does); the certification's own environment supplies nothing else.\n */\n readonly submissionLedger: Layer.Layer<\n SubmissionLedger | SettlementPublisher,\n LedgerE,\n Crypto.Crypto\n >;\n readonly threadStore: Layer.Layer<ThreadStore | StorageOwner, StoreE, Crypto.Crypto>;\n /** Defaults to `WakeScheduler.layerNoop`; the runner re-drives lanes explicitly. */\n readonly wakeScheduler?: Layer.Layer<WakeScheduler> | undefined;\n /** Executes Tier 3 in this run; takes precedence over `tierThreeEvidence`. */\n readonly crashLever?: CertificationCrashLever | undefined;\n /** Repository-relative citations of committed real-loss suites (Tier 3 `recorded-evidence`). */\n readonly tierThreeEvidence?: ReadonlyArray<string> | undefined;\n}\n\n/** The six Tier-2 scenario shapes in sweep order. */\nexport const CERTIFICATION_SCENARIOS: ReadonlyArray<CertificationScenario> = [\n \"plain\",\n \"uncertain-tool\",\n \"durable-steps\",\n \"approval\",\n \"join\",\n \"delegation\",\n];\n\n/**\n * Coordinator failpoint locations that none of the six scenario shapes can reach, recorded\n * honestly instead of silently claimed. These require operator, compaction, reservation,\n * background-worker, or Agent-update paths the shapes do not take. They are pinned in-process\n * by the P5/S2 suites (`packages/testing/test/durable-tools.test.ts` \"resolveUnknown is idempotent across the\n * intent failpoint\", `durable-runtime.test.ts` abort rows,\n * `durable-subagents.test.ts` abort propagation) and by the process-kill/eviction crash\n * matrices. Runner tests assert the observed never-fired set equals EXACTLY this list, so a\n * protocol change that silently stops exercising a location fails the certification.\n */\nexport const TIER2_UNREACHED_LOCATIONS: ReadonlyArray<DurableRuntimeFailpointLocation> = [\n // Active timeout recording is covered before/after append by durable-runtime.test.ts.\n \"run:before-duration-append\",\n \"run:after-duration-append\",\n \"abort:after-intent\",\n // Compaction requires a `contextTokenLimit` policy plus prior-Run history\n // none of the six scenario shapes carries; pinned in-process by the\n // RUN-026 rows in `packages/testing/test/durable-runtime.test.ts`\n // (compaction failpoint idempotence across re-drive).\n \"compaction:before-canonical-append\",\n \"compaction:after-canonical-append\",\n // These shapes use neither programmatic Tools nor grace finalization. Their reservations\n // are exercised before/after append in the public durable-runtime regression suite.\n \"policy:before-reservation-append\",\n \"policy:after-reservation-append\",\n \"resolve:after-intent\",\n // All six shapes retain their original Tool contracts, so none retires an unavailable\n // operation. The deployment continuity matrix in durable-runtime.test.ts exercises the\n // actual before/after-unavailable append boundaries, asserting absent/present canonical\n // ToolUnavailable results at the crash and one original-call settlement after re-drive.\n \"tools:before-unavailable-append\",\n \"tools:after-unavailable-append\",\n \"subagent:after-child-abort-intent\",\n // Background workers use retained delivery, source capacity, and child-origin paths absent\n // from these six attached/ordinary scenarios. The before/after creation and completion\n // boundaries are exercised by packages/effect-agent/test/durable/worker-host.test.ts.\n // Owner-wide stop is absent from these scenarios. The four boundaries and actual storage\n // restart are covered by packages/platform-node/test/background-workers.test.ts.\n \"worker:before-stop-append\",\n \"worker:after-stop-append\",\n \"worker:before-stop-seal\",\n \"worker:after-stop-seal\",\n \"worker:before-source-append\",\n \"worker:after-source-append\",\n \"worker:before-origin-append\",\n \"worker:after-origin-append\",\n \"worker:before-completion-append\",\n \"worker:after-completion-append\",\n // Root attached declarations keep their independent pool; nested shared subtree mutations\n // are covered by the same focused worker-host failpoint suite.\n \"worker:before-subtree-append\",\n \"worker:after-subtree-append\",\n // Automatic report decisions and retained delivery insertion have dedicated worker crash tests.\n \"worker:before-report-append\",\n \"worker:after-report-append\",\n \"worker:before-report-delivery\",\n \"worker:after-report-delivery\",\n // None of the six shapes emits Agent updates. All four boundaries are exercised separately\n // by packages/effect-agent/test/durable/worker-host.test.ts (\"repairs an accepted parent update after ...\").\n // Node restart/lost-ack coverage is in packages/platform-node/test/worker-updates.test.ts;\n // Cloudflare eviction/alarm recovery is in packages/platform-cloudflare/test/background-workers.test.ts.\n // These suites are not executed by this certification runner; its update rows remain not-triggered.\n \"update:before-canonical-append\",\n \"update:after-canonical-append\",\n \"update:before-delivery-insert\",\n \"update:after-delivery-insert\",\n];\n\n/** Locations of `tier2` rows whose armed fault never fired in ANY scenario, sorted. */\nexport const tier2NeverFiredLocations = (\n tier2: ReadonlyArray<CertificationSweepResult>,\n): ReadonlyArray<DurableRuntimeFailpointLocation> => {\n const fired = new Set<DurableRuntimeFailpointLocation>();\n\n for (const row of tier2) {\n if (row.failpointFired) fired.add(row.location);\n }\n\n return DurableRuntimeFailpointLocation.literals.filter((location) => !fired.has(location)).sort();\n};\n\n// ---------------------------------------------------------------------------\n// Deterministic fixtures (scripted prompt-shape models, agents, delegation)\n// ---------------------------------------------------------------------------\n\nconst SHA_A = Schema.decodeSync(Digest)(\"a\".repeat(64));\nconst DIGESTS = DefinitionDigests.make({ agent: SHA_A, model: SHA_A, tools: SHA_A });\n\nconst CHILD_DIGEST_STRINGS = {\n agent: \"b\".repeat(64),\n model: \"c\".repeat(64),\n tools: \"d\".repeat(64),\n} as const;\n\nconst CHILD_DIGESTS = DefinitionDigests.make({\n agent: Schema.decodeSync(Digest)(CHILD_DIGEST_STRINGS.agent),\n model: Schema.decodeSync(Digest)(CHILD_DIGEST_STRINGS.model),\n tools: Schema.decodeSync(Digest)(CHILD_DIGEST_STRINGS.tools),\n});\n\nconst PRINCIPAL = Schema.decodeSync(Principal)(\"principal-certification\");\nconst decodeThreadId = Schema.decodeSync(ThreadId);\nconst decodeIdempotencyKey = Schema.decodeSync(IdempotencyKey);\nconst decodeToolCallId = Schema.decodeSync(ToolCallId);\n\nconst usage = { inputTokens: {}, outputTokens: {} };\n\nconst finalParts = (text: string): ReadonlyArray<Response.StreamPartEncoded> => [\n { type: \"text-start\", id: \"answer\" },\n { type: \"text-delta\", id: \"answer\", delta: text },\n { type: \"text-end\", id: \"answer\" },\n { type: \"finish\", reason: \"stop\", usage },\n];\n\nconst toolCallPart = (id: string, name: string, params: unknown): Response.StreamPartEncoded => ({\n type: \"tool-call\",\n id,\n name,\n params,\n providerExecuted: false,\n});\n\nconst toolTurn = (\n ...calls: ReadonlyArray<Response.StreamPartEncoded>\n): ReadonlyArray<Response.StreamPartEncoded> => [\n ...calls,\n { type: \"finish\", reason: \"tool-calls\", usage },\n];\n\n/**\n * Stateless scripted model that decides by PROMPT SHAPE instead of call count: while the\n * prompt carries no committed tool result the model declares `toolParts` (when given),\n * otherwise it answers with the final text. Deciding on the canonical prompt keeps every cell\n * deterministic regardless of where the injected fault fell — a re-invoked Turn re-declares\n * the same batch and a resumed batch flows into the final answer, so every scenario always\n * exercises its tool path and always converges.\n */\nconst promptShapeModel = (\n name: string,\n finalText: string,\n toolParts?: ReadonlyArray<Response.StreamPartEncoded>,\n) =>\n Model.make(\n \"scripted\",\n name,\n Layer.effect(\n LanguageModel.LanguageModel,\n LanguageModel.make({\n generateText: () => Effect.succeed([]),\n streamText: (request) => {\n const hasToolResult = request.prompt.content.some((message) => message.role === \"tool\");\n\n const parts =\n toolParts === undefined || hasToolResult ? finalParts(finalText) : toolParts;\n\n return Stream.fromIterable(parts);\n },\n }),\n ),\n );\n\n// Tier-2 intentionally advances virtual time past a 30-second ownership lease on every\n// re-drive round. Keep its business-policy duration above the full eight-round sweep so this\n// fixture certifies crash convergence rather than accidentally relying on a fresh duration\n// allowance per replacement Attempt. RUN-030 owns the dedicated duration-expiry coverage.\nconst CERTIFICATION_MAX_DURATION = \"10 minutes\" as const;\n\nconst policy = AgentPolicy.make({\n maxTurns: 4,\n maxToolCalls: 4,\n maxDuration: CERTIFICATION_MAX_DURATION,\n toolConcurrency: 2,\n});\n\nconst QuestionInput = Schema.Struct({ question: Schema.String });\nconst AnswerOutput = Schema.Struct({ answer: Schema.String });\n\n/** plain / join: no tools — the pure Turn/submission/join seams. */\nconst plainDefinition = Agent.make(\"certify-plain\", {\n input: QuestionInput,\n output: AnswerOutput,\n instructions: \"Answer as JSON.\",\n toolkit: Toolkit.empty,\n policy,\n});\n\n/** uncertain-tool: unannotated → fail-closed `uncertain`, enters the prepared/settled protocol. */\nconst Book = Tool.make(\"book\", {\n parameters: Schema.Struct({ ref: Schema.String }),\n success: Schema.Struct({ confirmation: Schema.String }),\n});\n\nconst bookToolkit = Toolkit.make(Book);\n\nconst uncertainDefinition = Agent.make(\"certify-uncertain\", {\n input: QuestionInput,\n output: AnswerOutput,\n instructions: \"Book it.\",\n toolkit: bookToolkit,\n policy,\n});\n\n/** durable-steps: declaring `DurableStep` as a dependency is what makes the Tool durable. */\nconst Itinerary = Tool.make(\"itinerary\", {\n parameters: Schema.Struct({ ref: Schema.String }),\n success: Schema.Struct({ state: Schema.String }),\n failure: DurableStepError,\n dependencies: [DurableStep],\n});\n\nconst itineraryToolkit = Toolkit.make(Itinerary);\n\nconst stepsDefinition = Agent.make(\"certify-steps\", {\n input: QuestionInput,\n output: AnswerOutput,\n instructions: \"Reserve the itinerary.\",\n toolkit: itineraryToolkit,\n policy,\n});\n\n/** approval: fail-closed — no `DurableApprovalResolver` Layer, so undecided approvals suspend. */\nconst BookApproval = Tool.make(\"book\", {\n parameters: Schema.Struct({ ref: Schema.String }),\n success: Schema.Struct({ confirmation: Schema.String }),\n needsApproval: true,\n});\n\nconst approvalToolkit = Toolkit.make(BookApproval);\n\nconst approvalDefinition = Agent.make(\"certify-approval\", {\n input: QuestionInput,\n output: AnswerOutput,\n instructions: \"Book after approval.\",\n toolkit: approvalToolkit,\n policy,\n});\n\n/** delegation: durable attached child plus an ordinary uncertain sibling in ONE batch. */\nconst childDefinition = Agent.make(\"certify-child\", {\n input: QuestionInput,\n output: AnswerOutput,\n instructions: \"Answer as JSON.\",\n toolkit: Toolkit.empty,\n policy: AgentPolicy.make({\n maxTurns: 2,\n maxToolCalls: 1,\n maxDuration: CERTIFICATION_MAX_DURATION,\n toolConcurrency: 1,\n }),\n});\n\nclass CertifyDelegationFailed extends Schema.TaggedError<CertifyDelegationFailed>()(\n \"CertifyDelegationFailed\",\n { childErrorTag: Schema.String },\n) {}\n\nconst researchDelegation = Subagent.make(\"delegate_research\", {\n description: \"Research one bounded question and return findings.\",\n target: childDefinition,\n parameters: Schema.Struct({ topic: Schema.String }),\n success: Schema.Struct({ summary: Schema.String }),\n failure: CertifyDelegationFailed,\n prepareInput: ({ topic }) => Effect.succeed({ question: `research:${topic}` }),\n projectResult: (output) => Effect.succeed({ summary: `finding:${output.answer}` }),\n policy: SubagentPolicy.make({\n maxChildren: 2,\n maxConcurrency: 2,\n maxTurns: 4,\n maxToolCalls: 4,\n maxDuration: CERTIFICATION_MAX_DURATION,\n }),\n});\n\nconst Lookup = Tool.make(\"lookup\", {\n parameters: Schema.Struct({ key: Schema.String }),\n success: Schema.Struct({ value: Schema.String }),\n});\n\nconst coordinatorDefinition = Agent.make(\"certify-coordinator\", {\n input: Schema.Struct({ mission: Schema.String }),\n output: Schema.Struct({ report: Schema.String }),\n instructions: \"Delegate and look up, then answer as JSON.\",\n toolkit: Toolkit.make(researchDelegation.tool, Lookup),\n policy: AgentPolicy.make({\n maxTurns: 4,\n maxToolCalls: 3,\n maxDuration: CERTIFICATION_MAX_DURATION,\n toolConcurrency: 2,\n }),\n});\n\nconst mapChildFailure = (failure: { readonly _tag: string }) =>\n CertifyDelegationFailed.make({ childErrorTag: failure._tag });\n\nconst DELEGATE_CALL = decodeToolCallId(\"delegate-1\");\n\n/** Fixture-only identity source consumed by the delegation Layer's ephemeral capture. */\nconst identifiers = Layer.effect(\n IdGenerator,\n Effect.gen(function* () {\n const counter = yield* Ref.make(0);\n\n const next = <A>(decode: (value: string) => A, prefix: string) =>\n Ref.getAndUpdate(counter, (value) => value + 1).pipe(\n Effect.map((value) => decode(`${prefix}-${value}`)),\n );\n\n return {\n nextThreadId: next(decodeThreadId, \"certify-fixture-thread\"),\n nextRunId: next(Schema.decodeSync(RunId), \"certify-fixture-run\"),\n nextTurnId: next(Schema.decodeSync(TurnId), \"certify-fixture-turn\"),\n };\n }),\n);\n\nconst delegationSupport = Layer.mergeAll(SubagentReservationsMemoryLive, identifiers);\n\n// ---------------------------------------------------------------------------\n// Tier 2 — scenario cells\n// ---------------------------------------------------------------------------\n\ninterface CertificationCell {\n readonly bindings: ReadonlyArray<ResolvedBinding>;\n /** Idempotent submission batch — safe to replay verbatim after a submit-boundary fault. */\n readonly submit: Effect.Effect<ReadonlyArray<Receipt>, DurableSubmitFailure, DurableAgentRuntime>;\n /** All lanes of the cell in drive order, computed from the (possibly replayed) receipts. */\n readonly lanes: (receipts: ReadonlyArray<Receipt>) => ReadonlyArray<ThreadId>;\n}\n\nconst submitOptionsFor = (slug: string, threadId: ThreadId): DurableSubmitOptions => ({\n threadId,\n principal: PRINCIPAL,\n idempotencyKey: decodeIdempotencyKey(`certify-key-${slug}`),\n definitions: DIGESTS,\n});\n\n/** One single-agent cell: one lane, one Submission, one registered exact-digest binding. */\nconst makeSingleAgentCell = (\n definition: { readonly id: AgentId; readonly input: typeof QuestionInput },\n resolved: ResolvedBinding,\n slug: string,\n): CertificationCell => {\n const threadId = decodeThreadId(`certify-${slug}`);\n\n const submit = Effect.gen(function* () {\n const runtime = yield* DurableAgentRuntime;\n\n const receipt = yield* runtime.submit(\n { definition: { id: definition.id, input: definition.input } },\n { question: `certify ${slug}` },\n submitOptionsFor(slug, threadId),\n );\n\n return [receipt];\n });\n\n return {\n bindings: [resolved],\n submit,\n lanes: () => [threadId],\n };\n};\n\nconst makeCell = Effect.fnUntraced(function* (scenario: CertificationScenario, slug: string) {\n switch (scenario) {\n case \"plain\": {\n const binding = Agent.withModel(\n plainDefinition,\n promptShapeModel(\"certify-plain\", '{\"answer\":\"done\"}'),\n );\n\n const resolved = yield* DurableWorkerBinding.make(binding, DIGESTS);\n\n return makeSingleAgentCell(plainDefinition, resolved, slug);\n }\n case \"uncertain-tool\": {\n const binding = Agent.withModel(\n uncertainDefinition,\n promptShapeModel(\n \"certify-uncertain\",\n '{\"answer\":\"booked\"}',\n toolTurn(toolCallPart(\"book-1\", \"book\", { ref: `r-${slug}` })),\n ),\n );\n\n const toolLayer = bookToolkit.toLayer({\n book: ({ ref }) => Effect.succeed({ confirmation: `confirmed-${ref}` }),\n });\n\n const resolved = yield* DurableWorkerBinding.make(binding, DIGESTS).pipe(\n Effect.provide(toolLayer),\n );\n\n return makeSingleAgentCell(uncertainDefinition, resolved, slug);\n }\n case \"durable-steps\": {\n const binding = Agent.withModel(\n stepsDefinition,\n promptShapeModel(\n \"certify-steps\",\n '{\"answer\":\"reserved\"}',\n toolTurn(toolCallPart(\"itinerary-1\", \"itinerary\", { ref: `trip-${slug}` })),\n ),\n );\n\n const toolLayer = itineraryToolkit.toLayer({\n itinerary: ({ ref }) =>\n Effect.gen(function* () {\n const step = yield* DurableStep;\n\n const flight = yield* step.do(\n \"reserve-flight\",\n Schema.String,\n Effect.succeed(`flight-${ref}`),\n );\n\n const lodging = yield* step.do(\n \"reserve-lodging\",\n Schema.String,\n Effect.succeed(`lodging-${ref}`),\n );\n\n return { state: `${flight}+${lodging}` };\n }),\n });\n\n const resolved = yield* DurableWorkerBinding.make(binding, DIGESTS).pipe(\n Effect.provide(toolLayer),\n );\n\n return makeSingleAgentCell(stepsDefinition, resolved, slug);\n }\n case \"approval\": {\n const binding = Agent.withModel(\n approvalDefinition,\n promptShapeModel(\n \"certify-approval\",\n '{\"answer\":\"approved\"}',\n toolTurn(toolCallPart(\"book-1\", \"book\", { ref: `r-${slug}` })),\n ),\n );\n\n const toolLayer = approvalToolkit.toLayer({\n book: ({ ref }) => Effect.succeed({ confirmation: `confirmed-${ref}` }),\n });\n\n const resolved = yield* DurableWorkerBinding.make(binding, DIGESTS).pipe(\n Effect.provide(toolLayer),\n );\n\n return makeSingleAgentCell(approvalDefinition, resolved, slug);\n }\n case \"join\": {\n const binding = Agent.withModel(\n plainDefinition,\n promptShapeModel(\"certify-join\", '{\"answer\":\"host answer\"}'),\n );\n\n const resolved = yield* DurableWorkerBinding.make(binding, DIGESTS);\n const threadId = decodeThreadId(`certify-${slug}`);\n\n const submitOne = Effect.fnUntraced(function* (key: string, question: string) {\n const runtime = yield* DurableAgentRuntime;\n\n return yield* runtime.submit(\n { definition: { id: plainDefinition.id, input: plainDefinition.input } },\n { question },\n {\n threadId,\n principal: PRINCIPAL,\n idempotencyKey: decodeIdempotencyKey(key),\n definitions: DIGESTS,\n },\n );\n });\n\n const cell: CertificationCell = {\n bindings: [resolved],\n submit: Effect.gen(function* () {\n const host = yield* submitOne(`certify-key-${slug}-host`, \"host question\");\n const queued = yield* submitOne(`certify-key-${slug}-queued`, \"queued question\");\n\n return [host, queued];\n }),\n lanes: () => [threadId],\n };\n\n return cell;\n }\n case \"delegation\": {\n const childBinding = Agent.withModel(\n childDefinition,\n promptShapeModel(\"certify-child\", '{\"answer\":\"child-answer\"}'),\n );\n\n const parentBinding = Agent.withModel(\n coordinatorDefinition,\n promptShapeModel(\n \"certify-parent\",\n '{\"report\":\"done\"}',\n toolTurn(\n toolCallPart(\"delegate-1\", \"delegate_research\", { topic: \"paris\" }),\n toolCallPart(\"lookup-1\", \"lookup\", { key: \"hotels\" }),\n ),\n ),\n );\n\n const delegationLayer = Subagent.layer(researchDelegation, childBinding, {\n mapChildFailure,\n durable: { targetDigests: CHILD_DIGEST_STRINGS },\n }).pipe(Layer.provide(delegationSupport));\n\n const lookupLayer = Toolkit.make(Lookup).toLayer({\n lookup: ({ key }) => Effect.succeed({ value: `found-${key}` }),\n });\n\n const parentResolved = yield* DurableWorkerBinding.make(parentBinding, DIGESTS).pipe(\n Effect.provide(Layer.mergeAll(delegationLayer, lookupLayer)),\n );\n\n const childResolved = yield* DurableWorkerBinding.make(childBinding, CHILD_DIGESTS);\n const threadId = decodeThreadId(`certify-${slug}`);\n\n const cell: CertificationCell = {\n bindings: [parentResolved, childResolved],\n submit: Effect.gen(function* () {\n const runtime = yield* DurableAgentRuntime;\n\n const receipt = yield* runtime.submit(\n { definition: { id: coordinatorDefinition.id, input: coordinatorDefinition.input } },\n { mission: \"plan\" },\n submitOptionsFor(slug, threadId),\n );\n\n return [receipt];\n }),\n lanes: (receipts) => {\n const parent = receipts.at(0);\n\n return parent === undefined\n ? [threadId]\n : [threadId, childThreadIdFor(parent.submissionId, DELEGATE_CALL)];\n },\n };\n\n return cell;\n }\n }\n});\n\n/** Maximum recovery/drive/unblock rounds before a cell is reported non-convergent. */\nconst MAX_REDRIVE_ROUNDS = 8;\n\n/**\n * Verify one lane after convergence: canonical export + every lane Submission the ledger or\n * the log names (the same collection rule as the admin `verify` member), fed to the shared\n * invariant checker in convergence mode WITH the captured per-batch producer directory, so\n * retained history and active state are checked.\n */\nconst verifyLane = Effect.fnUntraced(function* (lane: ThreadId) {\n const store = yield* ThreadStore;\n\n if (store.verification === undefined)\n return yield* ThreadStoreError.make({\n operation: \"adapter certification\",\n message: \"The adapter must provide bounded native Thread verification\",\n });\n\n return yield* store.verification.verify({ threadId: lane, requireAllSettled: true });\n});\n\nconst failureTagOf = <E>(cause: Cause.Cause<E>): string => {\n const failure = Cause.findErrorOption(cause);\n\n if (Option.isSome(failure)) {\n const error: unknown = failure.value;\n\n if (typeof error === \"object\" && error !== null && \"_tag\" in error) {\n return String(error._tag);\n }\n\n return String(error).slice(0, 256);\n }\n\n return \"defect\";\n};\n\ntype SweepOutcome = Pick<CertificationSweepResult, \"failpointFired\" | \"status\" | \"detail\">;\n\n/** Discover a clean path, or arm one location; both drives converge and verify real storage. */\nconst runSweepCell = Effect.fnUntraced(function* (\n scenario: CertificationScenario,\n location: DurableRuntimeFailpointLocation | undefined,\n reached: Set<DurableRuntimeFailpointLocation>,\n) {\n const ledger = yield* SubmissionLedger;\n const control = yield* DurableRuntimeFailpointTestControl;\n const slug = `${scenario}-${location?.replaceAll(\":\", \"-\") ?? \"discovery\"}`;\n\n const failed = (detail: string, fired: boolean): SweepOutcome => ({\n failpointFired: fired,\n status: \"failed\",\n detail: detail.slice(0, 4_096),\n });\n\n const cell = yield* makeCell(scenario, slug);\n\n const runtime = yield* DurableAgentRuntime.pipe(\n Effect.provide(\n DurableAgentRuntime.layerWithBindings(cell.bindings).pipe(\n Layer.provide(RunToolAuthorization.allowAll),\n ),\n ),\n );\n\n const submit = cell.submit.pipe(Effect.provideService(DurableAgentRuntime, runtime));\n\n // One-shot arm: the fault fires at most once anywhere in the cell (initial drive OR a\n // re-drive round's public unblocking operation), modelling one crash at this boundary.\n const fired = yield* Ref.make(false);\n\n yield* control.setHandler((hit) =>\n Effect.suspend(() => {\n reached.add(hit);\n\n return hit !== location\n ? Effect.void\n : Ref.getAndSet(fired, true).pipe(\n Effect.flatMap((already) =>\n already\n ? Effect.void\n : Effect.fail(DurableRuntimeFailpointError.make({ location: hit })),\n ),\n );\n }),\n );\n\n // Submissions are idempotent (DUR-001): one replay recovers a submit-boundary fault.\n let receipts: ReadonlyArray<Receipt>;\n const firstSubmit = yield* Effect.exit(submit);\n\n if (Exit.isSuccess(firstSubmit)) {\n receipts = firstSubmit.value;\n } else {\n const secondSubmit = yield* Effect.exit(submit);\n\n if (Exit.isFailure(secondSubmit)) {\n yield* control.clear;\n\n return failed(\n `submission replay did not recover: ${failureTagOf(secondSubmit.cause)}`,\n yield* Ref.get(fired),\n );\n }\n receipts = secondSubmit.value;\n }\n const lanes = cell.lanes(receipts);\n\n const driveLane = (lane: ThreadId) => runtime.processThreadResolved(lane);\n\n const allSettled = Effect.gen(function* () {\n for (const receipt of receipts) {\n const snapshot = yield* ledger.lookup(\n SubmissionLookupById.make({ submissionId: receipt.submissionId }),\n );\n\n if (Option.isNone(snapshot) || snapshot.value.state !== \"settled\") return false;\n }\n\n return true;\n });\n\n // Re-drive to convergence using ONLY public operations: worker drives, recovery passes,\n // and the authorized DUR-017/approval unblocking paths chosen from `explainThread`.\n let converged = false;\n\n for (let round = 0; round < MAX_REDRIVE_ROUNDS && !converged; round++) {\n // A failed drive closes its scoped generation before recovery can select another owner.\n yield* Effect.exit(runtime.runRecovery());\n for (const lane of lanes) {\n yield* Effect.exit(driveLane(lane));\n }\n for (const lane of lanes) {\n const explains = yield* Effect.exit(runtime.explainThread(lane));\n\n if (Exit.isFailure(explains)) continue;\n for (const explanation of explains.value) {\n for (const unknown of explanation.evidence.unknownCalls) {\n if (unknown.resolved) continue;\n yield* Effect.exit(\n runtime.resolveUnknown(\n UnknownResolutionCommand.make({\n submissionId: explanation.submission.submissionId,\n toolCallId: unknown.toolCallId,\n author: \"certification-runner\",\n reason: `re-drive after injected fault at ${location}`,\n resolution: ResolutionSafeToRetry.make(),\n }),\n ),\n );\n }\n for (const pending of explanation.evidence.approvalsPending) {\n const decided = explanation.evidence.approvalDecisions.some(\n (decision) => decision.toolCallId === pending.toolCallId,\n );\n\n if (decided) continue;\n yield* Effect.exit(\n runtime.resolveApproval(\n ApprovalDecisionCommand.make({\n submissionId: explanation.submission.submissionId,\n toolCallId: pending.toolCallId,\n decision: \"approved\",\n resolver: \"certification-runner\",\n reason: `re-drive after injected fault at ${location}`,\n }),\n ),\n );\n }\n }\n }\n const settled = yield* Effect.exit(allSettled);\n\n converged = Exit.isSuccess(settled) && settled.value;\n }\n yield* control.clear;\n const wasFired = yield* Ref.get(fired);\n\n if (!converged) {\n return failed(`did not converge within ${MAX_REDRIVE_ROUNDS} re-drive rounds`, wasFired);\n }\n\n // Every lane must pass retained-history and active-state verification in convergence mode.\n const failedChecks: Array<string> = [];\n\n for (const lane of lanes) {\n const verdict = yield* Effect.exit(verifyLane(lane));\n\n if (Exit.isFailure(verdict)) {\n return failed(`lane ${lane} could not be verified: ${failureTagOf(verdict.cause)}`, wasFired);\n }\n for (const check of verdict.value.checks) {\n if (check.status === \"failed\") {\n failedChecks.push(\n `${lane}:${check.name}${check.detail === undefined ? \"\" : ` (${check.detail})`}`,\n );\n }\n }\n }\n if (failedChecks.length > 0) {\n return failed(`invariant checks failed: ${failedChecks.join(\"; \")}`, wasFired);\n }\n\n return {\n failpointFired: wasFired,\n status: wasFired ? \"converged\" : \"not-triggered\",\n } satisfies SweepOutcome;\n});\n\n// ---------------------------------------------------------------------------\n// Tier 3 — real loss lever record\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the Tier-3 record honestly (plan §1): a non-durable reference adapter has no real\n * loss to exercise (`not-applicable`); a supplied lever runs NOW (`exercised`); committed\n * real-loss citations are recorded (`recorded-evidence`); otherwise the certificate says\n * `not-exercised` — a scoped statement, never a silent claim.\n */\nexport const resolveTierThree = Effect.fnUntraced(function* (\n durability: CertifiedAdapterIdentity[\"durability\"],\n options: {\n readonly crashLever?: CertificationCrashLever | undefined;\n readonly tierThreeEvidence?: ReadonlyArray<string> | undefined;\n },\n): Effect.fn.Return<CertificationTierThreeReport, never> {\n if (durability === \"non-durable\") {\n return CertificationTierThreeReport.make({\n status: \"not-applicable\",\n evidence: [],\n cases: [],\n detail:\n \"the adapter declares non-durable state (reference/conformance adapter); there is no real loss to exercise\",\n });\n }\n if (options.crashLever !== undefined) {\n const cases = yield* options.crashLever;\n\n return CertificationTierThreeReport.make({\n status: cases.length === 0 ? \"not-exercised\" : \"exercised\",\n evidence: options.tierThreeEvidence ?? [],\n cases,\n ...(cases.length === 0\n ? { detail: \"the supplied crash lever executed no real-loss cases\" }\n : {}),\n });\n }\n if (options.tierThreeEvidence !== undefined && options.tierThreeEvidence.length > 0) {\n return CertificationTierThreeReport.make({\n status: \"recorded-evidence\",\n evidence: options.tierThreeEvidence,\n cases: [],\n });\n }\n\n return CertificationTierThreeReport.make({\n status: \"not-exercised\",\n evidence: [],\n cases: [],\n detail:\n \"no crash lever was supplied and no committed real-loss evidence was cited; Tier 3 is NOT discharged for this adapter\",\n });\n});\n\n// ---------------------------------------------------------------------------\n// Entry point\n// ---------------------------------------------------------------------------\n\nconst nowUtc: Effect.Effect<DateTime.Utc> = Effect.map(Clock.currentTimeMillis, (millis) =>\n DateTime.toUtc(DateTime.makeUnsafe(millis)),\n);\n\n/**\n * Certify one durable adapter pair (plan §1, §8 WP2). Runs Tier 2 FIRST over pristine\n * storage (each cell converges to all-settled before the next starts, so the recovery scan\n * never sees foreign leftovers), then Tier 1's port contract cases (whose lanes deliberately\n * end in every nonterminal shape), then records Tier 3. Requires `Crypto.Crypto` and a\n * TestClock-backed environment; the candidate Layers are built exactly once.\n */\nexport const certifyDurableAdapters = <LedgerE = never, StoreE = never>(\n options: CertifyDurableAdaptersOptions<LedgerE, StoreE>,\n): Effect.Effect<CertificationReport, LedgerE | StoreE, Crypto.Crypto> => {\n // RUN-036: certification uses the default-none Tool failure observer. Trusted application\n // reporting adds no durable transition and is verified separately from adapter certification.\n const environment = Layer.mergeAll(runStorageLayer(), ThreadReader.layer()).pipe(\n Layer.provideMerge(\n Layer.mergeAll(\n options.submissionLedger,\n options.threadStore,\n options.wakeScheduler ?? WakeScheduler.layerNoop,\n DurableRuntimeFailpointTestControl.layer,\n ToolReconciler.uncertain,\n DurableRuntimeConfig.layer({\n deploymentId: Schema.decodeSync(DeploymentId)(\"deployment-certification\"),\n producerId: Schema.decodeSync(ProducerId)(\"producer-certification\"),\n settlementPollInterval: Duration.millis(50),\n abortPollInterval: Duration.millis(50),\n }),\n ),\n ),\n );\n\n const program = Effect.gen(function* () {\n const ledger = yield* SubmissionLedger;\n\n // Tier 2 — discover each deterministic shape without a fault. Unreached locations\n // would all repeat this same clean drive, including its full invariant verification.\n const tier2: Array<CertificationSweepResult> = [];\n\n const discoveries: Array<{\n readonly scenario: CertificationScenario;\n readonly outcome: SweepOutcome;\n readonly reached: Set<DurableRuntimeFailpointLocation>;\n }> = [];\n\n for (const scenario of CERTIFICATION_SCENARIOS) {\n const reached = new Set<DurableRuntimeFailpointLocation>();\n\n const outcome = yield* runSweepCell(scenario, undefined, reached);\n\n discoveries.push({ scenario, outcome, reached });\n }\n const observed = new Set(discoveries.flatMap(({ reached }) => [...reached]));\n\n // Never silently omit a new location: if neither discovery nor the documented\n // never-fired set accounts for it, arm it in EVERY shape. Tests pin the fired paths\n // per shape and the never-fired set, so new or lost routes require explicit review.\n const unaccounted = new Set(\n DurableRuntimeFailpointLocation.literals.filter(\n (location) => !observed.has(location) && !TIER2_UNREACHED_LOCATIONS.includes(location),\n ),\n );\n\n for (const discovery of discoveries) {\n const { scenario, reached } = discovery;\n const outcomes = new Map<DurableRuntimeFailpointLocation, SweepOutcome>();\n\n if (discovery.outcome.status !== \"failed\") {\n while (true) {\n // Recovery may expose another route. Discover those too, without re-running a\n // cell already checked. Schema order bounds this to one drive per location.\n const location = DurableRuntimeFailpointLocation.literals.find(\n (candidate) =>\n !outcomes.has(candidate) && (reached.has(candidate) || unaccounted.has(candidate)),\n );\n\n if (location === undefined) break;\n outcomes.set(location, yield* runSweepCell(scenario, location, reached));\n }\n }\n for (const location of DurableRuntimeFailpointLocation.literals) {\n const outcome = outcomes.get(location) ?? discovery.outcome;\n\n tier2.push(\n CertificationSweepResult.make({\n scenario,\n location,\n ...outcome,\n ...(outcomes.has(location) || outcome.status === \"failed\"\n ? {}\n : { detail: \"verified clean scenario did not reach this location\" }),\n }),\n );\n }\n }\n\n // Tier 1 — the shared port contract suites, verbatim.\n const tier1 = yield* certifyPorts();\n\n // Tier 3 — the real loss lever record.\n const capabilities = yield* ledger.capabilities;\n const tier3 = yield* resolveTierThree(capabilities.durability, options);\n\n const generatedAt = yield* nowUtc;\n\n return makeCertificationReport({\n adapter: CertifiedAdapterIdentity.make({\n name: options.adapter.name,\n ...(options.adapter.version === undefined ? {} : { version: options.adapter.version }),\n durability: capabilities.durability,\n }),\n generatedAt,\n tier1,\n tier2,\n tier3,\n });\n });\n\n return program.pipe(Effect.provide(environment));\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"Certification.mjs","names":["runStorageLayer"],"sources":["../src/internal/certification-report.ts","../src/Certification.ts"],"sourcesContent":["import { CertificationReport } from \"@yielded/agent/testing/certification\";\n\n/** Fold executed results without acquiring adapters or claiming coverage from citations. */\nexport const makeCertificationReport = (\n results: Pick<CertificationReport, \"adapter\" | \"generatedAt\" | \"tier1\" | \"tier2\" | \"tier3\">,\n): CertificationReport => {\n const { adapter, tier1, tier2, tier3 } = results;\n\n const ok =\n tier1.every((result) => result.status === \"passed\") &&\n tier2.every((result) => result.status !== \"failed\") &&\n tier3.cases.every((result) => result.status === \"passed\");\n\n return CertificationReport.make({\n format: \"effect-agent/certification@2\",\n ...results,\n ok,\n fullyCertified:\n ok &&\n adapter.durability !== \"non-durable\" &&\n tier3.status === \"exercised\" &&\n tier3.cases.length > 0 &&\n tier3.cases.every((result) => result.suite === \"real-loss\"),\n });\n};\n","import * as Agent from \"@yielded/agent/agent\";\nimport { AgentPolicy } from \"@yielded/agent/agent-policy\";\nimport { DurableWorkerBinding, type ResolvedBinding } from \"@yielded/agent/agent-registration\";\nimport {\n DurableAgentRuntime,\n DurableRuntimeConfig,\n type DurableSubmitFailure,\n type DurableSubmitOptions,\n type Receipt,\n} from \"@yielded/agent/durable-agent-runtime\";\nimport {\n DurableRuntimeFailpointError,\n DurableRuntimeFailpointLocation,\n} from \"@yielded/agent/durable-failpoint\";\nimport { DurableStep, DurableStepError } from \"@yielded/agent/durable-step\";\nimport { IdGenerator } from \"@yielded/agent/id-generator\";\nimport { ThreadId, RunId, ToolCallId, TurnId, type AgentId } from \"@yielded/agent/identifiers\";\nimport { DefinitionDigests, DeploymentId, Digest, ProducerId } from \"@yielded/agent/records\";\nimport { childThreadIdFor } from \"@yielded/agent/run-journal\";\nimport { RunToolAuthorization } from \"@yielded/agent/run-options\";\nimport { layer as runStorageLayer, type StorageOwner } from \"@yielded/agent/run-storage\";\nimport type { SettlementPublisher } from \"@yielded/agent/settlement-publisher\";\nimport * as Subagent from \"@yielded/agent/subagent\";\nimport { SubagentPolicy } from \"@yielded/agent/subagent\";\nimport { SubagentReservationsMemoryLive } from \"@yielded/agent/subagent-reservations\";\nimport {\n ApprovalDecisionCommand,\n IdempotencyKey,\n Principal,\n ResolutionSafeToRetry,\n SubmissionLedger,\n SubmissionLookupById,\n UnknownResolutionCommand,\n} from \"@yielded/agent/submission-ledger\";\nimport {\n type CertificationCaseResult,\n type CertificationReport,\n CertificationSweepResult,\n CertificationTierThreeReport,\n CertifiedAdapterIdentity,\n certifyPorts,\n type CertificationScenario,\n} from \"@yielded/agent/testing/certification\";\nimport { DurableRuntimeFailpointTestControl } from \"@yielded/agent/testing/durable-failpoint-test-control\";\nimport { ThreadStore, ThreadReader, ThreadStoreError } from \"@yielded/agent/thread-store\";\nimport { ToolReconciler } from \"@yielded/agent/tool-reconciler\";\nimport { WakeScheduler } from \"@yielded/agent/wake-scheduler\";\nimport type { Crypto } from \"effect\";\nimport {\n Cause,\n Clock,\n DateTime,\n Duration,\n Effect,\n Exit,\n Layer,\n Option,\n Ref,\n Schema,\n Stream,\n} from \"effect\";\nimport { LanguageModel, Model, Tool, Toolkit, type Response } from \"effect/ai\";\n\nimport { makeCertificationReport } from \"./internal/certification-report.ts\";\n\n/**\n * P7 WP2 — `certifyDurableAdapters` (plan §1): the one certification entry point a durable\n * adapter pair runs to earn a Schema-encoded certificate.\n *\n * - **Tier 1 — port contract**: the two shared conformance case arrays, verbatim, through\n * `certifyPorts` (TEST-004/STORE-010).\n * - **Tier 2 — coordinator protocol + failpoint convergence**: the durable coordinator is\n * assembled over the CANDIDATE Layer pair with a scripted deterministic model; every\n * reached `DurableRuntimeFailpointLocation` is armed one-shot across the six scenario shapes\n * (plain / uncertain-tool / durable-steps / approval / join / delegation). Unreached locations\n * share a verified clean run per shape; new unaccounted-for locations get a full sweep.\n * After the injected fault the runner asserts the state stays CLASSIFIABLE (recovery +\n * the public unblocking operations `resolveUnknown`/`resolveApproval` are the only levers\n * used) and that the re-drive CONVERGES to `verifyThreadInvariants` with `requireAllSettled`,\n * including schema, identity, order and active state from native paged verification.\n * - **Tier 3 — real loss lever**: recorded honestly. A durable adapter either supplies a\n * `CertificationCrashLever` executed in this run, cites its committed real-loss evidence\n * (process-kill / eviction suites), or the certificate says `not-exercised`. A non-durable\n * reference adapter records `not-applicable`.\n *\n * The runner is adapter-neutral and platform-neutral: it imports nothing Node-only, so the\n * same entry point runs under `@effect/vitest` on Node and inside workerd (storage-cloudflare's\n * in-workerd runner). Tier 1 uses a TestClock to show that elapsed time cannot replace a live\n * owner; only `Crypto.Crypto` is required from the environment.\n */\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\n/**\n * A real-loss lever supplied by an adapter that wants Tier 3 exercised IN this certification\n * run (kill/evict/reopen around a designated row subset). Rows report with\n * `suite: \"real-loss\"`. Failures must be captured per-row — the lever's error channel is\n * `never` so a certificate is always produced.\n */\nexport type CertificationCrashLever = Effect.Effect<ReadonlyArray<CertificationCaseResult>>;\n\nexport interface CertifyDurableAdaptersOptions<LedgerE = never, StoreE = never> {\n /** Adapter pair identity named by the certificate (durability is read from the ledger). */\n readonly adapter: {\n readonly name: string;\n readonly version?: string | undefined;\n };\n /**\n * The candidate Layer pair. The ledger Layer also supplies its co-owned settlement publisher.\n * When both ports must share one connection root (the ADR-0011\n * \"same file\" rule), pass the SAME combined Layer instance for both fields — Layer\n * memoization builds it once. A candidate may require `Crypto.Crypto` (the memory reference\n * does); the certification's own environment supplies nothing else.\n */\n readonly submissionLedger: Layer.Layer<\n SubmissionLedger | SettlementPublisher,\n LedgerE,\n Crypto.Crypto\n >;\n readonly threadStore: Layer.Layer<ThreadStore | StorageOwner, StoreE, Crypto.Crypto>;\n /** Defaults to `WakeScheduler.layerNoop`; the runner re-drives lanes explicitly. */\n readonly wakeScheduler?: Layer.Layer<WakeScheduler> | undefined;\n /** Executes Tier 3 in this run; takes precedence over `tierThreeEvidence`. */\n readonly crashLever?: CertificationCrashLever | undefined;\n /** Repository-relative citations of committed real-loss suites (Tier 3 `recorded-evidence`). */\n readonly tierThreeEvidence?: ReadonlyArray<string> | undefined;\n}\n\n/** The six Tier-2 scenario shapes in sweep order. */\nexport const CERTIFICATION_SCENARIOS: ReadonlyArray<CertificationScenario> = [\n \"plain\",\n \"uncertain-tool\",\n \"durable-steps\",\n \"approval\",\n \"join\",\n \"delegation\",\n];\n\n/**\n * Coordinator failpoint locations that none of the six scenario shapes can reach, recorded\n * honestly instead of silently claimed. These require operator, compaction, reservation,\n * background-worker, or Agent-update paths the shapes do not take. They are pinned in-process\n * by the P5/S2 suites (`packages/testing/test/durable-tools.test.ts` \"resolveUnknown is idempotent across the\n * intent failpoint\", `durable-runtime.test.ts` abort rows,\n * `durable-subagents.test.ts` abort propagation) and by the process-kill/eviction crash\n * matrices. Runner tests assert the observed never-fired set equals EXACTLY this list, so a\n * protocol change that silently stops exercising a location fails the certification.\n */\nexport const TIER2_UNREACHED_LOCATIONS: ReadonlyArray<DurableRuntimeFailpointLocation> = [\n // Active timeout recording is covered before/after append by durable-runtime.test.ts.\n \"run:before-duration-append\",\n \"run:after-duration-append\",\n \"abort:after-intent\",\n // Compaction requires a `contextTokenLimit` policy plus prior-Run history\n // none of the six scenario shapes carries; pinned in-process by the\n // RUN-026 rows in `packages/testing/test/durable-runtime.test.ts`\n // (compaction failpoint idempotence across re-drive).\n \"compaction:before-canonical-append\",\n \"compaction:after-canonical-append\",\n // These shapes use neither programmatic Tools nor grace finalization. Their reservations\n // are exercised before/after append in the public durable-runtime regression suite.\n \"policy:before-reservation-append\",\n \"policy:after-reservation-append\",\n \"resolve:after-intent\",\n // All six shapes retain their original Tool contracts, so none retires an unavailable\n // operation. The deployment continuity matrix in durable-runtime.test.ts exercises the\n // actual before/after-unavailable append boundaries, asserting absent/present canonical\n // ToolUnavailable results at the crash and one original-call settlement after re-drive.\n \"tools:before-unavailable-append\",\n \"tools:after-unavailable-append\",\n \"subagent:after-child-abort-intent\",\n // Background workers use retained delivery, source capacity, and child-origin paths absent\n // from these six attached/ordinary scenarios. The before/after creation and completion\n // boundaries are exercised by packages/effect-agent/test/durable/worker-host.test.ts.\n // Owner-wide stop is absent from these scenarios. The four boundaries and actual storage\n // restart are covered by packages/platform-node/test/background-workers.test.ts.\n \"worker:before-stop-append\",\n \"worker:after-stop-append\",\n \"worker:before-stop-seal\",\n \"worker:after-stop-seal\",\n \"worker:before-source-append\",\n \"worker:after-source-append\",\n \"worker:before-origin-append\",\n \"worker:after-origin-append\",\n \"worker:before-completion-append\",\n \"worker:after-completion-append\",\n // Root attached declarations keep their independent pool; nested shared subtree mutations\n // are covered by the same focused worker-host failpoint suite.\n \"worker:before-subtree-append\",\n \"worker:after-subtree-append\",\n // Automatic report decisions and retained delivery insertion have dedicated worker crash tests.\n \"worker:before-report-append\",\n \"worker:after-report-append\",\n \"worker:before-report-delivery\",\n \"worker:after-report-delivery\",\n // None of the six shapes emits Agent updates. All four boundaries are exercised separately\n // by packages/effect-agent/test/durable/worker-host.test.ts (\"repairs an accepted parent update after ...\").\n // Node restart/lost-ack coverage is in packages/platform-node/test/worker-updates.test.ts;\n // Cloudflare eviction/alarm recovery is in packages/platform-cloudflare/test/background-workers.test.ts.\n // These suites are not executed by this certification runner; its update rows remain not-triggered.\n \"update:before-canonical-append\",\n \"update:after-canonical-append\",\n \"update:before-delivery-insert\",\n \"update:after-delivery-insert\",\n];\n\n/** Locations of `tier2` rows whose armed fault never fired in ANY scenario, sorted. */\nexport const tier2NeverFiredLocations = (\n tier2: ReadonlyArray<CertificationSweepResult>,\n): ReadonlyArray<DurableRuntimeFailpointLocation> => {\n const fired = new Set<DurableRuntimeFailpointLocation>();\n\n for (const row of tier2) {\n if (row.failpointFired) fired.add(row.location);\n }\n\n return DurableRuntimeFailpointLocation.literals.filter((location) => !fired.has(location)).sort();\n};\n\n// ---------------------------------------------------------------------------\n// Deterministic fixtures (scripted prompt-shape models, agents, delegation)\n// ---------------------------------------------------------------------------\n\nconst SHA_A = Schema.decodeSync(Digest)(\"a\".repeat(64));\nconst DIGESTS = DefinitionDigests.make({ agent: SHA_A, model: SHA_A, tools: SHA_A });\n\nconst CHILD_DIGEST_STRINGS = {\n agent: \"b\".repeat(64),\n model: \"c\".repeat(64),\n tools: \"d\".repeat(64),\n} as const;\n\nconst CHILD_DIGESTS = DefinitionDigests.make({\n agent: Schema.decodeSync(Digest)(CHILD_DIGEST_STRINGS.agent),\n model: Schema.decodeSync(Digest)(CHILD_DIGEST_STRINGS.model),\n tools: Schema.decodeSync(Digest)(CHILD_DIGEST_STRINGS.tools),\n});\n\nconst PRINCIPAL = Schema.decodeSync(Principal)(\"principal-certification\");\nconst decodeThreadId = Schema.decodeSync(ThreadId);\nconst decodeIdempotencyKey = Schema.decodeSync(IdempotencyKey);\nconst decodeToolCallId = Schema.decodeSync(ToolCallId);\n\nconst usage = { inputTokens: {}, outputTokens: {} };\n\nconst finalParts = (text: string): ReadonlyArray<Response.StreamPartEncoded> => [\n { type: \"text-start\", id: \"answer\" },\n { type: \"text-delta\", id: \"answer\", delta: text },\n { type: \"text-end\", id: \"answer\" },\n { type: \"finish\", reason: \"stop\", usage },\n];\n\nconst toolCallPart = (id: string, name: string, params: unknown): Response.StreamPartEncoded => ({\n type: \"tool-call\",\n id,\n name,\n params,\n providerExecuted: false,\n});\n\nconst toolTurn = (\n ...calls: ReadonlyArray<Response.StreamPartEncoded>\n): ReadonlyArray<Response.StreamPartEncoded> => [\n ...calls,\n { type: \"finish\", reason: \"tool-calls\", usage },\n];\n\n/**\n * Stateless scripted model that decides by PROMPT SHAPE instead of call count: while the\n * prompt carries no committed tool result the model declares `toolParts` (when given),\n * otherwise it answers with the final text. Deciding on the canonical prompt keeps every cell\n * deterministic regardless of where the injected fault fell — a re-invoked Turn re-declares\n * the same batch and a resumed batch flows into the final answer, so every scenario always\n * exercises its tool path and always converges.\n */\nconst promptShapeModel = (\n name: string,\n finalText: string,\n toolParts?: ReadonlyArray<Response.StreamPartEncoded>,\n) =>\n Model.make(\n \"scripted\",\n name,\n Layer.effect(\n LanguageModel.LanguageModel,\n LanguageModel.make({\n generateText: () => Effect.succeed([]),\n streamText: (request) => {\n const hasToolResult = request.prompt.content.some((message) => message.role === \"tool\");\n\n const parts =\n toolParts === undefined || hasToolResult ? finalParts(finalText) : toolParts;\n\n return Stream.fromIterable(parts);\n },\n }),\n ),\n );\n\n// Tier-2 intentionally advances virtual time past a 30-second ownership lease on every\n// re-drive round. Keep its business-policy duration above the full eight-round sweep so this\n// fixture certifies crash convergence rather than accidentally relying on a fresh duration\n// allowance per replacement Attempt. RUN-030 owns the dedicated duration-expiry coverage.\nconst CERTIFICATION_MAX_DURATION = \"10 minutes\" as const;\n\nconst policy = AgentPolicy.make({\n maxTurns: 4,\n maxToolCalls: 4,\n maxDuration: CERTIFICATION_MAX_DURATION,\n toolConcurrency: 2,\n});\n\nconst QuestionInput = Schema.Struct({ question: Schema.String });\nconst AnswerOutput = Schema.Struct({ answer: Schema.String });\n\n/** plain / join: no tools — the pure Turn/submission/join seams. */\nconst plainDefinition = Agent.make(\"certify-plain\", {\n input: QuestionInput,\n output: AnswerOutput,\n instructions: \"Answer as JSON.\",\n toolkit: Toolkit.empty,\n policy,\n});\n\n/** uncertain-tool: unannotated → fail-closed `uncertain`, enters the prepared/settled protocol. */\nconst Book = Tool.make(\"book\", {\n parameters: Schema.Struct({ ref: Schema.String }),\n success: Schema.Struct({ confirmation: Schema.String }),\n});\n\nconst bookToolkit = Toolkit.make(Book);\n\nconst uncertainDefinition = Agent.make(\"certify-uncertain\", {\n input: QuestionInput,\n output: AnswerOutput,\n instructions: \"Book it.\",\n toolkit: bookToolkit,\n policy,\n});\n\n/** durable-steps: declaring `DurableStep` as a dependency is what makes the Tool durable. */\nconst Itinerary = Tool.make(\"itinerary\", {\n parameters: Schema.Struct({ ref: Schema.String }),\n success: Schema.Struct({ state: Schema.String }),\n failure: DurableStepError,\n dependencies: [DurableStep],\n});\n\nconst itineraryToolkit = Toolkit.make(Itinerary);\n\nconst stepsDefinition = Agent.make(\"certify-steps\", {\n input: QuestionInput,\n output: AnswerOutput,\n instructions: \"Reserve the itinerary.\",\n toolkit: itineraryToolkit,\n policy,\n});\n\n/** approval: fail-closed — no `DurableApprovalResolver` Layer, so undecided approvals suspend. */\nconst BookApproval = Tool.make(\"book\", {\n parameters: Schema.Struct({ ref: Schema.String }),\n success: Schema.Struct({ confirmation: Schema.String }),\n needsApproval: true,\n});\n\nconst approvalToolkit = Toolkit.make(BookApproval);\n\nconst approvalDefinition = Agent.make(\"certify-approval\", {\n input: QuestionInput,\n output: AnswerOutput,\n instructions: \"Book after approval.\",\n toolkit: approvalToolkit,\n policy,\n});\n\n/** delegation: durable attached child plus an ordinary uncertain sibling in ONE batch. */\nconst childDefinition = Agent.make(\"certify-child\", {\n input: QuestionInput,\n output: AnswerOutput,\n instructions: \"Answer as JSON.\",\n toolkit: Toolkit.empty,\n policy: AgentPolicy.make({\n maxTurns: 2,\n maxToolCalls: 1,\n maxDuration: CERTIFICATION_MAX_DURATION,\n toolConcurrency: 1,\n }),\n});\n\nclass CertifyDelegationFailed extends Schema.TaggedError<CertifyDelegationFailed>()(\n \"CertifyDelegationFailed\",\n { childErrorTag: Schema.String },\n) {}\n\nconst researchDelegation = Subagent.make(\"delegate_research\", {\n description: \"Research one bounded question and return findings.\",\n target: childDefinition,\n parameters: Schema.Struct({ topic: Schema.String }),\n success: Schema.Struct({ summary: Schema.String }),\n failure: CertifyDelegationFailed,\n prepareInput: ({ topic }) => Effect.succeed({ question: `research:${topic}` }),\n projectResult: (output) => Effect.succeed({ summary: `finding:${output.answer}` }),\n policy: SubagentPolicy.make({\n maxChildren: 2,\n maxConcurrency: 2,\n maxTurns: 4,\n maxToolCalls: 4,\n maxDuration: CERTIFICATION_MAX_DURATION,\n }),\n});\n\nconst Lookup = Tool.make(\"lookup\", {\n parameters: Schema.Struct({ key: Schema.String }),\n success: Schema.Struct({ value: Schema.String }),\n});\n\nconst coordinatorDefinition = Agent.make(\"certify-coordinator\", {\n input: Schema.Struct({ mission: Schema.String }),\n output: Schema.Struct({ report: Schema.String }),\n instructions: \"Delegate and look up, then answer as JSON.\",\n toolkit: Toolkit.make(researchDelegation.tool, Lookup),\n policy: AgentPolicy.make({\n maxTurns: 4,\n maxToolCalls: 3,\n maxDuration: CERTIFICATION_MAX_DURATION,\n toolConcurrency: 2,\n }),\n});\n\nconst mapChildFailure = (failure: { readonly _tag: string }) =>\n CertifyDelegationFailed.make({ childErrorTag: failure._tag });\n\nconst DELEGATE_CALL = decodeToolCallId(\"delegate-1\");\n\n/** Fixture-only identity source consumed by the delegation Layer's ephemeral capture. */\nconst identifiers = Layer.effect(\n IdGenerator,\n Effect.gen(function* () {\n const counter = yield* Ref.make(0);\n\n const next = <A>(decode: (value: string) => A, prefix: string) =>\n Ref.getAndUpdate(counter, (value) => value + 1).pipe(\n Effect.map((value) => decode(`${prefix}-${value}`)),\n );\n\n return {\n nextThreadId: next(decodeThreadId, \"certify-fixture-thread\"),\n nextRunId: next(Schema.decodeSync(RunId), \"certify-fixture-run\"),\n nextTurnId: next(Schema.decodeSync(TurnId), \"certify-fixture-turn\"),\n };\n }),\n);\n\nconst delegationSupport = Layer.mergeAll(SubagentReservationsMemoryLive, identifiers);\n\n// ---------------------------------------------------------------------------\n// Tier 2 — scenario cells\n// ---------------------------------------------------------------------------\n\ninterface CertificationCell {\n readonly bindings: ReadonlyArray<ResolvedBinding>;\n /** Idempotent submission batch — safe to replay verbatim after a submit-boundary fault. */\n readonly submit: Effect.Effect<ReadonlyArray<Receipt>, DurableSubmitFailure, DurableAgentRuntime>;\n /** All lanes of the cell in drive order, computed from the (possibly replayed) receipts. */\n readonly lanes: (receipts: ReadonlyArray<Receipt>) => ReadonlyArray<ThreadId>;\n}\n\nconst submitOptionsFor = (slug: string, threadId: ThreadId): DurableSubmitOptions => ({\n threadId,\n principal: PRINCIPAL,\n idempotencyKey: decodeIdempotencyKey(`certify-key-${slug}`),\n definitions: DIGESTS,\n});\n\n/** One single-agent cell: one lane, one Submission, one registered exact-digest binding. */\nconst makeSingleAgentCell = (\n definition: { readonly id: AgentId; readonly input: typeof QuestionInput },\n resolved: ResolvedBinding,\n slug: string,\n): CertificationCell => {\n const threadId = decodeThreadId(`certify-${slug}`);\n\n const submit = Effect.gen(function* () {\n const runtime = yield* DurableAgentRuntime;\n\n const receipt = yield* runtime.submit(\n { definition: { id: definition.id, input: definition.input } },\n { question: `certify ${slug}` },\n submitOptionsFor(slug, threadId),\n );\n\n return [receipt];\n });\n\n return {\n bindings: [resolved],\n submit,\n lanes: () => [threadId],\n };\n};\n\nconst makeCell = Effect.fnUntraced(function* (scenario: CertificationScenario, slug: string) {\n switch (scenario) {\n case \"plain\": {\n const binding = Agent.withModel(\n plainDefinition,\n promptShapeModel(\"certify-plain\", '{\"answer\":\"done\"}'),\n );\n\n const resolved = yield* DurableWorkerBinding.make(binding, DIGESTS);\n\n return makeSingleAgentCell(plainDefinition, resolved, slug);\n }\n case \"uncertain-tool\": {\n const binding = Agent.withModel(\n uncertainDefinition,\n promptShapeModel(\n \"certify-uncertain\",\n '{\"answer\":\"booked\"}',\n toolTurn(toolCallPart(\"book-1\", \"book\", { ref: `r-${slug}` })),\n ),\n );\n\n const toolLayer = bookToolkit.toLayer({\n book: ({ ref }) => Effect.succeed({ confirmation: `confirmed-${ref}` }),\n });\n\n const resolved = yield* DurableWorkerBinding.make(binding, DIGESTS).pipe(\n Effect.provide(toolLayer),\n );\n\n return makeSingleAgentCell(uncertainDefinition, resolved, slug);\n }\n case \"durable-steps\": {\n const binding = Agent.withModel(\n stepsDefinition,\n promptShapeModel(\n \"certify-steps\",\n '{\"answer\":\"reserved\"}',\n toolTurn(toolCallPart(\"itinerary-1\", \"itinerary\", { ref: `trip-${slug}` })),\n ),\n );\n\n const toolLayer = itineraryToolkit.toLayer({\n itinerary: Effect.fnUntraced(function* ({ ref }) {\n const step = yield* DurableStep;\n\n const flight = yield* step.do(\n \"reserve-flight\",\n Schema.String,\n Effect.succeed(`flight-${ref}`),\n );\n\n const lodging = yield* step.do(\n \"reserve-lodging\",\n Schema.String,\n Effect.succeed(`lodging-${ref}`),\n );\n\n return { state: `${flight}+${lodging}` };\n }),\n });\n\n const resolved = yield* DurableWorkerBinding.make(binding, DIGESTS).pipe(\n Effect.provide(toolLayer),\n );\n\n return makeSingleAgentCell(stepsDefinition, resolved, slug);\n }\n case \"approval\": {\n const binding = Agent.withModel(\n approvalDefinition,\n promptShapeModel(\n \"certify-approval\",\n '{\"answer\":\"approved\"}',\n toolTurn(toolCallPart(\"book-1\", \"book\", { ref: `r-${slug}` })),\n ),\n );\n\n const toolLayer = approvalToolkit.toLayer({\n book: ({ ref }) => Effect.succeed({ confirmation: `confirmed-${ref}` }),\n });\n\n const resolved = yield* DurableWorkerBinding.make(binding, DIGESTS).pipe(\n Effect.provide(toolLayer),\n );\n\n return makeSingleAgentCell(approvalDefinition, resolved, slug);\n }\n case \"join\": {\n const binding = Agent.withModel(\n plainDefinition,\n promptShapeModel(\"certify-join\", '{\"answer\":\"host answer\"}'),\n );\n\n const resolved = yield* DurableWorkerBinding.make(binding, DIGESTS);\n const threadId = decodeThreadId(`certify-${slug}`);\n\n const submitOne = Effect.fnUntraced(function* (key: string, question: string) {\n const runtime = yield* DurableAgentRuntime;\n\n return yield* runtime.submit(\n { definition: { id: plainDefinition.id, input: plainDefinition.input } },\n { question },\n {\n threadId,\n principal: PRINCIPAL,\n idempotencyKey: decodeIdempotencyKey(key),\n definitions: DIGESTS,\n },\n );\n });\n\n const cell: CertificationCell = {\n bindings: [resolved],\n submit: Effect.gen(function* () {\n const host = yield* submitOne(`certify-key-${slug}-host`, \"host question\");\n const queued = yield* submitOne(`certify-key-${slug}-queued`, \"queued question\");\n\n return [host, queued];\n }),\n lanes: () => [threadId],\n };\n\n return cell;\n }\n case \"delegation\": {\n const childBinding = Agent.withModel(\n childDefinition,\n promptShapeModel(\"certify-child\", '{\"answer\":\"child-answer\"}'),\n );\n\n const parentBinding = Agent.withModel(\n coordinatorDefinition,\n promptShapeModel(\n \"certify-parent\",\n '{\"report\":\"done\"}',\n toolTurn(\n toolCallPart(\"delegate-1\", \"delegate_research\", { topic: \"paris\" }),\n toolCallPart(\"lookup-1\", \"lookup\", { key: \"hotels\" }),\n ),\n ),\n );\n\n const delegationLayer = Subagent.layer(researchDelegation, childBinding, {\n mapChildFailure,\n durable: { targetDigests: CHILD_DIGEST_STRINGS },\n }).pipe(Layer.provide(delegationSupport));\n\n const lookupLayer = Toolkit.make(Lookup).toLayer({\n lookup: ({ key }) => Effect.succeed({ value: `found-${key}` }),\n });\n\n const parentResolved = yield* DurableWorkerBinding.make(parentBinding, DIGESTS).pipe(\n Effect.provide(Layer.mergeAll(delegationLayer, lookupLayer)),\n );\n\n const childResolved = yield* DurableWorkerBinding.make(childBinding, CHILD_DIGESTS);\n const threadId = decodeThreadId(`certify-${slug}`);\n\n const cell: CertificationCell = {\n bindings: [parentResolved, childResolved],\n submit: Effect.gen(function* () {\n const runtime = yield* DurableAgentRuntime;\n\n const receipt = yield* runtime.submit(\n { definition: { id: coordinatorDefinition.id, input: coordinatorDefinition.input } },\n { mission: \"plan\" },\n submitOptionsFor(slug, threadId),\n );\n\n return [receipt];\n }),\n lanes: (receipts) => {\n const parent = receipts.at(0);\n\n return parent === undefined\n ? [threadId]\n : [threadId, childThreadIdFor(parent.submissionId, DELEGATE_CALL)];\n },\n };\n\n return cell;\n }\n }\n});\n\n/** Maximum recovery/drive/unblock rounds before a cell is reported non-convergent. */\nconst MAX_REDRIVE_ROUNDS = 8;\n\n/**\n * Verify one lane after convergence: canonical export + every lane Submission the ledger or\n * the log names (the same collection rule as the admin `verify` member), fed to the shared\n * invariant checker in convergence mode WITH the captured per-batch producer directory, so\n * retained history and active state are checked.\n */\nconst verifyLane = Effect.fnUntraced(function* (lane: ThreadId) {\n const store = yield* ThreadStore;\n\n if (store.verification === undefined)\n return yield* ThreadStoreError.make({\n operation: \"adapter certification\",\n message: \"The adapter must provide bounded native Thread verification\",\n });\n\n return yield* store.verification.verify({ threadId: lane, requireAllSettled: true });\n});\n\nconst failureTagOf = <E>(cause: Cause.Cause<E>): string => {\n const failure = Cause.findErrorOption(cause);\n\n if (Option.isSome(failure)) {\n const error: unknown = failure.value;\n\n if (typeof error === \"object\" && error !== null && \"_tag\" in error) {\n return String(error._tag);\n }\n\n return String(error).slice(0, 256);\n }\n\n return \"defect\";\n};\n\ntype SweepOutcome = Pick<CertificationSweepResult, \"failpointFired\" | \"status\" | \"detail\">;\n\n/** Discover a clean path, or arm one location; both drives converge and verify real storage. */\nconst runSweepCell = Effect.fnUntraced(function* (\n scenario: CertificationScenario,\n location: DurableRuntimeFailpointLocation | undefined,\n reached: Set<DurableRuntimeFailpointLocation>,\n) {\n const ledger = yield* SubmissionLedger;\n const control = yield* DurableRuntimeFailpointTestControl;\n const slug = `${scenario}-${location?.replaceAll(\":\", \"-\") ?? \"discovery\"}`;\n\n const failed = (detail: string, fired: boolean): SweepOutcome => ({\n failpointFired: fired,\n status: \"failed\",\n detail: detail.slice(0, 4_096),\n });\n\n const cell = yield* makeCell(scenario, slug);\n\n const runtime = yield* DurableAgentRuntime.pipe(\n Effect.provide(\n DurableAgentRuntime.layerWithBindings(cell.bindings).pipe(\n Layer.provide(RunToolAuthorization.allowAll),\n ),\n ),\n );\n\n const submit = cell.submit.pipe(Effect.provideService(DurableAgentRuntime, runtime));\n\n // One-shot arm: the fault fires at most once anywhere in the cell (initial drive OR a\n // re-drive round's public unblocking operation), modelling one crash at this boundary.\n const fired = yield* Ref.make(false);\n\n yield* control.setHandler((hit) =>\n Effect.suspend(() => {\n reached.add(hit);\n\n return hit !== location\n ? Effect.void\n : Ref.getAndSet(fired, true).pipe(\n Effect.flatMap((already) =>\n already\n ? Effect.void\n : Effect.fail(DurableRuntimeFailpointError.make({ location: hit })),\n ),\n );\n }),\n );\n\n // Submissions are idempotent (DUR-001): one replay recovers a submit-boundary fault.\n let receipts: ReadonlyArray<Receipt>;\n const firstSubmit = yield* Effect.exit(submit);\n\n if (Exit.isSuccess(firstSubmit)) {\n receipts = firstSubmit.value;\n } else {\n const secondSubmit = yield* Effect.exit(submit);\n\n if (Exit.isFailure(secondSubmit)) {\n yield* control.clear;\n\n return failed(\n `submission replay did not recover: ${failureTagOf(secondSubmit.cause)}`,\n yield* Ref.get(fired),\n );\n }\n receipts = secondSubmit.value;\n }\n const lanes = cell.lanes(receipts);\n\n const driveLane = (lane: ThreadId) => runtime.processThreadResolved(lane);\n\n const allSettled = Effect.gen(function* () {\n for (const receipt of receipts) {\n const snapshot = yield* ledger.lookup(\n SubmissionLookupById.make({ submissionId: receipt.submissionId }),\n );\n\n if (Option.isNone(snapshot) || snapshot.value.state !== \"settled\") return false;\n }\n\n return true;\n });\n\n // Re-drive to convergence using ONLY public operations: worker drives, recovery passes,\n // and the authorized DUR-017/approval unblocking paths chosen from `explainThread`.\n let converged = false;\n\n for (let round = 0; round < MAX_REDRIVE_ROUNDS && !converged; round++) {\n // A failed drive closes its scoped generation before recovery can select another owner.\n yield* Effect.exit(runtime.runRecovery());\n for (const lane of lanes) {\n yield* Effect.exit(driveLane(lane));\n }\n for (const lane of lanes) {\n const explains = yield* Effect.exit(runtime.explainThread(lane));\n\n if (Exit.isFailure(explains)) continue;\n for (const explanation of explains.value) {\n for (const unknown of explanation.evidence.unknownCalls) {\n if (unknown.resolved) continue;\n yield* Effect.exit(\n runtime.resolveUnknown(\n UnknownResolutionCommand.make({\n submissionId: explanation.submission.submissionId,\n toolCallId: unknown.toolCallId,\n author: \"certification-runner\",\n reason: `re-drive after injected fault at ${location}`,\n resolution: ResolutionSafeToRetry.make(),\n }),\n ),\n );\n }\n for (const pending of explanation.evidence.approvalsPending) {\n const decided = explanation.evidence.approvalDecisions.some(\n (decision) => decision.toolCallId === pending.toolCallId,\n );\n\n if (decided) continue;\n yield* Effect.exit(\n runtime.resolveApproval(\n ApprovalDecisionCommand.make({\n submissionId: explanation.submission.submissionId,\n toolCallId: pending.toolCallId,\n decision: \"approved\",\n resolver: \"certification-runner\",\n reason: `re-drive after injected fault at ${location}`,\n }),\n ),\n );\n }\n }\n }\n const settled = yield* Effect.exit(allSettled);\n\n converged = Exit.isSuccess(settled) && settled.value;\n }\n yield* control.clear;\n const wasFired = yield* Ref.get(fired);\n\n if (!converged) {\n return failed(`did not converge within ${MAX_REDRIVE_ROUNDS} re-drive rounds`, wasFired);\n }\n\n // Every lane must pass retained-history and active-state verification in convergence mode.\n const failedChecks: Array<string> = [];\n\n for (const lane of lanes) {\n const verdict = yield* Effect.exit(verifyLane(lane));\n\n if (Exit.isFailure(verdict)) {\n return failed(`lane ${lane} could not be verified: ${failureTagOf(verdict.cause)}`, wasFired);\n }\n for (const check of verdict.value.checks) {\n if (check.status === \"failed\") {\n failedChecks.push(\n `${lane}:${check.name}${check.detail === undefined ? \"\" : ` (${check.detail})`}`,\n );\n }\n }\n }\n if (failedChecks.length > 0) {\n return failed(`invariant checks failed: ${failedChecks.join(\"; \")}`, wasFired);\n }\n\n return {\n failpointFired: wasFired,\n status: wasFired ? \"converged\" : \"not-triggered\",\n } satisfies SweepOutcome;\n});\n\n// ---------------------------------------------------------------------------\n// Tier 3 — real loss lever record\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the Tier-3 record honestly (plan §1): a non-durable reference adapter has no real\n * loss to exercise (`not-applicable`); a supplied lever runs NOW (`exercised`); committed\n * real-loss citations are recorded (`recorded-evidence`); otherwise the certificate says\n * `not-exercised` — a scoped statement, never a silent claim.\n */\nexport const resolveTierThree = Effect.fnUntraced(function* (\n durability: CertifiedAdapterIdentity[\"durability\"],\n options: {\n readonly crashLever?: CertificationCrashLever | undefined;\n readonly tierThreeEvidence?: ReadonlyArray<string> | undefined;\n },\n): Effect.fn.Return<CertificationTierThreeReport, never> {\n if (durability === \"non-durable\") {\n return CertificationTierThreeReport.make({\n status: \"not-applicable\",\n evidence: [],\n cases: [],\n detail:\n \"the adapter declares non-durable state (reference/conformance adapter); there is no real loss to exercise\",\n });\n }\n if (options.crashLever !== undefined) {\n const cases = yield* options.crashLever;\n\n return CertificationTierThreeReport.make({\n status: cases.length === 0 ? \"not-exercised\" : \"exercised\",\n evidence: options.tierThreeEvidence ?? [],\n cases,\n ...(cases.length === 0\n ? { detail: \"the supplied crash lever executed no real-loss cases\" }\n : {}),\n });\n }\n if (options.tierThreeEvidence !== undefined && options.tierThreeEvidence.length > 0) {\n return CertificationTierThreeReport.make({\n status: \"recorded-evidence\",\n evidence: options.tierThreeEvidence,\n cases: [],\n });\n }\n\n return CertificationTierThreeReport.make({\n status: \"not-exercised\",\n evidence: [],\n cases: [],\n detail:\n \"no crash lever was supplied and no committed real-loss evidence was cited; Tier 3 is NOT discharged for this adapter\",\n });\n});\n\n// ---------------------------------------------------------------------------\n// Entry point\n// ---------------------------------------------------------------------------\n\nconst nowUtc: Effect.Effect<DateTime.Utc> = Effect.map(Clock.currentTimeMillis, (millis) =>\n DateTime.toUtc(DateTime.makeUnsafe(millis)),\n);\n\n/**\n * Certify one durable adapter pair (plan §1, §8 WP2). Runs Tier 2 FIRST over pristine\n * storage (each cell converges to all-settled before the next starts, so the recovery scan\n * never sees foreign leftovers), then Tier 1's port contract cases (whose lanes deliberately\n * end in every nonterminal shape), then records Tier 3. Requires `Crypto.Crypto` and a\n * TestClock-backed environment; the candidate Layers are built exactly once.\n */\nexport const certifyDurableAdapters = <LedgerE = never, StoreE = never>(\n options: CertifyDurableAdaptersOptions<LedgerE, StoreE>,\n): Effect.Effect<CertificationReport, LedgerE | StoreE, Crypto.Crypto> => {\n // RUN-036: certification uses the default-none Tool failure observer. Trusted application\n // reporting adds no durable transition and is verified separately from adapter certification.\n const environment = Layer.mergeAll(runStorageLayer(), ThreadReader.layer()).pipe(\n Layer.provideMerge(\n Layer.mergeAll(\n options.submissionLedger,\n options.threadStore,\n options.wakeScheduler ?? WakeScheduler.layerNoop,\n DurableRuntimeFailpointTestControl.layer,\n ToolReconciler.uncertain,\n DurableRuntimeConfig.layer({\n deploymentId: Schema.decodeSync(DeploymentId)(\"deployment-certification\"),\n producerId: Schema.decodeSync(ProducerId)(\"producer-certification\"),\n settlementPollInterval: Duration.millis(50),\n abortPollInterval: Duration.millis(50),\n }),\n ),\n ),\n );\n\n const program = Effect.gen(function* () {\n const ledger = yield* SubmissionLedger;\n\n // Tier 2 — discover each deterministic shape without a fault. Unreached locations\n // would all repeat this same clean drive, including its full invariant verification.\n const tier2: Array<CertificationSweepResult> = [];\n\n const discoveries: Array<{\n readonly scenario: CertificationScenario;\n readonly outcome: SweepOutcome;\n readonly reached: Set<DurableRuntimeFailpointLocation>;\n }> = [];\n\n for (const scenario of CERTIFICATION_SCENARIOS) {\n const reached = new Set<DurableRuntimeFailpointLocation>();\n\n const outcome = yield* runSweepCell(scenario, undefined, reached);\n\n discoveries.push({ scenario, outcome, reached });\n }\n const observed = new Set(discoveries.flatMap(({ reached }) => [...reached]));\n\n // Never silently omit a new location: if neither discovery nor the documented\n // never-fired set accounts for it, arm it in EVERY shape. Tests pin the fired paths\n // per shape and the never-fired set, so new or lost routes require explicit review.\n const unaccounted = new Set(\n DurableRuntimeFailpointLocation.literals.filter(\n (location) => !observed.has(location) && !TIER2_UNREACHED_LOCATIONS.includes(location),\n ),\n );\n\n for (const discovery of discoveries) {\n const { scenario, reached } = discovery;\n const outcomes = new Map<DurableRuntimeFailpointLocation, SweepOutcome>();\n\n if (discovery.outcome.status !== \"failed\") {\n while (true) {\n // Recovery may expose another route. Discover those too, without re-running a\n // cell already checked. Schema order bounds this to one drive per location.\n const location = DurableRuntimeFailpointLocation.literals.find(\n (candidate) =>\n !outcomes.has(candidate) && (reached.has(candidate) || unaccounted.has(candidate)),\n );\n\n if (location === undefined) break;\n outcomes.set(location, yield* runSweepCell(scenario, location, reached));\n }\n }\n for (const location of DurableRuntimeFailpointLocation.literals) {\n const outcome = outcomes.get(location) ?? discovery.outcome;\n\n tier2.push(\n CertificationSweepResult.make({\n scenario,\n location,\n ...outcome,\n ...(outcomes.has(location) || outcome.status === \"failed\"\n ? {}\n : { detail: \"verified clean scenario did not reach this location\" }),\n }),\n );\n }\n }\n\n // Tier 1 — the shared port contract suites, verbatim.\n const tier1 = yield* certifyPorts();\n\n // Tier 3 — the real loss lever record.\n const capabilities = yield* ledger.capabilities;\n const tier3 = yield* resolveTierThree(capabilities.durability, options);\n\n const generatedAt = yield* nowUtc;\n\n return makeCertificationReport({\n adapter: CertifiedAdapterIdentity.make({\n name: options.adapter.name,\n ...(options.adapter.version === undefined ? {} : { version: options.adapter.version }),\n durability: capabilities.durability,\n }),\n generatedAt,\n tier1,\n tier2,\n tier3,\n });\n });\n\n return program.pipe(Effect.provide(environment));\n};\n"],"mappings":"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"}
package/dist/Chaos.mjs CHANGED
@@ -430,7 +430,7 @@ const makeLaneFixture = Effect.fnUntraced(function* (plan, laneIndex, kind, subm
430
430
  }
431
431
  case "durable-steps": {
432
432
  const agent = Agent.withModel(itineraryDefinition, model);
433
- const toolLayer = itineraryTools.toLayer({ itinerary: ({ ref: called }) => Effect.gen(function* () {
433
+ const toolLayer = itineraryTools.toLayer({ itinerary: Effect.fnUntraced(function* ({ ref: called }) {
434
434
  const step = yield* DurableStep;
435
435
  return { state: `${yield* step.do("reserve-flight", Schema.String, desk.record(flightValue(called)).pipe(Effect.as(flightValue(called))))}+${yield* step.do("reserve-lodging", Schema.String, desk.record(lodgingValue(called)).pipe(Effect.as(lodgingValue(called))))}` };
436
436
  }) });