@effect-agent/testing 0.1.0-beta.9 → 0.1.0-beta.91
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/Certification.d.mts +106 -0
- package/dist/Certification.mjs +633 -0
- package/dist/Certification.mjs.map +1 -0
- package/dist/Chaos.d.mts +126 -0
- package/dist/Chaos.mjs +755 -0
- package/dist/Chaos.mjs.map +1 -0
- package/dist/CodeExecutorConformance.d.mts +33 -0
- package/dist/CodeExecutorConformance.mjs +231 -0
- package/dist/CodeExecutorConformance.mjs.map +1 -0
- package/dist/CodeExecutorSubstitute.d.mts +21 -0
- package/dist/CodeExecutorSubstitute.mjs +368 -0
- package/dist/CodeExecutorSubstitute.mjs.map +1 -0
- package/dist/DocsResearcher.d.mts +276 -0
- package/dist/DocsResearcher.mjs +490 -0
- package/dist/DocsResearcher.mjs.map +1 -0
- package/dist/ScriptedModel-DAvxIiud.d.mts +220 -0
- package/dist/ScriptedModel.d.mts +2 -0
- package/dist/ScriptedModel.mjs +155 -0
- package/dist/ScriptedModel.mjs.map +1 -0
- package/dist/TravelPlanner.d.mts +1680 -0
- package/dist/TravelPlanner.mjs +1963 -0
- package/dist/TravelPlanner.mjs.map +1 -0
- package/dist/deterministic-layers-D5owIoke.mjs +358 -0
- package/dist/deterministic-layers-D5owIoke.mjs.map +1 -0
- package/dist/index.d.mts +2 -3408
- package/dist/index.mjs +2 -4771
- package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
- package/package.json +1 -48
- package/src/{certification.ts → Certification.ts} +366 -171
- package/src/{chaos.ts → Chaos.ts} +241 -127
- package/src/{code-executor-conformance.ts → CodeExecutorConformance.ts} +30 -7
- package/src/{code-executor-substitute.ts → CodeExecutorSubstitute.ts} +113 -46
- package/src/{fixtures/docs-researcher/index.ts → DocsResearcher.ts} +68 -5
- package/src/{scripted-model.ts → ScriptedModel.ts} +25 -29
- package/src/TravelPlanner.ts +232 -0
- package/src/fixtures/docs-researcher/definition.ts +20 -11
- package/src/fixtures/docs-researcher/harness.ts +41 -34
- package/src/fixtures/docs-researcher/mcp.ts +49 -3
- package/src/fixtures/travel-planner/definition.ts +15 -2
- package/src/fixtures/travel-planner/deterministic-layers.ts +47 -4
- package/src/fixtures/travel-planner/phase2.ts +4 -3
- package/src/fixtures/travel-planner/phase3.ts +19 -42
- package/src/fixtures/travel-planner/phase4.ts +24 -37
- package/src/fixtures/travel-planner/phase5.ts +35 -42
- package/src/fixtures/travel-planner/phase6.ts +191 -88
- package/src/fixtures/travel-planner/phase7.ts +4 -102
- package/src/fixtures/travel-planner/scenarios.ts +3 -4
- package/src/fixtures/travel-planner/subagents-durable.ts +35 -61
- package/src/fixtures/travel-planner/subagents.ts +36 -14
- package/src/index.ts +1 -11
- package/src/internal/certification-report.ts +25 -0
- package/dist/index.mjs.map +0 -1
- package/src/code-executor-conformance.d.ts +0 -30
- package/src/fixtures/travel-planner/index.ts +0 -11
- package/src/fixtures/warehouse/index.ts +0 -412
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chaos.mjs","names":[],"sources":["../src/Chaos.ts"],"sourcesContent":["import { Cause, Effect, Exit, Layer, Option, Ref, Schema, Stream } from \"effect\";\nimport { ObligationThresholds } from \"effect-agent/admin\";\nimport * as Agent from \"effect-agent/agent\";\nimport { AgentPolicy } from \"effect-agent/agent-policy\";\nimport {\n DurableWorkerBinding,\n type DurableBindingFailure,\n type ResolvedBinding,\n} from \"effect-agent/agent-registration\";\nimport {\n DurableAgentRuntime,\n DurableRuntimeConfig,\n type DurableSubmitFailure,\n type DurableWorkerFailure,\n type Receipt,\n} from \"effect-agent/durable-agent-runtime\";\nimport {\n DurableRuntimeFailpointError,\n DurableRuntimeFailpointLocation,\n} from \"effect-agent/durable-failpoint\";\nimport { DurableStep, DurableStepError, ToolExecutionClass } from \"effect-agent/durable-step\";\nimport { IdGenerator } from \"effect-agent/id-generator\";\nimport { ThreadId, RunId, ToolCallId, TurnId, type SubmissionId } from \"effect-agent/identifiers\";\nimport {\n DefinitionDigests,\n Digest,\n type CanonicalRecordEnvelope,\n type BatchId,\n type ProducerId,\n} from \"effect-agent/records\";\nimport { childThreadIdFor } from \"effect-agent/run-journal\";\nimport { RunToolAuthorization } from \"effect-agent/run-options\";\nimport * as Subagent from \"effect-agent/subagent\";\nimport { SubagentPolicy } from \"effect-agent/subagent\";\nimport { SubagentReservationsMemoryLive } from \"effect-agent/subagent-reservations\";\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/submission-ledger\";\nimport { DurableRuntimeFailpointTestControl } from \"effect-agent/testing/durable-failpoint-test-control\";\nimport { verifyThreadInvariants } from \"effect-agent/thread-invariants\";\nimport { ThreadExportRequest, ThreadStore } from \"effect-agent/thread-store\";\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 = Subagent.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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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
|
+
import { CodeExecutor } from "effect-agent/code-executor";
|
|
3
|
+
import { SandboxImplementation } from "effect-agent/sandbox";
|
|
4
|
+
//#region src/CodeExecutorConformance.d.ts
|
|
5
|
+
declare const CodeExecutorConformanceViolation_base: Schema.Class<CodeExecutorConformanceViolation, Schema.TaggedStruct<"CodeExecutorConformanceViolation", {
|
|
6
|
+
readonly caseName: Schema.String;
|
|
7
|
+
readonly message: Schema.String;
|
|
8
|
+
}>, import("effect/Cause").YieldableError>;
|
|
9
|
+
/**
|
|
10
|
+
* Shared `CodeExecutor` conformance (TEST-015). Every adapter — the
|
|
11
|
+
* deterministic `unisolated` substitute and each isolated adapter — runs
|
|
12
|
+
* `codeExecutorConformanceCases` verbatim. Enforcement cases that only genuine
|
|
13
|
+
* isolation can prove (ambient network denial, synchronous CPU runaway
|
|
14
|
+
* termination) are NOT here; they belong to isolated adapters only
|
|
15
|
+
* (testing spec §8.1).
|
|
16
|
+
*
|
|
17
|
+
* Cases assume the live `Clock` (the wall-clock case uses a short real
|
|
18
|
+
* deadline) and take one fresh executor pass per case, so a suite may share
|
|
19
|
+
* one executor Layer across cases.
|
|
20
|
+
*/
|
|
21
|
+
declare class CodeExecutorConformanceViolation extends CodeExecutorConformanceViolation_base {}
|
|
22
|
+
interface CodeExecutorConformanceCase {
|
|
23
|
+
readonly name: string;
|
|
24
|
+
readonly run: Effect.Effect<void, CodeExecutorConformanceViolation, CodeExecutor>;
|
|
25
|
+
}
|
|
26
|
+
interface CodeExecutorConformanceOptions {
|
|
27
|
+
/** The posture the adapter under test must stamp on results and errors. */
|
|
28
|
+
readonly implementation: SandboxImplementation;
|
|
29
|
+
}
|
|
30
|
+
declare const codeExecutorConformanceCases: (options: CodeExecutorConformanceOptions) => ReadonlyArray<CodeExecutorConformanceCase>;
|
|
31
|
+
//#endregion
|
|
32
|
+
export { CodeExecutorConformanceCase, CodeExecutorConformanceOptions, CodeExecutorConformanceViolation, codeExecutorConformanceCases };
|
|
33
|
+
//# sourceMappingURL=CodeExecutorConformance.d.mts.map
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { Deferred, Duration, Effect, Fiber, Schema } from "effect";
|
|
2
|
+
import { CodeExecutionHost, CodeExecutionLimits, CodeExecutionNamespace, CodeExecutionRequest, CodeExecutor, CodeHostCallFailure, CodeHostCallSuccess } from "effect-agent/code-executor";
|
|
3
|
+
import { NetworkAllowlist, NetworkDisabled } from "effect-agent/sandbox";
|
|
4
|
+
//#region src/CodeExecutorConformance.ts
|
|
5
|
+
/**
|
|
6
|
+
* Shared `CodeExecutor` conformance (TEST-015). Every adapter — the
|
|
7
|
+
* deterministic `unisolated` substitute and each isolated adapter — runs
|
|
8
|
+
* `codeExecutorConformanceCases` verbatim. Enforcement cases that only genuine
|
|
9
|
+
* isolation can prove (ambient network denial, synchronous CPU runaway
|
|
10
|
+
* termination) are NOT here; they belong to isolated adapters only
|
|
11
|
+
* (testing spec §8.1).
|
|
12
|
+
*
|
|
13
|
+
* Cases assume the live `Clock` (the wall-clock case uses a short real
|
|
14
|
+
* deadline) and take one fresh executor pass per case, so a suite may share
|
|
15
|
+
* one executor Layer across cases.
|
|
16
|
+
*/
|
|
17
|
+
var CodeExecutorConformanceViolation = class extends Schema.TaggedError()("CodeExecutorConformanceViolation", {
|
|
18
|
+
caseName: Schema.String,
|
|
19
|
+
message: Schema.String
|
|
20
|
+
}) {};
|
|
21
|
+
const baseLimits = CodeExecutionLimits.make({
|
|
22
|
+
maxSourceBytes: 65536,
|
|
23
|
+
maxWallTime: Duration.seconds(10),
|
|
24
|
+
maxLogBytes: 16384,
|
|
25
|
+
maxResultBytes: 65536,
|
|
26
|
+
maxHostCalls: 8,
|
|
27
|
+
maxHostCallArgumentBytes: 16384,
|
|
28
|
+
maxHostCallResultBytes: 32768
|
|
29
|
+
});
|
|
30
|
+
const warehouseNamespace = CodeExecutionNamespace.make({
|
|
31
|
+
name: "warehouse",
|
|
32
|
+
methods: ["query", "count"]
|
|
33
|
+
});
|
|
34
|
+
const makeRequest = (source, overrides) => CodeExecutionRequest.make({
|
|
35
|
+
language: "javascript",
|
|
36
|
+
source,
|
|
37
|
+
namespaces: overrides?.namespaces ?? [],
|
|
38
|
+
network: overrides?.network ?? NetworkDisabled.make(),
|
|
39
|
+
limits: overrides?.limits ?? baseLimits
|
|
40
|
+
});
|
|
41
|
+
const unusedHost = { call: () => Effect.die(/* @__PURE__ */ new Error("this conformance case expected no host call to reach the CodeExecutionHost")) };
|
|
42
|
+
const respondingHost = (respond) => {
|
|
43
|
+
const calls = [];
|
|
44
|
+
return {
|
|
45
|
+
calls,
|
|
46
|
+
host: { call: (call) => Effect.sync(() => {
|
|
47
|
+
calls.push(call);
|
|
48
|
+
return respond(call);
|
|
49
|
+
}) }
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
const runPass = (request, host) => Effect.gen(function* () {
|
|
53
|
+
return yield* (yield* CodeExecutor).execute(request).pipe(Effect.provideService(CodeExecutionHost, CodeExecutionHost.of(host)));
|
|
54
|
+
}).pipe(Effect.scoped);
|
|
55
|
+
const violation = (caseName, message) => CodeExecutorConformanceViolation.make({
|
|
56
|
+
caseName,
|
|
57
|
+
message
|
|
58
|
+
});
|
|
59
|
+
const preview = (value) => {
|
|
60
|
+
try {
|
|
61
|
+
return JSON.stringify(value)?.slice(0, 200) ?? String(value).slice(0, 200);
|
|
62
|
+
} catch {
|
|
63
|
+
return String(value).slice(0, 200);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const expectSuccess = (caseName, request, host, check) => runPass(request, host).pipe(Effect.mapError((error) => violation(caseName, `expected success, got ${error._tag}: ${preview(error)}`)), Effect.flatMap((result) => {
|
|
67
|
+
const complaint = check(result);
|
|
68
|
+
return complaint === void 0 ? Effect.void : Effect.fail(violation(caseName, complaint));
|
|
69
|
+
}));
|
|
70
|
+
const expectFailure = (caseName, request, host, tag, check) => runPass(request, host).pipe(Effect.flip, Effect.mapError((result) => violation(caseName, `expected ${tag}, but the pass succeeded with ${preview(result.value)}`)), Effect.flatMap((error) => {
|
|
71
|
+
if (error._tag !== tag) return Effect.fail(violation(caseName, `expected ${tag}, got ${error._tag}: ${preview(error)}`));
|
|
72
|
+
const complaint = check?.(error);
|
|
73
|
+
return complaint === void 0 ? Effect.void : Effect.fail(violation(caseName, complaint));
|
|
74
|
+
}));
|
|
75
|
+
const codeExecutorConformanceCases = (options) => {
|
|
76
|
+
const posture = options.implementation;
|
|
77
|
+
return [
|
|
78
|
+
{
|
|
79
|
+
name: "TEST-015 executes bounded JSON computation and returns the program value",
|
|
80
|
+
run: expectSuccess("TEST-015 executes bounded JSON computation and returns the program value", makeRequest("async () => { const xs = [1, 2, 3].map((n) => n * 2); return { xs, sum: xs.reduce((a, b) => a + b, 0) }; }"), unusedHost, (result) => JSON.stringify(result.value) === JSON.stringify({
|
|
81
|
+
xs: [
|
|
82
|
+
2,
|
|
83
|
+
4,
|
|
84
|
+
6
|
|
85
|
+
],
|
|
86
|
+
sum: 12
|
|
87
|
+
}) ? void 0 : `unexpected program value ${preview(result.value)}`)
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: "CAP-015 reports its isolation posture honestly in results and errors",
|
|
91
|
+
run: Effect.gen(function* () {
|
|
92
|
+
const caseName = "CAP-015 reports its isolation posture honestly in results and errors";
|
|
93
|
+
const result = yield* runPass(makeRequest("async () => 1"), unusedHost).pipe(Effect.mapError((error) => violation(caseName, `expected success, got ${error._tag}`)));
|
|
94
|
+
if (result.implementation.isolation !== posture.isolation || result.implementation.identity !== posture.identity) return yield* violation(caseName, `result posture ${preview(result.implementation)} does not match the declared ${preview(posture)}`);
|
|
95
|
+
const error = yield* runPass(makeRequest("async () => {"), unusedHost).pipe(Effect.flip, Effect.mapError(() => violation(caseName, "expected the invalid-source pass to fail")));
|
|
96
|
+
if (error.implementation === void 0 || error.implementation.isolation !== posture.isolation || error.implementation.identity !== posture.identity) return yield* violation(caseName, `error posture ${preview(error.implementation)} does not match the declared ${preview(posture)}`);
|
|
97
|
+
})
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: "TEST-015 routes host calls through the CodeExecutionHost in program order",
|
|
101
|
+
run: Effect.gen(function* () {
|
|
102
|
+
const caseName = "TEST-015 routes host calls through the CodeExecutionHost in program order";
|
|
103
|
+
const { host, calls } = respondingHost((call) => call.method === "query" ? CodeHostCallSuccess.make({ value: { rows: [
|
|
104
|
+
1,
|
|
105
|
+
2,
|
|
106
|
+
3
|
|
107
|
+
] } }) : CodeHostCallSuccess.make({ value: 3 }));
|
|
108
|
+
const result = yield* runPass(makeRequest("async () => { const q = await warehouse.query({ sql: 'select' }); const c = await warehouse.count({ table: 't' }); return { rows: q.rows, count: c }; }", { namespaces: [warehouseNamespace] }), host).pipe(Effect.mapError((error) => violation(caseName, `expected success, got ${error._tag}: ${preview(error)}`)));
|
|
109
|
+
if (JSON.stringify(result.value) !== JSON.stringify({
|
|
110
|
+
rows: [
|
|
111
|
+
1,
|
|
112
|
+
2,
|
|
113
|
+
3
|
|
114
|
+
],
|
|
115
|
+
count: 3
|
|
116
|
+
})) return yield* violation(caseName, `unexpected value ${preview(result.value)}`);
|
|
117
|
+
const observed = calls.map((call) => `${call.namespace}.${call.method}`);
|
|
118
|
+
if (JSON.stringify(observed) !== JSON.stringify(["warehouse.query", "warehouse.count"])) return yield* violation(caseName, `unexpected host call order ${preview(observed)}`);
|
|
119
|
+
if (result.resourceUse.hostCalls !== 2) return yield* violation(caseName, `expected 2 accounted host calls, got ${result.resourceUse.hostCalls}`);
|
|
120
|
+
})
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: "TEST-015 a caught failed host call lets the program branch on the envelope",
|
|
124
|
+
run: expectSuccess("TEST-015 a caught failed host call lets the program branch on the envelope", makeRequest("async () => { try { await warehouse.query({ sql: 'x' }); return 'unreachable'; } catch (envelope) { return { caught: envelope }; } }", { namespaces: [warehouseNamespace] }), respondingHost(() => CodeHostCallFailure.make({ error: {
|
|
125
|
+
_tag: "ToolInputError",
|
|
126
|
+
message: "bad input"
|
|
127
|
+
} })).host, (result) => JSON.stringify(result.value) === JSON.stringify({ caught: {
|
|
128
|
+
_tag: "ToolInputError",
|
|
129
|
+
message: "bad input"
|
|
130
|
+
} }) ? void 0 : `the envelope did not round-trip: ${preview(result.value)}`)
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
name: "TEST-015 an uncaught failed host call fails the program with the envelope",
|
|
134
|
+
run: expectFailure("TEST-015 an uncaught failed host call fails the program with the envelope", makeRequest("async () => warehouse.query({ sql: 'x' })", { namespaces: [warehouseNamespace] }), respondingHost(() => CodeHostCallFailure.make({ error: {
|
|
135
|
+
_tag: "PolicyDenied",
|
|
136
|
+
message: "denied"
|
|
137
|
+
} })).host, "CodeProgramFailedError", (error) => error._tag === "CodeProgramFailedError" && error.reason === "rejected" && JSON.stringify(error.thrown) === JSON.stringify({
|
|
138
|
+
_tag: "PolicyDenied",
|
|
139
|
+
message: "denied"
|
|
140
|
+
}) ? void 0 : `unexpected failure detail ${preview(error)}`)
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
name: "TEST-015 fails typed on syntactically invalid source",
|
|
144
|
+
run: expectFailure("TEST-015 fails typed on syntactically invalid source", makeRequest("async () => {"), unusedHost, "CodeSourceError", (error) => error._tag === "CodeSourceError" && error.reason === "invalid" ? void 0 : `expected reason invalid, got ${preview(error)}`)
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: "TEST-015 fails typed when the expression is not one async function",
|
|
148
|
+
run: expectFailure("TEST-015 fails typed when the expression is not one async function", makeRequest("1 + 1"), unusedHost, "CodeSourceError", (error) => error._tag === "CodeSourceError" && error.reason === "not-a-function" ? void 0 : `expected reason not-a-function, got ${preview(error)}`)
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
name: "TEST-015 fails typed on source larger than the declared byte limit",
|
|
152
|
+
run: expectFailure("TEST-015 fails typed on source larger than the declared byte limit", makeRequest(`async () => "${"x".repeat(2e3)}"`, { limits: CodeExecutionLimits.make({
|
|
153
|
+
...baseLimits,
|
|
154
|
+
maxSourceBytes: 256
|
|
155
|
+
}) }), unusedHost, "CodeSourceError", (error) => error._tag === "CodeSourceError" && error.reason === "oversized" ? void 0 : `expected reason oversized, got ${preview(error)}`)
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
name: "TEST-015 terminates a never-settling program at the wall-clock deadline",
|
|
159
|
+
run: expectFailure("TEST-015 terminates a never-settling program at the wall-clock deadline", makeRequest("async () => { await new Promise(() => {}); return 1; }", { limits: CodeExecutionLimits.make({
|
|
160
|
+
...baseLimits,
|
|
161
|
+
maxWallTime: Duration.millis(250)
|
|
162
|
+
}) }), unusedHost, "CodeExecutionTimeoutError")
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
name: "TEST-015 fails typed when console output exceeds its byte budget",
|
|
166
|
+
run: expectFailure("TEST-015 fails typed when console output exceeds its byte budget", makeRequest("async () => { for (let i = 0; i < 64; i += 1) { console.log('x'.repeat(256)); } return 1; }", { limits: CodeExecutionLimits.make({
|
|
167
|
+
...baseLimits,
|
|
168
|
+
maxLogBytes: 2048
|
|
169
|
+
}) }), unusedHost, "CodeOutputLimitError", (error) => error._tag === "CodeOutputLimitError" && error.surface === "logs" ? void 0 : `expected surface logs, got ${preview(error)}`)
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
name: "TEST-015 fails typed when the final result exceeds its byte budget",
|
|
173
|
+
run: expectFailure("TEST-015 fails typed when the final result exceeds its byte budget", makeRequest("async () => 'y'.repeat(4096)", { limits: CodeExecutionLimits.make({
|
|
174
|
+
...baseLimits,
|
|
175
|
+
maxResultBytes: 1024
|
|
176
|
+
}) }), unusedHost, "CodeOutputLimitError", (error) => error._tag === "CodeOutputLimitError" && error.surface === "result" ? void 0 : `expected surface result, got ${preview(error)}`)
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
name: "TEST-015 fails typed when host calls exceed the executor cap",
|
|
180
|
+
run: Effect.gen(function* () {
|
|
181
|
+
const caseName = "TEST-015 fails typed when host calls exceed the executor cap";
|
|
182
|
+
const { host, calls } = respondingHost(() => CodeHostCallSuccess.make({ value: null }));
|
|
183
|
+
yield* expectFailure(caseName, makeRequest("async () => { await warehouse.query({}); await warehouse.query({}); await warehouse.query({}); return 1; }", {
|
|
184
|
+
namespaces: [warehouseNamespace],
|
|
185
|
+
limits: CodeExecutionLimits.make({
|
|
186
|
+
...baseLimits,
|
|
187
|
+
maxHostCalls: 2
|
|
188
|
+
})
|
|
189
|
+
}), host, "CodeHostCallLimitError");
|
|
190
|
+
if (calls.length !== 2) return yield* violation(caseName, `expected exactly 2 dispatched host calls under a cap of 2, observed ${calls.length}`);
|
|
191
|
+
})
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
name: "TEST-015 fails typed on a host outcome outside the protocol schema",
|
|
195
|
+
run: expectFailure("TEST-015 fails typed on a host outcome outside the protocol schema", makeRequest("async () => warehouse.query({})", { namespaces: [warehouseNamespace] }), { call: () => Effect.succeed({ bogus: true }) }, "CodeExecutionProtocolError")
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
name: "TEST-015 surfaces an uncaught program throw with its bounded log capture",
|
|
199
|
+
run: expectFailure("TEST-015 surfaces an uncaught program throw with its bounded log capture", makeRequest("async () => { console.log('before the failure'); throw new Error('deliberate'); }"), unusedHost, "CodeProgramFailedError", (error) => error._tag === "CodeProgramFailedError" && error.reason === "threw" && error.logs.some((line) => line.includes("before the failure")) ? void 0 : `expected a threw failure carrying the log capture, got ${preview(error)}`)
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
name: "TEST-015 fails typed when the program returns a non-JSON value",
|
|
203
|
+
run: expectFailure("TEST-015 fails typed when the program returns a non-JSON value", makeRequest("async () => (() => 1)"), unusedHost, "CodeProgramFailedError", (error) => error._tag === "CodeProgramFailedError" && error.reason === "non-json-result" ? void 0 : `expected reason non-json-result, got ${preview(error)}`)
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
name: "CAP-015 rejects a network allowlist it cannot enforce with a typed unsupported error",
|
|
207
|
+
run: expectFailure("CAP-015 rejects a network allowlist it cannot enforce with a typed unsupported error", makeRequest("async () => 1", { network: NetworkAllowlist.make({
|
|
208
|
+
domains: ["example.com"],
|
|
209
|
+
ports: [443]
|
|
210
|
+
}) }), unusedHost, "CodeExecutorUnsupportedError", (error) => error._tag === "CodeExecutorUnsupportedError" && error.feature === "network" ? void 0 : `expected feature network, got ${preview(error)}`)
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
name: "TEST-015 interruption reaches in-flight host calls and pass teardown",
|
|
214
|
+
run: Effect.gen(function* () {
|
|
215
|
+
const caseName = "TEST-015 interruption reaches in-flight host calls and pass teardown";
|
|
216
|
+
const started = yield* Deferred.make();
|
|
217
|
+
const witness = { hostCallInterrupted: false };
|
|
218
|
+
const fiber = yield* runPass(makeRequest("async () => warehouse.query({})", { namespaces: [warehouseNamespace] }), { call: () => Deferred.succeed(started, void 0).pipe(Effect.andThen(Effect.never), Effect.ensuring(Effect.sync(() => {
|
|
219
|
+
witness.hostCallInterrupted = true;
|
|
220
|
+
}))) }).pipe(Effect.forkChild);
|
|
221
|
+
if ((yield* Effect.raceFirst(Deferred.await(started).pipe(Effect.as("started")), Fiber.join(fiber).pipe(Effect.exit, Effect.as("exited")))) === "exited") return yield* violation(caseName, "the pass settled before any host call reached the CodeExecutionHost");
|
|
222
|
+
yield* Fiber.interrupt(fiber);
|
|
223
|
+
if (!witness.hostCallInterrupted) return yield* violation(caseName, "interrupting the pass did not interrupt the in-flight host call");
|
|
224
|
+
})
|
|
225
|
+
}
|
|
226
|
+
];
|
|
227
|
+
};
|
|
228
|
+
//#endregion
|
|
229
|
+
export { CodeExecutorConformanceViolation, codeExecutorConformanceCases };
|
|
230
|
+
|
|
231
|
+
//# sourceMappingURL=CodeExecutorConformance.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeExecutorConformance.mjs","names":[],"sources":["../src/CodeExecutorConformance.ts"],"sourcesContent":["import { Deferred, Duration, Effect, Fiber, Schema } from \"effect\";\nimport {\n CodeExecutionHost,\n CodeExecutionLimits,\n CodeExecutionNamespace,\n CodeExecutionRequest,\n CodeExecutor,\n CodeHostCallFailure,\n CodeHostCallSuccess,\n type CodeExecutionError,\n type CodeExecutionResult,\n type CodeHostCall,\n type CodeHostCallResult,\n} from \"effect-agent/code-executor\";\nimport {\n NetworkAllowlist,\n NetworkDisabled,\n type SandboxImplementation,\n} from \"effect-agent/sandbox\";\n\n/**\n * Shared `CodeExecutor` conformance (TEST-015). Every adapter — the\n * deterministic `unisolated` substitute and each isolated adapter — runs\n * `codeExecutorConformanceCases` verbatim. Enforcement cases that only genuine\n * isolation can prove (ambient network denial, synchronous CPU runaway\n * termination) are NOT here; they belong to isolated adapters only\n * (testing spec §8.1).\n *\n * Cases assume the live `Clock` (the wall-clock case uses a short real\n * deadline) and take one fresh executor pass per case, so a suite may share\n * one executor Layer across cases.\n */\nexport class CodeExecutorConformanceViolation extends Schema.TaggedError<CodeExecutorConformanceViolation>()(\n \"CodeExecutorConformanceViolation\",\n {\n caseName: Schema.String,\n message: Schema.String,\n },\n) {}\n\nexport interface CodeExecutorConformanceCase {\n readonly name: string;\n readonly run: Effect.Effect<void, CodeExecutorConformanceViolation, CodeExecutor>;\n}\n\nexport interface CodeExecutorConformanceOptions {\n /** The posture the adapter under test must stamp on results and errors. */\n readonly implementation: SandboxImplementation;\n}\n\nconst baseLimits = CodeExecutionLimits.make({\n maxSourceBytes: 64 * 1024,\n maxWallTime: Duration.seconds(10),\n maxLogBytes: 16 * 1024,\n maxResultBytes: 64 * 1024,\n maxHostCalls: 8,\n maxHostCallArgumentBytes: 16 * 1024,\n maxHostCallResultBytes: 32 * 1024,\n});\n\nconst warehouseNamespace = CodeExecutionNamespace.make({\n name: \"warehouse\",\n methods: [\"query\", \"count\"],\n});\n\nconst makeRequest = (\n source: string,\n overrides?: {\n readonly limits?: CodeExecutionLimits;\n readonly namespaces?: ReadonlyArray<CodeExecutionNamespace>;\n readonly network?: CodeExecutionRequest[\"network\"];\n },\n): CodeExecutionRequest =>\n CodeExecutionRequest.make({\n language: \"javascript\",\n source,\n namespaces: overrides?.namespaces ?? [],\n network: overrides?.network ?? NetworkDisabled.make(),\n limits: overrides?.limits ?? baseLimits,\n });\n\nconst unusedHost: CodeExecutionHost[\"Service\"] = {\n call: () =>\n Effect.die(\n new Error(\"this conformance case expected no host call to reach the CodeExecutionHost\"),\n ),\n};\n\nconst respondingHost = (\n respond: (call: CodeHostCall) => CodeHostCallResult,\n): { readonly host: CodeExecutionHost[\"Service\"]; readonly calls: Array<CodeHostCall> } => {\n const calls: Array<CodeHostCall> = [];\n\n return {\n calls,\n host: {\n call: (call) =>\n Effect.sync(() => {\n calls.push(call);\n\n return respond(call);\n }),\n },\n };\n};\n\nconst runPass = (\n request: CodeExecutionRequest,\n host: CodeExecutionHost[\"Service\"],\n): Effect.Effect<CodeExecutionResult, CodeExecutionError, CodeExecutor> =>\n Effect.gen(function* () {\n const executor = yield* CodeExecutor;\n\n return yield* executor\n .execute(request)\n .pipe(Effect.provideService(CodeExecutionHost, CodeExecutionHost.of(host)));\n }).pipe(Effect.scoped);\n\nconst violation = (caseName: string, message: string) =>\n CodeExecutorConformanceViolation.make({ caseName, message });\n\nconst preview = (value: unknown): string => {\n try {\n return JSON.stringify(value)?.slice(0, 200) ?? String(value).slice(0, 200);\n } catch {\n return String(value).slice(0, 200);\n }\n};\n\nconst expectSuccess = (\n caseName: string,\n request: CodeExecutionRequest,\n host: CodeExecutionHost[\"Service\"],\n check: (result: CodeExecutionResult) => string | undefined,\n): Effect.Effect<void, CodeExecutorConformanceViolation, CodeExecutor> =>\n runPass(request, host).pipe(\n Effect.mapError((error) =>\n violation(caseName, `expected success, got ${error._tag}: ${preview(error)}`),\n ),\n Effect.flatMap((result) => {\n const complaint = check(result);\n\n return complaint === undefined ? Effect.void : Effect.fail(violation(caseName, complaint));\n }),\n );\n\nconst expectFailure = (\n caseName: string,\n request: CodeExecutionRequest,\n host: CodeExecutionHost[\"Service\"],\n tag: CodeExecutionError[\"_tag\"],\n check?: (error: CodeExecutionError) => string | undefined,\n): Effect.Effect<void, CodeExecutorConformanceViolation, CodeExecutor> =>\n runPass(request, host).pipe(\n Effect.flip,\n Effect.mapError((result) =>\n violation(caseName, `expected ${tag}, but the pass succeeded with ${preview(result.value)}`),\n ),\n Effect.flatMap((error) => {\n if (error._tag !== tag) {\n return Effect.fail(\n violation(caseName, `expected ${tag}, got ${error._tag}: ${preview(error)}`),\n );\n }\n const complaint = check?.(error);\n\n return complaint === undefined ? Effect.void : Effect.fail(violation(caseName, complaint));\n }),\n );\n\nexport const codeExecutorConformanceCases = (\n options: CodeExecutorConformanceOptions,\n): ReadonlyArray<CodeExecutorConformanceCase> => {\n const posture = options.implementation;\n\n return [\n {\n name: \"TEST-015 executes bounded JSON computation and returns the program value\",\n run: expectSuccess(\n \"TEST-015 executes bounded JSON computation and returns the program value\",\n makeRequest(\n \"async () => { const xs = [1, 2, 3].map((n) => n * 2); return { xs, sum: xs.reduce((a, b) => a + b, 0) }; }\",\n ),\n unusedHost,\n (result) =>\n JSON.stringify(result.value) === JSON.stringify({ xs: [2, 4, 6], sum: 12 })\n ? undefined\n : `unexpected program value ${preview(result.value)}`,\n ),\n },\n {\n name: \"CAP-015 reports its isolation posture honestly in results and errors\",\n run: Effect.gen(function* () {\n const caseName = \"CAP-015 reports its isolation posture honestly in results and errors\";\n\n const result = yield* runPass(makeRequest(\"async () => 1\"), unusedHost).pipe(\n Effect.mapError((error) => violation(caseName, `expected success, got ${error._tag}`)),\n );\n\n if (\n result.implementation.isolation !== posture.isolation ||\n result.implementation.identity !== posture.identity\n ) {\n return yield* violation(\n caseName,\n `result posture ${preview(result.implementation)} does not match the declared ${preview(posture)}`,\n );\n }\n\n const error = yield* runPass(makeRequest(\"async () => {\"), unusedHost).pipe(\n Effect.flip,\n Effect.mapError(() => violation(caseName, \"expected the invalid-source pass to fail\")),\n );\n\n // Every expected execution failure carries the posture; an adapter\n // omitting the field must fail this case, not slip past a probe.\n if (\n error.implementation === undefined ||\n error.implementation.isolation !== posture.isolation ||\n error.implementation.identity !== posture.identity\n ) {\n return yield* violation(\n caseName,\n `error posture ${preview(error.implementation)} does not match the declared ${preview(posture)}`,\n );\n }\n }),\n },\n {\n name: \"TEST-015 routes host calls through the CodeExecutionHost in program order\",\n run: Effect.gen(function* () {\n const caseName =\n \"TEST-015 routes host calls through the CodeExecutionHost in program order\";\n\n const { host, calls } = respondingHost((call) =>\n call.method === \"query\"\n ? CodeHostCallSuccess.make({ value: { rows: [1, 2, 3] } })\n : CodeHostCallSuccess.make({ value: 3 }),\n );\n\n const result = yield* runPass(\n makeRequest(\n \"async () => { const q = await warehouse.query({ sql: 'select' }); const c = await warehouse.count({ table: 't' }); return { rows: q.rows, count: c }; }\",\n { namespaces: [warehouseNamespace] },\n ),\n host,\n ).pipe(\n Effect.mapError((error) =>\n violation(caseName, `expected success, got ${error._tag}: ${preview(error)}`),\n ),\n );\n\n if (JSON.stringify(result.value) !== JSON.stringify({ rows: [1, 2, 3], count: 3 })) {\n return yield* violation(caseName, `unexpected value ${preview(result.value)}`);\n }\n const observed = calls.map((call) => `${call.namespace}.${call.method}`);\n\n if (JSON.stringify(observed) !== JSON.stringify([\"warehouse.query\", \"warehouse.count\"])) {\n return yield* violation(caseName, `unexpected host call order ${preview(observed)}`);\n }\n if (result.resourceUse.hostCalls !== 2) {\n return yield* violation(\n caseName,\n `expected 2 accounted host calls, got ${result.resourceUse.hostCalls}`,\n );\n }\n }),\n },\n {\n name: \"TEST-015 a caught failed host call lets the program branch on the envelope\",\n run: expectSuccess(\n \"TEST-015 a caught failed host call lets the program branch on the envelope\",\n makeRequest(\n \"async () => { try { await warehouse.query({ sql: 'x' }); return 'unreachable'; } catch (envelope) { return { caught: envelope }; } }\",\n { namespaces: [warehouseNamespace] },\n ),\n respondingHost(() =>\n CodeHostCallFailure.make({ error: { _tag: \"ToolInputError\", message: \"bad input\" } }),\n ).host,\n (result) =>\n JSON.stringify(result.value) ===\n JSON.stringify({ caught: { _tag: \"ToolInputError\", message: \"bad input\" } })\n ? undefined\n : `the envelope did not round-trip: ${preview(result.value)}`,\n ),\n },\n {\n name: \"TEST-015 an uncaught failed host call fails the program with the envelope\",\n run: expectFailure(\n \"TEST-015 an uncaught failed host call fails the program with the envelope\",\n makeRequest(\"async () => warehouse.query({ sql: 'x' })\", {\n namespaces: [warehouseNamespace],\n }),\n respondingHost(() =>\n CodeHostCallFailure.make({ error: { _tag: \"PolicyDenied\", message: \"denied\" } }),\n ).host,\n \"CodeProgramFailedError\",\n (error) =>\n error._tag === \"CodeProgramFailedError\" &&\n error.reason === \"rejected\" &&\n JSON.stringify(error.thrown) ===\n JSON.stringify({ _tag: \"PolicyDenied\", message: \"denied\" })\n ? undefined\n : `unexpected failure detail ${preview(error)}`,\n ),\n },\n {\n name: \"TEST-015 fails typed on syntactically invalid source\",\n run: expectFailure(\n \"TEST-015 fails typed on syntactically invalid source\",\n makeRequest(\"async () => {\"),\n unusedHost,\n \"CodeSourceError\",\n (error) =>\n error._tag === \"CodeSourceError\" && error.reason === \"invalid\"\n ? undefined\n : `expected reason invalid, got ${preview(error)}`,\n ),\n },\n {\n name: \"TEST-015 fails typed when the expression is not one async function\",\n run: expectFailure(\n \"TEST-015 fails typed when the expression is not one async function\",\n makeRequest(\"1 + 1\"),\n unusedHost,\n \"CodeSourceError\",\n (error) =>\n error._tag === \"CodeSourceError\" && error.reason === \"not-a-function\"\n ? undefined\n : `expected reason not-a-function, got ${preview(error)}`,\n ),\n },\n {\n name: \"TEST-015 fails typed on source larger than the declared byte limit\",\n run: expectFailure(\n \"TEST-015 fails typed on source larger than the declared byte limit\",\n makeRequest(`async () => \"${\"x\".repeat(2_000)}\"`, {\n limits: CodeExecutionLimits.make({ ...baseLimits, maxSourceBytes: 256 }),\n }),\n unusedHost,\n \"CodeSourceError\",\n (error) =>\n error._tag === \"CodeSourceError\" && error.reason === \"oversized\"\n ? undefined\n : `expected reason oversized, got ${preview(error)}`,\n ),\n },\n {\n name: \"TEST-015 terminates a never-settling program at the wall-clock deadline\",\n run: expectFailure(\n \"TEST-015 terminates a never-settling program at the wall-clock deadline\",\n makeRequest(\"async () => { await new Promise(() => {}); return 1; }\", {\n limits: CodeExecutionLimits.make({ ...baseLimits, maxWallTime: Duration.millis(250) }),\n }),\n unusedHost,\n \"CodeExecutionTimeoutError\",\n ),\n },\n {\n name: \"TEST-015 fails typed when console output exceeds its byte budget\",\n run: expectFailure(\n \"TEST-015 fails typed when console output exceeds its byte budget\",\n makeRequest(\n \"async () => { for (let i = 0; i < 64; i += 1) { console.log('x'.repeat(256)); } return 1; }\",\n { limits: CodeExecutionLimits.make({ ...baseLimits, maxLogBytes: 2_048 }) },\n ),\n unusedHost,\n \"CodeOutputLimitError\",\n (error) =>\n error._tag === \"CodeOutputLimitError\" && error.surface === \"logs\"\n ? undefined\n : `expected surface logs, got ${preview(error)}`,\n ),\n },\n {\n name: \"TEST-015 fails typed when the final result exceeds its byte budget\",\n run: expectFailure(\n \"TEST-015 fails typed when the final result exceeds its byte budget\",\n makeRequest(\"async () => 'y'.repeat(4096)\", {\n limits: CodeExecutionLimits.make({ ...baseLimits, maxResultBytes: 1_024 }),\n }),\n unusedHost,\n \"CodeOutputLimitError\",\n (error) =>\n error._tag === \"CodeOutputLimitError\" && error.surface === \"result\"\n ? undefined\n : `expected surface result, got ${preview(error)}`,\n ),\n },\n {\n name: \"TEST-015 fails typed when host calls exceed the executor cap\",\n run: Effect.gen(function* () {\n const caseName = \"TEST-015 fails typed when host calls exceed the executor cap\";\n const { host, calls } = respondingHost(() => CodeHostCallSuccess.make({ value: null }));\n\n yield* expectFailure(\n caseName,\n makeRequest(\n \"async () => { await warehouse.query({}); await warehouse.query({}); await warehouse.query({}); return 1; }\",\n {\n namespaces: [warehouseNamespace],\n limits: CodeExecutionLimits.make({ ...baseLimits, maxHostCalls: 2 }),\n },\n ),\n host,\n \"CodeHostCallLimitError\",\n );\n // The cap is enforced before dispatch: the over-limit call must never\n // have reached the host, or an unauthorized side effect already ran.\n if (calls.length !== 2) {\n return yield* violation(\n caseName,\n `expected exactly 2 dispatched host calls under a cap of 2, observed ${calls.length}`,\n );\n }\n }),\n },\n {\n name: \"TEST-015 fails typed on a host outcome outside the protocol schema\",\n run: expectFailure(\n \"TEST-015 fails typed on a host outcome outside the protocol schema\",\n makeRequest(\"async () => warehouse.query({})\", { namespaces: [warehouseNamespace] }),\n {\n // Deliberately violate the compile-time host contract to verify that an adapter\n // independently decodes the runtime protocol boundary.\n call: () => Effect.succeed({ bogus: true } as unknown as CodeHostCallResult),\n },\n \"CodeExecutionProtocolError\",\n ),\n },\n {\n name: \"TEST-015 surfaces an uncaught program throw with its bounded log capture\",\n run: expectFailure(\n \"TEST-015 surfaces an uncaught program throw with its bounded log capture\",\n makeRequest(\n \"async () => { console.log('before the failure'); throw new Error('deliberate'); }\",\n ),\n unusedHost,\n \"CodeProgramFailedError\",\n (error) =>\n error._tag === \"CodeProgramFailedError\" &&\n error.reason === \"threw\" &&\n error.logs.some((line) => line.includes(\"before the failure\"))\n ? undefined\n : `expected a threw failure carrying the log capture, got ${preview(error)}`,\n ),\n },\n {\n name: \"TEST-015 fails typed when the program returns a non-JSON value\",\n run: expectFailure(\n \"TEST-015 fails typed when the program returns a non-JSON value\",\n makeRequest(\"async () => (() => 1)\"),\n unusedHost,\n \"CodeProgramFailedError\",\n (error) =>\n error._tag === \"CodeProgramFailedError\" && error.reason === \"non-json-result\"\n ? undefined\n : `expected reason non-json-result, got ${preview(error)}`,\n ),\n },\n {\n name: \"CAP-015 rejects a network allowlist it cannot enforce with a typed unsupported error\",\n run: expectFailure(\n \"CAP-015 rejects a network allowlist it cannot enforce with a typed unsupported error\",\n makeRequest(\"async () => 1\", {\n network: NetworkAllowlist.make({ domains: [\"example.com\"], ports: [443] }),\n }),\n unusedHost,\n \"CodeExecutorUnsupportedError\",\n (error) =>\n error._tag === \"CodeExecutorUnsupportedError\" && error.feature === \"network\"\n ? undefined\n : `expected feature network, got ${preview(error)}`,\n ),\n },\n {\n name: \"TEST-015 interruption reaches in-flight host calls and pass teardown\",\n run: Effect.gen(function* () {\n const caseName = \"TEST-015 interruption reaches in-flight host calls and pass teardown\";\n const started = yield* Deferred.make<void>();\n const witness = { hostCallInterrupted: false };\n\n const host: CodeExecutionHost[\"Service\"] = {\n call: () =>\n Deferred.succeed(started, undefined).pipe(\n Effect.andThen(Effect.never),\n Effect.ensuring(\n Effect.sync(() => {\n witness.hostCallInterrupted = true;\n }),\n ),\n ),\n };\n\n const fiber = yield* runPass(\n makeRequest(\"async () => warehouse.query({})\", { namespaces: [warehouseNamespace] }),\n host,\n ).pipe(Effect.forkChild);\n\n // Guard against a broken adapter that settles the pass without ever\n // reaching the host: the case must report a violation, not hang.\n const winner = yield* Effect.raceFirst(\n Deferred.await(started).pipe(Effect.as(\"started\" as const)),\n Fiber.join(fiber).pipe(Effect.exit, Effect.as(\"exited\" as const)),\n );\n\n if (winner === \"exited\") {\n return yield* violation(\n caseName,\n \"the pass settled before any host call reached the CodeExecutionHost\",\n );\n }\n yield* Fiber.interrupt(fiber);\n if (!witness.hostCallInterrupted) {\n return yield* violation(\n caseName,\n \"interrupting the pass did not interrupt the in-flight host call\",\n );\n }\n }),\n },\n ];\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Layer } from "effect";
|
|
2
|
+
import { CodeExecutor } from "effect-agent/code-executor";
|
|
3
|
+
import { SandboxImplementation } from "effect-agent/sandbox";
|
|
4
|
+
//#region src/CodeExecutorSubstitute.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* The deterministic in-process executor substitute (C1 of ADR-0017). It runs
|
|
7
|
+
* the generated program on the host JavaScript engine with best-effort global
|
|
8
|
+
* shadowing only, so it self-identifies as `unisolated` and is never a
|
|
9
|
+
* security boundary (CAP-010, CAP-015). It exists to prove the public
|
|
10
|
+
* `CodeExecutor` contract and to drive deterministic capability tests.
|
|
11
|
+
*/
|
|
12
|
+
declare const inProcessCodeExecutorImplementation: SandboxImplementation;
|
|
13
|
+
/**
|
|
14
|
+
* Layer providing the unisolated in-process `CodeExecutor` substitute. The
|
|
15
|
+
* per-pass `CodeExecutionHost` stays in the caller's requirement channel, the
|
|
16
|
+
* same as every real adapter.
|
|
17
|
+
*/
|
|
18
|
+
declare const inProcessCodeExecutorLayer: Layer.Layer<CodeExecutor>;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { inProcessCodeExecutorImplementation, inProcessCodeExecutorLayer };
|
|
21
|
+
//# sourceMappingURL=CodeExecutorSubstitute.d.mts.map
|