@loops-adk/core 0.1.0 → 0.2.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/describe.ts","../src/core/budget.ts","../src/core/agent.ts","../src/core/forge.ts","../src/core/condition.ts","../src/core/git.ts","../src/core/draft.ts","../src/core/text.ts","../src/core/consolidate.ts","../src/core/ground.ts","../src/core/feedback.ts","../src/core/job.ts","../src/core/context.ts","../src/core/loop.ts","../src/engines/registry.ts","../src/core/stats.ts","../src/runtime/semantic.ts","../src/runtime/supervisor.ts","../src/runtime/persist.ts","../src/runtime/runner.ts"],"names":["execa","join","readFileSync","existsSync","diff","files","outcome","ensureDir","mkdirSync","writeFileSync","appendFileSync","NOISE","dirname"],"mappings":"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","file":"chunk-WM5QVHM2.js","sourcesContent":["/**\n * Job introspection. The builders register a `JobMeta` for the `Job` they return\n * (and a short label for the conditions they build) in a side table, so a loop's\n * shape can be read back without running it. This is what powers `loops validate`\n * and `loops describe`: an agent authors a loop, then sees what it actually built.\n *\n * Kept in `WeakMap`s rather than on the function objects, so the `Job`/`Condition`\n * types stay plain functions and nothing downstream has to know meta exists.\n */\n\nimport type { Job, JobMeta, ConditionInput } from './types.ts';\nimport type { AgentContractSummary } from './agent.ts';\n\nconst META = new WeakMap<object, JobMeta>();\nconst LABEL = new WeakMap<object, string>();\n\n/** Register a Job's shape and return the same Job (used inline at a builder's return). */\nexport function setMeta<T extends object>(target: T, meta: JobMeta): T {\n META.set(target, meta);\n return target;\n}\n\n/** Read a Job's registered shape, if it has one (a hand-written Job has none). */\nexport function jobMeta(job: Job): JobMeta | undefined {\n return typeof job === 'function' ? META.get(job) : undefined;\n}\n\n/** Register a one-line label for a condition (used by the gate-describing path). */\nexport function setLabel<T extends object>(cond: T, label: string): T {\n LABEL.set(cond, label);\n return cond;\n}\n\nfunction condLabel(input: unknown): string {\n if (typeof input === 'function') {\n const l = LABEL.get(input);\n if (l) return l;\n }\n return 'check';\n}\n\n/** Flatten a gate input (`until`/`start`/`stopOn`) into one label per condition. */\nexport function describeConditions(input?: ConditionInput): string[] {\n if (input == null) return [];\n if (Array.isArray(input)) return input.flatMap(describeConditions);\n return [condLabel(input)];\n}\n\nconst count = (n: number, w: string) => `${n} ${w}${n === 1 ? '' : 's'}`;\n\ninterface NodeMeta {\n name: string;\n needs?: string[];\n isolate?: boolean;\n job?: JobMeta;\n}\n\n// `meta.contract` is only ever set by `agentJob` to the value `agentContract()`\n// produced — a clean `AgentContractSummary` with empty fields already dropped. So\n// read it back as that type rather than re-normalising a shape the core built (the\n// `--json` path already emits it verbatim). A hand-written job has no contract.\nfunction renderContract(value: unknown): string | undefined {\n const c = value as AgentContractSummary | undefined;\n if (!c || typeof c !== 'object') return undefined;\n const bits: string[] = [];\n if (c.tier) bits.push(`tier ${c.tier}`);\n if (c.outputs?.length) bits.push(`outputs ${c.outputs.join(', ')}`);\n if (c.capabilities?.length) bits.push(`capabilities ${c.capabilities.join(', ')}`);\n if (c.requiresSkills?.length) bits.push(`requires ${c.requiresSkills.join(', ')}`);\n if (c.usesSkills?.length) bits.push(`uses ${c.usesSkills.join(', ')}`);\n if (c.humanGates?.length) bits.push(`gates ${c.humanGates.join(', ')}`);\n if (c.failureModes?.length) bits.push(`failure modes ${c.failureModes.join(', ')}`);\n return bits.join('; ');\n}\n\n/**\n * Render a `JobMeta` tree to indented lines: the loop's name and cap, its gate\n * and convergence actions, and its body / dag nodes recursively. A Job with no\n * meta (hand-written) renders as a single opaque line.\n */\nexport function renderPlan(meta: JobMeta | undefined, indent = ''): string[] {\n if (!meta) return [`${indent}(a runnable job, shape not introspectable)`];\n const nm = meta.name ? ` \"${meta.name}\"` : '';\n const out: string[] = [];\n switch (meta.kind) {\n case 'loop': {\n const max = typeof meta.max === 'number' ? ` (max ${meta.max})` : '';\n out.push(`${indent}loop${nm}${max}`);\n const start = meta.start as string[] | undefined;\n const gate = meta.gate as string[] | undefined;\n const stopOn = meta.stopOn as string[] | undefined;\n if (start?.length) out.push(`${indent} start: ${start.join(', ')}`);\n if (gate?.length) out.push(`${indent} gate: ${gate.join(', ')}`);\n if (stopOn?.length) out.push(`${indent} stopOn: ${stopOn.join(', ')}`);\n const tail = [meta.review ? 'review' : null, meta.commit ? 'commit' : null].filter(Boolean);\n if (tail.length) out.push(`${indent} on convergence: ${tail.join(' + ')}`);\n out.push(`${indent} body:`);\n out.push(...renderPlan(meta.body as JobMeta | undefined, `${indent} `));\n break;\n }\n case 'dag': {\n const nodes = (meta.nodes as NodeMeta[] | undefined) ?? [];\n out.push(`${indent}dag${nm} (${count(nodes.length, 'node')})`);\n for (const node of nodes) {\n const bits: string[] = [];\n if (node.needs?.length) bits.push(`needs ${node.needs.join(', ')}`);\n if (node.isolate) bits.push('isolated');\n out.push(`${indent} - ${node.name}${bits.length ? ` (${bits.join('; ')})` : ''}`);\n out.push(...renderPlan(node.job, `${indent} `));\n }\n break;\n }\n case 'agent':\n out.push(`${indent}agent${nm}${meta.ground ? ' (grounded)' : ''}`);\n {\n const contract = renderContract(meta.contract);\n if (contract) out.push(`${indent} contract: ${contract}`);\n }\n break;\n case 'fn':\n out.push(`${indent}fn${nm}`);\n break;\n default:\n out.push(`${indent}${meta.kind}${nm}`);\n }\n return out;\n}\n","/**\n * A token-denominated budget for a whole run, threaded through the JobContext so\n * every engine call site can refuse to spend past the cap. The honest cost guard\n * for a loop that may fire a worker plus several judges per iteration: `max` and\n * depth bound the *count* of calls, this bounds their *cost*.\n *\n * The runner feeds `add()` from each `engine:usage` event, so `spent()` is live.\n * `assertBudget(ctx)` runs before an engine call; once the cap is reached it\n * throws a non-retryable BUDGET error (hard mode, terminates the run) or logs\n * and continues (soft mode, for exploratory runs).\n */\n\nimport type { JobContext } from './types.ts';\nimport { LoopError } from './errors.ts';\n\nexport interface BudgetConfig {\n /** Cap on total tokens (input + output) for the whole run. */\n limit: number;\n /**\n * Refuse a new engine call once `spent + headroom >= limit`, i.e. stop with\n * room to spare rather than only after the cap is already blown. Default 0.\n */\n headroom?: number;\n /** Warn and continue instead of refusing when the cap is hit. Default false. */\n soft?: boolean;\n}\n\nexport class Budget {\n readonly limit: number;\n readonly headroom: number;\n readonly soft: boolean;\n private tokens = 0;\n\n constructor(config: BudgetConfig) {\n this.limit = config.limit;\n this.headroom = config.headroom ?? 0;\n this.soft = config.soft ?? false;\n }\n\n /** Record consumed tokens. Non-finite or non-positive values are ignored. */\n add(tokens: number): void {\n if (Number.isFinite(tokens) && tokens > 0) this.tokens += tokens;\n }\n\n spent(): number {\n return this.tokens;\n }\n\n remaining(): number {\n return Math.max(0, this.limit - this.tokens);\n }\n\n /** True once the next call would breach the cap (accounting for headroom). */\n exceeded(): boolean {\n return this.tokens + this.headroom >= this.limit;\n }\n}\n\n/**\n * Guard an engine call against the run budget. No-op when no budget is set or\n * the cap is not yet reached. In `soft` mode a breach warns and continues; in\n * hard mode it throws a non-retryable BUDGET error that terminates the run.\n */\nexport function assertBudget(ctx: JobContext): void {\n const budget = ctx.budget;\n if (!budget || !budget.exceeded()) return;\n if (budget.soft) {\n ctx.log(\n `token budget reached (${budget.spent()}/${budget.limit}) — continuing (soft)`,\n 'warn',\n );\n return;\n }\n throw new LoopError({\n code: 'BUDGET',\n phase: 'engine',\n message: `token budget exhausted: ${budget.spent()}/${budget.limit} tokens spent`,\n });\n}\n","/**\n * AgentDef — a reusable, job-specific agent definition. The persona and methodology\n * (the prose: `system`, skill `instructions`) live in editable markdown files; the\n * structure and types live here in TypeScript. The `.ts` is the strongly-typed wrapper\n * around the `.md` — author the prompt as markdown, get type safety and validation in code.\n *\n * Grounded in the amps-os agent profile, minus the amps-specific machinery loops already\n * provides: `dag` is the dispatcher, `conditions`/`quorum` are the gates, `Outcome` is the\n * result channel. So AgentDef is just the contract — who the agent is, what it may touch,\n * how it works — that `agentJob` resolves into an engine request.\n */\n\nimport { readFileSync } from 'node:fs';\n\n/** A skill is a METHODOLOGY (how to do the work — TDD, writing-plans), not a worker.\n * An agent composes skills; a skill never dispatches an agent. */\nexport interface Skill {\n name: string;\n /** The methodology instructions — prepended to the agent's system when it applies them. */\n instructions: string;\n}\n\nexport type AgentTier =\n | 'worker'\n | 'reviewer'\n | 'lead'\n | 'specialist'\n | 'utility'\n | (string & {});\n\nexport type AgentSkillRef = string | Skill;\n\nexport interface AgentOutputContract {\n /** Stable output name, such as `patch`, `review`, or `test-report`. */\n name: string;\n description?: string;\n /** Optional structured schema owned by the loop author. Loops stores it, it does not interpret it. */\n schema?: unknown;\n}\n\nexport interface AgentHumanGate {\n /** Stable gate name, such as `prod-approval` or `security-signoff`. */\n name: string;\n description?: string;\n when?: string;\n}\n\nexport interface AgentFailureMode {\n mode: string;\n recovery: string;\n detection?: string;\n severity?: 'block' | 'should-fix' | 'nice-to-have' | (string & {});\n}\n\nexport interface AgentDef {\n /** Identity (also the default job label). */\n name: string;\n /** What and why — for humans, docs, and (if loops scales) discovery. */\n description?: string;\n /** The system prompt: who the agent is and how it works. Use `fromFile('x.md')`. */\n system: string;\n /** Model id; omitted = inherit the run default. */\n model?: string;\n /** Allowed tool names — the permission boundary. */\n tools?: string[];\n /**\n * Mark this agent a leaf: it may not spawn sub-agents / fan out (the engine disallows\n * the sub-agent tool). Use it to control where a branch of the graph bottoms out — to\n * stop a thorough agent from quietly expanding into a slow, expensive swarm.\n */\n leaf?: boolean;\n /** Contract tier for humans, describe output, and future discovery. No scheduling authority. */\n tier?: AgentTier;\n /** Structured job descriptions (not prose) — for discovery / docs. */\n capabilities?: string[];\n /** Structured outputs this agent is expected to produce. */\n outputs?: AgentOutputContract[];\n /** Methodologies the agent applies; their instructions are folded into the system. */\n skills?: Skill[];\n /** Skills the caller should supply before the turn. Metadata only unless also listed in `skills`. */\n requiresSkills?: AgentSkillRef[];\n /** Skills the agent is known to use. Metadata only unless also listed in `skills`. */\n usesSkills?: AgentSkillRef[];\n /** Human approvals or external handoffs this agent may need. Metadata only. */\n humanGates?: AgentHumanGate[];\n /** Named failure modes + their recovery — first-class contracts, not buried prose. */\n failureModes?: AgentFailureMode[];\n}\n\nexport interface AgentContractSummary {\n tier?: string;\n capabilities?: string[];\n outputs?: string[];\n requiresSkills?: string[];\n usesSkills?: string[];\n humanGates?: string[];\n failureModes?: string[];\n}\n\n/** Read a markdown file as a string — for `system` or skill `instructions`. Pass an\n * absolute path, or `new URL('./x.md', import.meta.url)` for a path relative to the file. */\nexport function fromFile(path: string | URL): string {\n return readFileSync(path, 'utf8').trim();\n}\n\n/** Define a skill (a methodology). Identity + validation; strongly typed. */\nexport function defineSkill(skill: Skill): Skill {\n if (!skill.name) throw new Error('defineSkill: `name` is required');\n if (!skill.instructions?.trim()) throw new Error(`defineSkill \"${skill.name}\": empty instructions`);\n return skill;\n}\n\nfunction skillRefName(ref: AgentSkillRef): string {\n return typeof ref === 'string' ? ref : ref.name;\n}\n\nfunction validateName(value: string | undefined, label: string): void {\n if (!value?.trim()) throw new Error(`${label}: \\`name\\` is required`);\n}\n\nfunction validateSkillRef(ref: AgentSkillRef, label: string): void {\n if (typeof ref === 'string') {\n if (!ref.trim()) throw new Error(`${label}: empty skill name`);\n return;\n }\n defineSkill(ref);\n}\n\n/** Define an agent. Identity + validation; strongly typed (the wrapper around the md). */\nexport function defineAgent(def: AgentDef): AgentDef {\n if (!def.name) throw new Error('defineAgent: `name` is required');\n if (!def.system?.trim()) throw new Error(`defineAgent \"${def.name}\": empty system prompt`);\n def.skills?.forEach((s) => defineSkill(s));\n def.requiresSkills?.forEach((s) =>\n validateSkillRef(s, `defineAgent \"${def.name}\" requiresSkills`),\n );\n def.usesSkills?.forEach((s) =>\n validateSkillRef(s, `defineAgent \"${def.name}\" usesSkills`),\n );\n def.outputs?.forEach((o) =>\n validateName(o.name, `defineAgent \"${def.name}\" outputs`),\n );\n def.humanGates?.forEach((g) =>\n validateName(g.name, `defineAgent \"${def.name}\" humanGates`),\n );\n def.failureModes?.forEach((f) => {\n if (!f.mode?.trim())\n throw new Error(`defineAgent \"${def.name}\" failureModes: \\`mode\\` is required`);\n if (!f.recovery?.trim())\n throw new Error(`defineAgent \"${def.name}\" failureModes \"${f.mode}\": \\`recovery\\` is required`);\n });\n return def;\n}\n\nexport function agentContract(agent: AgentDef | undefined): AgentContractSummary | undefined {\n if (!agent) return undefined;\n const summary: AgentContractSummary = {};\n if (agent.tier) summary.tier = agent.tier;\n if (agent.capabilities?.length) summary.capabilities = [...agent.capabilities];\n if (agent.outputs?.length) summary.outputs = agent.outputs.map((o) => o.name);\n if (agent.requiresSkills?.length)\n summary.requiresSkills = agent.requiresSkills.map(skillRefName);\n if (agent.usesSkills?.length)\n summary.usesSkills = agent.usesSkills.map(skillRefName);\n if (agent.humanGates?.length)\n summary.humanGates = agent.humanGates.map((g) => g.name);\n if (agent.failureModes?.length)\n summary.failureModes = agent.failureModes.map((f) => f.mode);\n return Object.keys(summary).length ? summary : undefined;\n}\n\n/**\n * Resolve an agent's system prompt, folding in its skills' methodologies. This is what\n * `agentJob` hands the engine as `system`.\n */\nexport function resolveSystem(agent: AgentDef): string {\n if (!agent.skills?.length) return agent.system;\n const methods = agent.skills\n .map((s) => `### ${s.name}\\n\\n${s.instructions.trim()}`)\n .join('\\n\\n');\n return `${agent.system.trim()}\\n\\n## Methodologies you apply\\n\\n${methods}`;\n}\n","/**\n * The Forge provider — the host where a branch becomes a pull request. It sits\n * alongside Engine (where the agent thinks) and Environment (where the code runs)\n * as a thin, swappable seam: loops owns the interface and the jobs that drive it\n * (`pullRequestJob`, `mergeJob` in `pr.ts`); the default adapter shells out to the\n * GitHub CLI (`gh`), the same subprocess instinct as the `git`/claude-cli engines.\n *\n * Why a seam at all: the squash-merge boundary is where loops' commit-log memory\n * would otherwise be lost. A PR carries a body, and a squash merge can be made to\n * use that body as the merged commit message — so if loops keeps the PR body a\n * faithful synthesis of the branch's commit \"ways\", the Ledger survives the squash.\n * The Forge is how loops reaches the PR to write that body and (optionally) drive\n * the merge. A `MockForge` keeps the jobs offline-testable, the loops convention.\n */\n\nimport { execa } from 'execa';\n\nimport { LoopError } from './errors.ts';\nimport { redactSecrets } from './redact.ts';\n\n/** Identifies a pull request on the host. */\nexport interface PrRef {\n number: number;\n url: string;\n /** The head branch the PR is for. */\n branch?: string;\n}\n\n/** Everything needed to open a PR. */\nexport interface PrInput {\n title: string;\n body: string;\n /** The branch to merge into (e.g. `main`). */\n base: string;\n /** The branch carrying the work (the PR head). */\n branch: string;\n draft?: boolean;\n}\n\n/** A partial update to an existing PR (the body is the synthesis we keep current). */\nexport interface PrPatch {\n title?: string;\n body?: string;\n}\n\n/** Where the host command runs (the repo working dir) + the run's abort signal. */\nexport interface ForgeOpts {\n cwd: string;\n signal?: AbortSignal;\n}\n\nexport interface MergeOptions extends ForgeOpts {\n /** Squash merge (default). The whole point — collapse the branch to one commit. */\n squash?: boolean;\n /** The squash commit subject. */\n subject?: string;\n /** The squash commit body — the synthesis, written directly so it cannot be lost. */\n body?: string;\n /** Enqueue GitHub auto-merge: the merge happens once required checks pass. */\n auto?: boolean;\n /** Delete the head branch after merge. */\n deleteBranch?: boolean;\n}\n\n/**\n * The host seam. Five operations, each taking an explicit working dir — no hidden\n * global state, mirroring `git.ts`. `viewPr` answers an expected \"no\" with\n * `undefined` (no PR yet); the mutating ops throw a clear `CONFIG` error when the\n * CLI is missing/unauthed, never a cryptic crash.\n */\nexport interface Forge {\n readonly name: string;\n /** The open PR whose head is `branch`, or undefined when there is none. */\n viewPr(branch: string, opts: ForgeOpts): Promise<PrRef | undefined>;\n createPr(input: PrInput, opts: ForgeOpts): Promise<PrRef>;\n editPr(pr: PrRef, patch: PrPatch, opts: ForgeOpts): Promise<void>;\n mergePr(pr: PrRef, opts: MergeOptions): Promise<void>;\n /** True when the PR's required checks are all green (for a synchronous gate). */\n checksPass(pr: PrRef, opts: ForgeOpts): Promise<boolean>;\n}\n\n/** Duck-type guard: a ready-made `Forge` rather than something else. */\nexport function isForge(value: unknown): value is Forge {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as Forge).name === 'string' &&\n typeof (value as Forge).createPr === 'function'\n );\n}\n\n// ── gh argv builders (pure — unit-tested without spawning, like buildClaudeArgs) ──\n\nexport function buildViewArgs(branch: string): string[] {\n return ['pr', 'view', branch, '--json', 'number,url,headRefName'];\n}\n\nexport function buildCreateArgs(input: PrInput): string[] {\n // The body is passed on stdin (`--body-file -`) so an arbitrarily-shaped body\n // never has to survive arg length limits or escaping.\n const args = [\n 'pr',\n 'create',\n '--base',\n input.base,\n '--head',\n input.branch,\n '--title',\n input.title,\n '--body-file',\n '-',\n ];\n if (input.draft) args.push('--draft');\n return args;\n}\n\nexport function buildEditArgs(pr: PrRef, patch: PrPatch): string[] {\n const args = ['pr', 'edit', String(pr.number)];\n if (patch.title) args.push('--title', patch.title);\n if (patch.body !== undefined) args.push('--body-file', '-');\n return args;\n}\n\nexport function buildMergeArgs(pr: PrRef, opts: MergeOptions): string[] {\n const args = ['pr', 'merge', String(pr.number)];\n args.push(opts.squash === false ? '--merge' : '--squash');\n if (opts.auto) args.push('--auto');\n if (opts.subject) args.push('--subject', opts.subject);\n if (opts.body !== undefined) args.push('--body-file', '-');\n if (opts.deleteBranch) args.push('--delete-branch');\n return args;\n}\n\nexport function buildChecksArgs(pr: PrRef): string[] {\n return ['pr', 'checks', String(pr.number), '--required'];\n}\n\n// ── GhForge — the default adapter ────────────────────────────────────────────\n\nasync function gh(\n bin: string,\n args: string[],\n opts: ForgeOpts,\n input?: string,\n): Promise<{ stdout: string; all: string; exitCode: number }> {\n let r;\n try {\n r = await execa(bin, args, {\n cwd: opts.cwd,\n cancelSignal: opts.signal,\n reject: false,\n all: true,\n stdin: input === undefined ? 'ignore' : undefined,\n input,\n });\n } catch (e) {\n // A spawn failure (ENOENT) means gh is not installed / not on PATH.\n throw new LoopError({\n code: 'CONFIG',\n message:\n `the GitHub CLI (gh) is required for PR operations but could not be run ` +\n `(install it and run \\`gh auth login\\`): ${(e as Error).message}`,\n });\n }\n return {\n stdout: r.stdout ?? '',\n all: r.all ?? r.stdout ?? '',\n exitCode: r.exitCode ?? 1,\n };\n}\n\n/** Throw a clear, redacted error for a mutating op that failed (e.g. unauthed gh). */\nfunction ghOrThrow(\n r: { exitCode: number; all: string },\n action: string,\n): void {\n if (r.exitCode !== 0)\n throw new LoopError({\n code: 'CONFIG',\n message: `gh ${action} failed (exit ${r.exitCode}): ${redactSecrets(String(r.all).slice(0, 400))}`,\n });\n}\n\n/** The GitHub CLI adapter. Everything `pr.ts` needs, over `gh`. */\nexport class GhForge implements Forge {\n readonly name = 'gh';\n constructor(private readonly bin = 'gh') {}\n\n async viewPr(branch: string, opts: ForgeOpts): Promise<PrRef | undefined> {\n const r = await gh(this.bin, buildViewArgs(branch), opts);\n if (r.exitCode !== 0) return undefined; // no PR for this branch — an expected \"no\"\n try {\n const j = JSON.parse(r.stdout) as {\n number: number;\n url: string;\n headRefName?: string;\n };\n return { number: j.number, url: j.url, branch: j.headRefName };\n } catch {\n return undefined;\n }\n }\n\n async createPr(input: PrInput, opts: ForgeOpts): Promise<PrRef> {\n const r = await gh(this.bin, buildCreateArgs(input), opts, input.body);\n ghOrThrow(r, 'pr create');\n const url = r.stdout.trim().split('\\n').pop() ?? '';\n const m = url.match(/\\/pull\\/(\\d+)/);\n return { number: m ? Number(m[1]) : 0, url, branch: input.branch };\n }\n\n async editPr(pr: PrRef, patch: PrPatch, opts: ForgeOpts): Promise<void> {\n const r = await gh(this.bin, buildEditArgs(pr, patch), opts, patch.body);\n ghOrThrow(r, 'pr edit');\n }\n\n async mergePr(pr: PrRef, opts: MergeOptions): Promise<void> {\n const r = await gh(this.bin, buildMergeArgs(pr, opts), opts, opts.body);\n ghOrThrow(r, 'pr merge');\n }\n\n async checksPass(pr: PrRef, opts: ForgeOpts): Promise<boolean> {\n const r = await gh(this.bin, buildChecksArgs(pr), opts);\n return r.exitCode === 0; // 0 = all required checks green\n }\n}\n\n// ── MockForge — scripted, offline (for tests and dry-run examples) ───────────\n\nexport interface MockForgeOptions {\n /** Branch → a PR that already exists (so the job takes the update path). */\n existing?: Record<string, PrRef>;\n /** What `checksPass` returns. Default true. */\n checks?: boolean;\n}\n\n/** Records every call and keeps a tiny in-memory PR store. No network. */\nexport class MockForge implements Forge {\n readonly name = 'mock-forge';\n readonly calls: { method: string; args: Record<string, unknown> }[] = [];\n private readonly prs: Map<string, PrRef>;\n private seq = 100;\n constructor(private readonly opts: MockForgeOptions = {}) {\n this.prs = new Map(Object.entries(opts.existing ?? {}));\n }\n\n async viewPr(branch: string): Promise<PrRef | undefined> {\n this.calls.push({ method: 'viewPr', args: { branch } });\n return this.prs.get(branch);\n }\n\n async createPr(input: PrInput): Promise<PrRef> {\n this.calls.push({ method: 'createPr', args: { ...input } });\n const number = (this.seq += 1);\n const pr: PrRef = {\n number,\n url: `https://example.test/pull/${number}`,\n branch: input.branch,\n };\n this.prs.set(input.branch, pr);\n return pr;\n }\n\n async editPr(pr: PrRef, patch: PrPatch): Promise<void> {\n this.calls.push({ method: 'editPr', args: { pr, patch } });\n }\n\n async mergePr(pr: PrRef, opts: MergeOptions): Promise<void> {\n this.calls.push({\n method: 'mergePr',\n args: {\n pr,\n squash: opts.squash,\n auto: opts.auto,\n subject: opts.subject,\n body: opts.body,\n deleteBranch: opts.deleteBranch,\n },\n });\n }\n\n async checksPass(): Promise<boolean> {\n this.calls.push({ method: 'checksPass', args: {} });\n return this.opts.checks ?? true;\n }\n}\n","/**\n * Conditions answer a yes/no question against the run context and the latest\n * body outcome. They power a loop's `start`, `until`, and `stopOn` gates.\n *\n * Two flavours, same type:\n * - deterministic (`predicate`, `bodyPassed`, `maxConfidence`)\n * - agent-validated (`agentCheck`) — a small model returns a verdict +\n * confidence, and the gate opens only above a threshold.\n *\n * `gateJob` lifts any Condition into a `Job`, so a reviewer can be expressed\n * as a condition and still slot into `loop({ review })`.\n */\n\nimport type {\n Condition,\n ConditionInput,\n ConditionResult,\n Outcome,\n RawPredicate,\n Job,\n JobContext,\n} from './types.ts';\nimport { execa } from 'execa';\n\nimport type { EngineRef } from '../engines/engine.ts';\nimport { LoopError } from './errors.ts';\nimport { setLabel, setMeta } from './describe.ts';\nimport { assertBudget } from './budget.ts';\nimport { resolveSystem, type AgentDef } from './agent.ts';\nimport { GhForge } from './forge.ts';\n\n/**\n * Coerce any `ConditionInput` — a `Condition`, a bare predicate, or an array\n * mixing both — into the single `Condition` primitive. This is what lets\n * `until`/`start`/`stopOn` accept one or many items of either flavour.\n *\n * Arrays default to `all` (every item must hold); pass `'any'` for or-semantics.\n */\nexport function toCondition(\n input: ConditionInput,\n combine: 'all' | 'any' = 'all',\n): Condition {\n if (Array.isArray(input)) {\n const conds = input.map((i) => toCondition(i, combine));\n return combine === 'any' ? any(...conds) : all(...conds);\n }\n return coerceOne(input);\n}\n\n/**\n * A single function input is ambiguous at the type level (a `Condition` and a\n * `RawPredicate` are both 2-arg functions), so we disambiguate at call time by\n * inspecting the return value: a boolean is a predicate, a `{met}` object is a\n * full condition result.\n */\nfunction coerceOne(fn: Condition | RawPredicate): Condition {\n return async (ctx, last) => {\n const r = await (fn as (c: JobContext, l: Outcome | undefined) => unknown)(\n ctx,\n last,\n );\n if (typeof r === 'boolean') {\n return { met: r, reason: `predicate: ${r}` };\n }\n if (r && typeof r === 'object' && 'met' in r) {\n const res = r as { met: unknown };\n if (typeof res.met !== 'boolean') {\n throw new LoopError({\n code: 'VALIDATION',\n message: `condition returned a non-boolean \"met\": ${String(res.met)}`,\n });\n }\n return r as ConditionResult;\n }\n return { met: Boolean(r), reason: `coerced: ${String(r)}` };\n };\n}\n\n/** Deterministic predicate over context + last outcome. */\nexport function predicate(\n fn: (\n ctx: JobContext,\n last: Outcome | undefined,\n ) => boolean | Promise<boolean>,\n reason = 'predicate',\n): Condition {\n return async (ctx, last) => {\n const met = await fn(ctx, last);\n return { met, reason: met ? `${reason}: true` : `${reason}: false` };\n };\n}\n\n/** Met when the most recent body outcome passed. */\nexport function bodyPassed(): Condition {\n return async (_ctx, last) => ({\n met: last?.status === 'pass',\n confidence: last?.confidence,\n reason: `last body status = ${last?.status ?? 'none'}`,\n });\n}\n\n/** Met when the last outcome carries confidence at or above `threshold`. */\nexport function minConfidence(threshold: number): Condition {\n return async (_ctx, last) => {\n const c = last?.confidence ?? 0;\n return {\n met: c >= threshold,\n confidence: c,\n reason: `confidence ${c.toFixed(2)} ${c >= threshold ? '>=' : '<'} ${threshold}`,\n };\n };\n}\n\n/**\n * Deterministic gate that runs a shell command and is met on exit code 0. This\n * is the honest convergence signal for coding loops: pair it with an `agentCheck`\n * in an `until` array so the loop stops only when the tests ACTUALLY pass AND a\n * judge agrees the work matches intent — never on a model's self-report alone.\n * Runs in `cwd` (default: the process working dir), inherits the run's abort\n * signal, and never throws (a spawn failure counts as \"not met\").\n */\nexport function commandSucceeds(\n command: string,\n args: string[] = [],\n opts: { cwd?: string; timeoutMs?: number } = {},\n): Condition {\n return setLabel(async (ctx) => {\n try {\n const r = await execa(command, args, {\n cwd: opts.cwd ?? ctx.workspace.dir,\n timeout: opts.timeoutMs,\n cancelSignal: ctx.signal,\n reject: false,\n stdin: 'ignore',\n // Inherit the running environment's vars (BASE_URL, …) so the gate can\n // test the live preview, not just static files on disk.\n env: ctx.environment?.env,\n });\n return {\n met: r.exitCode === 0,\n reason: `\\`${command}\\` exited ${r.exitCode ?? '?'}`,\n };\n } catch (e) {\n return {\n met: false,\n reason: `\\`${command}\\` failed to run: ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n }, `${command}${args.length ? ` ${args.join(' ')}` : ''}`);\n}\n\n/**\n * True when the branch's open PR has all required checks green — a synchronous\n * \"CI is green\" gate over the `Forge`. Use it as `mergeJob`'s `when`, or anywhere a\n * `Condition` is taken, for the blocking path; prefer `mergeJob({ auto: true })` to\n * hand the same gate to GitHub non-blockingly. No PR / no branch → not met.\n */\nexport function forgeChecks(): Condition {\n return async (ctx) => {\n const branch = ctx.workspace.branch;\n if (!branch) return { met: false, reason: 'no branch checked out' };\n const forge = ctx.forge ?? new GhForge();\n const fopts = { cwd: ctx.workspace.dir, signal: ctx.signal };\n const pr = await forge.viewPr(branch, fopts);\n if (!pr) return { met: false, reason: `no open PR for \"${branch}\"` };\n const ok = await forge.checksPass(pr, fopts);\n return {\n met: ok,\n reason: ok ? 'required checks pass' : 'required checks not green',\n };\n };\n}\n\nexport const always: Condition = async () => ({ met: true, reason: 'always' });\nexport const never: Condition = async () => ({ met: false, reason: 'never' });\n\n// ── Combinators ───────────────────────────────────────────────────────────\n\nexport function not(c: ConditionInput): Condition {\n const cond = toCondition(c);\n return async (ctx, last) => {\n const r = await cond(ctx, last);\n return {\n met: !r.met,\n confidence: r.confidence,\n reason: `not(${r.reason})`,\n };\n };\n}\n\n/** Met only when every input holds (short-circuits on the first failure). */\nexport function all(...inputs: ConditionInput[]): Condition {\n const conds = inputs.map((i) => toCondition(i));\n return async (ctx, last) => {\n const results: ConditionResult[] = [];\n for (const c of conds) {\n const r = await c(ctx, last);\n results.push(r);\n if (!r.met) return { met: false, reason: `all -> failed: ${r.reason}` };\n }\n return {\n met: true,\n reason: `all(${results.map((r) => r.reason).join(' & ')})`,\n };\n };\n}\n\n/** Met when any input holds (short-circuits on the first success). */\nexport function any(...inputs: ConditionInput[]): Condition {\n const conds = inputs.map((i) => toCondition(i));\n return async (ctx, last) => {\n const reasons: string[] = [];\n for (const c of conds) {\n const r = await c(ctx, last);\n reasons.push(r.reason);\n if (r.met)\n return {\n met: true,\n confidence: r.confidence,\n reason: `any -> ${r.reason}`,\n };\n }\n return { met: false, reason: `any(${reasons.join(' | ')})` };\n };\n}\n\n/**\n * Met when at least `k` of the inputs hold. The honest hedge against a single\n * agent judge's self-reported confidence: ask N independent judges and require a\n * quorum (e.g. `quorum(2, j, j, j)`). All inputs run in parallel; a judge that\n * throws counts as a \"no\" vote rather than sinking the whole gate. Each input\n * may hit a model, so size N with cost in mind. Reported confidence is the mean\n * of the holding inputs' confidences.\n */\nexport function quorum(k: number, ...inputs: ConditionInput[]): Condition {\n if (k < 1 || k > inputs.length)\n throw new LoopError({\n code: 'CONFIG',\n message: `quorum requires 1 <= k <= inputs (got k=${k}, n=${inputs.length})`,\n });\n const conds = inputs.map((i) => toCondition(i));\n return setLabel(async (ctx, last) => {\n const settled = await Promise.allSettled(conds.map((c) => c(ctx, last)));\n const results: ConditionResult[] = settled.map((s) =>\n s.status === 'fulfilled'\n ? s.value\n : {\n met: false,\n reason: `judge errored: ${s.reason instanceof Error ? s.reason.message : String(s.reason)}`,\n },\n );\n const held = results.filter((r) => r.met);\n const confs = held\n .map((r) => r.confidence)\n .filter((c): c is number => typeof c === 'number');\n const confidence = confs.length\n ? confs.reduce((a, b) => a + b, 0) / confs.length\n : undefined;\n return {\n met: held.length >= k,\n confidence,\n reason: `quorum ${held.length}/${inputs.length} held (need ${k})`,\n };\n }, `quorum ${k}/${inputs.length}`);\n}\n\n// ── Agent-validated condition ──────────────────────────────────────────────\n\nexport interface AgentCheckConfig {\n /** The yes/no question the validator must answer. */\n question: string;\n /** Open the gate only at/above this confidence (0..1). Default 0.8. */\n threshold?: number;\n /** Small/cheap model recommended. A bare string — provider-agnostic. */\n model?: string;\n /**\n * Give the judge a persona — an `AgentDef` whose resolved system (persona +\n * skills) is prepended to the validator's scoring instructions, so a reviewer\n * can be a named specialist (e.g. an adversarial reviewer) instead of an\n * anonymous yes/no. The validator's output contract stays authoritative (it\n * comes last); `model` falls back to the agent's `model`. Mirrors `agentJob`.\n */\n agent?: AgentDef;\n /** Engine for validation: a registered name, your own `Engine`, or default. */\n engine?: EngineRef;\n /**\n * What the validator sees. By default: the last outcome's summary/data plus\n * the shared state. Override to feed something bespoke — may be async, since a\n * judge often gathers evidence (read the artifact, ground on the history, run a\n * probe) before ruling. A blind judge cannot honestly confirm correctness, so\n * give it the thing it is meant to be reviewing.\n */\n context?: (ctx: JobContext, last: Outcome | undefined) => string | Promise<string>;\n maxTokens?: number;\n /**\n * Score these named dimensions (0..1 each) instead of a single yes/no\n * confidence. The gate opens when the GEOMETRIC MEAN of the scores is\n * >= `threshold`, so one weak dimension drags the whole verdict down. A more\n * honest judge than a lone self-reported number, e.g.\n * `['intent match', 'evidence quality', 'outcome coherence']`.\n */\n dimensions?: string[];\n /**\n * Parse a free-form review that closes with `<confidence>N%</confidence>`\n * (N is 0-100) instead of forcing a JSON shape. The gate opens at/above\n * `threshold`; the reviewer's prose before the tag becomes the gate's `reason`,\n * so a failing review carries its findings to the next iteration (`lastReview`).\n * More robust than scraping JSON, and the natural fit for a report-then-rate\n * reviewer persona. Takes precedence over `dimensions`.\n */\n confidenceTag?: boolean;\n}\n\ninterface Verdict {\n verdict: 'yes' | 'no';\n confidence: number;\n reason: string;\n}\n\nfunction defaultContext(ctx: JobContext, last: Outcome | undefined): string {\n const parts: string[] = [];\n if (last?.summary) parts.push(`Last outcome summary: ${last.summary}`);\n if (last?.status) parts.push(`Last outcome status: ${last.status}`);\n if (last?.data !== undefined)\n parts.push(`Last outcome data: ${safeJson(last.data)}`);\n const stateKeys = Object.keys(ctx.state);\n if (stateKeys.length) parts.push(`Shared state: ${safeJson(ctx.state)}`);\n return parts.join('\\n') || '(no prior context)';\n}\n\nfunction safeJson(value: unknown, limit = 4000): string {\n try {\n const s = JSON.stringify(value, null, 2) ?? String(value);\n return s.length > limit ? `${s.slice(0, limit)}… (truncated)` : s;\n } catch {\n return String(value);\n }\n}\n\n/** Yield each top-level *balanced* JSON object in the text (strings/escapes aware). */\nfunction* balancedObjects(text: string): Generator<string> {\n let cursor = 0;\n while (cursor < text.length) {\n const start = text.indexOf('{', cursor);\n if (start === -1) return;\n let depth = 0;\n let inString = false;\n let escaped = false;\n let end = -1;\n for (let i = start; i < text.length; i += 1) {\n const ch = text[i]!;\n if (inString) {\n if (escaped) escaped = false;\n else if (ch === '\\\\') escaped = true;\n else if (ch === '\"') inString = false;\n continue;\n }\n if (ch === '\"') inString = true;\n else if (ch === '{') depth += 1;\n else if (ch === '}' && --depth === 0) {\n end = i;\n break;\n }\n }\n if (end === -1) return; // unbalanced tail — nothing more to find\n yield text.slice(start, end + 1);\n cursor = end + 1;\n }\n}\n\nfunction toVerdict(obj: Record<string, unknown>): Verdict {\n const verdict = obj.verdict === 'yes' ? 'yes' : 'no';\n // Confidence is mandatory (the validator system prompt demands it). A missing\n // or non-numeric confidence is a low-quality verdict, NOT an implicit \"fully\n // confident\" — so it defaults to 0 and a thresholded gate fails closed. For a\n // convergence/quality gate a false \"done\" (opening when the work isn't really\n // finished) is worse than one more iteration, so the sceptical default is the\n // correct one; the strengthened prompt keeps a genuine omission rare.\n const confidence =\n typeof obj.confidence === 'number' ? clamp01(obj.confidence) : 0;\n const reason =\n typeof obj.reason === 'string' ? obj.reason : '(no reason given)';\n return { verdict, confidence, reason };\n}\n\n/**\n * Pull a verdict from a model reply. Models often wrap JSON in prose or restate\n * the input as a first object, so we scan every balanced object and prefer the\n * one that actually carries a `verdict` key (falling back to the first object).\n */\nfunction parseVerdict(text: string): Verdict {\n let fallback: Record<string, unknown> | undefined;\n for (const candidate of balancedObjects(text)) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(candidate);\n } catch {\n continue;\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))\n continue;\n const obj = parsed as Record<string, unknown>;\n if ('verdict' in obj) return toVerdict(obj);\n fallback ??= obj;\n }\n if (fallback) return toVerdict(fallback);\n throw new LoopError({\n code: 'VALIDATION',\n message: `validator returned no JSON verdict: ${text.slice(0, 200)}`,\n });\n}\n\nfunction clamp01(n: number): number {\n return Number.isFinite(n) ? Math.min(1, Math.max(0, n)) : 0;\n}\n\nconst VALIDATOR_SYSTEM =\n 'You are a strict, sceptical evaluator. You judge whether a stated condition ' +\n 'is truly met given the evidence. Do not be generous. The `confidence` field ' +\n 'is MANDATORY: always include a number in 0..1 for how sure you are, and when ' +\n 'in doubt give a LOW number — never omit it (an omitted confidence is treated ' +\n 'as zero). Respond with ONLY a single JSON object and no other text:\\n' +\n '{\"verdict\":\"yes\"|\"no\",\"confidence\":<number 0..1>,\"reason\":\"<one sentence>\"}';\n\nconst CONFIDENCE_TAG_SYSTEM =\n 'You are a rigorous, report-only reviewer. Do not edit anything and do not imply you ' +\n 'will. Assess the evidence against the stated condition, listing each concern tied to a ' +\n 'concrete location and a concrete failure scenario (not a vibe). Judge against the stated ' +\n 'contract, not an ideal: do not penalise the absence of hardening the contract does not ' +\n 'require, and when the evidence meets the contract and you cannot name a concrete fault, ' +\n 'say so plainly. Close with a single final line and nothing after it: ' +\n '`<confidence>N%</confidence>` — N is an integer 0-100, where 100 means you found no ' +\n 'genuine contract violation or real bug, and below 100 means at least one concrete, ' +\n 'addressable concern is open.';\n\n/**\n * Pull the last `<confidence>N%</confidence>` from a review. The prose before the\n * tag is the findings, carried into the gate `reason` so a failing review delivers\n * its concerns to the next iteration. `N` may be a percent (0-100) or a fraction.\n */\nfunction parseConfidenceTag(\n text: string,\n): { confidence: number; findings: string } | null {\n const re = /<confidence>\\s*([0-9]+(?:\\.[0-9]+)?)\\s*%?\\s*<\\/confidence>/gi;\n let m: RegExpExecArray | null;\n let last: RegExpExecArray | null = null;\n while ((m = re.exec(text)) !== null) last = m;\n if (!last) return null;\n let n = parseFloat(last[1]!);\n if (n > 1) n = n / 100; // percent → fraction\n return { confidence: clamp01(n), findings: text.slice(0, last.index).trim() };\n}\n\n/** System prompt for the multi-dimension scoring variant of `agentCheck`. */\nfunction validatorScoreSystem(dimensions: string[]): string {\n return (\n 'You are a strict, sceptical evaluator. Score how well the condition is met ' +\n 'on EACH named dimension, from 0 (not at all) to 1 (fully). Do not be ' +\n 'generous; when in doubt score low. Respond with ONLY a single JSON object ' +\n 'and no other text:\\n' +\n `{\"scores\":{${dimensions.map((d) => `\"${d}\":<0..1>`).join(',')}},\"reason\":\"<one sentence>\"}`\n );\n}\n\n/** Geometric mean — any zero (a fully-failed dimension) drags the result to 0. */\nfunction geometricMean(values: number[]): number {\n if (!values.length) return 0;\n if (values.some((v) => v <= 0)) return 0;\n return Math.exp(values.reduce((a, b) => a + Math.log(b), 0) / values.length);\n}\n\ninterface ScoreVerdict {\n score: number;\n scores: Record<string, number>;\n reason: string;\n}\n\n/** Pull per-dimension scores from a model reply; any missing dimension is 0. */\nfunction parseScores(text: string, dimensions: string[]): ScoreVerdict {\n for (const candidate of balancedObjects(text)) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(candidate);\n } catch {\n continue;\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))\n continue;\n const raw = (parsed as Record<string, unknown>).scores;\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) continue;\n const scoreObj = raw as Record<string, unknown>;\n const scores: Record<string, number> = {};\n for (const d of dimensions) {\n const val = scoreObj[d];\n scores[d] = typeof val === 'number' ? clamp01(val) : 0;\n }\n const reasonField = (parsed as Record<string, unknown>).reason;\n return {\n score: geometricMean(dimensions.map((d) => scores[d]!)),\n scores,\n reason:\n typeof reasonField === 'string' ? reasonField : '(no reason given)',\n };\n }\n throw new LoopError({\n code: 'VALIDATION',\n message: `validator returned no JSON scores: ${text.slice(0, 200)}`,\n });\n}\n\n/**\n * A Condition decided by a (preferably small) model. With a single yes/no\n * question the gate opens when the verdict is \"yes\" AND confidence >= threshold.\n * With `dimensions`, the model scores each dimension 0..1 and the gate opens\n * when their geometric mean >= threshold — a more honest judge than one number.\n */\nexport function agentCheck(config: AgentCheckConfig): Condition {\n const threshold = config.threshold ?? 0.8;\n const confidenceTag = config.confidenceTag === true;\n const dimensions =\n !confidenceTag && config.dimensions?.length ? config.dimensions : undefined;\n return setLabel(async (ctx, last) => {\n const engine = config.engine\n ? ctx.resolveEngine(config.engine)\n : ctx.engine;\n const contextText = await (config.context ?? defaultContext)(ctx, last);\n const closing = confidenceTag\n ? 'Write your review now, then close with `<confidence>N%</confidence>`.'\n : `Return the JSON ${dimensions ? 'scores' : 'verdict'} now.`;\n const prompt =\n `CONDITION TO EVALUATE:\\n${config.question}\\n\\n` +\n `EVIDENCE:\\n${contextText}\\n\\n` +\n closing;\n\n // The validator's output contract stays authoritative (last); an optional\n // agent persona is prepended so the judge has a stance, not just a question.\n const baseSystem = confidenceTag\n ? CONFIDENCE_TAG_SYSTEM\n : dimensions\n ? validatorScoreSystem(dimensions)\n : VALIDATOR_SYSTEM;\n const system = config.agent ? `${resolveSystem(config.agent)}\\n\\n${baseSystem}` : baseSystem;\n\n let result;\n try {\n assertBudget(ctx); // count validator calls against the run's token budget\n result = await engine.run(\n {\n prompt,\n system,\n model: config.model ?? config.agent?.model,\n // A report-then-rate reviewer needs room for findings before the tag.\n maxTokens: config.maxTokens ?? (confidenceTag ? 2048 : 512),\n },\n (e) => {\n if (e.type === 'usage') {\n ctx.emit({\n kind: 'engine:usage',\n ts: Date.now(),\n path: [...ctx.path],\n model: e.model,\n usage: e.usage,\n });\n }\n },\n ctx.signal,\n );\n } catch (e) {\n // phase is left to the caller (loop.ts) — this condition may be a\n // start/until/stopOn/review gate and cannot know which.\n throw LoopError.from(e, { code: 'ENGINE', path: ctx.path });\n }\n\n if (confidenceTag) {\n const parsed = parseConfidenceTag(result.text);\n if (!parsed)\n return {\n met: false,\n confidence: 0,\n reason: `no <confidence> tag: ${result.text.slice(0, 140)}`,\n };\n const pct = Math.round(parsed.confidence * 100);\n const need = Math.round(threshold * 100);\n return {\n met: parsed.confidence >= threshold,\n confidence: parsed.confidence,\n reason: `confidence ${pct}% (need ${need}%)${parsed.findings ? ` — ${parsed.findings.slice(0, 280)}` : ''}`,\n };\n }\n\n if (dimensions) {\n let sv: ScoreVerdict;\n try {\n sv = parseScores(result.text, dimensions);\n } catch {\n return {\n met: false,\n confidence: 0,\n reason: `unparseable scores: ${result.text.slice(0, 120)}`,\n };\n }\n const detail = dimensions\n .map((d) => `${d}=${sv.scores[d]!.toFixed(2)}`)\n .join(', ');\n return {\n met: sv.score >= threshold,\n confidence: sv.score,\n reason: `geo ${sv.score.toFixed(2)} (need ${threshold}) [${detail}] — ${sv.reason}`,\n };\n }\n\n let v: Verdict;\n try {\n v = parseVerdict(result.text);\n } catch {\n // A flaky or malformed verdict must not crash the whole run; fail\n // sceptically (gate stays closed) and let the loop continue/exhaust.\n return {\n met: false,\n confidence: 0,\n reason: `unparseable verdict: ${result.text.slice(0, 120)}`,\n };\n }\n const met = v.verdict === 'yes' && v.confidence >= threshold;\n return {\n met,\n confidence: v.confidence,\n reason: `${v.verdict} @ ${v.confidence.toFixed(2)} (need ${threshold}) — ${v.reason}`,\n };\n }, `judge \"${config.question}\" >=${threshold}`);\n}\n\n/**\n * Lift a Condition (or one-or-many `ConditionInput`) into a Job: `pass` when\n * met, `fail` otherwise. This is how a reviewer becomes a drop-in `review` job\n * (`gateJob('review', agentCheck(...))`).\n */\nexport function gateJob(label: string, condition: ConditionInput): Job {\n const cond = toCondition(condition);\n return setMeta(async (ctx) => {\n ctx.emit({ kind: 'job:start', ts: Date.now(), path: [...ctx.path], label });\n const r = await cond(ctx, ctx.lastOutcome);\n const outcome: Outcome = {\n status: r.met ? 'pass' : 'fail',\n confidence: r.confidence,\n summary: r.reason,\n };\n ctx.emit({\n kind: 'job:end',\n ts: Date.now(),\n path: [...ctx.path],\n label,\n outcome,\n });\n return outcome;\n }, { kind: 'gate', name: label });\n}\n","/**\n * The git substrate. loops' answer to cross-iteration amnesia is to make the\n * commit log the convergence ledger: each unit of work commits the \"way\" (a\n * structured body) welded to the \"what\" (the diff), and the next fresh context\n * reads the log back. This module is the thin, engine-agnostic wrapper that lets\n * the core do that — every function takes an explicit `cwd` (the worktree dir)\n * and never throws for an expected \"no\" answer.\n *\n * It is deliberately small: a handful of plumbing/porcelain calls over `execa`,\n * the same subprocess primitive `commandSucceeds` already uses. No git library,\n * no parallel state. Git is the state.\n */\n\nimport { execa } from 'execa';\nimport { mkdtempSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\n\n/** One commit as the ledger sees it: the what (sha) plus the way (body). */\nexport interface CommitRecord {\n sha: string;\n /** Conventional-commit subject line. */\n subject: string;\n /** The structured body (the \"way\") — everything after the subject. */\n body: string;\n /** ISO author date. */\n date: string;\n}\n\ninterface GitOpts {\n cwd: string;\n signal?: AbortSignal;\n}\n\n// Record-delimited log format: sha, ISO date, subject, body, then a record\n// separator. Field separator is the unit-separator (US, 0x1f); records end with\n// the record-separator (RS, 0x1e). Both are control chars a commit body will\n// never contain, so a body with arbitrary newlines/blank lines parses cleanly.\nconst FS = '\\x1f';\nconst RS = '\\x1e';\nconst LOG_FORMAT = `%H${FS}%aI${FS}%s${FS}%b${RS}`;\n\nasync function git(\n args: string[],\n { cwd, signal }: GitOpts,\n input?: string,\n): Promise<{ stdout: string; exitCode: number }> {\n const r = await execa('git', args, {\n cwd,\n cancelSignal: signal,\n reject: false,\n stdin: input === undefined ? 'ignore' : undefined,\n input,\n });\n return { stdout: r.stdout ?? '', exitCode: r.exitCode ?? 1 };\n}\n\n/** True when `cwd` is inside a git work tree. Never throws. */\nexport async function isRepo(opts: GitOpts): Promise<boolean> {\n try {\n const r = await git(['rev-parse', '--is-inside-work-tree'], opts);\n return r.exitCode === 0 && r.stdout.trim() === 'true';\n } catch {\n return false;\n }\n}\n\n/** The checked-out branch name, or undefined on a detached HEAD / non-repo. */\nexport async function currentBranch(opts: GitOpts): Promise<string | undefined> {\n const r = await git(['rev-parse', '--abbrev-ref', 'HEAD'], opts);\n if (r.exitCode !== 0) return undefined;\n const name = r.stdout.trim();\n return name && name !== 'HEAD' ? name : undefined;\n}\n\n/** The HEAD commit sha, or undefined when the branch has no commits yet. */\nexport async function headSha(opts: GitOpts): Promise<string | undefined> {\n const r = await git(['rev-parse', 'HEAD'], opts);\n return r.exitCode === 0 ? r.stdout.trim() || undefined : undefined;\n}\n\n/** Stage every change in the work tree (`git add -A`). */\nexport async function stageAll(opts: GitOpts): Promise<void> {\n await git(['add', '-A'], opts);\n}\n\n/** True when there is something staged to commit. */\nexport async function hasStagedChanges(opts: GitOpts): Promise<boolean> {\n // `diff --cached --quiet` exits 1 when the index differs from HEAD.\n const r = await git(['diff', '--cached', '--quiet'], opts);\n return r.exitCode === 1;\n}\n\n/** True when the work tree (staged or unstaged) has any change. */\nexport async function isDirty(opts: GitOpts): Promise<boolean> {\n const r = await git(['status', '--porcelain'], opts);\n return r.stdout.trim().length > 0;\n}\n\nexport interface CommitInput {\n subject: string;\n /** The structured body — the \"way\". Joined to the subject with a blank line. */\n body?: string;\n /** Commit even with an empty index (default false). */\n allowEmpty?: boolean;\n}\n\n/**\n * Commit the staged index. The message is passed on stdin (`-F -`) so an\n * arbitrarily-shaped body never has to survive shell escaping. The repo's\n * configured author is used — loops never sets an author or a co-author trailer.\n * Returns the new sha, or undefined when there was nothing to commit and\n * `allowEmpty` was not set.\n */\nexport async function commit(\n input: CommitInput,\n opts: GitOpts,\n): Promise<string | undefined> {\n if (!input.allowEmpty && !(await hasStagedChanges(opts))) return undefined;\n const message = input.body\n ? `${input.subject}\\n\\n${input.body}\\n`\n : `${input.subject}\\n`;\n const args = ['commit', '-F', '-'];\n if (input.allowEmpty) args.push('--allow-empty');\n const r = await git(args, opts, message);\n if (r.exitCode !== 0) {\n throw new Error(\n `git commit failed (exit ${r.exitCode}): ${r.stdout}`.trim(),\n );\n }\n return headSha(opts);\n}\n\nexport interface LogQuery extends GitOpts {\n /** Exclusive lower bound: only commits after this ref (e.g. the loop start). */\n since?: string;\n /** Cap the number of commits returned (most recent first). */\n max?: number;\n /** The ref to read (default HEAD) — e.g. a fork branch's own line of work. */\n ref?: string;\n}\n\n/**\n * Read the ledger: recent commits, newest first, each with its body (the way).\n * `since` gives the \"this run only\" window the loop grounds the next iteration\n * on; `max` bounds it so the ledger never re-rots the fresh context.\n */\nexport async function log(query: LogQuery): Promise<CommitRecord[]> {\n const { cwd, signal, since, max } = query;\n const ref = query.ref ?? 'HEAD';\n const args = ['log', `--format=${LOG_FORMAT}`];\n if (max != null) args.push(`-n${max}`);\n args.push(since ? `${since}..${ref}` : ref);\n const r = await git(args, { cwd, signal });\n if (r.exitCode !== 0) return [];\n return parseLog(r.stdout);\n}\n\n/** Parse the record-separated log stream into structured commits. */\nfunction parseLog(stdout: string): CommitRecord[] {\n const records: CommitRecord[] = [];\n for (const chunk of stdout.split(RS)) {\n // git prints a newline between records; strip the leading one.\n const fields = chunk.replace(/^\\n+/, '').split(FS);\n if (fields.length < 4 || !fields[0]!.trim()) continue;\n records.push({\n sha: fields[0]!.trim(),\n date: fields[1]!.trim(),\n subject: fields[2]!,\n body: fields[3]!.trim(),\n });\n }\n return records;\n}\n\n// ── Worktrees (branches-as-teams) ──────────────────────────────────────────\n\nexport interface WorktreeHandle {\n /** The isolated working directory. */\n dir: string;\n /** The branch checked out there. */\n branch: string;\n}\n\n/**\n * Fork an isolated worktree on a new branch from `base` (default HEAD). This is\n * how a concurrency boundary becomes a team: each concurrent writer gets its own\n * working dir and branch, so siblings never collide on files or the index.\n */\nexport async function addWorktree(\n repoDir: string,\n opts: { branch: string; base?: string; signal?: AbortSignal },\n): Promise<WorktreeHandle> {\n const dir = mkdtempSync(join(tmpdir(), 'loops-wt-'));\n const r = await git(\n ['worktree', 'add', '-b', opts.branch, dir, opts.base ?? 'HEAD'],\n { cwd: repoDir, signal: opts.signal },\n );\n if (r.exitCode !== 0)\n throw new Error(\n `git worktree add failed (exit ${r.exitCode}): ${r.stdout}`.trim(),\n );\n return { dir, branch: opts.branch };\n}\n\n/** Remove a worktree (force-discards anything uncommitted left in it). */\nexport async function removeWorktree(\n repoDir: string,\n dir: string,\n opts: { signal?: AbortSignal } = {},\n): Promise<void> {\n await git(['worktree', 'remove', '--force', dir], {\n cwd: repoDir,\n signal: opts.signal,\n });\n}\n\n/** Delete a branch ref (used to clean up a merged fork branch). */\nexport async function deleteBranch(\n repoDir: string,\n branch: string,\n opts: { signal?: AbortSignal } = {},\n): Promise<void> {\n await git(['branch', '-D', branch], { cwd: repoDir, signal: opts.signal });\n}\n\nexport interface MergeResult {\n ok: boolean;\n conflict: boolean;\n}\n\n/**\n * Land a fork branch back into the branch checked out at `repoDir`, preserving\n * the team shape (`--no-ff`). On conflict the merge is aborted so the target\n * stays clean and the caller can fail the node honestly — loops does not\n * auto-resolve (a merge-resolver is a separate, later layer).\n */\nexport async function mergeBranch(\n repoDir: string,\n branch: string,\n opts: { signal?: AbortSignal; message?: string } = {},\n): Promise<MergeResult> {\n const r = await git(\n ['merge', '--no-ff', '-m', opts.message ?? `merge ${branch}`, branch],\n { cwd: repoDir, signal: opts.signal },\n );\n if (r.exitCode === 0) return { ok: true, conflict: false };\n await git(['merge', '--abort'], { cwd: repoDir, signal: opts.signal });\n return { ok: false, conflict: true };\n}\n\n/**\n * Begin a `--no-ff --no-commit` merge WITHOUT aborting on conflict, so a resolver\n * can synthesise the result. `clean` means it merged cleanly (staged, ready to\n * commit); otherwise `conflicted` lists the unresolved paths (with markers).\n */\nexport async function mergeNoCommit(\n repoDir: string,\n branch: string,\n opts: { signal?: AbortSignal } = {},\n): Promise<{ clean: boolean; conflicted: string[] }> {\n const r = await git(['merge', '--no-ff', '--no-commit', branch], {\n cwd: repoDir,\n signal: opts.signal,\n });\n if (r.exitCode === 0) return { clean: true, conflicted: [] };\n return { clean: false, conflicted: await conflictedFiles(repoDir, opts) };\n}\n\n/** Paths with unresolved merge conflicts. */\nexport async function conflictedFiles(\n repoDir: string,\n opts: { signal?: AbortSignal } = {},\n): Promise<string[]> {\n const r = await git(['diff', '--name-only', '--diff-filter=U'], {\n cwd: repoDir,\n signal: opts.signal,\n });\n return r.stdout\n .split('\\n')\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/** Abort an in-progress merge. */\nexport async function mergeAbort(\n repoDir: string,\n opts: { signal?: AbortSignal } = {},\n): Promise<void> {\n await git(['merge', '--abort'], { cwd: repoDir, signal: opts.signal });\n}\n\n// ── Remote ──────────────────────────────────────────────────────────────────\n\nexport interface PushOptions extends GitOpts {\n /** The remote to push to. Default `origin`. */\n remote?: string;\n /** The branch to push. Default the branch checked out at `cwd`. */\n branch?: string;\n /** Set the upstream tracking ref (`-u`). Default true. */\n setUpstream?: boolean;\n /** Force-with-lease the push. Default false. */\n force?: boolean;\n}\n\nexport interface PushResult {\n ok: boolean;\n /** The combined git output, surfaced on failure (no remote, rejected, etc.). */\n output: string;\n}\n\n/**\n * Push the branch to a remote — the one place loops reaches past the local\n * substrate. Honest like the rest of this module: a non-zero exit (no remote, a\n * rejected non-fast-forward, no upstream) comes back as `{ ok: false, output }`\n * for the caller to surface, never a throw. `--force-with-lease` is the only\n * force offered, so a force push still refuses to clobber unseen remote work.\n */\nexport async function push(opts: PushOptions): Promise<PushResult> {\n const branch = opts.branch ?? (await currentBranch(opts));\n const args = ['push'];\n if (opts.setUpstream ?? true) args.push('-u');\n if (opts.force) args.push('--force-with-lease');\n args.push(opts.remote ?? 'origin');\n if (branch) args.push(branch);\n const r = await execa('git', args, {\n cwd: opts.cwd,\n cancelSignal: opts.signal,\n reject: false,\n stdin: 'ignore',\n all: true,\n });\n return { ok: (r.exitCode ?? 1) === 0, output: (r.all ?? r.stdout ?? '').trim() };\n}\n","/**\n * The scratch files (`.loops/`) — two transient write-ahead buffers that carry a\n * unit of work's memory forward, split by AUDIENCE:\n *\n * - `ledger.md` is WORKING MEMORY, for the agent(s) doing the work NOW. Verbose and\n * real-time: the running log of what is being tried, for the agent itself and for\n * any concurrent peers fanned out on the same team. The harness appends to it\n * automatically after each turn (auto-capture), so the why is recorded even when a\n * single agent's context decays or no one holds all the reasoning at the end.\n *\n * - `prompt.md` is the HANDOFF, for the NEXT agent(s). Distilled and curated: the\n * why, what was ruled out, the constraints, what is left. Grounding injects it\n * into the next context as the start of its prompt; `commitJob` crystallises it\n * into the commit body (alongside a compacted ledger). Same artifact, two stages.\n *\n * The commit body is `prompt.md` + a compacted `ledger.md`, welded to its diff — and\n * it does not expire at the next turn. It is a permanent record in git history that\n * ANY later agent can look back to, as far back as it wants: recent-N grounding\n * surfaces the nearby ones, retrieval selects the relevant ones however old, and an\n * agent can always walk the log itself. Each one says \"here is how to reason about\n * this snapshot of changes\" — the why, what was ruled out, the constraints, and what\n * the implementer actually did. Both files reset once the commit lands (crystallise,\n * then reset); the record they became lives on in the history.\n *\n * The whole `.loops/` dir is kept out of git (self-managed `.gitignore`), so\n * `commitJob`'s `git add -A` never stages either file. The files are the draft; the\n * commit is the record.\n */\n\nimport {\n appendFileSync,\n existsSync,\n mkdirSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { Workspace } from './types.ts';\n\nconst SCRATCH_DIR = '.loops';\nconst LEDGER_FILE = 'ledger.md';\nconst PROMPT_FILE = 'prompt.md';\n\n/** Absolute path to a workspace's working memory (`ledger.md`). */\nexport function ledgerPath(workspace: Workspace): string {\n return join(workspace.dir, SCRATCH_DIR, LEDGER_FILE);\n}\n\n/** Absolute path to a workspace's handoff (`prompt.md`, the staged commit body). */\nexport function promptPath(workspace: Workspace): string {\n return join(workspace.dir, SCRATCH_DIR, PROMPT_FILE);\n}\n\n/** Create `.loops/` and keep it (and everything in it) out of git. */\nfunction ensureDir(workspace: Workspace): void {\n mkdirSync(join(workspace.dir, SCRATCH_DIR), { recursive: true });\n ensureIgnored(workspace);\n}\n\n/**\n * Guarantee `.loops/.gitignore` ignores everything, so neither scratch file is ever\n * staged — even if an agent wrote one directly rather than through these helpers.\n * No-op when `.loops/` does not exist.\n */\nexport function ensureIgnored(workspace: Workspace): void {\n const dir = join(workspace.dir, SCRATCH_DIR);\n if (!existsSync(dir)) return;\n const ignore = join(dir, '.gitignore');\n if (!existsSync(ignore)) writeFileSync(ignore, '*\\n');\n}\n\nfunction read(path: string): string {\n try {\n return readFileSync(path, 'utf8').trim();\n } catch {\n return '';\n }\n}\n\nfunction reset(path: string): void {\n try {\n rmSync(path, { force: true });\n } catch {\n /* best-effort */\n }\n}\n\n// ── The handoff (`prompt.md`) ────────────────────────────────────────────────\n\nexport interface PromptNote {\n /** Optional section heading (Why / Alternatives / Constraints / Next…). */\n heading?: string;\n /** The reasoning to record — the \"why\". */\n body: string;\n /** Who recorded it, so a fanned-out team's why stays attributable. */\n author?: string;\n}\n\n/**\n * Append a note to the handoff. Durable and append-only: many agents on one team\n * add to the same handoff as they work, and the order is preserved. Uses an\n * O_APPEND write, so concurrent appends do not clobber each other.\n */\nexport function appendPrompt(workspace: Workspace, note: PromptNote | string): void {\n ensureDir(workspace);\n const n = typeof note === 'string' ? { body: note } : note;\n const header = n.heading\n ? `## ${n.heading}${n.author ? ` — ${n.author}` : ''}\\n\\n`\n : n.author\n ? `_${n.author}:_ `\n : '';\n appendFileSync(promptPath(workspace), `${header}${n.body.trim()}\\n\\n`);\n}\n\n/** Read the handoff, or '' when nothing has been drafted. */\nexport function readPrompt(workspace: Workspace): string {\n return read(promptPath(workspace));\n}\n\n/** Clear the handoff at the commit boundary (the atomicity rule: then reset). */\nexport function resetPrompt(workspace: Workspace): void {\n reset(promptPath(workspace));\n}\n\n// ── Working memory (`ledger.md`) ─────────────────────────────────────────────\n\nexport interface LedgerEntry {\n /** The job/agent label for the turn. */\n label?: string;\n /** The iteration number, when inside a loop. */\n iteration?: number;\n /** The agent's own reasoning text for the turn. */\n text?: string;\n /** Tool actions taken this turn, pre-summarised (e.g. `['Edit×2', 'Bash']`). */\n tools?: string[];\n}\n\n/**\n * Append a turn to the working memory. This is the auto-capture sink: the harness\n * records each grounded turn here (reasoning + a summary of actions), and agents can\n * jot their own notes too. Append-only and O_APPEND, so concurrent peers don't\n * clobber each other.\n */\nexport function appendLedger(workspace: Workspace, entry: LedgerEntry | string): void {\n ensureDir(workspace);\n const path = ledgerPath(workspace);\n if (typeof entry === 'string') {\n const body = entry.trim();\n if (body) appendFileSync(path, `${body}\\n\\n`);\n return;\n }\n const head = entry.label\n ? `### ${entry.label}${entry.iteration ? ` · iteration ${entry.iteration}` : ''}`\n : entry.iteration\n ? `### iteration ${entry.iteration}`\n : '';\n const lines: string[] = [];\n if (head) lines.push(head);\n if (entry.text?.trim()) lines.push(entry.text.trim());\n if (entry.tools?.length) lines.push(`_actions: ${entry.tools.join(', ')}_`);\n if (!lines.length) return;\n appendFileSync(path, `${lines.join('\\n\\n')}\\n\\n`);\n}\n\n/** Read the working memory, or '' when nothing has been logged. */\nexport function readLedger(workspace: Workspace): string {\n return read(ledgerPath(workspace));\n}\n\n/** Clear the working memory at the commit boundary. */\nexport function resetLedger(workspace: Workspace): void {\n reset(ledgerPath(workspace));\n}\n","/**\n * Tiny shared text helpers, so the same trim/truncate logic isn't re-implemented\n * (subtly differently) across modules.\n */\n\n/** Collapse all runs of whitespace to single spaces, and trim. */\nexport function oneLine(text: string): string {\n return text.replace(/\\s+/g, ' ').trim();\n}\n\n/** Truncate to `max` chars, appending a `\\n…` marker when it overflows. */\nexport function truncate(s: string, max: number): string {\n return s.length > max ? `${s.slice(0, max).trimEnd()}\\n…` : s;\n}\n","/**\n * Consolidation — the \"sleep-time\" step (Letta's reflection, DiffMem's consolidate).\n * A long run accumulates many milestone commits; consolidation folds them into one\n * bounded CONSOLIDATED LEDGER: the current state, the open threads, and every binding\n * decision preserved. It is the COARSE tier of the ledger — `ledger.md` is the fine\n * tier and the milestone commit bodies are the mid tier, so multi-granularity falls\n * out of git rather than a new artifact to maintain.\n *\n * It is decision-PRESERVING, not a progress summary: a fresh context must be able to\n * honour every convention and constraint the project settled, so consolidation keeps\n * exact values verbatim while dropping narrative. (A naive summary that compresses\n * the decisions away lets downstream work silently violate them — measured: top-k\n * retrieval and a progress summary both miss accrued decisions; only a decision-\n * preserving ledger keeps them in bounded space.)\n *\n * The consolidated ledger is a COMMIT BODY, not a tracked file — the same shape as\n * every other memory in loops (welded to a diff, read back by grounding). Each\n * consolidation commits the updated ledger as the body of an empty-tree commit, so\n * grounding and retrieval surface it like any milestone; the prior ledger is read\n * back from the last consolidation commit's body. One model call that MERGES new\n * commits into the prior ledger, not a changelog.\n */\n\nimport type { Job, JobContext, Outcome, Workspace } from './types.ts';\nimport type { EngineRef } from '../engines/engine.ts';\nimport { log, commit } from './git.ts';\nimport { LoopError } from './errors.ts';\nimport { readPrompt, readLedger } from './draft.ts';\nimport { truncate } from './text.ts';\n\nconst CONSOLIDATE_SYSTEM =\n \"You maintain a project's CONSOLIDATED LEDGER from its commit history — the bounded \" +\n 'coarse memory a fresh context reads to continue safely. Capture the current state ' +\n 'and the open threads, and PRESERVE every binding decision, convention and constraint ' +\n 'with its exact values verbatim (downstream work must honour them, so dropping or ' +\n 'generalising even one is a failure). Tight markdown; MERGE new commits into the ' +\n 'prior ledger, deduplicate, omit only narrative — never omit a decision.';\n\nexport interface ConsolidateOptions {\n /** Recent milestones to fold in. Default 30. */\n max?: number;\n /**\n * Exclusive lower bound — fold only commits after this ref (e.g. the base\n * branch). This scopes the fold to one line of work, exactly the set a squash\n * merge collapses, so the consolidation can stand in as the squash body.\n */\n since?: string;\n /** The consolidated ledger so far, to update in place. */\n prior?: string;\n /** Engine for the (one) consolidation call. Default the run engine. */\n engine?: EngineRef;\n model?: string;\n}\n\n/** A compact, heading-stripped snippet of a commit body — the decision content, not\n * the \"## Why\" heading a naive first-line grab would return. */\nfunction digest(body: string, n = 280): string {\n const text = body\n .split('\\n')\n .filter((l) => l.trim() && !l.trimStart().startsWith('#'))\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n return text.length > n ? `${text.slice(0, n).trimEnd()}…` : text;\n}\n\n/**\n * Fold the recent history into one decision-preserving consolidated ledger (a single\n * model call). Returns the ledger text; the caller decides where it lives (see\n * `consolidateJob`). Each commit is offered as its subject plus a body digest, so the\n * exact decisions — not just the headings — reach the consolidation.\n */\nexport async function consolidate(\n ctx: JobContext,\n opts: ConsolidateOptions = {},\n): Promise<string> {\n const records = await log({\n cwd: ctx.workspace.dir,\n max: opts.max ?? 30,\n since: opts.since,\n signal: ctx.signal,\n });\n const entries = records\n .map(\n (r) =>\n `- ${r.sha.slice(0, 7)} ${r.subject}${r.body ? `\\n ${digest(r.body)}` : ''}`,\n )\n .join('\\n');\n\n const engine = opts.engine ? ctx.resolveEngine(opts.engine) : ctx.engine;\n const result = await engine.run(\n {\n prompt:\n (opts.prior ? `CURRENT LEDGER:\\n${opts.prior}\\n\\n` : '') +\n `COMMITS (newest first):\\n${entries || '(none)'}\\n\\n` +\n `Output the updated consolidated ledger.`,\n system: CONSOLIDATE_SYSTEM,\n model: opts.model,\n maxTokens: 1000,\n },\n () => {},\n ctx.signal,\n );\n return result.text.trim();\n}\n\n// ── Fine-grained compaction (the commit body) ───────────────────────────────\n// The same fold, one scale down: where `consolidate` compresses a stream of\n// milestone commits into a consolidated ledger, `compactLedger` compresses ONE run's verbose\n// working log (`ledger.md`) into the tight summary that rides in the commit body.\n\nconst COMPACT_SYSTEM =\n 'You write the HANDOFF a future agent reads if it lost ALL memory of this work. Include ' +\n 'EVERYTHING it needs to continue safely, as structured markdown: ## Why (the problem and ' +\n 'the root cause), ## What (exactly what changed, and where — names, paths, signatures), ' +\n '## Alternatives (what was ruled out and why), ## Constraints (the invariants and limits ' +\n 'that shaped it), ## Next (what is left or to watch). Preserve every decision and specific ' +\n 'value verbatim. Completeness matters more than brevity — drop only literal repetition and ' +\n 'play-by-play narration, never a decision or a detail. Omit a section only if it truly has ' +\n 'nothing. No preamble.';\n\nexport interface CompactOptions {\n engine?: EngineRef;\n model?: string;\n /**\n * The size budget for the working log in the commit body. A log already within\n * it is kept VERBATIM (no model call); only a longer one is compacted, with this\n * as the truncation fallback. Default 2000.\n */\n maxChars?: number;\n}\n\n/**\n * Compress a verbose working log (the ledger) into a tight summary for the commit\n * body — one cheap model call. A short log (already within `maxChars`) is kept\n * verbatim: compaction only earns its keep on a long log, and summarising a few\n * lines just risks dropping the faithful \"way\" the commit body exists to preserve.\n * Falls back to truncation when there is no usable reply or the call throws, so a\n * commit never fails on compaction. '' in, '' out.\n */\nexport async function compactLedger(\n ctx: JobContext,\n text: string,\n opts: CompactOptions = {},\n): Promise<string> {\n const trimmed = text.trim();\n if (!trimmed) return '';\n const max = opts.maxChars ?? 2000;\n // Already within budget — keep it verbatim, faithful, and spend no model call.\n if (trimmed.length <= max) return trimmed;\n try {\n const engine = opts.engine ? ctx.resolveEngine(opts.engine) : ctx.engine;\n const result = await engine.run(\n {\n prompt: `WORKING LOG:\\n${trimmed}\\n\\nWrite the complete handoff.`,\n system: COMPACT_SYSTEM,\n model: opts.model,\n maxTokens: 1200,\n },\n () => {},\n ctx.signal,\n );\n return result.text.trim() || truncate(trimmed, max);\n } catch {\n return truncate(trimmed, max);\n }\n}\n\n/**\n * Compose the commit body — the handoff: everything the next agent needs if it lost all\n * memory of this work. Two sources, in order: the agent's OWN handoff (captured verbatim by\n * the handoff contract into `prompt.md`), else a structured handoff DISTILLED from the\n * working log. The second path is the guarantee — loops owns the commit step, so a terse,\n * instruction-skipping agent still leaves a rich, structured record rather than a bare\n * \"done\". Returns '' only when there is nothing at all, so callers fall back to their floor.\n */\nexport async function composeCommitBody(\n ctx: JobContext,\n workspace: Workspace,\n opts: CompactOptions = {},\n): Promise<string> {\n // Distill the handoff from the agent's own handoff AND the working log together. Always\n // distill the two as one body of material: a TERSE self-handoff must never shadow the far\n // richer working log (the agent narrates the work but writes a one-line handoff), and a\n // silent agent still gets a structured record from its log. Short material is kept verbatim.\n const material = [readPrompt(workspace), readLedger(workspace)]\n .map((s) => s.trim())\n .filter(Boolean)\n .join('\\n\\n');\n return material ? await compactLedger(ctx, material, opts) : '';\n}\n\nexport interface ConsolidateJobConfig extends ConsolidateOptions {\n label?: string;\n /** Commit subject; also how the prior ledger is found. Default `consolidate: ledger`. */\n subject?: string;\n}\n\n/**\n * Consolidate and commit the CONSOLIDATED LEDGER as a commit body. Reads the prior\n * ledger from the last consolidation commit's body, folds in the recent history, and\n * commits the updated ledger as the body of an empty-tree commit — so the coarse\n * memory is durable and grounded-on like any milestone, never a tracked file.\n */\nexport function consolidateJob(config: ConsolidateJobConfig = {}): Job {\n return async (ctx) => {\n const label = config.label ?? 'consolidate';\n const subject = config.subject ?? 'consolidate: ledger';\n const path = [...ctx.path];\n ctx.emit({ kind: 'job:start', ts: Date.now(), path, label });\n try {\n // The prior ledger is the body of the most recent consolidation commit — the\n // consolidated ledger lives in git's memory (commit bodies), not a tracked file.\n const recent = await log({ cwd: ctx.workspace.dir, max: 50, signal: ctx.signal });\n const prior = recent.find((r) => r.subject === subject)?.body || undefined;\n const ledger = await consolidate(ctx, { ...config, prior });\n const sha = await commit(\n { subject, body: ledger, allowEmpty: true },\n { cwd: ctx.workspace.dir, signal: ctx.signal },\n );\n const outcome: Outcome = {\n status: 'pass',\n summary: sha ? `ledger ${sha.slice(0, 7)}` : 'ledger unchanged',\n data: { sha: sha ?? null },\n };\n ctx.emit({ kind: 'job:end', ts: Date.now(), path, label, outcome });\n return outcome;\n } catch (e) {\n const error = LoopError.from(e, { code: 'BODY', path: ctx.path });\n ctx.emit({\n kind: 'error',\n ts: Date.now(),\n path,\n message: error.message,\n code: error.code,\n });\n const outcome: Outcome = { status: 'fail', summary: error.message, error };\n ctx.emit({ kind: 'job:end', ts: Date.now(), path, label, outcome });\n return outcome;\n }\n };\n}\n","/**\n * The read side — grounding. Where the draft carries the within-iteration why,\n * grounding carries the cross-iteration memory: before a fresh context does\n * work, it reads the recent commit log so it knows what prior iterations already\n * tried and why, and does not re-walk a dead end. This is the half of the\n * fresh-context bet that kills amnesia (the other half being that fresh context\n * kills rot).\n *\n * The reach is deliberately BRANCH-LOCAL. `git log` on the current branch is the\n * committed truth of this line of work; adjacent active branches are in-flight\n * and may never land, so grounding on them feeds the agent premises that can\n * vanish. When a sibling team's work matters, it lands back into this line and\n * grounding then picks it up naturally — the merge is where work becomes shared\n * truth. Cross-branch awareness, if ever wanted, is a separate, thin, opt-in\n * signal, not this read.\n */\n\nimport { log, type CommitRecord } from './git.ts';\nimport type { JobContext, Workspace } from './types.ts';\nimport type { EngineRef } from '../engines/engine.ts';\nimport { truncate } from './text.ts';\n\nexport interface GroundOptions {\n /**\n * Exclusive lower bound: only commits after this ref. Pass the loop's start\n * ref to scope the ledger to \"this run\". Omitted reads recent branch history.\n */\n since?: string;\n /** Max commits to include (newest first). Default 10. */\n max?: number;\n /** Truncate each commit body to this many chars, so the ledger never re-rots\n * the fresh context. Default 1200. */\n bodyChars?: number;\n signal?: AbortSignal;\n}\n\n/**\n * Render the recent ledger as a prompt block for the next fresh context. Returns\n * '' when there is nothing yet (a first iteration on a fresh branch), so callers\n * can prepend it unconditionally. Newest commit first.\n */\nexport async function groundingText(\n workspace: Workspace,\n opts: GroundOptions = {},\n): Promise<string> {\n const records = await log({\n cwd: workspace.dir,\n since: opts.since,\n max: opts.max ?? 10,\n signal: opts.signal,\n });\n if (!records.length) return '';\n\n const where = workspace.branch ? `\\`${workspace.branch}\\`` : 'this branch';\n const header =\n `## Recent work on ${where} (the commit log)\\n` +\n `What prior iterations already did and why — read it before working so you ` +\n `do not repeat a dead end. Most recent first.`;\n\n const bodyChars = opts.bodyChars ?? 1200;\n const entries = records.map((r) => {\n const head = `### ${r.sha.slice(0, 7)} ${r.subject}`;\n return r.body ? `${head}\\n\\n${truncate(r.body, bodyChars)}` : head;\n });\n\n return `${header}\\n\\n${entries.join('\\n\\n')}`;\n}\n\n// ── Retrieval grounding ─────────────────────────────────────────────────────\n// Recent-N grounding is noisy when the branch log carries unrelated work (e.g. a\n// shared monorepo). Retrieval fixes that the way DiffMem/GCC do — selectively —\n// but stays in the git grain: a cheap model reads the candidate commit SUBJECTS\n// and picks the shas relevant to the task; only those bodies are injected. No\n// embeddings, no index file — git's own log IS the index.\n\nexport interface RetrieveOptions {\n /** The task/intent to find relevant prior commits for. */\n intent: string;\n /**\n * The recall window: how many recent commits to offer the selector as\n * candidates. A relevant commit OLDER than this is invisible — retrieval is not\n * unbounded, it just has a bigger window than recent-N. Reading subjects is\n * cheap, so this can be generous. For a log longer than any practical window,\n * run consolidation: the consolidated-ledger commit stays in-window and indexes the\n * old history. Default 100.\n */\n candidates?: number;\n /** Max commits to inject. Default 8. */\n max?: number;\n /** Truncate each injected body. Default 1200. */\n bodyChars?: number;\n /** Engine for the (cheap) selection call. Default the run engine. */\n engine?: EngineRef;\n /** Model for the selection call (a small one is plenty). */\n model?: string;\n}\n\nconst SELECT_SYSTEM =\n 'You select which past commits are relevant CONTEXT for a task. Be selective: ' +\n 'return only genuinely relevant commits, fewer is better. Output ONLY shas, ' +\n 'comma-separated, most relevant first — or the single word NONE.';\n\n/** Match the model's reply back to candidate commits, preserving its order. */\nfunction pickShas(text: string, records: CommitRecord[]): CommitRecord[] {\n const ids = text.toLowerCase().match(/[0-9a-f]{7,40}/g) ?? [];\n const out: CommitRecord[] = [];\n const seen = new Set<string>();\n for (const id of ids) {\n const rec = records.find((r) => r.sha.startsWith(id));\n if (rec && !seen.has(rec.sha)) {\n seen.add(rec.sha);\n out.push(rec);\n }\n }\n return out;\n}\n\n/**\n * Render only the prior commits a cheap model judges relevant to `intent`.\n * Returns '' when nothing is on the branch or nothing is judged relevant.\n */\nexport async function retrieveLedger(\n ctx: JobContext,\n opts: RetrieveOptions,\n): Promise<string> {\n const records = await log({\n cwd: ctx.workspace.dir,\n max: opts.candidates ?? 100,\n signal: ctx.signal,\n });\n if (!records.length) return '';\n\n const list = records\n .map((r) => `${r.sha.slice(0, 9)}: ${r.subject}`)\n .join('\\n');\n const engine = opts.engine ? ctx.resolveEngine(opts.engine) : ctx.engine;\n const result = await engine.run(\n {\n prompt:\n `TASK:\\n${opts.intent}\\n\\n` +\n `CANDIDATE COMMITS (sha: subject):\\n${list}\\n\\n` +\n `Return the shas relevant to the TASK (up to ${opts.max ?? 8}), or NONE.`,\n system: SELECT_SYSTEM,\n model: opts.model,\n maxTokens: 200,\n },\n () => {},\n ctx.signal,\n );\n\n const picked = pickShas(result.text, records).slice(0, opts.max ?? 8);\n if (!picked.length) return '';\n\n const where = ctx.workspace.branch ? `\\`${ctx.workspace.branch}\\`` : 'this branch';\n const header =\n `## Relevant prior work on ${where} (retrieved for this task)\\n` +\n `Commits a search judged relevant — read them before working.`;\n const bodyChars = opts.bodyChars ?? 1200;\n const entries = picked.map((r) => {\n const head = `### ${r.sha.slice(0, 7)} ${r.subject}`;\n return r.body ? `${head}\\n\\n${truncate(r.body, bodyChars)}` : head;\n });\n return `${header}\\n\\n${entries.join('\\n\\n')}`;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { execa } from 'execa';\n\nimport type {\n ConditionInput,\n ConditionResult,\n FeedbackActionSeverity,\n FeedbackDecision,\n FeedbackFinding,\n FeedbackSeverity,\n GraphPosition,\n Job,\n JobContext,\n Outcome,\n RevisionRequest,\n RevisionRerun,\n} from './types.ts';\nimport { toCondition } from './condition.ts';\nimport { setMeta } from './describe.ts';\nimport { LoopError } from './errors.ts';\nimport { oneLine, truncate } from './text.ts';\nimport { readLedger, readPrompt } from './draft.ts';\nimport { groundingText } from './ground.ts';\n\nexport type {\n FeedbackActionSeverity,\n FeedbackDecision,\n FeedbackFinding,\n FeedbackSeverity,\n RevisionRequest,\n RevisionRerun,\n} from './types.ts';\n\nexport interface RevisionRequestInput {\n target?: string;\n reason?: string;\n findings?: FeedbackFinding[];\n rerun?: RevisionRerun;\n source?: string;\n decision?: FeedbackDecision;\n}\n\nexport function normalizeFeedbackSeverity(\n severity: FeedbackSeverity | undefined,\n): FeedbackActionSeverity {\n switch (severity) {\n case 'advisory':\n return 'nice-to-have';\n case 'blocking':\n case undefined:\n return 'block';\n default:\n return severity;\n }\n}\n\nexport function isRequiredFeedbackSeverity(\n severity: FeedbackSeverity | undefined,\n): boolean {\n const normalized = normalizeFeedbackSeverity(severity);\n return normalized === 'block' || normalized === 'should-fix';\n}\n\nfunction findingLine(finding: FeedbackFinding): string {\n const reviewer = finding.reviewer ? `${finding.reviewer} ` : '';\n const severity = normalizeFeedbackSeverity(finding.severity);\n const decision = finding.decision ? ` Decision: ${finding.decision}.` : '';\n const recommendation = finding.recommendation\n ? ` Recommendation: ${oneLine(finding.recommendation)}`\n : '';\n return `- ${reviewer}[${severity}]: ${oneLine(finding.evidence)}${decision}${recommendation}`;\n}\n\nfunction defaultReason(findings: FeedbackFinding[] | undefined): string {\n if (!findings?.length) return 'Revision requested';\n if (findings.length === 1) return oneLine(findings[0]!.evidence);\n return `${findings.length} findings require another pass`;\n}\n\nfunction normalizeRevision(input: RevisionRequestInput): RevisionRequest {\n const reason = input.reason?.trim() || defaultReason(input.findings);\n return {\n reason,\n target: input.target,\n findings: input.findings,\n rerun: input.rerun ?? (input.target ? 'target-and-dependents' : undefined),\n source: input.source,\n decision: input.decision,\n };\n}\n\nexport function revisionRequest(\n input: RevisionRequestInput,\n over: Partial<Outcome> = {},\n): Outcome {\n const revision = normalizeRevision(input);\n return {\n status: over.status ?? 'fail',\n confidence: over.confidence,\n summary: over.summary ?? revision.reason,\n data: over.data,\n error: over.error,\n revision,\n };\n}\n\nexport function kickback(\n to: string,\n reason: string,\n over: Partial<Outcome> = {},\n): Outcome {\n // A kickback is just a targeted revision request; `rerun` defaults to\n // 'target-and-dependents' in normalizeRevision because a target is set.\n return revisionRequest({ target: to, reason }, over);\n}\n\n/**\n * The single accessor for an outcome's revision request. `Outcome.revision` is\n * the one channel a producer sets (`revisionRequest`, `kickback`, `reviewPanel`,\n * dag routing), so there is exactly one place to read it — no parallel `kickback`\n * field or `data` copy to keep in sync.\n */\nexport function revisionFromOutcome(outcome: Outcome): RevisionRequest | undefined {\n return outcome.revision;\n}\n\nexport function feedbackBlock(outcome: Outcome): string {\n const revision = revisionFromOutcome(outcome);\n const parts = [\n '## Feedback to address',\n 'A review or downstream stage requested another pass. Address this before unrelated work.',\n ];\n if (revision?.target) parts.push(`Target: ${revision.target}`);\n if (revision?.source) parts.push(`Source: ${revision.source}`);\n if (revision?.decision) parts.push(`Caller decision: ${revision.decision}`);\n const reason = revision?.reason ?? outcome.summary;\n if (reason) parts.push(`Reason: ${reason}`);\n const findings = revision?.findings ?? [];\n if (findings.length) {\n parts.push('Findings:');\n parts.push(findings.map(findingLine).join('\\n'));\n }\n return parts.join('\\n\\n');\n}\n\nexport function graphPositionBlock(graph: GraphPosition): string {\n return [\n '## Graph position',\n `DAG: ${graph.dag}`,\n `Current node: ${graph.node}`,\n `Path: ${graph.path.join(' > ')}`,\n `Depends on: ${graph.needs.length ? graph.needs.join(', ') : 'none'}`,\n `Direct dependents: ${\n graph.dependents.length ? graph.dependents.join(', ') : 'none'\n }`,\n ].join('\\n');\n}\n\ntype ReviewTarget =\n | { name?: string; review: ConditionInput }\n | { name?: string; job: Job };\n\nexport interface ReviewPanelConfig {\n label?: string;\n reviewers: ReviewTarget[];\n /** Default `all`: every reviewer must pass. A number means k-of-n over all reviewers. */\n pass?: 'all' | number;\n /** When set, a failing panel emits a targeted revision request for dag routing. */\n target?: string;\n rerun?: RevisionRerun;\n}\n\ninterface ReviewResult {\n name: string;\n met: boolean;\n confidence?: number;\n reason: string;\n}\n\nasync function runReviewer(\n reviewer: ReviewTarget,\n index: number,\n ctx: JobContext,\n): Promise<ReviewResult> {\n const name = reviewer.name ?? `reviewer-${index + 1}`;\n try {\n if ('job' in reviewer) {\n const outcome = await reviewer.job(ctx);\n return {\n name,\n met: outcome.status === 'pass',\n confidence: outcome.confidence,\n reason: outcome.summary ?? outcome.status,\n };\n }\n const result: ConditionResult = await toCondition(reviewer.review)(\n ctx,\n ctx.lastOutcome,\n );\n return {\n name,\n met: result.met,\n confidence: result.confidence,\n reason: result.reason,\n };\n } catch (e) {\n // A genuine abort stops the whole run — let it propagate.\n if (ctx.signal.aborted) throw e;\n // Otherwise, one reviewer erroring (a transient engine/network failure) must\n // not reject the whole panel and turn a recoverable retry into a hard loop\n // failure. Count it as an unmet finding so sibling verdicts still stand — the\n // same reason quorum runs its jurors under allSettled.\n return {\n name,\n met: false,\n reason: `reviewer errored: ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n}\n\nfunction reviewFinding(result: ReviewResult): FeedbackFinding {\n // Every panel reviewer is a gate, so a failing one is a blocking finding.\n return {\n reviewer: result.name,\n severity: 'block',\n evidence: result.reason,\n };\n}\n\nfunction findingSeverityCounts(\n findings: FeedbackFinding[],\n): Partial<Record<FeedbackActionSeverity, number>> {\n const counts: Partial<Record<FeedbackActionSeverity, number>> = {};\n for (const finding of findings) {\n const severity = normalizeFeedbackSeverity(finding.severity);\n counts[severity] = (counts[severity] ?? 0) + 1;\n }\n return counts;\n}\n\nexport function reviewPanel(config: ReviewPanelConfig): Job {\n const label = config.label ?? 'review-panel';\n // A panel with no reviewers would pass vacuously (0/0), letting unreviewed work\n // through a gate meant to enforce review. Reject it at construction.\n if (!config.reviewers.length)\n throw new LoopError({\n code: 'CONFIG',\n message: `reviewPanel \"${label}\": at least one reviewer is required`,\n });\n const job: Job = async (ctx) => {\n ctx.emit({ kind: 'job:start', ts: Date.now(), path: [...ctx.path], label });\n const results = await Promise.all(\n config.reviewers.map((reviewer, i) => runReviewer(reviewer, i, ctx)),\n );\n const passedCount = results.filter((r) => r.met).length;\n const required =\n config.pass === undefined || config.pass === 'all'\n ? results.length\n : config.pass;\n const findings = results.filter((r) => !r.met).map(reviewFinding);\n const passed = passedCount >= required;\n const summaryHead = `Review panel: ${passedCount}/${results.length} reviewer(s) cleared`;\n const summary = findings.length\n ? `${summaryHead}.\\n${findings.map(findingLine).join('\\n')}`\n : `${summaryHead}.`;\n // Average only the confidences reviewers actually reported. Coercing a\n // missing confidence to 0 conflates \"no signal\" with \"zero confidence\" and\n // can drag a cleanly-passing panel's confidence to 0, stalling an enclosing\n // loop's minConfidence gate (quorum likewise averages only the votes it has).\n const scored = results\n .map((r) => r.confidence)\n .filter((c): c is number => c != null);\n const confidence = scored.length\n ? scored.reduce((sum, c) => sum + c, 0) / scored.length\n : undefined;\n const data = {\n findings,\n results,\n passed: passedCount,\n required,\n severityCounts: findingSeverityCounts(findings),\n };\n const outcome: Outcome = passed\n ? { status: 'pass', summary, confidence, data }\n : revisionRequest(\n {\n target: config.target,\n // A clean one-line reason. The findings ride the `findings` array, so\n // feedbackBlock renders them once (not embedded in the reason too) and\n // the records/tail `reason` stays a single tidy line. The full\n // multi-line `summary` is kept on the outcome below for logs/TUI.\n reason: `${summaryHead}.`,\n findings,\n rerun: config.rerun,\n },\n { summary, confidence, data },\n );\n ctx.emit({ kind: 'job:end', ts: Date.now(), path: [...ctx.path], label, outcome });\n return outcome;\n };\n return setMeta(job, { kind: 'reviewPanel', name: label });\n}\n\nexport interface ReviewContextConfig {\n diff?: boolean;\n files?: string[];\n ledger?: boolean;\n tests?: boolean | { command: string; args?: string[]; cwd?: string };\n maxChars?: number;\n}\n\nasync function gitOutput(\n cwd: string,\n args: string[],\n signal: AbortSignal,\n): Promise<string> {\n const out = await execa('git', args, {\n cwd,\n reject: false,\n stripFinalNewline: false,\n cancelSignal: signal,\n });\n return out.stdout.trim();\n}\n\nasync function resolveFiles(\n ctx: JobContext,\n patterns: string[],\n): Promise<string[]> {\n const fromGit = await gitOutput(\n ctx.workspace.dir,\n ['ls-files', '--', ...patterns],\n ctx.signal,\n ).catch(() => '');\n const files = fromGit ? fromGit.split('\\n').filter(Boolean) : [];\n if (files.length) return files;\n return patterns.filter((p) => existsSync(join(ctx.workspace.dir, p)));\n}\n\nexport function reviewContext(config: ReviewContextConfig) {\n return async (ctx: JobContext, last: Outcome | undefined): Promise<string> => {\n const max = config.maxChars ?? 6000;\n\n const buildTests = async (): Promise<string[]> => {\n if (!config.tests) return [];\n if (config.tests === true) {\n const lines: string[] = [];\n if (last?.status) lines.push(`Last outcome status: ${last.status}`);\n if (last?.summary) lines.push(`Last outcome summary: ${last.summary}`);\n if (last?.data !== undefined) {\n // Guard the stringify: a circular or BigInt-bearing `data` would throw,\n // and agentCheck awaits context() outside its try/catch, so the throw\n // would fail the whole review instead of degrading the evidence.\n let rendered: string;\n try {\n rendered = JSON.stringify(last.data, null, 2);\n } catch {\n rendered = String(last.data);\n }\n lines.push(`Last outcome data: ${rendered}`);\n }\n return lines.length\n ? [`## Test and outcome context\\n\\n${lines.join('\\n')}`]\n : [];\n }\n const cwd = config.tests.cwd ?? ctx.workspace.dir;\n // Unlike the git probes, an unspawnable or aborted command would otherwise\n // reject out of reviewContext and throw the whole review. Guard it, and\n // never report `exit: 0` for a command that did not actually run — that\n // would tell the judge the tests passed.\n const result = await execa(\n config.tests.command,\n config.tests.args ?? [],\n { cwd, reject: false, stripFinalNewline: false, cancelSignal: ctx.signal },\n ).catch((e: unknown) => {\n if (ctx.signal.aborted) throw e; // a real abort stops the run\n return {\n exitCode: undefined as number | undefined,\n stdout: '',\n stderr: e instanceof Error ? e.message : String(e),\n };\n });\n const exit = result.exitCode ?? '(command did not run)';\n return [\n `## Test command\\n\\n${config.tests.command} ${(config.tests.args ?? []).join(' ')}\\n\\n` +\n `exit: ${exit}\\n\\nstdout:\\n${truncate(result.stdout ?? '', max)}\\n\\nstderr:\\n${truncate(result.stderr ?? '', max)}`,\n ];\n };\n\n const buildDiff = async (): Promise<string[]> => {\n if (!config.diff) return [];\n const diff = await gitOutput(\n ctx.workspace.dir,\n ['diff', 'HEAD', '--'],\n ctx.signal,\n ).catch(() => '');\n return diff ? [`## Git diff\\n\\n${truncate(diff, max)}`] : [];\n };\n\n const buildFiles = async (): Promise<string[]> => {\n if (!config.files?.length) return [];\n const files = await resolveFiles(ctx, config.files);\n const out: string[] = [];\n for (const file of files) {\n const path = join(ctx.workspace.dir, file);\n if (!existsSync(path)) continue;\n out.push(`## File: ${file}\\n\\n${truncate(readFileSync(path, 'utf8'), max)}`);\n }\n return out;\n };\n\n const buildLedger = async (): Promise<string[]> => {\n if (!config.ledger) return [];\n const out: string[] = [];\n const live = [readPrompt(ctx.workspace), readLedger(ctx.workspace)]\n .filter(Boolean)\n .join('\\n\\n');\n if (live) out.push(`## Live ledger\\n\\n${truncate(live, max)}`);\n const committed = await groundingText(ctx.workspace, {\n max: 5,\n bodyChars: 1200,\n signal: ctx.signal,\n }).catch(() => '');\n if (committed) out.push(truncate(committed, max));\n return out;\n };\n\n // The four evidence sources are independent read-only probes; gather them\n // concurrently, then assemble in a fixed order.\n const [tests, diff, files, ledger] = await Promise.all([\n buildTests(),\n buildDiff(),\n buildFiles(),\n buildLedger(),\n ]);\n const sections = [...tests, ...diff, ...files, ...ledger];\n return sections.join('\\n\\n---\\n\\n') || '(no review context)';\n };\n}\n","/**\n * Job builders. A `Job` is the unit of work; these are the common shapes.\n * The agent launch (`agentJob`) is deliberately provider-agnostic: it only\n * ever calls `Engine.run`, so it knows nothing about Claude, the CLI, an SDK,\n * an HTTP API, or any framework — swap the engine and the same job runs.\n */\n\nimport type { Outcome, Job, JobContext } from './types.ts';\nimport { setMeta } from './describe.ts';\nimport type { EngineRef } from '../engines/engine.ts';\nimport { LoopError } from './errors.ts';\nimport { assertBudget } from './budget.ts';\nimport { isRepo, stageAll, commit } from './git.ts';\nimport {\n appendLedger,\n appendPrompt,\n readLedger,\n readPrompt,\n resetLedger,\n resetPrompt,\n ensureIgnored,\n} from './draft.ts';\nimport { composeCommitBody } from './consolidate.ts';\nimport { groundingText, retrieveLedger } from './ground.ts';\nimport { agentContract, resolveSystem, type AgentDef } from './agent.ts';\nimport {\n feedbackBlock,\n graphPositionBlock,\n kickback,\n revisionRequest,\n} from './feedback.ts';\n\nexport interface AgentJobConfig {\n /** Job label (for events). Defaults to the agent's name, then `'agent'`. */\n label?: string;\n /**\n * A reusable agent definition — supplies `system` (persona + skills), `model`, and\n * `tools` (the job's `system`/`model`/`allowedTools` override it when also set). The\n * persona lives in markdown via `fromFile`; this is the typed wrapper around it.\n */\n agent?: AgentDef;\n /** The prompt, or a function of the context (e.g. include the iteration). */\n prompt: string | ((ctx: JobContext) => string | Promise<string>);\n system?: string | ((ctx: JobContext) => string);\n /** Engine override: a registered name, your own `Engine`, or the default. */\n engine?: EngineRef;\n /** Bare model id — passed straight through to the engine. */\n model?: string;\n maxTokens?: number;\n allowedTools?: string[];\n /**\n * Mark this turn a leaf: forbid spawning sub-agents (the engine disallows the sub-agent\n * tool), so a branch bottoms out here. Falls back to the agent def's `leaf`.\n */\n leaf?: boolean;\n /**\n * Append the current `ctx.lastReview` / revision feedback to the prompt. This\n * keeps implementation agents from having to remember to manually read the\n * runtime feedback channel in every prompt function.\n */\n consumeFeedback?: boolean;\n /**\n * Append a small DAG-position block: this node, its direct dependencies, and\n * its direct dependents, without handing the agent the whole orchestration graph.\n */\n graphContext?: boolean;\n /** Working dir for the turn. Default: the workspace dir (the worktree). */\n cwd?: string;\n timeoutMs?: number;\n /**\n * Ground the turn in memory before it works: prepend the branch-local commit log\n * (recent committed milestones), the live working memory (`ledger.md`) and handoff\n * (`prompt.md`) from this run, and tell the agent where to record its own\n * reasoning. With grounding on, the harness also auto-captures the turn into\n * `ledger.md` afterwards. `true` uses defaults; an object tunes the reach. This is\n * how a fresh context stops repeating what earlier iterations already tried.\n */\n ground?: boolean | GroundConfig;\n /**\n * Map the agent's raw text into an `Outcome`. Default: `pass`, with the text\n * as the summary. Return `fail` to keep an enclosing loop going.\n */\n outcome?: (text: string, ctx: JobContext) => Outcome | Promise<Outcome>;\n}\n\nexport interface GroundConfig {\n /** Max committed milestones to include (newest first). Default 10. */\n max?: number;\n /** Truncate each commit body to this many chars. Default 1200. */\n bodyChars?: number;\n /** Include the live scratch files (this run's working memory + handoff). Default true. */\n includeScratch?: boolean;\n /** Tell the agent to leave memory for the next agent. Default true. */\n recordInstruction?: boolean;\n /**\n * Retrieve relevant commits with a cheap model instead of taking recent-N.\n * Far less noisy when the branch log carries unrelated work (a shared repo).\n * `true` uses defaults; an object tunes the candidate window / selection model.\n */\n retrieve?: boolean | { candidates?: number; model?: string };\n}\n\n/** The marker the agent closes its reply with; the harness parses everything after it\n * as the handoff. A sentinel, not a file write — loops owns the turn, so the memory is\n * captured from the agent's own words rather than a side file a strong model skips. */\nconst HANDOFF_MARK = '===HANDOFF===';\n\n/** The handoff contract appended to a grounded turn. The guiding question does the work;\n * the sections just scaffold the answer. The harness splits the reply at the marker into\n * the working log (before) and the handoff (after) — see `splitTurn`. */\nfunction recordBlock(): string {\n return (\n `## Before you finish: the handoff\\n` +\n `Answer one question for whoever continues this: **what is everything future-you needs ` +\n `to know about this if you lost all memory of it?** The harness keeps your answer as the ` +\n `memory the next agent reads and as the commit body, so carry the WHY, not just the what — ` +\n `write it so they cannot repeat your dead ends or break your decisions.\\n` +\n `End your reply with this block (keep the \\`${HANDOFF_MARK}\\` marker exactly; drop a ` +\n `section only if it truly has nothing):\\n\\n` +\n `${HANDOFF_MARK}\\n` +\n `## Why\\n<the problem and the root cause you found>\\n` +\n `## What\\n<the change you made>\\n` +\n `## Alternatives\\n<what you ruled out, and why>\\n` +\n `## Constraints\\n<the invariants and limits that shaped it>\\n` +\n `## Next\\n<what is left, or what to watch>`\n );\n}\n\n/** Split a grounded turn's output at the handoff marker: the working log (everything\n * before, captured to `ledger.md`) and the handoff (everything after, captured to\n * `prompt.md`). No marker → the whole reply is working log and the handoff is empty. */\nfunction splitTurn(text: string): { work: string; handoff?: string } {\n const lines = text.split('\\n');\n for (let i = lines.length - 1; i >= 0; i--) {\n if (lines[i]!.trim().replace(/\\s+/g, '').toUpperCase() === HANDOFF_MARK) {\n return {\n work: lines.slice(0, i).join('\\n').trim(),\n handoff: lines.slice(i + 1).join('\\n').trim() || undefined,\n };\n }\n }\n return { work: text.trim() };\n}\n\n/**\n * Build the grounding preamble: the committed commit log (past milestones), this\n * run's live working memory (`ledger.md`) and handoff (`prompt.md`), and an\n * instruction to leave memory behind — then the caller's prompt. Empty parts are\n * dropped, so a first turn on a fresh branch is just the prompt.\n */\nasync function withGrounding(\n ctx: JobContext,\n userPrompt: string,\n ground: boolean | GroundConfig,\n): Promise<string> {\n const opts: GroundConfig = typeof ground === 'object' ? ground : {};\n const parts: string[] = [];\n\n const committed = opts.retrieve\n ? await retrieveLedger(ctx, {\n intent: userPrompt,\n max: opts.max,\n bodyChars: opts.bodyChars,\n candidates:\n typeof opts.retrieve === 'object' ? opts.retrieve.candidates : undefined,\n model:\n typeof opts.retrieve === 'object' ? opts.retrieve.model : undefined,\n })\n : await groundingText(ctx.workspace, {\n max: opts.max,\n bodyChars: opts.bodyChars,\n signal: ctx.signal,\n });\n if (committed) parts.push(committed);\n\n if (opts.includeScratch !== false) {\n const working = readLedger(ctx.workspace);\n if (working)\n parts.push(\n `## Working memory (this run so far)\\n\\n` +\n `What earlier turns in this run tried and found — build on it.\\n\\n${working}`,\n );\n const handoff = readPrompt(ctx.workspace);\n if (handoff)\n parts.push(\n `## Handoff so far (what earlier work distilled for the next agent)\\n\\n${handoff}`,\n );\n }\n\n if (opts.recordInstruction !== false) parts.push(recordBlock());\n\n parts.push(userPrompt);\n return parts.join('\\n\\n---\\n\\n');\n}\n\n/** Collapse a turn's tool-use counts into compact tokens (`Edit×2`, `Bash`). */\nfunction summariseTools(uses: Map<string, number>): string[] {\n return [...uses].map(([name, n]) => (n > 1 ? `${name}×${n}` : name));\n}\n\nconst TERMINAL = (text: string): Outcome => ({\n status: 'pass',\n summary: text.trim().slice(0, 280),\n data: text,\n});\n\nfunction withOperationalContext(\n ctx: JobContext,\n userPrompt: string,\n config: Pick<AgentJobConfig, 'consumeFeedback' | 'graphContext'>,\n): string {\n const parts = [userPrompt];\n if (config.consumeFeedback && ctx.lastReview) {\n parts.push(feedbackBlock(ctx.lastReview));\n }\n if (config.graphContext && ctx.graph) {\n parts.push(graphPositionBlock(ctx.graph));\n }\n return parts.join('\\n\\n---\\n\\n');\n}\n\n/** Run one fresh agent turn through whichever engine is selected. */\nexport function agentJob(config: AgentJobConfig): Job {\n const job: Job = async (ctx) => {\n const path = [...ctx.path];\n const label = config.label ?? config.agent?.name ?? 'agent';\n ctx.emit({ kind: 'job:start', ts: Date.now(), path, label });\n\n const engine = ctx.resolveEngine(config.engine);\n const userPrompt =\n typeof config.prompt === 'function'\n ? await config.prompt(ctx)\n : config.prompt;\n const contextualPrompt = withOperationalContext(ctx, userPrompt, config);\n const prompt = config.ground\n ? await withGrounding(ctx, contextualPrompt, config.ground)\n : contextualPrompt;\n // System precedence: an explicit `system` overrides the agent's (persona + skills).\n const system =\n config.system !== undefined\n ? typeof config.system === 'function'\n ? config.system(ctx)\n : config.system\n : config.agent\n ? resolveSystem(config.agent)\n : undefined;\n\n let result;\n const toolUses = new Map<string, number>();\n try {\n assertBudget(ctx); // refuse to spend past the run's token budget\n result = await engine.run(\n {\n prompt,\n system,\n model: config.model ?? config.agent?.model,\n maxTokens: config.maxTokens,\n allowedTools: config.allowedTools ?? config.agent?.tools,\n leaf: config.leaf ?? config.agent?.leaf,\n cwd: config.cwd ?? ctx.workspace.dir,\n timeoutMs: config.timeoutMs,\n },\n (e) => {\n const ts = Date.now();\n switch (e.type) {\n case 'text':\n ctx.emit({ kind: 'engine:text', ts, path, delta: e.delta });\n break;\n case 'thinking':\n ctx.emit({ kind: 'engine:thinking', ts, path, delta: e.delta });\n break;\n case 'tool':\n if (e.phase === 'use')\n toolUses.set(e.name, (toolUses.get(e.name) ?? 0) + 1);\n ctx.emit({\n kind: 'engine:tool',\n ts,\n path,\n name: e.name,\n phase: e.phase,\n });\n break;\n case 'usage':\n ctx.emit({\n kind: 'engine:usage',\n ts,\n path,\n model: e.model,\n usage: e.usage,\n });\n break;\n }\n },\n ctx.signal,\n );\n } catch (e) {\n const error = LoopError.from(e, {\n code: ctx.signal.aborted ? 'ABORTED' : 'ENGINE',\n phase: 'body',\n path: ctx.path,\n iteration: ctx.iteration,\n });\n ctx.emit({\n kind: 'error',\n ts: Date.now(),\n path,\n message: error.message,\n code: error.code,\n });\n const outcome: Outcome = {\n status: ctx.signal.aborted ? 'aborted' : 'fail',\n summary: error.message,\n error,\n };\n ctx.emit({\n kind: 'job:end',\n ts: Date.now(),\n path,\n label,\n outcome,\n });\n return outcome;\n }\n\n // Auto-capture: when memory is on, the harness records the turn from the agent's\n // own reply — no reliance on it writing a side file. The reply is split at the\n // handoff marker: the working log (before) goes to `ledger.md`, the structured\n // handoff (after) to `prompt.md`. With no marker, the whole reply is working log.\n // This is what turns a terse \"done\" into a real, structured memory.\n if (config.ground) {\n const { work, handoff } = splitTurn(result.text);\n appendLedger(ctx.workspace, {\n label,\n iteration: ctx.iteration,\n text: work,\n tools: summariseTools(toolUses),\n });\n if (handoff) appendPrompt(ctx.workspace, handoff);\n }\n\n const outcome = config.outcome\n ? await config.outcome(result.text, ctx)\n : TERMINAL(result.text);\n ctx.emit({\n kind: 'job:end',\n ts: Date.now(),\n path,\n label,\n outcome,\n });\n return outcome;\n };\n\n return setMeta(job, {\n kind: 'agent',\n name: config.label ?? config.agent?.name ?? 'agent',\n ground: !!config.ground,\n contract: agentContract(config.agent),\n });\n}\n\nexport interface CommitJobConfig {\n label?: string;\n /** Conventional-commit subject, or a function of context + last outcome. */\n subject:\n | string\n | ((ctx: JobContext, last: Outcome | undefined) => string | Promise<string>);\n /**\n * The \"way\" — the structured commit body. Precedence when composing it:\n * 1. this `body` (an explicit override — a string or function), else\n * 2. the scratch files: the handoff (`prompt.md`) plus a compacted working log\n * (`ledger.md`) — the trusted source, capturing the why as it happens across\n * a long unit of work and across fanned-out sub-agents, else\n * 3. a default composed from the last outcome (the floor).\n * Set `body` only to override the scratch files.\n */\n body?:\n | string\n | ((ctx: JobContext, last: Outcome | undefined) => string | Promise<string>);\n /** Model for the (cheap) ledger-compaction call. A small one is plenty. */\n compactModel?: string;\n /** Stage every change before committing (default true). */\n stageAll?: boolean;\n /** Commit even with nothing staged (default false → a no-op `pass`). */\n allowEmpty?: boolean;\n}\n\n/**\n * Compose the default \"way\" from an outcome — the deterministic floor that\n * guarantees every iteration leaves a structured trace even when the agent\n * writes nothing itself. Pass `body` to override.\n */\nfunction composeWay(ctx: JobContext, last: Outcome | undefined): string {\n const sections: string[] = [];\n const head: string[] = [];\n if (ctx.iteration) head.push(`iteration: ${ctx.iteration}`);\n if (last?.status) head.push(`status: ${last.status}`);\n if (typeof last?.confidence === 'number')\n head.push(`confidence: ${last.confidence.toFixed(2)}`);\n if (head.length) sections.push(`## Outcome\\n${head.join('\\n')}`);\n if (last?.summary) sections.push(`## Summary\\n${last.summary.trim()}`);\n if (ctx.lastReview?.summary)\n sections.push(`## Next\\n${ctx.lastReview.summary.trim()}`);\n return sections.join('\\n\\n');\n}\n\n/**\n * Commit the workspace — write the \"way\" (a structured body) welded to the\n * \"what\" (the staged diff) onto the work branch. This is the loop's memory: the\n * next fresh context reads these commits back. The body is composed from the\n * scratch files (the handoff plus a compacted working log agents accrued as they\n * worked), falling back to the outcome floor — so the rich why survives context\n * decay and fan-out. Both scratch files are cleared once the commit lands.\n * Engine-agnostic; it only touches `ctx.workspace.dir` and git. A non-repo\n * workspace fails loudly (a non-retryable CONFIG error) rather than silently\n * dropping the work's record.\n */\nexport function commitJob(config: CommitJobConfig): Job {\n return async (ctx) => {\n const label = config.label ?? 'commit';\n const path = [...ctx.path];\n const cwd = ctx.workspace.dir;\n ctx.emit({ kind: 'job:start', ts: Date.now(), path, label });\n try {\n if (!(await isRepo({ cwd, signal: ctx.signal }))) {\n throw new LoopError({\n code: 'CONFIG',\n message: `commitJob \"${label}\" requires a git repository (cwd: ${cwd})`,\n });\n }\n const last = ctx.lastOutcome;\n const subject =\n typeof config.subject === 'function'\n ? await config.subject(ctx, last)\n : config.subject;\n // The way, in precedence order: explicit override, then the scratch files\n // (handoff + compacted working log, the trusted accumulated why), then the\n // outcome floor.\n const body =\n config.body !== undefined\n ? typeof config.body === 'function'\n ? await config.body(ctx, last)\n : config.body\n : (await composeCommitBody(ctx, ctx.workspace, {\n model: config.compactModel,\n })) || composeWay(ctx, last);\n if (config.stageAll ?? true) {\n ensureIgnored(ctx.workspace); // never stage the scratch files\n await stageAll({ cwd, signal: ctx.signal });\n }\n const sha = await commit(\n { subject, body, allowEmpty: config.allowEmpty },\n { cwd, signal: ctx.signal },\n );\n // Crystallise, then reset: both scratch files' job ends at the commit.\n if (sha) {\n resetPrompt(ctx.workspace);\n resetLedger(ctx.workspace);\n }\n const outcome: Outcome = sha\n ? {\n status: 'pass',\n summary: `committed ${sha.slice(0, 7)}: ${subject}`,\n data: { sha },\n }\n : { status: 'pass', summary: 'nothing to commit', data: { sha: null } };\n ctx.emit({ kind: 'job:end', ts: Date.now(), path, label, outcome });\n return outcome;\n } catch (e) {\n const error = LoopError.from(e, {\n code: 'BODY',\n phase: 'body',\n path: ctx.path,\n iteration: ctx.iteration,\n });\n ctx.emit({\n kind: 'error',\n ts: Date.now(),\n path,\n message: error.message,\n code: error.code,\n });\n const outcome: Outcome = { status: 'fail', summary: error.message, error };\n ctx.emit({ kind: 'job:end', ts: Date.now(), path, label, outcome });\n return outcome;\n }\n };\n}\n\nexport { kickback, revisionRequest };\n\n/** A deterministic step from a plain function — for glue, checks, side effects. */\nexport function fnJob(\n label: string,\n fn: (ctx: JobContext) => Outcome | Promise<Outcome>,\n): Job {\n const job: Job = async (ctx) => {\n const path = [...ctx.path];\n ctx.emit({ kind: 'job:start', ts: Date.now(), path, label });\n let outcome: Outcome;\n try {\n outcome = await fn(ctx);\n } catch (e) {\n const error = LoopError.from(e, {\n code: 'BODY',\n phase: 'body',\n path: ctx.path,\n iteration: ctx.iteration,\n });\n outcome = { status: 'fail', summary: error.message, error };\n ctx.emit({\n kind: 'error',\n ts: Date.now(),\n path,\n message: error.message,\n code: error.code,\n });\n }\n ctx.emit({ kind: 'job:end', ts: Date.now(), path, label, outcome });\n return outcome;\n };\n\n return setMeta(job, { kind: 'fn', name: label });\n}\n","/**\n * Build a child `JobContext` from a parent, overriding only the per-scope\n * fields. One helper shared by `loop()` and `dag()` so the next field added to\n * `JobContext` is threaded in exactly one place.\n */\n\nimport type { GraphPosition, JobContext, Outcome, Workspace } from './types.ts';\nimport type { EnvHandle } from '../env/environment.ts';\n\nexport interface ContextOverride {\n depth: number;\n path: readonly string[];\n iteration?: number;\n lastOutcome?: Outcome;\n lastReview?: Outcome;\n /** Override the workspace (a worktree fork at a concurrency boundary). */\n workspace?: Workspace;\n /** Override the environment (a per-team env at a concurrency boundary). */\n environment?: EnvHandle;\n /** Override the DAG graph position for a node. */\n graph?: GraphPosition;\n}\n\nexport function childContext(\n parent: JobContext,\n over: ContextOverride,\n): JobContext {\n return {\n engine: parent.engine,\n resolveEngine: parent.resolveEngine,\n signal: parent.signal,\n emit: parent.emit,\n state: parent.state,\n // A child inherits the parent's workspace by default; a concurrency\n // boundary forks it into an isolated worktree by passing `workspace`.\n workspace: over.workspace ?? parent.workspace,\n environment: over.environment ?? parent.environment,\n forge: parent.forge,\n budget: parent.budget,\n onLimit: parent.onLimit,\n maxWaitMs: parent.maxWaitMs,\n resumeCommand: parent.resumeCommand,\n log: parent.log,\n depth: over.depth,\n path: over.path,\n graph: over.graph ?? parent.graph,\n // Inherit the enclosing iteration by default. A `loop` always passes one\n // explicitly; a `dag`/`sequence` does not, so without this a node nested in a\n // loop would reset to 0 — the \"Attempt 0\" confound where a retry body could not\n // see which attempt it was on. A top-level dag still gets 0 (the root's value).\n iteration: over.iteration ?? parent.iteration,\n lastOutcome: over.lastOutcome,\n lastReview: over.lastReview,\n };\n}\n","/**\n * The loop primitive. `loop(config)` returns a `Job`, so loops nest by simply\n * passing one as another's `body` or `review`.\n *\n * Lifecycle of one loop:\n * 1. `start` gate (one-or-many conditions) — unmet => `aborted`.\n * 2. repeat, up to `max`:\n * run `body` (fresh context each turn) → `stopOn`? → `until`?\n * if `until` is met and there's a `review`, run it:\n * review `pass` => loop completes `pass`\n * review !pass => re-enter the loop ← \"review fails, run main loop again\"\n * with no `until`, a `pass` body ends the loop; `max` reached => `exhausted`.\n * 3. `onComplete` post-action runs once, whatever the status.\n *\n * The review-restart cycle is bounded: by `max` (shared with ordinary\n * iterations) and, independently, by `maxReviewRestarts`. The failed review is\n * threaded to the next iteration as `ctx.lastReview` so the body can act on it.\n *\n * Every piece of user code (conditions, the body, hooks, the review) is guarded:\n * a throw is classified and ends the loop with `fail`, but `loop:end` and the\n * `onComplete` post-action still run.\n */\n\nimport type { JobContext, LoopConfig, Outcome, Job } from './types.ts';\nimport { childContext } from './context.ts';\nimport { toCondition } from './condition.ts';\nimport { setMeta, jobMeta, describeConditions } from './describe.ts';\nimport { commitJob, type CommitJobConfig } from './job.ts';\nimport { LoopError, type LoopPhase } from './errors.ts';\nimport { isLimitError, waitMsFor } from './limits.ts';\n\nconst VALID_STATUS = new Set<Outcome['status']>([\n 'pass',\n 'fail',\n 'aborted',\n 'exhausted',\n 'paused',\n]);\n\n/** A limit policy's verdict for one limited iteration. */\ntype LimitAction =\n | { kind: 'wait'; waitMs: number }\n | { kind: 'pause'; reason: string };\n\n/**\n * Decide what to do about a limit error under the run's `onLimit` policy.\n * - `fail` → never handled here (caller treats it as fatal).\n * - `auto` → wait when the reset is known AND within `maxWaitMs`\n * (BUDGET never refreshes, so it always pauses).\n * - `wait` → wait whenever the reset is known (no ceiling).\n * - `exit-resume` → never wait; always pause.\n */\nfunction decideLimit(error: LoopError, ctx: JobContext): LimitAction {\n const reason = error.message;\n if (ctx.onLimit === 'exit-resume') return { kind: 'pause', reason };\n const waitMs = waitMsFor(error);\n if (waitMs == null) return { kind: 'pause', reason };\n if (ctx.onLimit === 'wait') return { kind: 'wait', waitMs };\n // auto: wait only within the ceiling.\n if (waitMs <= ctx.maxWaitMs) return { kind: 'wait', waitMs };\n return {\n kind: 'pause',\n reason: `${reason} (reset in ${Math.round(waitMs / 1000)}s exceeds maxWait ${Math.round(ctx.maxWaitMs / 1000)}s)`,\n };\n}\nconst yieldToLoop = (): Promise<void> => new Promise((r) => setImmediate(r));\n\nexport function loop(config: LoopConfig): Job {\n if (!config.name)\n throw new LoopError({\n code: 'CONFIG',\n message: 'loop() requires a non-empty name',\n });\n const start = config.start ? toCondition(config.start) : undefined;\n const until = config.until ? toCondition(config.until) : undefined;\n const stopOn = config.stopOn ? toCondition(config.stopOn) : undefined;\n const onError = config.retry?.onError ?? 'continue';\n\n const job: Job = async (parent: JobContext): Promise<Outcome> => {\n const path = [...parent.path, config.name];\n const depth = parent.depth + 1;\n const ts = () => Date.now();\n\n let lastReview: Outcome | undefined;\n let iteration = 0;\n const ctxAt = (iter: number, lastOutcome?: Outcome): JobContext =>\n childContext(parent, {\n depth,\n path,\n iteration: iter,\n lastOutcome,\n lastReview,\n });\n\n parent.emit({ kind: 'loop:start', ts: ts(), path, depth, max: config.max });\n\n // At a milestone (the loop converged), record one structured checkpoint\n // commit. `commitJob` composes the body from the draft the iterations\n // accumulated, so the commit carries the reasoned \"way\", not a per-iteration\n // fragment. Best-effort: a failed recording is surfaced but never undoes a\n // genuine convergence.\n const commitCfg: CommitJobConfig | undefined = config.commit\n ? config.commit === true\n ? {\n label: `${config.name}:checkpoint`,\n subject: (_c, l) =>\n l?.summary?.split('\\n')[0]?.trim().slice(0, 72) ||\n `chore(${config.name}): checkpoint`,\n }\n : { label: `${config.name}:checkpoint`, ...config.commit }\n : undefined;\n const checkpoint = commitCfg ? commitJob(commitCfg) : undefined;\n const recordMilestone = async (ctx: JobContext): Promise<void> => {\n if (!checkpoint) return;\n const outcome = await checkpoint(ctx);\n if (outcome.status !== 'pass') {\n parent.emit({\n kind: 'error',\n ts: ts(),\n path,\n message: `checkpoint commit did not pass: ${outcome.summary ?? outcome.status}`,\n code: outcome.error?.code ?? 'UNKNOWN',\n });\n }\n };\n\n const finish = async (\n outcome: Outcome,\n iterations: number,\n ): Promise<Outcome> => {\n parent.emit({ kind: 'loop:end', ts: ts(), path, outcome, iterations });\n if (config.onComplete) {\n try {\n await config.onComplete(outcome, ctxAt(iterations));\n } catch (e) {\n const error = LoopError.from(e, {\n code: 'BODY',\n phase: 'review',\n path,\n iteration: iterations,\n });\n parent.emit({\n kind: 'error',\n ts: ts(),\n path,\n message: `onComplete threw: ${error.message}`,\n code: error.code,\n });\n }\n }\n return outcome;\n };\n\n // Evaluate a gate, classifying any throw with the gate's phase.\n const gate = async (\n cond: NonNullable<typeof until>,\n which: LoopPhase,\n ctx: JobContext,\n last: Outcome | undefined,\n ) => {\n try {\n return await cond(ctx, last);\n } catch (e) {\n throw LoopError.from(e, {\n code: 'VALIDATION',\n phase: which,\n path,\n iteration,\n });\n }\n };\n\n try {\n // 1. start gate\n if (start) {\n const r = await gate(start, 'start', ctxAt(0), undefined);\n parent.emit({\n kind: 'loop:condition',\n ts: ts(),\n path,\n which: 'start',\n result: r,\n });\n if (!r.met)\n return finish(\n { status: 'aborted', summary: `start gate not met: ${r.reason}` },\n 0,\n );\n }\n\n let last: Outcome | undefined;\n let consecutiveErrors = 0;\n let consecutiveReviewFails = 0;\n\n // 2. iterate\n while (true) {\n await yieldToLoop(); // ensure an abort/SIGINT can be delivered even with a synchronous body\n if (parent.signal.aborted)\n return finish(\n { status: 'aborted', summary: 'aborted by signal' },\n iteration,\n );\n if (config.max != null && iteration >= config.max) {\n return finish(\n {\n status: 'exhausted',\n summary:\n last?.summary ?? `reached max iterations (${config.max})`,\n confidence: last?.confidence,\n data: last?.data,\n },\n iteration,\n );\n }\n\n iteration += 1;\n const ctx = ctxAt(iteration, last);\n parent.emit({ kind: 'loop:iteration', ts: ts(), path, iteration });\n\n // run the body (fresh context this turn)\n let bodyThrew = false;\n try {\n last = await config.body(ctx);\n consecutiveErrors = 0;\n } catch (e) {\n bodyThrew = true;\n const error = LoopError.from(e, {\n code: 'BODY',\n phase: 'body',\n path,\n iteration,\n });\n parent.emit({\n kind: 'error',\n ts: ts(),\n path,\n message: error.message,\n code: error.code,\n });\n consecutiveErrors += 1;\n // A thrown body error is governed by the retry policy (default: continue).\n const tooMany =\n config.retry?.maxConsecutive != null &&\n consecutiveErrors >= config.retry.maxConsecutive;\n if (onError === 'fail' || tooMany)\n return finish(\n { status: 'fail', summary: error.message, error },\n iteration,\n );\n last = { status: 'fail', summary: error.message, error };\n if (config.retry?.backoffMs)\n await delay(config.retry.backoffMs, parent.signal);\n }\n\n // a malformed Outcome (e.g. a body that forgot `status`) is a bug — fail loudly, don't spin\n if (!last || !VALID_STATUS.has(last.status)) {\n const error = new LoopError({\n code: 'VALIDATION',\n phase: 'body',\n path,\n iteration,\n message: `body returned an Outcome with no valid \"status\" (got ${JSON.stringify(last?.status)})`,\n });\n parent.emit({\n kind: 'error',\n ts: ts(),\n path,\n message: error.message,\n code: error.code,\n });\n return finish(\n { status: 'fail', summary: error.message, error },\n iteration,\n );\n }\n // A rate limit / quota / budget hit is governed by the `onLimit` policy\n // (default `auto`): wait out a known, bounded reset and retry the same\n // step, else checkpoint-and-pause with a resume command. `fail` opts out\n // and lets the generic fatal handling below treat it as terminal.\n if (\n last.status === 'fail' &&\n isLimitError(last.error) &&\n ctx.onLimit !== 'fail'\n ) {\n const action = decideLimit(last.error, ctx);\n if (action.kind === 'wait') {\n const now = ts();\n parent.emit({\n kind: 'limit:wait',\n ts: now,\n path,\n code: last.error.code,\n waitMs: action.waitMs,\n resumeAt: now + action.waitMs,\n });\n await delay(action.waitMs, parent.signal);\n // Don't burn an iteration on a throttled attempt: re-run this step.\n iteration -= 1;\n last = undefined;\n continue;\n }\n parent.emit({\n kind: 'limit:pause',\n ts: ts(),\n path,\n code: last.error.code,\n reason: action.reason,\n resumeCommand: ctx.resumeCommand,\n });\n return finish(\n {\n status: 'paused',\n summary: action.reason,\n error: last.error,\n data: last.data,\n },\n iteration,\n );\n }\n\n // A *returned* fail outcome carrying an unrecoverable error (e.g. an\n // engine auth/config failure) must not loop to `exhausted`. Thrown\n // errors are excluded — the retry policy above owns those.\n if (\n !bodyThrew &&\n last.status === 'fail' &&\n last.error &&\n !last.error.retryable\n ) {\n return finish(\n { status: 'fail', summary: last.summary, error: last.error },\n iteration,\n );\n }\n\n if (config.onIteration) {\n try {\n await config.onIteration(last, ctx);\n } catch (e) {\n throw LoopError.from(e, {\n code: 'VALIDATION',\n phase: 'body',\n path,\n iteration,\n });\n }\n }\n\n // hard early-exit\n if (stopOn) {\n const r = await gate(stopOn, 'stopOn', ctx, last);\n parent.emit({\n kind: 'loop:condition',\n ts: ts(),\n path,\n which: 'stopOn',\n result: r,\n });\n if (r.met)\n return finish(\n {\n status: 'aborted',\n summary: `stopOn met: ${r.reason}`,\n data: last.data,\n },\n iteration,\n );\n }\n\n // convergence check: explicit `until`, else \"did the body pass?\"\n const conv = until\n ? await gate(until, 'until', ctx, last)\n : {\n met: last.status === 'pass',\n confidence: last.confidence,\n reason: `body status = ${last.status}`,\n };\n if (until)\n parent.emit({\n kind: 'loop:condition',\n ts: ts(),\n path,\n which: 'until',\n result: conv,\n });\n\n if (conv.met) {\n if (!config.review) {\n await recordMilestone(ctxAt(iteration, last));\n return finish(\n {\n status: 'pass',\n confidence: conv.confidence ?? last.confidence,\n summary: last.summary,\n data: last.data,\n },\n iteration,\n );\n }\n let reviewOutcome: Outcome;\n try {\n reviewOutcome = await config.review(ctxAt(iteration, last));\n } catch (e) {\n throw LoopError.from(e, {\n code: 'VALIDATION',\n phase: 'review',\n path,\n iteration,\n });\n }\n // Decide whether this failing review will actually re-enter the loop\n // before emitting, so the event carries an honest accept/reject bit\n // (a downstream records consumer must not read a dropped review as\n // acted-on). Re-entry is blocked by the restart bound or by having no\n // iteration left; `consecutiveReviewFails` is still pre-increment here.\n const reviewPassed = reviewOutcome.status === 'pass';\n const restartsExhausted =\n config.maxReviewRestarts != null &&\n consecutiveReviewFails + 1 >= config.maxReviewRestarts;\n const iterationsRemain =\n config.max == null || iteration < config.max;\n const willReenter =\n !reviewPassed && !restartsExhausted && iterationsRemain;\n parent.emit({\n kind: 'loop:review',\n ts: ts(),\n path,\n outcome: reviewOutcome,\n accepted: willReenter,\n });\n if (reviewPassed) {\n await recordMilestone(ctxAt(iteration, last));\n return finish(\n {\n status: 'pass',\n confidence: reviewOutcome.confidence ?? conv.confidence,\n summary: reviewOutcome.summary ?? last.summary,\n data: last.data,\n },\n iteration,\n );\n }\n // review rejected — thread the verdict to the next iteration (context-scoped,\n // not run-global, so concurrent sibling loops don't cross-contaminate) and\n // bound the restart cycle.\n consecutiveReviewFails += 1;\n lastReview = reviewOutcome;\n parent.log(\n `review did not pass (${reviewOutcome.summary ?? reviewOutcome.status}); re-entering ${config.name}`,\n 'warn',\n );\n if (restartsExhausted) {\n return finish(\n {\n status: 'exhausted',\n summary: `review rejected ${consecutiveReviewFails}× (maxReviewRestarts)`,\n data: last.data,\n },\n iteration,\n );\n }\n }\n\n if (config.delayMs) await delay(config.delayMs, parent.signal);\n }\n } catch (e) {\n const error = LoopError.from(e, { code: 'UNKNOWN', path, iteration });\n parent.emit({\n kind: 'error',\n ts: ts(),\n path,\n message: error.message,\n code: error.code,\n });\n return finish(\n { status: 'fail', summary: error.message, error },\n iteration,\n );\n }\n };\n\n return setMeta(job, {\n kind: 'loop',\n name: config.name,\n max: config.max,\n start: describeConditions(config.start),\n gate: describeConditions(config.until),\n stopOn: describeConditions(config.stopOn),\n review: !!config.review,\n commit: !!config.commit,\n body: jobMeta(config.body),\n });\n}\n\n/** Sleep that resolves early (does not reject) when the signal aborts. */\nfunction delay(ms: number, signal: AbortSignal): Promise<void> {\n if (signal.aborted) return Promise.resolve();\n return new Promise((resolve) => {\n const t = setTimeout(done, ms);\n const onAbort = () => done();\n function done() {\n clearTimeout(t);\n signal.removeEventListener('abort', onAbort);\n resolve();\n }\n signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n","/**\n * The engine registry — the drop-in mechanism. Built-ins are registered by\n * name; anyone can `register(name, factory)` their own, or pass a ready-made\n * `Engine` instance anywhere an `EngineRef` is accepted. Factories run lazily\n * (on first `create`), so the Anthropic API engine never needs a key unless you\n * actually select it.\n */\n\nimport type { Engine, EngineName, EngineOptions, EngineRef } from './engine.ts';\nimport { isEngine } from './engine.ts';\nimport { LoopError } from '../core/errors.ts';\n\nexport type EngineFactory = (opts: EngineOptions) => Engine;\n\nexport class EngineRegistry {\n private readonly factories = new Map<string, EngineFactory>();\n private readonly cache = new Map<string, Engine>();\n\n constructor(private readonly opts: EngineOptions = {}) {\n this.registerBuiltins();\n }\n\n /** Add or override an engine. The key is what you pass as an `EngineRef`. */\n register(name: string, factory: EngineFactory): this {\n this.factories.set(name, factory);\n this.cache.delete(name);\n return this;\n }\n\n has(name: string): boolean {\n return this.factories.has(name);\n }\n\n names(): string[] {\n return [...this.factories.keys()];\n }\n\n /** Resolve a ref to an `Engine`: instance → as-is; name → built/cached. */\n create(ref: EngineRef | undefined, fallback: EngineName): Engine {\n if (isEngine(ref)) return ref;\n const name = (ref as string | undefined) ?? fallback;\n const cached = this.cache.get(name);\n if (cached) return cached;\n const factory = this.factories.get(name);\n if (!factory) {\n throw new LoopError({\n code: 'CONFIG',\n message: `unknown engine \"${name}\" (have: ${this.names().join(', ')})`,\n });\n }\n const engine = factory(this.opts);\n this.cache.set(name, engine);\n return engine;\n }\n\n private registerBuiltins(): void {\n // Adapter modules are imported lazily inside the factory so that selecting,\n // say, claude-cli never loads the Anthropic API SDK and vice versa.\n this.register('agent-sdk', (o) =>\n lazy(\n () => import('./agent-sdk.ts').then((m) => new m.AgentSdkEngine(o)),\n 'agent-sdk',\n ),\n );\n this.register('claude-cli', (o) =>\n lazy(\n () => import('./claude-cli.ts').then((m) => new m.ClaudeCliEngine(o)),\n 'claude-cli',\n ),\n );\n this.register('anthropic-api', (o) =>\n lazy(\n () =>\n import('./anthropic-api.ts').then((m) => new m.AnthropicApiEngine(o)),\n 'anthropic-api',\n ),\n );\n // A different CLI-backed model for second-model reviewers. The adapter stays\n // read-only unless `bypassPermissions` is explicitly selected.\n this.register('codex', (o) =>\n lazy(() => import('./codex.ts').then((m) => new m.CodexEngine(o)), 'codex'),\n );\n }\n}\n\n/**\n * Wrap a dynamically-imported engine so the heavy module only loads on the\n * first `run`. Presents the synchronous `Engine` interface the registry expects.\n */\nfunction lazy(load: () => Promise<Engine>, name: EngineName): Engine {\n let inner: Promise<Engine> | undefined;\n return {\n name,\n run(req, onEvent, signal) {\n inner ??= load();\n return inner.then((engine) => engine.run(req, onEvent, signal));\n },\n };\n}\n","/**\n * Stats collector. Subscribes to the event stream and accumulates everything\n * the TUI footer and the exit summary need: per-loop iteration counts, review\n * pass/fail tallies, token usage by model, errors, and wall-clock timing.\n */\n\nimport type { LoopEvent, Outcome } from './types.ts';\n\nexport interface LoopStat {\n path: string;\n iterations: number;\n reviewsPassed: number;\n reviewsFailed: number;\n lastStatus?: Outcome['status'];\n}\n\nexport interface ModelUsage {\n model: string;\n calls: number;\n inputTokens: number;\n outputTokens: number;\n}\n\nexport interface ErrorEntry {\n path: string;\n code: string;\n message: string;\n ts: number;\n}\n\nexport interface StatsSnapshot {\n startedAt: number;\n elapsedMs: number;\n loops: LoopStat[];\n models: ModelUsage[];\n totalInputTokens: number;\n totalOutputTokens: number;\n agentCalls: number;\n errors: ErrorEntry[];\n}\n\nexport class Stats {\n private readonly startedAt = Date.now();\n private readonly loops = new Map<string, LoopStat>();\n private readonly models = new Map<string, ModelUsage>();\n private readonly errors: ErrorEntry[] = [];\n\n record(event: LoopEvent): void {\n const key = event.path.join(' / ') || '(root)';\n switch (event.kind) {\n case 'loop:start':\n this.loopFor(key);\n break;\n case 'loop:iteration':\n this.loopFor(key).iterations = event.iteration;\n break;\n case 'loop:review': {\n const s = this.loopFor(key);\n if (event.outcome.status === 'pass') s.reviewsPassed += 1;\n else s.reviewsFailed += 1;\n break;\n }\n case 'loop:end':\n this.loopFor(key).lastStatus = event.outcome.status;\n break;\n case 'engine:usage': {\n const m = this.modelFor(event.model);\n m.calls += 1;\n m.inputTokens += event.usage.inputTokens;\n m.outputTokens += event.usage.outputTokens;\n break;\n }\n case 'error':\n this.errors.push({\n path: key,\n code: event.code,\n message: event.message,\n ts: event.ts,\n });\n break;\n }\n }\n\n snapshot(): StatsSnapshot {\n const models = [...this.models.values()];\n return {\n startedAt: this.startedAt,\n elapsedMs: Date.now() - this.startedAt,\n loops: [...this.loops.values()],\n models,\n totalInputTokens: models.reduce((a, m) => a + m.inputTokens, 0),\n totalOutputTokens: models.reduce((a, m) => a + m.outputTokens, 0),\n agentCalls: models.reduce((a, m) => a + m.calls, 0),\n errors: this.errors,\n };\n }\n\n private loopFor(path: string): LoopStat {\n let s = this.loops.get(path);\n if (!s) {\n s = { path, iterations: 0, reviewsPassed: 0, reviewsFailed: 0 };\n this.loops.set(path, s);\n }\n return s;\n }\n\n private modelFor(model: string): ModelUsage {\n let m = this.models.get(model);\n if (!m) {\n m = { model, calls: 0, inputTokens: 0, outputTokens: 0 };\n this.models.set(model, m);\n }\n return m;\n }\n}\n","import {\n appendFileSync,\n mkdirSync,\n writeFileSync,\n} from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport {\n normalizeFeedbackSeverity,\n revisionFromOutcome,\n} from '../core/feedback.ts';\nimport type {\n FeedbackActionSeverity,\n FeedbackDecision,\n FeedbackFinding,\n LoopEvent,\n Outcome,\n RevisionRequest,\n} from '../core/types.ts';\n\nexport type SemanticDecision = FeedbackDecision;\n\nexport type SemanticRunRecord =\n | {\n kind: 'dispatch';\n ts: number;\n path: string[];\n unit: 'job' | 'dag-node';\n label?: string;\n node?: string;\n /** Present for a dag-node: which run this is (1-based; +1 per kickback re-run). */\n attempt?: number;\n }\n | {\n kind: 'completion';\n ts: number;\n path: string[];\n unit: 'job' | 'loop' | 'dag' | 'dag-node';\n label?: string;\n outcome: SemanticOutcome;\n iterations?: number;\n /** Present for a dag-node: which run this completion is for. */\n attempt?: number;\n }\n | {\n kind: 'surfacing';\n ts: number;\n path: string[];\n source: 'loop-review' | 'dag-kickback';\n decision: SemanticDecision;\n severity?: FeedbackActionSeverity;\n from?: string;\n to?: string;\n reason: string;\n note?: string;\n }\n | {\n kind: 'revision-emitted';\n ts: number;\n path: string[];\n sourceEvent: 'job:end';\n revision: RevisionRequest;\n }\n | {\n kind: 'revision-routed';\n ts: number;\n path: string[];\n sourceEvent: 'loop:review' | 'dag:kickback';\n decision: SemanticDecision;\n revision: RevisionRequest;\n };\n\nexport interface SemanticOutcome {\n status: Outcome['status'];\n summary?: string;\n confidence?: number;\n}\n\nfunction ensureDir(path: string): void {\n const dir = dirname(path);\n if (dir && dir !== '.') mkdirSync(dir, { recursive: true });\n}\n\nfunction outcomeSummary(outcome: Outcome): SemanticOutcome {\n return {\n status: outcome.status,\n summary: outcome.summary,\n confidence: outcome.confidence,\n };\n}\n\nfunction strongestFinding(\n findings: FeedbackFinding[] | undefined,\n): FeedbackActionSeverity | undefined {\n if (!findings?.length) return undefined;\n const severities = findings.map((f) => normalizeFeedbackSeverity(f.severity));\n if (severities.includes('block')) return 'block';\n if (severities.includes('should-fix')) return 'should-fix';\n if (severities.includes('nice-to-have')) return 'nice-to-have';\n if (severities.includes('approve')) return 'approve';\n return undefined;\n}\n\nfunction emittedRevisionRecord(\n event: LoopEvent,\n outcome: Outcome,\n): SemanticRunRecord[] {\n const revision = revisionFromOutcome(outcome);\n return revision\n ? [\n {\n kind: 'revision-emitted',\n ts: event.ts,\n path: event.path,\n sourceEvent: 'job:end',\n revision,\n },\n ]\n : [];\n}\n\nexport function semanticRecordsFromEvent(event: LoopEvent): SemanticRunRecord[] {\n switch (event.kind) {\n case 'job:start':\n return [\n {\n kind: 'dispatch',\n ts: event.ts,\n path: event.path,\n unit: 'job',\n label: event.label,\n },\n ];\n case 'dag:node':\n if (event.phase === 'start')\n return [\n {\n kind: 'dispatch',\n ts: event.ts,\n path: [...event.path, event.node],\n unit: 'dag-node',\n node: event.node,\n attempt: event.attempt,\n },\n ];\n // 'done' or 'skip': the node-boundary completion. This is the ONLY\n // completion for a bare-function node or a skipped node (neither emits its\n // own job:end). A job/loop node also emits its own unit-'job'/'loop'\n // completion; the `unit` field tells the two apart, so filtering on\n // unit:'dag-node' gives one clean lifecycle per node of every type.\n return event.outcome\n ? [\n {\n kind: 'completion',\n ts: event.ts,\n path: [...event.path, event.node],\n unit: 'dag-node',\n label: event.node,\n outcome: outcomeSummary(event.outcome),\n attempt: event.attempt,\n },\n ]\n : [];\n case 'job:end':\n return [\n {\n kind: 'completion',\n ts: event.ts,\n path: event.path,\n unit: 'job',\n label: event.label,\n outcome: outcomeSummary(event.outcome),\n },\n ...emittedRevisionRecord(event, event.outcome),\n ];\n case 'loop:review': {\n if (event.outcome.status === 'pass') return [];\n const revision = revisionFromOutcome(event.outcome);\n // The loop stamps `accepted` = it will re-enter to act on this review; a\n // review that exhausted its iterations / maxReviewRestarts is `rejected`\n // (the findings were dropped, not applied). An omitted bit is treated as\n // accepted so a synthetic event without it degrades to the old behaviour.\n const decision: SemanticDecision =\n event.accepted === false ? 'rejected' : 'accepted';\n const records: SemanticRunRecord[] = [\n {\n kind: 'surfacing',\n ts: event.ts,\n path: event.path,\n source: 'loop-review',\n decision,\n severity: strongestFinding(revision?.findings),\n reason:\n revision?.reason ?? event.outcome.summary ?? event.outcome.status,\n },\n ];\n if (revision) {\n records.push({\n kind: 'revision-routed',\n ts: event.ts,\n path: event.path,\n sourceEvent: 'loop:review',\n decision,\n revision,\n });\n }\n return records;\n }\n case 'loop:end':\n return [\n {\n kind: 'completion',\n ts: event.ts,\n path: event.path,\n unit: 'loop',\n outcome: outcomeSummary(event.outcome),\n iterations: event.iterations,\n },\n ];\n case 'dag:kickback': {\n // Stamp the routing records at the target node's path (not the dag's), so a\n // node-scoped `--path <node>` filter returns the routed half of a revision\n // alongside the `revision-emitted` half (which rides the emitting node's\n // job:end at its own path). Otherwise the two halves live under different\n // prefixes and a per-node query silently drops the routed one.\n const at = [...event.path, event.to];\n const decision: SemanticDecision = event.accepted ? 'accepted' : 'rejected';\n return [\n {\n kind: 'surfacing',\n ts: event.ts,\n path: at,\n source: 'dag-kickback',\n decision,\n severity: 'block',\n from: event.from,\n to: event.to,\n reason: event.reason,\n note: event.note,\n },\n {\n kind: 'revision-routed',\n ts: event.ts,\n path: at,\n sourceEvent: 'dag:kickback',\n decision,\n revision: {\n target: event.to,\n reason: event.reason,\n source: event.from,\n rerun: event.accepted ? 'target-and-dependents' : undefined,\n },\n },\n ];\n }\n case 'dag:end':\n return [\n {\n kind: 'completion',\n ts: event.ts,\n path: event.path,\n unit: 'dag',\n outcome: outcomeSummary(event.outcome),\n },\n ];\n default:\n return [];\n }\n}\n\n/** Append-only semantic JSONL sink. Truncates any existing file at the start. */\nexport function makeSemanticRecorder(path: string): (event: LoopEvent) => void {\n try {\n ensureDir(path);\n writeFileSync(path, '');\n } catch {\n return () => {};\n }\n return (event) => {\n const records = semanticRecordsFromEvent(event);\n if (!records.length) return;\n try {\n for (const record of records) {\n appendFileSync(path, `${JSON.stringify(record)}\\n`);\n }\n } catch {\n /* best-effort: semantic records must never break the run */\n }\n };\n}\n","/**\n * Out-of-process supervision. A supervised run registers itself under a global\n * registry (`~/.loops/runs/<runId>/`) and writes its live state there as it goes:\n *\n * - `status.json`: a snapshot rewritten at each boundary: the run's shape (the\n * static `JobMeta`) plus where it is right now (path, iteration, last gate\n * verdict and confidence, last outcome, token usage, terminal status at end).\n * - `events.jsonl`: the event stream appended live (the same record `recordTo`\n * writes, here automatically and in the registry).\n *\n * A separate process (a human `loops list/status/tail`, or an agent over MCP)\n * reads those files. No daemon, no socket: the filesystem is the channel, which\n * is the same \"the workspace is the state\" bet the rest of the library makes.\n * Liveness is a pid check, so a crashed run is distinguishable from a live one.\n */\n\nimport {\n appendFileSync,\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n writeFileSync,\n} from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { randomBytes } from 'node:crypto';\n\nimport type { JobMeta, LoopEvent, Outcome } from '../core/types.ts';\nimport { makeSemanticRecorder } from './semantic.ts';\n\n/** High-frequency transcript deltas: kept out of the record, as in `recordTo`. */\nconst NOISE: ReadonlySet<LoopEvent['kind']> = new Set([\n 'engine:text',\n 'engine:thinking',\n]);\n\n/** The registry root. `LOOPS_HOME` overrides `~/.loops` (used to isolate tests). */\nexport function runsHome(): string {\n const base = process.env.LOOPS_HOME ?? join(homedir(), '.loops');\n return join(base, 'runs');\n}\n\nfunction slug(s: string): string {\n return (\n s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 32) || 'run'\n );\n}\n\n/** A readable, unique run id: a slug of the loop's name plus a short random tail. */\nexport function newRunId(title: string): string {\n return `${slug(title)}-${randomBytes(3).toString('hex')}`;\n}\n\nexport interface RunLive {\n path: string[];\n iteration: number;\n lastGate?: {\n which: string;\n met: boolean;\n confidence?: number;\n reason: string;\n };\n lastOutcome?: { status: string; summary?: string };\n usage: { inputTokens: number; outputTokens: number; calls: number };\n}\n\nexport interface RunStatus {\n runId: string;\n pid: number;\n cwd: string;\n title: string;\n startedAt: number;\n updatedAt: number;\n endedAt?: number;\n /** Stored disposition: `running` until the run ends, then the terminal status. */\n status: 'running' | Outcome['status'];\n /** Whether the owning process is still alive: computed on read, not stored. */\n alive?: boolean;\n shape?: JobMeta;\n live: RunLive;\n}\n\nexport interface Supervisor {\n runId: string;\n dir: string;\n /** Wire into the run's event sinks. */\n sink: (event: LoopEvent) => void;\n /** Record the terminal outcome. */\n finish: (outcome: Outcome) => void;\n}\n\n/** Begin supervising a run: create its registry dir and seed `status.json`. */\nexport function startSupervisor(input: {\n runId: string;\n cwd: string;\n title: string;\n shape?: JobMeta;\n}): Supervisor {\n const dir = join(runsHome(), input.runId);\n mkdirSync(dir, { recursive: true });\n const eventsPath = join(dir, 'events.jsonl');\n const semanticPath = join(dir, 'semantic.jsonl');\n const statusPath = join(dir, 'status.json');\n try {\n writeFileSync(eventsPath, '');\n } catch {\n /* best-effort */\n }\n const semanticSink = makeSemanticRecorder(semanticPath);\n\n const status: RunStatus = {\n runId: input.runId,\n pid: process.pid,\n cwd: input.cwd,\n title: input.title,\n startedAt: Date.now(),\n updatedAt: Date.now(),\n status: 'running',\n shape: input.shape,\n live: {\n path: [],\n iteration: 0,\n usage: { inputTokens: 0, outputTokens: 0, calls: 0 },\n },\n };\n\n const writeStatus = () => {\n status.updatedAt = Date.now();\n try {\n writeFileSync(statusPath, JSON.stringify(status, null, 2));\n } catch {\n /* best-effort: a status write must never break the run */\n }\n };\n writeStatus();\n\n const sink = (event: LoopEvent) => {\n if (!NOISE.has(event.kind)) {\n try {\n appendFileSync(eventsPath, `${JSON.stringify(event)}\\n`);\n } catch {\n /* best-effort */\n }\n semanticSink(event);\n }\n switch (event.kind) {\n case 'loop:iteration':\n status.live.path = event.path;\n status.live.iteration = event.iteration;\n break;\n case 'loop:condition':\n status.live.lastGate = {\n which: event.which,\n met: event.result.met,\n confidence: event.result.confidence,\n reason: event.result.reason,\n };\n break;\n case 'dag:node':\n status.live.path = [...event.path, event.node];\n break;\n case 'loop:end':\n case 'dag:end':\n case 'job:end':\n status.live.lastOutcome = {\n status: event.outcome.status,\n summary: event.outcome.summary,\n };\n status.live.path = event.path;\n break;\n case 'engine:usage':\n status.live.usage.inputTokens += event.usage.inputTokens;\n status.live.usage.outputTokens += event.usage.outputTokens;\n status.live.usage.calls += 1;\n break;\n }\n if (!NOISE.has(event.kind)) writeStatus();\n };\n\n const finish = (outcome: Outcome) => {\n status.status = outcome.status;\n status.endedAt = Date.now();\n status.live.lastOutcome = {\n status: outcome.status,\n summary: outcome.summary,\n };\n writeStatus();\n };\n\n return { runId: input.runId, dir, sink, finish };\n}\n\n// ── Reading side ────────────────────────────────────────────────────────────\n\n/** Whether a pid is a live process (signal 0 probes without delivering). */\nexport function isAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (e) {\n // EPERM means the process exists but is owned by another user.\n return (e as NodeJS.ErrnoException).code === 'EPERM';\n }\n}\n\n/** Read one run's status, with `alive` computed from its pid. */\nexport function readRunStatus(runId: string): RunStatus | undefined {\n try {\n const raw = readFileSync(join(runsHome(), runId, 'status.json'), 'utf8');\n const s = JSON.parse(raw) as RunStatus;\n s.alive = s.status === 'running' ? isAlive(s.pid) : false;\n return s;\n } catch {\n return undefined;\n }\n}\n\n/** All known runs, newest first. */\nexport function listRuns(): RunStatus[] {\n const base = runsHome();\n if (!existsSync(base)) return [];\n const out: RunStatus[] = [];\n for (const id of readdirSync(base)) {\n const s = readRunStatus(id);\n if (s) out.push(s);\n }\n return out.sort((a, b) => b.startedAt - a.startedAt);\n}\n\n/** Path to a run's appended event stream (for tailing). */\nexport function runEventsPath(runId: string): string {\n return join(runsHome(), runId, 'events.jsonl');\n}\n\n/** Path to a run's semantic record stream. */\nexport function runSemanticRecordsPath(runId: string): string {\n return join(runsHome(), runId, 'semantic.jsonl');\n}\n\n/** A compact one-line rendering of an event, for `loops tail`. */\nexport function formatEvent(event: LoopEvent): string {\n const at = event.path.length ? `${event.path.join(' › ')} ` : '';\n switch (event.kind) {\n case 'loop:start':\n return `${at}▸ loop${event.max ? ` (max ${event.max})` : ''}`;\n case 'dag:start':\n return `${at}▸ dag (${event.nodes.length} nodes)`;\n case 'loop:iteration':\n return `${at}· iteration ${event.iteration}`;\n case 'loop:condition':\n return `${at}· ${event.which} ${event.result.met ? 'met' : 'not met'}: ${event.result.reason}`;\n case 'loop:review':\n return `${at}· review: ${event.outcome.status}`;\n case 'loop:end':\n return `${at}◂ ${event.outcome.status} (${event.iterations} iter)`;\n case 'dag:node':\n return `${at}· node ${event.node}: ${event.phase}${event.outcome ? ` (${event.outcome.status})` : ''}`;\n case 'dag:kickback':\n return `${at}↩ kickback ${event.accepted ? 'accepted' : 'rejected'} ${event.from} -> ${event.to}: ${event.reason}${event.note ? ` (${event.note})` : ''}`;\n case 'dag:end':\n return `${at}◂ dag ${event.outcome.status}`;\n case 'job:start':\n return `${at}• ${event.label}`;\n case 'job:end':\n return `${at}• ${event.label}: ${event.outcome.status}`;\n case 'engine:tool':\n return `${at} tool ${event.name} ${event.phase}`;\n case 'engine:usage':\n return `${at} ${event.model}: ${event.usage.inputTokens}/${event.usage.outputTokens} tok`;\n case 'limit:wait':\n return `${at}⏸ limit ${event.code}: waiting ${Math.round(event.waitMs / 1000)}s`;\n case 'limit:pause':\n return `${at}⏸ paused (${event.code}): ${event.reason}`;\n case 'log':\n return `${at}${event.message}`;\n case 'error':\n return `${at}✗ ${event.code}: ${event.message}`;\n default:\n return `${at}${event.kind}`;\n }\n}\n","/**\n * Optional, deliberately-thin durability for a run. This is NOT a durable\n * execution engine (mid-graph replay is an orchestration concern — reach for\n * Temporal/Mastra if you need it). It does two small things:\n *\n * - `makeRecorder(path)` — append every structured event as one JSON line: a\n * readable run record. Token-delta noise is excluded so the record stays\n * useful. This is the observability sink.\n * - `makeCheckpointer(path, state)` — snapshot the shared run `state` at each\n * loop/dag/job boundary. `loadCheckpoint(path)` restores it on the next run.\n *\n * The contract is \"the workspace is the state\": real progress lives on disk\n * (files, git), and the checkpoint restores the loop's shared scratchpad so a\n * re-run continues rather than starting cold. The body decides what to record in\n * `ctx.state` and how to act on it when resumed.\n */\n\nimport {\n appendFileSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n} from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport type { LoopEvent } from '../core/types.ts';\n\n/** High-frequency transcript deltas — excluded so the record stays useful. */\nconst NOISE: ReadonlySet<LoopEvent['kind']> = new Set([\n 'engine:text',\n 'engine:thinking',\n]);\n\n/** Event kinds that mark a boundary worth snapshotting state at. */\nconst CHECKPOINT_AT: ReadonlySet<LoopEvent['kind']> = new Set([\n 'loop:iteration',\n 'loop:end',\n 'dag:end',\n 'job:end',\n]);\n\nfunction ensureDir(path: string): void {\n const dir = dirname(path);\n if (dir && dir !== '.') mkdirSync(dir, { recursive: true });\n}\n\n/** Append-only JSONL event sink. Truncates any existing file at the start. */\nexport function makeRecorder(path: string): (event: LoopEvent) => void {\n ensureDir(path);\n writeFileSync(path, '');\n return (event) => {\n if (NOISE.has(event.kind)) return;\n try {\n appendFileSync(path, `${JSON.stringify(event)}\\n`);\n } catch {\n /* best-effort: a record write must never break the run */\n }\n };\n}\n\n/** Snapshot the shared run state at each boundary (latest-wins, overwritten). */\nexport function makeCheckpointer(\n path: string,\n state: Record<string, unknown>,\n): (event: LoopEvent) => void {\n ensureDir(path);\n return (event) => {\n if (!CHECKPOINT_AT.has(event.kind)) return;\n flushCheckpoint(path, state);\n };\n}\n\n/**\n * Write the shared run state to a checkpoint file immediately, outside the event\n * stream. Used to guarantee a paused run's state is durable before exit, even if\n * no boundary event flushed it. Best-effort — never throws.\n */\nexport function flushCheckpoint(\n path: string,\n state: Record<string, unknown>,\n): void {\n ensureDir(path);\n try {\n writeFileSync(path, JSON.stringify({ ts: Date.now(), state }, null, 2));\n } catch {\n /* best-effort */\n }\n}\n\n/** Restore the shared run state written by a prior `makeCheckpointer`. */\nexport function loadCheckpoint(path: string): Record<string, unknown> {\n const parsed: unknown = JSON.parse(readFileSync(path, 'utf8'));\n if (\n parsed &&\n typeof parsed === 'object' &&\n 'state' in parsed &&\n (parsed as { state: unknown }).state &&\n typeof (parsed as { state: unknown }).state === 'object'\n ) {\n return (parsed as { state: Record<string, unknown> }).state;\n }\n return {};\n}\n","/**\n * The runner assembles a `JobContext` and executes a root `Job` (a loop, a dag,\n * or any job). It owns the engine registry, the abort controller, the shared\n * state, and the stats collector. Reporters/TUI observe via `onEvent`.\n */\n\nimport type {\n Engine,\n EngineName,\n EngineOptions,\n EngineRef,\n} from '../engines/engine.ts';\nimport { EngineRegistry, type EngineFactory } from '../engines/registry.ts';\nimport { Stats, type StatsSnapshot } from '../core/stats.ts';\nimport { LoopError } from '../core/errors.ts';\nimport { Budget, type BudgetConfig } from '../core/budget.ts';\nimport {\n makeRecorder,\n makeCheckpointer,\n loadCheckpoint,\n flushCheckpoint,\n} from './persist.ts';\nimport { startSupervisor, newRunId, type Supervisor } from './supervisor.ts';\nimport { jobMeta } from '../core/describe.ts';\nimport { currentBranch } from '../core/git.ts';\nimport type { Environment, EnvHandle } from '../env/environment.ts';\nimport type { Forge } from '../core/forge.ts';\nimport type {\n Job,\n JobContext,\n LimitPolicy,\n LoopEvent,\n Outcome,\n Workspace,\n} from '../core/types.ts';\n\n/** Default ceiling on an interruptible limit-wait: 5 minutes. */\nconst DEFAULT_MAX_WAIT_MS = 300_000;\n\n/**\n * Exit code for a `paused` run: EX_TEMPFAIL (sysexits.h). Distinct from `fail`\n * (1) so a wrapper/cron can tell \"paused, resumable\" from \"failed\".\n */\nexport const EXIT_PAUSED = 75;\n\nexport interface RunOptions {\n /** Default engine selected when a job/condition names none. Default agent-sdk. */\n engine?: EngineName;\n engineOptions?: EngineOptions;\n /** Register custom engines (drop-in): name → factory or ready-made instance. */\n engines?: Record<string, EngineFactory | Engine>;\n /** External abort signal (the CLI wires SIGINT + keypress here). */\n signal?: AbortSignal;\n /** Root working directory the run operates in. Default: process.cwd(). */\n cwd?: string;\n /**\n * Bring an environment up for the run (the root workspace) before the job, and\n * tear it down after — so the gate can test the running thing. The adapter\n * (sst, Vercel, …) is yours; loops owns only the seam. Per-team environments\n * at the worktree boundary are a separate, later binding.\n */\n environment?: Environment;\n /**\n * The PR host for `pushJob`/`pullRequestJob`/`mergeJob`. Default: `GhForge`\n * (the `gh` CLI) when a job needs one. Pass a `MockForge` to run offline.\n */\n forge?: Forge;\n onEvent?: (event: LoopEvent) => void;\n /** Seed the shared, mutable run state. */\n state?: Record<string, unknown>;\n /**\n * Cap total tokens (input + output) for the run. A bare number is the limit;\n * pass `{ limit, headroom?, soft? }` for headroom or warn-don't-refuse mode.\n * Engine call sites refuse to spend past it (see `Budget`).\n */\n budget?: number | BudgetConfig;\n /** Append every structured event as JSONL here — a readable run record. */\n recordTo?: string;\n /** Snapshot the shared run state here at each loop/dag/job boundary. */\n checkpoint?: string;\n /**\n * Register this run in the global registry (`~/.loops/runs/<runId>`) and write\n * its live state there, so another process can `loops list` / `status` / `tail`\n * it. Off by default — opt in to make a run observable from outside.\n */\n supervise?: boolean;\n /** Restore shared run state written by a prior `checkpoint` before starting. */\n resumeFrom?: string;\n /**\n * How a loop reacts to a rate limit / quota / token budget. Default `auto`:\n * wait out a known reset within `maxWaitMs`, else checkpoint and exit with a\n * resume command (the `paused` status, exit code 75). `wait` waits any known\n * reset with no ceiling; `exit-resume` never waits; `fail` is the old fatal\n * behaviour.\n */\n onLimit?: LimitPolicy;\n /** Ceiling on a single interruptible limit-wait, in ms. Default 300000. */\n maxWaitMs?: number;\n /**\n * Ready-to-paste command to resume a paused run, surfaced to reporters and the\n * `limit:pause` event. The CLI reconstructs this from the invocation.\n */\n resumeCommand?: string;\n}\n\nexport interface RunResult {\n outcome: Outcome;\n stats: StatsSnapshot;\n /** Final token accounting, when a budget was set. */\n budget?: { limit: number; spent: number; remaining: number };\n /** The registry id, when the run was supervised. */\n runId?: string;\n}\n\nexport async function run(\n job: Job,\n options: RunOptions = {},\n): Promise<RunResult> {\n const registry = new EngineRegistry(options.engineOptions ?? {});\n for (const [name, value] of Object.entries(options.engines ?? {})) {\n registry.register(name, typeof value === 'function' ? value : () => value);\n }\n const defaultEngine = options.engine ?? 'agent-sdk';\n\n const stats = new Stats();\n const controller = new AbortController();\n if (options.signal) {\n if (options.signal.aborted) controller.abort();\n else\n options.signal.addEventListener('abort', () => controller.abort(), {\n once: true,\n });\n }\n\n const budget =\n options.budget != null\n ? new Budget(\n typeof options.budget === 'number'\n ? { limit: options.budget }\n : options.budget,\n )\n : undefined;\n\n // Resume restores the shared scratchpad a prior checkpoint wrote; an explicit\n // `state` seed wins over the restored values.\n let initialState: Record<string, unknown> = options.state ?? {};\n if (options.resumeFrom) {\n try {\n initialState = { ...loadCheckpoint(options.resumeFrom), ...initialState };\n } catch (e) {\n throw new LoopError({\n code: 'CONFIG',\n message: `cannot resume from \"${options.resumeFrom}\": ${e instanceof Error ? e.message : String(e)}`,\n });\n }\n }\n\n // Persistence sinks observe the same event stream as reporters. The\n // checkpointer closes over `initialState`, which is `rootCtx.state` — so it\n // always snapshots the live, mutated scratchpad.\n const dir = options.cwd ?? process.cwd();\n const sinks: Array<(event: LoopEvent) => void> = [];\n if (options.recordTo) sinks.push(makeRecorder(options.recordTo));\n if (options.checkpoint)\n sinks.push(makeCheckpointer(options.checkpoint, initialState));\n\n // A supervised run registers itself in the global registry (~/.loops/runs) and\n // writes its live state there, so another process can list/status/tail it.\n let supervisor: Supervisor | undefined;\n if (options.supervise) {\n const shape = jobMeta(job);\n const title = shape?.name ?? 'run';\n supervisor = startSupervisor({\n runId: newRunId(title),\n cwd: dir,\n title,\n shape,\n });\n sinks.push(supervisor.sink);\n }\n\n const emit = (event: LoopEvent) => {\n stats.record(event);\n if (budget && event.kind === 'engine:usage')\n budget.add(event.usage.inputTokens + event.usage.outputTokens);\n options.onEvent?.(event);\n for (const sink of sinks) sink(event);\n };\n const resolveEngine = (ref?: EngineRef): Engine =>\n registry.create(ref, defaultEngine);\n\n // The root workspace is the substrate the whole run reads and writes. Branch\n // resolution is best-effort: a non-git cwd just leaves `branch` undefined.\n const workspace: Workspace = {\n dir,\n branch: await currentBranch({ cwd: dir, signal: controller.signal }),\n };\n\n // Bring the environment up for the run before the job, so the gate can test\n // the running thing. A failed start fails the run cleanly rather than throwing.\n let environment: EnvHandle | undefined;\n if (options.environment) {\n try {\n environment = await options.environment.up(workspace, controller.signal);\n } catch (e) {\n const error = LoopError.from(e, { code: 'CONFIG' });\n emit({\n kind: 'error',\n ts: Date.now(),\n path: [],\n message: `environment \"${options.environment.name}\" failed to start: ${error.message}`,\n code: error.code,\n });\n const failOutcome: Outcome = {\n status: 'fail',\n summary: `environment failed to start: ${error.message}`,\n error,\n };\n supervisor?.finish(failOutcome);\n return {\n outcome: failOutcome,\n stats: stats.snapshot(),\n budget: budget\n ? {\n limit: budget.limit,\n spent: budget.spent(),\n remaining: budget.remaining(),\n }\n : undefined,\n runId: supervisor?.runId,\n };\n }\n }\n\n const rootCtx: JobContext = {\n engine: resolveEngine(defaultEngine),\n resolveEngine,\n signal: controller.signal,\n emit,\n state: initialState,\n workspace,\n environment,\n forge: options.forge,\n budget,\n onLimit: options.onLimit ?? 'auto',\n maxWaitMs: options.maxWaitMs ?? DEFAULT_MAX_WAIT_MS,\n resumeCommand: options.resumeCommand,\n iteration: 0,\n depth: 0,\n path: [],\n log: (message, level = 'info') =>\n emit({ kind: 'log', ts: Date.now(), path: [], level, message }),\n };\n\n let outcome: Outcome;\n try {\n outcome = await job(rootCtx);\n } catch (e) {\n const error = LoopError.from(e, { code: 'UNKNOWN' });\n emit({\n kind: 'error',\n ts: Date.now(),\n path: [],\n message: error.message,\n code: error.code,\n });\n outcome = { status: 'fail', summary: error.message, error };\n } finally {\n // Tear the environment down whatever happened (best-effort).\n if (environment) await environment.down(controller.signal).catch(() => {});\n }\n\n // A paused run is meant to be resumed; guarantee the latest shared state is on\n // disk even if no boundary event flushed it (the checkpointer is best-effort).\n if (outcome.status === 'paused' && options.checkpoint)\n flushCheckpoint(options.checkpoint, initialState);\n\n supervisor?.finish(outcome);\n\n return {\n outcome,\n stats: stats.snapshot(),\n budget: budget\n ? {\n limit: budget.limit,\n spent: budget.spent(),\n remaining: budget.remaining(),\n }\n : undefined,\n runId: supervisor?.runId,\n };\n}\n\n/** Process exit code mapped from a terminal outcome. */\nexport function exitCodeFor(outcome: Outcome): number {\n switch (outcome.status) {\n case 'pass':\n return 0;\n case 'fail':\n return 1;\n case 'exhausted':\n return 2;\n case 'aborted':\n return 130;\n case 'paused':\n return EXIT_PAUSED;\n }\n}\n"]}