@effect-agent/testing 0.1.0-beta.53 → 0.1.0-beta.54

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.
package/dist/Chaos.mjs CHANGED
@@ -374,11 +374,11 @@ const makeChaosDesk = Effect.gen(function* () {
374
374
  const bookConfirmation = (ref) => `confirmed-${ref}`;
375
375
  const flightValue = (ref) => `flight-${ref}`;
376
376
  const lodgingValue = (ref) => `lodging-${ref}`;
377
- /** Success → Some; typed failure None (chaos tolerates it); defect rethrown loudly. */
377
+ /** Tolerate typed failures while preserving every defect and interruption reason. */
378
378
  const tolerateTyped = (effect) => effect.pipe(Effect.exit, Effect.flatMap((exit) => {
379
379
  if (Exit.isSuccess(exit)) return Effect.succeed(Option.some(exit.value));
380
- if (Option.isSome(Cause.findErrorOption(exit.cause))) return Effect.succeed(Option.none());
381
- return Effect.die(/* @__PURE__ */ new Error(`chaos step died: ${Cause.pretty(exit.cause)}`));
380
+ const unexpected = exit.cause.reasons.filter((reason) => reason._tag !== "Fail");
381
+ return unexpected.length === 0 ? Effect.succeed(Option.none()) : Effect.failCause(Cause.fromReasons(unexpected));
382
382
  }));
383
383
  const scriptFor = (kind, ref) => {
384
384
  switch (kind) {
@@ -1 +1 @@
1
- {"version":3,"file":"Chaos.mjs","names":[],"sources":["../src/Chaos.ts"],"sourcesContent":["import * as Subagent from \"@effect-agent/capabilities/Subagent\";\nimport { SubagentPolicy, SubagentRuntime } from \"@effect-agent/capabilities/Subagent\";\nimport { SubagentReservationsMemoryLive } from \"@effect-agent/capabilities/SubagentReservations\";\nimport * as Agent from \"@effect-agent/core/Agent\";\nimport { AgentPolicy } from \"@effect-agent/core/AgentPolicy\";\nimport {\n ThreadId,\n RunId,\n ToolCallId,\n TurnId,\n type SubmissionId,\n} from \"@effect-agent/core/Identifiers\";\nimport { IdGenerator } from \"@effect-agent/core/IdGenerator\";\nimport {\n DurableStep,\n DurableStepError,\n ToolExecutionClass,\n} from \"@effect-agent/engine/DurableStep\";\nimport { RunToolAuthorization } from \"@effect-agent/engine/RunOptions\";\nimport { ObligationThresholds } from \"@effect-agent/thread/Admin\";\nimport {\n DurableWorkerBinding,\n type DurableBindingFailure,\n type ResolvedBinding,\n} from \"@effect-agent/thread/AgentRegistration\";\nimport {\n DurableAgentRuntime,\n DurableRuntimeConfig,\n type DurableSubmitFailure,\n type DurableWorkerFailure,\n type Receipt,\n} from \"@effect-agent/thread/DurableAgentRuntime\";\nimport {\n DurableRuntimeFailpointError,\n DurableRuntimeFailpointLocation,\n} from \"@effect-agent/thread/DurableFailpoint\";\nimport {\n DefinitionDigests,\n Digest,\n type CanonicalRecordEnvelope,\n type BatchId,\n type ProducerId,\n} from \"@effect-agent/thread/Records\";\nimport { childThreadIdFor } from \"@effect-agent/thread/RunJournal\";\nimport {\n AbortCommand,\n ApprovalDecisionCommand,\n IdempotencyKey,\n Principal,\n ResolutionAbortSubmission,\n ResolutionCompletedWithResult,\n ResolutionNeverHappened,\n SubmissionLedger,\n SubmissionLookupById,\n UnknownResolutionCommand,\n type Settlement,\n type SubmissionSnapshot,\n type UnknownResolution,\n} from \"@effect-agent/thread/SubmissionLedger\";\nimport { DurableRuntimeFailpointTestControl } from \"@effect-agent/thread/testing/DurableFailpointTestControl\";\nimport { verifyThreadInvariants } from \"@effect-agent/thread/ThreadInvariants\";\nimport { ThreadExportRequest, ThreadStore } from \"@effect-agent/thread/ThreadStore\";\nimport { Cause, Effect, Exit, Layer, Option, Ref, Schema, Stream } from \"effect\";\nimport { FastCheck } from \"effect/testing\";\nimport {\n LanguageModel,\n Model,\n Tool,\n Toolkit,\n type Prompt,\n type Response,\n} from \"effect/unstable/ai\";\n\n/**\n * P7 WP4 chaos machinery (plan §5): a Schema-first `ChaosPlan`, a seeded generator over\n * `effect/testing/FastCheck` (already inside the pinned Effect — no new dependency), and a\n * deterministic runner that drives the durable coordinator over whatever adapter pair the test\n * provides. Every plan ends in the SAME claims the crash matrices make:\n *\n * 1. `verifyThreadInvariants` in convergence mode over every touched Thread (the\n * shared WP1 checker — one set of claims for admin verify, certification, chaos, and soak);\n * 2. `scanObligations` returning ZERO entries (everything settled; nothing invisibly stuck);\n * 3. supplier non-fabrication wherever the deterministic desk was in play (durability §10: no\n * canonical Tool success exists that the external store did not actually produce).\n *\n * Replay contract: the memory/SQLite chaos tests derive every plan from one root seed\n * (`CHAOS_SEED` env override; see `chaosSeedFromEnv`) and print that seed plus the failing\n * plan's own seed in the failure output, so any red run is replayable byte-for-byte.\n */\n\n// ---------------------------------------------------------------------------\n// ChaosPlan schema\n// ---------------------------------------------------------------------------\n\n/** The six durable scenario flavors a chaos lane can exercise (plan §5). */\nexport const ChaosScenarioKind = Schema.Literals([\n \"plain\",\n \"uncertain-tool\",\n \"durable-steps\",\n \"approval\",\n \"join\",\n \"delegation\",\n]);\n\nexport type ChaosScenarioKind = typeof ChaosScenarioKind.Type;\n\nconst LaneIndex = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0), Schema.isLessThanOrEqualTo(7));\n\n/** One Submission of a plan: which lane it queues into and that lane's scenario flavor. */\nexport class ChaosSubmissionSpec extends Schema.Class<ChaosSubmissionSpec>(\n \"@effect-agent/testing/ChaosSubmissionSpec\",\n)({\n lane: LaneIndex,\n /** The lane's flavor; the FIRST spec of a lane fixes the lane's agent. */\n kind: ChaosScenarioKind,\n}) {}\n\n/** How the runner resolves a durable Unknown Outcome it encounters (DUR-017 driver). */\nexport const ChaosResolutionKind = Schema.Literals([\n /** The call provably never started: the batch resumes and executes it. */\n \"never-happened\",\n /**\n * Recovered supplier truth: resolve with the EXACT value the desk produced. Falls back to\n * `never-happened` when the desk holds no value for the call, so the runner never fabricates.\n */\n \"completed-from-supplier\",\n /** Unresolvable: route into the abort path (settles aborted, audit retained). */\n \"abort-submission\",\n]);\n\nexport type ChaosResolutionKind = typeof ChaosResolutionKind.Type;\n\nexport const ChaosApprovalDecision = Schema.Literals([\"approved\", \"denied\"]);\nexport type ChaosApprovalDecision = typeof ChaosApprovalDecision.Type;\n\nconst BoundedAdapterArm = Schema.String.check(Schema.isMaxLength(128));\n\n/**\n * One seeded chaos plan (plan §5): the full fault schedule is data, so a failing run replays\n * from the plan alone. `failpointArms` are coordinator locations; `adapterArms` are\n * adapter-owned location names the adapter test validates (the memory runner has none).\n */\nexport class ChaosPlan extends Schema.Class<ChaosPlan>(\"@effect-agent/testing/ChaosPlan\")({\n /** Identifies this plan in failure output; derived from the root seed plus the plan index. */\n seed: Schema.Int,\n /** Lane count; submissions address lanes `0..lanes-1`. */\n lanes: Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(8)),\n submissions: Schema.NonEmptyArray(ChaosSubmissionSpec),\n /** Coordinator failpoint arms, consumed one per round (each fails every hit that round). */\n failpointArms: Schema.Array(DurableRuntimeFailpointLocation),\n /** Adapter-owned failpoint arms (e.g. SQLite `ledger:*`/`append:*` locations). */\n adapterArms: Schema.Array(BoundedAdapterArm),\n /** Flattened submission indices to abort mid-plan (modulo the submission count). */\n abortInjections: Schema.Array(Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))),\n /** Resolution choices for Unknown Outcomes, indexed deterministically per open call. */\n resolutionInjections: Schema.Array(ChaosResolutionKind),\n /** Approval decisions for suspended approval lanes, indexed deterministically per call. */\n approvalDecisions: Schema.Array(ChaosApprovalDecision),\n}) {}\n\n/** Per-lane verification result inside a plan report. */\nexport class ChaosLaneReport extends Schema.Class<ChaosLaneReport>(\n \"@effect-agent/testing/ChaosLaneReport\",\n)({\n threadId: ThreadId,\n kind: ChaosScenarioKind,\n submissionCount: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n /** Verdict of `verifyThreadInvariants` in convergence mode. */\n verified: Schema.Boolean,\n}) {}\n\n/** The Schema-first outcome of one executed chaos plan. */\nexport class ChaosPlanReport extends Schema.Class<ChaosPlanReport>(\n \"@effect-agent/testing/ChaosPlanReport\",\n)({\n seed: Schema.Int,\n rounds: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n lanes: Schema.Array(ChaosLaneReport),\n /** `scanObligations` entries after convergence — MUST be zero. */\n openObligations: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n}) {}\n\n/** Typed convergence/verification failure of one chaos plan (never a bare defect). */\nexport class ChaosConvergenceFailure extends Schema.TaggedError<ChaosConvergenceFailure>()(\n \"ChaosConvergenceFailure\",\n {\n seed: Schema.Int,\n message: Schema.String.check(Schema.isMaxLength(16_384)),\n },\n) {}\n\n// ---------------------------------------------------------------------------\n// Seeded generation\n// ---------------------------------------------------------------------------\n\n/** Default root seed for chaos suites; override with the `CHAOS_SEED` environment variable. */\nexport const DEFAULT_CHAOS_SEED = 20260813;\n\nconst ChaosSeedFromEnvironment = Schema.FiniteFromString.check(Schema.isInt());\nconst decodeChaosSeedFromEnvironment = Schema.decodeUnknownOption(ChaosSeedFromEnvironment);\n\n/** The root seed for this run: `CHAOS_SEED` when set to an integer, the default otherwise. */\nexport const chaosSeedFromEnv = (env: Record<string, string | undefined>): number => {\n const raw = env[\"CHAOS_SEED\"];\n\n if (raw === undefined || raw === \"\") return DEFAULT_CHAOS_SEED;\n\n return Option.getOrElse(decodeChaosSeedFromEnvironment(raw), () => DEFAULT_CHAOS_SEED);\n};\n\nexport interface ChaosGeneratorOptions {\n /** Root seed (print this in failure output for replay). */\n readonly seed: number;\n /** How many plans to derive. */\n readonly count: number;\n /** Adapter failpoint location names available to arm (empty for memory). */\n readonly adapterArms?: ReadonlyArray<string> | undefined;\n}\n\ninterface GeneratedLane {\n readonly kind: ChaosScenarioKind;\n readonly depth: number;\n}\n\nconst laneArbitrary: FastCheck.Arbitrary<GeneratedLane> = FastCheck.constantFrom<ChaosScenarioKind>(\n \"plain\",\n \"uncertain-tool\",\n \"durable-steps\",\n \"approval\",\n \"join\",\n \"delegation\",\n).chain((kind): FastCheck.Arbitrary<GeneratedLane> =>\n kind === \"join\"\n ? FastCheck.integer({ min: 2, max: 3 }).map((depth): GeneratedLane => ({ kind, depth }))\n : kind === \"plain\"\n ? FastCheck.integer({ min: 1, max: 2 }).map((depth): GeneratedLane => ({ kind, depth }))\n : FastCheck.constant<GeneratedLane>({ kind, depth: 1 }),\n);\n\ninterface ChaosPlanShape {\n readonly lanes: number;\n readonly submissions: readonly [ChaosSubmissionSpec, ...Array<ChaosSubmissionSpec>];\n readonly failpointArms: ReadonlyArray<DurableRuntimeFailpointLocation>;\n readonly adapterArms: ReadonlyArray<string>;\n readonly abortInjections: ReadonlyArray<number>;\n readonly resolutionInjections: ReadonlyArray<ChaosResolutionKind>;\n readonly approvalDecisions: ReadonlyArray<ChaosApprovalDecision>;\n}\n\nconst planShapeArbitrary = (\n adapterArms: ReadonlyArray<string>,\n): FastCheck.Arbitrary<ChaosPlanShape> =>\n FastCheck.record({\n lanes: FastCheck.array(laneArbitrary, { minLength: 1, maxLength: 3 }),\n failpointArms: FastCheck.uniqueArray(\n FastCheck.constantFrom(...DurableRuntimeFailpointLocation.literals),\n { maxLength: 3 },\n ),\n adapterArms:\n adapterArms.length === 0\n ? FastCheck.constant<Array<string>>([])\n : FastCheck.uniqueArray(FastCheck.constantFrom(...adapterArms), { maxLength: 2 }),\n abortInjections: FastCheck.uniqueArray(FastCheck.integer({ min: 0, max: 15 }), {\n maxLength: 2,\n }),\n resolutionInjections: FastCheck.array(\n FastCheck.constantFrom<ChaosResolutionKind>(\n \"never-happened\",\n \"completed-from-supplier\",\n \"abort-submission\",\n ),\n { maxLength: 4 },\n ),\n approvalDecisions: FastCheck.array(\n FastCheck.constantFrom<ChaosApprovalDecision>(\"approved\", \"denied\"),\n { maxLength: 2 },\n ),\n }).map((shape) => {\n const submissions = shape.lanes.flatMap((lane, index) =>\n Array.from({ length: lane.depth }, () =>\n ChaosSubmissionSpec.make({ lane: index, kind: lane.kind }),\n ),\n );\n\n const [first, ...rest] = submissions;\n\n // `lanes` >= 1 and every lane has depth >= 1, so `first` always exists.\n if (first === undefined) throw new Error(\"chaos generator produced an empty plan\");\n\n return {\n lanes: shape.lanes.length,\n submissions: [first, ...rest] as const,\n failpointArms: shape.failpointArms,\n adapterArms: shape.adapterArms,\n abortInjections: shape.abortInjections,\n resolutionInjections: shape.resolutionInjections,\n approvalDecisions: shape.approvalDecisions,\n };\n });\n\n/**\n * Derive `count` chaos plans deterministically from one root seed. The same\n * `{seed, count, adapterArms}` triple always yields byte-identical plans, so a failure line\n * `CHAOS_SEED=<seed>` replays the exact schedule.\n */\nexport const generateChaosPlans = (options: ChaosGeneratorOptions): ReadonlyArray<ChaosPlan> => {\n const sampled = FastCheck.sample(planShapeArbitrary(options.adapterArms ?? []), {\n seed: options.seed,\n numRuns: options.count,\n });\n\n return sampled.map((shape, index) =>\n ChaosPlan.make({ ...shape, seed: (Math.imul(options.seed, 31) + index) | 0 }),\n );\n};\n\n/** Deterministic PRNG for the runner's small ordering choices (lane drive order). */\nconst mulberry32 = (seed: number): (() => number) => {\n let state = seed | 0;\n\n return () => {\n state = (state + 0x6d2b79f5) | 0;\n let t = Math.imul(state ^ (state >>> 15), 1 | state);\n\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n};\n\n// ---------------------------------------------------------------------------\n// Lane fixtures (agents, scripted models, deterministic desk)\n// ---------------------------------------------------------------------------\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 toolTurn = (\n ...calls: ReadonlyArray<Response.StreamPartEncoded>\n): ReadonlyArray<Response.StreamPartEncoded> => [\n ...calls,\n { type: \"finish\", reason: \"tool-calls\", 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\n/**\n * Prompt-shaped scripted model: the response depends ONLY on the request prompt, so it stays\n * deterministic across Attempt re-invocations, batch resumes, and joined steering — no counter\n * to drift when chaos re-enters a Turn.\n */\nconst promptScriptedModel = (\n label: string,\n script: (prompt: Prompt.Prompt) => ReadonlyArray<Response.StreamPartEncoded>,\n) =>\n Model.make(\n \"scripted\",\n label,\n Layer.effect(\n LanguageModel.LanguageModel,\n LanguageModel.make({\n generateText: () => Effect.succeed([]),\n streamText: (request) => Stream.fromIterable(script(request.prompt)),\n }),\n ),\n );\n\nconst lastRole = (prompt: Prompt.Prompt): string | undefined => prompt.content.at(-1)?.role;\n\nconst policy = AgentPolicy.make({\n maxTurns: 3,\n maxToolCalls: 4,\n maxDuration: \"30 seconds\",\n toolConcurrency: 2,\n});\n\nconst PlainInput = Schema.Struct({ question: Schema.String });\nconst PlainOutput = Schema.Struct({ answer: Schema.String });\n\nconst plainDefinition = Agent.make(\"chaos-plain\", {\n input: PlainInput,\n output: PlainOutput,\n instructions: \"Answer as JSON.\",\n toolkit: Toolkit.empty,\n policy,\n});\n\n/** Unannotated → fail-closed `uncertain`: enters the prepared/settled protocol (DUR-009). */\nconst BookUncertain = Tool.make(\"book\", {\n parameters: Schema.Struct({ ref: Schema.String }),\n success: Schema.Struct({ confirmation: Schema.String }),\n});\n\nconst bookTools = Toolkit.make(BookUncertain);\n\nconst bookDefinition = Agent.make(\"chaos-book\", {\n input: PlainInput,\n output: PlainOutput,\n instructions: \"Book it.\",\n toolkit: bookTools,\n policy,\n});\n\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 approvalTools = Toolkit.make(BookApproval);\n\nconst approvalDefinition = Agent.make(\"chaos-approval\", {\n input: PlainInput,\n output: PlainOutput,\n instructions: \"Book after approval.\",\n toolkit: approvalTools,\n policy,\n});\n\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}).annotate(ToolExecutionClass, \"uncertain\");\n\nconst itineraryTools = Toolkit.make(Itinerary);\n\nconst itineraryDefinition = Agent.make(\"chaos-itinerary\", {\n input: PlainInput,\n output: PlainOutput,\n instructions: \"Reserve the itinerary.\",\n toolkit: itineraryTools,\n policy,\n});\n\nconst childDefinition = Agent.make(\"chaos-child\", {\n input: PlainInput,\n output: PlainOutput,\n instructions: \"Answer as JSON.\",\n toolkit: Toolkit.empty,\n policy: AgentPolicy.make({\n maxTurns: 2,\n maxToolCalls: 1,\n maxDuration: \"30 seconds\",\n toolConcurrency: 1,\n }),\n});\n\nclass ChaosDelegationFailed extends Schema.TaggedError<ChaosDelegationFailed>()(\n \"ChaosDelegationFailed\",\n { childErrorTag: Schema.String },\n) {}\n\nconst chaosDelegation = Subagent.define(\"delegate_chaos\", {\n description: \"Delegate one bounded chaos question.\",\n target: childDefinition,\n parameters: Schema.Struct({ topic: Schema.String }),\n success: Schema.Struct({ summary: Schema.String }),\n failure: ChaosDelegationFailed,\n prepareInput: ({ topic }) => Effect.succeed({ question: `chaos:${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: \"30 seconds\",\n }),\n});\n\nconst coordinatorDefinition = Agent.make(\"chaos-coordinator\", {\n input: Schema.Struct({ mission: Schema.String }),\n output: Schema.Struct({ report: Schema.String }),\n instructions: \"Delegate, then report as JSON.\",\n toolkit: Toolkit.make(chaosDelegation.tool),\n policy,\n});\n\nconst DELEGATE_CALL_ID = \"chaos-delegate-1\";\n\nconst HEX = \"0123456789abcdef\";\nconst decodeDigest = Schema.decodeSync(Digest);\n\nconst laneDigests = (lane: number): DefinitionDigests => {\n const digest = decodeDigest(HEX.charAt(lane % 8).repeat(64));\n\n return DefinitionDigests.make({ agent: digest, model: digest, tools: digest });\n};\n\nconst childDigestStrings = (lane: number) => {\n const char = HEX.charAt(8 + (lane % 8));\n\n return { agent: char.repeat(64), model: char.repeat(64), tools: char.repeat(64) } as const;\n};\n\nconst childLaneDigests = (lane: number): DefinitionDigests => {\n const strings = childDigestStrings(lane);\n\n return DefinitionDigests.make({\n agent: decodeDigest(strings.agent),\n model: decodeDigest(strings.model),\n tools: decodeDigest(strings.tools),\n });\n};\n\nconst CHAOS_PRINCIPAL = Schema.decodeSync(Principal)(\"principal-chaos\");\nconst decodeThreadId = Schema.decodeSync(ThreadId);\nconst decodeIdempotencyKey = Schema.decodeSync(IdempotencyKey);\nconst decodeToolCallId = Schema.decodeSync(ToolCallId);\nconst decodeRunId = Schema.decodeSync(RunId);\nconst decodeTurnId = Schema.decodeSync(TurnId);\n\n/** Fixture-only identity source consumed by the delegation Layer's ephemeral capture. */\nconst chaosIdentifiers = 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, \"chaos-fixture-thread\"),\n nextRunId: next(decodeRunId, \"chaos-fixture-run\"),\n nextTurnId: next(decodeTurnId, \"chaos-fixture-turn\"),\n };\n }),\n);\n\nconst delegationSupport = Layer.mergeAll(SubagentReservationsMemoryLive, chaosIdentifiers);\n\n/**\n * The deterministic external desk of one plan: every produced value is recorded so the final\n * non-fabrication sweep can prove each canonical Tool success came from here (durability §10).\n */\ninterface ChaosDesk {\n readonly produced: Effect.Effect<ReadonlySet<string>>;\n readonly record: (value: string) => Effect.Effect<void>;\n}\n\nconst makeChaosDesk: Effect.Effect<ChaosDesk> = Effect.gen(function* () {\n const produced = yield* Ref.make<ReadonlySet<string>>(new Set());\n\n return {\n produced: Ref.get(produced),\n record: (value: string) => Ref.update(produced, (current) => new Set(current).add(value)),\n };\n});\n\nconst bookConfirmation = (ref: string): string => `confirmed-${ref}`;\nconst flightValue = (ref: string): string => `flight-${ref}`;\nconst lodgingValue = (ref: string): string => `lodging-${ref}`;\n\n// ---------------------------------------------------------------------------\n// Runner\n// ---------------------------------------------------------------------------\n\n/** Adapter-owned failpoint control the SQLite runner supplies; memory has none. */\nexport interface ChaosAdapterFailpoints {\n readonly arm: (location: string) => Effect.Effect<void>;\n readonly clear: Effect.Effect<void>;\n}\n\nexport interface ChaosRunOptions {\n readonly adapterFailpoints?: ChaosAdapterFailpoints | undefined;\n /**\n * Executed at the end of every round. Adapters whose ownership leases block every new claim\n * until expiry (the SQLite ledger's D5 semantics — expiry only revokes the liveness\n * assumption; producer epochs stay the correctness fence) pass a deterministic\n * `TestClock.adjust` here so a dead Attempt's lane becomes reclaimable next round. The memory\n * ledger needs nothing: it allows same-producer reclaim under a live lease.\n */\n readonly betweenRounds?: Effect.Effect<void> | undefined;\n}\n\n/** Success → Some; typed failure → None (chaos tolerates it); defect → rethrown loudly. */\nconst tolerateTyped = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n): Effect.Effect<Option.Option<A>, never, R> =>\n effect.pipe(\n Effect.exit,\n Effect.flatMap((exit) => {\n if (Exit.isSuccess(exit)) return Effect.succeed(Option.some(exit.value));\n if (Option.isSome(Cause.findErrorOption(exit.cause))) {\n return Effect.succeed(Option.none<A>());\n }\n\n return Effect.die(new Error(`chaos step died: ${Cause.pretty(exit.cause)}`));\n }),\n );\n\ninterface LaneFixture {\n readonly index: number;\n readonly kind: ChaosScenarioKind;\n readonly threadId: ThreadId;\n readonly ref: string;\n readonly deskInPlay: boolean;\n readonly submissionIndexes: ReadonlyArray<number>;\n readonly submitOne: (flatIndex: number) => Effect.Effect<Receipt, DurableSubmitFailure>;\n readonly drives: (\n firstReceipt: Receipt | undefined,\n ) => ReadonlyArray<\n Effect.Effect<ReadonlyArray<Settlement>, DurableWorkerFailure | DurableBindingFailure>\n >;\n readonly childThreadOf: (firstReceipt: Receipt) => ThreadId | undefined;\n}\n\ninterface SubmissionState {\n readonly flatIndex: number;\n readonly lane: LaneFixture;\n receipt: Receipt | undefined;\n}\n\nconst scriptFor = (\n kind: ChaosScenarioKind,\n ref: string,\n): ((prompt: Prompt.Prompt) => ReadonlyArray<Response.StreamPartEncoded>) => {\n switch (kind) {\n case \"plain\":\n case \"join\":\n return () => finalParts('{\"answer\":\"chaos\"}');\n case \"uncertain-tool\":\n case \"approval\":\n return (prompt) =>\n lastRole(prompt) === \"tool\"\n ? finalParts('{\"answer\":\"booked\"}')\n : toolTurn(toolCallPart(`book-${ref}`, \"book\", { ref }));\n case \"durable-steps\":\n return (prompt) =>\n lastRole(prompt) === \"tool\"\n ? finalParts('{\"answer\":\"reserved\"}')\n : toolTurn(toolCallPart(`itinerary-${ref}`, \"itinerary\", { ref }));\n case \"delegation\":\n return (prompt) =>\n lastRole(prompt) === \"tool\"\n ? finalParts('{\"report\":\"done\"}')\n : toolTurn(toolCallPart(DELEGATE_CALL_ID, \"delegate_chaos\", { topic: ref }));\n }\n};\n\nconst makeLaneFixture = Effect.fn(\"Chaos.makeLaneFixture\")(function* (\n plan: ChaosPlan,\n laneIndex: number,\n kind: ChaosScenarioKind,\n submissionIndexes: ReadonlyArray<number>,\n desk: ChaosDesk,\n) {\n const runtime = yield* DurableAgentRuntime;\n const threadId = decodeThreadId(`chaos-${plan.seed}-lane-${laneIndex}`);\n const ref = `ref-l${laneIndex}`;\n const script = scriptFor(kind, ref);\n const model = promptScriptedModel(`chaos-${kind}-${laneIndex}`, script);\n const digests = laneDigests(laneIndex);\n\n const submitOptionsFor = (flatIndex: number) => ({\n threadId,\n principal: CHAOS_PRINCIPAL,\n idempotencyKey: decodeIdempotencyKey(`chaos-${plan.seed}-s${flatIndex}`),\n definitions: digests,\n });\n\n const bookToolLayerFor = (tools: typeof bookTools | typeof approvalTools) =>\n tools.toLayer({\n book: ({ ref: called }) =>\n desk\n .record(bookConfirmation(called))\n .pipe(Effect.as({ confirmation: bookConfirmation(called) })),\n });\n\n const plainLaneFixture = (\n deskInPlay: boolean,\n drive: Effect.Effect<ReadonlyArray<Settlement>, DurableWorkerFailure | DurableBindingFailure>,\n submitOne: (flatIndex: number) => Effect.Effect<Receipt, DurableSubmitFailure>,\n ): LaneFixture => ({\n index: laneIndex,\n kind,\n threadId,\n ref,\n deskInPlay,\n submissionIndexes,\n submitOne,\n drives: () => [drive],\n childThreadOf: () => undefined,\n });\n\n switch (kind) {\n case \"plain\":\n case \"join\": {\n const agent = Agent.withModel(plainDefinition, model);\n\n return plainLaneFixture(false, runtime.processThread(agent, threadId), (flatIndex) =>\n runtime.submit(agent, { question: `chaos ${flatIndex}` }, submitOptionsFor(flatIndex)),\n );\n }\n case \"uncertain-tool\": {\n const agent = Agent.withModel(bookDefinition, model);\n\n return plainLaneFixture(\n true,\n runtime.processThread(agent, threadId).pipe(Effect.provide(bookToolLayerFor(bookTools))),\n (flatIndex) =>\n runtime.submit(agent, { question: `chaos ${flatIndex}` }, submitOptionsFor(flatIndex)),\n );\n }\n case \"approval\": {\n const agent = Agent.withModel(approvalDefinition, model);\n\n return plainLaneFixture(\n true,\n runtime\n .processThread(agent, threadId)\n .pipe(Effect.provide(bookToolLayerFor(approvalTools))),\n (flatIndex) =>\n runtime.submit(agent, { question: `chaos ${flatIndex}` }, submitOptionsFor(flatIndex)),\n );\n }\n case \"durable-steps\": {\n const agent = Agent.withModel(itineraryDefinition, model);\n\n const toolLayer = itineraryTools.toLayer({\n itinerary: ({ ref: called }) =>\n Effect.gen(function* () {\n const step = yield* DurableStep;\n\n const flight = yield* step.do(\n \"reserve-flight\",\n Schema.String,\n desk.record(flightValue(called)).pipe(Effect.as(flightValue(called))),\n );\n\n const lodging = yield* step.do(\n \"reserve-lodging\",\n Schema.String,\n desk.record(lodgingValue(called)).pipe(Effect.as(lodgingValue(called))),\n );\n\n return { state: `${flight}+${lodging}` };\n }),\n });\n\n return plainLaneFixture(\n true,\n runtime.processThread(agent, threadId).pipe(Effect.provide(toolLayer)),\n (flatIndex) =>\n runtime.submit(agent, { question: `chaos ${flatIndex}` }, submitOptionsFor(flatIndex)),\n );\n }\n case \"delegation\": {\n const parentBinding = Agent.withModel(coordinatorDefinition, model);\n\n const childModel = promptScriptedModel(`chaos-child-${laneIndex}`, () =>\n finalParts('{\"answer\":\"child\"}'),\n );\n\n const childBinding = Agent.withModel(childDefinition, childModel);\n\n const delegationLayer = SubagentRuntime.layer(chaosDelegation, childBinding, {\n mapChildFailure: (failure) => ChaosDelegationFailed.make({ childErrorTag: failure._tag }),\n durable: { targetDigests: childDigestStrings(laneIndex) },\n }).pipe(Layer.provide(delegationSupport));\n\n const parentResolved: ResolvedBinding = yield* DurableWorkerBinding.make(\n parentBinding,\n digests,\n ).pipe(Effect.provide(delegationLayer));\n\n const childResolved: ResolvedBinding = yield* DurableWorkerBinding.make(\n childBinding,\n childLaneDigests(laneIndex),\n );\n\n const registeredRuntime = yield* DurableAgentRuntime.pipe(\n Effect.provide(\n DurableAgentRuntime.layerWithBindings([parentResolved, childResolved]).pipe(\n Layer.provide(RunToolAuthorization.allowAll),\n ),\n ),\n );\n\n const driveResolved = (thread: ThreadId) => registeredRuntime.processThreadResolved(thread);\n\n const fixture: LaneFixture = {\n index: laneIndex,\n kind,\n threadId,\n ref,\n deskInPlay: false,\n submissionIndexes,\n submitOne: (flatIndex) =>\n runtime.submit(\n { definition: { id: coordinatorDefinition.id, input: coordinatorDefinition.input } },\n { mission: `chaos ${flatIndex}` },\n submitOptionsFor(flatIndex),\n ),\n drives: (firstReceipt) => {\n const drives: Array<\n Effect.Effect<ReadonlyArray<Settlement>, DurableWorkerFailure | DurableBindingFailure>\n > = [driveResolved(threadId)];\n\n if (firstReceipt !== undefined) {\n drives.push(\n driveResolved(\n childThreadIdFor(firstReceipt.submissionId, decodeToolCallId(DELEGATE_CALL_ID)),\n ),\n );\n }\n\n return drives;\n },\n childThreadOf: (firstReceipt) =>\n childThreadIdFor(firstReceipt.submissionId, decodeToolCallId(DELEGATE_CALL_ID)),\n };\n\n return fixture;\n }\n }\n});\n\n/** Stable per-call index into an injection list (identical across resolution passes). */\nconst injectionIndex = (submissionFlatIndex: number, callId: string, length: number): number => {\n let hash = submissionFlatIndex + 1;\n\n for (const char of callId) hash = (Math.imul(hash, 31) + char.charCodeAt(0)) | 0;\n\n return ((hash % length) + length) % length;\n};\n\nconst resolutionFor = (\n kind: ChaosResolutionKind,\n toolName: string,\n ref: string,\n produced: ReadonlySet<string>,\n): UnknownResolution => {\n switch (kind) {\n case \"abort-submission\":\n return ResolutionAbortSubmission.make();\n case \"completed-from-supplier\": {\n if (toolName === \"book\" && produced.has(bookConfirmation(ref))) {\n return ResolutionCompletedWithResult.make({\n result: { confirmation: bookConfirmation(ref) },\n isFailure: false,\n });\n }\n if (\n toolName === \"itinerary\" &&\n produced.has(flightValue(ref)) &&\n produced.has(lodgingValue(ref))\n ) {\n return ResolutionCompletedWithResult.make({\n result: { state: `${flightValue(ref)}+${lodgingValue(ref)}` },\n isFailure: false,\n });\n }\n\n // The desk never produced a value for this call — resolving \"completed\" would fabricate.\n return ResolutionNeverHappened.make();\n }\n case \"never-happened\":\n return ResolutionNeverHappened.make();\n }\n};\n\n/** Drive one DUR-017 pass: resolve Unknown Outcomes and pending approvals from the plan. */\nconst resolutionPass = Effect.fn(\"Chaos.resolutionPass\")(function* (\n plan: ChaosPlan,\n states: ReadonlyArray<SubmissionState>,\n desk: ChaosDesk,\n) {\n const runtime = yield* DurableAgentRuntime;\n const ledger = yield* SubmissionLedger;\n const produced = yield* desk.produced;\n const nonterminal = yield* tolerateTyped(Stream.runCollect(ledger.scanNonterminal));\n\n if (Option.isNone(nonterminal)) return;\n const byId = new Map<SubmissionId, SubmissionState>();\n\n for (const state of states) {\n if (state.receipt !== undefined) byId.set(state.receipt.submissionId, state);\n }\n for (const row of nonterminal.value) {\n if (row.state !== \"unknown\" && row.state !== \"suspended\") continue;\n const state = byId.get(row.submissionId);\n const explanation = yield* tolerateTyped(runtime.explain(row.submissionId));\n\n if (Option.isNone(explanation)) continue;\n const flatIndex = state?.flatIndex ?? 0;\n const ref = state?.lane.ref ?? \"ref-child\";\n\n if (row.state === \"unknown\") {\n for (const call of explanation.value.evidence.unknownCalls) {\n if (call.resolved) continue;\n\n const kind =\n plan.resolutionInjections.length === 0\n ? \"never-happened\"\n : (plan.resolutionInjections.at(\n injectionIndex(flatIndex, call.toolCallId, plan.resolutionInjections.length),\n ) ?? \"never-happened\");\n\n yield* tolerateTyped(\n runtime.resolveUnknown(\n UnknownResolutionCommand.make({\n submissionId: row.submissionId,\n toolCallId: call.toolCallId,\n author: \"chaos-runner\",\n reason: `chaos plan ${plan.seed} resolution (${kind})`,\n resolution: resolutionFor(kind, call.toolName, ref, produced),\n }),\n ),\n );\n }\n } else {\n for (const pending of explanation.value.evidence.approvalsPending) {\n const decision =\n plan.approvalDecisions.length === 0\n ? \"approved\"\n : (plan.approvalDecisions.at(\n injectionIndex(flatIndex, pending.toolCallId, plan.approvalDecisions.length),\n ) ?? \"approved\");\n\n yield* tolerateTyped(\n runtime.resolveApproval(\n ApprovalDecisionCommand.make({\n submissionId: row.submissionId,\n toolCallId: pending.toolCallId,\n decision,\n resolver: \"chaos-runner\",\n reason: `chaos plan ${plan.seed} approval (${decision})`,\n }),\n ),\n );\n }\n }\n }\n});\n\nconst submissionIdsNamedBy = (\n records: ReadonlyArray<CanonicalRecordEnvelope>,\n): ReadonlySet<SubmissionId> => {\n const named = new Set<SubmissionId>();\n\n for (const envelope of records) {\n const payload = envelope.record.payload;\n\n if (\n payload._tag === \"UserInputRecorded\" ||\n payload._tag === \"SubmissionSettled\" ||\n payload._tag === \"AbortRequested\"\n ) {\n if (payload.submissionId !== undefined) named.add(payload.submissionId);\n }\n }\n\n return named;\n};\n\n/**\n * The final non-fabrication sweep (durability §10): every canonical Tool success recorded on a\n * desk-backed lane must be a value the desk actually produced.\n */\nconst BookResult = Schema.Struct({ confirmation: Schema.String });\nconst ItineraryResult = Schema.Struct({ state: Schema.String });\nconst decodeBookResult = Schema.decodeUnknownOption(BookResult);\nconst decodeItineraryResult = Schema.decodeUnknownOption(ItineraryResult);\nconst decodeStepOutput = Schema.decodeUnknownOption(Schema.String);\n\nconst assertNoFabrication = (\n plan: ChaosPlan,\n records: ReadonlyArray<CanonicalRecordEnvelope>,\n produced: ReadonlySet<string>,\n): Effect.Effect<void, ChaosConvergenceFailure> => {\n const fabricated: Array<string> = [];\n\n const requireProduced = (value: string, label: string): void => {\n if (!produced.has(value)) fabricated.push(`${label} \"${value}\"`);\n };\n\n for (const envelope of records) {\n const payload = envelope.record.payload;\n\n if (payload._tag === \"ToolCallSettled\" && !payload.isFailure) {\n if (payload.toolName === \"book\") {\n const result = decodeBookResult(payload.result);\n\n if (Option.isSome(result)) requireProduced(result.value.confirmation, \"book result\");\n }\n if (payload.toolName === \"itinerary\") {\n const result = decodeItineraryResult(payload.result);\n\n if (Option.isSome(result)) {\n for (const part of result.value.state.split(\"+\")) {\n requireProduced(part, \"itinerary step result\");\n }\n }\n }\n }\n if (payload._tag === \"ToolStepSettled\") {\n const output = decodeStepOutput(payload.output);\n\n if (Option.isSome(output)) requireProduced(output.value, \"step output\");\n }\n }\n\n return fabricated.length === 0\n ? Effect.void\n : Effect.fail(\n ChaosConvergenceFailure.make({\n seed: plan.seed,\n message: `fabricated Tool results absent from the desk: ${fabricated.join(\", \")}`,\n }),\n );\n};\n\n/**\n * Execute one chaos plan against whatever adapters the ambient Layer provides and end in the\n * shared invariant claims. Deterministic: same plan + same adapters → same schedule.\n */\nexport const runChaosPlan = Effect.fn(\"Chaos.runChaosPlan\")(function* (\n plan: ChaosPlan,\n options?: ChaosRunOptions,\n) {\n const runtime = yield* DurableAgentRuntime;\n const ledger = yield* SubmissionLedger;\n const store = yield* ThreadStore;\n const config = yield* DurableRuntimeConfig;\n const failpoints = yield* DurableRuntimeFailpointTestControl;\n const random = mulberry32(plan.seed);\n const desk = yield* makeChaosDesk;\n\n // Lane fixtures: the FIRST spec of each lane fixes the lane's agent kind.\n const laneKinds = new Map<number, ChaosScenarioKind>();\n const laneSubmissions = new Map<number, Array<number>>();\n\n plan.submissions.forEach((spec, flatIndex) => {\n const lane = spec.lane % plan.lanes;\n\n if (!laneKinds.has(lane)) laneKinds.set(lane, spec.kind);\n const list = laneSubmissions.get(lane) ?? [];\n\n list.push(flatIndex);\n laneSubmissions.set(lane, list);\n });\n const lanes: Array<LaneFixture> = [];\n\n for (const [lane, kind] of laneKinds) {\n lanes.push(yield* makeLaneFixture(plan, lane, kind, laneSubmissions.get(lane) ?? [], desk));\n }\n\n const lanesByIndex = new Map(lanes.map((lane) => [lane.index, lane]));\n const states: Array<SubmissionState> = [];\n\n for (const [flatIndex, spec] of plan.submissions.entries()) {\n const laneIndex = spec.lane % plan.lanes;\n const lane = lanesByIndex.get(laneIndex);\n\n if (lane === undefined) {\n return yield* ChaosConvergenceFailure.make({\n seed: plan.seed,\n message: `submission ${flatIndex} addresses missing lane ${laneIndex}`,\n });\n }\n states.push({ flatIndex, lane, receipt: undefined });\n }\n const appliedAborts = new Set<number>();\n\n type ArmEntry =\n | { readonly family: \"coordinator\"; readonly location: DurableRuntimeFailpointLocation }\n | { readonly family: \"adapter\"; readonly location: string };\n\n const armQueue: Array<ArmEntry> = [\n ...plan.failpointArms.map((location): ArmEntry => ({ family: \"coordinator\", location })),\n ...plan.adapterArms.map((location): ArmEntry => ({ family: \"adapter\", location })),\n ];\n\n const allSettled = Effect.gen(function* () {\n if (states.some((state) => state.receipt === undefined)) return false;\n const nonterminal = yield* tolerateTyped(Stream.runCollect(ledger.scanNonterminal));\n\n return Option.isSome(nonterminal) && Array.from(nonterminal.value).length === 0;\n });\n\n const maxRounds = armQueue.length + states.length * 2 + 12;\n let rounds = 0;\n let converged = false;\n\n for (let round = 0; round < maxRounds; round++) {\n rounds = round + 1;\n const arm = armQueue[round];\n\n if (arm?.family === \"coordinator\") {\n const location = arm.location;\n\n yield* failpoints.setHandler((hit) =>\n hit === location\n ? Effect.fail(DurableRuntimeFailpointError.make({ location: hit }))\n : Effect.void,\n );\n } else if (arm?.family === \"adapter\" && options?.adapterFailpoints !== undefined) {\n yield* options.adapterFailpoints.arm(arm.location);\n }\n\n // Admission chaos: pending submissions retry under the active arm until a Receipt lands;\n // the identical (thread, principal, key) triple reattaches, never duplicates.\n for (const state of states) {\n if (state.receipt !== undefined) continue;\n const receipt = yield* tolerateTyped(state.lane.submitOne(state.flatIndex));\n\n if (Option.isSome(receipt)) state.receipt = receipt.value;\n }\n\n // Drive every lane (and discovered child lanes) in seeded order under the active arm.\n const order = lanes\n .map((lane) => ({ lane, rank: random() }))\n .sort((left, right) => left.rank - right.rank || left.lane.index - right.lane.index)\n .map(({ lane }) => lane);\n\n for (const lane of order) {\n const firstFlat = lane.submissionIndexes[0];\n const firstReceipt = firstFlat === undefined ? undefined : states[firstFlat]?.receipt;\n\n for (const drive of lane.drives(firstReceipt)) {\n yield* tolerateTyped(drive);\n }\n }\n\n // Abort injections fire once, while arms may still be active (abort:after-intent etc.).\n if (round >= 1) {\n for (const rawIndex of plan.abortInjections) {\n const index = rawIndex % states.length;\n\n if (appliedAborts.has(index)) continue;\n const receipt = states[index]?.receipt;\n\n if (receipt === undefined) continue;\n appliedAborts.add(index);\n yield* tolerateTyped(\n runtime.abort(\n AbortCommand.make({\n submissionId: receipt.submissionId,\n author: \"chaos-runner\",\n reason: `chaos plan ${plan.seed} abort injection`,\n }),\n ),\n );\n }\n }\n\n // First resolution pass runs under the arm so resolve:* locations can fire.\n yield* resolutionPass(plan, states, desk);\n\n yield* failpoints.clear;\n if (options?.adapterFailpoints !== undefined) yield* options.adapterFailpoints.clear;\n\n yield* tolerateTyped(runtime.runRecovery);\n // Second, unarmed pass guarantees forward progress for newly marked Unknown lanes.\n yield* resolutionPass(plan, states, desk);\n\n if (yield* allSettled) {\n converged = true;\n break;\n }\n if (options?.betweenRounds !== undefined) yield* options.betweenRounds;\n }\n\n if (!converged) {\n const nonterminal = yield* tolerateTyped(Stream.runCollect(ledger.scanNonterminal));\n\n const detail = Option.isSome(nonterminal)\n ? Array.from(nonterminal.value)\n .map((row: SubmissionSnapshot) => `${row.submissionId}(${row.state})`)\n .join(\", \")\n : \"ledger scan failed\";\n\n return yield* ChaosConvergenceFailure.make({\n seed: plan.seed,\n message: `plan did not converge within ${maxRounds} rounds; nonterminal: [${detail}]; pending receipts: ${states.filter((state) => state.receipt === undefined).length}`,\n });\n }\n\n // Final claims: the shared invariant checker per touched Thread, in convergence mode,\n // with the full digest chain (single known producer), plus the desk non-fabrication sweep.\n const produced = yield* desk.produced;\n const laneReports: Array<ChaosLaneReport> = [];\n\n const verifyThread = Effect.fn(\"Chaos.verifyThread\")(function* (\n threadId: ThreadId,\n kind: ChaosScenarioKind,\n deskInPlay: boolean,\n ) {\n const exported = yield* store.export(ThreadExportRequest.make({ threadId })).pipe(\n Effect.mapError((error) =>\n ChaosConvergenceFailure.make({\n seed: plan.seed,\n message: `export of ${threadId} failed: ${String(error)}`,\n }),\n ),\n );\n\n const rows: Array<SubmissionSnapshot> = [];\n\n for (const submissionId of submissionIdsNamedBy(exported.records)) {\n const found = yield* ledger.lookup(SubmissionLookupById.make({ submissionId })).pipe(\n Effect.mapError((error) =>\n ChaosConvergenceFailure.make({\n seed: plan.seed,\n message: `lookup of ${submissionId} failed: ${String(error)}`,\n }),\n ),\n );\n\n if (Option.isSome(found)) rows.push(found.value);\n }\n\n const batchProducers = new Map<BatchId, ProducerId>(\n exported.records.map((envelope) => [envelope.batchId, config.producerId]),\n );\n\n const report = yield* verifyThreadInvariants({\n export: exported,\n submissions: rows,\n batchProducers,\n requireAllSettled: true,\n });\n\n if (!report.ok) {\n const failed = report.checks\n .filter((check) => check.status === \"failed\")\n .map((check) => `${check.name}: ${check.detail ?? \"failed\"}`)\n .join(\"; \");\n\n return yield* ChaosConvergenceFailure.make({\n seed: plan.seed,\n message: `invariants failed for ${threadId} (${kind}): ${failed}`,\n });\n }\n if (deskInPlay) {\n yield* assertNoFabrication(plan, exported.records, produced);\n }\n laneReports.push(\n ChaosLaneReport.make({\n threadId,\n kind,\n submissionCount: rows.length,\n verified: report.ok,\n }),\n );\n });\n\n for (const lane of lanes) {\n yield* verifyThread(lane.threadId, lane.kind, lane.deskInPlay);\n // Delegation lanes: verify every materialized child Thread too.\n for (const flatIndex of lane.submissionIndexes) {\n const receipt = states[flatIndex]?.receipt;\n\n if (receipt === undefined) continue;\n const child = lane.childThreadOf(receipt);\n\n if (child === undefined) continue;\n\n const childExport = yield* Effect.exit(\n store.export(ThreadExportRequest.make({ threadId: child })),\n );\n\n if (Exit.isSuccess(childExport) && childExport.value.records.length > 0) {\n yield* verifyThread(child, \"plain\", false);\n }\n }\n }\n\n const obligations = yield* runtime\n .scanObligations(ObligationThresholds.make({ agingSeconds: 0, overdueSeconds: 0 }))\n .pipe(\n Effect.mapError((error) =>\n ChaosConvergenceFailure.make({\n seed: plan.seed,\n message: `scanObligations failed: ${String(error)}`,\n }),\n ),\n );\n\n if (obligations.entries.length > 0) {\n return yield* ChaosConvergenceFailure.make({\n seed: plan.seed,\n message: `open obligations after convergence: ${obligations.entries\n .map((entry) => `${entry.submissionId}(${entry.blockedOn})`)\n .join(\", \")}`,\n });\n }\n\n return ChaosPlanReport.make({\n seed: plan.seed,\n rounds,\n lanes: laneReports,\n openObligations: obligations.entries.length,\n });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"Chaos.mjs","names":[],"sources":["../src/Chaos.ts"],"sourcesContent":["import * as Subagent from \"@effect-agent/capabilities/Subagent\";\nimport { SubagentPolicy, SubagentRuntime } from \"@effect-agent/capabilities/Subagent\";\nimport { SubagentReservationsMemoryLive } from \"@effect-agent/capabilities/SubagentReservations\";\nimport * as Agent from \"@effect-agent/core/Agent\";\nimport { AgentPolicy } from \"@effect-agent/core/AgentPolicy\";\nimport {\n ThreadId,\n RunId,\n ToolCallId,\n TurnId,\n type SubmissionId,\n} from \"@effect-agent/core/Identifiers\";\nimport { IdGenerator } from \"@effect-agent/core/IdGenerator\";\nimport {\n DurableStep,\n DurableStepError,\n ToolExecutionClass,\n} from \"@effect-agent/engine/DurableStep\";\nimport { RunToolAuthorization } from \"@effect-agent/engine/RunOptions\";\nimport { ObligationThresholds } from \"@effect-agent/thread/Admin\";\nimport {\n DurableWorkerBinding,\n type DurableBindingFailure,\n type ResolvedBinding,\n} from \"@effect-agent/thread/AgentRegistration\";\nimport {\n DurableAgentRuntime,\n DurableRuntimeConfig,\n type DurableSubmitFailure,\n type DurableWorkerFailure,\n type Receipt,\n} from \"@effect-agent/thread/DurableAgentRuntime\";\nimport {\n DurableRuntimeFailpointError,\n DurableRuntimeFailpointLocation,\n} from \"@effect-agent/thread/DurableFailpoint\";\nimport {\n DefinitionDigests,\n Digest,\n type CanonicalRecordEnvelope,\n type BatchId,\n type ProducerId,\n} from \"@effect-agent/thread/Records\";\nimport { childThreadIdFor } from \"@effect-agent/thread/RunJournal\";\nimport {\n AbortCommand,\n ApprovalDecisionCommand,\n IdempotencyKey,\n Principal,\n ResolutionAbortSubmission,\n ResolutionCompletedWithResult,\n ResolutionNeverHappened,\n SubmissionLedger,\n SubmissionLookupById,\n UnknownResolutionCommand,\n type Settlement,\n type SubmissionSnapshot,\n type UnknownResolution,\n} from \"@effect-agent/thread/SubmissionLedger\";\nimport { DurableRuntimeFailpointTestControl } from \"@effect-agent/thread/testing/DurableFailpointTestControl\";\nimport { verifyThreadInvariants } from \"@effect-agent/thread/ThreadInvariants\";\nimport { ThreadExportRequest, ThreadStore } from \"@effect-agent/thread/ThreadStore\";\nimport { Cause, Effect, Exit, Layer, Option, Ref, Schema, Stream } from \"effect\";\nimport { FastCheck } from \"effect/testing\";\nimport {\n LanguageModel,\n Model,\n Tool,\n Toolkit,\n type Prompt,\n type Response,\n} from \"effect/unstable/ai\";\n\n/**\n * P7 WP4 chaos machinery (plan §5): a Schema-first `ChaosPlan`, a seeded generator over\n * `effect/testing/FastCheck` (already inside the pinned Effect — no new dependency), and a\n * deterministic runner that drives the durable coordinator over whatever adapter pair the test\n * provides. Every plan ends in the SAME claims the crash matrices make:\n *\n * 1. `verifyThreadInvariants` in convergence mode over every touched Thread (the\n * shared WP1 checker — one set of claims for admin verify, certification, chaos, and soak);\n * 2. `scanObligations` returning ZERO entries (everything settled; nothing invisibly stuck);\n * 3. supplier non-fabrication wherever the deterministic desk was in play (durability §10: no\n * canonical Tool success exists that the external store did not actually produce).\n *\n * Replay contract: the memory/SQLite chaos tests derive every plan from one root seed\n * (`CHAOS_SEED` env override; see `chaosSeedFromEnv`) and print that seed plus the failing\n * plan's own seed in the failure output, so any red run is replayable byte-for-byte.\n */\n\n// ---------------------------------------------------------------------------\n// ChaosPlan schema\n// ---------------------------------------------------------------------------\n\n/** The six durable scenario flavors a chaos lane can exercise (plan §5). */\nexport const ChaosScenarioKind = Schema.Literals([\n \"plain\",\n \"uncertain-tool\",\n \"durable-steps\",\n \"approval\",\n \"join\",\n \"delegation\",\n]);\n\nexport type ChaosScenarioKind = typeof ChaosScenarioKind.Type;\n\nconst LaneIndex = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0), Schema.isLessThanOrEqualTo(7));\n\n/** One Submission of a plan: which lane it queues into and that lane's scenario flavor. */\nexport class ChaosSubmissionSpec extends Schema.Class<ChaosSubmissionSpec>(\n \"@effect-agent/testing/ChaosSubmissionSpec\",\n)({\n lane: LaneIndex,\n /** The lane's flavor; the FIRST spec of a lane fixes the lane's agent. */\n kind: ChaosScenarioKind,\n}) {}\n\n/** How the runner resolves a durable Unknown Outcome it encounters (DUR-017 driver). */\nexport const ChaosResolutionKind = Schema.Literals([\n /** The call provably never started: the batch resumes and executes it. */\n \"never-happened\",\n /**\n * Recovered supplier truth: resolve with the EXACT value the desk produced. Falls back to\n * `never-happened` when the desk holds no value for the call, so the runner never fabricates.\n */\n \"completed-from-supplier\",\n /** Unresolvable: route into the abort path (settles aborted, audit retained). */\n \"abort-submission\",\n]);\n\nexport type ChaosResolutionKind = typeof ChaosResolutionKind.Type;\n\nexport const ChaosApprovalDecision = Schema.Literals([\"approved\", \"denied\"]);\nexport type ChaosApprovalDecision = typeof ChaosApprovalDecision.Type;\n\nconst BoundedAdapterArm = Schema.String.check(Schema.isMaxLength(128));\n\n/**\n * One seeded chaos plan (plan §5): the full fault schedule is data, so a failing run replays\n * from the plan alone. `failpointArms` are coordinator locations; `adapterArms` are\n * adapter-owned location names the adapter test validates (the memory runner has none).\n */\nexport class ChaosPlan extends Schema.Class<ChaosPlan>(\"@effect-agent/testing/ChaosPlan\")({\n /** Identifies this plan in failure output; derived from the root seed plus the plan index. */\n seed: Schema.Int,\n /** Lane count; submissions address lanes `0..lanes-1`. */\n lanes: Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(8)),\n submissions: Schema.NonEmptyArray(ChaosSubmissionSpec),\n /** Coordinator failpoint arms, consumed one per round (each fails every hit that round). */\n failpointArms: Schema.Array(DurableRuntimeFailpointLocation),\n /** Adapter-owned failpoint arms (e.g. SQLite `ledger:*`/`append:*` locations). */\n adapterArms: Schema.Array(BoundedAdapterArm),\n /** Flattened submission indices to abort mid-plan (modulo the submission count). */\n abortInjections: Schema.Array(Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))),\n /** Resolution choices for Unknown Outcomes, indexed deterministically per open call. */\n resolutionInjections: Schema.Array(ChaosResolutionKind),\n /** Approval decisions for suspended approval lanes, indexed deterministically per call. */\n approvalDecisions: Schema.Array(ChaosApprovalDecision),\n}) {}\n\n/** Per-lane verification result inside a plan report. */\nexport class ChaosLaneReport extends Schema.Class<ChaosLaneReport>(\n \"@effect-agent/testing/ChaosLaneReport\",\n)({\n threadId: ThreadId,\n kind: ChaosScenarioKind,\n submissionCount: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n /** Verdict of `verifyThreadInvariants` in convergence mode. */\n verified: Schema.Boolean,\n}) {}\n\n/** The Schema-first outcome of one executed chaos plan. */\nexport class ChaosPlanReport extends Schema.Class<ChaosPlanReport>(\n \"@effect-agent/testing/ChaosPlanReport\",\n)({\n seed: Schema.Int,\n rounds: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n lanes: Schema.Array(ChaosLaneReport),\n /** `scanObligations` entries after convergence — MUST be zero. */\n openObligations: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n}) {}\n\n/** Typed convergence/verification failure of one chaos plan (never a bare defect). */\nexport class ChaosConvergenceFailure extends Schema.TaggedError<ChaosConvergenceFailure>()(\n \"ChaosConvergenceFailure\",\n {\n seed: Schema.Int,\n message: Schema.String.check(Schema.isMaxLength(16_384)),\n },\n) {}\n\n// ---------------------------------------------------------------------------\n// Seeded generation\n// ---------------------------------------------------------------------------\n\n/** Default root seed for chaos suites; override with the `CHAOS_SEED` environment variable. */\nexport const DEFAULT_CHAOS_SEED = 20260813;\n\nconst ChaosSeedFromEnvironment = Schema.FiniteFromString.check(Schema.isInt());\nconst decodeChaosSeedFromEnvironment = Schema.decodeUnknownOption(ChaosSeedFromEnvironment);\n\n/** The root seed for this run: `CHAOS_SEED` when set to an integer, the default otherwise. */\nexport const chaosSeedFromEnv = (env: Record<string, string | undefined>): number => {\n const raw = env[\"CHAOS_SEED\"];\n\n if (raw === undefined || raw === \"\") return DEFAULT_CHAOS_SEED;\n\n return Option.getOrElse(decodeChaosSeedFromEnvironment(raw), () => DEFAULT_CHAOS_SEED);\n};\n\nexport interface ChaosGeneratorOptions {\n /** Root seed (print this in failure output for replay). */\n readonly seed: number;\n /** How many plans to derive. */\n readonly count: number;\n /** Adapter failpoint location names available to arm (empty for memory). */\n readonly adapterArms?: ReadonlyArray<string> | undefined;\n}\n\ninterface GeneratedLane {\n readonly kind: ChaosScenarioKind;\n readonly depth: number;\n}\n\nconst laneArbitrary: FastCheck.Arbitrary<GeneratedLane> = FastCheck.constantFrom<ChaosScenarioKind>(\n \"plain\",\n \"uncertain-tool\",\n \"durable-steps\",\n \"approval\",\n \"join\",\n \"delegation\",\n).chain((kind): FastCheck.Arbitrary<GeneratedLane> =>\n kind === \"join\"\n ? FastCheck.integer({ min: 2, max: 3 }).map((depth): GeneratedLane => ({ kind, depth }))\n : kind === \"plain\"\n ? FastCheck.integer({ min: 1, max: 2 }).map((depth): GeneratedLane => ({ kind, depth }))\n : FastCheck.constant<GeneratedLane>({ kind, depth: 1 }),\n);\n\ninterface ChaosPlanShape {\n readonly lanes: number;\n readonly submissions: readonly [ChaosSubmissionSpec, ...Array<ChaosSubmissionSpec>];\n readonly failpointArms: ReadonlyArray<DurableRuntimeFailpointLocation>;\n readonly adapterArms: ReadonlyArray<string>;\n readonly abortInjections: ReadonlyArray<number>;\n readonly resolutionInjections: ReadonlyArray<ChaosResolutionKind>;\n readonly approvalDecisions: ReadonlyArray<ChaosApprovalDecision>;\n}\n\nconst planShapeArbitrary = (\n adapterArms: ReadonlyArray<string>,\n): FastCheck.Arbitrary<ChaosPlanShape> =>\n FastCheck.record({\n lanes: FastCheck.array(laneArbitrary, { minLength: 1, maxLength: 3 }),\n failpointArms: FastCheck.uniqueArray(\n FastCheck.constantFrom(...DurableRuntimeFailpointLocation.literals),\n { maxLength: 3 },\n ),\n adapterArms:\n adapterArms.length === 0\n ? FastCheck.constant<Array<string>>([])\n : FastCheck.uniqueArray(FastCheck.constantFrom(...adapterArms), { maxLength: 2 }),\n abortInjections: FastCheck.uniqueArray(FastCheck.integer({ min: 0, max: 15 }), {\n maxLength: 2,\n }),\n resolutionInjections: FastCheck.array(\n FastCheck.constantFrom<ChaosResolutionKind>(\n \"never-happened\",\n \"completed-from-supplier\",\n \"abort-submission\",\n ),\n { maxLength: 4 },\n ),\n approvalDecisions: FastCheck.array(\n FastCheck.constantFrom<ChaosApprovalDecision>(\"approved\", \"denied\"),\n { maxLength: 2 },\n ),\n }).map((shape) => {\n const submissions = shape.lanes.flatMap((lane, index) =>\n Array.from({ length: lane.depth }, () =>\n ChaosSubmissionSpec.make({ lane: index, kind: lane.kind }),\n ),\n );\n\n const [first, ...rest] = submissions;\n\n // `lanes` >= 1 and every lane has depth >= 1, so `first` always exists.\n if (first === undefined) throw new Error(\"chaos generator produced an empty plan\");\n\n return {\n lanes: shape.lanes.length,\n submissions: [first, ...rest] as const,\n failpointArms: shape.failpointArms,\n adapterArms: shape.adapterArms,\n abortInjections: shape.abortInjections,\n resolutionInjections: shape.resolutionInjections,\n approvalDecisions: shape.approvalDecisions,\n };\n });\n\n/**\n * Derive `count` chaos plans deterministically from one root seed. The same\n * `{seed, count, adapterArms}` triple always yields byte-identical plans, so a failure line\n * `CHAOS_SEED=<seed>` replays the exact schedule.\n */\nexport const generateChaosPlans = (options: ChaosGeneratorOptions): ReadonlyArray<ChaosPlan> => {\n const sampled = FastCheck.sample(planShapeArbitrary(options.adapterArms ?? []), {\n seed: options.seed,\n numRuns: options.count,\n });\n\n return sampled.map((shape, index) =>\n ChaosPlan.make({ ...shape, seed: (Math.imul(options.seed, 31) + index) | 0 }),\n );\n};\n\n/** Deterministic PRNG for the runner's small ordering choices (lane drive order). */\nconst mulberry32 = (seed: number): (() => number) => {\n let state = seed | 0;\n\n return () => {\n state = (state + 0x6d2b79f5) | 0;\n let t = Math.imul(state ^ (state >>> 15), 1 | state);\n\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n};\n\n// ---------------------------------------------------------------------------\n// Lane fixtures (agents, scripted models, deterministic desk)\n// ---------------------------------------------------------------------------\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 toolTurn = (\n ...calls: ReadonlyArray<Response.StreamPartEncoded>\n): ReadonlyArray<Response.StreamPartEncoded> => [\n ...calls,\n { type: \"finish\", reason: \"tool-calls\", 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\n/**\n * Prompt-shaped scripted model: the response depends ONLY on the request prompt, so it stays\n * deterministic across Attempt re-invocations, batch resumes, and joined steering — no counter\n * to drift when chaos re-enters a Turn.\n */\nconst promptScriptedModel = (\n label: string,\n script: (prompt: Prompt.Prompt) => ReadonlyArray<Response.StreamPartEncoded>,\n) =>\n Model.make(\n \"scripted\",\n label,\n Layer.effect(\n LanguageModel.LanguageModel,\n LanguageModel.make({\n generateText: () => Effect.succeed([]),\n streamText: (request) => Stream.fromIterable(script(request.prompt)),\n }),\n ),\n );\n\nconst lastRole = (prompt: Prompt.Prompt): string | undefined => prompt.content.at(-1)?.role;\n\nconst policy = AgentPolicy.make({\n maxTurns: 3,\n maxToolCalls: 4,\n maxDuration: \"30 seconds\",\n toolConcurrency: 2,\n});\n\nconst PlainInput = Schema.Struct({ question: Schema.String });\nconst PlainOutput = Schema.Struct({ answer: Schema.String });\n\nconst plainDefinition = Agent.make(\"chaos-plain\", {\n input: PlainInput,\n output: PlainOutput,\n instructions: \"Answer as JSON.\",\n toolkit: Toolkit.empty,\n policy,\n});\n\n/** Unannotated → fail-closed `uncertain`: enters the prepared/settled protocol (DUR-009). */\nconst BookUncertain = Tool.make(\"book\", {\n parameters: Schema.Struct({ ref: Schema.String }),\n success: Schema.Struct({ confirmation: Schema.String }),\n});\n\nconst bookTools = Toolkit.make(BookUncertain);\n\nconst bookDefinition = Agent.make(\"chaos-book\", {\n input: PlainInput,\n output: PlainOutput,\n instructions: \"Book it.\",\n toolkit: bookTools,\n policy,\n});\n\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 approvalTools = Toolkit.make(BookApproval);\n\nconst approvalDefinition = Agent.make(\"chaos-approval\", {\n input: PlainInput,\n output: PlainOutput,\n instructions: \"Book after approval.\",\n toolkit: approvalTools,\n policy,\n});\n\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}).annotate(ToolExecutionClass, \"uncertain\");\n\nconst itineraryTools = Toolkit.make(Itinerary);\n\nconst itineraryDefinition = Agent.make(\"chaos-itinerary\", {\n input: PlainInput,\n output: PlainOutput,\n instructions: \"Reserve the itinerary.\",\n toolkit: itineraryTools,\n policy,\n});\n\nconst childDefinition = Agent.make(\"chaos-child\", {\n input: PlainInput,\n output: PlainOutput,\n instructions: \"Answer as JSON.\",\n toolkit: Toolkit.empty,\n policy: AgentPolicy.make({\n maxTurns: 2,\n maxToolCalls: 1,\n maxDuration: \"30 seconds\",\n toolConcurrency: 1,\n }),\n});\n\nclass ChaosDelegationFailed extends Schema.TaggedError<ChaosDelegationFailed>()(\n \"ChaosDelegationFailed\",\n { childErrorTag: Schema.String },\n) {}\n\nconst chaosDelegation = Subagent.define(\"delegate_chaos\", {\n description: \"Delegate one bounded chaos question.\",\n target: childDefinition,\n parameters: Schema.Struct({ topic: Schema.String }),\n success: Schema.Struct({ summary: Schema.String }),\n failure: ChaosDelegationFailed,\n prepareInput: ({ topic }) => Effect.succeed({ question: `chaos:${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: \"30 seconds\",\n }),\n});\n\nconst coordinatorDefinition = Agent.make(\"chaos-coordinator\", {\n input: Schema.Struct({ mission: Schema.String }),\n output: Schema.Struct({ report: Schema.String }),\n instructions: \"Delegate, then report as JSON.\",\n toolkit: Toolkit.make(chaosDelegation.tool),\n policy,\n});\n\nconst DELEGATE_CALL_ID = \"chaos-delegate-1\";\n\nconst HEX = \"0123456789abcdef\";\nconst decodeDigest = Schema.decodeSync(Digest);\n\nconst laneDigests = (lane: number): DefinitionDigests => {\n const digest = decodeDigest(HEX.charAt(lane % 8).repeat(64));\n\n return DefinitionDigests.make({ agent: digest, model: digest, tools: digest });\n};\n\nconst childDigestStrings = (lane: number) => {\n const char = HEX.charAt(8 + (lane % 8));\n\n return { agent: char.repeat(64), model: char.repeat(64), tools: char.repeat(64) } as const;\n};\n\nconst childLaneDigests = (lane: number): DefinitionDigests => {\n const strings = childDigestStrings(lane);\n\n return DefinitionDigests.make({\n agent: decodeDigest(strings.agent),\n model: decodeDigest(strings.model),\n tools: decodeDigest(strings.tools),\n });\n};\n\nconst CHAOS_PRINCIPAL = Schema.decodeSync(Principal)(\"principal-chaos\");\nconst decodeThreadId = Schema.decodeSync(ThreadId);\nconst decodeIdempotencyKey = Schema.decodeSync(IdempotencyKey);\nconst decodeToolCallId = Schema.decodeSync(ToolCallId);\nconst decodeRunId = Schema.decodeSync(RunId);\nconst decodeTurnId = Schema.decodeSync(TurnId);\n\n/** Fixture-only identity source consumed by the delegation Layer's ephemeral capture. */\nconst chaosIdentifiers = 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, \"chaos-fixture-thread\"),\n nextRunId: next(decodeRunId, \"chaos-fixture-run\"),\n nextTurnId: next(decodeTurnId, \"chaos-fixture-turn\"),\n };\n }),\n);\n\nconst delegationSupport = Layer.mergeAll(SubagentReservationsMemoryLive, chaosIdentifiers);\n\n/**\n * The deterministic external desk of one plan: every produced value is recorded so the final\n * non-fabrication sweep can prove each canonical Tool success came from here (durability §10).\n */\ninterface ChaosDesk {\n readonly produced: Effect.Effect<ReadonlySet<string>>;\n readonly record: (value: string) => Effect.Effect<void>;\n}\n\nconst makeChaosDesk: Effect.Effect<ChaosDesk> = Effect.gen(function* () {\n const produced = yield* Ref.make<ReadonlySet<string>>(new Set());\n\n return {\n produced: Ref.get(produced),\n record: (value: string) => Ref.update(produced, (current) => new Set(current).add(value)),\n };\n});\n\nconst bookConfirmation = (ref: string): string => `confirmed-${ref}`;\nconst flightValue = (ref: string): string => `flight-${ref}`;\nconst lodgingValue = (ref: string): string => `lodging-${ref}`;\n\n// ---------------------------------------------------------------------------\n// Runner\n// ---------------------------------------------------------------------------\n\n/** Adapter-owned failpoint control the SQLite runner supplies; memory has none. */\nexport interface ChaosAdapterFailpoints {\n readonly arm: (location: string) => Effect.Effect<void>;\n readonly clear: Effect.Effect<void>;\n}\n\nexport interface ChaosRunOptions {\n readonly adapterFailpoints?: ChaosAdapterFailpoints | undefined;\n /**\n * Executed at the end of every round. Adapters whose ownership leases block every new claim\n * until expiry (the SQLite ledger's D5 semantics — expiry only revokes the liveness\n * assumption; producer epochs stay the correctness fence) pass a deterministic\n * `TestClock.adjust` here so a dead Attempt's lane becomes reclaimable next round. The memory\n * ledger needs nothing: it allows same-producer reclaim under a live lease.\n */\n readonly betweenRounds?: Effect.Effect<void> | undefined;\n}\n\n/** Tolerate typed failures while preserving every defect and interruption reason. */\nconst tolerateTyped = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n): Effect.Effect<Option.Option<A>, never, R> =>\n effect.pipe(\n Effect.exit,\n Effect.flatMap((exit) => {\n if (Exit.isSuccess(exit)) return Effect.succeed(Option.some(exit.value));\n const unexpected = exit.cause.reasons.filter((reason) => reason._tag !== \"Fail\");\n\n return unexpected.length === 0\n ? Effect.succeed(Option.none<A>())\n : Effect.failCause(Cause.fromReasons<never>(unexpected));\n }),\n );\n\ninterface LaneFixture {\n readonly index: number;\n readonly kind: ChaosScenarioKind;\n readonly threadId: ThreadId;\n readonly ref: string;\n readonly deskInPlay: boolean;\n readonly submissionIndexes: ReadonlyArray<number>;\n readonly submitOne: (flatIndex: number) => Effect.Effect<Receipt, DurableSubmitFailure>;\n readonly drives: (\n firstReceipt: Receipt | undefined,\n ) => ReadonlyArray<\n Effect.Effect<ReadonlyArray<Settlement>, DurableWorkerFailure | DurableBindingFailure>\n >;\n readonly childThreadOf: (firstReceipt: Receipt) => ThreadId | undefined;\n}\n\ninterface SubmissionState {\n readonly flatIndex: number;\n readonly lane: LaneFixture;\n receipt: Receipt | undefined;\n}\n\nconst scriptFor = (\n kind: ChaosScenarioKind,\n ref: string,\n): ((prompt: Prompt.Prompt) => ReadonlyArray<Response.StreamPartEncoded>) => {\n switch (kind) {\n case \"plain\":\n case \"join\":\n return () => finalParts('{\"answer\":\"chaos\"}');\n case \"uncertain-tool\":\n case \"approval\":\n return (prompt) =>\n lastRole(prompt) === \"tool\"\n ? finalParts('{\"answer\":\"booked\"}')\n : toolTurn(toolCallPart(`book-${ref}`, \"book\", { ref }));\n case \"durable-steps\":\n return (prompt) =>\n lastRole(prompt) === \"tool\"\n ? finalParts('{\"answer\":\"reserved\"}')\n : toolTurn(toolCallPart(`itinerary-${ref}`, \"itinerary\", { ref }));\n case \"delegation\":\n return (prompt) =>\n lastRole(prompt) === \"tool\"\n ? finalParts('{\"report\":\"done\"}')\n : toolTurn(toolCallPart(DELEGATE_CALL_ID, \"delegate_chaos\", { topic: ref }));\n }\n};\n\nconst makeLaneFixture = Effect.fn(\"Chaos.makeLaneFixture\")(function* (\n plan: ChaosPlan,\n laneIndex: number,\n kind: ChaosScenarioKind,\n submissionIndexes: ReadonlyArray<number>,\n desk: ChaosDesk,\n) {\n const runtime = yield* DurableAgentRuntime;\n const threadId = decodeThreadId(`chaos-${plan.seed}-lane-${laneIndex}`);\n const ref = `ref-l${laneIndex}`;\n const script = scriptFor(kind, ref);\n const model = promptScriptedModel(`chaos-${kind}-${laneIndex}`, script);\n const digests = laneDigests(laneIndex);\n\n const submitOptionsFor = (flatIndex: number) => ({\n threadId,\n principal: CHAOS_PRINCIPAL,\n idempotencyKey: decodeIdempotencyKey(`chaos-${plan.seed}-s${flatIndex}`),\n definitions: digests,\n });\n\n const bookToolLayerFor = (tools: typeof bookTools | typeof approvalTools) =>\n tools.toLayer({\n book: ({ ref: called }) =>\n desk\n .record(bookConfirmation(called))\n .pipe(Effect.as({ confirmation: bookConfirmation(called) })),\n });\n\n const plainLaneFixture = (\n deskInPlay: boolean,\n drive: Effect.Effect<ReadonlyArray<Settlement>, DurableWorkerFailure | DurableBindingFailure>,\n submitOne: (flatIndex: number) => Effect.Effect<Receipt, DurableSubmitFailure>,\n ): LaneFixture => ({\n index: laneIndex,\n kind,\n threadId,\n ref,\n deskInPlay,\n submissionIndexes,\n submitOne,\n drives: () => [drive],\n childThreadOf: () => undefined,\n });\n\n switch (kind) {\n case \"plain\":\n case \"join\": {\n const agent = Agent.withModel(plainDefinition, model);\n\n return plainLaneFixture(false, runtime.processThread(agent, threadId), (flatIndex) =>\n runtime.submit(agent, { question: `chaos ${flatIndex}` }, submitOptionsFor(flatIndex)),\n );\n }\n case \"uncertain-tool\": {\n const agent = Agent.withModel(bookDefinition, model);\n\n return plainLaneFixture(\n true,\n runtime.processThread(agent, threadId).pipe(Effect.provide(bookToolLayerFor(bookTools))),\n (flatIndex) =>\n runtime.submit(agent, { question: `chaos ${flatIndex}` }, submitOptionsFor(flatIndex)),\n );\n }\n case \"approval\": {\n const agent = Agent.withModel(approvalDefinition, model);\n\n return plainLaneFixture(\n true,\n runtime\n .processThread(agent, threadId)\n .pipe(Effect.provide(bookToolLayerFor(approvalTools))),\n (flatIndex) =>\n runtime.submit(agent, { question: `chaos ${flatIndex}` }, submitOptionsFor(flatIndex)),\n );\n }\n case \"durable-steps\": {\n const agent = Agent.withModel(itineraryDefinition, model);\n\n const toolLayer = itineraryTools.toLayer({\n itinerary: ({ ref: called }) =>\n Effect.gen(function* () {\n const step = yield* DurableStep;\n\n const flight = yield* step.do(\n \"reserve-flight\",\n Schema.String,\n desk.record(flightValue(called)).pipe(Effect.as(flightValue(called))),\n );\n\n const lodging = yield* step.do(\n \"reserve-lodging\",\n Schema.String,\n desk.record(lodgingValue(called)).pipe(Effect.as(lodgingValue(called))),\n );\n\n return { state: `${flight}+${lodging}` };\n }),\n });\n\n return plainLaneFixture(\n true,\n runtime.processThread(agent, threadId).pipe(Effect.provide(toolLayer)),\n (flatIndex) =>\n runtime.submit(agent, { question: `chaos ${flatIndex}` }, submitOptionsFor(flatIndex)),\n );\n }\n case \"delegation\": {\n const parentBinding = Agent.withModel(coordinatorDefinition, model);\n\n const childModel = promptScriptedModel(`chaos-child-${laneIndex}`, () =>\n finalParts('{\"answer\":\"child\"}'),\n );\n\n const childBinding = Agent.withModel(childDefinition, childModel);\n\n const delegationLayer = SubagentRuntime.layer(chaosDelegation, childBinding, {\n mapChildFailure: (failure) => ChaosDelegationFailed.make({ childErrorTag: failure._tag }),\n durable: { targetDigests: childDigestStrings(laneIndex) },\n }).pipe(Layer.provide(delegationSupport));\n\n const parentResolved: ResolvedBinding = yield* DurableWorkerBinding.make(\n parentBinding,\n digests,\n ).pipe(Effect.provide(delegationLayer));\n\n const childResolved: ResolvedBinding = yield* DurableWorkerBinding.make(\n childBinding,\n childLaneDigests(laneIndex),\n );\n\n const registeredRuntime = yield* DurableAgentRuntime.pipe(\n Effect.provide(\n DurableAgentRuntime.layerWithBindings([parentResolved, childResolved]).pipe(\n Layer.provide(RunToolAuthorization.allowAll),\n ),\n ),\n );\n\n const driveResolved = (thread: ThreadId) => registeredRuntime.processThreadResolved(thread);\n\n const fixture: LaneFixture = {\n index: laneIndex,\n kind,\n threadId,\n ref,\n deskInPlay: false,\n submissionIndexes,\n submitOne: (flatIndex) =>\n runtime.submit(\n { definition: { id: coordinatorDefinition.id, input: coordinatorDefinition.input } },\n { mission: `chaos ${flatIndex}` },\n submitOptionsFor(flatIndex),\n ),\n drives: (firstReceipt) => {\n const drives: Array<\n Effect.Effect<ReadonlyArray<Settlement>, DurableWorkerFailure | DurableBindingFailure>\n > = [driveResolved(threadId)];\n\n if (firstReceipt !== undefined) {\n drives.push(\n driveResolved(\n childThreadIdFor(firstReceipt.submissionId, decodeToolCallId(DELEGATE_CALL_ID)),\n ),\n );\n }\n\n return drives;\n },\n childThreadOf: (firstReceipt) =>\n childThreadIdFor(firstReceipt.submissionId, decodeToolCallId(DELEGATE_CALL_ID)),\n };\n\n return fixture;\n }\n }\n});\n\n/** Stable per-call index into an injection list (identical across resolution passes). */\nconst injectionIndex = (submissionFlatIndex: number, callId: string, length: number): number => {\n let hash = submissionFlatIndex + 1;\n\n for (const char of callId) hash = (Math.imul(hash, 31) + char.charCodeAt(0)) | 0;\n\n return ((hash % length) + length) % length;\n};\n\nconst resolutionFor = (\n kind: ChaosResolutionKind,\n toolName: string,\n ref: string,\n produced: ReadonlySet<string>,\n): UnknownResolution => {\n switch (kind) {\n case \"abort-submission\":\n return ResolutionAbortSubmission.make();\n case \"completed-from-supplier\": {\n if (toolName === \"book\" && produced.has(bookConfirmation(ref))) {\n return ResolutionCompletedWithResult.make({\n result: { confirmation: bookConfirmation(ref) },\n isFailure: false,\n });\n }\n if (\n toolName === \"itinerary\" &&\n produced.has(flightValue(ref)) &&\n produced.has(lodgingValue(ref))\n ) {\n return ResolutionCompletedWithResult.make({\n result: { state: `${flightValue(ref)}+${lodgingValue(ref)}` },\n isFailure: false,\n });\n }\n\n // The desk never produced a value for this call — resolving \"completed\" would fabricate.\n return ResolutionNeverHappened.make();\n }\n case \"never-happened\":\n return ResolutionNeverHappened.make();\n }\n};\n\n/** Drive one DUR-017 pass: resolve Unknown Outcomes and pending approvals from the plan. */\nconst resolutionPass = Effect.fn(\"Chaos.resolutionPass\")(function* (\n plan: ChaosPlan,\n states: ReadonlyArray<SubmissionState>,\n desk: ChaosDesk,\n) {\n const runtime = yield* DurableAgentRuntime;\n const ledger = yield* SubmissionLedger;\n const produced = yield* desk.produced;\n const nonterminal = yield* tolerateTyped(Stream.runCollect(ledger.scanNonterminal));\n\n if (Option.isNone(nonterminal)) return;\n const byId = new Map<SubmissionId, SubmissionState>();\n\n for (const state of states) {\n if (state.receipt !== undefined) byId.set(state.receipt.submissionId, state);\n }\n for (const row of nonterminal.value) {\n if (row.state !== \"unknown\" && row.state !== \"suspended\") continue;\n const state = byId.get(row.submissionId);\n const explanation = yield* tolerateTyped(runtime.explain(row.submissionId));\n\n if (Option.isNone(explanation)) continue;\n const flatIndex = state?.flatIndex ?? 0;\n const ref = state?.lane.ref ?? \"ref-child\";\n\n if (row.state === \"unknown\") {\n for (const call of explanation.value.evidence.unknownCalls) {\n if (call.resolved) continue;\n\n const kind =\n plan.resolutionInjections.length === 0\n ? \"never-happened\"\n : (plan.resolutionInjections.at(\n injectionIndex(flatIndex, call.toolCallId, plan.resolutionInjections.length),\n ) ?? \"never-happened\");\n\n yield* tolerateTyped(\n runtime.resolveUnknown(\n UnknownResolutionCommand.make({\n submissionId: row.submissionId,\n toolCallId: call.toolCallId,\n author: \"chaos-runner\",\n reason: `chaos plan ${plan.seed} resolution (${kind})`,\n resolution: resolutionFor(kind, call.toolName, ref, produced),\n }),\n ),\n );\n }\n } else {\n for (const pending of explanation.value.evidence.approvalsPending) {\n const decision =\n plan.approvalDecisions.length === 0\n ? \"approved\"\n : (plan.approvalDecisions.at(\n injectionIndex(flatIndex, pending.toolCallId, plan.approvalDecisions.length),\n ) ?? \"approved\");\n\n yield* tolerateTyped(\n runtime.resolveApproval(\n ApprovalDecisionCommand.make({\n submissionId: row.submissionId,\n toolCallId: pending.toolCallId,\n decision,\n resolver: \"chaos-runner\",\n reason: `chaos plan ${plan.seed} approval (${decision})`,\n }),\n ),\n );\n }\n }\n }\n});\n\nconst submissionIdsNamedBy = (\n records: ReadonlyArray<CanonicalRecordEnvelope>,\n): ReadonlySet<SubmissionId> => {\n const named = new Set<SubmissionId>();\n\n for (const envelope of records) {\n const payload = envelope.record.payload;\n\n if (\n payload._tag === \"UserInputRecorded\" ||\n payload._tag === \"SubmissionSettled\" ||\n payload._tag === \"AbortRequested\"\n ) {\n if (payload.submissionId !== undefined) named.add(payload.submissionId);\n }\n }\n\n return named;\n};\n\n/**\n * The final non-fabrication sweep (durability §10): every canonical Tool success recorded on a\n * desk-backed lane must be a value the desk actually produced.\n */\nconst BookResult = Schema.Struct({ confirmation: Schema.String });\nconst ItineraryResult = Schema.Struct({ state: Schema.String });\nconst decodeBookResult = Schema.decodeUnknownOption(BookResult);\nconst decodeItineraryResult = Schema.decodeUnknownOption(ItineraryResult);\nconst decodeStepOutput = Schema.decodeUnknownOption(Schema.String);\n\nconst assertNoFabrication = (\n plan: ChaosPlan,\n records: ReadonlyArray<CanonicalRecordEnvelope>,\n produced: ReadonlySet<string>,\n): Effect.Effect<void, ChaosConvergenceFailure> => {\n const fabricated: Array<string> = [];\n\n const requireProduced = (value: string, label: string): void => {\n if (!produced.has(value)) fabricated.push(`${label} \"${value}\"`);\n };\n\n for (const envelope of records) {\n const payload = envelope.record.payload;\n\n if (payload._tag === \"ToolCallSettled\" && !payload.isFailure) {\n if (payload.toolName === \"book\") {\n const result = decodeBookResult(payload.result);\n\n if (Option.isSome(result)) requireProduced(result.value.confirmation, \"book result\");\n }\n if (payload.toolName === \"itinerary\") {\n const result = decodeItineraryResult(payload.result);\n\n if (Option.isSome(result)) {\n for (const part of result.value.state.split(\"+\")) {\n requireProduced(part, \"itinerary step result\");\n }\n }\n }\n }\n if (payload._tag === \"ToolStepSettled\") {\n const output = decodeStepOutput(payload.output);\n\n if (Option.isSome(output)) requireProduced(output.value, \"step output\");\n }\n }\n\n return fabricated.length === 0\n ? Effect.void\n : Effect.fail(\n ChaosConvergenceFailure.make({\n seed: plan.seed,\n message: `fabricated Tool results absent from the desk: ${fabricated.join(\", \")}`,\n }),\n );\n};\n\n/**\n * Execute one chaos plan against whatever adapters the ambient Layer provides and end in the\n * shared invariant claims. Deterministic: same plan + same adapters → same schedule.\n */\nexport const runChaosPlan = Effect.fn(\"Chaos.runChaosPlan\")(function* (\n plan: ChaosPlan,\n options?: ChaosRunOptions,\n) {\n const runtime = yield* DurableAgentRuntime;\n const ledger = yield* SubmissionLedger;\n const store = yield* ThreadStore;\n const config = yield* DurableRuntimeConfig;\n const failpoints = yield* DurableRuntimeFailpointTestControl;\n const random = mulberry32(plan.seed);\n const desk = yield* makeChaosDesk;\n\n // Lane fixtures: the FIRST spec of each lane fixes the lane's agent kind.\n const laneKinds = new Map<number, ChaosScenarioKind>();\n const laneSubmissions = new Map<number, Array<number>>();\n\n plan.submissions.forEach((spec, flatIndex) => {\n const lane = spec.lane % plan.lanes;\n\n if (!laneKinds.has(lane)) laneKinds.set(lane, spec.kind);\n const list = laneSubmissions.get(lane) ?? [];\n\n list.push(flatIndex);\n laneSubmissions.set(lane, list);\n });\n const lanes: Array<LaneFixture> = [];\n\n for (const [lane, kind] of laneKinds) {\n lanes.push(yield* makeLaneFixture(plan, lane, kind, laneSubmissions.get(lane) ?? [], desk));\n }\n\n const lanesByIndex = new Map(lanes.map((lane) => [lane.index, lane]));\n const states: Array<SubmissionState> = [];\n\n for (const [flatIndex, spec] of plan.submissions.entries()) {\n const laneIndex = spec.lane % plan.lanes;\n const lane = lanesByIndex.get(laneIndex);\n\n if (lane === undefined) {\n return yield* ChaosConvergenceFailure.make({\n seed: plan.seed,\n message: `submission ${flatIndex} addresses missing lane ${laneIndex}`,\n });\n }\n states.push({ flatIndex, lane, receipt: undefined });\n }\n const appliedAborts = new Set<number>();\n\n type ArmEntry =\n | { readonly family: \"coordinator\"; readonly location: DurableRuntimeFailpointLocation }\n | { readonly family: \"adapter\"; readonly location: string };\n\n const armQueue: Array<ArmEntry> = [\n ...plan.failpointArms.map((location): ArmEntry => ({ family: \"coordinator\", location })),\n ...plan.adapterArms.map((location): ArmEntry => ({ family: \"adapter\", location })),\n ];\n\n const allSettled = Effect.gen(function* () {\n if (states.some((state) => state.receipt === undefined)) return false;\n const nonterminal = yield* tolerateTyped(Stream.runCollect(ledger.scanNonterminal));\n\n return Option.isSome(nonterminal) && Array.from(nonterminal.value).length === 0;\n });\n\n const maxRounds = armQueue.length + states.length * 2 + 12;\n let rounds = 0;\n let converged = false;\n\n for (let round = 0; round < maxRounds; round++) {\n rounds = round + 1;\n const arm = armQueue[round];\n\n if (arm?.family === \"coordinator\") {\n const location = arm.location;\n\n yield* failpoints.setHandler((hit) =>\n hit === location\n ? Effect.fail(DurableRuntimeFailpointError.make({ location: hit }))\n : Effect.void,\n );\n } else if (arm?.family === \"adapter\" && options?.adapterFailpoints !== undefined) {\n yield* options.adapterFailpoints.arm(arm.location);\n }\n\n // Admission chaos: pending submissions retry under the active arm until a Receipt lands;\n // the identical (thread, principal, key) triple reattaches, never duplicates.\n for (const state of states) {\n if (state.receipt !== undefined) continue;\n const receipt = yield* tolerateTyped(state.lane.submitOne(state.flatIndex));\n\n if (Option.isSome(receipt)) state.receipt = receipt.value;\n }\n\n // Drive every lane (and discovered child lanes) in seeded order under the active arm.\n const order = lanes\n .map((lane) => ({ lane, rank: random() }))\n .sort((left, right) => left.rank - right.rank || left.lane.index - right.lane.index)\n .map(({ lane }) => lane);\n\n for (const lane of order) {\n const firstFlat = lane.submissionIndexes[0];\n const firstReceipt = firstFlat === undefined ? undefined : states[firstFlat]?.receipt;\n\n for (const drive of lane.drives(firstReceipt)) {\n yield* tolerateTyped(drive);\n }\n }\n\n // Abort injections fire once, while arms may still be active (abort:after-intent etc.).\n if (round >= 1) {\n for (const rawIndex of plan.abortInjections) {\n const index = rawIndex % states.length;\n\n if (appliedAborts.has(index)) continue;\n const receipt = states[index]?.receipt;\n\n if (receipt === undefined) continue;\n appliedAborts.add(index);\n yield* tolerateTyped(\n runtime.abort(\n AbortCommand.make({\n submissionId: receipt.submissionId,\n author: \"chaos-runner\",\n reason: `chaos plan ${plan.seed} abort injection`,\n }),\n ),\n );\n }\n }\n\n // First resolution pass runs under the arm so resolve:* locations can fire.\n yield* resolutionPass(plan, states, desk);\n\n yield* failpoints.clear;\n if (options?.adapterFailpoints !== undefined) yield* options.adapterFailpoints.clear;\n\n yield* tolerateTyped(runtime.runRecovery);\n // Second, unarmed pass guarantees forward progress for newly marked Unknown lanes.\n yield* resolutionPass(plan, states, desk);\n\n if (yield* allSettled) {\n converged = true;\n break;\n }\n if (options?.betweenRounds !== undefined) yield* options.betweenRounds;\n }\n\n if (!converged) {\n const nonterminal = yield* tolerateTyped(Stream.runCollect(ledger.scanNonterminal));\n\n const detail = Option.isSome(nonterminal)\n ? Array.from(nonterminal.value)\n .map((row: SubmissionSnapshot) => `${row.submissionId}(${row.state})`)\n .join(\", \")\n : \"ledger scan failed\";\n\n return yield* ChaosConvergenceFailure.make({\n seed: plan.seed,\n message: `plan did not converge within ${maxRounds} rounds; nonterminal: [${detail}]; pending receipts: ${states.filter((state) => state.receipt === undefined).length}`,\n });\n }\n\n // Final claims: the shared invariant checker per touched Thread, in convergence mode,\n // with the full digest chain (single known producer), plus the desk non-fabrication sweep.\n const produced = yield* desk.produced;\n const laneReports: Array<ChaosLaneReport> = [];\n\n const verifyThread = Effect.fn(\"Chaos.verifyThread\")(function* (\n threadId: ThreadId,\n kind: ChaosScenarioKind,\n deskInPlay: boolean,\n ) {\n const exported = yield* store.export(ThreadExportRequest.make({ threadId })).pipe(\n Effect.mapError((error) =>\n ChaosConvergenceFailure.make({\n seed: plan.seed,\n message: `export of ${threadId} failed: ${String(error)}`,\n }),\n ),\n );\n\n const rows: Array<SubmissionSnapshot> = [];\n\n for (const submissionId of submissionIdsNamedBy(exported.records)) {\n const found = yield* ledger.lookup(SubmissionLookupById.make({ submissionId })).pipe(\n Effect.mapError((error) =>\n ChaosConvergenceFailure.make({\n seed: plan.seed,\n message: `lookup of ${submissionId} failed: ${String(error)}`,\n }),\n ),\n );\n\n if (Option.isSome(found)) rows.push(found.value);\n }\n\n const batchProducers = new Map<BatchId, ProducerId>(\n exported.records.map((envelope) => [envelope.batchId, config.producerId]),\n );\n\n const report = yield* verifyThreadInvariants({\n export: exported,\n submissions: rows,\n batchProducers,\n requireAllSettled: true,\n });\n\n if (!report.ok) {\n const failed = report.checks\n .filter((check) => check.status === \"failed\")\n .map((check) => `${check.name}: ${check.detail ?? \"failed\"}`)\n .join(\"; \");\n\n return yield* ChaosConvergenceFailure.make({\n seed: plan.seed,\n message: `invariants failed for ${threadId} (${kind}): ${failed}`,\n });\n }\n if (deskInPlay) {\n yield* assertNoFabrication(plan, exported.records, produced);\n }\n laneReports.push(\n ChaosLaneReport.make({\n threadId,\n kind,\n submissionCount: rows.length,\n verified: report.ok,\n }),\n );\n });\n\n for (const lane of lanes) {\n yield* verifyThread(lane.threadId, lane.kind, lane.deskInPlay);\n // Delegation lanes: verify every materialized child Thread too.\n for (const flatIndex of lane.submissionIndexes) {\n const receipt = states[flatIndex]?.receipt;\n\n if (receipt === undefined) continue;\n const child = lane.childThreadOf(receipt);\n\n if (child === undefined) continue;\n\n const childExport = yield* Effect.exit(\n store.export(ThreadExportRequest.make({ threadId: child })),\n );\n\n if (Exit.isSuccess(childExport) && childExport.value.records.length > 0) {\n yield* verifyThread(child, \"plain\", false);\n }\n }\n }\n\n const obligations = yield* runtime\n .scanObligations(ObligationThresholds.make({ agingSeconds: 0, overdueSeconds: 0 }))\n .pipe(\n Effect.mapError((error) =>\n ChaosConvergenceFailure.make({\n seed: plan.seed,\n message: `scanObligations failed: ${String(error)}`,\n }),\n ),\n );\n\n if (obligations.entries.length > 0) {\n return yield* ChaosConvergenceFailure.make({\n seed: plan.seed,\n message: `open obligations after convergence: ${obligations.entries\n .map((entry) => `${entry.submissionId}(${entry.blockedOn})`)\n .join(\", \")}`,\n });\n }\n\n return ChaosPlanReport.make({\n seed: plan.seed,\n rounds,\n lanes: laneReports,\n openObligations: obligations.entries.length,\n });\n});\n"],"mappings":"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"}
@@ -117,11 +117,25 @@ const safeDecodeJson = (value) => {
117
117
  return Option.none();
118
118
  }
119
119
  };
120
+ const decodeJsonText = Schema.decodeUnknownOption(Schema.fromJsonString(Schema.Json));
121
+ /** Own serialized result text before bounding and decoding its detached JSON snapshot. */
122
+ const serializeJson = (value) => {
123
+ const decoded = safeDecodeJson(value);
124
+ if (Option.isNone(decoded)) return Option.none();
125
+ try {
126
+ return Option.fromUndefinedOr(JSON.stringify(decoded.value));
127
+ } catch {
128
+ return Option.none();
129
+ }
130
+ };
120
131
  const boundedThrown = (value) => {
121
132
  const decoded = safeDecodeJson(value);
122
133
  if (Option.isSome(decoded)) try {
123
134
  const encoded = JSON.stringify(decoded.value);
124
- if (encoded !== void 0 && encoded.length <= MAX_THROWN_CHARACTERS) return decoded.value;
135
+ if (encoded !== void 0 && encoded.length <= MAX_THROWN_CHARACTERS) {
136
+ const snapshot = decodeJsonText(encoded);
137
+ if (Option.isSome(snapshot)) return snapshot.value;
138
+ }
125
139
  } catch {}
126
140
  return boundedText(value);
127
141
  };
@@ -217,20 +231,25 @@ const serveHostCalls = (host, queue, limits, capture, counter) => Effect.gen(fun
217
231
  }
218
232
  });
219
233
  const classifyProgramFailure = (thrown, limits, capture) => {
220
- const inner = thrown instanceof EvaluationThrew ? thrown.inner : thrown;
221
- if (inner instanceof LogLimitSignal) return CodeOutputLimitError.make({
222
- implementation: inProcessCodeExecutorImplementation,
223
- surface: "logs",
224
- limit: limits.maxLogBytes,
225
- observed: inner.observed,
226
- logs: [...capture.lines]
227
- });
228
- if (inner instanceof NotAFunction) return CodeSourceError.make({
229
- implementation: inProcessCodeExecutorImplementation,
230
- reason: "not-a-function",
231
- message: `The source expression evaluated to ${inner.actual}; it must evaluate to one async function`
232
- });
233
- const reason = thrown instanceof EvaluationThrew || inner instanceof Error ? "threw" : "rejected";
234
+ let inner = thrown;
235
+ let reason = "rejected";
236
+ try {
237
+ const evaluationThrew = thrown instanceof EvaluationThrew;
238
+ inner = evaluationThrew ? thrown.inner : thrown;
239
+ if (inner instanceof LogLimitSignal) return CodeOutputLimitError.make({
240
+ implementation: inProcessCodeExecutorImplementation,
241
+ surface: "logs",
242
+ limit: limits.maxLogBytes,
243
+ observed: inner.observed,
244
+ logs: [...capture.lines]
245
+ });
246
+ if (inner instanceof NotAFunction) return CodeSourceError.make({
247
+ implementation: inProcessCodeExecutorImplementation,
248
+ reason: "not-a-function",
249
+ message: `The source expression evaluated to ${inner.actual}; it must evaluate to one async function`
250
+ });
251
+ reason = evaluationThrew || inner instanceof Error ? "threw" : "rejected";
252
+ } catch {}
234
253
  return CodeProgramFailedError.make({
235
254
  implementation: inProcessCodeExecutorImplementation,
236
255
  reason,
@@ -302,24 +321,28 @@ const executeInProcess = Effect.fn("InProcessCodeExecutor.execute")(function* (r
302
321
  limit: request.limits.maxHostCalls,
303
322
  logs: [...capture.lines]
304
323
  });
305
- const value = yield* Schema.decodeUnknownEffect(Schema.Json)(returned).pipe(Effect.mapError(() => CodeProgramFailedError.make({
324
+ const nonJsonResult = () => CodeProgramFailedError.make({
306
325
  implementation: inProcessCodeExecutorImplementation,
307
326
  reason: "non-json-result",
308
327
  thrown: null,
309
328
  message: "The program must return a JSON value",
310
329
  logs: [...capture.lines]
311
- })));
312
- const resultBytes = encodedJsonByteLength(value);
313
- if (resultBytes === void 0 || resultBytes > request.limits.maxResultBytes) return yield* CodeOutputLimitError.make({
330
+ });
331
+ const encoded = serializeJson(returned);
332
+ if (Option.isNone(encoded)) return yield* nonJsonResult();
333
+ const resultBytes = utf8ByteLength(encoded.value);
334
+ if (resultBytes > request.limits.maxResultBytes) return yield* CodeOutputLimitError.make({
314
335
  implementation: inProcessCodeExecutorImplementation,
315
336
  surface: "result",
316
337
  limit: request.limits.maxResultBytes,
317
- observed: resultBytes ?? 0,
338
+ observed: resultBytes,
318
339
  logs: [...capture.lines]
319
340
  });
341
+ const decoded = decodeJsonText(encoded.value);
342
+ if (Option.isNone(decoded)) return yield* nonJsonResult();
320
343
  return CodeExecutionResult.make({
321
344
  implementation: inProcessCodeExecutorImplementation,
322
- value,
345
+ value: decoded.value,
323
346
  logs: [...capture.lines],
324
347
  resourceUse: CodeExecutionResourceUse.make({
325
348
  wallTime: Duration.millis(Math.max(0, finishedAt - startedAt)),
@@ -1 +1 @@
1
- {"version":3,"file":"CodeExecutorSubstitute.mjs","names":[],"sources":["../src/CodeExecutorSubstitute.ts"],"sourcesContent":["import {\n CodeExecutionHost,\n CodeExecutionProtocolError,\n CodeExecutionResourceUse,\n CodeExecutionResult,\n CodeExecutionTimeoutError,\n CodeExecutor,\n type CodeExecutorExecute,\n CodeExecutorUnsupportedError,\n CodeHostCall,\n CodeHostCallLimitError,\n CodeHostCallResult,\n CodeOutputLimitError,\n CodeProgramFailedError,\n CodeSourceError,\n type CodeExecutionLimits,\n type CodeExecutionNamespace,\n type CodeExecutionRequest,\n} from \"@effect-agent/sandbox/CodeExecutor\";\nimport { SandboxImplementation } from \"@effect-agent/sandbox/Sandbox\";\nimport { Clock, Duration, Effect, Fiber, Layer, Option, Queue, Schema } from \"effect\";\n\n/**\n * The deterministic in-process executor substitute (C1 of ADR-0017). It runs\n * the generated program on the host JavaScript engine with best-effort global\n * shadowing only, so it self-identifies as `unisolated` and is never a\n * security boundary (CAP-010, CAP-015). It exists to prove the public\n * `CodeExecutor` contract and to drive deterministic capability tests.\n */\nexport const inProcessCodeExecutorImplementation = SandboxImplementation.make({\n isolation: \"unisolated\",\n identity: \"in-process-javascript\",\n});\n\n// These two caps mirror the wire schema bounds (`BoundedLogs` is at most\n// 4096 lines of at most 16 KiB each): capture must stay inside what\n// `CodeExecutionResult` can carry. A line over the per-line cap is truncated\n// with an explicit `…` marker; exceeding either the byte budget or the line\n// cap fails the pass typed.\nconst MAX_LOG_LINES = 4_096;\nconst MAX_LOG_LINE_CHARACTERS = 16_000;\nconst MAX_THROWN_CHARACTERS = 4_000;\n\nconst utf8ByteLength = (value: string): number => new TextEncoder().encode(value).byteLength;\n\n/**\n * Ambient globals shadowed inside the harness. Shadowing blocks the obvious\n * identifier paths only; a determined program can still escape, which is\n * exactly why this executor reports `unisolated` and the isolated network and\n * CPU enforcement conformance cases run only against isolated adapters.\n */\nconst shadowedGlobals = [\n \"fetch\",\n \"process\",\n \"require\",\n \"module\",\n \"exports\",\n \"global\",\n \"globalThis\",\n \"XMLHttpRequest\",\n \"WebSocket\",\n \"Deno\",\n \"Bun\",\n] as const;\n\nclass LogLimitSignal {\n constructor(readonly observed: number) {}\n}\n\nclass EvaluationThrew {\n constructor(readonly inner: unknown) {}\n}\n\nclass NotAFunction {\n constructor(readonly actual: string) {}\n}\n\ninterface LogCapture {\n readonly lines: Array<string>;\n bytes: number;\n}\n\n/**\n * Total, defect-free rendering of untrusted values: a hostile Proxy can throw\n * from property access, `toString`, and `Symbol.toPrimitive`, and an expected\n * program failure must never escape the typed channel as a defect while its\n * diagnostics are being serialized.\n */\nconst formatLogValue = (value: unknown): string => {\n try {\n if (typeof value === \"string\") {\n return value;\n }\n\n return JSON.stringify(value) ?? String(value);\n } catch {\n try {\n return String(value);\n } catch {\n return \"[unprintable value]\";\n }\n }\n};\n\nconst makeConsole = (capture: LogCapture, limits: CodeExecutionLimits) => {\n const write = (...values: ReadonlyArray<unknown>): void => {\n const joined = values.map(formatLogValue).join(\" \");\n\n const line =\n joined.length > MAX_LOG_LINE_CHARACTERS\n ? `${joined.slice(0, MAX_LOG_LINE_CHARACTERS - 1)}…`\n : joined;\n\n const bytes = utf8ByteLength(line);\n\n if (capture.lines.length >= MAX_LOG_LINES || capture.bytes + bytes > limits.maxLogBytes) {\n throw new LogLimitSignal(capture.bytes + bytes);\n }\n capture.lines.push(line);\n capture.bytes += bytes;\n };\n\n return { debug: write, error: write, info: write, log: write, warn: write };\n};\n\ninterface PendingHostCall {\n readonly namespace: string;\n readonly method: string;\n readonly argument: unknown;\n readonly resolve: (value: unknown) => void;\n readonly reject: (reason: unknown) => void;\n}\n\nconst buildNamespaceObject = (\n namespace: CodeExecutionNamespace,\n offer: (pending: PendingHostCall) => void,\n): Record<string, unknown> => {\n const methods: Record<string, unknown> = {};\n\n for (const method of namespace.methods) {\n methods[method] = (argument: unknown) =>\n new Promise((resolve, reject) => {\n offer({ namespace: namespace.name, method, argument, resolve, reject });\n });\n }\n\n return methods;\n};\n\nconst boundedText = (value: unknown): string => {\n try {\n const text = value instanceof Error ? `${value.name}: ${value.message}` : formatLogValue(value);\n\n return text.slice(0, MAX_THROWN_CHARACTERS);\n } catch {\n return \"[unserializable thrown value]\";\n }\n};\n\n/** Schema decoding of hostile values may itself throw through trap getters. */\nconst safeDecodeJson = (value: unknown): Option.Option<Schema.Json> => {\n try {\n return Schema.decodeUnknownOption(Schema.Json)(value);\n } catch {\n return Option.none();\n }\n};\n\nconst boundedThrown = (value: unknown): Schema.Json => {\n const decoded = safeDecodeJson(value);\n\n if (Option.isSome(decoded)) {\n try {\n const encoded = JSON.stringify(decoded.value);\n\n if (encoded !== undefined && encoded.length <= MAX_THROWN_CHARACTERS) {\n return decoded.value;\n }\n } catch {\n // fall through to the bounded string form\n }\n }\n\n return boundedText(value);\n};\n\nconst encodedJsonByteLength = (value: Schema.Json): number | undefined => {\n try {\n const encoded = JSON.stringify(value);\n\n return encoded === undefined ? undefined : utf8ByteLength(encoded);\n } catch {\n return undefined;\n }\n};\n\n/** Host outcomes are protocol input; a hostile value must not defect mid-decode. */\nconst decodeHostOutcome = (value: unknown): Option.Option<CodeHostCallResult> => {\n try {\n return Schema.decodeUnknownOption(CodeHostCallResult)(value);\n } catch {\n return Option.none();\n }\n};\n\nconst validateRequest = (\n request: CodeExecutionRequest,\n): Effect.Effect<void, CodeExecutorUnsupportedError | CodeSourceError> =>\n Effect.gen(function* () {\n if (request.network._tag !== \"NetworkDisabled\") {\n return yield* CodeExecutorUnsupportedError.make({\n implementation: inProcessCodeExecutorImplementation,\n feature: \"network\",\n message:\n \"The unisolated in-process executor cannot enforce an egress allowlist; only NetworkDisabled is accepted, and even that is shadowed rather than enforced\",\n });\n }\n if (request.limits.cpuMillis !== undefined) {\n return yield* CodeExecutorUnsupportedError.make({\n implementation: inProcessCodeExecutorImplementation,\n feature: \"cpu-limit\",\n message:\n \"The unisolated in-process executor shares the host engine and cannot enforce a CPU limit\",\n });\n }\n const reservedNames = new Set<string>([...shadowedGlobals, \"console\"]);\n const seen = new Set<string>();\n\n for (const namespace of request.namespaces) {\n if (reservedNames.has(namespace.name) || seen.has(namespace.name)) {\n return yield* CodeExecutorUnsupportedError.make({\n implementation: inProcessCodeExecutorImplementation,\n feature: \"namespaces\",\n message: `Namespace ${namespace.name} collides with a harness binding or another namespace`,\n });\n }\n seen.add(namespace.name);\n }\n const sourceBytes = utf8ByteLength(request.source);\n\n if (sourceBytes > request.limits.maxSourceBytes) {\n return yield* CodeSourceError.make({\n implementation: inProcessCodeExecutorImplementation,\n reason: \"oversized\",\n message: `Source is ${sourceBytes} bytes; the request allows ${request.limits.maxSourceBytes}`,\n });\n }\n });\n\nconst serveHostCalls = (\n host: CodeExecutionHost[\"Service\"],\n queue: Queue.Queue<PendingHostCall>,\n limits: CodeExecutionLimits,\n capture: LogCapture,\n counter: { calls: number },\n): Effect.Effect<\n never,\n CodeHostCallLimitError | CodeOutputLimitError | CodeExecutionProtocolError\n> =>\n Effect.gen(function* () {\n while (true) {\n const pending = yield* Queue.take(queue);\n\n counter.calls += 1;\n if (counter.calls > limits.maxHostCalls) {\n return yield* CodeHostCallLimitError.make({\n implementation: inProcessCodeExecutorImplementation,\n limit: limits.maxHostCalls,\n logs: [...capture.lines],\n });\n }\n const argument = safeDecodeJson(pending.argument);\n\n if (Option.isNone(argument)) {\n pending.reject(new TypeError(\"host call arguments must be JSON values\"));\n continue;\n }\n const argumentBytes = encodedJsonByteLength(argument.value);\n\n if (argumentBytes === undefined || argumentBytes > limits.maxHostCallArgumentBytes) {\n return yield* CodeOutputLimitError.make({\n implementation: inProcessCodeExecutorImplementation,\n surface: \"host-call-argument\",\n limit: limits.maxHostCallArgumentBytes,\n observed: argumentBytes ?? 0,\n logs: [...capture.lines],\n });\n }\n\n const rawOutcome = yield* host.call(\n CodeHostCall.make({\n namespace: pending.namespace,\n method: pending.method,\n argument: argument.value,\n }),\n );\n\n const outcome = decodeHostOutcome(rawOutcome);\n\n if (Option.isNone(outcome)) {\n return yield* CodeExecutionProtocolError.make({\n implementation: inProcessCodeExecutorImplementation,\n message: \"The execution host returned a value outside the CodeHostCallResult schema\",\n });\n }\n if (outcome.value._tag === \"CodeHostCallFailure\") {\n pending.reject(outcome.value.error);\n continue;\n }\n const resultBytes = encodedJsonByteLength(outcome.value.value);\n\n if (resultBytes === undefined || resultBytes > limits.maxHostCallResultBytes) {\n return yield* CodeOutputLimitError.make({\n implementation: inProcessCodeExecutorImplementation,\n surface: \"host-call-result\",\n limit: limits.maxHostCallResultBytes,\n observed: resultBytes ?? 0,\n logs: [...capture.lines],\n });\n }\n pending.resolve(outcome.value.value);\n }\n });\n\nconst classifyProgramFailure = (\n thrown: unknown,\n limits: CodeExecutionLimits,\n capture: LogCapture,\n): CodeOutputLimitError | CodeSourceError | CodeProgramFailedError => {\n const inner = thrown instanceof EvaluationThrew ? thrown.inner : thrown;\n\n if (inner instanceof LogLimitSignal) {\n return CodeOutputLimitError.make({\n implementation: inProcessCodeExecutorImplementation,\n surface: \"logs\",\n limit: limits.maxLogBytes,\n observed: inner.observed,\n logs: [...capture.lines],\n });\n }\n if (inner instanceof NotAFunction) {\n return CodeSourceError.make({\n implementation: inProcessCodeExecutorImplementation,\n reason: \"not-a-function\",\n message: `The source expression evaluated to ${inner.actual}; it must evaluate to one async function`,\n });\n }\n // An async function converts a body-level `throw` into a rejection, so the\n // split is by value shape: exception-like values read as `threw`, plain\n // rejection values (an uncaught host failure envelope) read as `rejected`.\n const reason = thrown instanceof EvaluationThrew || inner instanceof Error ? \"threw\" : \"rejected\";\n\n return CodeProgramFailedError.make({\n implementation: inProcessCodeExecutorImplementation,\n reason,\n thrown: boundedThrown(inner),\n message: boundedText(inner),\n logs: [...capture.lines],\n });\n};\n\nconst executeInProcess: CodeExecutorExecute = Effect.fn(\"InProcessCodeExecutor.execute\")(\n function* (request) {\n yield* validateRequest(request);\n const host = yield* CodeExecutionHost;\n const capture: LogCapture = { lines: [], bytes: 0 };\n const counter = { calls: 0 };\n const queue = yield* Queue.unbounded<PendingHostCall>();\n\n const factory = yield* Effect.try({\n try: () =>\n // This substitute intentionally evaluates authored test programs in-process and reports\n // an `unisolated` posture. Real adapters own the security boundary and never use this path.\n // oxlint-disable-next-line typescript/no-implied-eval\n new Function(\n ...shadowedGlobals,\n \"console\",\n ...request.namespaces.map((namespace) => namespace.name),\n `\"use strict\";\\nreturn (\\n${request.source}\\n);`,\n ),\n catch: (cause) =>\n CodeSourceError.make({\n implementation: inProcessCodeExecutorImplementation,\n reason: \"invalid\",\n message: boundedText(cause),\n }),\n });\n\n const harnessConsole = makeConsole(capture, request.limits);\n // Admission is enforced at call creation, not only at the single-consumer\n // dequeue: a burst of unawaited calls can enqueue at most one entry past\n // the cap (the entry the server fails the pass on); everything beyond is\n // rejected synchronously, so the queue stays bounded against hostile\n // programs.\n let issuedHostCalls = 0;\n\n const namespaceObjects = request.namespaces.map((namespace) =>\n buildNamespaceObject(namespace, (pending) => {\n issuedHostCalls += 1;\n if (issuedHostCalls > request.limits.maxHostCalls + 1) {\n pending.reject(new Error(`host-call limit of ${request.limits.maxHostCalls} exceeded`));\n\n return;\n }\n Queue.offerUnsafe(queue, pending);\n }),\n );\n\n const server = yield* serveHostCalls(host, queue, request.limits, capture, counter).pipe(\n Effect.forkScoped,\n );\n\n const program = Effect.tryPromise({\n try: async () => {\n let candidate: unknown;\n\n try {\n candidate = factory(\n ...shadowedGlobals.map(() => undefined),\n harnessConsole,\n ...namespaceObjects,\n );\n } catch (cause) {\n throw new EvaluationThrew(cause);\n }\n if (typeof candidate !== \"function\") {\n throw new EvaluationThrew(new NotAFunction(typeof candidate));\n }\n let outcome: unknown;\n\n try {\n outcome = candidate();\n } catch (cause) {\n throw new EvaluationThrew(cause);\n }\n\n return await Promise.resolve(outcome);\n },\n catch: (thrown) => classifyProgramFailure(thrown, request.limits, capture),\n });\n\n const startedAt = yield* Clock.currentTimeMillis;\n\n // The wall-clock deadline interrupts only at asynchronous suspension\n // points: a synchronous runaway shares the host thread and cannot be\n // stopped in-process — exactly why the platform CPU enforcement cases\n // belong to isolated adapters only (testing spec §8.1). The server fiber\n // is interrupted when the pass settles so no host call outlives the\n // program that issued it.\n const returned = yield* Effect.raceFirst(program, Fiber.join(server)).pipe(\n Effect.timeoutOrElse({\n duration: request.limits.maxWallTime,\n orElse: () =>\n CodeExecutionTimeoutError.make({\n implementation: inProcessCodeExecutorImplementation,\n kind: \"wall-clock\",\n maxWallTime: request.limits.maxWallTime,\n logs: [...capture.lines],\n }),\n }),\n Effect.ensuring(Fiber.interrupt(server)),\n );\n\n const finishedAt = yield* Clock.currentTimeMillis;\n\n // An unawaited burst can outrun the server: the program may return before\n // the over-limit entry is dequeued, so the admission counter is the\n // authority — a pass that ISSUED more calls than the cap fails even when\n // its promise settled first.\n if (issuedHostCalls > request.limits.maxHostCalls) {\n return yield* CodeHostCallLimitError.make({\n implementation: inProcessCodeExecutorImplementation,\n limit: request.limits.maxHostCalls,\n logs: [...capture.lines],\n });\n }\n\n const value = yield* Schema.decodeUnknownEffect(Schema.Json)(returned).pipe(\n Effect.mapError(() =>\n CodeProgramFailedError.make({\n implementation: inProcessCodeExecutorImplementation,\n reason: \"non-json-result\",\n thrown: null,\n message: \"The program must return a JSON value\",\n logs: [...capture.lines],\n }),\n ),\n );\n\n const resultBytes = encodedJsonByteLength(value);\n\n if (resultBytes === undefined || resultBytes > request.limits.maxResultBytes) {\n return yield* CodeOutputLimitError.make({\n implementation: inProcessCodeExecutorImplementation,\n surface: \"result\",\n limit: request.limits.maxResultBytes,\n observed: resultBytes ?? 0,\n logs: [...capture.lines],\n });\n }\n\n return CodeExecutionResult.make({\n implementation: inProcessCodeExecutorImplementation,\n value,\n logs: [...capture.lines],\n resourceUse: CodeExecutionResourceUse.make({\n wallTime: Duration.millis(Math.max(0, finishedAt - startedAt)),\n hostCalls: counter.calls,\n logBytes: capture.bytes,\n resultBytes,\n }),\n });\n },\n);\n\n/**\n * Layer providing the unisolated in-process `CodeExecutor` substitute. The\n * per-pass `CodeExecutionHost` stays in the caller's requirement channel, the\n * same as every real adapter.\n */\nexport const inProcessCodeExecutorLayer: Layer.Layer<CodeExecutor> = Layer.succeed(CodeExecutor)(\n CodeExecutor.of({ execute: executeInProcess }),\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"CodeExecutorSubstitute.mjs","names":[],"sources":["../src/CodeExecutorSubstitute.ts"],"sourcesContent":["import {\n CodeExecutionHost,\n CodeExecutionProtocolError,\n CodeExecutionResourceUse,\n CodeExecutionResult,\n CodeExecutionTimeoutError,\n CodeExecutor,\n type CodeExecutorExecute,\n CodeExecutorUnsupportedError,\n CodeHostCall,\n CodeHostCallLimitError,\n CodeHostCallResult,\n CodeOutputLimitError,\n CodeProgramFailedError,\n CodeSourceError,\n type CodeExecutionLimits,\n type CodeExecutionNamespace,\n type CodeExecutionRequest,\n} from \"@effect-agent/sandbox/CodeExecutor\";\nimport { SandboxImplementation } from \"@effect-agent/sandbox/Sandbox\";\nimport { Clock, Duration, Effect, Fiber, Layer, Option, Queue, Schema } from \"effect\";\n\n/**\n * The deterministic in-process executor substitute (C1 of ADR-0017). It runs\n * the generated program on the host JavaScript engine with best-effort global\n * shadowing only, so it self-identifies as `unisolated` and is never a\n * security boundary (CAP-010, CAP-015). It exists to prove the public\n * `CodeExecutor` contract and to drive deterministic capability tests.\n */\nexport const inProcessCodeExecutorImplementation = SandboxImplementation.make({\n isolation: \"unisolated\",\n identity: \"in-process-javascript\",\n});\n\n// These two caps mirror the wire schema bounds (`BoundedLogs` is at most\n// 4096 lines of at most 16 KiB each): capture must stay inside what\n// `CodeExecutionResult` can carry. A line over the per-line cap is truncated\n// with an explicit `…` marker; exceeding either the byte budget or the line\n// cap fails the pass typed.\nconst MAX_LOG_LINES = 4_096;\nconst MAX_LOG_LINE_CHARACTERS = 16_000;\nconst MAX_THROWN_CHARACTERS = 4_000;\n\nconst utf8ByteLength = (value: string): number => new TextEncoder().encode(value).byteLength;\n\n/**\n * Ambient globals shadowed inside the harness. Shadowing blocks the obvious\n * identifier paths only; a determined program can still escape, which is\n * exactly why this executor reports `unisolated` and the isolated network and\n * CPU enforcement conformance cases run only against isolated adapters.\n */\nconst shadowedGlobals = [\n \"fetch\",\n \"process\",\n \"require\",\n \"module\",\n \"exports\",\n \"global\",\n \"globalThis\",\n \"XMLHttpRequest\",\n \"WebSocket\",\n \"Deno\",\n \"Bun\",\n] as const;\n\nclass LogLimitSignal {\n constructor(readonly observed: number) {}\n}\n\nclass EvaluationThrew {\n constructor(readonly inner: unknown) {}\n}\n\nclass NotAFunction {\n constructor(readonly actual: string) {}\n}\n\ninterface LogCapture {\n readonly lines: Array<string>;\n bytes: number;\n}\n\n/**\n * Total, defect-free rendering of untrusted values: a hostile Proxy can throw\n * from property access, `toString`, and `Symbol.toPrimitive`, and an expected\n * program failure must never escape the typed channel as a defect while its\n * diagnostics are being serialized.\n */\nconst formatLogValue = (value: unknown): string => {\n try {\n if (typeof value === \"string\") {\n return value;\n }\n\n return JSON.stringify(value) ?? String(value);\n } catch {\n try {\n return String(value);\n } catch {\n return \"[unprintable value]\";\n }\n }\n};\n\nconst makeConsole = (capture: LogCapture, limits: CodeExecutionLimits) => {\n const write = (...values: ReadonlyArray<unknown>): void => {\n const joined = values.map(formatLogValue).join(\" \");\n\n const line =\n joined.length > MAX_LOG_LINE_CHARACTERS\n ? `${joined.slice(0, MAX_LOG_LINE_CHARACTERS - 1)}…`\n : joined;\n\n const bytes = utf8ByteLength(line);\n\n if (capture.lines.length >= MAX_LOG_LINES || capture.bytes + bytes > limits.maxLogBytes) {\n throw new LogLimitSignal(capture.bytes + bytes);\n }\n capture.lines.push(line);\n capture.bytes += bytes;\n };\n\n return { debug: write, error: write, info: write, log: write, warn: write };\n};\n\ninterface PendingHostCall {\n readonly namespace: string;\n readonly method: string;\n readonly argument: unknown;\n readonly resolve: (value: unknown) => void;\n readonly reject: (reason: unknown) => void;\n}\n\nconst buildNamespaceObject = (\n namespace: CodeExecutionNamespace,\n offer: (pending: PendingHostCall) => void,\n): Record<string, unknown> => {\n const methods: Record<string, unknown> = {};\n\n for (const method of namespace.methods) {\n methods[method] = (argument: unknown) =>\n new Promise((resolve, reject) => {\n offer({ namespace: namespace.name, method, argument, resolve, reject });\n });\n }\n\n return methods;\n};\n\nconst boundedText = (value: unknown): string => {\n try {\n const text = value instanceof Error ? `${value.name}: ${value.message}` : formatLogValue(value);\n\n return text.slice(0, MAX_THROWN_CHARACTERS);\n } catch {\n return \"[unserializable thrown value]\";\n }\n};\n\n/** Schema decoding of hostile values may itself throw through trap getters. */\nconst safeDecodeJson = (value: unknown): Option.Option<Schema.Json> => {\n try {\n return Schema.decodeUnknownOption(Schema.Json)(value);\n } catch {\n return Option.none();\n }\n};\n\nconst decodeJsonText = Schema.decodeUnknownOption(Schema.fromJsonString(Schema.Json));\n\n/** Own serialized result text before bounding and decoding its detached JSON snapshot. */\nconst serializeJson = (value: unknown): Option.Option<string> => {\n const decoded = safeDecodeJson(value);\n\n if (Option.isNone(decoded)) return Option.none();\n try {\n return Option.fromUndefinedOr(JSON.stringify(decoded.value));\n } catch {\n return Option.none();\n }\n};\n\nconst boundedThrown = (value: unknown): Schema.Json => {\n const decoded = safeDecodeJson(value);\n\n if (Option.isSome(decoded)) {\n try {\n const encoded = JSON.stringify(decoded.value);\n\n if (encoded !== undefined && encoded.length <= MAX_THROWN_CHARACTERS) {\n const snapshot = decodeJsonText(encoded);\n\n if (Option.isSome(snapshot)) return snapshot.value;\n }\n } catch {\n // fall through to the bounded string form\n }\n }\n\n return boundedText(value);\n};\n\nconst encodedJsonByteLength = (value: Schema.Json): number | undefined => {\n try {\n const encoded = JSON.stringify(value);\n\n return encoded === undefined ? undefined : utf8ByteLength(encoded);\n } catch {\n return undefined;\n }\n};\n\n/** Host outcomes are protocol input; a hostile value must not defect mid-decode. */\nconst decodeHostOutcome = (value: unknown): Option.Option<CodeHostCallResult> => {\n try {\n return Schema.decodeUnknownOption(CodeHostCallResult)(value);\n } catch {\n return Option.none();\n }\n};\n\nconst validateRequest = (\n request: CodeExecutionRequest,\n): Effect.Effect<void, CodeExecutorUnsupportedError | CodeSourceError> =>\n Effect.gen(function* () {\n if (request.network._tag !== \"NetworkDisabled\") {\n return yield* CodeExecutorUnsupportedError.make({\n implementation: inProcessCodeExecutorImplementation,\n feature: \"network\",\n message:\n \"The unisolated in-process executor cannot enforce an egress allowlist; only NetworkDisabled is accepted, and even that is shadowed rather than enforced\",\n });\n }\n if (request.limits.cpuMillis !== undefined) {\n return yield* CodeExecutorUnsupportedError.make({\n implementation: inProcessCodeExecutorImplementation,\n feature: \"cpu-limit\",\n message:\n \"The unisolated in-process executor shares the host engine and cannot enforce a CPU limit\",\n });\n }\n const reservedNames = new Set<string>([...shadowedGlobals, \"console\"]);\n const seen = new Set<string>();\n\n for (const namespace of request.namespaces) {\n if (reservedNames.has(namespace.name) || seen.has(namespace.name)) {\n return yield* CodeExecutorUnsupportedError.make({\n implementation: inProcessCodeExecutorImplementation,\n feature: \"namespaces\",\n message: `Namespace ${namespace.name} collides with a harness binding or another namespace`,\n });\n }\n seen.add(namespace.name);\n }\n const sourceBytes = utf8ByteLength(request.source);\n\n if (sourceBytes > request.limits.maxSourceBytes) {\n return yield* CodeSourceError.make({\n implementation: inProcessCodeExecutorImplementation,\n reason: \"oversized\",\n message: `Source is ${sourceBytes} bytes; the request allows ${request.limits.maxSourceBytes}`,\n });\n }\n });\n\nconst serveHostCalls = (\n host: CodeExecutionHost[\"Service\"],\n queue: Queue.Queue<PendingHostCall>,\n limits: CodeExecutionLimits,\n capture: LogCapture,\n counter: { calls: number },\n): Effect.Effect<\n never,\n CodeHostCallLimitError | CodeOutputLimitError | CodeExecutionProtocolError\n> =>\n Effect.gen(function* () {\n while (true) {\n const pending = yield* Queue.take(queue);\n\n counter.calls += 1;\n if (counter.calls > limits.maxHostCalls) {\n return yield* CodeHostCallLimitError.make({\n implementation: inProcessCodeExecutorImplementation,\n limit: limits.maxHostCalls,\n logs: [...capture.lines],\n });\n }\n const argument = safeDecodeJson(pending.argument);\n\n if (Option.isNone(argument)) {\n pending.reject(new TypeError(\"host call arguments must be JSON values\"));\n continue;\n }\n const argumentBytes = encodedJsonByteLength(argument.value);\n\n if (argumentBytes === undefined || argumentBytes > limits.maxHostCallArgumentBytes) {\n return yield* CodeOutputLimitError.make({\n implementation: inProcessCodeExecutorImplementation,\n surface: \"host-call-argument\",\n limit: limits.maxHostCallArgumentBytes,\n observed: argumentBytes ?? 0,\n logs: [...capture.lines],\n });\n }\n\n const rawOutcome = yield* host.call(\n CodeHostCall.make({\n namespace: pending.namespace,\n method: pending.method,\n argument: argument.value,\n }),\n );\n\n const outcome = decodeHostOutcome(rawOutcome);\n\n if (Option.isNone(outcome)) {\n return yield* CodeExecutionProtocolError.make({\n implementation: inProcessCodeExecutorImplementation,\n message: \"The execution host returned a value outside the CodeHostCallResult schema\",\n });\n }\n if (outcome.value._tag === \"CodeHostCallFailure\") {\n pending.reject(outcome.value.error);\n continue;\n }\n const resultBytes = encodedJsonByteLength(outcome.value.value);\n\n if (resultBytes === undefined || resultBytes > limits.maxHostCallResultBytes) {\n return yield* CodeOutputLimitError.make({\n implementation: inProcessCodeExecutorImplementation,\n surface: \"host-call-result\",\n limit: limits.maxHostCallResultBytes,\n observed: resultBytes ?? 0,\n logs: [...capture.lines],\n });\n }\n pending.resolve(outcome.value.value);\n }\n });\n\nconst classifyProgramFailure = (\n thrown: unknown,\n limits: CodeExecutionLimits,\n capture: LogCapture,\n): CodeOutputLimitError | CodeSourceError | CodeProgramFailedError => {\n let inner = thrown;\n let reason: \"threw\" | \"rejected\" = \"rejected\";\n\n try {\n const evaluationThrew = thrown instanceof EvaluationThrew;\n\n inner = evaluationThrew ? thrown.inner : thrown;\n if (inner instanceof LogLimitSignal) {\n return CodeOutputLimitError.make({\n implementation: inProcessCodeExecutorImplementation,\n surface: \"logs\",\n limit: limits.maxLogBytes,\n observed: inner.observed,\n logs: [...capture.lines],\n });\n }\n if (inner instanceof NotAFunction) {\n return CodeSourceError.make({\n implementation: inProcessCodeExecutorImplementation,\n reason: \"not-a-function\",\n message: `The source expression evaluated to ${inner.actual}; it must evaluate to one async function`,\n });\n }\n // Async body throws become rejections: exception-like values read as `threw`,\n // while plain values such as uncaught host failure envelopes read as `rejected`.\n reason = evaluationThrew || inner instanceof Error ? \"threw\" : \"rejected\";\n } catch {\n // A program-owned Proxy can throw from instanceof's prototype lookup. Keep\n // that failure inside the same guarded diagnostic boundary as its value.\n }\n\n return CodeProgramFailedError.make({\n implementation: inProcessCodeExecutorImplementation,\n reason,\n thrown: boundedThrown(inner),\n message: boundedText(inner),\n logs: [...capture.lines],\n });\n};\n\nconst executeInProcess: CodeExecutorExecute = Effect.fn(\"InProcessCodeExecutor.execute\")(\n function* (request) {\n yield* validateRequest(request);\n const host = yield* CodeExecutionHost;\n const capture: LogCapture = { lines: [], bytes: 0 };\n const counter = { calls: 0 };\n const queue = yield* Queue.unbounded<PendingHostCall>();\n\n const factory = yield* Effect.try({\n try: () =>\n // This substitute intentionally evaluates authored test programs in-process and reports\n // an `unisolated` posture. Real adapters own the security boundary and never use this path.\n // oxlint-disable-next-line typescript/no-implied-eval\n new Function(\n ...shadowedGlobals,\n \"console\",\n ...request.namespaces.map((namespace) => namespace.name),\n `\"use strict\";\\nreturn (\\n${request.source}\\n);`,\n ),\n catch: (cause) =>\n CodeSourceError.make({\n implementation: inProcessCodeExecutorImplementation,\n reason: \"invalid\",\n message: boundedText(cause),\n }),\n });\n\n const harnessConsole = makeConsole(capture, request.limits);\n // Admission is enforced at call creation, not only at the single-consumer\n // dequeue: a burst of unawaited calls can enqueue at most one entry past\n // the cap (the entry the server fails the pass on); everything beyond is\n // rejected synchronously, so the queue stays bounded against hostile\n // programs.\n let issuedHostCalls = 0;\n\n const namespaceObjects = request.namespaces.map((namespace) =>\n buildNamespaceObject(namespace, (pending) => {\n issuedHostCalls += 1;\n if (issuedHostCalls > request.limits.maxHostCalls + 1) {\n pending.reject(new Error(`host-call limit of ${request.limits.maxHostCalls} exceeded`));\n\n return;\n }\n Queue.offerUnsafe(queue, pending);\n }),\n );\n\n const server = yield* serveHostCalls(host, queue, request.limits, capture, counter).pipe(\n Effect.forkScoped,\n );\n\n const program = Effect.tryPromise({\n try: async () => {\n let candidate: unknown;\n\n try {\n candidate = factory(\n ...shadowedGlobals.map(() => undefined),\n harnessConsole,\n ...namespaceObjects,\n );\n } catch (cause) {\n throw new EvaluationThrew(cause);\n }\n if (typeof candidate !== \"function\") {\n throw new EvaluationThrew(new NotAFunction(typeof candidate));\n }\n let outcome: unknown;\n\n try {\n outcome = candidate();\n } catch (cause) {\n throw new EvaluationThrew(cause);\n }\n\n return await Promise.resolve(outcome);\n },\n catch: (thrown) => classifyProgramFailure(thrown, request.limits, capture),\n });\n\n const startedAt = yield* Clock.currentTimeMillis;\n\n // The wall-clock deadline interrupts only at asynchronous suspension\n // points: a synchronous runaway shares the host thread and cannot be\n // stopped in-process — exactly why the platform CPU enforcement cases\n // belong to isolated adapters only (testing spec §8.1). The server fiber\n // is interrupted when the pass settles so no host call outlives the\n // program that issued it.\n const returned = yield* Effect.raceFirst(program, Fiber.join(server)).pipe(\n Effect.timeoutOrElse({\n duration: request.limits.maxWallTime,\n orElse: () =>\n CodeExecutionTimeoutError.make({\n implementation: inProcessCodeExecutorImplementation,\n kind: \"wall-clock\",\n maxWallTime: request.limits.maxWallTime,\n logs: [...capture.lines],\n }),\n }),\n Effect.ensuring(Fiber.interrupt(server)),\n );\n\n const finishedAt = yield* Clock.currentTimeMillis;\n\n // An unawaited burst can outrun the server: the program may return before\n // the over-limit entry is dequeued, so the admission counter is the\n // authority — a pass that ISSUED more calls than the cap fails even when\n // its promise settled first.\n if (issuedHostCalls > request.limits.maxHostCalls) {\n return yield* CodeHostCallLimitError.make({\n implementation: inProcessCodeExecutorImplementation,\n limit: request.limits.maxHostCalls,\n logs: [...capture.lines],\n });\n }\n\n const nonJsonResult = () =>\n CodeProgramFailedError.make({\n implementation: inProcessCodeExecutorImplementation,\n reason: \"non-json-result\",\n thrown: null,\n message: \"The program must return a JSON value\",\n logs: [...capture.lines],\n });\n\n const encoded = serializeJson(returned);\n\n if (Option.isNone(encoded)) return yield* nonJsonResult();\n const resultBytes = utf8ByteLength(encoded.value);\n\n if (resultBytes > request.limits.maxResultBytes) {\n return yield* CodeOutputLimitError.make({\n implementation: inProcessCodeExecutorImplementation,\n surface: \"result\",\n limit: request.limits.maxResultBytes,\n observed: resultBytes,\n logs: [...capture.lines],\n });\n }\n const decoded = decodeJsonText(encoded.value);\n\n if (Option.isNone(decoded)) return yield* nonJsonResult();\n\n return CodeExecutionResult.make({\n implementation: inProcessCodeExecutorImplementation,\n value: decoded.value,\n logs: [...capture.lines],\n resourceUse: CodeExecutionResourceUse.make({\n wallTime: Duration.millis(Math.max(0, finishedAt - startedAt)),\n hostCalls: counter.calls,\n logBytes: capture.bytes,\n resultBytes,\n }),\n });\n },\n);\n\n/**\n * Layer providing the unisolated in-process `CodeExecutor` substitute. The\n * per-pass `CodeExecutionHost` stays in the caller's requirement channel, the\n * same as every real adapter.\n */\nexport const inProcessCodeExecutorLayer: Layer.Layer<CodeExecutor> = Layer.succeed(CodeExecutor)(\n CodeExecutor.of({ execute: executeInProcess }),\n);\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@effect-agent/testing","version":"0.1.0-beta.53","dependencies":{"@effect-agent/capabilities":"0.1.0-beta.53","@effect-agent/core":"0.1.0-beta.53","@effect-agent/engine":"0.1.0-beta.53","@effect-agent/sandbox":"0.1.0-beta.53","@effect-agent/thread":"0.1.0-beta.53"},"devDependencies":{"@effect-agent/platform-node":"0.1.0-beta.53","@effect-agent/storage-memory":"0.1.0-beta.53","@effect-agent/storage-sqlite":"0.1.0-beta.53","@effect/platform-node":"4.0.0-rc.112","@effect/sql-sqlite-node":"4.0.0-rc.112","@effect/vitest":"4.0.0-rc.112","effect":"4.0.0-rc.112","typescript":"7.0.2","vite-plus":"0.3.0"},"peerDependencies":{"effect":"^4.0.0-rc.112"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./Certification":{"types":"./dist/Certification.d.mts","default":"./dist/Certification.mjs"},"./Chaos":{"types":"./dist/Chaos.d.mts","default":"./dist/Chaos.mjs"},"./CodeExecutorConformance":{"types":"./dist/CodeExecutorConformance.d.mts","default":"./dist/CodeExecutorConformance.mjs"},"./CodeExecutorSubstitute":{"types":"./dist/CodeExecutorSubstitute.d.mts","default":"./dist/CodeExecutorSubstitute.mjs"},"./DocsResearcher":{"types":"./dist/DocsResearcher.d.mts","default":"./dist/DocsResearcher.mjs"},"./ScriptedModel":{"types":"./dist/ScriptedModel.d.mts","default":"./dist/ScriptedModel.mjs"},"./TravelPlanner":{"types":"./dist/TravelPlanner.d.mts","default":"./dist/TravelPlanner.mjs"}},"description":"Scripted models, deterministic fixtures, and adapter conformance kits for testing Effect Agent applications.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/danieljvdm/effect-agent.git","directory":"packages/testing"},"files":["dist","src"],"type":"module","sideEffects":[],"publishConfig":{"access":"public"},"scripts":{"build":"vp pack","check":"tsc --noEmit -p tsconfig.json","test":"vp test --passWithNoTests"}}
1
+ {"name":"@effect-agent/testing","version":"0.1.0-beta.54","dependencies":{"@effect-agent/capabilities":"0.1.0-beta.54","@effect-agent/core":"0.1.0-beta.54","@effect-agent/engine":"0.1.0-beta.54","@effect-agent/sandbox":"0.1.0-beta.54","@effect-agent/thread":"0.1.0-beta.54"},"devDependencies":{"@effect-agent/platform-node":"0.1.0-beta.54","@effect-agent/storage-memory":"0.1.0-beta.54","@effect-agent/storage-sqlite":"0.1.0-beta.54","@effect/platform-node":"4.0.0-rc.112","@effect/sql-sqlite-node":"4.0.0-rc.112","@effect/vitest":"4.0.0-rc.112","effect":"4.0.0-rc.112","typescript":"7.0.2","vite-plus":"0.3.0"},"peerDependencies":{"effect":"^4.0.0-rc.112"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./Certification":{"types":"./dist/Certification.d.mts","default":"./dist/Certification.mjs"},"./Chaos":{"types":"./dist/Chaos.d.mts","default":"./dist/Chaos.mjs"},"./CodeExecutorConformance":{"types":"./dist/CodeExecutorConformance.d.mts","default":"./dist/CodeExecutorConformance.mjs"},"./CodeExecutorSubstitute":{"types":"./dist/CodeExecutorSubstitute.d.mts","default":"./dist/CodeExecutorSubstitute.mjs"},"./DocsResearcher":{"types":"./dist/DocsResearcher.d.mts","default":"./dist/DocsResearcher.mjs"},"./ScriptedModel":{"types":"./dist/ScriptedModel.d.mts","default":"./dist/ScriptedModel.mjs"},"./TravelPlanner":{"types":"./dist/TravelPlanner.d.mts","default":"./dist/TravelPlanner.mjs"}},"description":"Scripted models, deterministic fixtures, and adapter conformance kits for testing Effect Agent applications.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/danieljvdm/effect-agent.git","directory":"packages/testing"},"files":["dist","src"],"type":"module","sideEffects":[],"publishConfig":{"access":"public"},"scripts":{"build":"vp pack","check":"tsc --noEmit -p tsconfig.json","test":"vp test --passWithNoTests"}}
package/src/Chaos.ts CHANGED
@@ -588,7 +588,7 @@ export interface ChaosRunOptions {
588
588
  readonly betweenRounds?: Effect.Effect<void> | undefined;
589
589
  }
590
590
 
591
- /** Success → Some; typed failure None (chaos tolerates it); defect rethrown loudly. */
591
+ /** Tolerate typed failures while preserving every defect and interruption reason. */
592
592
  const tolerateTyped = <A, E, R>(
593
593
  effect: Effect.Effect<A, E, R>,
594
594
  ): Effect.Effect<Option.Option<A>, never, R> =>
@@ -596,11 +596,11 @@ const tolerateTyped = <A, E, R>(
596
596
  Effect.exit,
597
597
  Effect.flatMap((exit) => {
598
598
  if (Exit.isSuccess(exit)) return Effect.succeed(Option.some(exit.value));
599
- if (Option.isSome(Cause.findErrorOption(exit.cause))) {
600
- return Effect.succeed(Option.none<A>());
601
- }
599
+ const unexpected = exit.cause.reasons.filter((reason) => reason._tag !== "Fail");
602
600
 
603
- return Effect.die(new Error(`chaos step died: ${Cause.pretty(exit.cause)}`));
601
+ return unexpected.length === 0
602
+ ? Effect.succeed(Option.none<A>())
603
+ : Effect.failCause(Cause.fromReasons<never>(unexpected));
604
604
  }),
605
605
  );
606
606
 
@@ -166,6 +166,20 @@ const safeDecodeJson = (value: unknown): Option.Option<Schema.Json> => {
166
166
  }
167
167
  };
168
168
 
169
+ const decodeJsonText = Schema.decodeUnknownOption(Schema.fromJsonString(Schema.Json));
170
+
171
+ /** Own serialized result text before bounding and decoding its detached JSON snapshot. */
172
+ const serializeJson = (value: unknown): Option.Option<string> => {
173
+ const decoded = safeDecodeJson(value);
174
+
175
+ if (Option.isNone(decoded)) return Option.none();
176
+ try {
177
+ return Option.fromUndefinedOr(JSON.stringify(decoded.value));
178
+ } catch {
179
+ return Option.none();
180
+ }
181
+ };
182
+
169
183
  const boundedThrown = (value: unknown): Schema.Json => {
170
184
  const decoded = safeDecodeJson(value);
171
185
 
@@ -174,7 +188,9 @@ const boundedThrown = (value: unknown): Schema.Json => {
174
188
  const encoded = JSON.stringify(decoded.value);
175
189
 
176
190
  if (encoded !== undefined && encoded.length <= MAX_THROWN_CHARACTERS) {
177
- return decoded.value;
191
+ const snapshot = decodeJsonText(encoded);
192
+
193
+ if (Option.isSome(snapshot)) return snapshot.value;
178
194
  }
179
195
  } catch {
180
196
  // fall through to the bounded string form
@@ -327,28 +343,36 @@ const classifyProgramFailure = (
327
343
  limits: CodeExecutionLimits,
328
344
  capture: LogCapture,
329
345
  ): CodeOutputLimitError | CodeSourceError | CodeProgramFailedError => {
330
- const inner = thrown instanceof EvaluationThrew ? thrown.inner : thrown;
346
+ let inner = thrown;
347
+ let reason: "threw" | "rejected" = "rejected";
331
348
 
332
- if (inner instanceof LogLimitSignal) {
333
- return CodeOutputLimitError.make({
334
- implementation: inProcessCodeExecutorImplementation,
335
- surface: "logs",
336
- limit: limits.maxLogBytes,
337
- observed: inner.observed,
338
- logs: [...capture.lines],
339
- });
340
- }
341
- if (inner instanceof NotAFunction) {
342
- return CodeSourceError.make({
343
- implementation: inProcessCodeExecutorImplementation,
344
- reason: "not-a-function",
345
- message: `The source expression evaluated to ${inner.actual}; it must evaluate to one async function`,
346
- });
349
+ try {
350
+ const evaluationThrew = thrown instanceof EvaluationThrew;
351
+
352
+ inner = evaluationThrew ? thrown.inner : thrown;
353
+ if (inner instanceof LogLimitSignal) {
354
+ return CodeOutputLimitError.make({
355
+ implementation: inProcessCodeExecutorImplementation,
356
+ surface: "logs",
357
+ limit: limits.maxLogBytes,
358
+ observed: inner.observed,
359
+ logs: [...capture.lines],
360
+ });
361
+ }
362
+ if (inner instanceof NotAFunction) {
363
+ return CodeSourceError.make({
364
+ implementation: inProcessCodeExecutorImplementation,
365
+ reason: "not-a-function",
366
+ message: `The source expression evaluated to ${inner.actual}; it must evaluate to one async function`,
367
+ });
368
+ }
369
+ // Async body throws become rejections: exception-like values read as `threw`,
370
+ // while plain values such as uncaught host failure envelopes read as `rejected`.
371
+ reason = evaluationThrew || inner instanceof Error ? "threw" : "rejected";
372
+ } catch {
373
+ // A program-owned Proxy can throw from instanceof's prototype lookup. Keep
374
+ // that failure inside the same guarded diagnostic boundary as its value.
347
375
  }
348
- // An async function converts a body-level `throw` into a rejection, so the
349
- // split is by value shape: exception-like values read as `threw`, plain
350
- // rejection values (an uncaught host failure envelope) read as `rejected`.
351
- const reason = thrown instanceof EvaluationThrew || inner instanceof Error ? "threw" : "rejected";
352
376
 
353
377
  return CodeProgramFailedError.make({
354
378
  implementation: inProcessCodeExecutorImplementation,
@@ -475,33 +499,36 @@ const executeInProcess: CodeExecutorExecute = Effect.fn("InProcessCodeExecutor.e
475
499
  });
476
500
  }
477
501
 
478
- const value = yield* Schema.decodeUnknownEffect(Schema.Json)(returned).pipe(
479
- Effect.mapError(() =>
480
- CodeProgramFailedError.make({
481
- implementation: inProcessCodeExecutorImplementation,
482
- reason: "non-json-result",
483
- thrown: null,
484
- message: "The program must return a JSON value",
485
- logs: [...capture.lines],
486
- }),
487
- ),
488
- );
502
+ const nonJsonResult = () =>
503
+ CodeProgramFailedError.make({
504
+ implementation: inProcessCodeExecutorImplementation,
505
+ reason: "non-json-result",
506
+ thrown: null,
507
+ message: "The program must return a JSON value",
508
+ logs: [...capture.lines],
509
+ });
489
510
 
490
- const resultBytes = encodedJsonByteLength(value);
511
+ const encoded = serializeJson(returned);
491
512
 
492
- if (resultBytes === undefined || resultBytes > request.limits.maxResultBytes) {
513
+ if (Option.isNone(encoded)) return yield* nonJsonResult();
514
+ const resultBytes = utf8ByteLength(encoded.value);
515
+
516
+ if (resultBytes > request.limits.maxResultBytes) {
493
517
  return yield* CodeOutputLimitError.make({
494
518
  implementation: inProcessCodeExecutorImplementation,
495
519
  surface: "result",
496
520
  limit: request.limits.maxResultBytes,
497
- observed: resultBytes ?? 0,
521
+ observed: resultBytes,
498
522
  logs: [...capture.lines],
499
523
  });
500
524
  }
525
+ const decoded = decodeJsonText(encoded.value);
526
+
527
+ if (Option.isNone(decoded)) return yield* nonJsonResult();
501
528
 
502
529
  return CodeExecutionResult.make({
503
530
  implementation: inProcessCodeExecutorImplementation,
504
- value,
531
+ value: decoded.value,
505
532
  logs: [...capture.lines],
506
533
  resourceUse: CodeExecutionResourceUse.make({
507
534
  wallTime: Duration.millis(Math.max(0, finishedAt - startedAt)),