@jphutchins/code-review 0.1.0-alpha.21 → 0.1.0-alpha.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +159 -122
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cost.ts","../src/patch.ts","../src/surface.ts","../src/render.ts","../src/diff.ts","../src/inline.ts","../src/util.ts","../src/transcript.ts","../src/schema.ts","../src/validate.ts","../src/stop-gate.ts","../src/budget.ts","../src/format.ts","../src/registry.ts","../src/gh.ts","../src/pr.ts","../src/post.ts","../src/gather.ts","../src/extract.ts","../src/adapt.ts","../src/settings.ts","../src/index.ts"],"names":["Eta","key","t","readFileSync","basename","resolvePath","resolve","reviewUrl","unanchoredCount","execFile","t2","writeFileSync","join","scanLine","t3"],"mappings":"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","file":"index.js","sourcesContent":["// Pure cost computation from the abstract envelope's `models` array + price map.\n// Recomputes USD because the CLI's vendor_cost_usd is vendor-priced (SPEC §6.2).\n// Pure core: side effects (unknown-model warnings) are threaded via a `warn` callback.\n\nimport type { PriceMap, ModelUsageEntry } from \"./schema.js\";\n\nexport interface CostLine {\n readonly model: string;\n readonly inputTokens: number;\n readonly outputTokens: number;\n readonly cacheReadTokens: number;\n readonly cacheWriteTokens: number;\n readonly costUSD: number;\n}\n\nexport interface CostReport {\n readonly lines: readonly CostLine[];\n readonly totalInputTokens: number;\n readonly totalOutputTokens: number;\n readonly totalCacheReadTokens: number;\n readonly totalCacheWriteTokens: number;\n readonly totalCostUSD: number;\n}\n\nexport type Warn = (message: string) => void;\n\nconst defaultWarn: Warn = (message) => {\n process.stderr.write(`${message}\\n`);\n};\n\nconst computeModelCost = (entry: ModelUsageEntry, prices: PriceMap, warn: Warn): CostLine => {\n const p = prices.models[entry.model];\n const cacheRead = entry.cache_read_tokens ?? 0;\n const cacheWrite = entry.cache_write_tokens ?? 0;\n if (!p) {\n warn(\n `code-review cost: unknown model \"${entry.model}\" — no entry in price map; cost for this model set to $0`,\n );\n return {\n model: entry.model,\n inputTokens: entry.input_tokens,\n outputTokens: entry.output_tokens,\n cacheReadTokens: cacheRead,\n cacheWriteTokens: cacheWrite,\n costUSD: 0,\n };\n }\n const costUSD =\n (entry.input_tokens * p.in +\n entry.output_tokens * p.out +\n cacheRead * p.cache_read +\n cacheWrite * p.cache_write) /\n 1_000_000;\n return {\n model: entry.model,\n inputTokens: entry.input_tokens,\n outputTokens: entry.output_tokens,\n cacheReadTokens: cacheRead,\n cacheWriteTokens: cacheWrite,\n costUSD,\n };\n};\n\n/** Recompute cost from the envelope's `models` array against a price map. Pure given a `warn` sink. */\nexport const computeCost = (\n models: readonly ModelUsageEntry[],\n prices: PriceMap,\n warn: Warn = defaultWarn,\n): CostReport => {\n const lines = models.map((entry) => computeModelCost(entry, prices, warn));\n\n return {\n lines,\n totalInputTokens: lines.reduce((s, l) => s + l.inputTokens, 0),\n totalOutputTokens: lines.reduce((s, l) => s + l.outputTokens, 0),\n totalCacheReadTokens: lines.reduce((s, l) => s + l.cacheReadTokens, 0),\n totalCacheWriteTokens: lines.reduce((s, l) => s + l.cacheWriteTokens, 0),\n totalCostUSD: lines.reduce((s, l) => s + l.costUSD, 0),\n };\n};\n","// Pure patch helpers (issue #10): a review agent's own unified-diff patch of an edit it actually\n// made is either validated against the real PR-head file (to align a finding's range and confirm it\n// still applies) or projected into a GitHub suggestion's replacement text — two concerns split into\n// two pure functions over one shared hunk parser (SSOT). Eliminates the bad-suggestion bug class\n// caused by hand-authored suggestions with wrong indentation or too-wide ranges. Assumes LF line\n// endings (the review runs on Linux); CRLF handling is out of scope.\n\n/** The outcome of validating a patch against the PR-head file: `anchored` when it applies and has a\n * removed range a suggestion can replace; `keep` when it applies but has no removed range to anchor\n * (a pure insertion) — the patch survives for the renderer's ```patch fallback; `drop` when it\n * doesn't apply or isn't a usable single-hunk change at all. */\nexport type ValidateResult =\n | { readonly kind: \"anchored\"; readonly startLine: number; readonly endLine: number }\n | { readonly kind: \"keep\"; readonly reason: string }\n | { readonly kind: \"drop\"; readonly reason: string };\n\n/** The replacement text a patch's added lines carry — a suggestion's body. */\nexport type SuggestionResult = string | { readonly kind: \"drop\"; readonly reason: string };\n\ntype BodyLine =\n | { readonly kind: \"context\"; readonly text: string }\n | { readonly kind: \"removed\"; readonly text: string }\n | { readonly kind: \"added\"; readonly text: string };\n\nconst HUNK_HEADER_RE = /^@@ -(\\d+)(?:,\\d+)? \\+\\d+(?:,\\d+)? @@/;\n\n/** The hunk's `-a` value when `line` is a hunk header, else null. */\nconst hunkOldStart = (line: string): number | null => {\n const raw = HUNK_HEADER_RE.exec(line)?.[1];\n return raw !== undefined ? Number(raw) : null;\n};\n\n/** Classify one hunk-body line by its leading marker char, stripping it; null when the line\n * carries none of the three markers (malformed). */\nconst classifyBodyLine = (line: string): BodyLine | null => {\n if (line.startsWith(\" \")) return { kind: \"context\", text: line.slice(1) };\n if (line.startsWith(\"-\")) return { kind: \"removed\", text: line.slice(1) };\n if (line.startsWith(\"+\")) return { kind: \"added\", text: line.slice(1) };\n return null;\n};\n\n/** The maximal run of non-context lines in the middle of `body`, once leading and trailing context\n * is trimmed — empty when `body` is all context (no change at all). */\nconst trimmedMiddle = (body: readonly BodyLine[]): readonly BodyLine[] => {\n const first = body.findIndex((l) => l.kind !== \"context\");\n if (first === -1) return [];\n const last = body.findLastIndex((l) => l.kind !== \"context\");\n return body.slice(first, last + 1);\n};\n\n/** True when `middle` (already trimmed of outer context) is zero-or-more removed lines followed by\n * zero-or-more added lines, with no context and no interleaving between them. */\nconst isContiguousChange = (middle: readonly BodyLine[]): boolean => {\n if (middle.some((l) => l.kind === \"context\")) return false;\n const firstAdded = middle.findIndex((l) => l.kind === \"added\");\n if (firstAdded === -1) return true;\n return (\n middle.slice(0, firstAdded).every((l) => l.kind === \"removed\") &&\n middle.slice(firstAdded).every((l) => l.kind === \"added\")\n );\n};\n\ninterface RemovedRange {\n readonly lineNumber: number;\n readonly firstRemoved: number | null;\n readonly lastRemoved: number | null;\n}\n\n/** Fold over the hunk body tracking the old-side line number (advanced by context and removed\n * lines, not by added lines), recording the first and last removed line's number. */\nconst removedRange = (body: readonly BodyLine[], oldStart: number): RemovedRange =>\n body.reduce<RemovedRange>(\n (acc, line) =>\n line.kind === \"added\"\n ? acc\n : {\n lineNumber: acc.lineNumber + 1,\n firstRemoved:\n line.kind === \"removed\" && acc.firstRemoved === null\n ? acc.lineNumber\n : acc.firstRemoved,\n lastRemoved: line.kind === \"removed\" ? acc.lineNumber : acc.lastRemoved,\n },\n { lineNumber: oldStart, firstRemoved: null, lastRemoved: null },\n );\n\nconst drop = (reason: string): { readonly kind: \"drop\"; readonly reason: string } => ({\n kind: \"drop\",\n reason,\n});\n\nconst keep = (reason: string): { readonly kind: \"keep\"; readonly reason: string } => ({\n kind: \"keep\",\n reason,\n});\n\ntype ParsedHunk =\n | { readonly kind: \"ok\"; readonly oldStart: number; readonly body: readonly BodyLine[] }\n | { readonly kind: \"drop\"; readonly reason: string };\n\n/** Parse a single-hunk unified diff into its old-side start line + classified body — the SSOT both\n * `validatePatch` and `patchToSuggestion` share. Drops on !=1 hunk or a malformed body line. */\nconst parseHunk = (patch: string): ParsedHunk => {\n const rawLines = patch.split(\"\\n\");\n // A trailing newline in the patch text splits into a trailing \"\" element — not a line of content.\n const lines =\n rawLines.length > 0 && rawLines[rawLines.length - 1] === \"\" ? rawLines.slice(0, -1) : rawLines;\n\n const headerHits = lines.reduce<readonly { readonly index: number; readonly oldStart: number }[]>(\n (acc, line, index) => {\n const oldStart = hunkOldStart(line);\n return oldStart !== null ? [...acc, { index, oldStart }] : acc;\n },\n [],\n );\n if (headerHits.length !== 1) {\n return drop(`expected exactly one hunk, got ${String(headerHits.length)}`);\n }\n const hit = headerHits[0];\n if (hit === undefined) return drop(\"malformed hunk header\");\n\n // Header-preceding lines (diff --git/index/---/+++) are never examined — the hunk body starts\n // right after the header; a trailing \"\\" marker carries no content.\n const bodyRaw = lines.slice(hit.index + 1).filter((line) => !line.startsWith(\"\\\\\"));\n const classified = bodyRaw.map(classifyBodyLine);\n if (classified.some((line) => line === null)) return drop(\"malformed hunk body line\");\n const body = classified.filter((line): line is BodyLine => line !== null);\n\n return { kind: \"ok\", oldStart: hit.oldStart, body };\n};\n\n/** The issue-#10 guard: confirm a single-hunk unified diff still applies to the PR-head file\n * (`fileLines`, 0-indexed lines WITHOUT trailing newlines) and, when it does, anchor it — returning\n * the exact `start_line..end_line` its removed lines occupy for aligning the finding's range, or\n * `keep` when it applies but is a pure insertion with no removed range to anchor. Drops on a context\n * mismatch, a non-contiguous change, or a hunk with no changes at all. Pure. */\nexport const validatePatch = (patch: string, fileLines: readonly string[]): ValidateResult => {\n const parsed = parseHunk(patch);\n if (parsed.kind === \"drop\") return parsed;\n const { oldStart, body } = parsed;\n\n const oldSideTexts = body.filter((l) => l.kind !== \"added\").map((l) => l.text);\n const expected = fileLines.slice(oldStart - 1, oldStart - 1 + oldSideTexts.length);\n const oldSideMatches =\n expected.length === oldSideTexts.length &&\n expected.every((line, i) => line === oldSideTexts[i]);\n if (!oldSideMatches) {\n return drop(\n `patch context does not match the file at lines ${String(oldStart)}..${String(oldStart + oldSideTexts.length - 1)}`,\n );\n }\n\n if (!isContiguousChange(trimmedMiddle(body))) {\n return drop(\"change is not a single contiguous block\");\n }\n\n const removedCount = body.filter((l) => l.kind === \"removed\").length;\n const addedCount = body.filter((l) => l.kind === \"added\").length;\n if (removedCount === 0 && addedCount === 0) return drop(\"hunk contains no changes\");\n if (removedCount === 0) {\n return keep(\"pure insertion applies cleanly but has no removed range to anchor a suggestion\");\n }\n\n const { firstRemoved, lastRemoved } = removedRange(body, oldStart);\n if (firstRemoved === null || lastRemoved === null) return drop(\"malformed hunk body\");\n\n return { kind: \"anchored\", startLine: firstRemoved, endLine: lastRemoved };\n};\n\n/** Project a single-hunk unified diff into a GitHub suggestion's replacement text (the added lines\n * alone) — no file needed. Drops a multi-hunk/malformed patch, a non-contiguous change, or a pure\n * insertion (nothing to replace). An all-deletion hunk yields \"\" (delete the range). Pure. */\nexport const patchToSuggestion = (patch: string): SuggestionResult => {\n const parsed = parseHunk(patch);\n if (parsed.kind === \"drop\") return parsed;\n const { body } = parsed;\n\n if (!isContiguousChange(trimmedMiddle(body))) {\n return drop(\"change is not a single contiguous block\");\n }\n\n const removedCount = body.filter((l) => l.kind === \"removed\").length;\n const addedLines = body.filter((l) => l.kind === \"added\");\n if (removedCount === 0 && addedLines.length === 0) return drop(\"hunk contains no changes\");\n if (removedCount === 0) return drop(\"pure insertion can't be expressed as a suggestion\");\n\n return addedLines.map((l) => l.text).join(\"\\n\");\n};\n","// Shared render-surface primitives — the single source of truth for the bits every render surface\n// (sticky, inline comment, review body) must agree on: the severity→emoji mapping, the\n// machine-readable findings-json pointer (issue #19), and the patch→suggestion projection. Pure.\n\nimport type { Finding, Findings } from \"./schema.js\";\nimport { patchToSuggestion } from \"./patch.js\";\n\n/** Severity → emoji, used by every render surface (sticky, inline, strays). */\nexport const severityEmoji = (s: string): string => {\n switch (s) {\n case \"critical\":\n return \"🔴\";\n case \"major\":\n return \"🟠\";\n case \"minor\":\n return \"🔵\";\n case \"nit\":\n return \"⚪\";\n default:\n return \"❓\";\n }\n};\n\n/** Base64 chars (~30KB JSON); keeps a comment well under GitHub's 65536-char comment limit. */\nconst EMBED_LIMIT = 40000;\n\n/** The directive that makes the marker below self-describing to a reviewing agent — travels with\n * the marker on every surface so a reader who only sees one comment still knows to decode it. */\nconst AGENTS_STOP_DIRECTIVE =\n \"<!-- AGENTS: STOP — do not parse the prose below; decode this findings JSON and read schema_version first. -->\";\n\n/** Shared core of the findings-json marker: base64-encodes `document` when it fits under `limit`,\n * falls back to a `jsonUrl` link marker, or omits the marker entirely when neither is available —\n * prefixed with the AGENTS_STOP directive whenever a marker is produced. */\nconst encodeMarker = (document: unknown, jsonUrl: string | undefined, limit: number): string => {\n const b64 = Buffer.from(JSON.stringify(document), \"utf-8\").toString(\"base64\");\n const marker =\n b64.length <= limit\n ? `<!-- code-review:findings-json;base64 ${b64} -->`\n : jsonUrl\n ? `<!-- code-review:findings-json ${jsonUrl} -->`\n : \"\";\n return marker ? `${AGENTS_STOP_DIRECTIVE}\\n${marker}` : \"\";\n};\n\n/** The machine-readable findings-json marker (issue #19), identical on the sticky and the review\n * body: embeds the whole `findings` document as base64 when it fits under `limit`, falls back to a\n * `jsonUrl` link marker, or omits the marker entirely when neither is available. */\nexport const findingsPointer = (\n findings: Findings,\n jsonUrl: string | undefined,\n limit = EMBED_LIMIT,\n): string => encodeMarker(findings, jsonUrl, limit);\n\n/** The per-finding counterpart to {@link findingsPointer} (issue #31): each inline comment embeds\n * only its own `finding` (with `schemaVersion`), not the entire findings document — the sticky and\n * review body remain the whole-document SSOT. Same base64/limit/jsonUrl-fallback/AGENTS_STOP\n * behavior as `findingsPointer`. */\nexport const findingPointer = (\n finding: Finding,\n schemaVersion: string,\n jsonUrl?: string,\n limit = EMBED_LIMIT,\n): string => encodeMarker({ schema_version: schemaVersion, findings: [finding] }, jsonUrl, limit);\n\n/** The inverse of {@link findingsPointer}'s base64 form: extract and decode the whole-document\n * findings JSON a prior run embedded in a sticky/review body, or null when the body carries no\n * base64 marker (e.g. the jsonUrl-link fallback used for oversized findings, which can't be decoded\n * inline) or the payload isn't valid JSON. Returns the raw decoded value — callers validate it\n * against the current schema before trusting it (a prior run may predate the current shape). Pure. */\nexport const parseFindingsMarker = (body: string): unknown => {\n const match = /<!-- code-review:findings-json;base64 ([A-Za-z0-9+/=]+) -->/.exec(body);\n const b64 = match?.[1];\n if (b64 === undefined) return null;\n try {\n return JSON.parse(Buffer.from(b64, \"base64\").toString(\"utf-8\"));\n } catch {\n return null;\n }\n};\n\n/** Escape triple-backtick sequences so fenced content can't break out of its block. */\nconst escapeFence = (text: string): string => text.replace(/```/g, \"`` ` ``\");\n\n/** How a finding's `patch` renders on a surface (JP's core design): a GitHub ```suggestion when the\n * patch lowers to replacement text (anchored at the finding's already-aligned range), a raw\n * ```patch fallback when it can't lower (non-lossy — the diff still reaches the reader), or nothing\n * when the finding carries no patch. Fenced content is backtick-escaped against breakout. */\nexport type PatchProjection =\n | { readonly kind: \"suggestion\"; readonly text: string }\n | { readonly kind: \"patch\"; readonly raw: string }\n | { readonly kind: \"none\" };\n\n/** Project a finding's `patch` into a template-ready {@link PatchProjection}. Pure. */\nexport const projectPatch = (patch: string | undefined): PatchProjection => {\n if (patch === undefined) return { kind: \"none\" };\n const lowered = patchToSuggestion(patch);\n return typeof lowered === \"string\"\n ? { kind: \"suggestion\", text: escapeFence(lowered) }\n : { kind: \"patch\", raw: escapeFence(patch) };\n};\n\n/** Confidence, always at 2 decimal places (issue #26 — `1` renders `1.00`, `0.6` renders `0.60`). */\nexport const formatConfidence = (n: number): string => n.toFixed(2);\n\n/** The review-object body: the shared findings-json marker (when present) followed by a one-line\n * pointer to the sticky summary, linking to it when its URL is known. The single source of truth\n * for this body, shared by the commenter (post.ts) and the `preview` command. Pure. */\nexport const reviewBodyPointer = (\n headSha: string,\n stickyUrl: string | undefined,\n marker: string,\n): string => {\n const sha7 = headSha.slice(0, 7);\n const linkLine = stickyUrl\n ? `🤖 Automated code review for \\`${sha7}\\` — see the [summary comment](${stickyUrl}) for the verdict, walkthrough, and cost.`\n : `🤖 Automated code review for \\`${sha7}\\` — see the summary comment for the verdict, walkthrough, and cost.`;\n return marker ? `${marker}\\n\\n${linkLine}` : linkLine;\n};\n","// Deterministic comment renderer. Takes findings + envelope + prices → comment markdown.\n// Uses Eta templates; pure data-in, string-out — no side effects, no model invocation.\n\nimport { Eta } from \"eta\";\nimport type { Finding, Severity } from \"./schema.js\";\nimport type { RenderInput, SeverityCounts } from \"./types.js\";\nimport { computeCost } from \"./cost.js\";\nimport { severityEmoji, findingsPointer, projectPatch, formatConfidence } from \"./surface.js\";\nimport type { PatchProjection } from \"./surface.js\";\n\n/** Escape pipe characters so they don't break markdown table columns. */\nconst escapePipes = (text: string): string => text.replace(/\\|/g, \"\\\\|\");\n\n/** Replace backticks so they don't break inline code spans. */\nconst escapeCodeBackticks = (text: string): string => text.replace(/`/g, \"-\");\n\n/** A stray finding with its sanitized fields plus its projected patch block for the strays list. */\ntype StrayView = Finding & { readonly patchProjection: PatchProjection };\n\n/** Sanitize a stray finding's fields and attach its patch projection for the strays section. */\nconst sanitizeFinding = (f: Finding): StrayView => ({\n ...f,\n title: escapePipes(f.title),\n path: escapeCodeBackticks(f.path),\n patchProjection: projectPatch(f.patch),\n});\n\nconst emptySeverityCounts = (): Record<Severity, number> => ({\n critical: 0,\n major: 0,\n minor: 0,\n nit: 0,\n});\n\n/** Tally findings by severity for the summary counts line. Ignores out-of-domain severities. */\nexport const computeSeverityCounts = (findings: readonly Finding[]): SeverityCounts =>\n findings.reduce<Record<Severity, number>>(\n (acc, f) => (f.severity in acc ? { ...acc, [f.severity]: acc[f.severity] + 1 } : acc),\n emptySeverityCounts(),\n );\n\n/** Render a code-review comment from findings, envelope, and prices. Pure. */\nexport const render = (input: RenderInput): string => {\n const eta = new Eta({ autoTrim: false });\n const usageAvailable = input.envelope !== null;\n const costReport = input.envelope ? computeCost(input.envelope.models, input.prices) : null;\n const pricesProvided = input.pricesProvided ?? true;\n const route = input.route ?? input.envelope?.route ?? null;\n const effort = input.effort ?? input.envelope?.effort ?? null;\n const modelNames = input.envelope ? input.envelope.models.map((m) => m.model).join(\", \") : \"\";\n\n return eta.renderString(input.template, {\n findings: input.findings,\n envelope: input.envelope,\n usageAvailable,\n costReport,\n pricesProvided,\n route,\n effort,\n modelNames,\n testReport: input.testReport ?? null,\n reviewedSha: input.reviewedSha ?? \"0000000000000000000000000000000000000000\",\n postedAt: input.postedAt ?? \"\",\n severityCounts: input.severityCounts ?? computeSeverityCounts(input.findings.findings),\n strays: (input.strays ?? []).map(sanitizeFinding),\n unanchoredCount: input.unanchoredCount ?? 0,\n inlineDisposition: input.inlineDisposition ?? null,\n runUrl: input.runUrl ?? null,\n jsonUrl: input.jsonUrl ?? null,\n findingsPointer: input.findingsPointer ?? findingsPointer(input.findings, input.jsonUrl),\n reviewUrl: input.reviewUrl ?? null,\n formatTokens: (n: number): string =>\n Number.isFinite(n) && n >= 0 ? n.toLocaleString(\"en-US\") : \"—\",\n // Cost cells render N/A (never a false $0.00) when no real price map was provided — there are\n // real tokens spent, we simply have no rates to price them (SPEC §6.2).\n formatCost: (n: number): string =>\n !pricesProvided\n ? \"N/A\"\n : Number.isFinite(n)\n ? n > 0 && n.toFixed(2) === \"0.00\"\n ? \"<$0.01\"\n : `$${n.toFixed(2)}`\n : \"—\",\n formatDuration: (ms: number): string => {\n if (!Number.isFinite(ms) || ms < 0) return \"—\";\n const s = Math.round(ms / 1000);\n return s >= 60 ? `${String(Math.floor(s / 60))}m ${String(s % 60)}s` : `${String(s)}s`;\n },\n verdictBadge: (v: string): string => {\n switch (v) {\n case \"approve\":\n return \"✅ approved\";\n case \"comment\":\n return \"💬 comment\";\n case \"changes\":\n return \"🔧 changes requested\";\n default:\n return `❓ ${v}`;\n }\n },\n severityEmoji,\n formatConfidence,\n });\n};\n","// Pure functions for unified-diff parsing and line-in-diff validation.\n// Uses parse-diff for parsing; exports only clean functional interfaces.\n\nimport parseDiff from \"parse-diff\";\nimport type { Finding, Side } from \"./schema.js\";\n\n// A set of \"path:line\" keys present in the diff hunks (additions/changes).\n// Used to validate findings before posting inline comments.\nexport type DiffLineIndex = ReadonlySet<string>;\n\nconst key = (path: string, line: number): string => `${path}:${String(line)}`;\n\n/** Index a set of changes under a given file path. */\nconst indexChanges = (\n keys: Set<string>,\n fpath: string,\n changes: ReadonlyArray<{\n readonly type: \"normal\" | \"add\" | \"del\";\n readonly ln1?: number;\n readonly ln2?: number;\n readonly ln?: number;\n }>,\n): void => {\n for (const change of changes) {\n if (change.type === \"normal\") {\n if (change.ln1 !== undefined) keys.add(key(fpath, change.ln1));\n if (change.ln2 !== undefined) keys.add(key(fpath, change.ln2));\n } else if (change.ln !== undefined) {\n keys.add(key(fpath, change.ln));\n }\n }\n};\n\n/** Parse a unified diff string into a set of \"path:line\" keys for every line in the diff.\n * For renamed files, both old and new paths are indexed so findings on either path match. */\nexport const indexDiff = (diff: string): DiffLineIndex => {\n const files = parseDiff(diff);\n if (!Array.isArray(files)) return new Set();\n\n const keys = new Set<string>();\n for (const file of files) {\n // Deleted: file.to is /dev/null, use file.from\n // New: file.from is undefined, use file.to\n // Modified: both set and equal\n // Renamed: both set and differ → index both paths\n const primary = file.from ?? file.to;\n if (!primary) continue;\n\n indexChanges(\n keys,\n primary,\n file.chunks.flatMap((c) => c.changes),\n );\n\n // Also index under file.to for renames (when both paths exist and differ)\n if (file.to && file.to !== \"/dev/null\" && file.to !== primary) {\n indexChanges(\n keys,\n file.to,\n file.chunks.flatMap((c) => c.changes),\n );\n }\n }\n return keys;\n};\n\n/** Check whether a finding's anchor line appears in the diff. */\nexport const isInDiff = (index: DiffLineIndex, path: string, line: number): boolean =>\n index.has(key(path, line));\n\n/** True for a diff with no content or no hunks — nothing to review or anchor inline comments to. */\nexport const isEmptyDiff = (diff: string): boolean => {\n if (diff.trim().length === 0) return true;\n const files = parseDiff(diff);\n return !Array.isArray(files) || files.length === 0 || files.every((f) => f.chunks.length === 0);\n};\n\n/** Default side for inline comments: RIGHT for additions, LEFT for deletions. */\nexport const defaultSide = (side: string | undefined): Side => (side === \"LEFT\" ? \"LEFT\" : \"RIGHT\");\n\n/** Partition findings into in-diff and out-of-diff (strays). Strays get demoted to the summary. */\nexport const partitionFindings = (\n findings: readonly Finding[],\n index: DiffLineIndex,\n): {\n readonly inDiff: readonly Finding[];\n readonly strays: readonly Finding[];\n} => {\n const inDiff: Finding[] = [];\n const strays: Finding[] = [];\n for (const f of findings) {\n if (isInDiff(index, f.path, f.start_line) && isInDiff(index, f.path, f.end_line)) {\n inDiff.push(f);\n } else {\n strays.push(f);\n }\n }\n return { inDiff, strays };\n};\n","// Inline review payload builder. Validates findings against the diff,\n// builds the GitHub reviews API comments[] array, and demotes strays.\n\nimport { Eta } from \"eta\";\nimport { partitionFindings, indexDiff, defaultSide } from \"./diff.js\";\nimport { severityEmoji, findingPointer, projectPatch, formatConfidence } from \"./surface.js\";\nimport type { Finding, Findings } from \"./schema.js\";\nimport type { InlineComment, InlineResult } from \"./types.js\";\n\n/** Backtick-wrapped, `/`-joined model names for the disclosure line (issue #16), falling back to\n * a plain phrase when no models are known. */\nconst formatModels = (models: readonly string[]): string =>\n models.length > 0 ? models.map((m) => `\\`${m}\\``).join(\"/\") : \"an AI model\";\n\n/** Render a finding's inline comment body via the inline Eta template (bundled by default — see\n * resolveInlineTemplatePath, index.ts). The template is the SSOT for all body text — severity\n * header, description, recommendation, the projected patch block, and the [!TIP] disclosure fold;\n * TS supplies only data. The patch is projected here (never a `suggestion` field — that field is\n * gone as of schema 0.4). */\nconst renderCommentBody = (\n f: Finding,\n eta: Eta,\n template: string,\n modelsText: string,\n jsonUrl: string | undefined,\n pointer: string,\n): string =>\n // Eta.renderString returns string | Promise<string>; with autoTrim:false it's always sync.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n eta.renderString(template, {\n ...f,\n patchProjection: projectPatch(f.patch),\n severityEmoji,\n formatConfidence,\n modelsText,\n jsonUrl: jsonUrl ?? null,\n findingsPointer: pointer,\n }) as string;\n\n/** Extra context threaded into each inline comment beyond the finding itself. */\nexport interface InlineContext {\n /** Eta template for each comment's body — bundled by default (index.ts's\n * resolveInlineTemplatePath), overridable via --inline-template. */\n readonly inlineTemplate: string;\n /** Model name(s) that produced the review, for the template's disclosure line (issue #16). */\n readonly models?: readonly string[];\n /** Findings-json artifact URL — the marker's fallback when the embedded form is too large (#19). */\n readonly jsonUrl?: string;\n /** The full findings document — each in-diff comment embeds only its OWN finding (issue #31), but\n * needs the document's `schema_version` to do so; omitted when the caller has no document at all\n * (each comment's marker is then omitted too). */\n readonly findings?: Findings;\n}\n\n/** Build the GitHub reviews API comments[] array from in-diff findings. Strays are demoted. */\nexport const buildInlineComments = (\n findings: readonly Finding[],\n diff: string,\n context: InlineContext,\n): InlineResult => {\n const { inlineTemplate, models = [], jsonUrl, findings: fullFindings } = context;\n const index = indexDiff(diff);\n const { inDiff, strays } = partitionFindings(findings, index);\n const eta = new Eta({ autoTrim: false });\n const modelsText = formatModels(models);\n\n const comments: InlineComment[] = inDiff.map((f) => {\n const pointer = fullFindings ? findingPointer(f, fullFindings.schema_version, jsonUrl) : \"\";\n const comment: InlineComment = {\n path: f.path,\n line: f.end_line,\n side: defaultSide(f.side),\n body: renderCommentBody(f, eta, inlineTemplate, modelsText, jsonUrl, pointer),\n };\n if (f.start_line < f.end_line) {\n return {\n ...comment,\n start_line: f.start_line,\n start_side: defaultSide(f.side),\n };\n }\n return comment;\n });\n\n return { comments, strays, inDiff };\n};\n\n/** Render the demoted (stray) findings as a markdown section for the summary. */\nexport const renderStraysSection = (strays: readonly Finding[]): string => {\n if (strays.length === 0) return \"\";\n\n const items = strays.map(\n (f) => `- **${f.severity}** · \\`${f.path}:${String(f.start_line)}\\` — ${f.title}`,\n );\n\n return [\n \"\",\n \"---\",\n \"\",\n \"#### ⚠️ Findings on lines not in the diff (demoted to summary)\",\n \"\",\n ...items,\n ].join(\"\\n\");\n};\n","// Small shared helpers, extracted to keep a single definition instead of per-module copies.\n\nimport { readFileSync } from \"node:fs\";\n\n/** Narrow an unknown to a plain object — not null, not an array — or null. */\nexport const asRecord = (u: unknown): Record<string, unknown> | null =>\n typeof u === \"object\" && u !== null && !Array.isArray(u) ? (u as Record<string, unknown>) : null;\n\n/** Read a file as UTF-8 text, or null if it cannot be read. Never throws. */\nexport const readFileOrNull = (path: string): string | null => {\n try {\n return readFileSync(path, \"utf-8\");\n } catch {\n return null;\n }\n};\n","// Recover per-model token usage from a Claude Code transcript (JSONL, one message object per line).\n// The transcript is the only surviving record of spend when a wall-clock kill leaves no clean result\n// envelope (issue #36), and the live in-flight signal the budget hook steers on (issue #38). Reading\n// is total: a truncated final line (the artifact of a `timeout` kill mid-flush) or any malformed\n// entry is skipped, never thrown — a cost estimate from most of the transcript beats a crash.\n\nimport { readdirSync } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport type { ModelUsageEntry } from \"./schema.js\";\nimport { asRecord, readFileOrNull } from \"./util.js\";\n\n/** Per-model token totals plus the coarse telemetry (turn count, wall span) the transcript carries.\n * `models` feeds `computeCost` directly; `firstTsMs`/`lastTsMs` are epoch-ms bounds (null when no\n * parseable timestamp is present) from which elapsed and duration are derived. */\nexport interface TranscriptUsage {\n readonly models: readonly ModelUsageEntry[];\n readonly turns: number;\n readonly durationMs: number;\n readonly firstTsMs: number | null;\n readonly lastTsMs: number | null;\n}\n\n/** What was actually read off disk for a transcript tree — `missing` distinguishes an unreadable\n * main transcript (no signal at all) from an empty-but-present one. */\nexport interface TranscriptTree {\n readonly entries: readonly unknown[];\n readonly files: readonly string[];\n readonly missing: boolean;\n}\n\n/** A non-negative finite number field, or 0 — token counts are never negative and a NaN/absent\n * field must not poison the sum. */\nconst numField = (rec: Record<string, unknown>, key: string): number => {\n const v = rec[key];\n return typeof v === \"number\" && Number.isFinite(v) && v >= 0 ? v : 0;\n};\n\ninterface MessageUsage {\n readonly id: string | null;\n readonly model: string;\n readonly input: number;\n readonly output: number;\n readonly cacheRead: number;\n readonly cacheWrite: number;\n}\n\n/** The usage an assistant turn contributes, or null for any other line. Claude Code names cache\n * fields `cache_read_input_tokens`/`cache_creation_input_tokens`; the abstract envelope names them\n * `cache_read_tokens`/`cache_write_tokens` (SPEC §6.1) — this is where that rename happens. `id` is\n * the API message id, carried so a message logged across several lines (one per content block of a\n * parallel tool-use turn, each repeating the message-level usage) is summed once, not per line. */\nconst messageUsage = (entry: unknown): MessageUsage | null => {\n const rec = asRecord(entry);\n if (rec === null || rec[\"type\"] !== \"assistant\") return null;\n const msg = asRecord(rec[\"message\"]);\n if (msg === null) return null;\n const model = msg[\"model\"];\n const usage = asRecord(msg[\"usage\"]);\n if (typeof model !== \"string\" || usage === null) return null;\n const id = msg[\"id\"];\n return {\n id: typeof id === \"string\" ? id : null,\n model,\n input: numField(usage, \"input_tokens\"),\n output: numField(usage, \"output_tokens\"),\n cacheRead: numField(usage, \"cache_read_input_tokens\"),\n cacheWrite: numField(usage, \"cache_creation_input_tokens\"),\n };\n};\n\nconst tsMsOf = (entry: unknown): number | null => {\n const rec = asRecord(entry);\n const ts = rec?.[\"timestamp\"];\n if (typeof ts !== \"string\") return null;\n const ms = Date.parse(ts);\n return Number.isNaN(ms) ? null : ms;\n};\n\ninterface Totals {\n readonly input: number;\n readonly output: number;\n readonly cacheRead: number;\n readonly cacheWrite: number;\n}\nconst EMPTY_TOTALS: Totals = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n\n/** Parse JSONL loosely: one object per non-blank line, silently dropping any line that fails to\n * parse. This is what makes a `timeout`-truncated final line a no-op rather than a crash (#39/#36). */\nexport const parseJsonl = (text: string): readonly unknown[] =>\n text\n .split(\"\\n\")\n .filter((line) => line.trim() !== \"\")\n .flatMap((line) => {\n try {\n return [JSON.parse(line) as unknown];\n } catch {\n return [];\n }\n });\n\n/** Sum per-model usage and derive turn count + wall span across a set of already-parsed transcript\n * entries. A message logged over multiple lines (identified by a repeated `message.id`) is counted\n * once — otherwise a parallel tool-use turn's usage, stamped on every one of its content-block lines,\n * is summed several times and inflates spend (issue #38). Entries with no id can't be de-duplicated\n * and are counted as-is. Order of `models` follows first-appearance of each model. Pure. */\nexport const sumTranscriptUsage = (entries: readonly unknown[]): TranscriptUsage => {\n const summed = entries.reduce<{ totals: Map<string, Totals>; turns: number; seen: Set<string> }>(\n (acc, entry) => {\n const u = messageUsage(entry);\n if (u === null) return acc;\n if (u.id !== null && acc.seen.has(u.id)) return acc;\n if (u.id !== null) acc.seen.add(u.id);\n const prev = acc.totals.get(u.model) ?? EMPTY_TOTALS;\n acc.totals.set(u.model, {\n input: prev.input + u.input,\n output: prev.output + u.output,\n cacheRead: prev.cacheRead + u.cacheRead,\n cacheWrite: prev.cacheWrite + u.cacheWrite,\n });\n return { totals: acc.totals, turns: acc.turns + 1, seen: acc.seen };\n },\n { totals: new Map(), turns: 0, seen: new Set() },\n );\n\n const models: readonly ModelUsageEntry[] = [...summed.totals].map(([model, t]) => ({\n model,\n input_tokens: t.input,\n output_tokens: t.output,\n cache_read_tokens: t.cacheRead,\n cache_write_tokens: t.cacheWrite,\n }));\n\n const bounds = entries.reduce<{ min: number | null; max: number | null }>(\n (acc, entry) => {\n const ms = tsMsOf(entry);\n if (ms === null) return acc;\n return {\n min: acc.min === null || ms < acc.min ? ms : acc.min,\n max: acc.max === null || ms > acc.max ? ms : acc.max,\n };\n },\n { min: null, max: null },\n );\n\n return {\n models,\n turns: summed.turns,\n durationMs: bounds.min !== null && bounds.max !== null ? bounds.max - bounds.min : 0,\n firstTsMs: bounds.min,\n lastTsMs: bounds.max,\n };\n};\n\n/** The subagent transcripts a main session spawned. Claude Code writes them under a directory named\n * for the session id — `<dir>/<session-id>/subagents/agent-*.jsonl`, beside `<dir>/<session-id>.jsonl`\n * (the `.meta.json` companions are ignored). Confirmed live on 2.1.205 (issue #38 dogfood); an empty\n * result covers both a missing directory and an older/other layout. */\nconst subagentFiles = (mainPath: string): readonly string[] => {\n const dir = join(dirname(mainPath), basename(mainPath, \".jsonl\"), \"subagents\");\n try {\n return readdirSync(dir)\n .filter((name) => name.endsWith(\".jsonl\"))\n .map((name) => join(dir, name));\n } catch {\n return [];\n }\n};\n\n/** Read a transcript tree from `mainPath`. Claude Code writes each subagent to its own file under\n * `<session-id>/subagents/` (see `subagentFiles`), leaving the main transcript free of those turns;\n * a different layout instead inlines them into the main, marked `isSidechain: true`. The subagent\n * files are read ONLY when the main carries no inline sidechain turn, so a run in either layout is\n * summed exactly once — never doubled. Never throws: every unreadable file drops out. */\nexport const readTranscriptTree = (mainPath: string): TranscriptTree => {\n const mainText = readFileOrNull(mainPath);\n const mainEntries = mainText === null ? [] : parseJsonl(mainText);\n const inlineSidechains = mainEntries.some((e) => asRecord(e)?.[\"isSidechain\"] === true);\n const siblings = inlineSidechains ? [] : subagentFiles(mainPath);\n const siblingReads = siblings.flatMap((path) => {\n const text = readFileOrNull(path);\n return text === null ? [] : [{ path, entries: parseJsonl(text) }];\n });\n return {\n entries: [...mainEntries, ...siblingReads.flatMap((r) => r.entries)],\n files: [...(mainText === null ? [] : [mainPath]), ...siblingReads.map((r) => r.path)],\n missing: mainText === null,\n };\n};\n","// io-ts codecs for de/serialization at the boundary.\n// These ARE the source of truth for the data shapes — types are materialized via t.TypeOf<>.\n// No hand-written DTO types exist elsewhere; import types from here.\n\nimport * as t from \"io-ts\";\n\nconst SeverityCodec = t.union([\n t.literal(\"critical\"),\n t.literal(\"major\"),\n t.literal(\"minor\"),\n t.literal(\"nit\"),\n]);\n\nconst SideCodec = t.union([t.literal(\"RIGHT\"), t.literal(\"LEFT\")]);\n\nconst VerdictCodec = t.union([t.literal(\"approve\"), t.literal(\"comment\"), t.literal(\"changes\")]);\n\nconst LineNumber = t.refinement(\n t.number,\n (n): n is number => Number.isInteger(n) && n >= 1,\n \"LineNumber\",\n);\n\nconst Confidence = t.refinement(t.number, (n): n is number => n >= 0 && n <= 1, \"Confidence\");\n\n// Mirrors findings.schema.json's `schema_version.pattern` exactly, so `resolve()` (registry.ts,\n// consumed by post.ts's §5.5 malformed-doc path) never accepts a value that ajv (validate.ts, the\n// extraction ladder's candidate gate) would reject — e.g. a truncated \"0.2\" or an over-long \"0.2.0.0\".\nconst SCHEMA_VERSION_RE =\n /^(0|[1-9]\\d*)\\.(\\d+)\\.(\\d+)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/;\n\nconst SchemaVersion = t.refinement(\n t.string,\n (s): s is string => SCHEMA_VERSION_RE.test(s),\n \"SchemaVersion\",\n);\n\nconst FindingShape = t.intersection([\n t.type({\n path: t.string,\n start_line: LineNumber,\n end_line: LineNumber,\n severity: SeverityCodec,\n title: t.string,\n description: t.string,\n reasoning: t.string,\n confidence: Confidence,\n }),\n t.partial({\n side: SideCodec,\n code: t.string,\n code_url: t.string,\n recommendation: t.string,\n patch: t.string,\n }),\n]);\n\nconst EndGeStart = t.refinement(\n FindingShape,\n (f): f is t.TypeOf<typeof FindingShape> => f.end_line >= f.start_line,\n \"EndGeStart\",\n);\n\nexport const FindingCodec = t.exact(EndGeStart);\n\nexport const FindingsCodec = t.exact(\n t.type({\n schema_version: SchemaVersion,\n summary: t.string,\n verdict: VerdictCodec,\n findings: t.array(FindingCodec),\n }),\n);\n\nexport const TriageCodec = t.type({\n safe: t.boolean,\n reasons: t.string,\n});\n\n// Abstract, vendor-neutral result envelope (SPEC §6.1) — not any adapter's native shape.\nconst TokenCount = t.refinement(\n t.number,\n (n): n is number => Number.isInteger(n) && n >= 0,\n \"TokenCount\",\n);\n\nexport const ModelUsageEntryCodec = t.intersection([\n t.type({\n model: t.string,\n input_tokens: TokenCount,\n output_tokens: TokenCount,\n }),\n t.partial({\n cache_read_tokens: TokenCount,\n cache_write_tokens: TokenCount,\n }),\n]);\n\nexport const ResultEnvelopeCodec = t.intersection([\n t.type({\n schema_version: t.string,\n findings: FindingsCodec,\n models: t.array(ModelUsageEntryCodec),\n turns: TokenCount,\n duration_ms: TokenCount,\n }),\n t.partial({\n vendor_cost_usd: t.union([t.number, t.null]),\n route: t.string,\n effort: t.string,\n }),\n]);\n\nexport const ModelPricesCodec = t.type({\n in: t.number,\n out: t.number,\n cache_read: t.number,\n cache_write: t.number,\n});\n\nexport const PriceMapCodec = t.type({\n _updated: t.string,\n _unit: t.string,\n models: t.record(t.string, ModelPricesCodec),\n});\n\n// Format-agnostic test summary (SPEC §5.1 item 4, REQ-CO-9) — any conforming test report shape.\nexport const TestFailureCodec = t.intersection([\n t.type({ name: t.string }),\n t.partial({ message: t.string }),\n]);\n\nexport const TestSummaryCodec = t.intersection([\n t.type({\n passed: t.number,\n failed: t.number,\n total: t.number,\n }),\n t.partial({\n failures: t.array(TestFailureCodec),\n }),\n]);\n\n// The supported-minor allowlist and version dispatch live in the registry (src/registry.ts),\n// which sources its findings entry's defaultVersion from this constant.\n/** Full semver used when an adapter's native output omits `schema_version` (SPEC §6.1). */\nexport const DEFAULT_SCHEMA_VERSION = \"0.4.0\";\n\nexport type Finding = t.TypeOf<typeof FindingCodec>;\nexport type Findings = t.TypeOf<typeof FindingsCodec>;\n\n/** A valid, empty-findings document carrying `summary` as its only content — the single shape used\n * for a sticky-only notice (post.ts, SPEC §5.5) and a \"did not complete\" degraded envelope\n * (adapt.ts, issue #18). Callers supply the fully-formatted markdown summary. */\nexport const noticeFindings = (summary: string): Findings => ({\n schema_version: DEFAULT_SCHEMA_VERSION,\n summary,\n verdict: \"comment\",\n findings: [],\n});\nexport type Triage = t.TypeOf<typeof TriageCodec>;\nexport type Severity = t.TypeOf<typeof SeverityCodec>;\nexport type Side = t.TypeOf<typeof SideCodec>;\nexport type Verdict = t.TypeOf<typeof VerdictCodec>;\nexport type ModelUsageEntry = t.TypeOf<typeof ModelUsageEntryCodec>;\nexport type ResultEnvelope = t.TypeOf<typeof ResultEnvelopeCodec>;\nexport type ModelPrices = t.TypeOf<typeof ModelPricesCodec>;\nexport type PriceMap = t.TypeOf<typeof PriceMapCodec>;\nexport type TestFailure = t.TypeOf<typeof TestFailureCodec>;\nexport type TestSummary = t.TypeOf<typeof TestSummaryCodec>;\n","// Schema validation wrapper. Validates findings JSON against the published schema.\n// Minor command — defense-in-depth; the CLI enforces the schema on the agent side already.\n\nimport { Ajv2020 } from \"ajv/dist/2020.js\";\nimport type { ValidateFunction as AjvValidateFunction } from \"ajv/dist/2020.js\";\nimport _addFormats from \"ajv-formats\";\nimport { readFileSync } from \"node:fs\";\nimport type { Either } from \"fp-ts/Either\";\nimport { FindingsCodec } from \"./schema.js\";\nimport type { Findings } from \"./schema.js\";\n\nconst addFormats = _addFormats as unknown as (ajv: Ajv2020) => void;\n\n/** Module-level cache of compiled validators keyed by schema path. */\nconst validatorCache = new Map<string, AjvValidateFunction>();\n\n/** Compile a JSON Schema validator from the given file path (cached). */\nconst compileSchema = (schemaPath: string): AjvValidateFunction => {\n const cached = validatorCache.get(schemaPath);\n if (cached) return cached;\n\n let schemaJson: string;\n try {\n schemaJson = readFileSync(schemaPath, \"utf-8\");\n } catch {\n throw new Error(`Cannot read schema file: ${schemaPath}`);\n }\n let schema: unknown;\n try {\n schema = JSON.parse(schemaJson);\n } catch {\n throw new Error(`Invalid JSON in schema file: ${schemaPath}`);\n }\n const ajv = new Ajv2020({ allErrors: true, strict: true });\n addFormats(ajv);\n const validator = ajv.compile(schema as Record<string, unknown>);\n validatorCache.set(schemaPath, validator);\n return validator;\n};\n\nexport interface ValidateResult {\n readonly valid: boolean;\n readonly errors: readonly string[];\n}\n\nexport const validateAgainstSchema = (findings: unknown, schemaPath: string): ValidateResult => {\n const validator = compileSchema(schemaPath);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion -- ajv returns boolean | Promise<unknown>\n const valid = validator(findings) as boolean;\n const errors: readonly string[] =\n valid || !validator.errors\n ? []\n : validator.errors.map((e) => `${e.instancePath} ${e.message ?? \"unknown error\"}`);\n return { valid, errors };\n};\n\n/** Extract the right value from an io-ts Either, or throw. */\nexport const unsafeUnwrap = <A>(decoded: Either<unknown, A>): A => {\n if (decoded._tag === \"Right\") return decoded.right;\n throw new Error(\"io-ts decode failed — data does not match expected shape\");\n};\n\n/** Decode findings, throwing on failure. */\nexport const decodeFindings = (data: unknown): Findings => unsafeUnwrap(FindingsCodec.decode(data));\n","// Stop-hook deliverable gate. A Claude Code `Stop` hook that refuses to let the review agent end\n// its turn until it has written a findings document that validates against the schema — turning\n// the \"write your draft and validate before stopping\" instruction from a hope into an invariant.\n// The check is the same validation `code-review validate` performs.\n\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { validateAgainstSchema } from \"./validate.js\";\n\n/** Validation state of the agent's draft deliverable at the moment it tries to stop. A sum type so\n * `decideGate` can reprompt precisely per case — critically, distinguishing an UNREADABLE file\n * (EACCES/EISDIR) from an INVALID one, since \"does not validate against the schema\" is a lie when\n * the file could not even be read. */\nexport type DraftState =\n | { readonly kind: \"missing\" }\n | { readonly kind: \"unreadable\"; readonly error: string }\n | { readonly kind: \"invalid\"; readonly errors: readonly string[] }\n | { readonly kind: \"valid\" };\n\n/** A Stop-hook outcome: `block` feeds `reason` back to the agent so it keeps working; `allow`\n * lets the turn end. */\nexport type GateDecision =\n { readonly kind: \"allow\" } | { readonly kind: \"block\"; readonly reason: string };\n\n/** The precise \"what's wrong\" clause per non-valid draft state — honest about unreadable vs invalid. */\nconst whatsWrong = (\n state: Exclude<DraftState, { kind: \"valid\" }>,\n draftPath: string,\n kind: string,\n): string => {\n switch (state.kind) {\n case \"missing\":\n return `${draftPath} does not exist yet`;\n case \"unreadable\":\n return `${draftPath} could not be read: ${state.error}`;\n case \"invalid\":\n return `${draftPath} does not validate against the ${kind} schema:\\n${state.errors\n .map((e) => ` - ${e}`)\n .join(\"\\n\")}`;\n }\n};\n\n/** The settings shape Claude Code reads from a `--settings` file to wire a Stop hook command. */\nexport interface StopHookSettings {\n readonly hooks: {\n readonly Stop: readonly {\n readonly hooks: readonly { readonly type: \"command\"; readonly command: string }[];\n }[];\n };\n}\n\n/** Allow when the draft validates or the nudge budget is spent; otherwise block with a reason\n * that names what is wrong and reprompts the agent about the ONLY deliverable — a document\n * validating against `kind`'s schema — so it can fix it. */\nexport const decideGate = (\n state: DraftState,\n nudges: number,\n maxNudges: number,\n draftPath: string,\n kind: string,\n): GateDecision => {\n if (state.kind === \"valid\") return { kind: \"allow\" };\n if (nudges >= maxNudges) return { kind: \"allow\" };\n return {\n kind: \"block\",\n reason: [\n `This review is not complete — ${whatsWrong(state, draftPath, kind)}`,\n `The only deliverable is a ${kind} document that validates against the ${kind} schema — run \"code-review print-schema ${kind}\" to see the exact shape.`,\n `Write it to ${draftPath}, then run \"code-review validate ${draftPath} --kind ${kind} --explain\" until it exits 0 before ending your turn (--explain prints the schema when the shape is wrong).`,\n ].join(\"\\n\"),\n };\n};\n\n/** Read and validate the draft, resolving the schema from the parsed document when needed. Never\n * throws — every failure mode (missing file, unreadable file, invalid JSON, an unresolvable or\n * crashing schema lookup, a validator crash) degrades to a `DraftState` the gate can act on,\n * rather than crashing the hook and letting the agent stop by default. */\nexport const draftState = (\n draftPath: string,\n resolveSchema: (parsed: unknown) => string,\n): DraftState => {\n let raw: string;\n try {\n raw = readFileSync(draftPath, \"utf-8\");\n } catch (err) {\n if (err instanceof Error && (err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { kind: \"missing\" };\n }\n return { kind: \"unreadable\", error: err instanceof Error ? err.message : String(err) };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n return {\n kind: \"invalid\",\n errors: [`not valid JSON: ${err instanceof Error ? err.message : String(err)}`],\n };\n }\n let schemaPath: string;\n try {\n schemaPath = resolveSchema(parsed);\n } catch (err) {\n return { kind: \"invalid\", errors: [err instanceof Error ? err.message : String(err)] };\n }\n try {\n const { valid, errors } = validateAgainstSchema(parsed, schemaPath);\n return valid ? { kind: \"valid\" } : { kind: \"invalid\", errors };\n } catch (err) {\n return { kind: \"invalid\", errors: [err instanceof Error ? err.message : String(err)] };\n }\n};\n\n/** Nudge count persisted beside the draft across hook invocations within one review. Absent or\n * unparseable counts read as 0, so a fresh review starts with a full budget. */\nexport const readNudges = (counterPath: string): number => {\n try {\n const n = Number.parseInt(readFileSync(counterPath, \"utf-8\").trim(), 10);\n return Number.isInteger(n) && n >= 0 ? n : 0;\n } catch {\n return 0;\n }\n};\n\n/** Persist the incremented nudge count (`current + 1`). The caller reads `current` immediately\n * prior (via `readNudges`) and passes it here, so there is no second read to go stale. May throw\n * on a write failure — the caller decides how to handle that (index.ts allows the stop rather than\n * emit an unbounded block). */\nexport const bumpNudges = (counterPath: string, current: number): void => {\n writeFileSync(counterPath, `${String(current + 1)}\\n`);\n};\n\n/** POSIX single-quote a string for safe embedding in a hook command line. */\nexport const shellQuote = (s: string): string => `'${s.replace(/'/g, `'\\\\''`)}'`;\n\n/** The default hook command: this CLI re-invoked as the gate, carrying the same schema/budget\n * flags so the hook validates exactly as the caller intended. */\nexport const defaultHookCommand = (\n draftPath: string,\n opts: {\n readonly kind?: string;\n readonly schema?: string;\n readonly schemaVersion?: string;\n readonly maxNudges?: string;\n readonly counter?: string;\n },\n): string =>\n [\n \"code-review stop-gate --draft\",\n shellQuote(draftPath),\n ...(opts.kind ? [\"--kind\", shellQuote(opts.kind)] : []),\n ...(opts.schema ? [\"--schema\", shellQuote(opts.schema)] : []),\n ...(opts.schemaVersion ? [\"--schema-version\", shellQuote(opts.schemaVersion)] : []),\n ...(opts.maxNudges ? [\"--max-nudges\", shellQuote(opts.maxNudges)] : []),\n ...(opts.counter ? [\"--counter\", shellQuote(opts.counter)] : []),\n ].join(\" \");\n\n/** The settings object that wires `command` as a Stop hook. */\nexport const stopHookSettings = (command: string): StopHookSettings => ({\n hooks: { Stop: [{ hooks: [{ type: \"command\", command }] }] },\n});\n","// Deterministic budget discipline for a headless review agent (issue #38). Two Claude Code hooks\n// wired from ONE self-dispatching command: a PostToolBatch signal that steers the agent to converge\n// once spend or wall-clock enters its soft wind-down reserve, and a PreToolUse gate that, inside the\n// smaller hard reserve, denies the budget-burning tools — subagent spawns, arbitrary shell, web —\n// while leaving the deliver-the-draft path open, so the agent produces its review before the budget\n// is gone rather than investigating until it is killed. The PreToolUse gate also owns the fan-out\n// discipline at EVERY phase: subagent spawns are denied until the main agent has written its own\n// first-pass draft, and permitted spawns are rewritten to run in the background so the main agent\n// never blocks on a batch join where no hook can steer it (issue #73).\n//\n// Every decision here is pure. The CLI (index.ts) owns the impure edges — reading the transcript to\n// measure spend, `Date.now()` for elapsed — and hands the results in as `BudgetParams`; the hook\n// itself never crashes (index.ts degrades any failure to an empty, allow-everything result).\n\nimport { basename } from \"node:path\";\n\nimport { shellQuote } from \"./stop-gate.js\";\nimport { asRecord } from \"./util.js\";\n\n/** The environment variable carrying the run's absolute deadline as Unix epoch SECONDS. The review\n * job exports it right before `claude -p` (from `code-review deadline`), and every hook subprocess —\n * the main agent's AND each fan-out subagent's — inherits it, so all measure the SAME true remaining\n * wall. Without it each hook derived elapsed from its own transcript's first timestamp, which reads\n * ≈0 inside a freshly-spawned subagent, leaving the skill's parallel fan-out entirely unsteered until\n * the wall (issue #45). */\nexport const DEADLINE_ENV = \"CODE_REVIEW_DEADLINE_EPOCH\";\n\n/** The two budget axes and the wind-down reserve to judge them against. Either axis may be unknown\n * (`spentUsd`/`budgetUsd` null when there is no price map to measure spend; `elapsedMs`/`wallMs`\n * null when there is no wall set or no transcript timestamp), in which case only the other drives;\n * if neither is known the phase is always `ok`. Crucially, unmeasurable spend is `null`, never 0 —\n * telling the agent \"$0.00 spent\" when we simply can't measure would be misleading. */\nexport interface BudgetInputs {\n readonly spentUsd: number | null;\n readonly budgetUsd: number | null;\n readonly elapsedMs: number | null;\n readonly wallMs: number | null;\n readonly reserve: ReserveParams;\n}\n\n/** The headroom to hold back for wind-down, judged per axis as max(flat floor, effective-frac × the\n * budget): the flat floor keeps a tiny budget from converging with no absolute room left to write and\n * validate the draft, while the fraction lets a large budget scale. The effective fraction GROWS with\n * how far into the budget the run already is — `frac + growth × (used / limit)` — so convergence\n * pressure escalates the longer the review has run, reserving proportionally more tail for the\n * write→validate→fix loop rather than triggering at one late cliff (issue #45; a wall-killed review\n * wrote its first draft at ~85% and ran out of time adapting it to the schema). The soft (steer) tier\n * reserves SOFT_MULTIPLE× the hard (force) tier, so the agent is nudged with a whole extra reserve\n * still in hand rather than only at the brink (issue #38). */\nexport interface ReserveParams {\n readonly frac: number;\n readonly growth: number;\n readonly flatUsd: number;\n readonly flatMs: number;\n}\n\n/** Defaults sized for real reviews: hold back a base 15% of the budget, growing by up to another 25%\n * as the run approaches its limit (so hard convergence lands near ~68% of the wall rather than ~85%,\n * soft near ~47%), but never less than $0.02 / 2 minutes of absolute wind-down room. `growth: 0`\n * recovers the old flat-reserve behaviour. */\nexport const DEFAULT_RESERVE: ReserveParams = {\n frac: 0.15,\n growth: 0.25,\n flatUsd: 0.02,\n flatMs: 120_000,\n};\n\nconst SOFT_MULTIPLE = 2;\n\n/** How close the run is to its budget: `soft` → steer toward converging; `hard` → force it. */\nexport type BudgetPhase =\n { readonly kind: \"ok\" } | { readonly kind: \"soft\" } | { readonly kind: \"hard\" };\n\ninterface Axis {\n readonly used: number;\n readonly limit: number;\n readonly flat: number;\n}\n\nconst costAxis = (i: BudgetInputs): Axis | null =>\n i.spentUsd !== null && i.budgetUsd !== null && i.budgetUsd > 0\n ? { used: i.spentUsd, limit: i.budgetUsd, flat: i.reserve.flatUsd }\n : null;\n\nconst timeAxis = (i: BudgetInputs): Axis | null =>\n i.elapsedMs !== null && i.wallMs !== null && i.wallMs > 0\n ? { used: i.elapsedMs, limit: i.wallMs, flat: i.reserve.flatMs }\n : null;\n\n/** 2 = inside the hard reserve (force convergence), 1 = inside the soft reserve (steer), 0 = ok. The\n * hard reserve is max(flat floor, effFrac × limit), where effFrac grows with how far into the budget\n * the run is — `frac + growth × usedFrac` — so it converges earlier the longer it has run; the soft\n * reserve is SOFT_MULTIPLE× the hard one. `usedFrac` is clamped to [0, 1] so an over-budget axis\n * simply pins the growth term at its max rather than compounding past it. */\nconst axisSeverity = (a: Axis, reserve: ReserveParams): 0 | 1 | 2 => {\n const usedFrac = Math.min(1, Math.max(0, a.used / a.limit));\n const effFrac = reserve.frac + reserve.growth * usedFrac;\n const hardReserve = Math.max(a.flat, effFrac * a.limit);\n const remaining = a.limit - a.used;\n if (remaining <= hardReserve) return 2;\n if (remaining <= SOFT_MULTIPLE * hardReserve) return 1;\n return 0;\n};\n\n/** Converge as the run nears EITHER budget: the most-severe axis drives, so exhausting the money OR\n * the time reserve steers/forces the agent — matching the design's \"judge on time and/or budget\".\n * `ok` when neither axis is measurable. */\nexport const decideBudget = (i: BudgetInputs): BudgetPhase => {\n const worst = [costAxis(i), timeAxis(i)]\n .filter((a): a is Axis => a !== null)\n .reduce<0 | 1 | 2>((max, a) => Math.max(max, axisSeverity(a, i.reserve)) as 0 | 1 | 2, 0);\n return worst === 2 ? { kind: \"hard\" } : worst === 1 ? { kind: \"soft\" } : { kind: \"ok\" };\n};\n\nconst pct = (n: number): string => `${String(Math.round(n * 100))}%`;\nconst money = (n: number): string => `$${n.toFixed(2)}`;\nconst mins = (ms: number): string => `${(ms / 60_000).toFixed(1)}m`;\n\nconst spendClause = (i: BudgetInputs): string | null =>\n i.spentUsd === null\n ? null\n : i.budgetUsd !== null && i.budgetUsd > 0\n ? `spent ${money(i.spentUsd)}/${money(i.budgetUsd)} (${pct(i.spentUsd / i.budgetUsd)})`\n : `spent ${money(i.spentUsd)}`;\n\nconst timeClause = (i: BudgetInputs): string | null =>\n i.elapsedMs === null\n ? null\n : i.wallMs !== null && i.wallMs > 0\n ? `${mins(i.elapsedMs)}/${mins(i.wallMs)} elapsed (${pct(i.elapsedMs / i.wallMs)})`\n : `${mins(i.elapsedMs)} elapsed`;\n\n// A subagent cannot write the draft (single-writer enforcement below), so it must be steered to\n// REPORT its findings back to the main agent — telling it to \"write the draft\" would contradict the\n// deny it is about to hit. The main agent gets the write-the-draft directive; since its subagents\n// run in the background (spawns are rewritten below), it is also told NOT to idle-wait on them —\n// the draft is written from what it already has, folding in late reports only if they arrive.\nconst directive = (\n phase: Exclude<BudgetPhase, { kind: \"ok\" }>,\n draftPath: string,\n isSubagent: boolean,\n): string => {\n if (isSubagent)\n return phase.kind === \"hard\"\n ? `Budget nearly exhausted — STOP all new investigation now and report the findings you have back to the main agent in your reply. Do not write ${draftPath} yourself; only the main agent writes it.`\n : `Wind down investigation and report the findings you have back to the main agent in your reply — do not write ${draftPath} yourself; the main agent writes it, and you may run out of budget otherwise.`;\n return phase.kind === \"hard\"\n ? `Budget nearly exhausted — STOP all new investigation now. Do not wait for subagents still running in the background. Write your COMPLETE findings from what you already have to ${draftPath} and run \\`code-review validate ${draftPath} --explain\\` until it passes (--explain prints the exact schema when the shape is wrong). Other tools are blocked until that draft is written.`\n : `Wind down investigation and write your COMPLETE findings to ${draftPath} now, then run \\`code-review validate ${draftPath} --explain\\` (it prints the exact schema if the shape is wrong) — fold in the subagent reports you already have rather than waiting on stragglers; you may run out of budget before you finish otherwise.`;\n};\n\n/** The steer/deny message: both budget axes, then the phase's directive. Shown to the agent as\n * PostToolBatch `additionalContext` (soft/hard) and as the PreToolUse deny reason (hard). A subagent\n * is steered to report to the main agent rather than to write the draft it cannot write. */\nexport const budgetMessage = (\n i: BudgetInputs,\n phase: Exclude<BudgetPhase, { kind: \"ok\" }>,\n draftPath: string,\n isSubagent: boolean,\n): string => {\n const status = [spendClause(i), timeClause(i)].filter((c): c is string => c !== null).join(\" · \");\n return `Budget check — ${status}. ${directive(phase, draftPath, isSubagent)}`;\n};\n\nconst invokesCodeReviewValidate = (toolInput: unknown): boolean => {\n const cmd = asRecord(toolInput)?.[\"command\"];\n // `validate` must not be a prefix of another subcommand — `\\b` alone matches before the hyphen in\n // `validate-patches` (a findings-mutating command that must NOT pass the gate), so exclude `-`/word.\n return typeof cmd === \"string\" && /\\bcode-review\\s+validate(?![\\w-])/.test(cmd);\n};\n\nconst SPAWN_TOOLS: ReadonlySet<string> = new Set([\"Agent\", \"Task\"]);\nconst WEB_TOOLS: ReadonlySet<string> = new Set([\"WebFetch\", \"WebSearch\"]);\n\n/** Under hard-phase forced convergence, block ONLY the tools that spend budget on new work —\n * subagent spawns (the #38 fan-out), arbitrary shell, and web calls — and allow everything else. A\n * denylist, not an allowlist: the tools that DELIVER the finished review (writing/validating the\n * draft, and whatever terminal tool the agent uses to return its answer) must never be blocked from\n * finishing — a live dogfood showed an allowlist denying the answer tool and stranding a complete\n * draft (issue #38). `Bash` is the one carve-out, permitted solely to run `code-review validate`. */\nexport const blockedDuringConvergence = (toolName: string, toolInput: unknown): boolean => {\n if (SPAWN_TOOLS.has(toolName) || WEB_TOOLS.has(toolName)) return true;\n if (toolName === \"Bash\") return !invokesCodeReviewValidate(toolInput);\n return false;\n};\n\nconst escapeRegExp = (s: string): string => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\nconst WRITE_TOOLS: ReadonlySet<string> = new Set([\"Write\", \"Edit\", \"MultiEdit\", \"NotebookEdit\"]);\n\n/** Does this tool call WRITE to the findings draft? A file-writing tool targeting the path\n * (Write/Edit/MultiEdit via `file_path`, NotebookEdit via `notebook_path`), or a Bash redirect\n * (`>`, `>>`, `>|`, including a heredoc's leading `>`) or a `tee` whose file argument is the draft.\n * Reads (`cat`, `code-review validate`) are deliberately NOT matched — only mutation races the\n * single writer. The path is matched as a whole argument (end-anchored, so `<draft>.bak` is not a\n * hit) against the absolute path, its basename, and the literal `$DRAFT`/`${DRAFT}` token, since a\n * fan-out agent reaches the file by any of those. Scoped to the accidental fan-out race — not an\n * adversarial evasion model, so obscure copy vectors (`cp`/`mv`/`dd`) are out of scope. */\nexport const writesToDraft = (toolName: string, toolInput: unknown, draftPath: string): boolean => {\n const rec = asRecord(toolInput);\n const targets = [draftPath, basename(draftPath), \"$DRAFT\", \"${DRAFT}\"];\n if (WRITE_TOOLS.has(toolName)) {\n const fp = rec?.[\"file_path\"] ?? rec?.[\"notebook_path\"];\n if (typeof fp === \"string\" && targets.some((t) => fp === t || basename(fp) === basename(t)))\n return true;\n }\n if (toolName === \"Bash\") {\n const cmd = rec?.[\"command\"];\n if (typeof cmd !== \"string\") return false;\n const alt = targets.map(escapeRegExp).join(\"|\");\n const end = \"(?=$|[\\\\s|&;)])\"; // the path must be a whole token, not a prefix of a longer one\n const redirect = new RegExp(`>>?\\\\|?\\\\s*(['\"]?)(?:${alt})\\\\1${end}`);\n const teeArg = new RegExp(`\\\\btee\\\\b(?:\\\\s+-{1,2}\\\\S+)*\\\\s+(['\"]?)(?:${alt})\\\\1${end}`);\n return redirect.test(cmd) || teeArg.test(cmd);\n }\n return false;\n};\n\n/** The deny reason shown to a fan-out subagent that tries to write the draft. Agent-facing text — keep\n * it free of internal metadata (issue numbers, refs); it ships to every user's review. */\nexport const singleWriterMessage = (draftPath: string): string =>\n `Only the main agent may write ${draftPath}. When a subagent writes it too, the concurrent writers clobber each other and the review comes out empty. Do NOT write, edit, or redirect into ${draftPath} — instead, return the findings you discovered in your reply (the field names are in the schema); the main agent collects every subagent's reported findings and writes the draft itself.`;\n\n/** The sidecar `seed-draft` writes right AFTER the seed, so the marker's mtime bounds the seed's:\n * a draft mtime beyond the marker's means the agent itself has written the draft this run, while\n * mtime ≤ marker means the draft is still the untouched seed. The convention is shared between\n * seed-draft (producer) and budget-hook (consumer) through this one function. */\nexport const seedMarkerPath = (draftPath: string): string => `${draftPath}.seed`;\n\n/** Has the MAIN agent written its own draft this run? True only when the draft exists AND was\n * modified after the seed marker (no marker — no seeding ran — means any existing draft counts).\n * mtime, not content, so a rewrite that happens to reproduce the seed bytes still counts. */\nexport const mainHasWrittenDraft = (\n draftMtimeMs: number | null,\n seedMarkerMtimeMs: number | null,\n): boolean =>\n draftMtimeMs !== null && (seedMarkerMtimeMs === null || draftMtimeMs > seedMarkerMtimeMs);\n\n/** The deny reason when the main agent tries to fan out before writing its own first-pass draft.\n * Agent-facing text — no internal metadata. */\nexport const spawnFloorMessage = (draftPath: string): string =>\n `Write your own first-pass findings to ${draftPath} before spawning subagents — a review must never depend on subagents alone, and a pre-seeded draft does not count until you have revised it yourself this run. Write ${draftPath} from what you have read so far (preliminary findings are fine), run \\`code-review validate ${draftPath} --explain\\` until it passes, then fan out; your subagents run in the background, so keep refining the draft as their reports arrive.`;\n\n/** Rewrite a subagent spawn to run in the BACKGROUND (allow + updatedInput): the spawn returns\n * immediately and completions arrive as notifications, so the main agent keeps taking turns —\n * every turn a steer/deny surface — and can write/refine the draft during the fan-out. Without\n * this, a batch of parallel spawns blocks the main agent on the join with NO tool calls, where\n * no hook can reach it, and one stalled subagent holds the whole review until the hard kill. */\nexport const forceBackgroundSpawn = (toolInput: unknown): Record<string, unknown> => ({\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\",\n permissionDecision: \"allow\",\n updatedInput: { ...(asRecord(toolInput) ?? {}), run_in_background: true },\n },\n});\n\n/** Everything the hook needs beyond the raw hook input: the measured spend/elapsed (gathered by the\n * CLI from the transcript + clock) and the limits/draft from the wired flags. */\nexport interface BudgetParams {\n readonly spentUsd: number | null;\n readonly budgetUsd: number | null;\n readonly elapsedMs: number | null;\n readonly wallMs: number | null;\n readonly reserve: ReserveParams;\n readonly draftPath: string;\n readonly mainDraftWritten: boolean;\n}\n\nconst denyPreTool = (reason: string): Record<string, unknown> => ({\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\",\n permissionDecision: \"deny\",\n permissionDecisionReason: reason,\n },\n});\n\n/** Decide the hook output from the raw hook input + measured params, self-dispatching on the\n * `hook_event_name` the input carries. Returns the exact object to print: `{}` is the universal\n * no-op (allow / no steer). Pure — the CLI feeds it `params` and prints the result verbatim. */\nexport const evaluateBudgetHook = (\n input: unknown,\n params: BudgetParams,\n): Record<string, unknown> => {\n const rec = asRecord(input);\n const inputs: BudgetInputs = {\n spentUsd: params.spentUsd,\n budgetUsd: params.budgetUsd,\n elapsedMs: params.elapsedMs,\n wallMs: params.wallMs,\n reserve: params.reserve,\n };\n const phase = decideBudget(inputs);\n const agentId = rec?.[\"agent_id\"];\n const isSubagent = typeof agentId === \"string\" && agentId.length > 0;\n\n switch (rec?.[\"hook_event_name\"]) {\n case \"PostToolBatch\":\n return phase.kind === \"ok\"\n ? {}\n : {\n hookSpecificOutput: {\n hookEventName: \"PostToolBatch\",\n additionalContext: budgetMessage(inputs, phase, params.draftPath, isSubagent),\n },\n };\n case \"PreToolUse\": {\n const toolName = rec[\"tool_name\"];\n if (typeof toolName !== \"string\") return {};\n // Single-writer enforcement, independent of budget phase: a fan-out subagent (`agent_id`\n // present; the main agent's input has none) must never write $DRAFT — concurrent writers race\n // and clobber it, which has produced empty reviews. The main agent alone writes the draft, from\n // the findings its subagents report back in their replies.\n if (isSubagent && writesToDraft(toolName, rec[\"tool_input\"], params.draftPath))\n return denyPreTool(singleWriterMessage(params.draftPath));\n if (phase.kind === \"hard\" && blockedDuringConvergence(toolName, rec[\"tool_input\"]))\n return denyPreTool(budgetMessage(inputs, phase, params.draftPath, isSubagent));\n // Spawns are never allowed to block: below hard, the main agent may fan out only once its own\n // first-pass draft exists (the seed alone does not count), and every spawn — main's or a\n // subagent's — is rewritten to run in the background so no batch join can freeze the spawner.\n if (SPAWN_TOOLS.has(toolName)) {\n if (!isSubagent && !params.mainDraftWritten)\n return denyPreTool(spawnFloorMessage(params.draftPath));\n return forceBackgroundSpawn(rec[\"tool_input\"]);\n }\n return {};\n }\n default:\n return {};\n }\n};\n\n/** Parse a wall-clock duration (`20m`, `1200s`, `2h`, `500ms`, or a bare number of seconds — matching\n * the `timeout` convention the review job already uses). Null when unparseable, so the caller drops\n * the time axis rather than trusting a garbage limit. */\nexport const parseWallMs = (raw: string): number | null => {\n const m = /^(\\d+(?:\\.\\d+)?)(ms|s|m|h)?$/.exec(raw.trim());\n if (m === null) return null;\n const [, num = \"\", unit = \"s\"] = m;\n const n = Number.parseFloat(num);\n if (!Number.isFinite(n)) return null;\n switch (unit) {\n case \"ms\":\n return n;\n case \"s\":\n return n * 1000;\n case \"m\":\n return n * 60_000;\n default:\n return n * 3_600_000;\n }\n};\n\n/** Parse a Unix epoch-SECONDS anchor (as `date +%s` prints it, and as `deadline` emits) to epoch ms;\n * null when unset or not a bare positive integer, so the caller falls back to the per-transcript\n * start rather than trusting a garbage anchor. */\nexport const parseEpochSecMs = (raw: string | undefined): number | null => {\n if (raw === undefined) return null;\n const t = raw.trim();\n if (!/^\\d+$/.test(t)) return null;\n const n = Number.parseInt(t, 10);\n return Number.isFinite(n) && n > 0 ? n * 1000 : null;\n};\n\n/** The elapsed wall-clock to judge the time axis on, from the most reliable source available. Prefers\n * the ABSOLUTE anchor — a fixed run deadline (epoch ms) shared across every hook process — computed\n * as `wall − (deadline − now)`; the per-transcript first timestamp (`firstTsMs`) is only the fallback\n * because inside a freshly-spawned subagent it reads ≈0, so during the skill's parallel fan-out the\n * budget hooks stay blind and never steer (issue #45). Falls back to the transcript start when no\n * anchor is set (manual/local runs), then to null when neither is knowable (time axis disabled).\n * Clamped to ≥ 0 — a passed deadline or clock skew reads as fully elapsed, never negative. */\nexport const anchoredElapsedMs = (src: {\n readonly deadlineMs: number | null;\n readonly wallMs: number | null;\n readonly firstTsMs: number | null;\n readonly nowMs: number;\n}): number | null => {\n if (src.deadlineMs !== null && src.wallMs !== null)\n return Math.max(0, src.wallMs - (src.deadlineMs - src.nowMs));\n if (src.firstTsMs !== null) return Math.max(0, src.nowMs - src.firstTsMs);\n return null;\n};\n\n/** The epoch-SECONDS deadline for a `wallMs` run starting now — what the review job exports as\n * `DEADLINE_ENV`. The wall is rounded UP to whole seconds so the anchor never expires before the\n * matching `timeout` kill. */\nexport const deadlineEpochSec = (wallMs: number, nowMs: number): number =>\n Math.floor(nowMs / 1000) + Math.ceil(wallMs / 1000);\n\n/** Parse a fraction in [0, 1]; fall back to `fallback` on anything unparseable or out of range. `0`\n * is valid and meaningful — it disables the fraction part of the reserve so only the flat floor\n * applies. A malformed flag never inverts the gate; it just uses the default. */\nexport const parseFraction = (raw: string | undefined, fallback: number): number => {\n if (raw === undefined) return fallback;\n const n = Number.parseFloat(raw);\n return Number.isFinite(n) && n >= 0 && n <= 1 ? n : fallback;\n};\n\n/** The default budget-hook command: this CLI re-invoked, carrying the limits so the hook decides\n * exactly as the caller intended. The SAME string is wired to both PreToolUse and PostToolBatch —\n * it self-dispatches on the event it reads from stdin. */\nexport const budgetHookCommand = (\n draftPath: string,\n opts: {\n readonly budgetUsd?: string;\n readonly wall?: string;\n readonly prices?: string;\n readonly reserveFrac?: string;\n readonly reserveGrowth?: string;\n readonly reserveUsd?: string;\n readonly reserveWall?: string;\n },\n): string =>\n [\n \"code-review budget-hook --draft\",\n shellQuote(draftPath),\n ...(opts.budgetUsd ? [\"--budget-usd\", shellQuote(opts.budgetUsd)] : []),\n ...(opts.wall ? [\"--wall\", shellQuote(opts.wall)] : []),\n ...(opts.prices ? [\"--prices\", shellQuote(opts.prices)] : []),\n ...(opts.reserveFrac ? [\"--reserve-frac\", shellQuote(opts.reserveFrac)] : []),\n ...(opts.reserveGrowth ? [\"--reserve-growth\", shellQuote(opts.reserveGrowth)] : []),\n ...(opts.reserveUsd ? [\"--reserve-usd\", shellQuote(opts.reserveUsd)] : []),\n ...(opts.reserveWall ? [\"--reserve-wall\", shellQuote(opts.reserveWall)] : []),\n ].join(\" \");\n","// Conservative markdown formatting pass applied just before a comment/review body is posted, plus\n// small pure formatting helpers for the IO boundary (e.g. the sticky's posted-at timestamp).\n// Pure string transform: never reflows content, never touches fenced code blocks (a `suggestion`\n// block's blank lines and trailing whitespace are significant and must survive verbatim).\n\ninterface ScanState {\n readonly lines: readonly string[];\n readonly inFence: boolean;\n readonly blankRun: number;\n}\n\nconst FENCE_RE = /^\\s*```/;\n\nconst scanLine = (state: ScanState, line: string): ScanState => {\n if (FENCE_RE.test(line)) {\n return { lines: [...state.lines, line], inFence: !state.inFence, blankRun: 0 };\n }\n if (state.inFence) {\n return { lines: [...state.lines, line], inFence: true, blankRun: 0 };\n }\n const trimmed = line.replace(/[ \\t]+$/, \"\");\n if (trimmed !== \"\") {\n return { lines: [...state.lines, trimmed], inFence: false, blankRun: 0 };\n }\n const blankRun = state.blankRun + 1;\n return blankRun === 1\n ? { lines: [...state.lines, \"\"], inFence: false, blankRun }\n : { ...state, blankRun };\n};\n\n/** Trim trailing whitespace and collapse runs of 2+ blank lines to one — never to zero — leaving\n * exactly one trailing newline. Fenced (```) content passes through untouched. */\nexport const formatMarkdown = (md: string): string => {\n const { lines } = md\n .split(\"\\n\")\n .reduce<ScanState>(scanLine, { lines: [], inFence: false, blankRun: 0 });\n return `${lines.join(\"\\n\").replace(/\\n+$/, \"\")}\\n`;\n};\n\nconst pad2 = (n: number): string => String(n).padStart(2, \"0\");\n\n/** Format a Date as UTC `YYYY-MM-DD HH:MM UTC`, for the sticky's \"**Reviewed** `<sha>` at\n * <postedAt>\" meta segment (issue #28). Computed at the IO boundary (index.ts's post/render\n * commands) — `render()` itself stays pure/clockless and just receives the formatted string. */\nexport const formatUtc = (d: Date): string =>\n `${String(d.getUTCFullYear())}-${pad2(d.getUTCMonth() + 1)}-${pad2(d.getUTCDate())} ${pad2(d.getUTCHours())}:${pad2(d.getUTCMinutes())} UTC`;\n","// Version-aware schema registry: maps each schema kind's supported major.minor(s) to a bundled\n// schema file, io-ts codec, and upcast normalizer (identity for every entry today). Findings is a\n// single current minor (0.4): the 0.4 shape REQUIRES `reasoning`/`confidence`, which cannot be\n// honestly upcast from a 0.2/0.3 document (a confidence score cannot be fabricated), so those older\n// minors are dropped from the table and now degrade to the §5.5 unsupported-version notice.\n// `resolve` is pure (no IO); `schemaPathFor` only computes a path string from the tables below.\n//\n// This module imports from schema.ts (codecs, DEFAULT_SCHEMA_VERSION), never the reverse — schema.ts\n// stays a dependency-free leaf so the registry can compose it without an import cycle.\n//\n// Bundled schema files resolve relative to the installed package exactly like index.ts's\n// bundledPath: tsup bundles this module into the same dist/index.js as index.ts, so\n// import.meta.dirname here resolves identically at runtime, in dev, and from the published package.\n\nimport { resolve as resolvePath } from \"node:path\";\nimport type { Decoder, Encoder, Errors, ValidationError } from \"io-ts\";\nimport { FindingsCodec, TriageCodec, PriceMapCodec, DEFAULT_SCHEMA_VERSION } from \"./schema.js\";\nimport type { Findings, Triage, PriceMap } from \"./schema.js\";\n\nexport type SchemaKind = \"findings\" | \"triage\" | \"prices\";\n\nexport interface DecodedFor {\n readonly findings: Findings;\n readonly triage: Triage;\n readonly prices: PriceMap;\n}\n\ninterface VersionEntry<K extends SchemaKind, A> {\n /** major.minor of `schema_version` this entry dispatches on; patch is ignored. */\n readonly minor: string;\n /** full semver stamped when a document omits `schema_version` (findings) or reported as the\n * resolved version for kinds with no in-data signal (triage, prices). */\n readonly defaultVersion: string;\n /** path relative to schema/: flat name for the latest entry, \"v<minor>/…\" once frozen. */\n readonly schemaFile: string;\n readonly codec: Decoder<unknown, A> & Encoder<A, unknown>;\n /** upcast to the latest shape for this kind; identity when the codec already accepts both\n * shapes (e.g. an additive minor whose new field is optional). */\n readonly normalize: (decoded: A) => DecodedFor[K];\n readonly latest: boolean;\n}\n\nexport type Resolution<K extends SchemaKind> =\n | { readonly kind: \"ok\"; readonly version: string; readonly value: DecodedFor[K] }\n | {\n readonly kind: \"unsupported-version\";\n readonly version: string;\n readonly supported: readonly string[];\n }\n | { readonly kind: \"invalid-shape\"; readonly errors: readonly string[] }\n | { readonly kind: \"missing-version\" }; // findings only; triage/prices never return this\n\nconst identity = <A>(decoded: A): A => decoded;\n\nconst findingsTable: readonly VersionEntry<\"findings\", Findings>[] = [\n {\n minor: \"0.4\",\n defaultVersion: DEFAULT_SCHEMA_VERSION,\n schemaFile: \"findings.schema.json\",\n codec: FindingsCodec,\n normalize: identity,\n latest: true,\n },\n];\n\nconst triageTable: readonly VersionEntry<\"triage\", Triage>[] = [\n {\n minor: \"0.1\",\n defaultVersion: \"0.1.0\",\n schemaFile: \"triage.schema.json\",\n codec: TriageCodec,\n normalize: identity,\n latest: true,\n },\n];\n\nconst pricesTable: readonly VersionEntry<\"prices\", PriceMap>[] = [\n {\n minor: \"0.1\",\n defaultVersion: \"0.1.0\",\n schemaFile: \"prices.schema.json\",\n codec: PriceMapCodec,\n normalize: identity,\n latest: true,\n },\n];\n\ntype Table<K extends SchemaKind> = readonly VersionEntry<K, DecodedFor[K]>[];\n\nconst tables: { readonly [K in SchemaKind]: Table<K> } = {\n findings: findingsTable,\n triage: triageTable,\n prices: pricesTable,\n};\n\nconst tableFor = <K extends SchemaKind>(kind: K): Table<K> => tables[kind];\n\n/** major.minor of a semver-ish string; dispatch ignores patch and any prerelease/build suffix. */\nconst majorMinor = (version: string): string => version.split(\".\").slice(0, 2).join(\".\");\n\nconst describeValidationError = (e: ValidationError): string => {\n const path = e.context\n .map((entry) => entry.key)\n .filter((key) => key.length > 0)\n .join(\".\");\n return e.message ?? `${path || \"(root)\"}: invalid value ${JSON.stringify(e.value)}`;\n};\n\nconst formatErrors = (errors: Errors): readonly string[] => errors.map(describeValidationError);\n\n/** The declared `schema_version` of a raw document, when present as a string. */\nexport const declaredVersion = (raw: unknown): string | undefined =>\n typeof raw === \"object\" && raw !== null && \"schema_version\" in raw\n ? typeof raw.schema_version === \"string\"\n ? raw.schema_version\n : undefined\n : undefined;\n\nexport const supportedVersions = (kind: SchemaKind): readonly string[] =>\n tableFor(kind).map((entry) => entry.minor);\n\nexport const defaultVersion = (kind: SchemaKind): string => {\n const latest = tableFor(kind).find((entry) => entry.latest);\n if (!latest) throw new Error(`Registry invariant violated — no latest entry for \"${kind}\"`);\n return latest.defaultVersion;\n};\n\nconst bundledSchemaPath = (relativePath: string): string =>\n resolvePath(import.meta.dirname, \"..\", \"schema\", relativePath);\n\n/** Resolve the bundled schema path for a kind + optional version; no version → flat latest file. */\nexport const schemaPathFor = (kind: SchemaKind, version?: string): string => {\n const table = tableFor(kind);\n const entry =\n version === undefined\n ? table.find((v) => v.latest)\n : table.find((v) => v.minor === majorMinor(version));\n if (!entry) {\n throw new Error(\n `Unsupported ${kind} schema version \"${version ?? \"\"}\" — supported: ${supportedVersions(kind).join(\", \")}`,\n );\n }\n return bundledSchemaPath(entry.schemaFile);\n};\n\nconst resolveFindings = (raw: unknown): Resolution<\"findings\"> => {\n const version = declaredVersion(raw);\n if (version === undefined) return { kind: \"missing-version\" };\n const entry = findingsTable.find((v) => v.minor === majorMinor(version));\n if (!entry) {\n return { kind: \"unsupported-version\", version, supported: supportedVersions(\"findings\") };\n }\n const decoded = entry.codec.decode(raw);\n return decoded._tag === \"Left\"\n ? { kind: \"invalid-shape\", errors: formatErrors(decoded.left) }\n : { kind: \"ok\", version, value: entry.normalize(decoded.right) };\n};\n\n/** Resolve a kind with no in-data version signal — a single bundled entry, never \"missing-version\". */\nconst resolveSingleVersion = <K extends \"triage\" | \"prices\">(\n kind: K,\n raw: unknown,\n): Resolution<K> => {\n const entry = tableFor(kind)[0];\n if (!entry) throw new Error(`Registry invariant violated — no entry for \"${kind}\"`);\n const decoded = entry.codec.decode(raw);\n return decoded._tag === \"Left\"\n ? { kind: \"invalid-shape\", errors: formatErrors(decoded.left) }\n : { kind: \"ok\", version: entry.defaultVersion, value: entry.normalize(decoded.right) };\n};\n\nconst resolvers: { readonly [K in SchemaKind]: (raw: unknown) => Resolution<K> } = {\n findings: resolveFindings,\n triage: (raw) => resolveSingleVersion(\"triage\", raw),\n prices: (raw) => resolveSingleVersion(\"prices\", raw),\n};\n\n/** Decode + version-dispatch a raw document for a schema kind. Pure — no IO. */\nexport const resolve = <K extends SchemaKind>(kind: K, raw: unknown): Resolution<K> =>\n resolvers[kind](raw);\n","// The `gh api` effect: the single shell boundary for GitHub API calls. Pure callers inject a\n// fake; the default implementation shells out to the `gh` CLI (auth via GH_TOKEN in the env).\n\nimport { execFile } from \"node:child_process\";\n\n/** Signature of the `gh api` effect. Default implementation shells out to the `gh` CLI. */\nexport type GhApi = (\n args: readonly string[],\n stdin?: string,\n env?: Readonly<Record<string, string>>,\n) => Promise<string>;\n\n/** Default effect: execFile gh. Extra `env` merges over process.env for this call only —\n * used to pass untrusted values (bot login, marker) to jq via `env.NAME`, never interpolated\n * into the filter text (SPEC §5.4). */\nexport const runGhApi: GhApi = (args, stdin, env) =>\n new Promise<string>((resolve, reject) => {\n const child = execFile(\n \"gh\",\n [\"api\", ...args],\n { env: { ...process.env, ...env }, encoding: \"utf-8\", maxBuffer: 100 * 1024 * 1024 },\n (err, stdout, stderr) => {\n if (err) {\n const stderrStr = typeof stderr === \"string\" && stderr.trim() ? stderr.trim() : \"\";\n const errStr = err instanceof Error ? err.message : \"unknown error\";\n reject(new Error(`gh api failed: ${stderrStr || errStr}`));\n } else {\n resolve(stdout);\n }\n },\n );\n if (stdin !== undefined) {\n child.stdin?.end(stdin);\n }\n });\n","// PR resolution + diff fetch, shared by `post` (comment job) and `gather` (review job). Both jobs\n// resolve independently (separate runners), but from the SAME pure logic, so they never disagree on\n// which PR (SPEC §8.3 — avoid split-brain). PR resolution is a single read, never jq-interpolated.\n\nimport type { GhApi } from \"./gh.js\";\n\ninterface PrCandidate {\n readonly number: number;\n readonly state: string;\n readonly headRef: string;\n}\n\nexport const fetchPrCandidates = async (\n repo: string,\n headSha: string,\n ghApi: GhApi,\n): Promise<readonly PrCandidate[]> => {\n const stdout = await ghApi([\n `repos/${repo}/commits/${headSha}/pulls`,\n \"--jq\",\n \".[] | {number: .number, state: .state, headRef: .head.ref}\",\n ]);\n return stdout\n .trim()\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => JSON.parse(line) as PrCandidate);\n};\n\nexport type PrResolution =\n | { readonly kind: \"none\" }\n | { readonly kind: \"not-open\"; readonly prNumber: number; readonly state: string }\n | { readonly kind: \"open\"; readonly prNumber: number };\n\n/** Resolve which PR to act on. Disambiguates by head branch (pure); never shells out. */\nexport const resolvePr = (\n candidates: readonly PrCandidate[],\n headBranch: string | undefined,\n): PrResolution => {\n if (candidates.length === 0) return { kind: \"none\" };\n const scoped =\n candidates.length > 1 && headBranch\n ? candidates.filter((c) => c.headRef === headBranch)\n : candidates;\n const chosen = scoped[0] ?? candidates[0];\n if (chosen === undefined) return { kind: \"none\" };\n return chosen.state === \"open\"\n ? { kind: \"open\", prNumber: chosen.number }\n : { kind: \"not-open\", prNumber: chosen.number, state: chosen.state };\n};\n\nexport const fetchDiff = async (repo: string, prNumber: number, ghApi: GhApi): Promise<string> =>\n ghApi([\n `repos/${repo}/pulls/${String(prNumber)}`,\n \"-H\",\n \"Accept: application/vnd.github.v3.diff\",\n ]);\n","// Deterministic GH posting: resolve PR, fetch diff, run inline, post inline review,\n// render summary, upsert sticky comment. Pure core with a thin gh-api effect.\n//\n// Ordering (CO-R3): all reads, decodes, diff validation, and rendering complete before\n// the first API write; then the sticky is posted, and the inline review second. A posting\n// failure propagates and exits the process non-zero (never partially posts).\n\nimport { readFileSync } from \"node:fs\";\nimport type { InlineComment, InlineDisposition, RenderInput } from \"./types.js\";\nimport { buildInlineComments } from \"./inline.js\";\nimport { isEmptyDiff } from \"./diff.js\";\nimport { render, computeSeverityCounts } from \"./render.js\";\nimport { formatMarkdown } from \"./format.js\";\nimport { findingsPointer, reviewBodyPointer } from \"./surface.js\";\nimport { ResultEnvelopeCodec, PriceMapCodec, TestSummaryCodec, noticeFindings } from \"./schema.js\";\nimport type { Finding, Findings, ResultEnvelope, TestSummary } from \"./schema.js\";\nimport { resolve, supportedVersions } from \"./registry.js\";\nimport type { GhApi } from \"./gh.js\";\nimport { runGhApi } from \"./gh.js\";\nexport type { GhApi } from \"./gh.js\";\nimport { fetchDiff, fetchPrCandidates, resolvePr } from \"./pr.js\";\n\nexport interface PostInput {\n readonly repo: string;\n readonly headSha: string;\n readonly botLogin: string;\n readonly findingsPath: string;\n readonly envelopePath: string;\n readonly pricesPath: string;\n /** Whether `pricesPath` is a real caller-supplied price map or the bundled all-zero example\n * standing in for an absent one — threaded to the render layer so cost shows N/A, not a false\n * $0.00, when absent (SPEC §6.2). */\n readonly pricesProvided: boolean;\n readonly templatePath: string;\n readonly inlineTemplatePath: string;\n /** Overrides the envelope's route (SPEC §6.1) when set; otherwise the envelope is the source. */\n readonly route?: string;\n readonly headBranch?: string;\n readonly testReportPath?: string;\n readonly effort?: string;\n /** Workflow run URL, threaded into the sticky's LLM Disclosure aside (SPEC §5.1 item 6). */\n readonly runUrl?: string;\n /** Findings-json artifact URL — the marker's fallback on every surface (sticky, each inline\n * comment, and the review body itself) when the embedded form is too large (SPEC §5.1 item 7,\n * §5.2, issue #19). */\n readonly jsonUrl?: string;\n /** Preformatted UTC post time, leading the sticky's \"**Reviewed** `<sha>` at <postedAt>\" meta\n * segment (issue #28) — computed by the caller (index.ts's post command) via `formatUtc`, not here,\n * so `post()` stays a thin, testable pass-through of the timestamp into `render()`. */\n readonly postedAt?: string;\n}\n\nconst DEFAULT_MARKER = \"<!-- code-review -->\";\nconst MAX_SUGGESTION_LINES = 10;\n\n/** Count lines in a suggestion string (empty suggestion \"\" = 1 line — delete range). */\nconst countSuggestionLines = (text: string): number => text.split(\"\\n\").length;\n\n/** Extract and check suggestion blocks in a comment body, stripping those that are too long. */\nconst checkLongSuggestions = (\n comments: readonly InlineComment[],\n): { readonly comments: readonly InlineComment[]; readonly longFiles: readonly string[] } => {\n const longFiles: string[] = [];\n const adjusted = comments.map((c) => {\n const match = /```suggestion\\n([\\s\\S]*?)\\n```/.exec(c.body);\n if (match?.[1] && countSuggestionLines(match[1]) > MAX_SUGGESTION_LINES) {\n longFiles.push(`${c.path}:${String(c.line)}`);\n return {\n ...c,\n body: c.body.replace(\n /```suggestion\\n[\\s\\S]*?\\n```/,\n \"*(suggestion omitted — exceeds GitHub's ~10-line suggestion limit; see summary)*\",\n ),\n };\n }\n return c;\n });\n return { comments: adjusted, longFiles };\n};\n\n// Loaders below never throw on untrusted artifacts (SPEC §5.5) — malformed input degrades to a\n// tagged result the caller renders as a notice, rather than crashing the post.\ntype FindingsLoadResult =\n | { readonly kind: \"ok\"; readonly findings: Findings }\n | { readonly kind: \"corrupt\" }\n | { readonly kind: \"invalid-shape\" }\n | { readonly kind: \"unsupported-schema-version\"; readonly version: string };\n\nconst loadFindings = (path: string): FindingsLoadResult => {\n let raw: unknown;\n try {\n raw = JSON.parse(readFileSync(path, \"utf-8\")) as unknown;\n } catch {\n return { kind: \"corrupt\" };\n }\n const resolution = resolve(\"findings\", raw);\n switch (resolution.kind) {\n case \"ok\":\n return { kind: \"ok\", findings: resolution.value };\n case \"unsupported-version\":\n return { kind: \"unsupported-schema-version\", version: resolution.version };\n case \"invalid-shape\":\n case \"missing-version\":\n return { kind: \"invalid-shape\" };\n }\n};\n\nconst noticeMessageFor = (result: Exclude<FindingsLoadResult, { kind: \"ok\" }>): string => {\n switch (result.kind) {\n case \"corrupt\":\n return \"Review output was missing or malformed — the review did not complete. See the workflow run for logs.\";\n case \"invalid-shape\":\n return \"Review output was malformed — it did not conform to the findings schema. See the workflow run for logs.\";\n case \"unsupported-schema-version\": {\n const supported = supportedVersions(\"findings\")\n .map((minor) => `${minor}.x`)\n .join(\", \");\n return `Review output declares schema_version \"${result.version}\", which this commenter does not support (supported: ${supported}). See the workflow run for logs.`;\n }\n }\n};\n\n/** Load the result envelope; null on any read/decode failure (SPEC §5.5 — degrade, never crash). */\nconst loadEnvelope = (path: string): ResultEnvelope | null => {\n let raw: unknown;\n try {\n raw = JSON.parse(readFileSync(path, \"utf-8\")) as unknown;\n } catch {\n return null;\n }\n const decoded = ResultEnvelopeCodec.decode(raw);\n return decoded._tag === \"Right\" ? decoded.right : null;\n};\n\n/** Load an optional test report; undefined (and a warning) on any read/decode failure — REQ-CO-9\n * enrichment is optional and MUST degrade gracefully, never abort the post. */\nconst loadTestReport = (path: string): TestSummary | undefined => {\n let raw: unknown;\n try {\n raw = JSON.parse(readFileSync(path, \"utf-8\")) as unknown;\n } catch (err) {\n process.stderr.write(\n `Warning: could not read test report at ${path}: ${err instanceof Error ? err.message : String(err)} — omitting test panel\\n`,\n );\n return undefined;\n }\n const decoded = TestSummaryCodec.decode(raw);\n if (decoded._tag === \"Left\") {\n process.stderr.write(\n `Warning: test report at ${path} does not match the expected shape — omitting test panel\\n`,\n );\n return undefined;\n }\n return decoded.right;\n};\n\n/** Parse an `html_url` field out of a `gh api` JSON response; a malformed or unexpected response\n * degrades to undefined rather than throwing — a missing link must never fail the post (§5.5). */\nconst parseHtmlUrl = (raw: string): string | undefined => {\n try {\n const parsed = JSON.parse(raw) as { html_url?: unknown };\n return typeof parsed.html_url === \"string\" ? parsed.html_url : undefined;\n } catch {\n return undefined;\n }\n};\n\n/** A single comment's position payload, shared by the batched review POST and the per-comment\n * salvage POST below. */\nconst commentPayload = (c: InlineComment): Record<string, unknown> => ({\n path: c.path,\n line: c.line,\n side: c.side,\n ...(c.start_line !== undefined && c.start_side !== undefined\n ? { start_line: c.start_line, start_side: c.start_side }\n : {}),\n body: formatMarkdown(c.body),\n});\n\n/** Post the inline review, pointing its body at the sticky (issue #11) when the sticky's URL is\n * known, and prepending the precomputed findings-json marker (issue #19) so the review body carries\n * it too. `comments[i]` is the rendered comment for finding `inDiff[i]` (1:1, same order). Returns\n * the review's `html_url` (undefined on a malformed response), how many inline comments actually\n * posted, and the findings whose comment GitHub rejected — so the caller can surface exactly those\n * in the sticky (issue #57) and keep the disposition count truthful (issue #21). */\nconst postInlineReview = async (\n repo: string,\n prNumber: number,\n headSha: string,\n comments: readonly InlineComment[],\n inDiff: readonly Finding[],\n stickyUrl: string | undefined,\n marker: string,\n ghApi: GhApi,\n): Promise<{\n readonly url: string | undefined;\n readonly inlinePosted: number;\n readonly unposted: readonly Finding[];\n}> => {\n const pointer = reviewBodyPointer(headSha, stickyUrl, marker);\n const reviewBody = (withComments: boolean): string =>\n JSON.stringify({\n body: pointer,\n commit_id: headSha,\n event: \"COMMENT\",\n comments: withComments ? comments.map(commentPayload) : [],\n });\n const reviewsEndpoint = [`repos/${repo}/pulls/${String(prNumber)}/reviews`, \"--input\", \"-\"];\n try {\n const stdout = await ghApi(reviewsEndpoint, reviewBody(true));\n return { url: parseHtmlUrl(stdout), inlinePosted: comments.length, unposted: [] };\n } catch (err) {\n // The reviews endpoint is atomic: one comment on a position GitHub won't accept rejects the WHOLE\n // batch (issue #57). Rather than fail the job — or drop every comment — post the review body-only\n // (so the event + findings marker exist) and then re-post each comment individually, keeping the\n // ones GitHub accepts and collecting the finding behind each one it rejects for the caller to\n // surface in the sticky. Degrade, never crash (§5.5). A body-only review that itself fails\n // (comments.length === 0) is a genuine error and propagates.\n if (comments.length === 0) throw err;\n process.stderr.write(\n `Warning: the batched inline review on PR #${String(prNumber)} was rejected (${err instanceof Error ? err.message : String(err)}) — posting the review body-only, then each comment individually to keep the ones GitHub accepts (issue #57)\\n`,\n );\n const url = parseHtmlUrl(await ghApi(reviewsEndpoint, reviewBody(false)));\n const commentsEndpoint = [`repos/${repo}/pulls/${String(prNumber)}/comments`, \"--input\", \"-\"];\n const unposted: Finding[] = [];\n let inlinePosted = 0;\n for (const [i, c] of comments.entries()) {\n try {\n await ghApi(commentsEndpoint, JSON.stringify({ commit_id: headSha, ...commentPayload(c) }));\n inlinePosted += 1;\n } catch (e) {\n const finding = inDiff[i];\n if (finding) unposted.push(finding);\n process.stderr.write(\n `Warning: inline comment on ${c.path}:${String(c.line)} rejected (${e instanceof Error ? e.message : String(e)}) — surfacing that finding in the sticky instead (issue #57)\\n`,\n );\n }\n }\n return { url, inlinePosted, unposted };\n }\n};\n\nconst findBotComment = async (\n repo: string,\n prNumber: number,\n botLogin: string,\n marker: string,\n ghApi: GhApi,\n): Promise<{ readonly id: number; readonly body: string } | null> => {\n const stdout = await ghApi(\n [\n `repos/${repo}/issues/${String(prNumber)}/comments`,\n \"--paginate\",\n \"--jq\",\n \".[] | select(.user.login == env.CODE_REVIEW_BOT_LOGIN and (.body | startswith(env.CODE_REVIEW_MARKER))) | {id: .id, body: .body}\",\n ],\n undefined,\n { CODE_REVIEW_BOT_LOGIN: botLogin, CODE_REVIEW_MARKER: marker },\n );\n const lines = stdout.trim().split(\"\\n\").filter(Boolean);\n if (lines.length === 0) return null;\n const last = lines[lines.length - 1] ?? null;\n if (last === null) return null;\n const parsed = JSON.parse(last) as { id: number; body: string };\n return { id: parsed.id, body: parsed.body };\n};\n\n/** Parse an issue-comment create/patch response for `id`/`html_url`; malformed responses degrade\n * to null rather than throwing (§5.5, issue #11 ROBUSTNESS — a missing link must never fail the\n * post). */\nconst parseCommentRef = (\n raw: string,\n): { readonly id: number; readonly html_url: string } | null => {\n try {\n const parsed = JSON.parse(raw) as { id?: unknown; html_url?: unknown };\n return typeof parsed.id === \"number\" && typeof parsed.html_url === \"string\"\n ? { id: parsed.id, html_url: parsed.html_url }\n : null;\n } catch {\n return null;\n }\n};\n\nconst patchComment = async (\n repo: string,\n commentId: number,\n body: string,\n ghApi: GhApi,\n): Promise<{ readonly html_url: string } | null> => {\n const stdout = await ghApi(\n [`repos/${repo}/issues/comments/${String(commentId)}`, \"--input\", \"-\"],\n JSON.stringify({ body }),\n );\n // Only `html_url` is needed here — the id is already known by the caller — so this doesn't\n // require `id` in the response the way parseCommentRef (used for a brand-new comment) does.\n const htmlUrl = parseHtmlUrl(stdout);\n return htmlUrl !== undefined ? { html_url: htmlUrl } : null;\n};\n\nconst postComment = async (\n repo: string,\n prNumber: number,\n body: string,\n ghApi: GhApi,\n): Promise<{ readonly id: number; readonly html_url: string } | null> => {\n const stdout = await ghApi(\n [`repos/${repo}/issues/${String(prNumber)}/comments`, \"--input\", \"-\"],\n JSON.stringify({ body }),\n );\n return parseCommentRef(stdout);\n};\n\n/** Upsert the sticky summary — trust by author identity (bot login), not marker alone (§5.3).\n * Returns the sticky's id + `html_url` (url undefined on a malformed response) so the caller can\n * re-patch it with a link to the review once posted (issue #11). Returns null only when a *new*\n * comment's response couldn't be parsed at all — there is then no id to re-patch with. */\nconst upsertSticky = async (\n repo: string,\n prNumber: number,\n existing: { readonly id: number; readonly body: string } | null,\n body: string,\n ghApi: GhApi,\n): Promise<{ readonly id: number; readonly url: string | undefined } | null> => {\n if (existing !== null) {\n const patched = await patchComment(repo, existing.id, body, ghApi);\n process.stderr.write(\n `Updated sticky comment #${String(existing.id)} on PR #${String(prNumber)}\\n`,\n );\n return { id: existing.id, url: patched?.html_url };\n }\n const posted = await postComment(repo, prNumber, body, ghApi);\n process.stderr.write(`Posted new sticky comment on PR #${String(prNumber)}\\n`);\n return posted ? { id: posted.id, url: posted.html_url } : null;\n};\n\n/** A non-dismissed bot-authored review. Only its id is needed — every prior bot review is\n * superseded regardless of which commit it reviewed (issue #53). */\ninterface BotReviewRef {\n readonly id: number;\n}\n\nconst isBotReview = (r: unknown): r is { id: number; user: { login: string }; state: string } =>\n typeof r === \"object\" &&\n r !== null &&\n typeof (r as { id?: unknown }).id === \"number\" &&\n typeof (r as { state?: unknown }).state === \"string\" &&\n typeof (r as { user?: { login?: unknown } }).user?.login === \"string\";\n\n/** List the PR's non-dismissed bot-authored reviews. */\nconst fetchBotReviews = async (\n repo: string,\n prNumber: number,\n botLogin: string,\n ghApi: GhApi,\n): Promise<readonly BotReviewRef[]> => {\n const stdout = await ghApi([`repos/${repo}/pulls/${String(prNumber)}/reviews`, \"--paginate\"]);\n let reviews: unknown;\n try {\n reviews = JSON.parse(stdout || \"[]\");\n } catch {\n return [];\n }\n if (!Array.isArray(reviews)) return [];\n return reviews\n .filter(isBotReview)\n .filter((r) => r.user.login === botLogin && r.state !== \"DISMISSED\")\n .map((r) => ({ id: r.id }));\n};\n\n/** Dismiss superseded bot-authored reviews (REC-CO-2). Failures are logged, never fail the job. */\nconst dismissReviews = async (\n repo: string,\n prNumber: number,\n ids: readonly number[],\n ghApi: GhApi,\n): Promise<void> => {\n for (const id of ids) {\n try {\n await ghApi(\n [\n `repos/${repo}/pulls/${String(prNumber)}/reviews/${String(id)}/dismissals`,\n \"-X\",\n \"PUT\",\n \"--input\",\n \"-\",\n ],\n JSON.stringify({ message: \"Superseded by a new review for an updated commit.\" }),\n );\n } catch (err) {\n process.stderr.write(\n `Warning: failed to dismiss prior review #${String(id)} on PR #${String(prNumber)}: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n }\n};\n\n/** GraphQL: list a PR's review-thread comments — author + whether already minimized — enough to find\n * the bot's own inline comments left by prior reviews. Capped at the first 100 threads (×100 comments\n * each); `pageInfo.hasNextPage` flags a PR that exceeds the cap. */\nconst REVIEW_THREAD_COMMENTS_QUERY =\n \"query($owner:String!,$name:String!,$pr:Int!){repository(owner:$owner,name:$name){pullRequest(number:$pr){reviewThreads(first:100){pageInfo{hasNextPage}nodes{comments(first:100){nodes{id isMinimized author{login}}}}}}}}\";\n\n/** GraphQL: hide one comment as OUTDATED. Reversible — minimized, not deleted. */\nconst MINIMIZE_COMMENT_MUTATION =\n \"mutation($id:ID!){minimizeComment(input:{subjectId:$id,classifier:OUTDATED}){minimizedComment{isMinimized}}}\";\n\n/** The comment's node id when it is a bot-authored, not-yet-minimized inline comment; null otherwise.\n * GraphQL reports the bare login (`github-actions`), so the bot login is matched with and without the\n * REST `[bot]` suffix. Which SHA it was authored against no longer matters — the caller snapshots the\n * set BEFORE posting the fresh review, so every match is by definition a prior (stale) comment. Pure. */\nconst priorBotCommentId = (c: unknown, logins: readonly string[]): string | null => {\n if (typeof c !== \"object\" || c === null) return null;\n const o = c as { id?: unknown; isMinimized?: unknown; author?: { login?: unknown } | null };\n const login = o.author?.login;\n return typeof o.id === \"string\" &&\n o.isMinimized !== true &&\n typeof login === \"string\" &&\n logins.includes(login)\n ? o.id\n : null;\n};\n\n/** Parse the review-threads response into the bot's not-yet-minimized inline comment ids, degrading\n * to an empty list on any malformed shape (§5.5), and flagging whether the 100-thread cap was hit.\n * Pure. */\nconst priorBotCommentIds = (\n raw: string,\n botLogin: string,\n): { readonly ids: readonly string[]; readonly truncated: boolean } => {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return { ids: [], truncated: false };\n }\n const conn = (\n parsed as {\n data?: {\n repository?: {\n pullRequest?: {\n reviewThreads?: { nodes?: unknown; pageInfo?: { hasNextPage?: unknown } };\n };\n };\n };\n }\n ).data?.repository?.pullRequest?.reviewThreads;\n const truncated = conn?.pageInfo?.hasNextPage === true;\n const nodes = conn?.nodes;\n if (!Array.isArray(nodes)) return { ids: [], truncated };\n const logins = [botLogin.replace(/\\[bot\\]$/, \"\"), botLogin];\n const ids = nodes.flatMap((t) => {\n const cnodes = (t as { comments?: { nodes?: unknown } }).comments?.nodes;\n return Array.isArray(cnodes)\n ? cnodes.map((c) => priorBotCommentId(c, logins)).filter((id): id is string => id !== null)\n : [];\n });\n return { ids, truncated };\n};\n\n/** Snapshot the bot's own not-yet-minimized inline review comments currently on the PR — the stale\n * threads left by prior reviews (issue #31/#53). Called BEFORE the fresh review is posted, so the set\n * is exactly the prior comments (whether on a superseded commit or an earlier review of this same\n * SHA) and never the fresh ones. Best-effort: any listing failure logs and returns []. */\nconst listPriorBotCommentIds = async (\n repo: string,\n prNumber: number,\n botLogin: string,\n ghApi: GhApi,\n): Promise<readonly string[]> => {\n const slash = repo.indexOf(\"/\");\n if (slash <= 0) return [];\n const owner = repo.slice(0, slash);\n const name = repo.slice(slash + 1);\n let raw: string;\n try {\n raw = await ghApi([\n \"graphql\",\n \"-f\",\n `query=${REVIEW_THREAD_COMMENTS_QUERY}`,\n \"-f\",\n `owner=${owner}`,\n \"-f\",\n `name=${name}`,\n \"-F\",\n `pr=${String(prNumber)}`,\n ]);\n } catch (err) {\n process.stderr.write(\n `Warning: could not list review threads to minimize stale comments on PR #${String(prNumber)}: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n return [];\n }\n const { ids, truncated } = priorBotCommentIds(raw, botLogin);\n if (truncated) {\n process.stderr.write(\n `Note: PR #${String(prNumber)} has more than 100 review threads — only the first 100 were scanned for stale bot comments\\n`,\n );\n }\n return ids;\n};\n\n/** Minimize (as OUTDATED, reversibly) the given bot inline comment node ids — the pre-post snapshot of\n * stale threads — so a re-reviewed PR doesn't accumulate them (issue #31/#53). Best-effort: any\n * minimize failure is logged and never fails the post. */\nconst minimizeComments = async (\n prNumber: number,\n ids: readonly string[],\n ghApi: GhApi,\n): Promise<void> => {\n let minimized = 0;\n for (const id of ids) {\n try {\n await ghApi([\"graphql\", \"-f\", `query=${MINIMIZE_COMMENT_MUTATION}`, \"-f\", `id=${id}`]);\n minimized += 1;\n } catch (err) {\n process.stderr.write(\n `Warning: failed to minimize a stale review comment on PR #${String(prNumber)}: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n }\n if (minimized > 0) {\n process.stderr.write(\n `Minimized ${String(minimized)} stale inline comment(s) from superseded reviews on PR #${String(prNumber)}\\n`,\n );\n }\n};\n\nexport const post = async (input: PostInput, ghApi: GhApi = runGhApi): Promise<void> => {\n // Phase 1 (CO-R3): reads, decodes, diff validation, rendering — no writes yet.\n const candidates = await fetchPrCandidates(input.repo, input.headSha, ghApi);\n const resolution = resolvePr(candidates, input.headBranch);\n if (resolution.kind === \"none\") {\n process.stderr.write(`No open PR for ${input.headSha} — nothing to post\\n`);\n process.exit(0);\n }\n if (resolution.kind === \"not-open\") {\n process.stderr.write(\n `PR #${String(resolution.prNumber)} for ${input.headSha} is not open (state: ${resolution.state}) — nothing to post\\n`,\n );\n process.exit(0);\n }\n const prNumber = resolution.prNumber;\n\n const diff = await fetchDiff(input.repo, prNumber, ghApi);\n const existingSticky = await findBotComment(\n input.repo,\n prNumber,\n input.botLogin,\n DEFAULT_MARKER,\n ghApi,\n );\n\n const prices = JSON.parse(readFileSync(input.pricesPath, \"utf-8\")) as unknown;\n const decodedPrices = PriceMapCodec.decode(prices);\n if (decodedPrices._tag === \"Left\") {\n throw new Error(`Price map at ${input.pricesPath} does not match the expected shape`);\n }\n const template = readFileSync(input.templatePath, \"utf-8\");\n const inlineTemplate = readFileSync(input.inlineTemplatePath, \"utf-8\");\n\n const renderNotice = (message: string): string =>\n formatMarkdown(\n render({\n findings: noticeFindings(`### ⚠️ ${message}`),\n envelope: null,\n prices: decodedPrices.right,\n pricesProvided: input.pricesProvided,\n template,\n route: input.route,\n reviewedSha: input.headSha,\n effort: input.effort,\n runUrl: input.runUrl,\n jsonUrl: input.jsonUrl,\n postedAt: input.postedAt,\n }),\n );\n\n if (isEmptyDiff(diff)) {\n await upsertSticky(\n input.repo,\n prNumber,\n existingSticky,\n renderNotice(\"The diff for this PR is empty — nothing to review.\"),\n ghApi,\n );\n process.exit(0);\n }\n\n const findingsResult = loadFindings(input.findingsPath);\n if (findingsResult.kind !== \"ok\") {\n await upsertSticky(\n input.repo,\n prNumber,\n existingSticky,\n renderNotice(noticeMessageFor(findingsResult)),\n ghApi,\n );\n process.exit(0);\n }\n const findings = findingsResult.findings;\n\n const envelope = loadEnvelope(input.envelopePath);\n const testReport = input.testReportPath ? loadTestReport(input.testReportPath) : undefined;\n\n if (envelope === null) {\n const body = formatMarkdown(\n render({\n findings,\n envelope: null,\n prices: decodedPrices.right,\n pricesProvided: input.pricesProvided,\n template,\n route: input.route,\n reviewedSha: input.headSha,\n effort: input.effort,\n testReport,\n inlineDisposition: { kind: \"no-envelope\" },\n runUrl: input.runUrl,\n jsonUrl: input.jsonUrl,\n postedAt: input.postedAt,\n }),\n );\n await upsertSticky(input.repo, prNumber, existingSticky, body, ghApi);\n process.stderr.write(\n \"Result envelope missing or malformed — posted sticky summary without usage/cost data; no inline review\\n\",\n );\n process.exit(0);\n }\n\n // Issue #19 + review fix #5: base64-encode the whole-document marker ONCE and reuse it on the two\n // single-per-review surfaces (both sticky renders, the review body). Each inline comment instead\n // embeds only its OWN finding (issue #31) — buildInlineComments derives that per-finding marker\n // itself from `findings` below, rather than reusing this whole-document one.\n const findingsMarker = findingsPointer(findings, input.jsonUrl);\n\n const {\n comments: rawComments,\n strays,\n inDiff,\n } = buildInlineComments(findings.findings, diff, {\n inlineTemplate,\n models: envelope.models.map((m) => m.model),\n findings,\n jsonUrl: input.jsonUrl,\n });\n const { comments, longFiles } = checkLongSuggestions(rawComments);\n for (const wf of longFiles) {\n process.stderr.write(\n `Warning: suggestion in ${wf} exceeds ${String(MAX_SUGGESTION_LINES)} lines — omitted from inline to avoid 422\\n`,\n );\n }\n\n // The bot's prior reviews (identity via the reviews API `commit_id`), fetched to supersede every\n // one of them — including any already on THIS head SHA — before posting the fresh review below.\n // We ran the review agent and paid for it, so its result must be surfaced: a re-request (or an\n // incidental CI re-run) on the same commit dismisses the stale review and posts the new one rather\n // than being skipped (issue #53). Fetched unconditionally now that a review is always posted (#43).\n const botReviews = await fetchBotReviews(input.repo, prNumber, input.botLogin, ghApi);\n\n // Issue #21: the \"posted — see the review\" disposition is constructed ONLY from the actual\n // postInlineReview result below, never optimistically — a review that doesn't yet exist (or\n // never will, if this process dies before posting it) must never be claimed. Everything knowable\n // from reads alone (no-in-diff-findings) is truthful up front and stays as-is.\n const initialDisposition: InlineDisposition | undefined =\n comments.length === 0 && strays.length > 0 ? { kind: \"none-in-diff\" } : undefined;\n\n const commonRenderInput: Omit<RenderInput, \"inlineDisposition\" | \"reviewUrl\"> = {\n findings,\n envelope,\n prices: decodedPrices.right,\n pricesProvided: input.pricesProvided,\n template,\n route: input.route,\n reviewedSha: input.headSha,\n effort: input.effort,\n testReport,\n severityCounts: computeSeverityCounts(findings.findings),\n strays,\n runUrl: input.runUrl,\n jsonUrl: input.jsonUrl,\n findingsPointer: findingsMarker,\n postedAt: input.postedAt,\n };\n const longFilesNote =\n longFiles.length > 0\n ? `\\n\\n---\\n\\n> **Note:** ${String(longFiles.length)} suggestion(s) exceeded GitHub's ~10-line inline suggestion limit and were omitted from the inline comments; the affected findings remain in the review.\\n`\n : \"\";\n // Renders the sticky body; called twice (issue #11) — once before the review exists (no\n // disposition claim beyond what reads already confirmed), once after (with the confirmed\n // disposition + reviewUrl) to report the truth and link the sticky back to the review.\n const renderBody = (\n inlineDisposition: InlineDisposition | undefined,\n reviewUrl?: string,\n straysOverride?: readonly Finding[],\n unanchoredCount?: number,\n ): string =>\n formatMarkdown(\n render({\n ...commonRenderInput,\n ...(straysOverride ? { strays: straysOverride } : {}),\n ...(unanchoredCount !== undefined ? { unanchoredCount } : {}),\n inlineDisposition,\n reviewUrl,\n }) + longFilesNote,\n );\n\n // Phase 2 (CO-R3): writes — sticky first, inline second; failure exits non-zero.\n const stickyRef = await upsertSticky(\n input.repo,\n prNumber,\n existingSticky,\n renderBody(initialDisposition),\n ghApi,\n );\n\n // Issue #43: a COMMENT review is posted on EVERY run, even with no in-diff comments, so tooling and\n // agents get a review event every time — its body points at the sticky (for humans) and carries the\n // findings-JSON marker (for agents).\n\n // Issue #31/#53: snapshot the bot's existing inline comments BEFORE posting the fresh review, so the\n // stale ones can be minimized afterward without touching the fresh ones. Timing — not the comment's\n // commit SHA — separates stale from fresh: everything present now is from a prior review (on a\n // superseded commit OR an earlier review of this same SHA); the fresh comments are posted below.\n const priorInlineComments = await listPriorBotCommentIds(\n input.repo,\n prNumber,\n input.botLogin,\n ghApi,\n );\n\n // Post the fresh review FIRST, THEN supersede the prior ones (REC-CO-2 + issue #53): posting before\n // dismissing means the PR is never left without a review even if the process dies between the two —\n // a re-review of the same commit dismisses the stale review only after its replacement exists.\n const {\n url: reviewUrl,\n inlinePosted,\n unposted,\n } = await postInlineReview(\n input.repo,\n prNumber,\n input.headSha,\n comments,\n inDiff,\n stickyRef?.url,\n findingsMarker,\n ghApi,\n );\n process.stderr.write(\n `Posted a review with ${String(inlinePosted)} inline comment(s) on PR #${String(prNumber)}\\n`,\n );\n\n // Supersede EVERY prior bot review — those on other commits and any already on this head SHA.\n // Best-effort: a dismissal that fails leaves a stale review beside the fresh one (logged), which\n // beats failing the job now that the fresh review is already posted. Concurrent runs on the same\n // commit are bounded by the workflow's concurrency group; GitHub itself tolerates multiple reviews.\n const priorReviewIds = botReviews.map((r) => r.id);\n if (priorReviewIds.length > 0) {\n await dismissReviews(input.repo, prNumber, priorReviewIds, ghApi);\n }\n\n // Issue #31/#53: minimize the pre-post snapshot — the stale threads from the reviews just\n // superseded — so a re-reviewed PR doesn't accumulate them. The fresh review's comments were posted\n // after the snapshot, so they are untouched. Best-effort — the fresh review is already posted.\n await minimizeComments(prNumber, priorInlineComments, ghApi);\n\n // Issue #11/#21/#57: now that postInlineReview has resolved, re-render the sticky to the truth.\n // - `inlinePosted > 0` → \"posted N\" + the review link (N is the count that ACTUALLY posted, so a\n // partial #57 salvage reports only the anchored ones).\n // - `unposted` (issue #57) → the in-diff findings GitHub rejected are appended to the real\n // out-of-diff strays so no finding is lost to human view; `unanchoredCount` drives the section's\n // note. When NONE anchored, the disposition says the inline surface was unavailable, never a\n // false \"posted\" (issue #21).\n // - Neither → a body-only review with no in-diff comments (issue #43) keeps the initial sticky.\n // Best-effort — the sticky and review are already posted, so a failure here must never fail the job.\n const unanchoredCount = unposted.length;\n const finalStrays = unanchoredCount > 0 ? [...unposted, ...strays] : strays;\n if (stickyRef !== null && (inlinePosted > 0 || unanchoredCount > 0)) {\n // Inside the guard exactly one holds: some comments anchored (\"posted N\"), or none did but\n // findings were rejected (\"inline unavailable\"). A body-only review with nothing to say keeps\n // the initial sticky and never reaches here.\n const finalDisposition: InlineDisposition =\n inlinePosted > 0\n ? { kind: \"posted\", count: inlinePosted, sha: input.headSha }\n : { kind: \"inline-unavailable\" };\n try {\n await patchComment(\n input.repo,\n stickyRef.id,\n renderBody(finalDisposition, reviewUrl, finalStrays, unanchoredCount),\n ghApi,\n );\n process.stderr.write(\n `Updated sticky comment #${String(stickyRef.id)} to reflect the review\\n`,\n );\n } catch (err) {\n process.stderr.write(\n `Warning: failed to update the sticky summary after the review: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n }\n};\n","// Gather review inputs (SPEC §8.2): resolve the PR from the trusted head SHA, fetch the diff (with\n// a non-truncating git-diff fallback), the PR context, the prior bot review, and — when CI\n// failed — the failing-job logs. Mirrors the bash \"Gather review inputs\" step 1:1, but as\n// vitest-tested TypeScript, sharing `post`'s PR resolution so the two jobs never split-brain.\n\nimport { execFile } from \"node:child_process\";\nimport { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport * as t from \"io-ts\";\nimport type { GhApi } from \"./gh.js\";\nimport { runGhApi } from \"./gh.js\";\nimport { fetchDiff, fetchPrCandidates, resolvePr } from \"./pr.js\";\n\nexport interface GatherInput {\n readonly repo: string;\n readonly headSha: string;\n readonly headBranch?: string;\n readonly runId: string;\n readonly conclusion: string;\n readonly botLogin: string;\n readonly outDir: string;\n}\n\nexport type GatherResult =\n | { readonly kind: \"skip\" }\n | {\n readonly kind: \"gathered\";\n readonly pr: number;\n readonly conclusion: string;\n readonly diffSize: number;\n };\n\n/** The GitHub-outputs lines the step appends to $GITHUB_OUTPUT. CI-agnostic + directly testable. */\nexport const renderOutputs = (result: GatherResult): string => {\n switch (result.kind) {\n case \"skip\":\n return \"skip=true\\n\";\n case \"gathered\":\n return `pr=${String(result.pr)}\\nconclusion=${result.conclusion}\\ndiff_size=${String(result.diffSize)}\\n`;\n }\n};\n\nexport type GitRun = (args: readonly string[]) => Promise<string>;\n\nexport const runGit: GitRun = (args) =>\n new Promise<string>((resolve, reject) => {\n execFile(\n \"git\",\n [...args],\n { encoding: \"utf-8\", maxBuffer: 100 * 1024 * 1024 },\n (err, stdout, stderr) => {\n if (err) {\n const stderrStr = typeof stderr === \"string\" && stderr.trim() ? stderr.trim() : \"\";\n const errStr = err instanceof Error ? err.message : \"unknown error\";\n reject(new Error(`git ${args.join(\" \")} failed: ${stderrStr || errStr}`));\n } else {\n resolve(stdout);\n }\n },\n );\n });\n\nconst PrMetaCodec = t.type({\n changed_files: t.number,\n base_sha: t.string,\n title: t.string,\n body: t.union([t.string, t.null]),\n});\ntype PrMeta = t.TypeOf<typeof PrMetaCodec>;\n\nconst IssueCommentCodec = t.type({\n id: t.number,\n body: t.union([t.string, t.null]),\n user: t.type({ login: t.string }),\n});\nconst IssueCommentsCodec = t.array(IssueCommentCodec);\n\nconst JobCodec = t.type({ id: t.number, conclusion: t.union([t.string, t.null]) });\nconst JobsResponseCodec = t.type({ jobs: t.array(JobCodec) });\n\nconst fetchPrMeta = async (repo: string, prNumber: number, ghApi: GhApi): Promise<PrMeta> => {\n const stdout = await ghApi([\n `repos/${repo}/pulls/${String(prNumber)}`,\n \"--jq\",\n \"{changed_files: .changed_files, base_sha: .base.sha, title: .title, body: .body}\",\n ]);\n const decoded = PrMetaCodec.decode(JSON.parse(stdout) as unknown);\n if (decoded._tag === \"Left\") {\n throw new Error(`PR metadata for #${String(prNumber)} did not match the expected shape`);\n }\n return decoded.right;\n};\n\n/** Fetch the diff via the API; null on failure (drives the git fallback). */\nconst fetchApiDiff = async (\n repo: string,\n prNumber: number,\n ghApi: GhApi,\n): Promise<string | null> => {\n try {\n return await fetchDiff(repo, prNumber, ghApi);\n } catch {\n return null;\n }\n};\n\n/** Last comment authored by botLogin, or null. Degrades to null on ANY failure (bash `|| echo null`). */\nconst fetchPriorReview = async (\n repo: string,\n prNumber: number,\n botLogin: string,\n ghApi: GhApi,\n): Promise<{ readonly id: number; readonly body: string | null } | null> => {\n try {\n const stdout = await ghApi([`repos/${repo}/issues/${String(prNumber)}/comments`, \"--paginate\"]);\n const decoded = IssueCommentsCodec.decode(JSON.parse(stdout || \"[]\") as unknown);\n if (decoded._tag === \"Left\") return null;\n const byBot = decoded.right.filter((c) => c.user.login === botLogin);\n const last = byBot[byBot.length - 1];\n return last ? { id: last.id, body: last.body } : null;\n } catch {\n return null;\n }\n};\n\n/** Download each failing job's logs → <outDir>/job_<id>.log. Jobs-list failure is fatal; a\n * per-log download failure degrades (warns to stderr, keeps whatever logs were retrieved) —\n * logs are advisory input, and partial logs plus the diff beat a dead review. */\nconst downloadFailingJobLogs = async (\n repo: string,\n runId: string,\n outDir: string,\n ghApi: GhApi,\n): Promise<void> => {\n const stdout = await ghApi([`repos/${repo}/actions/runs/${runId}/jobs`]);\n const decoded = JobsResponseCodec.decode(JSON.parse(stdout) as unknown);\n if (decoded._tag === \"Left\") {\n throw new Error(`Jobs list for run ${runId} did not match the expected shape`);\n }\n for (const job of decoded.right.jobs.filter((j) => j.conclusion === \"failure\")) {\n try {\n const log = await ghApi([`repos/${repo}/actions/jobs/${String(job.id)}/logs`]);\n writeFileSync(join(outDir, `job_${String(job.id)}.log`), log);\n } catch (err) {\n process.stderr.write(\n `Warning: failed to download logs for job ${String(job.id)}: ${err instanceof Error ? err.message : String(err)} — continuing with the logs retrieved so far\\n`,\n );\n }\n }\n};\n\nexport const gather = async (\n input: GatherInput,\n ghApi: GhApi = runGhApi,\n gitRun: GitRun = runGit,\n): Promise<GatherResult> => {\n const candidates = await fetchPrCandidates(input.repo, input.headSha, ghApi);\n const resolution = resolvePr(candidates, input.headBranch);\n if (resolution.kind === \"none\") {\n process.stderr.write(`No open PR for ${input.headSha} — nothing to review\\n`);\n return { kind: \"skip\" };\n }\n if (resolution.kind === \"not-open\") {\n process.stderr.write(\n `PR #${String(resolution.prNumber)} for ${input.headSha} is not open (state: ${resolution.state}) — nothing to review\\n`,\n );\n return { kind: \"skip\" };\n }\n const prNumber = resolution.prNumber;\n\n const meta = await fetchPrMeta(input.repo, prNumber, ghApi);\n\n const apiDiff = await fetchApiDiff(input.repo, prNumber, ghApi);\n const diff =\n apiDiff !== null && !(apiDiff.length === 0 && meta.changed_files > 0)\n ? apiDiff\n : await (async () => {\n process.stderr.write(\n `PR diff fetch failed or was empty for ${String(meta.changed_files)} changed files — falling back to git diff\\n`,\n );\n await gitRun([\"fetch\", \"origin\", input.headSha]);\n return gitRun([\"diff\", meta.base_sha, input.headSha]);\n })();\n\n writeFileSync(join(input.outDir, \"pr.diff\"), diff);\n writeFileSync(\n join(input.outDir, \"pr_context.json\"),\n JSON.stringify({ title: meta.title, body: meta.body }),\n );\n\n const prior = await fetchPriorReview(input.repo, prNumber, input.botLogin, ghApi);\n writeFileSync(\n join(input.outDir, \"prior_review.json\"),\n prior === null ? \"null\" : JSON.stringify(prior),\n );\n\n if (input.conclusion === \"failure\") {\n await downloadFailingJobLogs(input.repo, input.runId, input.outDir, ghApi);\n }\n\n return {\n kind: \"gathered\",\n pr: prNumber,\n conclusion: input.conclusion,\n diffSize: Buffer.byteLength(diff, \"utf8\"),\n };\n};\n","// Extraction ladder: recovers a schema-conforming candidate (findings or triage) from a native\n// agent-CLI result envelope when structured-output enforcement is imperfect or absent. Rung order\n// is a fixed priority: --agent-file > structured_output > pure-JSON result > fenced code blocks.\n// The first rung producing exactly one distinct schema-validating candidate wins (fenced-block\n// candidates are deduplicated by canonical value first — an exact duplicate is not a conflict); an\n// error envelope (the agent run did not complete) short-circuits before any rung runs. See\n// docs/adapters.md \"Extraction ladder\" for the security rationale (exactly-one-distinct-validating\n// defeats block-injection).\n//\n// Candidate gate: ajv (via validateAgainstSchema, additionalProperties:false) rejects shape and\n// injection attempts; the registry's io-ts codec (via resolve) then materializes the value,\n// additionally enforcing invariants ajv cannot express (e.g. end_line >= start_line). A candidate\n// must pass both to count as \"validating\".\n\nimport { readFileOrNull } from \"./util.js\";\nimport { resolve, schemaPathFor, defaultVersion } from \"./registry.js\";\nimport { validateAgainstSchema } from \"./validate.js\";\n\nexport type ExtractKind = \"findings\" | \"triage\";\n\nexport interface ExtractInput {\n readonly kind: ExtractKind;\n readonly native: unknown;\n /** Path to a file the agent was told to write its own validated JSON to (findings only — a\n * documented no-op for triage, per the rung order's \"agent-file wins\" test). */\n readonly agentFilePath?: string;\n}\n\nexport type LadderOutcome =\n | { readonly kind: \"ok\"; readonly version: string; readonly candidate: unknown }\n | { readonly kind: \"error-envelope\"; readonly detail: string }\n | { readonly kind: \"none\"; readonly detail: string }\n | { readonly kind: \"ambiguous\"; readonly detail: string };\n\ninterface NativeForExtraction {\n readonly result: unknown;\n readonly structuredOutput: unknown;\n readonly isError: unknown;\n readonly subtype: unknown;\n readonly apiErrorStatus: unknown;\n}\n\nconst fieldOf = (raw: unknown, key: string): unknown =>\n typeof raw === \"object\" && raw !== null && key in raw\n ? (raw as Record<string, unknown>)[key]\n : undefined;\n\nconst parseNativeForExtraction = (raw: unknown): NativeForExtraction => ({\n result: fieldOf(raw, \"result\"),\n structuredOutput: fieldOf(raw, \"structured_output\"),\n isError: fieldOf(raw, \"is_error\"),\n subtype: fieldOf(raw, \"subtype\"),\n apiErrorStatus: fieldOf(raw, \"api_error_status\"),\n});\n\nconst isNullish = (value: unknown): boolean => value === null || value === undefined;\n\n/** is_error===true OR (subtype not null/undefined and != \"success\") OR api_error_status not null/undefined. */\nconst isErrorEnvelope = (native: NativeForExtraction): boolean =>\n native.isError === true ||\n (!isNullish(native.subtype) && native.subtype !== \"success\") ||\n !isNullish(native.apiErrorStatus);\n\nconst describeErrorEnvelope = (native: NativeForExtraction): string => {\n const parts: readonly string[] = [\n ...(native.isError === true ? [\"is_error=true\"] : []),\n ...(!isNullish(native.subtype) && native.subtype !== \"success\"\n ? [`subtype=${JSON.stringify(native.subtype)}`]\n : []),\n ...(!isNullish(native.apiErrorStatus)\n ? [`api_error_status=${JSON.stringify(native.apiErrorStatus)}`]\n : []),\n ];\n return `agent run did not complete successfully (${parts.join(\", \")})`;\n};\n\n/** Default `schema_version` onto a findings candidate when the agent omitted it; identity for triage. */\nexport const withDefaultSchemaVersion = (candidate: unknown): unknown =>\n typeof candidate === \"object\" &&\n candidate !== null &&\n !Array.isArray(candidate) &&\n !(\"schema_version\" in candidate)\n ? { ...candidate, schema_version: defaultVersion(\"findings\") }\n : candidate;\n\nconst normalizeCandidate = (kind: ExtractKind, candidate: unknown): unknown =>\n kind === \"findings\" ? withDefaultSchemaVersion(candidate) : candidate;\n\nconst candidateVersion = (kind: ExtractKind, candidate: unknown): string | undefined => {\n if (kind !== \"findings\") return undefined;\n const version = fieldOf(candidate, \"schema_version\");\n return typeof version === \"string\" ? version : undefined;\n};\n\nconst safeSchemaPathFor = (kind: ExtractKind, version: string | undefined): string | null => {\n try {\n return schemaPathFor(kind, version);\n } catch {\n return null;\n }\n};\n\ninterface GatedCandidate {\n readonly version: string;\n /** The survivor after `schema_version` injection, pre-registry-normalize (identical for alpha) —\n * what the extract CLI prints, per the registry seam ruling. */\n readonly candidate: unknown;\n}\n\n/** Recursively sort object keys so two values that differ only in key order canonicalize equal. */\nconst canonicalize = (value: unknown): unknown =>\n Array.isArray(value)\n ? value.map(canonicalize)\n : value !== null && typeof value === \"object\"\n ? Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([k, v]) => [k, canonicalize(v)]),\n )\n : value;\n\n/** Collapse gated candidates that are exact duplicates once canonicalized — a model re-emitting its\n * answer verbatim is a plausible benign case, not a conflict. Two candidates that differ in any\n * value still remain distinct, so the injection defense (refusing to pick a survivor among\n * disagreeing candidates) is unweakened. */\nconst dedupCandidates = (candidates: readonly GatedCandidate[]): readonly GatedCandidate[] => {\n const seen = new Set<string>();\n return candidates.filter((c) => {\n const key = JSON.stringify(canonicalize(c.candidate));\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n};\n\n/** Gate a raw candidate through ajv (shape + injection defense) then the registry's io-ts codec\n * (materialization + cross-field invariants); null when either gate rejects it. */\nconst gateCandidate = (kind: ExtractKind, rawCandidate: unknown): GatedCandidate | null => {\n const candidate = normalizeCandidate(kind, rawCandidate);\n const schemaPath = safeSchemaPathFor(kind, candidateVersion(kind, candidate));\n if (schemaPath === null) return null;\n if (!validateAgainstSchema(candidate, schemaPath).valid) return null;\n const resolution = resolve(kind, candidate);\n return resolution.kind === \"ok\" ? { version: resolution.version, candidate } : null;\n};\n\ntype ParseResult = { readonly ok: true; readonly value: unknown } | { readonly ok: false };\n\nconst tryParseJson = (text: string): ParseResult => {\n try {\n return { ok: true, value: JSON.parse(text) as unknown };\n } catch {\n return { ok: false };\n }\n};\n\nconst candidateFromJsonText = (kind: ExtractKind, text: string | null): GatedCandidate | null => {\n if (text === null) return null;\n const parsed = tryParseJson(text);\n return parsed.ok ? gateCandidate(kind, parsed.value) : null;\n};\n\ninterface FenceScanState {\n readonly blocks: readonly string[];\n readonly openLength: number | null;\n readonly buffer: readonly string[];\n}\n\nconst FENCE_OPEN = /^\\s*(`{3,})/;\nconst FENCE_MARKER_ONLY = /^`+$/;\n\n/** Fold one line into the fence-scan state. Opens on a line whose first non-whitespace run is\n * >=3 backticks (the rest of the line — an info string like \"json\" — is ignored); closes on the\n * next line that, trimmed, is only backticks of length >= the opening fence. Line-based by\n * design — no regex spans more than one line, so there is no catastrophic-backtracking surface. */\nconst scanLine = (state: FenceScanState, line: string): FenceScanState => {\n if (state.openLength === null) {\n const opened = FENCE_OPEN.exec(line)?.[1]?.length;\n return opened !== undefined ? { blocks: state.blocks, openLength: opened, buffer: [] } : state;\n }\n const trimmed = line.trim();\n const closes = FENCE_MARKER_ONLY.test(trimmed) && trimmed.length >= state.openLength;\n return closes\n ? { blocks: [...state.blocks, state.buffer.join(\"\\n\")], openLength: null, buffer: [] }\n : { ...state, buffer: [...state.buffer, line] };\n};\n\n/** Extract fenced code-block contents from `text` (both ` ```json ` and bare ` ``` `); text before,\n * between, and after fences (and an unterminated trailing fence) is discarded. */\nexport const scanFencedBlocks = (text: string): readonly string[] =>\n text.split(\"\\n\").reduce(scanLine, { blocks: [], openLength: null, buffer: [] }).blocks;\n\n/** Operator-facing breakdown of what each rung actually saw when recovery fails — for stderr/logs,\n * never for the fail-closed reasons (which stay generic). Turns an opaque \"no candidate\" into an\n * actionable trace: a null structured_output points at a CLI not enforcing `--json-schema`. */\nexport const ladderFailureDiagnostics = (input: ExtractInput): string => {\n const native = parseNativeForExtraction(input.native);\n const preview = (s: string): string => {\n const flat = s.replace(/\\s+/g, \" \").trim();\n return flat.length > 200 ? `${flat.slice(0, 200)}…` : flat;\n };\n const lines: string[] = [];\n if (input.kind === \"findings\") {\n lines.push(\n input.agentFilePath === undefined\n ? \"agent-file rung: no --agent-file given\"\n : `agent-file rung: ${input.agentFilePath} did not validate (or was unreadable)`,\n );\n }\n lines.push(\n isNullish(native.structuredOutput)\n ? \"structured_output rung: absent (null) — the CLI's --json-schema likely did not enforce\"\n : \"structured_output rung: present but did not validate against the schema\",\n );\n lines.push(\n typeof native.result === \"string\"\n ? `result rung: ${String(native.result.length)} chars, ${String(scanFencedBlocks(native.result).length)} fenced JSON block(s), none validated; preview: ${preview(native.result)}`\n : \"result rung: absent or not a string\",\n );\n return lines.join(\"\\n\");\n};\n\n/** Render a non-\"ok\" ladder outcome as a single human-readable message. */\nexport const describeLadderFailure = (outcome: Exclude<LadderOutcome, { kind: \"ok\" }>): string => {\n switch (outcome.kind) {\n case \"error-envelope\":\n return `review did not complete: ${outcome.detail}`;\n case \"none\":\n return `could not recover a validating candidate: ${outcome.detail}`;\n case \"ambiguous\":\n return `ambiguous candidates: ${outcome.detail}`;\n }\n};\n\nconst okOutcome = (gated: GatedCandidate): LadderOutcome => ({\n kind: \"ok\",\n version: gated.version,\n candidate: gated.candidate,\n});\n\n/** Run the extraction ladder. Pure aside from an optional `--agent-file` read. */\nexport const extractStructured = (input: ExtractInput): LadderOutcome => {\n const native = parseNativeForExtraction(input.native);\n\n if (isErrorEnvelope(native)) {\n return { kind: \"error-envelope\", detail: describeErrorEnvelope(native) };\n }\n\n if (input.kind === \"findings\" && input.agentFilePath !== undefined) {\n const fromFile = candidateFromJsonText(input.kind, readFileOrNull(input.agentFilePath));\n if (fromFile) return okOutcome(fromFile);\n }\n\n if (native.structuredOutput !== undefined) {\n const fromStructured = gateCandidate(input.kind, native.structuredOutput);\n if (fromStructured) return okOutcome(fromStructured);\n }\n\n if (typeof native.result === \"string\") {\n const fromResult = candidateFromJsonText(input.kind, native.result.trim());\n if (fromResult) return okOutcome(fromResult);\n\n const fencedCandidates = dedupCandidates(\n scanFencedBlocks(native.result)\n .map((block) => candidateFromJsonText(input.kind, block))\n .filter((gated): gated is GatedCandidate => gated !== null),\n );\n\n const [survivor, ...rest] = fencedCandidates;\n if (survivor !== undefined && rest.length === 0) return okOutcome(survivor);\n if (survivor !== undefined) {\n return {\n kind: \"ambiguous\",\n detail: `${String(fencedCandidates.length)} distinct fenced JSON blocks each validate against the ${input.kind} schema — refusing to pick one`,\n };\n }\n }\n\n return {\n kind: \"none\",\n detail: `no --agent-file, structured_output, JSON result, or fenced block validated against the ${input.kind} schema`,\n };\n};\n","// Adapter: maps a coding-agent CLI's native result envelope onto the abstract\n// result envelope (SPEC §6.1). Claude Code is the reference adapter — see docs/adapters.md.\n// A present-but-wrong-shaped native surfaces as a Left; an *absent* native (undefined or null — the\n// caller could not read/parse it, e.g. a wall-clock timeout killed `claude -p` mid-flush, issue #39)\n// still recovers findings from --agent-file, and refills telemetry from the transcript fallback when\n// the caller supplies one (issue #36) so cost is real, not $0.00. Never throws.\n\nimport * as t from \"io-ts\";\nimport type { Either } from \"fp-ts/Either\";\nimport { resolve } from \"./registry.js\";\nimport { extractStructured, describeLadderFailure } from \"./extract.js\";\nimport { DEFAULT_SCHEMA_VERSION, noticeFindings } from \"./schema.js\";\nimport type { Findings, ModelUsageEntry, ResultEnvelope } from \"./schema.js\";\n\n// No value-level import from fp-ts (a bare \"fp-ts/Either\" subpath import breaks under strict\n// Node ESM — see fp-ts's lack of a package.json \"exports\" map). Either values are constructed\n// as plain tagged literals and consumed via ._tag, matching this codebase's existing convention\n// (validate.ts, index.ts) of importing only the Either *type*.\nconst left = <A>(message: string): Either<string, A> => ({ _tag: \"Left\", left: message });\nconst right = <A>(value: A): Either<string, A> => ({ _tag: \"Right\", right: value });\n\nexport type AdapterName = \"claude-code\";\n\nexport const isAdapterName = (name: string): name is AdapterName => name === \"claude-code\";\n\nconst ClaudeCodeModelUsageEntryCodec = t.intersection([\n t.type({\n inputTokens: t.number,\n outputTokens: t.number,\n }),\n t.partial({\n cacheReadInputTokens: t.number,\n cacheCreationInputTokens: t.number,\n costUSD: t.number,\n }),\n]);\n\nexport const ClaudeCodeEnvelopeCodec = t.intersection([\n t.type({\n modelUsage: t.record(t.string, ClaudeCodeModelUsageEntryCodec),\n num_turns: t.number,\n duration_ms: t.number,\n }),\n t.partial({\n total_cost_usd: t.union([t.number, t.null]),\n structured_output: t.unknown,\n }),\n]);\n\ntype ClaudeCodeEnvelope = t.TypeOf<typeof ClaudeCodeEnvelopeCodec>;\n\nconst mapModelUsage = (modelUsage: ClaudeCodeEnvelope[\"modelUsage\"]): ModelUsageEntry[] =>\n Object.entries(modelUsage).map(([model, entry]) => ({\n model,\n input_tokens: entry.inputTokens,\n output_tokens: entry.outputTokens,\n ...(entry.cacheReadInputTokens !== undefined\n ? { cache_read_tokens: entry.cacheReadInputTokens }\n : {}),\n ...(entry.cacheCreationInputTokens !== undefined\n ? { cache_write_tokens: entry.cacheCreationInputTokens }\n : {}),\n }));\n\n/** Telemetry recovered from the session transcript tree, supplied by the caller. It is the source of\n * the envelope's wall + turn count whenever a transcript is available (the native envelope reports\n * only the main agent's active time/turns and under-reports a subagent fan-out — issue #59), and it\n * refills per-model USAGE too when the native has none — a wall-clock kill leaves the native\n * absent/empty (issue #39), yet the transcript still records the real spend (issue #36), so cost\n * computes from real models×prices downstream instead of a false $0.00. */\nexport interface TranscriptTelemetry {\n readonly models: readonly ModelUsageEntry[];\n readonly turns: number;\n readonly durationMs: number;\n}\n\n/** Run context the caller stamps into the envelope: route/effort (SPEC §6.1) and an optional\n * transcript telemetry fallback. The fallback is a THUNK — invoked once when supplied (the read can\n * be megabytes on a large fan-out, so callers pass it only when a transcript path was given). */\nexport interface RunMeta {\n readonly route?: string;\n readonly effort?: string;\n readonly transcriptFallback?: () => TranscriptTelemetry;\n}\n\n/** The extraction ladder's outcome, reduced to what `buildEnvelope` needs: either a materialized\n * findings document, or a reason findings are unavailable. Never a reason to drop telemetry\n * (issue #18) — every ladder outcome maps onto a *findings* result, not a fatal one. */\ntype FindingsOutcome =\n | { readonly kind: \"ok\"; readonly version: string; readonly findings: Findings }\n | { readonly kind: \"telemetry-only\"; readonly reason: string };\n\nconst findingsOutcome = (native: unknown, agentFilePath: string | undefined): FindingsOutcome => {\n const ladder = extractStructured({ kind: \"findings\", native, agentFilePath });\n if (ladder.kind !== \"ok\")\n return { kind: \"telemetry-only\", reason: describeLadderFailure(ladder) };\n // The ladder already confirmed this candidate resolves via the registry; re-resolving here just\n // materializes the typed, normalized value it deliberately didn't keep (see extract.ts).\n const resolution = resolve(\"findings\", ladder.candidate);\n return resolution.kind === \"ok\"\n ? { kind: \"ok\", version: resolution.version, findings: resolution.value }\n : {\n kind: \"telemetry-only\",\n reason:\n \"internal error: the extraction ladder validated a candidate the registry then rejected\",\n };\n};\n\n/** The abstract envelope's telemetry fields (SPEC §6.1), split out so both a decoded native\n * envelope and an absent one (issue #39) assemble the same shape. */\ninterface Telemetry {\n readonly models: ModelUsageEntry[];\n readonly turns: number;\n readonly duration_ms: number;\n readonly vendor_cost_usd: number | null;\n readonly route?: string;\n readonly effort?: string;\n}\n\nconst withMeta = (base: Omit<Telemetry, \"route\" | \"effort\">, meta: RunMeta): Telemetry => ({\n ...base,\n ...(meta.route ? { route: meta.route } : {}),\n ...(meta.effort ? { effort: meta.effort } : {}),\n});\n\n/** Assemble telemetry, taking each field from the source that is authoritative for it — NOT simply\n * \"always the transcript.\" Two sources, two strengths:\n *\n * - WALL + TURNS come from the transcript whenever one is available. The native envelope reports only\n * the MAIN agent's active time and turn count, which wildly under-report a review that fanned out\n * subagents — a 12-subagent, ~12-minute run otherwise surfaces as \"5 turns, 42s\" (issue #59). The\n * transcript tree spans the whole session (main + subagents), so its span is the true wall and its\n * message count the real work.\n * - Per-model USAGE stays native-authoritative when present. Claude Code's rollup already includes\n * the subagents (issue #18), and it is MORE accurate than the transcript for output tokens: summing\n * the per-message `usage` under-counts output badly (measured ~5.7× low on the #59 fixture —\n * 32,945 vs the native's 188,952 output tokens on the same run, while input + cache-read matched),\n * because the transcript doesn't record every message's full output. So using the transcript for\n * cost would under-count it several-fold — DO NOT \"simplify\" this to always-transcript. The\n * transcript refills usage ONLY when the native has none (a `timeout` kill leaves it absent/empty —\n * issues #39/#36), where an under-count still beats a false $0.00.\n *\n * The vendor's own cost figure is carried through from the native whenever it had one. */\nconst resolveTelemetry = (\n native: {\n models: ModelUsageEntry[];\n turns: number;\n durationMs: number;\n vendorCostUsd: number | null;\n },\n meta: RunMeta,\n): Telemetry => {\n // Reading the transcript must never fail the adapt step (§5.5) — a thunk that throws degrades to\n // \"no transcript\", i.e. the native's own figures.\n const fb = ((): TranscriptTelemetry | undefined => {\n try {\n return meta.transcriptFallback?.();\n } catch {\n return undefined;\n }\n })();\n // Wall + turns come from the transcript together (never one source for turns and another for the\n // wall) whenever it yields a real span; otherwise both from the native envelope.\n const wallTurns =\n fb !== undefined && fb.durationMs > 0\n ? { turns: fb.turns, duration_ms: fb.durationMs }\n : { turns: native.turns, duration_ms: native.durationMs };\n return withMeta(\n {\n models: native.models.length > 0 ? native.models : fb ? [...fb.models] : native.models,\n ...wallTurns,\n vendor_cost_usd: native.vendorCostUsd,\n },\n meta,\n );\n};\n\n/** Telemetry from a decoded native envelope: its per-model usage + vendor cost, plus wall/turns that\n * `resolveTelemetry` overrides from the transcript when one is available (issue #59) or that the\n * transcript refills entirely on a wall-kill that left the native empty (issues #39/#36/#18). */\nconst nativeTelemetry = (native: ClaudeCodeEnvelope, meta: RunMeta): Telemetry =>\n resolveTelemetry(\n {\n models: mapModelUsage(native.modelUsage),\n turns: native.num_turns,\n durationMs: native.duration_ms,\n vendorCostUsd: native.total_cost_usd ?? null,\n },\n meta,\n );\n\n/** Telemetry when the native envelope is absent/unreadable (issue #39): a wall-clock `timeout` can\n * kill `claude -p` mid-flush, leaving no parseable envelope. The transcript fallback (issue #36)\n * refills real spend when present; otherwise zeros. Either way the findings ladder still runs (its\n * --agent-file rung needs no native), so a checkpointed $DRAFT survives the cutoff. */\nconst absentTelemetry = (meta: RunMeta): Telemetry =>\n resolveTelemetry({ models: [], turns: 0, durationMs: 0, vendorCostUsd: null }, meta);\n\n/** Assemble the abstract envelope (SPEC §6.1): `findings`/`schema_version` from the extraction\n * ladder (which reads --agent-file and defensively reads the raw native), telemetry from the\n * caller. A ladder miss becomes a \"did not complete\" notice — never a discarded envelope. */\nconst buildEnvelope = (\n telemetry: Telemetry,\n native: unknown,\n agentFilePath: string | undefined,\n): ResultEnvelope => {\n const outcome = findingsOutcome(native, agentFilePath);\n switch (outcome.kind) {\n case \"ok\":\n return { schema_version: outcome.version, findings: outcome.findings, ...telemetry };\n case \"telemetry-only\":\n return {\n schema_version: DEFAULT_SCHEMA_VERSION,\n findings: noticeFindings(`### ⚠️ Review did not complete\\n\\n${outcome.reason}`),\n ...telemetry,\n };\n }\n};\n\n/** Map a native agent-CLI result envelope onto the abstract envelope (SPEC §6.1). `agentFilePath`\n * is meaningful only for the findings recovery (a documented no-op otherwise). A `native` of\n * `undefined` or `null` means the caller could not read/parse the envelope (empty/truncated, or a\n * literal JSON `null` — issue #39): rather than fail the run, the adapter emits a no-telemetry\n * envelope and still recovers findings from --agent-file. A *present* but wrong-shaped native is\n * still a Left (a real adapter mismatch). */\nexport const adapt = (\n adapterName: AdapterName,\n native: unknown,\n agentFilePath?: string,\n meta: RunMeta = {},\n): Either<string, ResultEnvelope> => {\n switch (adapterName) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- exhaustive by design; AdapterName grows (e.g. \"opencode\") without collapsing this switch to an if\n case \"claude-code\": {\n if (native === undefined || native === null)\n return right(buildEnvelope(absentTelemetry(meta), undefined, agentFilePath));\n const decoded = ClaudeCodeEnvelopeCodec.decode(native);\n if (decoded._tag === \"Left\")\n return left(\"native envelope does not match the Claude Code output shape\");\n return right(buildEnvelope(nativeTelemetry(decoded.right, meta), native, agentFilePath));\n }\n }\n};\n","// One Claude Code --settings file composing every hook this CLI uses to make a headless review agent\n// safe and budget-disciplined (issue #38): the Stop deliverable gate (stop-gate.ts) and the two\n// budget hooks (budget.ts) — the latter wired from a SINGLE self-dispatching command on both\n// PreToolUse and PostToolBatch. The review job generates this once and passes it as --settings, so\n// the whole discipline (can't stop draftless, steered toward convergence, forced to converge, and\n// truncation-safe on a hard kill) is expressed in data, not shell.\n\nimport { defaultHookCommand } from \"./stop-gate.js\";\nimport { budgetHookCommand } from \"./budget.js\";\n\ninterface CommandHook {\n readonly type: \"command\";\n readonly command: string;\n}\ninterface HookEntry {\n readonly hooks: readonly CommandHook[];\n}\n\n/** The composed settings. `PreToolUse`/`PostToolBatch` carry no matcher — they run for every tool,\n * and the CLI decides per `tool_name` (allowing the convergence path, denying the rest at hard). */\nexport interface ReviewHookSettings {\n readonly hooks: {\n readonly Stop: readonly HookEntry[];\n readonly PreToolUse: readonly HookEntry[];\n readonly PostToolBatch: readonly HookEntry[];\n };\n}\n\nexport interface ComposeSettingsOptions {\n readonly draftPath: string;\n readonly stop: {\n readonly kind?: string;\n readonly schema?: string;\n readonly schemaVersion?: string;\n readonly maxNudges?: string;\n readonly counter?: string;\n };\n readonly budget: {\n readonly budgetUsd?: string;\n readonly wall?: string;\n readonly prices?: string;\n readonly reserveFrac?: string;\n readonly reserveGrowth?: string;\n readonly reserveUsd?: string;\n readonly reserveWall?: string;\n };\n}\n\n/** Compose the Stop + PreToolUse + PostToolBatch settings for one review. The budget command is\n * identical across the two tool events — it self-dispatches on the `hook_event_name` it reads from\n * stdin — so it is built once and wired twice. */\nexport const composeReviewSettings = (opts: ComposeSettingsOptions): ReviewHookSettings => {\n const budgetCommand = budgetHookCommand(opts.draftPath, opts.budget);\n return {\n hooks: {\n Stop: [\n { hooks: [{ type: \"command\", command: defaultHookCommand(opts.draftPath, opts.stop) }] },\n ],\n PreToolUse: [{ hooks: [{ type: \"command\", command: budgetCommand }] }],\n PostToolBatch: [{ hooks: [{ type: \"command\", command: budgetCommand }] }],\n },\n };\n};\n","#!/usr/bin/env node\n// CLI entry point — citty subcommands for render, inline, post, cost, check-cost, validate, adapt,\n// extract, validate-patches, print-schema, stop-gate, budget-hook, print-settings, deadline.\n\n/* eslint-disable @typescript-eslint/require-await */\n// citty requires async run() even when the body has no explicit await\n\nimport { defineCommand, runMain } from \"citty\";\nimport { readFileSync, statSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { Either } from \"fp-ts/Either\";\nimport { render } from \"./render.js\";\nimport { buildInlineComments, renderStraysSection } from \"./inline.js\";\nimport { computeCost } from \"./cost.js\";\nimport { readTranscriptTree, sumTranscriptUsage } from \"./transcript.js\";\nimport {\n evaluateBudgetHook,\n parseWallMs,\n parseFraction,\n parseEpochSecMs,\n anchoredElapsedMs,\n deadlineEpochSec,\n mainHasWrittenDraft,\n seedMarkerPath,\n DEFAULT_RESERVE,\n DEADLINE_ENV,\n} from \"./budget.js\";\nimport { validateAgainstSchema, unsafeUnwrap } from \"./validate.js\";\nimport { formatUtc } from \"./format.js\";\nimport {\n ResultEnvelopeCodec,\n FindingsCodec,\n PriceMapCodec,\n TestSummaryCodec,\n noticeFindings,\n} from \"./schema.js\";\nimport type { Triage, Finding, PriceMap } from \"./schema.js\";\nimport { parseFindingsMarker } from \"./surface.js\";\nimport { post } from \"./post.js\";\nimport { gather, renderOutputs } from \"./gather.js\";\nimport { adapt, isAdapterName } from \"./adapt.js\";\nimport type { AdapterName, TranscriptTelemetry } from \"./adapt.js\";\nimport { extractStructured, describeLadderFailure, ladderFailureDiagnostics } from \"./extract.js\";\nimport type { ExtractKind, LadderOutcome } from \"./extract.js\";\nimport { schemaPathFor, declaredVersion } from \"./registry.js\";\nimport type { SchemaKind } from \"./registry.js\";\nimport { validatePatch } from \"./patch.js\";\nimport {\n decideGate,\n draftState,\n readNudges,\n bumpNudges,\n defaultHookCommand,\n stopHookSettings,\n} from \"./stop-gate.js\";\nimport { composeReviewSettings } from \"./settings.js\";\n\nconst readJSON = (path: string): unknown => {\n try {\n return JSON.parse(readFileSync(resolve(path), \"utf-8\")) as unknown;\n } catch (err) {\n fail(`Cannot read ${path}: ${err instanceof Error ? err.message : String(err)}`);\n throw new Error(\"unreachable\", { cause: err }); // fail() always exits\n }\n};\n\nconst fail = (msg: string): never => {\n process.stderr.write(`${msg}\\n`);\n process.exit(1);\n};\n\n/** Like `readJSON` but tolerant: returns `undefined` (never exits) when the file is unreadable,\n * empty, or not valid JSON. Used ONLY for `adapt`'s native positional arg, which a wall-clock\n * `timeout` kill can leave empty/truncated (issue #39) — `adapt` then degrades to a no-telemetry\n * envelope and still recovers findings from `--agent-file`, instead of crashing the whole review\n * step. Each degrade path names its specific cause on stderr — surfacing the real read error so an\n * EACCES/EISDIR is not misreported as \"empty\" — to stay diagnosable; genuinely-required inputs keep\n * the strict `readJSON`. */\nconst readJSONOrAbsent = (path: string): unknown => {\n const read = ((): { readonly text: string } | { readonly error: string } => {\n try {\n return { text: readFileSync(resolve(path), \"utf-8\") };\n } catch (err) {\n return { error: err instanceof Error ? err.message : String(err) };\n }\n })();\n if (\"error\" in read) {\n process.stderr.write(\n `code-review: native envelope ${path} could not be read (${read.error}) — proceeding with no native telemetry (issue #39)\\n`,\n );\n return undefined;\n }\n if (read.text.trim() === \"\") {\n process.stderr.write(\n `code-review: native envelope ${path} is empty — proceeding with no native telemetry (issue #39)\\n`,\n );\n return undefined;\n }\n try {\n return JSON.parse(read.text) as unknown;\n } catch (err) {\n process.stderr.write(\n `code-review: native envelope ${path} is not valid JSON (${err instanceof Error ? err.message : String(err)}) — proceeding with no native telemetry (issue #39)\\n`,\n );\n return undefined;\n }\n};\n\n/** Read and parse the hook payload delivered on stdin, defensively: a TTY (manual run), absent stdin,\n * or non-JSON all yield null. The budget hook then decides from its flags alone (no live signal),\n * never crashing on a missing or malformed payload. */\nconst readStdinJSON = (): unknown => {\n if (process.stdin.isTTY) return null;\n const raw = ((): string => {\n try {\n return readFileSync(0, \"utf-8\");\n } catch {\n return \"\";\n }\n })();\n if (raw.trim() === \"\") return null;\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n return null;\n }\n};\n\nconst decode = <A>(either: Either<unknown, A>, label: string): A => {\n try {\n return unsafeUnwrap(either);\n } catch {\n fail(`${label} does not match expected shape`);\n }\n throw new Error(\"unreachable\"); // fail() always exits\n};\n\n/** Unwrap an adapter's Either, surfacing its own message rather than a generic one. */\nconst unwrapAdapt = <A>(either: Either<string, A>): A => {\n try {\n if (either._tag === \"Left\") throw new Error(either.left);\n return either.right;\n } catch (err) {\n fail(err instanceof Error ? err.message : String(err));\n }\n throw new Error(\"unreachable\"); // fail() always exits\n};\n\n/** Telemetry from a session transcript tree (main + subagents), which `adapt` uses for the true\n * WALL + TURNS whenever it's available — the native envelope only sees the main agent and under-\n * reports a subagent fan-out (issue #59) — and for per-model usage too on a wall-kill that left the\n * native empty (issue #36), so cost computes from real models×prices instead of $0.00. A\n * missing/unreadable transcript yields empty models + a zero span, which `adapt` treats as \"no\n * transcript\" (keeping the native's own figures). */\nconst transcriptFallbackFrom = (path: string): TranscriptTelemetry => {\n const tree = readTranscriptTree(resolve(path));\n if (tree.missing)\n process.stderr.write(\n `code-review adapt: transcript ${path} is unreadable — no telemetry fallback (issue #36)\\n`,\n );\n const usage = sumTranscriptUsage(tree.entries);\n return { models: usage.models, turns: usage.turns, durationMs: usage.durationMs };\n};\n\n/** Resolve a path bundled with the package (schema/, templates/) — same pattern as validate's default schema. */\nconst bundledPath = (...segments: string[]): string =>\n resolve(import.meta.dirname, \"..\", ...segments);\n\nconst packageVersion = (\n JSON.parse(readFileSync(bundledPath(\"package.json\"), \"utf-8\")) as { version: string }\n).version;\n\n/** `--template` defaults to the bundled comment template when omitted. */\nconst resolveTemplatePath = (templateArg: string | undefined): string =>\n templateArg ? resolve(templateArg) : bundledPath(\"templates\", \"comment.eta\");\n\n/** `--inline-template` defaults to the bundled inline template when omitted (inline.eta is the\n * per-surface SSOT — issue #22 — mirroring resolveTemplatePath's sticky default). */\nconst resolveInlineTemplatePath = (templateArg: string | undefined): string =>\n templateArg ? resolve(templateArg) : bundledPath(\"templates\", \"inline.eta\");\n\n/** Price-map resolution with explicit provenance: `provided` is a real caller-supplied map,\n * `absent` is the bundled all-zero example standing in for one (loaded only to satisfy the codec /\n * computeCost shape). The render layer is TOLD which, so it reports cost as N/A rather than a false\n * $0.00 when absent (SPEC §6.2) — never inferring it from the path. */\ntype PriceResolution =\n | { readonly kind: \"provided\"; readonly path: string }\n | { readonly kind: \"absent\"; readonly path: string };\n\n/** `--prices` defaults to the bundled (all-zero) example prices when omitted, with a warning. */\nconst resolvePrices = (pricesArg: string | undefined): PriceResolution => {\n if (pricesArg) return { kind: \"provided\", path: resolve(pricesArg) };\n process.stderr.write(\n \"code-review: no --prices given — cost will be reported as N/A (no price map to recompute from)\\n\",\n );\n return { kind: \"absent\", path: bundledPath(\"schema\", \"prices.example.json\") };\n};\n\nconst TEST_REPORT_DESCRIPTION =\n 'Path to a JSON test summary: {\"passed\": number, \"failed\": number, \"total\": number, \"failures\"?: [{\"name\": string, \"message\"?: string}]}';\n\nconst renderCmd = defineCommand({\n meta: {\n name: \"render\",\n description: \"Render a code-review comment from findings + usage + prices\",\n },\n args: {\n findings: {\n type: \"positional\",\n description: \"Path to findings JSON\",\n required: true,\n },\n template: {\n type: \"string\",\n description: \"Path to Eta template file (default: bundled templates/comment.eta)\",\n },\n usage: {\n type: \"string\",\n description: \"Path to result envelope JSON (from agent CLI)\",\n required: true,\n },\n prices: {\n type: \"string\",\n description:\n \"Path to price map JSON (default: bundled schema/prices.example.json — all zero)\",\n },\n \"reviewed-sha\": {\n type: \"string\",\n description: \"SHA of the last reviewed commit\",\n },\n route: {\n type: \"string\",\n description:\n \"Review route label; overrides the envelope's route when set (default: read from the envelope)\",\n },\n effort: {\n type: \"string\",\n description:\n \"Effort label; overrides the envelope's effort when set (default: read from the envelope)\",\n },\n \"test-report\": {\n type: \"string\",\n description: TEST_REPORT_DESCRIPTION,\n },\n },\n run: async ({ args }) => {\n const findings = decode(FindingsCodec.decode(readJSON(args.findings)), \"findings\");\n const envelope = decode(ResultEnvelopeCodec.decode(readJSON(args.usage)), \"envelope\");\n const templatePath = resolveTemplatePath(args.template);\n const priceResolution = resolvePrices(args.prices);\n const prices = decode(PriceMapCodec.decode(readJSON(priceResolution.path)), \"prices\");\n const template = readFileSync(templatePath, \"utf-8\");\n const testReport = args[\"test-report\"]\n ? decode(TestSummaryCodec.decode(readJSON(args[\"test-report\"])), \"test report\")\n : undefined;\n const output = render({\n findings,\n envelope,\n prices,\n pricesProvided: priceResolution.kind === \"provided\",\n template,\n reviewedSha: args[\"reviewed-sha\"],\n route: args.route,\n effort: args.effort,\n testReport,\n postedAt: formatUtc(new Date()),\n });\n process.stdout.write(output);\n },\n});\n\nconst inlineCmd = defineCommand({\n meta: {\n name: \"inline\",\n description: \"Build GitHub reviews comments[] payload from findings + diff\",\n },\n args: {\n findings: {\n type: \"positional\",\n description: \"Path to findings JSON\",\n required: true,\n },\n diff: {\n type: \"string\",\n description: \"Path to PR diff file\",\n required: true,\n },\n template: {\n type: \"string\",\n description: \"Path to inline comment Eta template (default: bundled templates/inline.eta)\",\n },\n },\n run: async ({ args }) => {\n const findings = decode(FindingsCodec.decode(readJSON(args.findings)), \"findings\");\n const diff = readFileSync(resolve(args.diff), \"utf-8\");\n const inlineTemplate = readFileSync(resolveInlineTemplatePath(args.template), \"utf-8\");\n const { comments, strays } = buildInlineComments(findings.findings, diff, {\n inlineTemplate,\n findings,\n });\n process.stdout.write(\n JSON.stringify({ comments, strays, stray_markdown: renderStraysSection(strays) }, null, 2),\n );\n },\n});\n\nconst costCmd = defineCommand({\n meta: {\n name: \"cost\",\n description: \"Recompute USD cost from the envelope's models array + price map\",\n },\n args: {\n envelope: {\n type: \"positional\",\n description: \"Path to result envelope JSON\",\n required: true,\n },\n prices: {\n type: \"string\",\n description: \"Path to price map JSON\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const envelope = decode(ResultEnvelopeCodec.decode(readJSON(args.envelope)), \"envelope\");\n const prices = decode(PriceMapCodec.decode(readJSON(args.prices)), \"prices\");\n const report = computeCost(envelope.models, prices);\n process.stdout.write(JSON.stringify(report, null, 2));\n },\n});\n\nconst checkCostCmd = defineCommand({\n meta: {\n name: \"check-cost\",\n description:\n \"Sum real USD spend from a live/finished Claude Code transcript tree (main session + subagents) against a price map — the correct cost when no clean result envelope exists (issue #36) and the outlook the review agent tracks in flight (issue #38)\",\n },\n args: {\n transcript: {\n type: \"positional\",\n description: \"Path to the session transcript JSONL (the hook's transcript_path)\",\n required: true,\n },\n prices: {\n type: \"string\",\n description:\n \"Path to price map JSON (default: bundled schema/prices.example.json — token totals stay real, cost reads as $0)\",\n },\n },\n run: async ({ args }) => {\n const tree = readTranscriptTree(resolve(args.transcript));\n if (tree.missing) {\n process.stderr.write(\n `code-review check-cost: transcript ${args.transcript} is unreadable — reporting zero spend (issue #36)\\n`,\n );\n }\n const usage = sumTranscriptUsage(tree.entries);\n const priceResolution = resolvePrices(args.prices);\n const prices = decode(PriceMapCodec.decode(readJSON(priceResolution.path)), \"prices\");\n const report = computeCost(usage.models, prices);\n process.stdout.write(\n `${JSON.stringify(\n {\n ...report,\n turns: usage.turns,\n durationMs: usage.durationMs,\n transcripts: tree.files,\n pricesProvided: priceResolution.kind === \"provided\",\n },\n null,\n 2,\n )}\\n`,\n );\n },\n});\n\n/** Read + decode a price map, degrading to null (cost axis disabled) on any failure — the budget\n * hook fires on every tool call, so it must never process-exit the way the strict `readJSON` does. */\nconst tryReadPrices = (path: string): PriceMap | null => {\n try {\n const decoded = PriceMapCodec.decode(JSON.parse(readFileSync(resolve(path), \"utf-8\")));\n return decoded._tag === \"Right\" ? decoded.right : null;\n } catch {\n return null;\n }\n};\n\n/** A non-negative, finite dollar amount, or null (absent/unparseable). `0` is kept, not nulled: as a\n * budget it disables the cost axis (decideBudget requires budgetUsd > 0); as a reserve floor it means\n * no flat floor. */\nconst parseBudgetUsd = (raw: string | undefined): number | null => {\n if (raw === undefined) return null;\n const n = Number.parseFloat(raw);\n return Number.isFinite(n) && n >= 0 ? n : null;\n};\n\n/** A file's mtime in epoch ms, or null when it does not exist (or cannot be statted). */\nconst mtimeMsOf = (path: string): number | null => {\n try {\n return statSync(path).mtimeMs;\n } catch {\n return null;\n }\n};\n\n/** The `transcript_path` a hook payload carries, when present. */\nconst transcriptPathOf = (input: unknown): string | undefined => {\n const tp = (\n typeof input === \"object\" && input !== null ? (input as Record<string, unknown>) : {}\n )[\"transcript_path\"];\n return typeof tp === \"string\" ? tp : undefined;\n};\n\nconst budgetHookCmd = defineCommand({\n meta: {\n name: \"budget-hook\",\n description:\n \"Self-dispatching Claude Code hook for budget discipline (issue #38): on PostToolBatch, steer the agent to converge once spend or wall-clock enters its soft wind-down reserve; on PreToolUse, inside the hard reserve, deny the budget-burning tools (subagent spawns, arbitrary shell, web) while leaving the draft-delivery path open. At every phase, the main agent's subagent spawns are denied until it has written its own first-pass draft (seed-draft's sidecar marker tells the seed apart), and permitted spawns are rewritten to run in the background so no batch join can block the spawner (issue #73). Reads the hook payload on stdin, measures spend from its transcript, and decides on $ and/or time. Degrades to a no-op on any error.\",\n },\n args: {\n draft: {\n type: \"string\",\n description:\n \"Path to the findings draft that is the sole permitted write target under forced convergence\",\n required: true,\n },\n \"budget-usd\": {\n type: \"string\",\n description:\n \"Dollar budget for the run; the cost axis is measured against it (needs --prices)\",\n },\n wall: {\n type: \"string\",\n description: \"Wall-clock budget (e.g. 20m, 1200s, 2h); the time axis is measured against it\",\n },\n prices: {\n type: \"string\",\n description:\n \"Price map JSON to recompute real spend from the transcript (omit to disable the cost axis)\",\n },\n \"reserve-frac\": {\n type: \"string\",\n description:\n \"Base wind-down headroom as a fraction of each budget: converge once less than this remains (default: 0.15; the soft steer tier reserves 2× this)\",\n },\n \"reserve-growth\": {\n type: \"string\",\n description:\n \"How much the reserve grows as a budget is spent — added at full usage, so convergence lands earlier the longer the run has gone (default: 0.25; 0 = flat reserve)\",\n },\n \"reserve-usd\": {\n type: \"string\",\n description:\n \"Flat dollar wind-down floor, whichever is larger with --reserve-frac (default: 0.02)\",\n },\n \"reserve-wall\": {\n type: \"string\",\n description:\n \"Flat wall-clock wind-down floor (e.g. 2m, 120s), whichever is larger with --reserve-frac (default: 2m)\",\n },\n },\n run: async ({ args }) => {\n try {\n const draftPath = resolve(args.draft);\n const input = readStdinJSON();\n const transcriptPath = transcriptPathOf(input);\n const tree = transcriptPath ? readTranscriptTree(resolve(transcriptPath)) : undefined;\n const usage = tree ? sumTranscriptUsage(tree.entries) : undefined;\n const prices = args.prices ? tryReadPrices(args.prices) : null;\n const spentUsd =\n prices !== null && usage ? computeCost(usage.models, prices).totalCostUSD : null;\n // The absolute anchor (set by the review job, inherited by every hook incl. fan-out subagents)\n // is the true remaining wall; the per-transcript first timestamp is only the fallback — it\n // reads ≈0 in a fresh subagent and leaves the fan-out unsteered (issue #45).\n const wallMs = args.wall ? parseWallMs(args.wall) : null;\n const output = evaluateBudgetHook(input, {\n spentUsd,\n budgetUsd: parseBudgetUsd(args[\"budget-usd\"]),\n elapsedMs: anchoredElapsedMs({\n deadlineMs: parseEpochSecMs(process.env[DEADLINE_ENV]),\n wallMs,\n firstTsMs: usage?.firstTsMs ?? null,\n nowMs: Date.now(),\n }),\n wallMs,\n reserve: {\n frac: parseFraction(args[\"reserve-frac\"], DEFAULT_RESERVE.frac),\n growth: parseFraction(args[\"reserve-growth\"], DEFAULT_RESERVE.growth),\n flatUsd: parseBudgetUsd(args[\"reserve-usd\"]) ?? DEFAULT_RESERVE.flatUsd,\n flatMs: args[\"reserve-wall\"]\n ? (parseWallMs(args[\"reserve-wall\"]) ?? DEFAULT_RESERVE.flatMs)\n : DEFAULT_RESERVE.flatMs,\n },\n draftPath,\n mainDraftWritten: mainHasWrittenDraft(\n mtimeMsOf(draftPath),\n mtimeMsOf(seedMarkerPath(draftPath)),\n ),\n });\n process.stdout.write(`${JSON.stringify(output)}\\n`);\n } catch (err) {\n process.stderr.write(\n `code-review budget-hook: degrading to no-op — ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n process.stdout.write(\"{}\\n\");\n }\n },\n});\n\nconst printSettingsCmd = defineCommand({\n meta: {\n name: \"print-settings\",\n description:\n \"Emit ONE Claude Code --settings JSON composing the review agent's discipline (issue #38): the Stop deliverable gate plus the budget hooks (PreToolUse forced convergence + PostToolBatch steer) wired from one self-dispatching command. The review job generates this once and passes it as --settings.\",\n },\n args: {\n draft: {\n type: \"string\",\n description:\n \"Path to the findings draft the agent must produce — the Stop gate's target and the only write allowed under forced convergence\",\n required: true,\n },\n kind: {\n type: \"string\",\n description: \"Schema kind for the Stop gate: findings | triage | prices (default: findings)\",\n },\n schema: {\n type: \"string\",\n description: \"Path to a schema file for the Stop gate (wins over --kind)\",\n },\n \"schema-version\": {\n type: \"string\",\n description: \"Schema major.minor for the Stop gate (default: the draft's declared version)\",\n },\n \"max-nudges\": {\n type: \"string\",\n description: \"Stop-gate nudge budget before relenting (default: 5)\",\n },\n counter: {\n type: \"string\",\n description: \"Path for the Stop-gate nudge counter (default: <draft>.nudges)\",\n },\n \"budget-usd\": {\n type: \"string\",\n description: \"Dollar budget the cost axis is measured against (needs --prices)\",\n },\n wall: {\n type: \"string\",\n description: \"Wall-clock budget the time axis is measured against (e.g. 20m, 1200s)\",\n },\n prices: {\n type: \"string\",\n description: \"Price map JSON to recompute real spend from the transcript\",\n },\n \"reserve-frac\": {\n type: \"string\",\n description:\n \"Base wind-down headroom as a fraction of each budget (default: 0.15; soft tier is 2×)\",\n },\n \"reserve-growth\": {\n type: \"string\",\n description:\n \"How much the reserve grows as a budget is spent, converging earlier the longer the run has gone (default: 0.25; 0 = flat)\",\n },\n \"reserve-usd\": {\n type: \"string\",\n description:\n \"Flat dollar wind-down floor, whichever is larger with --reserve-frac (default: 0.02)\",\n },\n \"reserve-wall\": {\n type: \"string\",\n description:\n \"Flat wall-clock wind-down floor (e.g. 2m), whichever is larger with --reserve-frac (default: 2m)\",\n },\n },\n run: async ({ args }) => {\n if (args.kind && ![\"findings\", \"triage\", \"prices\"].includes(args.kind))\n fail(`--kind must be one of findings|triage|prices (got '${args.kind}')`);\n const settings = composeReviewSettings({\n draftPath: resolve(args.draft),\n stop: {\n kind: args.kind,\n schema: args.schema,\n schemaVersion: args[\"schema-version\"],\n maxNudges: args[\"max-nudges\"],\n counter: args.counter,\n },\n budget: {\n budgetUsd: args[\"budget-usd\"],\n wall: args.wall,\n prices: args.prices,\n reserveFrac: args[\"reserve-frac\"],\n reserveGrowth: args[\"reserve-growth\"],\n reserveUsd: args[\"reserve-usd\"],\n reserveWall: args[\"reserve-wall\"],\n },\n });\n process.stdout.write(`${JSON.stringify(settings)}\\n`);\n },\n});\n\nconst deadlineCmd = defineCommand({\n meta: {\n name: \"deadline\",\n description:\n \"Print the run's absolute deadline as Unix epoch seconds (now + --wall). The review job exports this as CODE_REVIEW_DEADLINE_EPOCH right before `claude -p` so every budget hook — the main agent's and each fan-out subagent's — measures the SAME true remaining wall instead of its own transcript's start, which reads ≈0 in a fresh subagent and leaves the fan-out unsteered (issue #45).\",\n },\n args: {\n wall: {\n type: \"string\",\n description:\n \"Wall-clock budget for the run (e.g. 24m, 1200s, 2h) — the deadline is now + this\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const wallMs = parseWallMs(args.wall);\n if (wallMs === null) {\n fail(`--wall must be a duration like 24m, 1200s, or 2h (got '${args.wall}')`);\n } else {\n process.stdout.write(`${String(deadlineEpochSec(wallMs, Date.now()))}\\n`);\n }\n },\n});\n\n/** The version to derive when neither --schema nor --schema-version is given: findings carries its\n * version in-data; triage/prices have no in-data signal (see registry.ts), so undefined selects the\n * registry default (latest) for the kind. */\nconst derivedSchemaVersion = (kind: SchemaKind, raw: unknown): string | undefined =>\n kind === \"findings\" ? declaredVersion(raw) : undefined;\n\n/** A bundled schema rendered for a CLI/agent to read: pretty-printed with the top-level `$schema`\n * draft declaration stripped. `claude -p --json-schema` silently disables enforcement when a schema\n * carries `$schema`, and the field DESCRIPTIONS are the authoritative spec the agent must follow, so\n * this is the form both `print-schema` and `validate --explain` emit. */\nconst printableSchema = (schemaPath: string): string => {\n const schema = JSON.parse(readFileSync(schemaPath, \"utf-8\")) as Record<string, unknown>;\n const enforcementSchema = Object.fromEntries(\n Object.entries(schema).filter(([key]) => key !== \"$schema\"),\n );\n return JSON.stringify(enforcementSchema, null, 2);\n};\n\nconst validateCmd = defineCommand({\n meta: {\n name: \"validate\",\n description: \"Validate a findings/triage/prices JSON document against the canonical schema\",\n },\n args: {\n document: {\n type: \"positional\",\n description: \"Path to the JSON document to validate (of the given --kind)\",\n required: true,\n },\n kind: {\n type: \"string\",\n description:\n \"Schema kind to validate against: findings | triage | prices (default: findings)\",\n },\n schema: {\n type: \"string\",\n description:\n \"Path to a schema file (wins over --kind; default: the bundled schema derived from --kind, --schema-version, the document's declared schema_version, or the bundled latest)\",\n },\n \"schema-version\": {\n type: \"string\",\n description:\n \"Schema major.minor version to validate against (default: the document's declared schema_version for findings, or the kind's latest)\",\n },\n explain: {\n type: \"boolean\",\n description:\n \"On failure, also print the schema after the errors — its field descriptions are the authoritative spec, so the document can be fixed in one pass instead of by trial and error\",\n },\n },\n run: async ({ args }) => {\n const kind = requireSchemaKind(args.kind || \"findings\");\n const documentRaw = readJSON(args.document);\n const schemaPath = args.schema\n ? resolve(args.schema)\n : requireSchemaPath(kind, args[\"schema-version\"] || derivedSchemaVersion(kind, documentRaw));\n const { valid, errors } = validateAgainstSchema(documentRaw, schemaPath);\n if (valid) {\n process.stdout.write(\"✅ valid\\n\");\n } else {\n process.stderr.write(\"❌ invalid\\n\");\n for (const e of errors) process.stderr.write(` - ${e}\\n`);\n if (args.explain) {\n process.stderr.write(\n `\\nThe ${kind} document must conform to this schema (the field descriptions are the authoritative spec — match the property names exactly):\\n${printableSchema(schemaPath)}\\n`,\n );\n }\n process.exit(1);\n }\n },\n});\n\nconst seedDraftCmd = defineCommand({\n meta: {\n name: \"seed-draft\",\n description:\n \"Write a valid findings $DRAFT before the review runs: the decoded findings from a prior review when one exists and still validates (incremental re-review), else an empty-but-valid scaffold — so a valid draft exists from turn 0 (issues #52, #53). Also drops a sidecar marker beside the seed so the budget hook can tell the untouched seed from a draft the agent wrote itself (issue #73). Prints the mode chosen (prior|empty|none — none when even the scaffold write failed) to stdout; always exits 0\",\n },\n args: {\n prior: {\n type: \"string\",\n description:\n \"Path to the prior-review JSON gather staged ({ id, body }, or the literal null); its embedded base64 findings marker is decoded and becomes the seed when it validates against the schema\",\n },\n out: {\n type: \"string\",\n description: \"Path to write the seed $DRAFT to (an absolute path outside the worktree)\",\n required: true,\n },\n kind: {\n type: \"string\",\n description: \"Schema kind to validate the prior findings against (default: findings)\",\n },\n schema: {\n type: \"string\",\n description: \"Path to a schema file (wins over --kind/--schema-version)\",\n },\n \"schema-version\": {\n type: \"string\",\n description:\n \"Schema major.minor to validate the prior findings against (default: the kind's latest — an older-shaped prior review then falls back to the empty scaffold)\",\n },\n },\n run: async ({ args }) => {\n const outPath = resolve(args.out);\n const kindArg = args.kind || \"findings\";\n const kind: SchemaKind = isSchemaKind(kindArg) ? kindArg : \"findings\";\n if (kind !== kindArg) {\n process.stderr.write(\n `Warning: unknown --kind \"${kindArg}\" — validating against \"findings\"\\n`,\n );\n }\n\n // seed-draft is best-effort and must NEVER fail the review step (the workflow runs it under\n // `set -e`), so every path below either seeds from the prior review or degrades to the\n // empty-but-valid scaffold — none uses the process-exiting require* helpers. The only outcome\n // that skips seeding is a scaffold write that itself throws (e.g. a bad --out directory), which\n // is warned and still exits 0: the agent then writes $DRAFT itself, exactly as before seeding.\n\n // The sidecar marker, written right AFTER the seed so its mtime bounds the seed's: the budget\n // hook treats the draft as agent-written only once its mtime passes the marker's. Only the\n // marker's mtime is ever consumed (budget.ts mainHasWrittenDraft never reads its content), so a\n // one-line sentinel suffices. Best-effort like the seed itself — without the marker the fan-out\n // gate just accepts any existing draft.\n const writeSeedMarker = (): void => {\n try {\n writeFileSync(seedMarkerPath(outPath), \"code-review seed marker\\n\");\n } catch (err) {\n process.stderr.write(\n `Warning: could not write the seed marker beside ${outPath} (${err instanceof Error ? err.message : String(err)}) — the seeded draft will count as agent-written\\n`,\n );\n }\n };\n\n const writeEmptyScaffold = (): void => {\n try {\n writeFileSync(outPath, `${JSON.stringify(noticeFindings(\"\"), null, 2)}\\n`);\n writeSeedMarker();\n process.stderr.write(\n `Seeded ${outPath} with an empty valid scaffold — no decodable prior findings to build on\\n`,\n );\n process.stdout.write(\"empty\\n\");\n } catch (err) {\n // The scaffold write itself failed — report \"none\" (not \"empty\"), so the workflow doesn't\n // tell the agent a scaffold exists that isn't there; the agent writes $DRAFT itself.\n process.stderr.write(\n `Warning: could not write the seed scaffold to ${outPath} (${err instanceof Error ? err.message : String(err)}) — the agent will create $DRAFT itself\\n`,\n );\n process.stdout.write(\"none\\n\");\n }\n };\n\n // Decode the prior review's embedded findings, tolerating a missing/absent/\"null\"/malformed\n // file. Validated against the current schema below so an older-shaped or corrupt prior review\n // degrades to the empty scaffold rather than seeding an invalid $DRAFT.\n const priorFindings = ((): unknown => {\n if (!args.prior) return null;\n const raw = ((): unknown => {\n try {\n return JSON.parse(readFileSync(resolve(args.prior), \"utf-8\")) as unknown;\n } catch {\n return null;\n }\n })();\n const body =\n typeof raw === \"object\" && raw !== null && \"body\" in raw && typeof raw.body === \"string\"\n ? raw.body\n : null;\n return body === null ? null : parseFindingsMarker(body);\n })();\n\n if (priorFindings === null) {\n writeEmptyScaffold();\n return;\n }\n\n // Resolve + validate WITHOUT the process-exiting require* helpers: any failure (bad\n // --schema-version, unreadable schema, non-matching shape, unwritable $DRAFT) degrades to the\n // scaffold so the always-exit-0 contract holds.\n const seededFromPrior = ((): boolean => {\n try {\n const schemaPath = args.schema\n ? resolve(args.schema)\n : schemaPathFor(kind, args[\"schema-version\"]);\n if (!validateAgainstSchema(priorFindings, schemaPath).valid) return false;\n writeFileSync(outPath, `${JSON.stringify(priorFindings, null, 2)}\\n`);\n writeSeedMarker();\n return true;\n } catch (err) {\n process.stderr.write(\n `Warning: could not seed from the prior review (${err instanceof Error ? err.message : String(err)}) — falling back to the empty scaffold\\n`,\n );\n return false;\n }\n })();\n\n if (seededFromPrior) {\n const priorList = (priorFindings as { readonly findings?: unknown }).findings;\n const count = Array.isArray(priorList) ? priorList.length : 0;\n process.stderr.write(\n `Seeded ${outPath} from the prior review (${String(count)} finding(s)) — verify each still holds against the current diff and refine in place\\n`,\n );\n process.stdout.write(\"prior\\n\");\n } else {\n writeEmptyScaffold();\n }\n },\n});\n\nconst adaptCmd = defineCommand({\n meta: {\n name: \"adapt\",\n description: \"Map a native agent-CLI result envelope onto the abstract SPEC §6.1 envelope\",\n },\n args: {\n native: {\n type: \"positional\",\n description: \"Path to the native result envelope JSON (from the agent CLI)\",\n required: true,\n },\n adapter: {\n type: \"string\",\n description: 'Adapter to use (currently: \"claude-code\")',\n required: true,\n },\n \"agent-file\": {\n type: \"string\",\n description:\n \"Path to a file the agent was told to write its own validated findings JSON to (wins over the native envelope's structured_output/result when it validates)\",\n },\n route: {\n type: \"string\",\n description:\n 'Review route label to stamp into the envelope (e.g. \"full review\" or \"mechanic\")',\n },\n effort: {\n type: \"string\",\n description: 'Effort label to stamp into the envelope (e.g. \"max\" or \"low\")',\n },\n transcript: {\n type: \"string\",\n description:\n \"Path to the session transcript (the main .jsonl). Its tree (main + subagents) is the source of the true wall + turn count — the native envelope only sees the main agent and under-reports a fan-out (issue #59) — and refills per-model usage too when the native has none (a wall-clock kill leaves it empty, so cost is real not $0.00 — issues #39/#36)\",\n },\n },\n run: async ({ args }) => {\n const envelope = unwrapAdapt(\n adapt(requireAdapterName(args.adapter), readJSONOrAbsent(args.native), args[\"agent-file\"], {\n route: args.route,\n effort: args.effort,\n ...(args.transcript\n ? {\n transcriptFallback: (): TranscriptTelemetry =>\n transcriptFallbackFrom(args.transcript),\n }\n : {}),\n }),\n );\n process.stdout.write(`${JSON.stringify(envelope, null, 2)}\\n`);\n },\n});\n\nconst isExtractSchemaKind = (s: string): s is ExtractKind => s === \"findings\" || s === \"triage\";\n\n/** Narrow to a schema kind the extraction ladder supports (no \"prices\" — unlike print-schema's),\n * or fail with a clear message (never falls through). */\nconst requireExtractSchemaKind = (name: string): ExtractKind => {\n if (isExtractSchemaKind(name)) return name;\n fail(`Unknown kind \"${name}\" for extract — expected one of: findings, triage`);\n throw new Error(\"unreachable\"); // fail() always exits\n};\n\n/** Fail-closed triage synthesized when the ladder can't recover a validated triage verdict — never\n * defaults to safe (§7.3). */\nconst failClosedTriage = (outcome: Exclude<LadderOutcome, { kind: \"ok\" }>): Triage => ({\n safe: false,\n reasons: describeLadderFailure(outcome),\n});\n\nconst extractCmd = defineCommand({\n meta: {\n name: \"extract\",\n description:\n \"Recover findings/triage JSON from a native agent-CLI result envelope via the deterministic extraction ladder\",\n },\n args: {\n native: {\n type: \"positional\",\n description: \"Path to the native result envelope JSON (from the agent CLI)\",\n required: true,\n },\n adapter: {\n type: \"string\",\n description: 'Adapter whose native envelope shape to extract from (currently: \"claude-code\")',\n required: true,\n },\n kind: {\n type: \"string\",\n description: \"Schema kind to extract: findings | triage\",\n required: true,\n },\n \"agent-file\": {\n type: \"string\",\n description:\n \"Path to a file the agent was told to write its own validated JSON to (findings only — a documented no-op for triage)\",\n },\n },\n run: async ({ args }) => {\n requireAdapterName(args.adapter);\n const kind = requireExtractSchemaKind(args.kind);\n const input = { kind, native: readJSON(args.native), agentFilePath: args[\"agent-file\"] };\n const outcome = extractStructured(input);\n\n if (outcome.kind === \"ok\") {\n process.stdout.write(`${JSON.stringify(outcome.candidate, null, 2)}\\n`);\n return;\n }\n // A recovery miss is otherwise opaque (only the generic reason reaches the comment); trace what\n // each rung saw to stderr so the CI log alone explains the failure — no local repro needed.\n if (outcome.kind === \"none\" || outcome.kind === \"ambiguous\") {\n process.stderr.write(`extract: recovery failed —\\n${ladderFailureDiagnostics(input)}\\n`);\n }\n if (kind === \"triage\") {\n process.stdout.write(`${JSON.stringify(failClosedTriage(outcome), null, 2)}\\n`);\n return;\n }\n fail(describeLadderFailure(outcome));\n },\n});\n\n/** `finding` with its `patch` field removed — a fresh shallow copy, `finding` itself untouched. */\nconst withoutPatch = (finding: Finding): Finding => {\n const copy = { ...finding };\n delete copy.patch;\n return copy;\n};\n\n/** A file's lines, LF-split and without a trailing-newline artifact entry; null when unreadable. */\nconst readFileLines = (path: string): readonly string[] | null => {\n try {\n const rawLines = readFileSync(path, \"utf-8\").split(\"\\n\");\n return rawLines.length > 0 && rawLines[rawLines.length - 1] === \"\"\n ? rawLines.slice(0, -1)\n : rawLines;\n } catch {\n return null;\n }\n};\n\n/** Validate one finding's `patch` (when present) against the real file at `<repoRoot>/<finding.path>`,\n * aligning the finding's `start_line`/`end_line` to the patch's removed range when it anchors one, or\n * keeping the patch as-is when it's a pure insertion with no range to anchor — either way the patch\n * is KEPT for the renderer to project. Drop the patch (logging why to stderr) when the file can't be\n * read or the patch doesn't apply cleanly — the finding survives without it, never writing a\n * suggestion. A finding with no patch passes through untouched. Never throws. */\nconst validateFinding = (finding: Finding, repoRoot: string): Finding => {\n if (finding.patch === undefined) return finding;\n const lines = readFileLines(resolve(repoRoot, finding.path));\n if (lines === null) {\n process.stderr.write(\n `validate-patches: ${finding.path}: could not read file at \"${repoRoot}\" — dropping patch\\n`,\n );\n return withoutPatch(finding);\n }\n const result = validatePatch(finding.patch, lines);\n switch (result.kind) {\n case \"anchored\":\n return { ...finding, start_line: result.startLine, end_line: result.endLine };\n case \"keep\":\n // Applies cleanly but has no removed range to anchor a suggestion — leave the finding's own\n // start_line/end_line as the inline anchor; the renderer projects the patch to a ```patch block.\n return finding;\n case \"drop\":\n process.stderr.write(\n `validate-patches: ${finding.path}:${String(finding.start_line)}: ${result.reason} — dropping patch\\n`,\n );\n return withoutPatch(finding);\n }\n};\n\nconst validatePatchesCmd = defineCommand({\n meta: {\n name: \"validate-patches\",\n description:\n \"Validate each finding's patch against the real PR-head tree, aligning the finding's range and keeping the patch when it anchors, keeping it unaligned when it's a pure insertion, or dropping it when it doesn't apply (issue #10)\",\n },\n args: {\n findings: {\n type: \"positional\",\n description: \"Path to findings JSON\",\n required: true,\n },\n \"repo-root\": {\n type: \"string\",\n description:\n \"Directory to resolve each finding's path against — the review job's checked-out, clean PR-head tree (default: .)\",\n },\n },\n run: async ({ args }) => {\n const findings = decode(FindingsCodec.decode(readJSON(args.findings)), \"findings\");\n const repoRoot = args[\"repo-root\"] ? resolve(args[\"repo-root\"]) : process.cwd();\n const validated = {\n ...findings,\n findings: findings.findings.map((f) => validateFinding(f, repoRoot)),\n };\n process.stdout.write(`${JSON.stringify(validated, null, 2)}\\n`);\n },\n});\n\n/** Narrow to a known adapter name, or fail with a clear message (never falls through). */\nconst requireAdapterName = (name: string): AdapterName => {\n if (isAdapterName(name)) return name;\n fail(`Unknown adapter \"${name}\" — supported: claude-code`);\n throw new Error(\"unreachable\"); // fail() always exits\n};\n\nconst isSchemaKind = (s: string): s is SchemaKind =>\n s === \"findings\" || s === \"triage\" || s === \"prices\";\n\n/** Narrow to a known schema kind, or fail with a clear message (never falls through). */\nconst requireSchemaKind = (name: string): SchemaKind => {\n if (isSchemaKind(name)) return name;\n fail(`Unknown schema \"${name}\" — expected one of: findings, triage, prices`);\n throw new Error(\"unreachable\"); // fail() always exits\n};\n\n/** Resolve a bundled schema path via the registry, or fail listing what's supported. */\nconst requireSchemaPath = (kind: SchemaKind, version: string | undefined): string => {\n try {\n return schemaPathFor(kind, version);\n } catch (err) {\n fail(err instanceof Error ? err.message : String(err));\n }\n throw new Error(\"unreachable\"); // fail() always exits\n};\n\nconst printSchemaCmd = defineCommand({\n meta: {\n name: \"print-schema\",\n description:\n \"Print a bundled schema JSON, ready to hand to a CLI's --json-schema (the $schema draft declaration is stripped)\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Schema to print: findings | triage | prices\",\n required: true,\n },\n \"schema-version\": {\n type: \"string\",\n description: \"Schema major.minor version to print (default: latest)\",\n },\n },\n run: async ({ args }) => {\n const schemaKind = requireSchemaKind(args.name);\n const schemaPath = requireSchemaPath(schemaKind, args[\"schema-version\"]);\n process.stdout.write(`${printableSchema(schemaPath)}\\n`);\n },\n});\n\nconst MAX_NUDGES_DEFAULT = 5;\n\n/** Drain the Stop-hook payload delivered on stdin so the caller never sees EPIPE; its content is\n * not needed — the decision comes from the draft on disk. Skips draining on a TTY (an interactive,\n * manual run with nothing piped in) since readFileSync(0) would otherwise block forever waiting\n * for EOF that never comes; absent/empty piped stdin otherwise is fine.\n * DEFERRED (known low-risk edge): a pipe held open without data + EOF could still block here, but\n * the real Stop hook writes its payload then closes (EOF), and the TTY case is guarded above, so\n * the held-open-forever case isn't the production path. Revisit only if hangs are observed. */\nconst drainStdin = (): void => {\n if (process.stdin.isTTY) return;\n try {\n readFileSync(0);\n } catch {\n // no stdin\n }\n};\n\n/** Parse `--max-nudges`: a strict positive integer (`>= 1`). A loose `Number.parseInt` accepts\n * `\"5abc\"`/`\"0x5\"` and `0 >= 0` allows on the first call — both silently DISABLE the gate. Reject\n * anything not matching `^\\d+$`, and reject `< 1`, loudly: a gate that never blocks must be an\n * explicit choice (omit the hook), never a typo. */\nconst requireMaxNudges = (raw: string | undefined): number => {\n if (raw === undefined) return MAX_NUDGES_DEFAULT;\n if (!/^\\d+$/.test(raw)) {\n fail(`--max-nudges must be a non-negative integer; got \"${raw}\"`);\n }\n const n = Number.parseInt(raw, 10);\n if (n < 1) {\n fail(`--max-nudges must be >= 1 — a gate that never blocks must be omitted, not set to ${raw}`);\n }\n return n;\n};\n\nconst stopGateCmd = defineCommand({\n meta: {\n name: \"stop-gate\",\n description:\n \"Claude Code Stop-hook gate: refuse to let the agent end its turn until --draft validates against the schema (bounded by --max-nudges). With --print-settings, emit the --settings JSON that wires this as the Stop hook.\",\n },\n args: {\n draft: {\n type: \"string\",\n description: \"Path to the findings document the agent must produce and keep valid\",\n required: true,\n },\n kind: {\n type: \"string\",\n description:\n \"Schema kind to validate against: findings | triage | prices (default: findings)\",\n },\n schema: { type: \"string\", description: \"Path to a schema file (wins over --kind)\" },\n \"schema-version\": {\n type: \"string\",\n description: \"Schema major.minor to validate against (default: the draft's declared version)\",\n },\n \"max-nudges\": {\n type: \"string\",\n description: `Times to block before relenting so the step fails downstream as before (default: ${String(MAX_NUDGES_DEFAULT)})`,\n },\n counter: {\n type: \"string\",\n description: \"Path for the nudge counter (default: <draft>.nudges)\",\n },\n \"print-settings\": {\n type: \"boolean\",\n description: \"Print the Stop-hook settings JSON that wires this gate, then exit\",\n },\n },\n run: async ({ args }) => {\n const draftPath = resolve(args.draft);\n\n if (args[\"print-settings\"]) {\n const command = defaultHookCommand(draftPath, {\n kind: args.kind,\n schema: args.schema,\n schemaVersion: args[\"schema-version\"],\n maxNudges: args[\"max-nudges\"],\n counter: args.counter,\n });\n process.stdout.write(`${JSON.stringify(stopHookSettings(command))}\\n`);\n return;\n }\n\n drainStdin();\n\n const kind = requireSchemaKind(args.kind || \"findings\");\n const maxNudges = requireMaxNudges(args[\"max-nudges\"]);\n const counterPath = args.counter ? resolve(args.counter) : `${draftPath}.nudges`;\n\n // schemaPathFor throws (rather than the process-exiting requireSchemaPath) so that a draft\n // declaring an unsupported schema_version is caught by draftState and treated as invalid —\n // i.e. a block with a helpful message — instead of crashing the hook and letting the agent stop.\n const state = draftState(draftPath, (parsed) =>\n args.schema\n ? resolve(args.schema)\n : schemaPathFor(kind, args[\"schema-version\"] || derivedSchemaVersion(kind, parsed)),\n );\n\n const nudges = readNudges(counterPath);\n const decision = decideGate(state, nudges, maxNudges, draftPath, kind);\n if (decision.kind === \"block\") {\n // CRITICAL ordering: bump the counter FIRST, and emit the block ONLY after the increment is\n // durably persisted. If the write fails, do NOT block — a block we can't bound loops forever\n // (the counter never advances → `nudges >= maxNudges` is never reached). Allow the stop and\n // log: a missed nudge is far less bad than an unbounded block loop.\n try {\n bumpNudges(counterPath, nudges);\n } catch (err) {\n process.stderr.write(\n `stop-gate: cannot persist nudge counter at ${counterPath} → allowing to avoid an unbounded block loop: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n return;\n }\n process.stdout.write(`${JSON.stringify({ decision: \"block\", reason: decision.reason })}\\n`);\n }\n },\n});\n\nconst gatherCmd = defineCommand({\n meta: {\n name: \"gather\",\n description:\n \"Resolve the PR from the CI head SHA and gather review inputs (diff with git-diff fallback, PR context, prior bot review, failing-job logs) as files for the review agent\",\n },\n args: {\n repo: { type: \"string\", description: \"Repository (owner/name)\", required: true },\n \"head-sha\": {\n type: \"string\",\n description: \"Trusted head SHA to resolve the PR (from workflow_run.head_sha)\",\n required: true,\n },\n \"head-branch\": {\n type: \"string\",\n description: \"Head branch to disambiguate the PR when multiple share a commit\",\n },\n \"run-id\": {\n type: \"string\",\n description:\n \"CI run id (from workflow_run.id); its failing jobs' logs are downloaded on failure\",\n required: true,\n },\n conclusion: {\n type: \"string\",\n description:\n \"CI conclusion (e.g. success | failure); failure triggers failing-job log download\",\n required: true,\n },\n \"bot-login\": {\n type: \"string\",\n description:\n \"Bot login whose last PR comment is captured as prior review (default: github-actions[bot])\",\n },\n \"out-dir\": {\n type: \"string\",\n description: \"Directory to write gathered files into (default: current directory)\",\n },\n },\n run: async ({ args }) => {\n const result = await gather({\n repo: args.repo,\n headSha: args[\"head-sha\"],\n headBranch: args[\"head-branch\"],\n runId: args[\"run-id\"],\n conclusion: args.conclusion,\n botLogin: args[\"bot-login\"] || \"github-actions[bot]\",\n outDir: args[\"out-dir\"] ? resolve(args[\"out-dir\"]) : process.cwd(),\n });\n process.stdout.write(renderOutputs(result));\n },\n});\n\nconst postCmd = defineCommand({\n meta: {\n name: \"post\",\n description:\n \"Post a complete review (inline comments + sticky summary) from findings + envelope + diff\",\n },\n args: {\n findings: {\n type: \"positional\",\n description: \"Path to findings JSON\",\n required: true,\n },\n \"head-sha\": {\n type: \"string\",\n description: \"Trusted head SHA to resolve the PR (from workflow_run.head_sha)\",\n required: true,\n },\n repo: {\n type: \"string\",\n description: \"Repository (owner/name)\",\n required: true,\n },\n usage: {\n type: \"string\",\n description: \"Path to result envelope JSON (from agent CLI)\",\n required: true,\n },\n prices: {\n type: \"string\",\n description:\n \"Path to price map JSON (default: bundled schema/prices.example.json — all zero)\",\n },\n template: {\n type: \"string\",\n description:\n \"Path to Eta template file for the summary comment (default: bundled templates/comment.eta)\",\n },\n \"inline-template\": {\n type: \"string\",\n description: \"Path to inline comment Eta template (default: bundled templates/inline.eta)\",\n },\n route: {\n type: \"string\",\n description:\n \"Review route label; overrides the envelope's route when set (default: read from the envelope)\",\n },\n \"bot-login\": {\n type: \"string\",\n description: \"Bot login to trust for sticky comment upsert (default: github-actions[bot])\",\n },\n \"head-branch\": {\n type: \"string\",\n description: \"Head branch to disambiguate PR when multiple share a commit\",\n },\n effort: {\n type: \"string\",\n description:\n \"Effort label; overrides the envelope's effort when set (default: read from the envelope)\",\n },\n \"test-report\": {\n type: \"string\",\n description: TEST_REPORT_DESCRIPTION,\n },\n \"run-url\": {\n type: \"string\",\n description:\n \"Workflow run URL (transcript/traces), rendered as a link in the LLM Disclosure aside\",\n },\n \"json-url\": {\n type: \"string\",\n description:\n \"URL to the machine-readable findings JSON artifact, pointed at from the sticky and each inline comment\",\n },\n },\n run: async ({ args }) => {\n const priceResolution = resolvePrices(args.prices);\n await post({\n repo: args.repo,\n headSha: args[\"head-sha\"],\n botLogin: args[\"bot-login\"] || \"github-actions[bot]\",\n findingsPath: args.findings,\n envelopePath: args.usage,\n pricesPath: priceResolution.path,\n pricesProvided: priceResolution.kind === \"provided\",\n templatePath: resolveTemplatePath(args.template),\n inlineTemplatePath: resolveInlineTemplatePath(args[\"inline-template\"]),\n route: args.route,\n headBranch: args[\"head-branch\"],\n effort: args.effort,\n testReportPath: args[\"test-report\"],\n runUrl: args[\"run-url\"],\n jsonUrl: args[\"json-url\"],\n postedAt: formatUtc(new Date()),\n });\n },\n});\n\nexport const main = defineCommand({\n meta: {\n name: \"code-review\",\n version: packageVersion,\n description:\n \"Deterministic commenter for agentic PR review — gather, render, inline, post, adapt, extract, validate-patches, cost, check-cost, validate, seed-draft, stop-gate, budget-hook, print-settings, and deadline\",\n },\n subCommands: {\n gather: gatherCmd,\n render: renderCmd,\n inline: inlineCmd,\n post: postCmd,\n cost: costCmd,\n \"check-cost\": checkCostCmd,\n validate: validateCmd,\n \"seed-draft\": seedDraftCmd,\n adapt: adaptCmd,\n extract: extractCmd,\n \"validate-patches\": validatePatchesCmd,\n \"print-schema\": printSchemaCmd,\n \"stop-gate\": stopGateCmd,\n \"budget-hook\": budgetHookCmd,\n \"print-settings\": printSettingsCmd,\n deadline: deadlineCmd,\n },\n});\n\n// Skip auto-invocation under the test runner — tests drive `main` directly via citty's runCommand.\nif (!process.env[\"VITEST\"]) {\n await runMain(main);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cost.ts","../src/patch.ts","../src/surface.ts","../src/render.ts","../src/diff.ts","../src/inline.ts","../src/util.ts","../src/transcript.ts","../src/schema.ts","../src/validate.ts","../src/stop-gate.ts","../src/budget.ts","../src/format.ts","../src/registry.ts","../src/gh.ts","../src/pr.ts","../src/post.ts","../src/gather.ts","../src/extract.ts","../src/adapt.ts","../src/settings.ts","../src/index.ts"],"names":["Eta","key","t","readFileSync","basename","join","dirname","resolvePath","resolve","reviewUrl","unanchoredCount","execFile","t2","writeFileSync","scanLine","t3"],"mappings":"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","file":"index.js","sourcesContent":["// Recomputes USD (the CLI's vendor_cost_usd is vendor-priced); warnings threaded via a `warn` sink.\n\nimport type { PriceMap, ModelUsageEntry } from \"./schema.js\";\n\nexport interface CostLine {\n readonly model: string;\n readonly inputTokens: number;\n readonly outputTokens: number;\n readonly cacheReadTokens: number;\n readonly cacheWriteTokens: number;\n readonly costUSD: number;\n}\n\nexport interface CostReport {\n readonly lines: readonly CostLine[];\n readonly totalInputTokens: number;\n readonly totalOutputTokens: number;\n readonly totalCacheReadTokens: number;\n readonly totalCacheWriteTokens: number;\n readonly totalCostUSD: number;\n}\n\nexport type Warn = (message: string) => void;\n\nconst defaultWarn: Warn = (message) => {\n process.stderr.write(`${message}\\n`);\n};\n\nconst computeModelCost = (entry: ModelUsageEntry, prices: PriceMap, warn: Warn): CostLine => {\n const p = prices.models[entry.model];\n const cacheRead = entry.cache_read_tokens ?? 0;\n const cacheWrite = entry.cache_write_tokens ?? 0;\n if (!p) {\n warn(\n `code-review cost: unknown model \"${entry.model}\" — no entry in price map; cost for this model set to $0`,\n );\n return {\n model: entry.model,\n inputTokens: entry.input_tokens,\n outputTokens: entry.output_tokens,\n cacheReadTokens: cacheRead,\n cacheWriteTokens: cacheWrite,\n costUSD: 0,\n };\n }\n const costUSD =\n (entry.input_tokens * p.in +\n entry.output_tokens * p.out +\n cacheRead * p.cache_read +\n cacheWrite * p.cache_write) /\n 1_000_000;\n return {\n model: entry.model,\n inputTokens: entry.input_tokens,\n outputTokens: entry.output_tokens,\n cacheReadTokens: cacheRead,\n cacheWriteTokens: cacheWrite,\n costUSD,\n };\n};\n\nexport const computeCost = (\n models: readonly ModelUsageEntry[],\n prices: PriceMap,\n warn: Warn = defaultWarn,\n): CostReport => {\n const lines = models.map((entry) => computeModelCost(entry, prices, warn));\n\n return {\n lines,\n totalInputTokens: lines.reduce((s, l) => s + l.inputTokens, 0),\n totalOutputTokens: lines.reduce((s, l) => s + l.outputTokens, 0),\n totalCacheReadTokens: lines.reduce((s, l) => s + l.cacheReadTokens, 0),\n totalCacheWriteTokens: lines.reduce((s, l) => s + l.cacheWriteTokens, 0),\n totalCostUSD: lines.reduce((s, l) => s + l.costUSD, 0),\n };\n};\n","// A review agent's own unified-diff patch is either validated against the real PR-head file (to\n// align a finding's range and confirm it still applies) or projected into a GitHub suggestion — two\n// pure functions over one shared hunk parser (SSOT). Assumes LF line endings (the review runs on\n// Linux); CRLF is out of scope.\n\nexport type ValidateResult =\n | { readonly kind: \"anchored\"; readonly startLine: number; readonly endLine: number }\n | { readonly kind: \"keep\"; readonly reason: string }\n | { readonly kind: \"drop\"; readonly reason: string };\n\nexport type SuggestionResult = string | { readonly kind: \"drop\"; readonly reason: string };\n\ntype BodyLine =\n | { readonly kind: \"context\"; readonly text: string }\n | { readonly kind: \"removed\"; readonly text: string }\n | { readonly kind: \"added\"; readonly text: string };\n\nconst HUNK_HEADER_RE = /^@@ -(\\d+)(?:,\\d+)? \\+\\d+(?:,\\d+)? @@/;\n\nconst hunkOldStart = (line: string): number | null => {\n const raw = HUNK_HEADER_RE.exec(line)?.[1];\n return raw !== undefined ? Number(raw) : null;\n};\n\nconst classifyBodyLine = (line: string): BodyLine | null => {\n if (line.startsWith(\" \")) return { kind: \"context\", text: line.slice(1) };\n if (line.startsWith(\"-\")) return { kind: \"removed\", text: line.slice(1) };\n if (line.startsWith(\"+\")) return { kind: \"added\", text: line.slice(1) };\n return null;\n};\n\nconst trimmedMiddle = (body: readonly BodyLine[]): readonly BodyLine[] => {\n const first = body.findIndex((l) => l.kind !== \"context\");\n if (first === -1) return [];\n const last = body.findLastIndex((l) => l.kind !== \"context\");\n return body.slice(first, last + 1);\n};\n\n// Zero-or-more removed then zero-or-more added, no context, no interleaving.\nconst isContiguousChange = (middle: readonly BodyLine[]): boolean => {\n if (middle.some((l) => l.kind === \"context\")) return false;\n const firstAdded = middle.findIndex((l) => l.kind === \"added\");\n if (firstAdded === -1) return true;\n return (\n middle.slice(0, firstAdded).every((l) => l.kind === \"removed\") &&\n middle.slice(firstAdded).every((l) => l.kind === \"added\")\n );\n};\n\ninterface RemovedRange {\n readonly lineNumber: number;\n readonly firstRemoved: number | null;\n readonly lastRemoved: number | null;\n}\n\n// The old-side line number advances on context and removed lines, not added ones.\nconst removedRange = (body: readonly BodyLine[], oldStart: number): RemovedRange =>\n body.reduce<RemovedRange>(\n (acc, line) =>\n line.kind === \"added\"\n ? acc\n : {\n lineNumber: acc.lineNumber + 1,\n firstRemoved:\n line.kind === \"removed\" && acc.firstRemoved === null\n ? acc.lineNumber\n : acc.firstRemoved,\n lastRemoved: line.kind === \"removed\" ? acc.lineNumber : acc.lastRemoved,\n },\n { lineNumber: oldStart, firstRemoved: null, lastRemoved: null },\n );\n\nconst drop = (reason: string): { readonly kind: \"drop\"; readonly reason: string } => ({\n kind: \"drop\",\n reason,\n});\n\nconst keep = (reason: string): { readonly kind: \"keep\"; readonly reason: string } => ({\n kind: \"keep\",\n reason,\n});\n\ntype ParsedHunk =\n | { readonly kind: \"ok\"; readonly oldStart: number; readonly body: readonly BodyLine[] }\n | { readonly kind: \"drop\"; readonly reason: string };\n\n// SSOT shared by validatePatch and patchToSuggestion; drops on != 1 hunk or a malformed body line.\nconst parseHunk = (patch: string): ParsedHunk => {\n const rawLines = patch.split(\"\\n\");\n // A trailing newline splits into a trailing \"\" element — not a line of content.\n const lines =\n rawLines.length > 0 && rawLines[rawLines.length - 1] === \"\" ? rawLines.slice(0, -1) : rawLines;\n\n const headerHits = lines.reduce<readonly { readonly index: number; readonly oldStart: number }[]>(\n (acc, line, index) => {\n const oldStart = hunkOldStart(line);\n return oldStart !== null ? [...acc, { index, oldStart }] : acc;\n },\n [],\n );\n if (headerHits.length !== 1) {\n return drop(`expected exactly one hunk, got ${String(headerHits.length)}`);\n }\n const hit = headerHits[0];\n if (hit === undefined) return drop(\"malformed hunk header\");\n\n // Header-preceding lines (diff --git/index/---/+++) are never examined; a trailing\n // \"\\" marker carries no content.\n const bodyRaw = lines.slice(hit.index + 1).filter((line) => !line.startsWith(\"\\\\\"));\n const classified = bodyRaw.map(classifyBodyLine);\n if (classified.some((line) => line === null)) return drop(\"malformed hunk body line\");\n const body = classified.filter((line): line is BodyLine => line !== null);\n\n return { kind: \"ok\", oldStart: hit.oldStart, body };\n};\n\n// fileLines are 0-indexed and WITHOUT trailing newlines. Anchors when the removed lines give a range,\n// keeps a pure insertion (no range) for the renderer's ```patch fallback, drops on a context mismatch.\nexport const validatePatch = (patch: string, fileLines: readonly string[]): ValidateResult => {\n const parsed = parseHunk(patch);\n if (parsed.kind === \"drop\") return parsed;\n const { oldStart, body } = parsed;\n\n const oldSideTexts = body.filter((l) => l.kind !== \"added\").map((l) => l.text);\n const expected = fileLines.slice(oldStart - 1, oldStart - 1 + oldSideTexts.length);\n const oldSideMatches =\n expected.length === oldSideTexts.length &&\n expected.every((line, i) => line === oldSideTexts[i]);\n if (!oldSideMatches) {\n return drop(\n `patch context does not match the file at lines ${String(oldStart)}..${String(oldStart + oldSideTexts.length - 1)}`,\n );\n }\n\n if (!isContiguousChange(trimmedMiddle(body))) {\n return drop(\"change is not a single contiguous block\");\n }\n\n const removedCount = body.filter((l) => l.kind === \"removed\").length;\n const addedCount = body.filter((l) => l.kind === \"added\").length;\n if (removedCount === 0 && addedCount === 0) return drop(\"hunk contains no changes\");\n if (removedCount === 0) {\n return keep(\"pure insertion applies cleanly but has no removed range to anchor a suggestion\");\n }\n\n const { firstRemoved, lastRemoved } = removedRange(body, oldStart);\n if (firstRemoved === null || lastRemoved === null) return drop(\"malformed hunk body\");\n\n return { kind: \"anchored\", startLine: firstRemoved, endLine: lastRemoved };\n};\n\n// The added lines alone (no file needed). An all-deletion hunk yields \"\" (delete the range); a pure\n// insertion has nothing to replace.\nexport const patchToSuggestion = (patch: string): SuggestionResult => {\n const parsed = parseHunk(patch);\n if (parsed.kind === \"drop\") return parsed;\n const { body } = parsed;\n\n if (!isContiguousChange(trimmedMiddle(body))) {\n return drop(\"change is not a single contiguous block\");\n }\n\n const removedCount = body.filter((l) => l.kind === \"removed\").length;\n const addedLines = body.filter((l) => l.kind === \"added\");\n if (removedCount === 0 && addedLines.length === 0) return drop(\"hunk contains no changes\");\n if (removedCount === 0) return drop(\"pure insertion can't be expressed as a suggestion\");\n\n return addedLines.map((l) => l.text).join(\"\\n\");\n};\n","// Single source of truth for the bits every render surface (sticky, inline comment, review body)\n// must agree on: severity→emoji, the machine-readable findings-json marker, and patch→suggestion\n// projection. Pure.\n\nimport type { Finding, Findings } from \"./schema.js\";\nimport { patchToSuggestion } from \"./patch.js\";\n\nexport const severityEmoji = (s: string): string => {\n switch (s) {\n case \"critical\":\n return \"🔴\";\n case \"major\":\n return \"🟠\";\n case \"minor\":\n return \"🔵\";\n case \"nit\":\n return \"⚪\";\n default:\n return \"❓\";\n }\n};\n\n// ~30KB of JSON in base64 — well under GitHub's 65536-char comment limit.\nconst EMBED_LIMIT = 40000;\n\n// Travels with the marker on every surface so a reader who sees only one comment still knows to decode it.\nconst AGENTS_STOP_DIRECTIVE =\n \"<!-- AGENTS: STOP — do not parse the prose below; decode this findings JSON and read schema_version first. -->\";\n\nconst encodeMarker = (document: unknown, jsonUrl: string | undefined, limit: number): string => {\n const b64 = Buffer.from(JSON.stringify(document), \"utf-8\").toString(\"base64\");\n const marker =\n b64.length <= limit\n ? `<!-- code-review:findings-json;base64 ${b64} -->`\n : jsonUrl\n ? `<!-- code-review:findings-json ${jsonUrl} -->`\n : \"\";\n return marker ? `${AGENTS_STOP_DIRECTIVE}\\n${marker}` : \"\";\n};\n\nexport const findingsPointer = (\n findings: Findings,\n jsonUrl: string | undefined,\n limit = EMBED_LIMIT,\n): string => encodeMarker(findings, jsonUrl, limit);\n\n// Per-finding counterpart: an inline comment embeds only its own finding, so the sticky and review\n// body stay the whole-document SSOT.\nexport const findingPointer = (\n finding: Finding,\n schemaVersion: string,\n jsonUrl?: string,\n limit = EMBED_LIMIT,\n): string => encodeMarker({ schema_version: schemaVersion, findings: [finding] }, jsonUrl, limit);\n\n// null when the marker is absent or holds the all-zeros placeholder (no head SHA was stamped),\n// so callers treat an unknown prior commit as a new-commit re-review rather than asserting a match.\nconst ZERO_SHA = \"0000000000000000000000000000000000000000\";\nexport const parseReviewedSha = (body: string): string | null => {\n const sha = /<!-- reviewed-sha: ([0-9a-fA-F]{40}) -->/.exec(body)?.[1]?.toLowerCase();\n return sha && sha !== ZERO_SHA ? sha : null;\n};\n\n// null when the body carries no base64 marker (e.g. the jsonUrl-link fallback for oversized findings)\n// or the payload isn't valid JSON. Callers validate the result — a prior run may predate the shape.\nexport const parseFindingsMarker = (body: string): unknown => {\n const match = /<!-- code-review:findings-json;base64 ([A-Za-z0-9+/=]+) -->/.exec(body);\n const b64 = match?.[1];\n if (b64 === undefined) return null;\n try {\n return JSON.parse(Buffer.from(b64, \"base64\").toString(\"utf-8\"));\n } catch {\n return null;\n }\n};\n\n// Escape triple-backticks so fenced content can't break out of its block.\nconst escapeFence = (text: string): string => text.replace(/```/g, \"`` ` ``\");\n\n// A GitHub ```suggestion when the patch lowers to replacement text, a non-lossy ```patch fallback\n// when it can't, or nothing when the finding carries no patch.\nexport type PatchProjection =\n | { readonly kind: \"suggestion\"; readonly text: string }\n | { readonly kind: \"patch\"; readonly raw: string }\n | { readonly kind: \"none\" };\n\nexport const projectPatch = (patch: string | undefined): PatchProjection => {\n if (patch === undefined) return { kind: \"none\" };\n const lowered = patchToSuggestion(patch);\n return typeof lowered === \"string\"\n ? { kind: \"suggestion\", text: escapeFence(lowered) }\n : { kind: \"patch\", raw: escapeFence(patch) };\n};\n\nexport const formatConfidence = (n: number): string => n.toFixed(2);\n\n// The review-object body: the findings-json marker (when present) then a one-line pointer to the\n// sticky. SSOT shared by the commenter (post.ts) and the `preview` command.\nexport const reviewBodyPointer = (\n headSha: string,\n stickyUrl: string | undefined,\n marker: string,\n): string => {\n const sha7 = headSha.slice(0, 7);\n const linkLine = stickyUrl\n ? `🤖 Automated code review for \\`${sha7}\\` — see the [summary comment](${stickyUrl}) for the verdict, walkthrough, and cost.`\n : `🤖 Automated code review for \\`${sha7}\\` — see the summary comment for the verdict, walkthrough, and cost.`;\n return marker ? `${marker}\\n\\n${linkLine}` : linkLine;\n};\n","// Pure data-in, string-out Eta rendering — no side effects, no model invocation.\n\nimport { Eta } from \"eta\";\nimport type { Finding, Severity } from \"./schema.js\";\nimport type { RenderInput, SeverityCounts } from \"./types.js\";\nimport { computeCost } from \"./cost.js\";\nimport { severityEmoji, findingsPointer, projectPatch, formatConfidence } from \"./surface.js\";\nimport type { PatchProjection } from \"./surface.js\";\n\n// pipes break markdown table columns.\nconst escapePipes = (text: string): string => text.replace(/\\|/g, \"\\\\|\");\n\n// backticks break inline code spans.\nconst escapeCodeBackticks = (text: string): string => text.replace(/`/g, \"-\");\n\ntype StrayView = Finding & { readonly patchProjection: PatchProjection };\n\nconst sanitizeFinding = (f: Finding): StrayView => ({\n ...f,\n title: escapePipes(f.title),\n path: escapeCodeBackticks(f.path),\n patchProjection: projectPatch(f.patch),\n});\n\nconst emptySeverityCounts = (): Record<Severity, number> => ({\n critical: 0,\n major: 0,\n minor: 0,\n nit: 0,\n});\n\nexport const computeSeverityCounts = (findings: readonly Finding[]): SeverityCounts =>\n findings.reduce<Record<Severity, number>>(\n (acc, f) => (f.severity in acc ? { ...acc, [f.severity]: acc[f.severity] + 1 } : acc),\n emptySeverityCounts(),\n );\n\nexport const render = (input: RenderInput): string => {\n const eta = new Eta({ autoTrim: false });\n const usageAvailable = input.envelope !== null;\n const costReport = input.envelope ? computeCost(input.envelope.models, input.prices) : null;\n const pricesProvided = input.pricesProvided ?? true;\n const route = input.route ?? input.envelope?.route ?? null;\n const effort = input.effort ?? input.envelope?.effort ?? null;\n const modelNames = input.envelope ? input.envelope.models.map((m) => m.model).join(\", \") : \"\";\n\n return eta.renderString(input.template, {\n findings: input.findings,\n envelope: input.envelope,\n usageAvailable,\n costReport,\n pricesProvided,\n route,\n effort,\n modelNames,\n testReport: input.testReport ?? null,\n reviewedSha: input.reviewedSha ?? \"0000000000000000000000000000000000000000\",\n postedAt: input.postedAt ?? \"\",\n severityCounts: input.severityCounts ?? computeSeverityCounts(input.findings.findings),\n strays: (input.strays ?? []).map(sanitizeFinding),\n unanchoredCount: input.unanchoredCount ?? 0,\n inlineDisposition: input.inlineDisposition ?? null,\n runUrl: input.runUrl ?? null,\n jsonUrl: input.jsonUrl ?? null,\n findingsPointer: input.findingsPointer ?? findingsPointer(input.findings, input.jsonUrl),\n reviewUrl: input.reviewUrl ?? null,\n formatTokens: (n: number): string =>\n Number.isFinite(n) && n >= 0 ? n.toLocaleString(\"en-US\") : \"—\",\n // N/A (never a false $0.00) when no real price map was provided — real tokens, no rates to price them.\n formatCost: (n: number): string =>\n !pricesProvided\n ? \"N/A\"\n : Number.isFinite(n)\n ? n > 0 && n.toFixed(2) === \"0.00\"\n ? \"<$0.01\"\n : `$${n.toFixed(2)}`\n : \"—\",\n formatDuration: (ms: number): string => {\n if (!Number.isFinite(ms) || ms < 0) return \"—\";\n const s = Math.round(ms / 1000);\n return s >= 60 ? `${String(Math.floor(s / 60))}m ${String(s % 60)}s` : `${String(s)}s`;\n },\n verdictBadge: (v: string): string => {\n switch (v) {\n case \"approve\":\n return \"✅ approved\";\n case \"comment\":\n return \"💬 comment\";\n case \"changes\":\n return \"🔧 changes requested\";\n default:\n return `❓ ${v}`;\n }\n },\n severityEmoji,\n formatConfidence,\n });\n};\n","import parseDiff from \"parse-diff\";\nimport type { Finding, Side } from \"./schema.js\";\n\nexport type DiffLineIndex = ReadonlySet<string>;\n\nconst key = (path: string, line: number): string => `${path}:${String(line)}`;\n\nconst indexChanges = (\n keys: Set<string>,\n fpath: string,\n changes: ReadonlyArray<{\n readonly type: \"normal\" | \"add\" | \"del\";\n readonly ln1?: number;\n readonly ln2?: number;\n readonly ln?: number;\n }>,\n): void => {\n for (const change of changes) {\n if (change.type === \"normal\") {\n if (change.ln1 !== undefined) keys.add(key(fpath, change.ln1));\n if (change.ln2 !== undefined) keys.add(key(fpath, change.ln2));\n } else if (change.ln !== undefined) {\n keys.add(key(fpath, change.ln));\n }\n }\n};\n\n// For renamed files, both old and new paths are indexed so a finding on either matches.\nexport const indexDiff = (diff: string): DiffLineIndex => {\n const files = parseDiff(diff);\n if (!Array.isArray(files)) return new Set();\n\n const keys = new Set<string>();\n for (const file of files) {\n // from ?? to covers deleted (to=/dev/null), new (from undefined), and modified; a rename differs\n // and is indexed under both paths.\n const primary = file.from ?? file.to;\n if (!primary) continue;\n\n indexChanges(\n keys,\n primary,\n file.chunks.flatMap((c) => c.changes),\n );\n\n if (file.to && file.to !== \"/dev/null\" && file.to !== primary) {\n indexChanges(\n keys,\n file.to,\n file.chunks.flatMap((c) => c.changes),\n );\n }\n }\n return keys;\n};\n\nexport const isInDiff = (index: DiffLineIndex, path: string, line: number): boolean =>\n index.has(key(path, line));\n\nexport const isEmptyDiff = (diff: string): boolean => {\n if (diff.trim().length === 0) return true;\n const files = parseDiff(diff);\n return !Array.isArray(files) || files.length === 0 || files.every((f) => f.chunks.length === 0);\n};\n\nexport const defaultSide = (side: string | undefined): Side => (side === \"LEFT\" ? \"LEFT\" : \"RIGHT\");\n\nexport const partitionFindings = (\n findings: readonly Finding[],\n index: DiffLineIndex,\n): {\n readonly inDiff: readonly Finding[];\n readonly strays: readonly Finding[];\n} => {\n const inDiff: Finding[] = [];\n const strays: Finding[] = [];\n for (const f of findings) {\n if (isInDiff(index, f.path, f.start_line) && isInDiff(index, f.path, f.end_line)) {\n inDiff.push(f);\n } else {\n strays.push(f);\n }\n }\n return { inDiff, strays };\n};\n","import { Eta } from \"eta\";\nimport { partitionFindings, indexDiff, defaultSide } from \"./diff.js\";\nimport { severityEmoji, findingPointer, projectPatch, formatConfidence } from \"./surface.js\";\nimport type { Finding, Findings } from \"./schema.js\";\nimport type { InlineComment, InlineResult } from \"./types.js\";\n\nconst formatModels = (models: readonly string[]): string =>\n models.length > 0 ? models.map((m) => `\\`${m}\\``).join(\"/\") : \"an AI model\";\n\n// The template is the SSOT for all body text; TS supplies only data. The patch is projected here\n// (never a `suggestion` field — that field is gone as of schema 0.4).\nconst renderCommentBody = (\n f: Finding,\n eta: Eta,\n template: string,\n modelsText: string,\n jsonUrl: string | undefined,\n pointer: string,\n): string =>\n // Eta.renderString returns string | Promise<string>; with autoTrim:false it's always sync.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n eta.renderString(template, {\n ...f,\n patchProjection: projectPatch(f.patch),\n severityEmoji,\n formatConfidence,\n modelsText,\n jsonUrl: jsonUrl ?? null,\n findingsPointer: pointer,\n }) as string;\n\nexport interface InlineContext {\n readonly inlineTemplate: string;\n readonly models?: readonly string[];\n readonly jsonUrl?: string;\n // Each in-diff comment embeds only its OWN finding, but needs the document's schema_version to do\n // so; omitted when the caller has no document (each comment's marker is then omitted too).\n readonly findings?: Findings;\n}\n\nexport const buildInlineComments = (\n findings: readonly Finding[],\n diff: string,\n context: InlineContext,\n): InlineResult => {\n const { inlineTemplate, models = [], jsonUrl, findings: fullFindings } = context;\n const index = indexDiff(diff);\n const { inDiff, strays } = partitionFindings(findings, index);\n const eta = new Eta({ autoTrim: false });\n const modelsText = formatModels(models);\n\n const comments: InlineComment[] = inDiff.map((f) => {\n const pointer = fullFindings ? findingPointer(f, fullFindings.schema_version, jsonUrl) : \"\";\n const comment: InlineComment = {\n path: f.path,\n line: f.end_line,\n side: defaultSide(f.side),\n body: renderCommentBody(f, eta, inlineTemplate, modelsText, jsonUrl, pointer),\n };\n if (f.start_line < f.end_line) {\n return {\n ...comment,\n start_line: f.start_line,\n start_side: defaultSide(f.side),\n };\n }\n return comment;\n });\n\n return { comments, strays, inDiff };\n};\n\nexport const renderStraysSection = (strays: readonly Finding[]): string => {\n if (strays.length === 0) return \"\";\n\n const items = strays.map(\n (f) => `- **${f.severity}** · \\`${f.path}:${String(f.start_line)}\\` — ${f.title}`,\n );\n\n return [\n \"\",\n \"---\",\n \"\",\n \"#### ⚠️ Findings on lines not in the diff (demoted to summary)\",\n \"\",\n ...items,\n ].join(\"\\n\");\n};\n","import { readFileSync } from \"node:fs\";\n\nexport const asRecord = (u: unknown): Record<string, unknown> | null =>\n typeof u === \"object\" && u !== null && !Array.isArray(u) ? (u as Record<string, unknown>) : null;\n\nexport const errMsg = (e: unknown): string => (e instanceof Error ? e.message : String(e));\n\nexport type ParseResult = { readonly ok: true; readonly value: unknown } | { readonly ok: false };\n\nexport const tryParseJson = (text: string): ParseResult => {\n try {\n return { ok: true, value: JSON.parse(text) as unknown };\n } catch {\n return { ok: false };\n }\n};\n\nexport const readFileOrNull = (path: string): string | null => {\n try {\n return readFileSync(path, \"utf-8\");\n } catch {\n return null;\n }\n};\n","// The transcript is the only surviving spend record when a wall-clock kill leaves no clean result\n// envelope, and the live in-flight signal the budget hook steers on. Reading is total: a truncated\n// final line (a `timeout` kill mid-flush) or any malformed entry is skipped, never thrown.\n\nimport { readdirSync } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport type { ModelUsageEntry } from \"./schema.js\";\nimport { asRecord, readFileOrNull } from \"./util.js\";\n\nexport interface TranscriptUsage {\n readonly models: readonly ModelUsageEntry[];\n readonly turns: number;\n readonly durationMs: number;\n readonly firstTsMs: number | null;\n readonly lastTsMs: number | null;\n}\n\n// `missing` distinguishes an unreadable main transcript (no signal at all) from an empty-but-present one.\nexport interface TranscriptTree {\n readonly entries: readonly unknown[];\n readonly files: readonly string[];\n readonly missing: boolean;\n}\n\n// Non-negative finite, else 0 — a NaN/absent field must not poison the sum.\nconst numField = (rec: Record<string, unknown>, key: string): number => {\n const v = rec[key];\n return typeof v === \"number\" && Number.isFinite(v) && v >= 0 ? v : 0;\n};\n\ninterface MessageUsage {\n readonly id: string | null;\n readonly model: string;\n readonly input: number;\n readonly output: number;\n readonly cacheRead: number;\n readonly cacheWrite: number;\n}\n\n// Claude Code names cache fields cache_read_input_tokens/cache_creation_input_tokens; the abstract\n// envelope names them cache_read_tokens/cache_write_tokens — the rename happens here. `id` is carried\n// so a message logged across several lines (one per content block of a parallel tool-use turn, each\n// repeating the message-level usage) is summed once.\nconst messageUsage = (entry: unknown): MessageUsage | null => {\n const rec = asRecord(entry);\n if (rec === null || rec[\"type\"] !== \"assistant\") return null;\n const msg = asRecord(rec[\"message\"]);\n if (msg === null) return null;\n const model = msg[\"model\"];\n const usage = asRecord(msg[\"usage\"]);\n if (typeof model !== \"string\" || usage === null) return null;\n const id = msg[\"id\"];\n return {\n id: typeof id === \"string\" ? id : null,\n model,\n input: numField(usage, \"input_tokens\"),\n output: numField(usage, \"output_tokens\"),\n cacheRead: numField(usage, \"cache_read_input_tokens\"),\n cacheWrite: numField(usage, \"cache_creation_input_tokens\"),\n };\n};\n\nconst tsMsOf = (entry: unknown): number | null => {\n const rec = asRecord(entry);\n const ts = rec?.[\"timestamp\"];\n if (typeof ts !== \"string\") return null;\n const ms = Date.parse(ts);\n return Number.isNaN(ms) ? null : ms;\n};\n\ninterface Totals {\n readonly input: number;\n readonly output: number;\n readonly cacheRead: number;\n readonly cacheWrite: number;\n}\nconst EMPTY_TOTALS: Totals = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n\n// One object per non-blank line, dropping any that fails to parse — this makes a timeout-truncated\n// final line a no-op rather than a crash.\nexport const parseJsonl = (text: string): readonly unknown[] =>\n text\n .split(\"\\n\")\n .filter((line) => line.trim() !== \"\")\n .flatMap((line) => {\n try {\n return [JSON.parse(line) as unknown];\n } catch {\n return [];\n }\n });\n\n// A message logged over multiple lines (repeated message.id) is counted once — otherwise a parallel\n// tool-use turn's usage, stamped on every content-block line, is summed several times and inflates\n// spend. Entries with no id are counted as-is. `models` order follows first-appearance.\nexport const sumTranscriptUsage = (entries: readonly unknown[]): TranscriptUsage => {\n const summed = entries.reduce<{ totals: Map<string, Totals>; turns: number; seen: Set<string> }>(\n (acc, entry) => {\n const u = messageUsage(entry);\n if (u === null) return acc;\n if (u.id !== null && acc.seen.has(u.id)) return acc;\n if (u.id !== null) acc.seen.add(u.id);\n const prev = acc.totals.get(u.model) ?? EMPTY_TOTALS;\n acc.totals.set(u.model, {\n input: prev.input + u.input,\n output: prev.output + u.output,\n cacheRead: prev.cacheRead + u.cacheRead,\n cacheWrite: prev.cacheWrite + u.cacheWrite,\n });\n return { totals: acc.totals, turns: acc.turns + 1, seen: acc.seen };\n },\n { totals: new Map(), turns: 0, seen: new Set() },\n );\n\n const models: readonly ModelUsageEntry[] = [...summed.totals].map(([model, t]) => ({\n model,\n input_tokens: t.input,\n output_tokens: t.output,\n cache_read_tokens: t.cacheRead,\n cache_write_tokens: t.cacheWrite,\n }));\n\n const bounds = entries.reduce<{ min: number | null; max: number | null }>(\n (acc, entry) => {\n const ms = tsMsOf(entry);\n if (ms === null) return acc;\n return {\n min: acc.min === null || ms < acc.min ? ms : acc.min,\n max: acc.max === null || ms > acc.max ? ms : acc.max,\n };\n },\n { min: null, max: null },\n );\n\n return {\n models,\n turns: summed.turns,\n durationMs: bounds.min !== null && bounds.max !== null ? bounds.max - bounds.min : 0,\n firstTsMs: bounds.min,\n lastTsMs: bounds.max,\n };\n};\n\n// Claude Code writes each subagent to <dir>/<session-id>/subagents/agent-*.jsonl, beside\n// <dir>/<session-id>.jsonl. An empty result covers a missing directory or an older/other layout.\nconst subagentFiles = (mainPath: string): readonly string[] => {\n const dir = join(dirname(mainPath), basename(mainPath, \".jsonl\"), \"subagents\");\n try {\n return readdirSync(dir)\n .filter((name) => name.endsWith(\".jsonl\"))\n .map((name) => join(dir, name));\n } catch {\n return [];\n }\n};\n\n// Two layouts: subagents in their own files, OR inlined into the main marked isSidechain:true. Read\n// the sibling files ONLY when the main carries no inline sidechain, so either layout is summed once.\nexport const readTranscriptTree = (mainPath: string): TranscriptTree => {\n const mainText = readFileOrNull(mainPath);\n const mainEntries = mainText === null ? [] : parseJsonl(mainText);\n const inlineSidechains = mainEntries.some((e) => asRecord(e)?.[\"isSidechain\"] === true);\n const siblings = inlineSidechains ? [] : subagentFiles(mainPath);\n const siblingReads = siblings.flatMap((path) => {\n const text = readFileOrNull(path);\n return text === null ? [] : [{ path, entries: parseJsonl(text) }];\n });\n return {\n entries: [...mainEntries, ...siblingReads.flatMap((r) => r.entries)],\n files: [...(mainText === null ? [] : [mainPath]), ...siblingReads.map((r) => r.path)],\n missing: mainText === null,\n };\n};\n","// These codecs ARE the source of truth for the data shapes (types via t.TypeOf<>); no hand-written\n// DTO types exist elsewhere — import types from here.\n\nimport * as t from \"io-ts\";\n\nconst SeverityCodec = t.union([\n t.literal(\"critical\"),\n t.literal(\"major\"),\n t.literal(\"minor\"),\n t.literal(\"nit\"),\n]);\n\nconst SideCodec = t.union([t.literal(\"RIGHT\"), t.literal(\"LEFT\")]);\n\nconst VerdictCodec = t.union([t.literal(\"approve\"), t.literal(\"comment\"), t.literal(\"changes\")]);\n\nconst LineNumber = t.refinement(\n t.number,\n (n): n is number => Number.isInteger(n) && n >= 1,\n \"LineNumber\",\n);\n\nconst Confidence = t.refinement(t.number, (n): n is number => n >= 0 && n <= 1, \"Confidence\");\n\n// Mirrors findings.schema.json's schema_version.pattern exactly, so resolve() never accepts a value\n// the ajv gate would reject (e.g. a truncated \"0.2\" or an over-long \"0.2.0.0\").\nconst SCHEMA_VERSION_RE =\n /^(0|[1-9]\\d*)\\.(\\d+)\\.(\\d+)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/;\n\nconst SchemaVersion = t.refinement(\n t.string,\n (s): s is string => SCHEMA_VERSION_RE.test(s),\n \"SchemaVersion\",\n);\n\nconst FindingShape = t.intersection([\n t.type({\n path: t.string,\n start_line: LineNumber,\n end_line: LineNumber,\n severity: SeverityCodec,\n title: t.string,\n description: t.string,\n reasoning: t.string,\n confidence: Confidence,\n }),\n t.partial({\n side: SideCodec,\n code: t.string,\n code_url: t.string,\n recommendation: t.string,\n patch: t.string,\n }),\n]);\n\nconst EndGeStart = t.refinement(\n FindingShape,\n (f): f is t.TypeOf<typeof FindingShape> => f.end_line >= f.start_line,\n \"EndGeStart\",\n);\n\nexport const FindingCodec = t.exact(EndGeStart);\n\nexport const FindingsCodec = t.exact(\n t.type({\n schema_version: SchemaVersion,\n summary: t.string,\n verdict: VerdictCodec,\n findings: t.array(FindingCodec),\n }),\n);\n\nexport const TriageCodec = t.type({\n safe: t.boolean,\n reasons: t.string,\n});\n\n// Abstract, vendor-neutral result envelope (SPEC §6.1) — not any adapter's native shape.\nconst TokenCount = t.refinement(\n t.number,\n (n): n is number => Number.isInteger(n) && n >= 0,\n \"TokenCount\",\n);\n\nexport const ModelUsageEntryCodec = t.intersection([\n t.type({\n model: t.string,\n input_tokens: TokenCount,\n output_tokens: TokenCount,\n }),\n t.partial({\n cache_read_tokens: TokenCount,\n cache_write_tokens: TokenCount,\n }),\n]);\n\nexport const ResultEnvelopeCodec = t.intersection([\n t.type({\n schema_version: t.string,\n findings: FindingsCodec,\n models: t.array(ModelUsageEntryCodec),\n turns: TokenCount,\n duration_ms: TokenCount,\n }),\n t.partial({\n vendor_cost_usd: t.union([t.number, t.null]),\n route: t.string,\n effort: t.string,\n }),\n]);\n\nexport const ModelPricesCodec = t.type({\n in: t.number,\n out: t.number,\n cache_read: t.number,\n cache_write: t.number,\n});\n\nexport const PriceMapCodec = t.type({\n _updated: t.string,\n _unit: t.string,\n models: t.record(t.string, ModelPricesCodec),\n});\n\n// Format-agnostic test summary (SPEC §5.1 item 4, REQ-CO-9) — any conforming test report shape.\nexport const TestFailureCodec = t.intersection([\n t.type({ name: t.string }),\n t.partial({ message: t.string }),\n]);\n\nexport const TestSummaryCodec = t.intersection([\n t.type({\n passed: t.number,\n failed: t.number,\n total: t.number,\n }),\n t.partial({\n failures: t.array(TestFailureCodec),\n }),\n]);\n\n// Used when an adapter's native output omits schema_version; the registry sources its findings\n// defaultVersion from this.\nexport const DEFAULT_SCHEMA_VERSION = \"0.4.0\";\n\nexport type Finding = t.TypeOf<typeof FindingCodec>;\nexport type Findings = t.TypeOf<typeof FindingsCodec>;\n\n// A valid empty-findings document carrying `summary` as its only content — the single shape for a\n// notice and a \"did not complete\" envelope. Callers supply fully-formatted markdown.\nexport const noticeFindings = (summary: string): Findings => ({\n schema_version: DEFAULT_SCHEMA_VERSION,\n summary,\n verdict: \"comment\",\n findings: [],\n});\nexport type Triage = t.TypeOf<typeof TriageCodec>;\nexport type Severity = t.TypeOf<typeof SeverityCodec>;\nexport type Side = t.TypeOf<typeof SideCodec>;\nexport type Verdict = t.TypeOf<typeof VerdictCodec>;\nexport type ModelUsageEntry = t.TypeOf<typeof ModelUsageEntryCodec>;\nexport type ResultEnvelope = t.TypeOf<typeof ResultEnvelopeCodec>;\nexport type ModelPrices = t.TypeOf<typeof ModelPricesCodec>;\nexport type PriceMap = t.TypeOf<typeof PriceMapCodec>;\nexport type TestFailure = t.TypeOf<typeof TestFailureCodec>;\nexport type TestSummary = t.TypeOf<typeof TestSummaryCodec>;\n","// Defense-in-depth: the CLI already enforces the schema on the agent side.\n\nimport { Ajv2020 } from \"ajv/dist/2020.js\";\nimport type { ValidateFunction as AjvValidateFunction } from \"ajv/dist/2020.js\";\nimport _addFormats from \"ajv-formats\";\nimport { readFileSync } from \"node:fs\";\nimport type { Either } from \"fp-ts/Either\";\nimport { FindingsCodec } from \"./schema.js\";\nimport type { Findings } from \"./schema.js\";\n\nconst addFormats = _addFormats as unknown as (ajv: Ajv2020) => void;\n\nconst validatorCache = new Map<string, AjvValidateFunction>();\n\nconst compileSchema = (schemaPath: string): AjvValidateFunction => {\n const cached = validatorCache.get(schemaPath);\n if (cached) return cached;\n\n let schemaJson: string;\n try {\n schemaJson = readFileSync(schemaPath, \"utf-8\");\n } catch {\n throw new Error(`Cannot read schema file: ${schemaPath}`);\n }\n let schema: unknown;\n try {\n schema = JSON.parse(schemaJson);\n } catch {\n throw new Error(`Invalid JSON in schema file: ${schemaPath}`);\n }\n const ajv = new Ajv2020({ allErrors: true, strict: true });\n addFormats(ajv);\n const validator = ajv.compile(schema as Record<string, unknown>);\n validatorCache.set(schemaPath, validator);\n return validator;\n};\n\nexport interface ValidateResult {\n readonly valid: boolean;\n readonly errors: readonly string[];\n}\n\nexport const validateAgainstSchema = (findings: unknown, schemaPath: string): ValidateResult => {\n const validator = compileSchema(schemaPath);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion -- ajv returns boolean | Promise<unknown>\n const valid = validator(findings) as boolean;\n const errors: readonly string[] =\n valid || !validator.errors\n ? []\n : validator.errors.map((e) => `${e.instancePath} ${e.message ?? \"unknown error\"}`);\n return { valid, errors };\n};\n\nexport const unsafeUnwrap = <A>(decoded: Either<unknown, A>): A => {\n if (decoded._tag === \"Right\") return decoded.right;\n throw new Error(\"io-ts decode failed — data does not match expected shape\");\n};\n\nexport const decodeFindings = (data: unknown): Findings => unsafeUnwrap(FindingsCodec.decode(data));\n","// A Claude Code Stop hook that refuses to let the review agent end its turn until it has written a\n// findings document that validates against the schema — turning \"validate before stopping\" from a\n// hope into an invariant. Same validation as `code-review validate`.\n\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { validateAgainstSchema } from \"./validate.js\";\nimport { errMsg } from \"./util.js\";\n\n// Distinguishes an UNREADABLE file (EACCES/EISDIR) from an INVALID one — \"does not validate\" is a\n// lie when the file could not even be read.\nexport type DraftState =\n | { readonly kind: \"missing\" }\n | { readonly kind: \"unreadable\"; readonly error: string }\n | { readonly kind: \"invalid\"; readonly errors: readonly string[] }\n | { readonly kind: \"valid\" };\n\nexport type GateDecision =\n { readonly kind: \"allow\" } | { readonly kind: \"block\"; readonly reason: string };\n\nconst whatsWrong = (\n state: Exclude<DraftState, { kind: \"valid\" }>,\n draftPath: string,\n kind: string,\n): string => {\n switch (state.kind) {\n case \"missing\":\n return `${draftPath} does not exist yet`;\n case \"unreadable\":\n return `${draftPath} could not be read: ${state.error}`;\n case \"invalid\":\n return `${draftPath} does not validate against the ${kind} schema:\\n${state.errors\n .map((e) => ` - ${e}`)\n .join(\"\\n\")}`;\n }\n};\n\nexport interface StopHookSettings {\n readonly hooks: {\n readonly Stop: readonly {\n readonly hooks: readonly { readonly type: \"command\"; readonly command: string }[];\n }[];\n };\n}\n\nexport const decideGate = (\n state: DraftState,\n nudges: number,\n maxNudges: number,\n draftPath: string,\n kind: string,\n): GateDecision => {\n if (state.kind === \"valid\") return { kind: \"allow\" };\n if (nudges >= maxNudges) return { kind: \"allow\" };\n return {\n kind: \"block\",\n reason: [\n `This review is not complete — ${whatsWrong(state, draftPath, kind)}`,\n `The only deliverable is a ${kind} document that validates against the ${kind} schema — run \"code-review print-schema ${kind}\" to see the exact shape.`,\n `Write it to ${draftPath}, then run \"code-review validate ${draftPath} --kind ${kind} --explain\" until it exits 0 before ending your turn (--explain prints the schema when the shape is wrong).`,\n ].join(\"\\n\"),\n };\n};\n\n// Never throws — every failure mode degrades to a DraftState the gate can act on, rather than\n// crashing the hook and letting the agent stop by default.\nexport const draftState = (\n draftPath: string,\n resolveSchema: (parsed: unknown) => string,\n): DraftState => {\n let raw: string;\n try {\n raw = readFileSync(draftPath, \"utf-8\");\n } catch (err) {\n if (err instanceof Error && (err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { kind: \"missing\" };\n }\n return { kind: \"unreadable\", error: errMsg(err) };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n return {\n kind: \"invalid\",\n errors: [`not valid JSON: ${errMsg(err)}`],\n };\n }\n let schemaPath: string;\n try {\n schemaPath = resolveSchema(parsed);\n } catch (err) {\n return { kind: \"invalid\", errors: [errMsg(err)] };\n }\n try {\n const { valid, errors } = validateAgainstSchema(parsed, schemaPath);\n return valid ? { kind: \"valid\" } : { kind: \"invalid\", errors };\n } catch (err) {\n return { kind: \"invalid\", errors: [errMsg(err)] };\n }\n};\n\n// Absent or unparseable reads as 0, so a fresh review starts with a full nudge budget.\nexport const readNudges = (counterPath: string): number => {\n try {\n const n = Number.parseInt(readFileSync(counterPath, \"utf-8\").trim(), 10);\n return Number.isInteger(n) && n >= 0 ? n : 0;\n } catch {\n return 0;\n }\n};\n\n// The caller passes the `current` it just read (no stale second read). May throw on a write failure —\n// the caller decides how to handle that.\nexport const bumpNudges = (counterPath: string, current: number): void => {\n writeFileSync(counterPath, `${String(current + 1)}\\n`);\n};\n\nexport const shellQuote = (s: string): string => `'${s.replace(/'/g, `'\\\\''`)}'`;\n\nexport const defaultHookCommand = (\n draftPath: string,\n opts: {\n readonly kind?: string;\n readonly schema?: string;\n readonly schemaVersion?: string;\n readonly maxNudges?: string;\n readonly counter?: string;\n },\n): string =>\n [\n \"code-review stop-gate --draft\",\n shellQuote(draftPath),\n ...(opts.kind ? [\"--kind\", shellQuote(opts.kind)] : []),\n ...(opts.schema ? [\"--schema\", shellQuote(opts.schema)] : []),\n ...(opts.schemaVersion ? [\"--schema-version\", shellQuote(opts.schemaVersion)] : []),\n ...(opts.maxNudges ? [\"--max-nudges\", shellQuote(opts.maxNudges)] : []),\n ...(opts.counter ? [\"--counter\", shellQuote(opts.counter)] : []),\n ].join(\" \");\n\nexport const stopHookSettings = (command: string): StopHookSettings => ({\n hooks: { Stop: [{ hooks: [{ type: \"command\", command }] }] },\n});\n","// Pure — the CLI (index.ts) owns IO and degrades any error to an allow-everything no-op.\n\nimport { basename, dirname, extname, join } from \"node:path\";\n\nimport { shellQuote } from \"./stop-gate.js\";\nimport { asRecord } from \"./util.js\";\n\nexport const DEADLINE_ENV = \"CODE_REVIEW_DEADLINE_EPOCH\";\n\nexport interface BudgetInputs {\n // Unmeasurable spend is null, never 0 — never tell the agent \"$0.00 spent\".\n readonly spentUsd: number | null;\n readonly budgetUsd: number | null;\n readonly elapsedMs: number | null;\n readonly wallMs: number | null;\n readonly reserve: ReserveParams;\n}\n\nexport interface ReserveParams {\n readonly frac: number;\n readonly growth: number;\n readonly flatUsd: number;\n readonly flatMs: number;\n}\n\nexport const DEFAULT_RESERVE: ReserveParams = {\n frac: 0.15,\n growth: 0.25,\n flatUsd: 0.02,\n flatMs: 120_000,\n};\n\nconst SOFT_MULTIPLE = 2;\n\nexport type BudgetPhase =\n { readonly kind: \"ok\" } | { readonly kind: \"soft\" } | { readonly kind: \"hard\" };\n\ninterface Axis {\n readonly used: number;\n readonly limit: number;\n readonly flat: number;\n}\n\nconst costAxis = (i: BudgetInputs): Axis | null =>\n i.spentUsd !== null && i.budgetUsd !== null && i.budgetUsd > 0\n ? { used: i.spentUsd, limit: i.budgetUsd, flat: i.reserve.flatUsd }\n : null;\n\nconst timeAxis = (i: BudgetInputs): Axis | null =>\n i.elapsedMs !== null && i.wallMs !== null && i.wallMs > 0\n ? { used: i.elapsedMs, limit: i.wallMs, flat: i.reserve.flatMs }\n : null;\n\nconst axisSeverity = (a: Axis, reserve: ReserveParams): 0 | 1 | 2 => {\n const usedFrac = Math.min(1, Math.max(0, a.used / a.limit));\n const effFrac = reserve.frac + reserve.growth * usedFrac;\n const hardReserve = Math.max(a.flat, effFrac * a.limit);\n const remaining = a.limit - a.used;\n if (remaining <= hardReserve) return 2;\n if (remaining <= SOFT_MULTIPLE * hardReserve) return 1;\n return 0;\n};\n\nexport const decideBudget = (i: BudgetInputs): BudgetPhase => {\n const worst = [costAxis(i), timeAxis(i)]\n .filter((a): a is Axis => a !== null)\n .reduce<0 | 1 | 2>((max, a) => Math.max(max, axisSeverity(a, i.reserve)) as 0 | 1 | 2, 0);\n return worst === 2 ? { kind: \"hard\" } : worst === 1 ? { kind: \"soft\" } : { kind: \"ok\" };\n};\n\nconst pct = (n: number): string => `${String(Math.round(n * 100))}%`;\nconst money = (n: number): string => `$${n.toFixed(2)}`;\nconst mins = (ms: number): string => `${(ms / 60_000).toFixed(1)}m`;\n\nconst spendClause = (i: BudgetInputs): string | null =>\n i.spentUsd === null\n ? null\n : i.budgetUsd !== null && i.budgetUsd > 0\n ? `spent ${money(i.spentUsd)}/${money(i.budgetUsd)} (${pct(i.spentUsd / i.budgetUsd)})`\n : `spent ${money(i.spentUsd)}`;\n\nconst timeClause = (i: BudgetInputs): string | null =>\n i.elapsedMs === null\n ? null\n : i.wallMs !== null && i.wallMs > 0\n ? `${mins(i.elapsedMs)}/${mins(i.wallMs)} elapsed (${pct(i.elapsedMs / i.wallMs)})`\n : `${mins(i.elapsedMs)} elapsed`;\n\n// A subagent can't write the draft (single-writer deny below), so it is told to report back, not write.\nconst directive = (\n phase: Exclude<BudgetPhase, { kind: \"ok\" }>,\n draftPath: string,\n isSubagent: boolean,\n): string => {\n if (isSubagent)\n return phase.kind === \"hard\"\n ? `Budget nearly exhausted — STOP all new investigation now and report the findings you have back to the main agent in your reply. Do not write ${draftPath} yourself; only the main agent writes it.`\n : `Wind down investigation and report the findings you have back to the main agent in your reply — do not write ${draftPath} yourself; the main agent writes it, and you may run out of budget otherwise.`;\n return phase.kind === \"hard\"\n ? `Budget nearly exhausted — STOP all new investigation now. Do not wait for subagents still running in the background. Write your COMPLETE findings from what you already have to ${draftPath} and run \\`code-review validate ${draftPath} --explain\\` until it passes (--explain prints the exact schema when the shape is wrong). Other tools are blocked until that draft is written.`\n : `Wind down investigation and write your COMPLETE findings to ${draftPath} now, then run \\`code-review validate ${draftPath} --explain\\` (it prints the exact schema if the shape is wrong) — fold in the subagent reports you already have rather than waiting on stragglers; you may run out of budget before you finish otherwise.`;\n};\n\nexport const budgetMessage = (\n i: BudgetInputs,\n phase: Exclude<BudgetPhase, { kind: \"ok\" }>,\n draftPath: string,\n isSubagent: boolean,\n): string => {\n const status = [spendClause(i), timeClause(i)].filter((c): c is string => c !== null).join(\" · \");\n return `Budget check — ${status}. ${directive(phase, draftPath, isSubagent)}`;\n};\n\nconst invokesCodeReviewValidate = (toolInput: unknown): boolean => {\n const cmd = asRecord(toolInput)?.[\"command\"];\n // (?![\\w-]) excludes validate-patches — a findings-mutating command that must not pass this gate.\n return typeof cmd === \"string\" && /\\bcode-review\\s+validate(?![\\w-])/.test(cmd);\n};\n\nconst SPAWN_TOOLS: ReadonlySet<string> = new Set([\"Agent\", \"Task\"]);\nconst WEB_TOOLS: ReadonlySet<string> = new Set([\"WebFetch\", \"WebSearch\"]);\n\nexport const blockedDuringConvergence = (toolName: string, toolInput: unknown): boolean => {\n if (SPAWN_TOOLS.has(toolName) || WEB_TOOLS.has(toolName)) return true;\n if (toolName === \"Bash\") return !invokesCodeReviewValidate(toolInput);\n return false;\n};\n\nconst escapeRegExp = (s: string): string => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\nconst WRITE_TOOLS: ReadonlySet<string> = new Set([\"Write\", \"Edit\", \"MultiEdit\", \"NotebookEdit\"]);\n\n// Scoped to the accidental fan-out race, not adversarial evasion (cp/mv/dd are out of scope).\nexport const writesToDraft = (toolName: string, toolInput: unknown, draftPath: string): boolean => {\n const rec = asRecord(toolInput);\n const targets = [draftPath, basename(draftPath), \"$DRAFT\", \"${DRAFT}\"];\n if (WRITE_TOOLS.has(toolName)) {\n const fp = rec?.[\"file_path\"] ?? rec?.[\"notebook_path\"];\n if (typeof fp === \"string\" && targets.some((t) => fp === t || basename(fp) === basename(t)))\n return true;\n }\n if (toolName === \"Bash\") {\n const cmd = rec?.[\"command\"];\n if (typeof cmd !== \"string\") return false;\n const alt = targets.map(escapeRegExp).join(\"|\");\n const end = \"(?=$|[\\\\s|&;)])\";\n const redirect = new RegExp(`>>?\\\\|?\\\\s*(['\"]?)(?:${alt})\\\\1${end}`);\n const teeArg = new RegExp(`\\\\btee\\\\b(?:\\\\s+-{1,2}\\\\S+)*\\\\s+(['\"]?)(?:${alt})\\\\1${end}`);\n return redirect.test(cmd) || teeArg.test(cmd);\n }\n return false;\n};\n\n// Agent-facing (ships to every user's review): no internal refs.\nexport const singleWriterMessage = (draftPath: string): string =>\n `Only the main agent may write ${draftPath}. When a subagent writes it too, the concurrent writers clobber each other and the review comes out empty. Do NOT write, edit, or redirect into ${draftPath} — instead, return the findings you discovered in your reply (the field names are in the schema); the main agent collects every subagent's reported findings and writes the draft itself.`;\n\n// Written AFTER the seed so its mtime bounds the seed's; the convention is shared with mainHasWrittenDraft.\nexport const seedMarkerPath = (draftPath: string): string => `${draftPath}.seed`;\n\n// Holds only ever a document that passed the extraction ladder: the budget hook snapshots the draft\n// here whenever it validates, so a wall-kill that leaves the live draft truncated still recovers the\n// last valid state (down to the seed) instead of posting \"did not complete\". The postfix goes before\n// the extension so the snapshot keeps the draft's real type (findings-draft.last-valid.json).\nexport const lastValidPath = (draftPath: string): string => {\n const ext = extname(draftPath);\n return join(dirname(draftPath), `${basename(draftPath, ext)}.last-valid${ext}`);\n};\n\n// mtime, not content: a rewrite that reproduces the seed bytes still counts as agent-written.\nexport const mainHasWrittenDraft = (\n draftMtimeMs: number | null,\n seedMarkerMtimeMs: number | null,\n): boolean =>\n draftMtimeMs !== null && (seedMarkerMtimeMs === null || draftMtimeMs > seedMarkerMtimeMs);\n\n// Agent-facing: no internal refs.\nexport const spawnFloorMessage = (draftPath: string): string =>\n `Write your own first-pass findings to ${draftPath} before spawning subagents — a review must never depend on subagents alone, and a pre-seeded draft does not count until you have revised it yourself this run. Write ${draftPath} from what you have read so far (preliminary findings are fine), run \\`code-review validate ${draftPath} --explain\\` until it passes, then fan out; your subagents run in the background, so keep refining the draft as their reports arrive.`;\n\n// Background so the spawner never blocks on a batch join, where no hook can reach it to steer.\nexport const forceBackgroundSpawn = (toolInput: unknown): Record<string, unknown> => ({\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\",\n permissionDecision: \"allow\",\n updatedInput: { ...(asRecord(toolInput) ?? {}), run_in_background: true },\n },\n});\n\nexport interface BudgetParams {\n readonly spentUsd: number | null;\n readonly budgetUsd: number | null;\n readonly elapsedMs: number | null;\n readonly wallMs: number | null;\n readonly reserve: ReserveParams;\n readonly draftPath: string;\n readonly mainDraftWritten: boolean;\n}\n\nconst denyPreTool = (reason: string): Record<string, unknown> => ({\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\",\n permissionDecision: \"deny\",\n permissionDecisionReason: reason,\n },\n});\n\n// A non-empty agent_id marks a fan-out subagent; the main agent has none (or \"\"). The one predicate\n// every consumer shares, so the snapshot gate and the single-writer deny never disagree on \"\".\nexport const isSubagentHookInput = (input: unknown): boolean => {\n const agentId = asRecord(input)?.[\"agent_id\"];\n return typeof agentId === \"string\" && agentId.length > 0;\n};\n\nexport const evaluateBudgetHook = (\n input: unknown,\n params: BudgetParams,\n): Record<string, unknown> => {\n const rec = asRecord(input);\n const inputs: BudgetInputs = {\n spentUsd: params.spentUsd,\n budgetUsd: params.budgetUsd,\n elapsedMs: params.elapsedMs,\n wallMs: params.wallMs,\n reserve: params.reserve,\n };\n const phase = decideBudget(inputs);\n const isSubagent = isSubagentHookInput(input);\n\n switch (rec?.[\"hook_event_name\"]) {\n case \"PostToolBatch\":\n return phase.kind === \"ok\"\n ? {}\n : {\n hookSpecificOutput: {\n hookEventName: \"PostToolBatch\",\n additionalContext: budgetMessage(inputs, phase, params.draftPath, isSubagent),\n },\n };\n case \"PreToolUse\": {\n const toolName = rec[\"tool_name\"];\n if (typeof toolName !== \"string\") return {};\n // Single-writer enforcement is independent of budget phase.\n if (isSubagent && writesToDraft(toolName, rec[\"tool_input\"], params.draftPath))\n return denyPreTool(singleWriterMessage(params.draftPath));\n if (phase.kind === \"hard\" && blockedDuringConvergence(toolName, rec[\"tool_input\"]))\n return denyPreTool(budgetMessage(inputs, phase, params.draftPath, isSubagent));\n // Gate the main agent's first fan-out on its own draft existing; then background every spawn.\n if (SPAWN_TOOLS.has(toolName)) {\n if (!isSubagent && !params.mainDraftWritten)\n return denyPreTool(spawnFloorMessage(params.draftPath));\n return forceBackgroundSpawn(rec[\"tool_input\"]);\n }\n return {};\n }\n default:\n return {};\n }\n};\n\nexport const parseWallMs = (raw: string): number | null => {\n const m = /^(\\d+(?:\\.\\d+)?)(ms|s|m|h)?$/.exec(raw.trim());\n if (m === null) return null;\n const [, num = \"\", unit = \"s\"] = m;\n const n = Number.parseFloat(num);\n if (!Number.isFinite(n)) return null;\n switch (unit) {\n case \"ms\":\n return n;\n case \"s\":\n return n * 1000;\n case \"m\":\n return n * 60_000;\n default:\n return n * 3_600_000;\n }\n};\n\nexport const parseEpochSecMs = (raw: string | undefined): number | null => {\n if (raw === undefined) return null;\n const t = raw.trim();\n if (!/^\\d+$/.test(t)) return null;\n const n = Number.parseInt(t, 10);\n return Number.isFinite(n) && n > 0 ? n * 1000 : null;\n};\n\n// Prefer the shared deadline anchor: a fresh subagent's transcript-start reads ≈0, so per-transcript\n// elapsed would leave the fan-out unsteered. Falls back to transcript start, then null (axis off).\nexport const anchoredElapsedMs = (src: {\n readonly deadlineMs: number | null;\n readonly wallMs: number | null;\n readonly firstTsMs: number | null;\n readonly nowMs: number;\n}): number | null => {\n if (src.deadlineMs !== null && src.wallMs !== null)\n return Math.max(0, src.wallMs - (src.deadlineMs - src.nowMs));\n if (src.firstTsMs !== null) return Math.max(0, src.nowMs - src.firstTsMs);\n return null;\n};\n\n// Round the wall UP to whole seconds so the anchor never expires before the matching timeout kill.\nexport const deadlineEpochSec = (wallMs: number, nowMs: number): number =>\n Math.floor(nowMs / 1000) + Math.ceil(wallMs / 1000);\n\n// 0 is valid: it disables the fraction term, leaving only the flat floor.\nexport const parseFraction = (raw: string | undefined, fallback: number): number => {\n if (raw === undefined) return fallback;\n const n = Number.parseFloat(raw);\n return Number.isFinite(n) && n >= 0 && n <= 1 ? n : fallback;\n};\n\n// One string wired to both hooks; it self-dispatches on the event it reads from stdin.\nexport const budgetHookCommand = (\n draftPath: string,\n opts: {\n readonly budgetUsd?: string;\n readonly wall?: string;\n readonly prices?: string;\n readonly reserveFrac?: string;\n readonly reserveGrowth?: string;\n readonly reserveUsd?: string;\n readonly reserveWall?: string;\n },\n): string =>\n [\n \"code-review budget-hook --draft\",\n shellQuote(draftPath),\n ...(opts.budgetUsd ? [\"--budget-usd\", shellQuote(opts.budgetUsd)] : []),\n ...(opts.wall ? [\"--wall\", shellQuote(opts.wall)] : []),\n ...(opts.prices ? [\"--prices\", shellQuote(opts.prices)] : []),\n ...(opts.reserveFrac ? [\"--reserve-frac\", shellQuote(opts.reserveFrac)] : []),\n ...(opts.reserveGrowth ? [\"--reserve-growth\", shellQuote(opts.reserveGrowth)] : []),\n ...(opts.reserveUsd ? [\"--reserve-usd\", shellQuote(opts.reserveUsd)] : []),\n ...(opts.reserveWall ? [\"--reserve-wall\", shellQuote(opts.reserveWall)] : []),\n ].join(\" \");\n","// Fenced code blocks pass through verbatim — a `suggestion` block's blank lines and trailing\n// whitespace are significant.\n\ninterface ScanState {\n readonly lines: readonly string[];\n readonly inFence: boolean;\n readonly blankRun: number;\n}\n\nconst FENCE_RE = /^\\s*```/;\n\nconst scanLine = (state: ScanState, line: string): ScanState => {\n if (FENCE_RE.test(line)) {\n return { lines: [...state.lines, line], inFence: !state.inFence, blankRun: 0 };\n }\n if (state.inFence) {\n return { lines: [...state.lines, line], inFence: true, blankRun: 0 };\n }\n const trimmed = line.replace(/[ \\t]+$/, \"\");\n if (trimmed !== \"\") {\n return { lines: [...state.lines, trimmed], inFence: false, blankRun: 0 };\n }\n const blankRun = state.blankRun + 1;\n return blankRun === 1\n ? { lines: [...state.lines, \"\"], inFence: false, blankRun }\n : { ...state, blankRun };\n};\n\nexport const formatMarkdown = (md: string): string => {\n const { lines } = md\n .split(\"\\n\")\n .reduce<ScanState>(scanLine, { lines: [], inFence: false, blankRun: 0 });\n return `${lines.join(\"\\n\").replace(/\\n+$/, \"\")}\\n`;\n};\n\nconst pad2 = (n: number): string => String(n).padStart(2, \"0\");\n\n// Computed at the IO boundary so render() stays pure/clockless.\nexport const formatUtc = (d: Date): string =>\n `${String(d.getUTCFullYear())}-${pad2(d.getUTCMonth() + 1)}-${pad2(d.getUTCDate())} ${pad2(d.getUTCHours())}:${pad2(d.getUTCMinutes())} UTC`;\n","// Findings 0.4 REQUIRES reasoning/confidence, which can't be honestly upcast from a 0.2/0.3 document\n// (confidence can't be fabricated) — so older minors are dropped from the table and degrade to the\n// unsupported-version notice. Imports schema.ts one-way (schema.ts stays a leaf; no import cycle).\n// Bundled schema paths resolve via tsup into the same dist as index.ts, so import.meta.dirname\n// matches at runtime, in dev, and from the published package.\n\nimport { resolve as resolvePath } from \"node:path\";\nimport type { Decoder, Encoder, Errors, ValidationError } from \"io-ts\";\nimport { FindingsCodec, TriageCodec, PriceMapCodec, DEFAULT_SCHEMA_VERSION } from \"./schema.js\";\nimport type { Findings, Triage, PriceMap } from \"./schema.js\";\n\nexport type SchemaKind = \"findings\" | \"triage\" | \"prices\";\n\nexport interface DecodedFor {\n readonly findings: Findings;\n readonly triage: Triage;\n readonly prices: PriceMap;\n}\n\ninterface VersionEntry<K extends SchemaKind, A> {\n /** major.minor of `schema_version` this entry dispatches on; patch is ignored. */\n readonly minor: string;\n /** full semver stamped when a document omits `schema_version` (findings) or reported as the\n * resolved version for kinds with no in-data signal (triage, prices). */\n readonly defaultVersion: string;\n readonly schemaFile: string;\n readonly codec: Decoder<unknown, A> & Encoder<A, unknown>;\n /** upcast to the latest shape for this kind; identity when the codec already accepts both\n * shapes (e.g. an additive minor whose new field is optional). */\n readonly normalize: (decoded: A) => DecodedFor[K];\n readonly latest: boolean;\n}\n\nexport type Resolution<K extends SchemaKind> =\n | { readonly kind: \"ok\"; readonly version: string; readonly value: DecodedFor[K] }\n | {\n readonly kind: \"unsupported-version\";\n readonly version: string;\n readonly supported: readonly string[];\n }\n | { readonly kind: \"invalid-shape\"; readonly errors: readonly string[] }\n | { readonly kind: \"missing-version\" }; // findings only; triage/prices never return this\n\nconst identity = <A>(decoded: A): A => decoded;\n\nconst findingsTable: readonly VersionEntry<\"findings\", Findings>[] = [\n {\n minor: \"0.4\",\n defaultVersion: DEFAULT_SCHEMA_VERSION,\n schemaFile: \"findings.schema.json\",\n codec: FindingsCodec,\n normalize: identity,\n latest: true,\n },\n];\n\nconst triageTable: readonly VersionEntry<\"triage\", Triage>[] = [\n {\n minor: \"0.1\",\n defaultVersion: \"0.1.0\",\n schemaFile: \"triage.schema.json\",\n codec: TriageCodec,\n normalize: identity,\n latest: true,\n },\n];\n\nconst pricesTable: readonly VersionEntry<\"prices\", PriceMap>[] = [\n {\n minor: \"0.1\",\n defaultVersion: \"0.1.0\",\n schemaFile: \"prices.schema.json\",\n codec: PriceMapCodec,\n normalize: identity,\n latest: true,\n },\n];\n\ntype Table<K extends SchemaKind> = readonly VersionEntry<K, DecodedFor[K]>[];\n\nconst tables: { readonly [K in SchemaKind]: Table<K> } = {\n findings: findingsTable,\n triage: triageTable,\n prices: pricesTable,\n};\n\nconst tableFor = <K extends SchemaKind>(kind: K): Table<K> => tables[kind];\n\n/** major.minor of a semver-ish string; dispatch ignores patch and any prerelease/build suffix. */\nconst majorMinor = (version: string): string => version.split(\".\").slice(0, 2).join(\".\");\n\nconst describeValidationError = (e: ValidationError): string => {\n const path = e.context\n .map((entry) => entry.key)\n .filter((key) => key.length > 0)\n .join(\".\");\n return e.message ?? `${path || \"(root)\"}: invalid value ${JSON.stringify(e.value)}`;\n};\n\nconst formatErrors = (errors: Errors): readonly string[] => errors.map(describeValidationError);\n\nexport const declaredVersion = (raw: unknown): string | undefined =>\n typeof raw === \"object\" && raw !== null && \"schema_version\" in raw\n ? typeof raw.schema_version === \"string\"\n ? raw.schema_version\n : undefined\n : undefined;\n\nexport const supportedVersions = (kind: SchemaKind): readonly string[] =>\n tableFor(kind).map((entry) => entry.minor);\n\nexport const defaultVersion = (kind: SchemaKind): string => {\n const latest = tableFor(kind).find((entry) => entry.latest);\n if (!latest) throw new Error(`Registry invariant violated — no latest entry for \"${kind}\"`);\n return latest.defaultVersion;\n};\n\nconst bundledSchemaPath = (relativePath: string): string =>\n resolvePath(import.meta.dirname, \"..\", \"schema\", relativePath);\n\nexport const schemaPathFor = (kind: SchemaKind, version?: string): string => {\n const table = tableFor(kind);\n const entry =\n version === undefined\n ? table.find((v) => v.latest)\n : table.find((v) => v.minor === majorMinor(version));\n if (!entry) {\n throw new Error(\n `Unsupported ${kind} schema version \"${version ?? \"\"}\" — supported: ${supportedVersions(kind).join(\", \")}`,\n );\n }\n return bundledSchemaPath(entry.schemaFile);\n};\n\nconst resolveFindings = (raw: unknown): Resolution<\"findings\"> => {\n const version = declaredVersion(raw);\n if (version === undefined) return { kind: \"missing-version\" };\n const entry = findingsTable.find((v) => v.minor === majorMinor(version));\n if (!entry) {\n return { kind: \"unsupported-version\", version, supported: supportedVersions(\"findings\") };\n }\n const decoded = entry.codec.decode(raw);\n return decoded._tag === \"Left\"\n ? { kind: \"invalid-shape\", errors: formatErrors(decoded.left) }\n : { kind: \"ok\", version, value: entry.normalize(decoded.right) };\n};\n\n/** Resolve a kind with no in-data version signal — a single bundled entry, never \"missing-version\". */\nconst resolveSingleVersion = <K extends \"triage\" | \"prices\">(\n kind: K,\n raw: unknown,\n): Resolution<K> => {\n const entry = tableFor(kind)[0];\n if (!entry) throw new Error(`Registry invariant violated — no entry for \"${kind}\"`);\n const decoded = entry.codec.decode(raw);\n return decoded._tag === \"Left\"\n ? { kind: \"invalid-shape\", errors: formatErrors(decoded.left) }\n : { kind: \"ok\", version: entry.defaultVersion, value: entry.normalize(decoded.right) };\n};\n\nconst resolvers: { readonly [K in SchemaKind]: (raw: unknown) => Resolution<K> } = {\n findings: resolveFindings,\n triage: (raw) => resolveSingleVersion(\"triage\", raw),\n prices: (raw) => resolveSingleVersion(\"prices\", raw),\n};\n\n/** Decode + version-dispatch a raw document for a schema kind. Pure — no IO. */\nexport const resolve = <K extends SchemaKind>(kind: K, raw: unknown): Resolution<K> =>\n resolvers[kind](raw);\n","// The single GitHub-API shell boundary; pure callers inject a fake GhApi.\n\nimport { execFile } from \"node:child_process\";\n\nexport type GhApi = (\n args: readonly string[],\n stdin?: string,\n env?: Readonly<Record<string, string>>,\n) => Promise<string>;\n\n// Untrusted values (bot login, marker) reach jq via `env.NAME`, never interpolated into the filter.\nexport const runGhApi: GhApi = (args, stdin, env) =>\n new Promise<string>((resolve, reject) => {\n const child = execFile(\n \"gh\",\n [\"api\", ...args],\n { env: { ...process.env, ...env }, encoding: \"utf-8\", maxBuffer: 100 * 1024 * 1024 },\n (err, stdout, stderr) => {\n if (err) {\n const stderrStr = typeof stderr === \"string\" && stderr.trim() ? stderr.trim() : \"\";\n const errStr = err instanceof Error ? err.message : \"unknown error\";\n reject(new Error(`gh api failed: ${stderrStr || errStr}`));\n } else {\n resolve(stdout);\n }\n },\n );\n if (stdin !== undefined) {\n child.stdin?.end(stdin);\n }\n });\n","// post (comment job) and gather (review job) resolve the PR on separate runners but from this SAME\n// pure logic, so they never disagree on which PR (no split-brain).\n\nimport type { GhApi } from \"./gh.js\";\n\ninterface PrCandidate {\n readonly number: number;\n readonly state: string;\n readonly headRef: string;\n}\n\nexport const fetchPrCandidates = async (\n repo: string,\n headSha: string,\n ghApi: GhApi,\n): Promise<readonly PrCandidate[]> => {\n const stdout = await ghApi([\n `repos/${repo}/commits/${headSha}/pulls`,\n \"--jq\",\n \".[] | {number: .number, state: .state, headRef: .head.ref}\",\n ]);\n return stdout\n .trim()\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => JSON.parse(line) as PrCandidate);\n};\n\nexport type PrResolution =\n | { readonly kind: \"none\" }\n | { readonly kind: \"not-open\"; readonly prNumber: number; readonly state: string }\n | { readonly kind: \"open\"; readonly prNumber: number };\n\nexport const resolvePr = (\n candidates: readonly PrCandidate[],\n headBranch: string | undefined,\n): PrResolution => {\n if (candidates.length === 0) return { kind: \"none\" };\n const scoped =\n candidates.length > 1 && headBranch\n ? candidates.filter((c) => c.headRef === headBranch)\n : candidates;\n const chosen = scoped[0] ?? candidates[0];\n if (chosen === undefined) return { kind: \"none\" };\n return chosen.state === \"open\"\n ? { kind: \"open\", prNumber: chosen.number }\n : { kind: \"not-open\", prNumber: chosen.number, state: chosen.state };\n};\n\nexport const fetchDiff = async (repo: string, prNumber: number, ghApi: GhApi): Promise<string> =>\n ghApi([\n `repos/${repo}/pulls/${String(prNumber)}`,\n \"-H\",\n \"Accept: application/vnd.github.v3.diff\",\n ]);\n","// Ordering invariant: all reads, decodes, and rendering complete before the first API write; then\n// the sticky, then the inline review. A posting failure propagates and exits non-zero (never partial).\n\nimport { readFileSync } from \"node:fs\";\nimport type { InlineComment, InlineDisposition, RenderInput } from \"./types.js\";\nimport { buildInlineComments } from \"./inline.js\";\nimport { isEmptyDiff } from \"./diff.js\";\nimport { render, computeSeverityCounts } from \"./render.js\";\nimport { formatMarkdown } from \"./format.js\";\nimport { findingsPointer, reviewBodyPointer } from \"./surface.js\";\nimport { ResultEnvelopeCodec, PriceMapCodec, TestSummaryCodec, noticeFindings } from \"./schema.js\";\nimport type { Finding, Findings, ResultEnvelope, TestSummary } from \"./schema.js\";\nimport { resolve, supportedVersions } from \"./registry.js\";\nimport type { GhApi } from \"./gh.js\";\nimport { runGhApi } from \"./gh.js\";\nexport type { GhApi } from \"./gh.js\";\nimport { fetchDiff, fetchPrCandidates, resolvePr } from \"./pr.js\";\nimport { errMsg, tryParseJson, asRecord } from \"./util.js\";\n\nexport interface PostInput {\n readonly repo: string;\n readonly headSha: string;\n readonly botLogin: string;\n readonly findingsPath: string;\n readonly envelopePath: string;\n readonly pricesPath: string;\n // false ⇒ the bundled all-zero example; the render layer shows cost as N/A, never a false $0.00.\n readonly pricesProvided: boolean;\n readonly templatePath: string;\n readonly inlineTemplatePath: string;\n readonly route?: string;\n readonly headBranch?: string;\n readonly testReportPath?: string;\n readonly effort?: string;\n readonly runUrl?: string;\n // Findings-json marker's fallback across surfaces when the embedded form is too large.\n readonly jsonUrl?: string;\n // Computed by the caller via formatUtc so post() stays a clockless pass-through into render().\n readonly postedAt?: string;\n}\n\nconst DEFAULT_MARKER = \"<!-- code-review -->\";\nconst MAX_SUGGESTION_LINES = 10;\n\nconst countSuggestionLines = (text: string): number => text.split(\"\\n\").length;\n\nconst checkLongSuggestions = (\n comments: readonly InlineComment[],\n): { readonly comments: readonly InlineComment[]; readonly longFiles: readonly string[] } => {\n const longFiles: string[] = [];\n const adjusted = comments.map((c) => {\n const match = /```suggestion\\n([\\s\\S]*?)\\n```/.exec(c.body);\n if (match?.[1] && countSuggestionLines(match[1]) > MAX_SUGGESTION_LINES) {\n longFiles.push(`${c.path}:${String(c.line)}`);\n return {\n ...c,\n body: c.body.replace(\n /```suggestion\\n[\\s\\S]*?\\n```/,\n \"*(suggestion omitted — exceeds GitHub's ~10-line suggestion limit; see summary)*\",\n ),\n };\n }\n return c;\n });\n return { comments: adjusted, longFiles };\n};\n\n// Loaders never throw on untrusted artifacts — malformed input degrades to a tagged result the\n// caller renders as a notice, never crashing the post.\ntype FindingsLoadResult =\n | { readonly kind: \"ok\"; readonly findings: Findings }\n | { readonly kind: \"corrupt\" }\n | { readonly kind: \"invalid-shape\" }\n | { readonly kind: \"unsupported-schema-version\"; readonly version: string };\n\nconst loadFindings = (path: string): FindingsLoadResult => {\n let raw: unknown;\n try {\n raw = JSON.parse(readFileSync(path, \"utf-8\")) as unknown;\n } catch {\n return { kind: \"corrupt\" };\n }\n const resolution = resolve(\"findings\", raw);\n switch (resolution.kind) {\n case \"ok\":\n return { kind: \"ok\", findings: resolution.value };\n case \"unsupported-version\":\n return { kind: \"unsupported-schema-version\", version: resolution.version };\n case \"invalid-shape\":\n case \"missing-version\":\n return { kind: \"invalid-shape\" };\n }\n};\n\nconst noticeMessageFor = (result: Exclude<FindingsLoadResult, { kind: \"ok\" }>): string => {\n switch (result.kind) {\n case \"corrupt\":\n return \"Review output was missing or malformed — the review did not complete. See the workflow run for logs.\";\n case \"invalid-shape\":\n return \"Review output was malformed — it did not conform to the findings schema. See the workflow run for logs.\";\n case \"unsupported-schema-version\": {\n const supported = supportedVersions(\"findings\")\n .map((minor) => `${minor}.x`)\n .join(\", \");\n return `Review output declares schema_version \"${result.version}\", which this commenter does not support (supported: ${supported}). See the workflow run for logs.`;\n }\n }\n};\n\nconst loadEnvelope = (path: string): ResultEnvelope | null => {\n let raw: unknown;\n try {\n raw = JSON.parse(readFileSync(path, \"utf-8\")) as unknown;\n } catch {\n return null;\n }\n const decoded = ResultEnvelopeCodec.decode(raw);\n return decoded._tag === \"Right\" ? decoded.right : null;\n};\n\n// Optional enrichment: any failure warns and returns undefined, never aborts the post.\nconst loadTestReport = (path: string): TestSummary | undefined => {\n let raw: unknown;\n try {\n raw = JSON.parse(readFileSync(path, \"utf-8\")) as unknown;\n } catch (err) {\n process.stderr.write(\n `Warning: could not read test report at ${path}: ${errMsg(err)} — omitting test panel\\n`,\n );\n return undefined;\n }\n const decoded = TestSummaryCodec.decode(raw);\n if (decoded._tag === \"Left\") {\n process.stderr.write(\n `Warning: test report at ${path} does not match the expected shape — omitting test panel\\n`,\n );\n return undefined;\n }\n return decoded.right;\n};\n\nconst parseHtmlUrl = (raw: string): string | undefined => {\n const parsed = tryParseJson(raw);\n const htmlUrl = parsed.ok ? asRecord(parsed.value)?.[\"html_url\"] : undefined;\n return typeof htmlUrl === \"string\" ? htmlUrl : undefined;\n};\n\nconst commentPayload = (c: InlineComment): Record<string, unknown> => ({\n path: c.path,\n line: c.line,\n side: c.side,\n ...(c.start_line !== undefined && c.start_side !== undefined\n ? { start_line: c.start_line, start_side: c.start_side }\n : {}),\n body: formatMarkdown(c.body),\n});\n\n// comments[i] is the rendered comment for inDiff[i] (1:1, same order). Returns the review url, the\n// count that actually posted, and the findings GitHub rejected (for the caller to surface in the sticky).\nconst postInlineReview = async (\n repo: string,\n prNumber: number,\n headSha: string,\n comments: readonly InlineComment[],\n inDiff: readonly Finding[],\n stickyUrl: string | undefined,\n marker: string,\n ghApi: GhApi,\n): Promise<{\n readonly url: string | undefined;\n readonly inlinePosted: number;\n readonly unposted: readonly Finding[];\n}> => {\n const pointer = reviewBodyPointer(headSha, stickyUrl, marker);\n const reviewBody = (withComments: boolean): string =>\n JSON.stringify({\n body: pointer,\n commit_id: headSha,\n event: \"COMMENT\",\n comments: withComments ? comments.map(commentPayload) : [],\n });\n const reviewsEndpoint = [`repos/${repo}/pulls/${String(prNumber)}/reviews`, \"--input\", \"-\"];\n try {\n const stdout = await ghApi(reviewsEndpoint, reviewBody(true));\n return { url: parseHtmlUrl(stdout), inlinePosted: comments.length, unposted: [] };\n } catch (err) {\n // The reviews endpoint is atomic — one rejected position fails the whole batch — so on rejection\n // post the body only, then re-post each comment individually, collecting the ones GitHub rejects.\n // A body-only review that itself fails (no comments) is a genuine error and propagates.\n if (comments.length === 0) throw err;\n process.stderr.write(\n `Warning: the batched inline review on PR #${String(prNumber)} was rejected (${errMsg(err)}) — posting the review body-only, then each comment individually to keep the ones GitHub accepts (issue #57)\\n`,\n );\n const url = parseHtmlUrl(await ghApi(reviewsEndpoint, reviewBody(false)));\n const commentsEndpoint = [`repos/${repo}/pulls/${String(prNumber)}/comments`, \"--input\", \"-\"];\n const unposted: Finding[] = [];\n let inlinePosted = 0;\n for (const [i, c] of comments.entries()) {\n try {\n await ghApi(commentsEndpoint, JSON.stringify({ commit_id: headSha, ...commentPayload(c) }));\n inlinePosted += 1;\n } catch (e) {\n const finding = inDiff[i];\n if (finding) unposted.push(finding);\n process.stderr.write(\n `Warning: inline comment on ${c.path}:${String(c.line)} rejected (${errMsg(e)}) — surfacing that finding in the sticky instead (issue #57)\\n`,\n );\n }\n }\n return { url, inlinePosted, unposted };\n }\n};\n\nconst findBotComment = async (\n repo: string,\n prNumber: number,\n botLogin: string,\n marker: string,\n ghApi: GhApi,\n): Promise<{ readonly id: number; readonly body: string } | null> => {\n const stdout = await ghApi(\n [\n `repos/${repo}/issues/${String(prNumber)}/comments`,\n \"--paginate\",\n \"--jq\",\n \".[] | select(.user.login == env.CODE_REVIEW_BOT_LOGIN and (.body | startswith(env.CODE_REVIEW_MARKER))) | {id: .id, body: .body}\",\n ],\n undefined,\n { CODE_REVIEW_BOT_LOGIN: botLogin, CODE_REVIEW_MARKER: marker },\n );\n const lines = stdout.trim().split(\"\\n\").filter(Boolean);\n if (lines.length === 0) return null;\n const last = lines[lines.length - 1] ?? null;\n if (last === null) return null;\n const parsed = JSON.parse(last) as { id: number; body: string };\n return { id: parsed.id, body: parsed.body };\n};\n\nconst parseCommentRef = (\n raw: string,\n): { readonly id: number; readonly html_url: string } | null => {\n const parsed = tryParseJson(raw);\n const rec = parsed.ok ? asRecord(parsed.value) : null;\n const id = rec?.[\"id\"];\n const html_url = rec?.[\"html_url\"];\n return typeof id === \"number\" && typeof html_url === \"string\" ? { id, html_url } : null;\n};\n\nconst patchComment = async (\n repo: string,\n commentId: number,\n body: string,\n ghApi: GhApi,\n): Promise<{ readonly html_url: string } | null> => {\n const stdout = await ghApi(\n [`repos/${repo}/issues/comments/${String(commentId)}`, \"--input\", \"-\"],\n JSON.stringify({ body }),\n );\n // Only html_url is needed — the id is already known — unlike parseCommentRef for a new comment.\n const htmlUrl = parseHtmlUrl(stdout);\n return htmlUrl !== undefined ? { html_url: htmlUrl } : null;\n};\n\nconst postComment = async (\n repo: string,\n prNumber: number,\n body: string,\n ghApi: GhApi,\n): Promise<{ readonly id: number; readonly html_url: string } | null> => {\n const stdout = await ghApi(\n [`repos/${repo}/issues/${String(prNumber)}/comments`, \"--input\", \"-\"],\n JSON.stringify({ body }),\n );\n return parseCommentRef(stdout);\n};\n\n// Trust by author identity (bot login), not the marker alone. Returns null only when a NEW comment's\n// response couldn't be parsed — there is then no id to re-patch with the review link.\nconst upsertSticky = async (\n repo: string,\n prNumber: number,\n existing: { readonly id: number; readonly body: string } | null,\n body: string,\n ghApi: GhApi,\n): Promise<{ readonly id: number; readonly url: string | undefined } | null> => {\n if (existing !== null) {\n const patched = await patchComment(repo, existing.id, body, ghApi);\n process.stderr.write(\n `Updated sticky comment #${String(existing.id)} on PR #${String(prNumber)}\\n`,\n );\n return { id: existing.id, url: patched?.html_url };\n }\n const posted = await postComment(repo, prNumber, body, ghApi);\n process.stderr.write(`Posted new sticky comment on PR #${String(prNumber)}\\n`);\n return posted ? { id: posted.id, url: posted.html_url } : null;\n};\n\n// Only the id is needed — every prior bot review is superseded regardless of the commit it reviewed.\ninterface BotReviewRef {\n readonly id: number;\n}\n\nconst isBotReview = (r: unknown): r is { id: number; user: { login: string }; state: string } =>\n typeof r === \"object\" &&\n r !== null &&\n typeof (r as { id?: unknown }).id === \"number\" &&\n typeof (r as { state?: unknown }).state === \"string\" &&\n typeof (r as { user?: { login?: unknown } }).user?.login === \"string\";\n\nconst fetchBotReviews = async (\n repo: string,\n prNumber: number,\n botLogin: string,\n ghApi: GhApi,\n): Promise<readonly BotReviewRef[]> => {\n const stdout = await ghApi([`repos/${repo}/pulls/${String(prNumber)}/reviews`, \"--paginate\"]);\n let reviews: unknown;\n try {\n reviews = JSON.parse(stdout || \"[]\");\n } catch {\n return [];\n }\n if (!Array.isArray(reviews)) return [];\n return reviews\n .filter(isBotReview)\n .filter((r) => r.user.login === botLogin && r.state !== \"DISMISSED\")\n .map((r) => ({ id: r.id }));\n};\n\n// Best-effort: a dismissal failure is logged, never fails the job.\nconst dismissReviews = async (\n repo: string,\n prNumber: number,\n ids: readonly number[],\n ghApi: GhApi,\n): Promise<void> => {\n for (const id of ids) {\n try {\n await ghApi(\n [\n `repos/${repo}/pulls/${String(prNumber)}/reviews/${String(id)}/dismissals`,\n \"-X\",\n \"PUT\",\n \"--input\",\n \"-\",\n ],\n JSON.stringify({ message: \"Superseded by a new review for an updated commit.\" }),\n );\n } catch (err) {\n process.stderr.write(\n `Warning: failed to dismiss prior review #${String(id)} on PR #${String(prNumber)}: ${errMsg(err)}\\n`,\n );\n }\n }\n};\n\n// Capped at the first 100 threads (×100 comments each); hasNextPage flags a PR that exceeds it.\nconst REVIEW_THREAD_COMMENTS_QUERY =\n \"query($owner:String!,$name:String!,$pr:Int!){repository(owner:$owner,name:$name){pullRequest(number:$pr){reviewThreads(first:100){pageInfo{hasNextPage}nodes{comments(first:100){nodes{id isMinimized author{login}}}}}}}}\";\n\n// Reversible — minimized as OUTDATED, not deleted.\nconst MINIMIZE_COMMENT_MUTATION =\n \"mutation($id:ID!){minimizeComment(input:{subjectId:$id,classifier:OUTDATED}){minimizedComment{isMinimized}}}\";\n\n// GraphQL reports the bare login (github-actions), so match with and without the REST [bot] suffix.\nconst priorBotCommentId = (c: unknown, logins: readonly string[]): string | null => {\n if (typeof c !== \"object\" || c === null) return null;\n const o = c as { id?: unknown; isMinimized?: unknown; author?: { login?: unknown } | null };\n const login = o.author?.login;\n return typeof o.id === \"string\" &&\n o.isMinimized !== true &&\n typeof login === \"string\" &&\n logins.includes(login)\n ? o.id\n : null;\n};\n\nconst priorBotCommentIds = (\n raw: string,\n botLogin: string,\n): { readonly ids: readonly string[]; readonly truncated: boolean } => {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return { ids: [], truncated: false };\n }\n const conn = (\n parsed as {\n data?: {\n repository?: {\n pullRequest?: {\n reviewThreads?: { nodes?: unknown; pageInfo?: { hasNextPage?: unknown } };\n };\n };\n };\n }\n ).data?.repository?.pullRequest?.reviewThreads;\n const truncated = conn?.pageInfo?.hasNextPage === true;\n const nodes = conn?.nodes;\n if (!Array.isArray(nodes)) return { ids: [], truncated };\n const logins = [botLogin.replace(/\\[bot\\]$/, \"\"), botLogin];\n const ids = nodes.flatMap((t) => {\n const cnodes = (t as { comments?: { nodes?: unknown } }).comments?.nodes;\n return Array.isArray(cnodes)\n ? cnodes.map((c) => priorBotCommentId(c, logins)).filter((id): id is string => id !== null)\n : [];\n });\n return { ids, truncated };\n};\n\n// Snapshot BEFORE posting the fresh review, so the set is exactly the prior (stale) comments.\n// Best-effort: a listing failure logs and returns [].\nconst listPriorBotCommentIds = async (\n repo: string,\n prNumber: number,\n botLogin: string,\n ghApi: GhApi,\n): Promise<readonly string[]> => {\n const slash = repo.indexOf(\"/\");\n if (slash <= 0) return [];\n const owner = repo.slice(0, slash);\n const name = repo.slice(slash + 1);\n let raw: string;\n try {\n raw = await ghApi([\n \"graphql\",\n \"-f\",\n `query=${REVIEW_THREAD_COMMENTS_QUERY}`,\n \"-f\",\n `owner=${owner}`,\n \"-f\",\n `name=${name}`,\n \"-F\",\n `pr=${String(prNumber)}`,\n ]);\n } catch (err) {\n process.stderr.write(\n `Warning: could not list review threads to minimize stale comments on PR #${String(prNumber)}: ${errMsg(err)}\\n`,\n );\n return [];\n }\n const { ids, truncated } = priorBotCommentIds(raw, botLogin);\n if (truncated) {\n process.stderr.write(\n `Note: PR #${String(prNumber)} has more than 100 review threads — only the first 100 were scanned for stale bot comments\\n`,\n );\n }\n return ids;\n};\n\n// Best-effort: a minimize failure is logged, never fails the post.\nconst minimizeComments = async (\n prNumber: number,\n ids: readonly string[],\n ghApi: GhApi,\n): Promise<void> => {\n let minimized = 0;\n for (const id of ids) {\n try {\n await ghApi([\"graphql\", \"-f\", `query=${MINIMIZE_COMMENT_MUTATION}`, \"-f\", `id=${id}`]);\n minimized += 1;\n } catch (err) {\n process.stderr.write(\n `Warning: failed to minimize a stale review comment on PR #${String(prNumber)}: ${errMsg(err)}\\n`,\n );\n }\n }\n if (minimized > 0) {\n process.stderr.write(\n `Minimized ${String(minimized)} stale inline comment(s) from superseded reviews on PR #${String(prNumber)}\\n`,\n );\n }\n};\n\nexport const post = async (input: PostInput, ghApi: GhApi = runGhApi): Promise<void> => {\n // Phase 1: reads + rendering, no writes yet.\n const candidates = await fetchPrCandidates(input.repo, input.headSha, ghApi);\n const resolution = resolvePr(candidates, input.headBranch);\n if (resolution.kind === \"none\") {\n process.stderr.write(`No open PR for ${input.headSha} — nothing to post\\n`);\n process.exit(0);\n }\n if (resolution.kind === \"not-open\") {\n process.stderr.write(\n `PR #${String(resolution.prNumber)} for ${input.headSha} is not open (state: ${resolution.state}) — nothing to post\\n`,\n );\n process.exit(0);\n }\n const prNumber = resolution.prNumber;\n\n const diff = await fetchDiff(input.repo, prNumber, ghApi);\n const existingSticky = await findBotComment(\n input.repo,\n prNumber,\n input.botLogin,\n DEFAULT_MARKER,\n ghApi,\n );\n\n const prices = JSON.parse(readFileSync(input.pricesPath, \"utf-8\")) as unknown;\n const decodedPrices = PriceMapCodec.decode(prices);\n if (decodedPrices._tag === \"Left\") {\n throw new Error(`Price map at ${input.pricesPath} does not match the expected shape`);\n }\n const template = readFileSync(input.templatePath, \"utf-8\");\n const inlineTemplate = readFileSync(input.inlineTemplatePath, \"utf-8\");\n\n const renderNotice = (message: string): string =>\n formatMarkdown(\n render({\n findings: noticeFindings(`### ⚠️ ${message}`),\n envelope: null,\n prices: decodedPrices.right,\n pricesProvided: input.pricesProvided,\n template,\n route: input.route,\n reviewedSha: input.headSha,\n effort: input.effort,\n runUrl: input.runUrl,\n jsonUrl: input.jsonUrl,\n postedAt: input.postedAt,\n }),\n );\n\n if (isEmptyDiff(diff)) {\n await upsertSticky(\n input.repo,\n prNumber,\n existingSticky,\n renderNotice(\"The diff for this PR is empty — nothing to review.\"),\n ghApi,\n );\n process.exit(0);\n }\n\n const findingsResult = loadFindings(input.findingsPath);\n if (findingsResult.kind !== \"ok\") {\n await upsertSticky(\n input.repo,\n prNumber,\n existingSticky,\n renderNotice(noticeMessageFor(findingsResult)),\n ghApi,\n );\n process.exit(0);\n }\n const findings = findingsResult.findings;\n\n const envelope = loadEnvelope(input.envelopePath);\n const testReport = input.testReportPath ? loadTestReport(input.testReportPath) : undefined;\n\n if (envelope === null) {\n const body = formatMarkdown(\n render({\n findings,\n envelope: null,\n prices: decodedPrices.right,\n pricesProvided: input.pricesProvided,\n template,\n route: input.route,\n reviewedSha: input.headSha,\n effort: input.effort,\n testReport,\n inlineDisposition: { kind: \"no-envelope\" },\n runUrl: input.runUrl,\n jsonUrl: input.jsonUrl,\n postedAt: input.postedAt,\n }),\n );\n await upsertSticky(input.repo, prNumber, existingSticky, body, ghApi);\n process.stderr.write(\n \"Result envelope missing or malformed — posted sticky summary without usage/cost data; no inline review\\n\",\n );\n process.exit(0);\n }\n\n // Base64-encode the whole-document marker once, reused across sticky + review body; each inline\n // comment embeds only its own finding instead.\n const findingsMarker = findingsPointer(findings, input.jsonUrl);\n\n const {\n comments: rawComments,\n strays,\n inDiff,\n } = buildInlineComments(findings.findings, diff, {\n inlineTemplate,\n models: envelope.models.map((m) => m.model),\n findings,\n jsonUrl: input.jsonUrl,\n });\n const { comments, longFiles } = checkLongSuggestions(rawComments);\n for (const wf of longFiles) {\n process.stderr.write(\n `Warning: suggestion in ${wf} exceeds ${String(MAX_SUGGESTION_LINES)} lines — omitted from inline to avoid 422\\n`,\n );\n }\n\n // All prior bot reviews, fetched to supersede below — a re-run on the same commit still posts a\n // fresh review rather than being skipped.\n const botReviews = await fetchBotReviews(input.repo, prNumber, input.botLogin, ghApi);\n\n // The \"posted\" disposition is only ever built from the actual post result below, never optimistically.\n const initialDisposition: InlineDisposition | undefined =\n comments.length === 0 && strays.length > 0 ? { kind: \"none-in-diff\" } : undefined;\n\n const commonRenderInput: Omit<RenderInput, \"inlineDisposition\" | \"reviewUrl\"> = {\n findings,\n envelope,\n prices: decodedPrices.right,\n pricesProvided: input.pricesProvided,\n template,\n route: input.route,\n reviewedSha: input.headSha,\n effort: input.effort,\n testReport,\n severityCounts: computeSeverityCounts(findings.findings),\n strays,\n runUrl: input.runUrl,\n jsonUrl: input.jsonUrl,\n findingsPointer: findingsMarker,\n postedAt: input.postedAt,\n };\n const longFilesNote =\n longFiles.length > 0\n ? `\\n\\n---\\n\\n> **Note:** ${String(longFiles.length)} suggestion(s) exceeded GitHub's ~10-line inline suggestion limit and were omitted from the inline comments; the affected findings remain in the review.\\n`\n : \"\";\n // Called twice: before the review exists (no disposition claim) and after (with reviewUrl + truth).\n const renderBody = (\n inlineDisposition: InlineDisposition | undefined,\n reviewUrl?: string,\n straysOverride?: readonly Finding[],\n unanchoredCount?: number,\n ): string =>\n formatMarkdown(\n render({\n ...commonRenderInput,\n ...(straysOverride ? { strays: straysOverride } : {}),\n ...(unanchoredCount !== undefined ? { unanchoredCount } : {}),\n inlineDisposition,\n reviewUrl,\n }) + longFilesNote,\n );\n\n // Phase 2: writes — sticky first, inline second.\n const stickyRef = await upsertSticky(\n input.repo,\n prNumber,\n existingSticky,\n renderBody(initialDisposition),\n ghApi,\n );\n\n // Snapshot stale comments BEFORE posting the fresh ones; timing (not commit SHA) separates them.\n const priorInlineComments = await listPriorBotCommentIds(\n input.repo,\n prNumber,\n input.botLogin,\n ghApi,\n );\n\n // Post first, THEN dismiss: the PR is never left review-less if the process dies between the two.\n const {\n url: reviewUrl,\n inlinePosted,\n unposted,\n } = await postInlineReview(\n input.repo,\n prNumber,\n input.headSha,\n comments,\n inDiff,\n stickyRef?.url,\n findingsMarker,\n ghApi,\n );\n process.stderr.write(\n `Posted a review with ${String(inlinePosted)} inline comment(s) on PR #${String(prNumber)}\\n`,\n );\n\n // Best-effort: a failed dismissal leaves a stale review beside the fresh one (logged), not a job failure.\n const priorReviewIds = botReviews.map((r) => r.id);\n if (priorReviewIds.length > 0) {\n await dismissReviews(input.repo, prNumber, priorReviewIds, ghApi);\n }\n\n // Minimize the pre-post snapshot (stale threads); the fresh comments were posted after it, untouched.\n await minimizeComments(prNumber, priorInlineComments, ghApi);\n\n // Re-render the sticky to the truth: \"posted N\" is the count that ACTUALLY anchored, any\n // GitHub-rejected in-diff findings join the strays, and none-anchored says \"inline unavailable\",\n // never a false \"posted\". Best-effort — the sticky and review are already posted.\n const unanchoredCount = unposted.length;\n const finalStrays = unanchoredCount > 0 ? [...unposted, ...strays] : strays;\n if (stickyRef !== null && (inlinePosted > 0 || unanchoredCount > 0)) {\n const finalDisposition: InlineDisposition =\n inlinePosted > 0\n ? { kind: \"posted\", count: inlinePosted, sha: input.headSha }\n : { kind: \"inline-unavailable\" };\n try {\n await patchComment(\n input.repo,\n stickyRef.id,\n renderBody(finalDisposition, reviewUrl, finalStrays, unanchoredCount),\n ghApi,\n );\n process.stderr.write(\n `Updated sticky comment #${String(stickyRef.id)} to reflect the review\\n`,\n );\n } catch (err) {\n process.stderr.write(\n `Warning: failed to update the sticky summary after the review: ${errMsg(err)}\\n`,\n );\n }\n }\n};\n","// Shares post's PR resolution so the review and comment jobs never split-brain on which PR.\n\nimport { execFile } from \"node:child_process\";\nimport { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport * as t from \"io-ts\";\nimport type { GhApi } from \"./gh.js\";\nimport { runGhApi } from \"./gh.js\";\nimport { fetchDiff, fetchPrCandidates, resolvePr } from \"./pr.js\";\nimport { errMsg } from \"./util.js\";\n\nexport interface GatherInput {\n readonly repo: string;\n readonly headSha: string;\n readonly headBranch?: string;\n readonly runId: string;\n readonly conclusion: string;\n readonly botLogin: string;\n readonly outDir: string;\n}\n\nexport type GatherResult =\n | { readonly kind: \"skip\" }\n | {\n readonly kind: \"gathered\";\n readonly pr: number;\n readonly conclusion: string;\n readonly diffSize: number;\n };\n\nexport const renderOutputs = (result: GatherResult): string => {\n switch (result.kind) {\n case \"skip\":\n return \"skip=true\\n\";\n case \"gathered\":\n return `pr=${String(result.pr)}\\nconclusion=${result.conclusion}\\ndiff_size=${String(result.diffSize)}\\n`;\n }\n};\n\nexport type GitRun = (args: readonly string[]) => Promise<string>;\n\nexport const runGit: GitRun = (args) =>\n new Promise<string>((resolve, reject) => {\n execFile(\n \"git\",\n [...args],\n { encoding: \"utf-8\", maxBuffer: 100 * 1024 * 1024 },\n (err, stdout, stderr) => {\n if (err) {\n const stderrStr = typeof stderr === \"string\" && stderr.trim() ? stderr.trim() : \"\";\n const errStr = err instanceof Error ? err.message : \"unknown error\";\n reject(new Error(`git ${args.join(\" \")} failed: ${stderrStr || errStr}`));\n } else {\n resolve(stdout);\n }\n },\n );\n });\n\nconst PrMetaCodec = t.type({\n changed_files: t.number,\n base_sha: t.string,\n title: t.string,\n body: t.union([t.string, t.null]),\n});\ntype PrMeta = t.TypeOf<typeof PrMetaCodec>;\n\nconst IssueCommentCodec = t.type({\n id: t.number,\n body: t.union([t.string, t.null]),\n user: t.type({ login: t.string }),\n});\nconst IssueCommentsCodec = t.array(IssueCommentCodec);\n\nconst JobCodec = t.type({ id: t.number, conclusion: t.union([t.string, t.null]) });\nconst JobsResponseCodec = t.type({ jobs: t.array(JobCodec) });\n\nconst fetchPrMeta = async (repo: string, prNumber: number, ghApi: GhApi): Promise<PrMeta> => {\n const stdout = await ghApi([\n `repos/${repo}/pulls/${String(prNumber)}`,\n \"--jq\",\n \"{changed_files: .changed_files, base_sha: .base.sha, title: .title, body: .body}\",\n ]);\n const decoded = PrMetaCodec.decode(JSON.parse(stdout) as unknown);\n if (decoded._tag === \"Left\") {\n throw new Error(`PR metadata for #${String(prNumber)} did not match the expected shape`);\n }\n return decoded.right;\n};\n\nconst fetchApiDiff = async (\n repo: string,\n prNumber: number,\n ghApi: GhApi,\n): Promise<string | null> => {\n try {\n return await fetchDiff(repo, prNumber, ghApi);\n } catch {\n return null;\n }\n};\n\nconst fetchPriorReview = async (\n repo: string,\n prNumber: number,\n botLogin: string,\n ghApi: GhApi,\n): Promise<{ readonly id: number; readonly body: string | null } | null> => {\n try {\n const stdout = await ghApi([`repos/${repo}/issues/${String(prNumber)}/comments`, \"--paginate\"]);\n const decoded = IssueCommentsCodec.decode(JSON.parse(stdout || \"[]\") as unknown);\n if (decoded._tag === \"Left\") return null;\n const byBot = decoded.right.filter((c) => c.user.login === botLogin);\n const last = byBot[byBot.length - 1];\n return last ? { id: last.id, body: last.body } : null;\n } catch {\n return null;\n }\n};\n\n// Jobs-list failure is fatal; a per-log download failure degrades — logs are advisory, and partial\n// logs plus the diff beat a dead review.\nconst downloadFailingJobLogs = async (\n repo: string,\n runId: string,\n outDir: string,\n ghApi: GhApi,\n): Promise<void> => {\n const stdout = await ghApi([`repos/${repo}/actions/runs/${runId}/jobs`]);\n const decoded = JobsResponseCodec.decode(JSON.parse(stdout) as unknown);\n if (decoded._tag === \"Left\") {\n throw new Error(`Jobs list for run ${runId} did not match the expected shape`);\n }\n for (const job of decoded.right.jobs.filter((j) => j.conclusion === \"failure\")) {\n try {\n const log = await ghApi([`repos/${repo}/actions/jobs/${String(job.id)}/logs`]);\n writeFileSync(join(outDir, `job_${String(job.id)}.log`), log);\n } catch (err) {\n process.stderr.write(\n `Warning: failed to download logs for job ${String(job.id)}: ${errMsg(err)} — continuing with the logs retrieved so far\\n`,\n );\n }\n }\n};\n\nexport const gather = async (\n input: GatherInput,\n ghApi: GhApi = runGhApi,\n gitRun: GitRun = runGit,\n): Promise<GatherResult> => {\n const candidates = await fetchPrCandidates(input.repo, input.headSha, ghApi);\n const resolution = resolvePr(candidates, input.headBranch);\n if (resolution.kind === \"none\") {\n process.stderr.write(`No open PR for ${input.headSha} — nothing to review\\n`);\n return { kind: \"skip\" };\n }\n if (resolution.kind === \"not-open\") {\n process.stderr.write(\n `PR #${String(resolution.prNumber)} for ${input.headSha} is not open (state: ${resolution.state}) — nothing to review\\n`,\n );\n return { kind: \"skip\" };\n }\n const prNumber = resolution.prNumber;\n\n const meta = await fetchPrMeta(input.repo, prNumber, ghApi);\n\n const apiDiff = await fetchApiDiff(input.repo, prNumber, ghApi);\n const diff =\n apiDiff !== null && !(apiDiff.length === 0 && meta.changed_files > 0)\n ? apiDiff\n : await (async () => {\n process.stderr.write(\n `PR diff fetch failed or was empty for ${String(meta.changed_files)} changed files — falling back to git diff\\n`,\n );\n await gitRun([\"fetch\", \"origin\", input.headSha]);\n return gitRun([\"diff\", meta.base_sha, input.headSha]);\n })();\n\n writeFileSync(join(input.outDir, \"pr.diff\"), diff);\n writeFileSync(\n join(input.outDir, \"pr_context.json\"),\n JSON.stringify({ title: meta.title, body: meta.body }),\n );\n\n const prior = await fetchPriorReview(input.repo, prNumber, input.botLogin, ghApi);\n writeFileSync(\n join(input.outDir, \"prior_review.json\"),\n prior === null ? \"null\" : JSON.stringify(prior),\n );\n\n if (input.conclusion === \"failure\") {\n await downloadFailingJobLogs(input.repo, input.runId, input.outDir, ghApi);\n }\n\n return {\n kind: \"gathered\",\n pr: prNumber,\n conclusion: input.conclusion,\n diffSize: Buffer.byteLength(diff, \"utf8\"),\n };\n};\n","// Extraction ladder: recovers a schema-conforming candidate (findings or triage) from a native\n// agent-CLI envelope when structured-output enforcement is imperfect or absent. Security rationale:\n// a rung wins only on EXACTLY ONE distinct schema-validating candidate (fenced blocks deduped by\n// canonical value first), which defeats block-injection; disagreeing candidates are refused. Every\n// candidate must pass BOTH gates — ajv (shape + additionalProperties:false) and the registry's io-ts\n// codec (cross-field invariants ajv can't express, e.g. end_line >= start_line).\n\nimport { readFileOrNull, tryParseJson } from \"./util.js\";\nimport { resolve, schemaPathFor, defaultVersion } from \"./registry.js\";\nimport { validateAgainstSchema } from \"./validate.js\";\n\nexport type ExtractKind = \"findings\" | \"triage\";\n\nexport interface ExtractInput {\n readonly kind: ExtractKind;\n // findings only — a documented no-op for triage.\n readonly agentFilePath?: string;\n // Last valid draft snapshot, tried after agentFilePath and before the native envelope.\n readonly agentFileFallbackPath?: string;\n readonly native: unknown;\n}\n\nexport type LadderOutcome =\n | { readonly kind: \"ok\"; readonly version: string; readonly candidate: unknown }\n | { readonly kind: \"error-envelope\"; readonly detail: string }\n | { readonly kind: \"none\"; readonly detail: string }\n | { readonly kind: \"ambiguous\"; readonly detail: string };\n\ninterface NativeForExtraction {\n readonly result: unknown;\n readonly structuredOutput: unknown;\n readonly isError: unknown;\n readonly subtype: unknown;\n readonly apiErrorStatus: unknown;\n}\n\nconst fieldOf = (raw: unknown, key: string): unknown =>\n typeof raw === \"object\" && raw !== null && key in raw\n ? (raw as Record<string, unknown>)[key]\n : undefined;\n\nconst parseNativeForExtraction = (raw: unknown): NativeForExtraction => ({\n result: fieldOf(raw, \"result\"),\n structuredOutput: fieldOf(raw, \"structured_output\"),\n isError: fieldOf(raw, \"is_error\"),\n subtype: fieldOf(raw, \"subtype\"),\n apiErrorStatus: fieldOf(raw, \"api_error_status\"),\n});\n\nconst isNullish = (value: unknown): boolean => value === null || value === undefined;\n\nconst isErrorEnvelope = (native: NativeForExtraction): boolean =>\n native.isError === true ||\n (!isNullish(native.subtype) && native.subtype !== \"success\") ||\n !isNullish(native.apiErrorStatus);\n\nconst describeErrorEnvelope = (native: NativeForExtraction): string => {\n const parts: readonly string[] = [\n ...(native.isError === true ? [\"is_error=true\"] : []),\n ...(!isNullish(native.subtype) && native.subtype !== \"success\"\n ? [`subtype=${JSON.stringify(native.subtype)}`]\n : []),\n ...(!isNullish(native.apiErrorStatus)\n ? [`api_error_status=${JSON.stringify(native.apiErrorStatus)}`]\n : []),\n ];\n return `agent run did not complete successfully (${parts.join(\", \")})`;\n};\n\nexport const withDefaultSchemaVersion = (candidate: unknown): unknown =>\n typeof candidate === \"object\" &&\n candidate !== null &&\n !Array.isArray(candidate) &&\n !(\"schema_version\" in candidate)\n ? { ...candidate, schema_version: defaultVersion(\"findings\") }\n : candidate;\n\nconst normalizeCandidate = (kind: ExtractKind, candidate: unknown): unknown =>\n kind === \"findings\" ? withDefaultSchemaVersion(candidate) : candidate;\n\nconst candidateVersion = (kind: ExtractKind, candidate: unknown): string | undefined => {\n if (kind !== \"findings\") return undefined;\n const version = fieldOf(candidate, \"schema_version\");\n return typeof version === \"string\" ? version : undefined;\n};\n\nconst safeSchemaPathFor = (kind: ExtractKind, version: string | undefined): string | null => {\n try {\n return schemaPathFor(kind, version);\n } catch {\n return null;\n }\n};\n\ninterface GatedCandidate {\n readonly version: string;\n // Pre-registry-normalize (identical for alpha) — what the extract CLI prints, per the registry seam.\n readonly candidate: unknown;\n}\n\n// Sort keys recursively so two values differing only in key order canonicalize equal.\nconst canonicalize = (value: unknown): unknown =>\n Array.isArray(value)\n ? value.map(canonicalize)\n : value !== null && typeof value === \"object\"\n ? Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([k, v]) => [k, canonicalize(v)]),\n )\n : value;\n\n// A model re-emitting its answer verbatim is benign, not a conflict; candidates differing in any\n// value stay distinct, so the injection defense (refusing a survivor among disagreeing candidates) holds.\nconst dedupCandidates = (candidates: readonly GatedCandidate[]): readonly GatedCandidate[] => {\n const seen = new Set<string>();\n return candidates.filter((c) => {\n const key = JSON.stringify(canonicalize(c.candidate));\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n};\n\n// Both gates: ajv (shape + injection defense) then the registry's io-ts codec (materialization +\n// cross-field invariants). Null when either rejects.\nconst gateCandidate = (kind: ExtractKind, rawCandidate: unknown): GatedCandidate | null => {\n const candidate = normalizeCandidate(kind, rawCandidate);\n const schemaPath = safeSchemaPathFor(kind, candidateVersion(kind, candidate));\n if (schemaPath === null) return null;\n if (!validateAgainstSchema(candidate, schemaPath).valid) return null;\n const resolution = resolve(kind, candidate);\n return resolution.kind === \"ok\" ? { version: resolution.version, candidate } : null;\n};\n\nconst candidateFromJsonText = (kind: ExtractKind, text: string | null): GatedCandidate | null => {\n if (text === null) return null;\n const parsed = tryParseJson(text);\n return parsed.ok ? gateCandidate(kind, parsed.value) : null;\n};\n\ninterface FenceScanState {\n readonly blocks: readonly string[];\n readonly openLength: number | null;\n readonly buffer: readonly string[];\n}\n\nconst FENCE_OPEN = /^\\s*(`{3,})/;\nconst FENCE_MARKER_ONLY = /^`+$/;\n\n// Line-based by design — no regex spans more than one line, so no catastrophic-backtracking surface.\nconst scanLine = (state: FenceScanState, line: string): FenceScanState => {\n if (state.openLength === null) {\n const opened = FENCE_OPEN.exec(line)?.[1]?.length;\n return opened !== undefined ? { blocks: state.blocks, openLength: opened, buffer: [] } : state;\n }\n const trimmed = line.trim();\n const closes = FENCE_MARKER_ONLY.test(trimmed) && trimmed.length >= state.openLength;\n return closes\n ? { blocks: [...state.blocks, state.buffer.join(\"\\n\")], openLength: null, buffer: [] }\n : { ...state, buffer: [...state.buffer, line] };\n};\n\nexport const scanFencedBlocks = (text: string): readonly string[] =>\n text.split(\"\\n\").reduce(scanLine, { blocks: [], openLength: null, buffer: [] }).blocks;\n\n// Operator-facing trace for stderr/logs (never the fail-closed reasons, which stay generic): e.g. a\n// null structured_output points at a CLI not enforcing --json-schema.\nexport const ladderFailureDiagnostics = (input: ExtractInput): string => {\n const native = parseNativeForExtraction(input.native);\n const preview = (s: string): string => {\n const flat = s.replace(/\\s+/g, \" \").trim();\n return flat.length > 200 ? `${flat.slice(0, 200)}…` : flat;\n };\n const lines: string[] = [];\n if (input.kind === \"findings\") {\n lines.push(\n input.agentFilePath === undefined\n ? \"agent-file rung: no --agent-file given\"\n : `agent-file rung: ${input.agentFilePath} did not validate (or was unreadable)`,\n );\n if (input.agentFileFallbackPath !== undefined)\n lines.push(\n `last-valid rung: ${input.agentFileFallbackPath} did not validate (or was absent)`,\n );\n }\n lines.push(\n isNullish(native.structuredOutput)\n ? \"structured_output rung: absent (null) — the CLI's --json-schema likely did not enforce\"\n : \"structured_output rung: present but did not validate against the schema\",\n );\n lines.push(\n typeof native.result === \"string\"\n ? `result rung: ${String(native.result.length)} chars, ${String(scanFencedBlocks(native.result).length)} fenced JSON block(s), none validated; preview: ${preview(native.result)}`\n : \"result rung: absent or not a string\",\n );\n return lines.join(\"\\n\");\n};\n\nexport const describeLadderFailure = (outcome: Exclude<LadderOutcome, { kind: \"ok\" }>): string => {\n switch (outcome.kind) {\n case \"error-envelope\":\n return `review did not complete: ${outcome.detail}`;\n case \"none\":\n return `could not recover a validating candidate: ${outcome.detail}`;\n case \"ambiguous\":\n return `ambiguous candidates: ${outcome.detail}`;\n }\n};\n\nconst okOutcome = (gated: GatedCandidate): LadderOutcome => ({\n kind: \"ok\",\n version: gated.version,\n candidate: gated.candidate,\n});\n\n// Pure aside from an optional --agent-file read.\nexport const extractStructured = (input: ExtractInput): LadderOutcome => {\n const native = parseNativeForExtraction(input.native);\n\n // The agent-file and its last-valid snapshot are self-validated deliverables written OUTSIDE the\n // worktree (a PR can't plant them) and checkpointed by us during the run, so they outrank an error\n // envelope: a run that errored (max-turns, a captured API error) after producing a valid draft\n // should still post it, not \"did not complete\". The error-envelope short-circuit below still guards\n // the less-trusted native rungs (structured_output/result).\n if (input.kind === \"findings\") {\n for (const path of [input.agentFilePath, input.agentFileFallbackPath]) {\n if (path === undefined) continue;\n const fromFile = candidateFromJsonText(input.kind, readFileOrNull(path));\n if (fromFile) return okOutcome(fromFile);\n }\n }\n\n if (isErrorEnvelope(native)) {\n return { kind: \"error-envelope\", detail: describeErrorEnvelope(native) };\n }\n\n if (native.structuredOutput !== undefined) {\n const fromStructured = gateCandidate(input.kind, native.structuredOutput);\n if (fromStructured) return okOutcome(fromStructured);\n }\n\n if (typeof native.result === \"string\") {\n const fromResult = candidateFromJsonText(input.kind, native.result.trim());\n if (fromResult) return okOutcome(fromResult);\n\n const fencedCandidates = dedupCandidates(\n scanFencedBlocks(native.result)\n .map((block) => candidateFromJsonText(input.kind, block))\n .filter((gated): gated is GatedCandidate => gated !== null),\n );\n\n const [survivor, ...rest] = fencedCandidates;\n if (survivor !== undefined && rest.length === 0) return okOutcome(survivor);\n if (survivor !== undefined) {\n return {\n kind: \"ambiguous\",\n detail: `${String(fencedCandidates.length)} distinct fenced JSON blocks each validate against the ${input.kind} schema — refusing to pick one`,\n };\n }\n }\n\n const fallbackRung = input.agentFileFallbackPath ? \", last-valid snapshot\" : \"\";\n return {\n kind: \"none\",\n detail: `no --agent-file${fallbackRung}, structured_output, JSON result, or fenced block validated against the ${input.kind} schema`,\n };\n};\n","// Maps a coding-agent CLI's native result envelope onto the abstract envelope. An absent native\n// (undefined/null — the caller couldn't read/parse it, e.g. a wall-clock kill hit `claude -p`\n// mid-flush) still recovers findings from --agent-file and refills telemetry from the transcript\n// fallback; a present-but-wrong-shaped native is a Left. Never throws.\n\nimport * as t from \"io-ts\";\nimport type { Either } from \"fp-ts/Either\";\nimport { resolve } from \"./registry.js\";\nimport { extractStructured, describeLadderFailure } from \"./extract.js\";\nimport { DEFAULT_SCHEMA_VERSION, noticeFindings } from \"./schema.js\";\nimport type { Findings, ModelUsageEntry, ResultEnvelope } from \"./schema.js\";\n\n// No value-level fp-ts import: a bare \"fp-ts/Either\" subpath import breaks under strict Node ESM\n// (fp-ts ships no \"exports\" map), so Either values are plain tagged literals, as in validate.ts.\nconst left = <A>(message: string): Either<string, A> => ({ _tag: \"Left\", left: message });\nconst right = <A>(value: A): Either<string, A> => ({ _tag: \"Right\", right: value });\n\nexport type AdapterName = \"claude-code\";\n\nexport const isAdapterName = (name: string): name is AdapterName => name === \"claude-code\";\n\nconst ClaudeCodeModelUsageEntryCodec = t.intersection([\n t.type({\n inputTokens: t.number,\n outputTokens: t.number,\n }),\n t.partial({\n cacheReadInputTokens: t.number,\n cacheCreationInputTokens: t.number,\n costUSD: t.number,\n }),\n]);\n\nexport const ClaudeCodeEnvelopeCodec = t.intersection([\n t.type({\n modelUsage: t.record(t.string, ClaudeCodeModelUsageEntryCodec),\n num_turns: t.number,\n duration_ms: t.number,\n }),\n t.partial({\n total_cost_usd: t.union([t.number, t.null]),\n structured_output: t.unknown,\n }),\n]);\n\ntype ClaudeCodeEnvelope = t.TypeOf<typeof ClaudeCodeEnvelopeCodec>;\n\nconst mapModelUsage = (modelUsage: ClaudeCodeEnvelope[\"modelUsage\"]): ModelUsageEntry[] =>\n Object.entries(modelUsage).map(([model, entry]) => ({\n model,\n input_tokens: entry.inputTokens,\n output_tokens: entry.outputTokens,\n ...(entry.cacheReadInputTokens !== undefined\n ? { cache_read_tokens: entry.cacheReadInputTokens }\n : {}),\n ...(entry.cacheCreationInputTokens !== undefined\n ? { cache_write_tokens: entry.cacheCreationInputTokens }\n : {}),\n }));\n\nexport interface TranscriptTelemetry {\n readonly models: readonly ModelUsageEntry[];\n readonly turns: number;\n readonly durationMs: number;\n}\n\n// transcriptFallback is a THUNK — the read can be megabytes on a large fan-out, so callers pass it\n// only when a transcript path was given.\nexport interface RunMeta {\n readonly route?: string;\n readonly effort?: string;\n readonly transcriptFallback?: () => TranscriptTelemetry;\n // Last valid draft snapshot, recovered when the live agent-file no longer validates (e.g. a\n // wall-kill truncated it).\n readonly agentFileFallbackPath?: string;\n}\n\n// Every ladder outcome maps onto a findings result, never a fatal one — a findings miss must not\n// drop telemetry.\ntype FindingsOutcome =\n | { readonly kind: \"ok\"; readonly version: string; readonly findings: Findings }\n | { readonly kind: \"telemetry-only\"; readonly reason: string };\n\nconst findingsOutcome = (\n native: unknown,\n agentFilePath: string | undefined,\n agentFileFallbackPath: string | undefined,\n): FindingsOutcome => {\n const ladder = extractStructured({\n kind: \"findings\",\n native,\n agentFilePath,\n agentFileFallbackPath,\n });\n if (ladder.kind !== \"ok\")\n return { kind: \"telemetry-only\", reason: describeLadderFailure(ladder) };\n // Re-resolving materializes the typed, normalized value the ladder deliberately didn't keep.\n const resolution = resolve(\"findings\", ladder.candidate);\n return resolution.kind === \"ok\"\n ? { kind: \"ok\", version: resolution.version, findings: resolution.value }\n : {\n kind: \"telemetry-only\",\n reason:\n \"internal error: the extraction ladder validated a candidate the registry then rejected\",\n };\n};\n\ninterface Telemetry {\n readonly models: ModelUsageEntry[];\n readonly turns: number;\n readonly duration_ms: number;\n readonly vendor_cost_usd: number | null;\n readonly route?: string;\n readonly effort?: string;\n}\n\nconst withMeta = (base: Omit<Telemetry, \"route\" | \"effort\">, meta: RunMeta): Telemetry => ({\n ...base,\n ...(meta.route ? { route: meta.route } : {}),\n ...(meta.effort ? { effort: meta.effort } : {}),\n});\n\n// Each field from whichever source is authoritative for it — NOT always the transcript:\n// - Wall + turns: the transcript when available. The native envelope reports only the main agent's\n// active time/turns and wildly under-reports a fan-out (a 12-subagent ~12-min run reads as \"5\n// turns, 42s\"); the transcript tree spans the whole session.\n// - Per-model usage: native-authoritative when present. Summing the transcript's per-message usage\n// under-counts output badly (measured ~5.7× low), so DO NOT \"simplify\" this to always-transcript;\n// the transcript refills usage ONLY when the native has none (a `timeout` kill left it empty).\n// The vendor's own cost figure is carried through from the native whenever it had one.\nconst resolveTelemetry = (\n native: {\n models: ModelUsageEntry[];\n turns: number;\n durationMs: number;\n vendorCostUsd: number | null;\n },\n meta: RunMeta,\n): Telemetry => {\n // A thunk that throws degrades to \"no transcript\" (the native's own figures) — never fails adapt.\n const fb = ((): TranscriptTelemetry | undefined => {\n try {\n return meta.transcriptFallback?.();\n } catch {\n return undefined;\n }\n })();\n // Wall + turns move together — never one source for turns and another for the wall.\n const wallTurns =\n fb !== undefined && fb.durationMs > 0\n ? { turns: fb.turns, duration_ms: fb.durationMs }\n : { turns: native.turns, duration_ms: native.durationMs };\n return withMeta(\n {\n models: native.models.length > 0 ? native.models : fb ? [...fb.models] : native.models,\n ...wallTurns,\n vendor_cost_usd: native.vendorCostUsd,\n },\n meta,\n );\n};\n\nconst nativeTelemetry = (native: ClaudeCodeEnvelope, meta: RunMeta): Telemetry =>\n resolveTelemetry(\n {\n models: mapModelUsage(native.modelUsage),\n turns: native.num_turns,\n durationMs: native.duration_ms,\n vendorCostUsd: native.total_cost_usd ?? null,\n },\n meta,\n );\n\n// Native absent/unreadable (a wall-clock kill can leave no parseable envelope): the transcript\n// fallback refills real spend when present, else zeros. The findings ladder still runs (its\n// --agent-file rung needs no native), so a checkpointed $DRAFT survives the cutoff.\nconst absentTelemetry = (meta: RunMeta): Telemetry =>\n resolveTelemetry({ models: [], turns: 0, durationMs: 0, vendorCostUsd: null }, meta);\n\n// A ladder miss becomes a \"did not complete\" notice, never a discarded envelope.\nconst buildEnvelope = (\n telemetry: Telemetry,\n native: unknown,\n agentFilePath: string | undefined,\n agentFileFallbackPath: string | undefined,\n): ResultEnvelope => {\n const outcome = findingsOutcome(native, agentFilePath, agentFileFallbackPath);\n switch (outcome.kind) {\n case \"ok\":\n return { schema_version: outcome.version, findings: outcome.findings, ...telemetry };\n case \"telemetry-only\":\n return {\n schema_version: DEFAULT_SCHEMA_VERSION,\n findings: noticeFindings(`### ⚠️ Review did not complete\\n\\n${outcome.reason}`),\n ...telemetry,\n };\n }\n};\n\n// native undefined/null ⇒ the caller couldn't read/parse the envelope: emit a no-telemetry envelope\n// and still recover findings from --agent-file, rather than failing the run. A present but\n// wrong-shaped native is a Left (a real adapter mismatch).\nexport const adapt = (\n adapterName: AdapterName,\n native: unknown,\n agentFilePath?: string,\n meta: RunMeta = {},\n): Either<string, ResultEnvelope> => {\n switch (adapterName) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- exhaustive by design; AdapterName grows (e.g. \"opencode\") without collapsing this switch to an if\n case \"claude-code\": {\n if (native === undefined || native === null)\n return right(\n buildEnvelope(\n absentTelemetry(meta),\n undefined,\n agentFilePath,\n meta.agentFileFallbackPath,\n ),\n );\n const decoded = ClaudeCodeEnvelopeCodec.decode(native);\n if (decoded._tag === \"Left\")\n return left(\"native envelope does not match the Claude Code output shape\");\n return right(\n buildEnvelope(\n nativeTelemetry(decoded.right, meta),\n native,\n agentFilePath,\n meta.agentFileFallbackPath,\n ),\n );\n }\n }\n};\n","// The review agent's whole hook discipline as one --settings file (data, not shell): the Stop\n// deliverable gate + the two budget hooks (one self-dispatching command wired to both tool events).\n\nimport { defaultHookCommand } from \"./stop-gate.js\";\nimport { budgetHookCommand } from \"./budget.js\";\n\ninterface CommandHook {\n readonly type: \"command\";\n readonly command: string;\n}\ninterface HookEntry {\n readonly hooks: readonly CommandHook[];\n}\n\n// PreToolUse/PostToolBatch carry no matcher — they run for every tool; the CLI decides per tool_name.\nexport interface ReviewHookSettings {\n readonly hooks: {\n readonly Stop: readonly HookEntry[];\n readonly PreToolUse: readonly HookEntry[];\n readonly PostToolBatch: readonly HookEntry[];\n };\n}\n\nexport interface ComposeSettingsOptions {\n readonly draftPath: string;\n readonly stop: {\n readonly kind?: string;\n readonly schema?: string;\n readonly schemaVersion?: string;\n readonly maxNudges?: string;\n readonly counter?: string;\n };\n readonly budget: {\n readonly budgetUsd?: string;\n readonly wall?: string;\n readonly prices?: string;\n readonly reserveFrac?: string;\n readonly reserveGrowth?: string;\n readonly reserveUsd?: string;\n readonly reserveWall?: string;\n };\n}\n\n// The budget command self-dispatches on the stdin event, so it is built once and wired to both.\nexport const composeReviewSettings = (opts: ComposeSettingsOptions): ReviewHookSettings => {\n const budgetCommand = budgetHookCommand(opts.draftPath, opts.budget);\n return {\n hooks: {\n Stop: [\n { hooks: [{ type: \"command\", command: defaultHookCommand(opts.draftPath, opts.stop) }] },\n ],\n PreToolUse: [{ hooks: [{ type: \"command\", command: budgetCommand }] }],\n PostToolBatch: [{ hooks: [{ type: \"command\", command: budgetCommand }] }],\n },\n };\n};\n","#!/usr/bin/env node\n// CLI entry point — the citty subcommands wired in `main` at the bottom.\n\n/* eslint-disable @typescript-eslint/require-await */\n// citty requires async run() even when the body has no explicit await\n\nimport { defineCommand, runMain } from \"citty\";\nimport { copyFileSync, readFileSync, statSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { Either } from \"fp-ts/Either\";\nimport { render } from \"./render.js\";\nimport { buildInlineComments, renderStraysSection } from \"./inline.js\";\nimport { computeCost } from \"./cost.js\";\nimport { readTranscriptTree, sumTranscriptUsage } from \"./transcript.js\";\nimport {\n evaluateBudgetHook,\n parseWallMs,\n parseFraction,\n parseEpochSecMs,\n anchoredElapsedMs,\n deadlineEpochSec,\n mainHasWrittenDraft,\n seedMarkerPath,\n lastValidPath,\n isSubagentHookInput,\n DEFAULT_RESERVE,\n DEADLINE_ENV,\n} from \"./budget.js\";\nimport { validateAgainstSchema, unsafeUnwrap } from \"./validate.js\";\nimport { formatUtc } from \"./format.js\";\nimport {\n ResultEnvelopeCodec,\n FindingsCodec,\n PriceMapCodec,\n TestSummaryCodec,\n noticeFindings,\n} from \"./schema.js\";\nimport type { Triage, Finding, PriceMap } from \"./schema.js\";\nimport { parseFindingsMarker, parseReviewedSha } from \"./surface.js\";\nimport { post } from \"./post.js\";\nimport { gather, renderOutputs } from \"./gather.js\";\nimport { adapt, isAdapterName } from \"./adapt.js\";\nimport type { AdapterName, TranscriptTelemetry } from \"./adapt.js\";\nimport { extractStructured, describeLadderFailure, ladderFailureDiagnostics } from \"./extract.js\";\nimport type { ExtractKind, LadderOutcome } from \"./extract.js\";\nimport { schemaPathFor, declaredVersion } from \"./registry.js\";\nimport type { SchemaKind } from \"./registry.js\";\nimport { validatePatch } from \"./patch.js\";\nimport {\n decideGate,\n draftState,\n readNudges,\n bumpNudges,\n defaultHookCommand,\n stopHookSettings,\n} from \"./stop-gate.js\";\nimport { composeReviewSettings } from \"./settings.js\";\nimport { asRecord, errMsg, tryParseJson } from \"./util.js\";\n\nconst readJSON = (path: string): unknown => {\n try {\n return JSON.parse(readFileSync(resolve(path), \"utf-8\")) as unknown;\n } catch (err) {\n return fail(`Cannot read ${path}: ${errMsg(err)}`);\n }\n};\n\nconst fail = (msg: string): never => {\n process.stderr.write(`${msg}\\n`);\n process.exit(1);\n};\n\n/** Tolerant `readJSON`: returns `undefined` (never exits) when the file is unreadable, empty, or not\n * valid JSON, naming the specific cause on stderr. Used only for `adapt`'s native envelope, which a\n * wall-clock kill can leave empty/truncated — `adapt` then degrades to no telemetry rather than\n * crashing the review step. */\nconst readJSONOrAbsent = (path: string): unknown => {\n const read = ((): { readonly text: string } | { readonly error: string } => {\n try {\n return { text: readFileSync(resolve(path), \"utf-8\") };\n } catch (err) {\n return { error: errMsg(err) };\n }\n })();\n if (\"error\" in read) {\n process.stderr.write(\n `code-review: native envelope ${path} could not be read (${read.error}) — proceeding with no native telemetry\\n`,\n );\n return undefined;\n }\n if (read.text.trim() === \"\") {\n process.stderr.write(\n `code-review: native envelope ${path} is empty — proceeding with no native telemetry\\n`,\n );\n return undefined;\n }\n try {\n return JSON.parse(read.text) as unknown;\n } catch (err) {\n process.stderr.write(\n `code-review: native envelope ${path} is not valid JSON (${errMsg(err)}) — proceeding with no native telemetry\\n`,\n );\n return undefined;\n }\n};\n\nconst readStdinJSON = (): unknown => {\n if (process.stdin.isTTY) return null;\n const raw = ((): string => {\n try {\n return readFileSync(0, \"utf-8\");\n } catch {\n return \"\";\n }\n })();\n if (raw.trim() === \"\") return null;\n const parsed = tryParseJson(raw);\n return parsed.ok ? parsed.value : null;\n};\n\nconst decode = <A>(either: Either<unknown, A>, label: string): A => {\n try {\n return unsafeUnwrap(either);\n } catch {\n return fail(`${label} does not match expected shape`);\n }\n};\n\n/** Unwrap an adapter's Either, surfacing its own message rather than a generic one. */\nconst unwrapAdapt = <A>(either: Either<string, A>): A => {\n try {\n if (either._tag === \"Left\") throw new Error(either.left);\n return either.right;\n } catch (err) {\n return fail(errMsg(err));\n }\n};\n\n/** Telemetry from a session transcript tree (main + subagents) for the true wall + turns the native\n * envelope under-reports, and for per-model usage when the native envelope is empty. A\n * missing/unreadable transcript yields empty models + a zero span, which `adapt` treats as \"no\n * transcript\". */\nconst transcriptFallbackFrom = (path: string): TranscriptTelemetry => {\n const tree = readTranscriptTree(resolve(path));\n if (tree.missing)\n process.stderr.write(\n `code-review adapt: transcript ${path} is unreadable — no telemetry fallback\\n`,\n );\n const usage = sumTranscriptUsage(tree.entries);\n return { models: usage.models, turns: usage.turns, durationMs: usage.durationMs };\n};\n\n/** Resolve a path bundled with the package (schema/, templates/) — same pattern as validate's default schema. */\nconst bundledPath = (...segments: string[]): string =>\n resolve(import.meta.dirname, \"..\", ...segments);\n\nconst packageVersion = (\n JSON.parse(readFileSync(bundledPath(\"package.json\"), \"utf-8\")) as { version: string }\n).version;\n\nconst resolveTemplatePath = (templateArg: string | undefined): string =>\n templateArg ? resolve(templateArg) : bundledPath(\"templates\", \"comment.eta\");\n\nconst resolveInlineTemplatePath = (templateArg: string | undefined): string =>\n templateArg ? resolve(templateArg) : bundledPath(\"templates\", \"inline.eta\");\n\n// `provided` = a real caller map; `absent` = the bundled all-zero example. The render layer is told\n// which, so an absent map reports cost as N/A, never a false $0.00.\ntype PriceResolution =\n | { readonly kind: \"provided\"; readonly path: string }\n | { readonly kind: \"absent\"; readonly path: string };\n\nconst resolvePrices = (pricesArg: string | undefined): PriceResolution => {\n if (pricesArg) return { kind: \"provided\", path: resolve(pricesArg) };\n process.stderr.write(\n \"code-review: no --prices given — cost will be reported as N/A (no price map to recompute from)\\n\",\n );\n return { kind: \"absent\", path: bundledPath(\"schema\", \"prices.example.json\") };\n};\n\nconst TEST_REPORT_DESCRIPTION =\n 'Path to a JSON test summary: {\"passed\": number, \"failed\": number, \"total\": number, \"failures\"?: [{\"name\": string, \"message\"?: string}]}';\n\nconst renderCmd = defineCommand({\n meta: {\n name: \"render\",\n description: \"Render a code-review comment from findings + usage + prices\",\n },\n args: {\n findings: {\n type: \"positional\",\n description: \"Path to findings JSON\",\n required: true,\n },\n template: {\n type: \"string\",\n description: \"Path to Eta template file (default: bundled templates/comment.eta)\",\n },\n usage: {\n type: \"string\",\n description: \"Path to result envelope JSON (from agent CLI)\",\n required: true,\n },\n prices: {\n type: \"string\",\n description:\n \"Path to price map JSON (default: bundled schema/prices.example.json — all zero)\",\n },\n \"reviewed-sha\": {\n type: \"string\",\n description: \"SHA of the last reviewed commit\",\n },\n route: {\n type: \"string\",\n description:\n \"Review route label; overrides the envelope's route when set (default: read from the envelope)\",\n },\n effort: {\n type: \"string\",\n description:\n \"Effort label; overrides the envelope's effort when set (default: read from the envelope)\",\n },\n \"test-report\": {\n type: \"string\",\n description: TEST_REPORT_DESCRIPTION,\n },\n },\n run: async ({ args }) => {\n const findings = decode(FindingsCodec.decode(readJSON(args.findings)), \"findings\");\n const envelope = decode(ResultEnvelopeCodec.decode(readJSON(args.usage)), \"envelope\");\n const templatePath = resolveTemplatePath(args.template);\n const priceResolution = resolvePrices(args.prices);\n const prices = decode(PriceMapCodec.decode(readJSON(priceResolution.path)), \"prices\");\n const template = readFileSync(templatePath, \"utf-8\");\n const testReport = args[\"test-report\"]\n ? decode(TestSummaryCodec.decode(readJSON(args[\"test-report\"])), \"test report\")\n : undefined;\n const output = render({\n findings,\n envelope,\n prices,\n pricesProvided: priceResolution.kind === \"provided\",\n template,\n reviewedSha: args[\"reviewed-sha\"],\n route: args.route,\n effort: args.effort,\n testReport,\n postedAt: formatUtc(new Date()),\n });\n process.stdout.write(output);\n },\n});\n\nconst inlineCmd = defineCommand({\n meta: {\n name: \"inline\",\n description: \"Build GitHub reviews comments[] payload from findings + diff\",\n },\n args: {\n findings: {\n type: \"positional\",\n description: \"Path to findings JSON\",\n required: true,\n },\n diff: {\n type: \"string\",\n description: \"Path to PR diff file\",\n required: true,\n },\n template: {\n type: \"string\",\n description: \"Path to inline comment Eta template (default: bundled templates/inline.eta)\",\n },\n },\n run: async ({ args }) => {\n const findings = decode(FindingsCodec.decode(readJSON(args.findings)), \"findings\");\n const diff = readFileSync(resolve(args.diff), \"utf-8\");\n const inlineTemplate = readFileSync(resolveInlineTemplatePath(args.template), \"utf-8\");\n const { comments, strays } = buildInlineComments(findings.findings, diff, {\n inlineTemplate,\n findings,\n });\n process.stdout.write(\n JSON.stringify({ comments, strays, stray_markdown: renderStraysSection(strays) }, null, 2),\n );\n },\n});\n\nconst costCmd = defineCommand({\n meta: {\n name: \"cost\",\n description: \"Recompute USD cost from the envelope's models array + price map\",\n },\n args: {\n envelope: {\n type: \"positional\",\n description: \"Path to result envelope JSON\",\n required: true,\n },\n prices: {\n type: \"string\",\n description: \"Path to price map JSON\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const envelope = decode(ResultEnvelopeCodec.decode(readJSON(args.envelope)), \"envelope\");\n const prices = decode(PriceMapCodec.decode(readJSON(args.prices)), \"prices\");\n const report = computeCost(envelope.models, prices);\n process.stdout.write(JSON.stringify(report, null, 2));\n },\n});\n\nconst checkCostCmd = defineCommand({\n meta: {\n name: \"check-cost\",\n description:\n \"Sum real USD spend from a Claude Code transcript tree (main + subagents) against a price map\",\n },\n args: {\n transcript: {\n type: \"positional\",\n description: \"Path to the session transcript JSONL (the hook's transcript_path)\",\n required: true,\n },\n prices: {\n type: \"string\",\n description:\n \"Path to price map JSON (default: bundled schema/prices.example.json — token totals stay real, cost reads as $0)\",\n },\n },\n run: async ({ args }) => {\n const tree = readTranscriptTree(resolve(args.transcript));\n if (tree.missing) {\n process.stderr.write(\n `code-review check-cost: transcript ${args.transcript} is unreadable — reporting zero spend\\n`,\n );\n }\n const usage = sumTranscriptUsage(tree.entries);\n const priceResolution = resolvePrices(args.prices);\n const prices = decode(PriceMapCodec.decode(readJSON(priceResolution.path)), \"prices\");\n const report = computeCost(usage.models, prices);\n process.stdout.write(\n `${JSON.stringify(\n {\n ...report,\n turns: usage.turns,\n durationMs: usage.durationMs,\n transcripts: tree.files,\n pricesProvided: priceResolution.kind === \"provided\",\n },\n null,\n 2,\n )}\\n`,\n );\n },\n});\n\n/** Read + decode a price map, degrading to null (cost axis disabled) on any failure — the budget\n * hook fires on every tool call, so it must never process-exit the way the strict `readJSON` does. */\nconst tryReadPrices = (path: string): PriceMap | null => {\n try {\n const decoded = PriceMapCodec.decode(JSON.parse(readFileSync(resolve(path), \"utf-8\")));\n return decoded._tag === \"Right\" ? decoded.right : null;\n } catch {\n return null;\n }\n};\n\n/** A non-negative, finite dollar amount, or null (absent/unparseable). `0` is kept, not nulled: as a\n * budget it disables the cost axis (decideBudget requires budgetUsd > 0); as a reserve floor it means\n * no flat floor. */\nconst parseBudgetUsd = (raw: string | undefined): number | null => {\n if (raw === undefined) return null;\n const n = Number.parseFloat(raw);\n return Number.isFinite(n) && n >= 0 ? n : null;\n};\n\nconst mtimeMsOf = (path: string): number | null => {\n try {\n return statSync(path).mtimeMs;\n } catch {\n return null;\n }\n};\n\n/** The `transcript_path` a hook payload carries, when present. */\nconst transcriptPathOf = (input: unknown): string | undefined => {\n const tp = (\n typeof input === \"object\" && input !== null ? (input as Record<string, unknown>) : {}\n )[\"transcript_path\"];\n return typeof tp === \"string\" ? tp : undefined;\n};\n\n/** Snapshot the draft to its last-valid sidecar when it passes the same extraction ladder `adapt`\n * will read it back through, so `adapt`'s fallback rung only ever sees a document it accepts.\n * Best-effort — a snapshot miss never perturbs the hook's stdout decision. */\nexport const snapshotIfValid = (draftPath: string): void => {\n try {\n // Validate the LIVE draft only (no agentFileFallbackPath): passing the snapshot as a fallback\n // here would let a valid snapshot rescue an invalid live draft through the ladder, then copy that\n // invalid draft over the good snapshot — corrupting the last-valid state we exist to preserve.\n if (\n extractStructured({ kind: \"findings\", native: undefined, agentFilePath: draftPath }).kind ===\n \"ok\"\n )\n copyFileSync(draftPath, lastValidPath(draftPath));\n } catch (err) {\n process.stderr.write(\n `code-review: could not snapshot the last-valid draft (${errMsg(err)}) — any prior snapshot is unchanged\\n`,\n );\n }\n};\n\nconst budgetHookCmd = defineCommand({\n meta: {\n name: \"budget-hook\",\n description:\n \"Self-dispatching Claude Code budget hook: on PostToolBatch steer the agent to converge as spend/wall-clock nears the budget; on PreToolUse deny budget-burning tools under the hard reserve, gate subagent spawns until the main agent has drafted, and run permitted spawns in the background. Reads the hook payload on stdin; degrades to a no-op on error.\",\n },\n args: {\n draft: {\n type: \"string\",\n description:\n \"Path to the findings draft that is the sole permitted write target under forced convergence\",\n required: true,\n },\n \"budget-usd\": {\n type: \"string\",\n description:\n \"Dollar budget for the run; the cost axis is measured against it (needs --prices)\",\n },\n wall: {\n type: \"string\",\n description: \"Wall-clock budget (e.g. 20m, 1200s, 2h); the time axis is measured against it\",\n },\n prices: {\n type: \"string\",\n description:\n \"Price map JSON to recompute real spend from the transcript (omit to disable the cost axis)\",\n },\n \"reserve-frac\": {\n type: \"string\",\n description:\n \"Base wind-down headroom as a fraction of each budget: converge once less than this remains (default: 0.15; the soft steer tier reserves 2× this)\",\n },\n \"reserve-growth\": {\n type: \"string\",\n description:\n \"How much the reserve grows as a budget is spent — added at full usage, so convergence lands earlier the longer the run has gone (default: 0.25; 0 = flat reserve)\",\n },\n \"reserve-usd\": {\n type: \"string\",\n description:\n \"Flat dollar wind-down floor, whichever is larger with --reserve-frac (default: 0.02)\",\n },\n \"reserve-wall\": {\n type: \"string\",\n description:\n \"Flat wall-clock wind-down floor (e.g. 2m, 120s), whichever is larger with --reserve-frac (default: 2m)\",\n },\n },\n run: async ({ args }) => {\n try {\n const draftPath = resolve(args.draft);\n const input = readStdinJSON();\n const transcriptPath = transcriptPathOf(input);\n const tree = transcriptPath ? readTranscriptTree(resolve(transcriptPath)) : undefined;\n const usage = tree ? sumTranscriptUsage(tree.entries) : undefined;\n const prices = args.prices ? tryReadPrices(args.prices) : null;\n const spentUsd =\n prices !== null && usage ? computeCost(usage.models, prices).totalCostUSD : null;\n // The absolute anchor (set by the review job, inherited by every hook incl. fan-out subagents)\n // is the true remaining wall; the per-transcript first timestamp is only the fallback — it\n // reads ≈0 in a fresh subagent and leaves the fan-out unsteered.\n const wallMs = args.wall ? parseWallMs(args.wall) : null;\n const output = evaluateBudgetHook(input, {\n spentUsd,\n budgetUsd: parseBudgetUsd(args[\"budget-usd\"]),\n elapsedMs: anchoredElapsedMs({\n deadlineMs: parseEpochSecMs(process.env[DEADLINE_ENV]),\n wallMs,\n firstTsMs: usage?.firstTsMs ?? null,\n nowMs: Date.now(),\n }),\n wallMs,\n reserve: {\n frac: parseFraction(args[\"reserve-frac\"], DEFAULT_RESERVE.frac),\n growth: parseFraction(args[\"reserve-growth\"], DEFAULT_RESERVE.growth),\n flatUsd: parseBudgetUsd(args[\"reserve-usd\"]) ?? DEFAULT_RESERVE.flatUsd,\n flatMs: args[\"reserve-wall\"]\n ? (parseWallMs(args[\"reserve-wall\"]) ?? DEFAULT_RESERVE.flatMs)\n : DEFAULT_RESERVE.flatMs,\n },\n draftPath,\n mainDraftWritten: mainHasWrittenDraft(\n mtimeMsOf(draftPath),\n mtimeMsOf(seedMarkerPath(draftPath)),\n ),\n });\n // Only the main agent writes the draft (single-writer), so a subagent batch never introduces a\n // new valid state to preserve — snapshot on the main agent's PostToolBatch only.\n if (asRecord(input)?.[\"hook_event_name\"] === \"PostToolBatch\" && !isSubagentHookInput(input))\n snapshotIfValid(draftPath);\n process.stdout.write(`${JSON.stringify(output)}\\n`);\n } catch (err) {\n process.stderr.write(`code-review budget-hook: degrading to no-op — ${errMsg(err)}\\n`);\n process.stdout.write(\"{}\\n\");\n }\n },\n});\n\nconst printSettingsCmd = defineCommand({\n meta: {\n name: \"print-settings\",\n description:\n \"Emit one Claude Code --settings JSON composing the Stop deliverable gate and the budget hooks (PreToolUse convergence + PostToolBatch steer) from one self-dispatching command\",\n },\n args: {\n draft: {\n type: \"string\",\n description:\n \"Path to the findings draft the agent must produce — the Stop gate's target and the only write allowed under forced convergence\",\n required: true,\n },\n kind: {\n type: \"string\",\n description: \"Schema kind for the Stop gate: findings | triage | prices (default: findings)\",\n },\n schema: {\n type: \"string\",\n description: \"Path to a schema file for the Stop gate (wins over --kind)\",\n },\n \"schema-version\": {\n type: \"string\",\n description: \"Schema major.minor for the Stop gate (default: the draft's declared version)\",\n },\n \"max-nudges\": {\n type: \"string\",\n description: \"Stop-gate nudge budget before relenting (default: 5)\",\n },\n counter: {\n type: \"string\",\n description: \"Path for the Stop-gate nudge counter (default: <draft>.nudges)\",\n },\n \"budget-usd\": {\n type: \"string\",\n description: \"Dollar budget the cost axis is measured against (needs --prices)\",\n },\n wall: {\n type: \"string\",\n description: \"Wall-clock budget the time axis is measured against (e.g. 20m, 1200s)\",\n },\n prices: {\n type: \"string\",\n description: \"Price map JSON to recompute real spend from the transcript\",\n },\n \"reserve-frac\": {\n type: \"string\",\n description:\n \"Base wind-down headroom as a fraction of each budget (default: 0.15; soft tier is 2×)\",\n },\n \"reserve-growth\": {\n type: \"string\",\n description:\n \"How much the reserve grows as a budget is spent, converging earlier the longer the run has gone (default: 0.25; 0 = flat)\",\n },\n \"reserve-usd\": {\n type: \"string\",\n description:\n \"Flat dollar wind-down floor, whichever is larger with --reserve-frac (default: 0.02)\",\n },\n \"reserve-wall\": {\n type: \"string\",\n description:\n \"Flat wall-clock wind-down floor (e.g. 2m), whichever is larger with --reserve-frac (default: 2m)\",\n },\n },\n run: async ({ args }) => {\n if (args.kind && ![\"findings\", \"triage\", \"prices\"].includes(args.kind))\n fail(`--kind must be one of findings|triage|prices (got '${args.kind}')`);\n const settings = composeReviewSettings({\n draftPath: resolve(args.draft),\n stop: {\n kind: args.kind,\n schema: args.schema,\n schemaVersion: args[\"schema-version\"],\n maxNudges: args[\"max-nudges\"],\n counter: args.counter,\n },\n budget: {\n budgetUsd: args[\"budget-usd\"],\n wall: args.wall,\n prices: args.prices,\n reserveFrac: args[\"reserve-frac\"],\n reserveGrowth: args[\"reserve-growth\"],\n reserveUsd: args[\"reserve-usd\"],\n reserveWall: args[\"reserve-wall\"],\n },\n });\n process.stdout.write(`${JSON.stringify(settings)}\\n`);\n },\n});\n\nconst deadlineCmd = defineCommand({\n meta: {\n name: \"deadline\",\n description:\n \"Print the run's absolute deadline as Unix epoch seconds (now + --wall) — exported as CODE_REVIEW_DEADLINE_EPOCH so every budget hook (main and subagents) measures the same remaining wall\",\n },\n args: {\n wall: {\n type: \"string\",\n description:\n \"Wall-clock budget for the run (e.g. 24m, 1200s, 2h) — the deadline is now + this\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const wallMs = parseWallMs(args.wall);\n if (wallMs === null) {\n fail(`--wall must be a duration like 24m, 1200s, or 2h (got '${args.wall}')`);\n } else {\n process.stdout.write(`${String(deadlineEpochSec(wallMs, Date.now()))}\\n`);\n }\n },\n});\n\n/** The version to derive when neither --schema nor --schema-version is given: findings carries its\n * version in-data; triage/prices have no in-data signal (see registry.ts), so undefined selects the\n * registry default (latest) for the kind. */\nconst derivedSchemaVersion = (kind: SchemaKind, raw: unknown): string | undefined =>\n kind === \"findings\" ? declaredVersion(raw) : undefined;\n\n/** A bundled schema rendered for a CLI/agent to read: pretty-printed with the top-level `$schema`\n * draft declaration stripped. `claude -p --json-schema` silently disables enforcement when a schema\n * carries `$schema`, and the field DESCRIPTIONS are the authoritative spec the agent must follow, so\n * this is the form both `print-schema` and `validate --explain` emit. */\nconst printableSchema = (schemaPath: string): string => {\n const schema = JSON.parse(readFileSync(schemaPath, \"utf-8\")) as Record<string, unknown>;\n const enforcementSchema = Object.fromEntries(\n Object.entries(schema).filter(([key]) => key !== \"$schema\"),\n );\n return JSON.stringify(enforcementSchema, null, 2);\n};\n\nconst validateCmd = defineCommand({\n meta: {\n name: \"validate\",\n description: \"Validate a findings/triage/prices JSON document against the canonical schema\",\n },\n args: {\n document: {\n type: \"positional\",\n description: \"Path to the JSON document to validate (of the given --kind)\",\n required: true,\n },\n kind: {\n type: \"string\",\n description:\n \"Schema kind to validate against: findings | triage | prices (default: findings)\",\n },\n schema: {\n type: \"string\",\n description:\n \"Path to a schema file (wins over --kind; default: the bundled schema derived from --kind, --schema-version, the document's declared schema_version, or the bundled latest)\",\n },\n \"schema-version\": {\n type: \"string\",\n description:\n \"Schema major.minor version to validate against (default: the document's declared schema_version for findings, or the kind's latest)\",\n },\n explain: {\n type: \"boolean\",\n description:\n \"On failure, also print the schema after the errors — its field descriptions are the authoritative spec, so the document can be fixed in one pass instead of by trial and error\",\n },\n },\n run: async ({ args }) => {\n const kind = requireSchemaKind(args.kind || \"findings\");\n const documentRaw = readJSON(args.document);\n const schemaPath = args.schema\n ? resolve(args.schema)\n : requireSchemaPath(kind, args[\"schema-version\"] || derivedSchemaVersion(kind, documentRaw));\n const { valid, errors } = validateAgainstSchema(documentRaw, schemaPath);\n if (valid) {\n process.stdout.write(\"✅ valid\\n\");\n } else {\n process.stderr.write(\"❌ invalid\\n\");\n for (const e of errors) process.stderr.write(` - ${e}\\n`);\n if (args.explain) {\n process.stderr.write(\n `\\nThe ${kind} document must conform to this schema (the field descriptions are the authoritative spec — match the property names exactly):\\n${printableSchema(schemaPath)}\\n`,\n );\n }\n process.exit(1);\n }\n },\n});\n\nconst seedDraftCmd = defineCommand({\n meta: {\n name: \"seed-draft\",\n description:\n \"Write a valid findings $DRAFT before the review runs: the decoded findings from a prior review when one exists and still validates (incremental re-review), else an empty-but-valid scaffold — so a valid draft exists from turn 0. Also drops a sidecar marker beside the seed so the budget hook can tell the untouched seed from a draft the agent wrote itself. Prints the mode to stdout (prior-same|prior-new when seeded, by whether the prior review examined this same commit; empty-had-prior when a prior review exists but its findings could not be loaded; empty on a first review; none when even the scaffold write failed) and always exits 0\",\n },\n args: {\n prior: {\n type: \"string\",\n description:\n \"Path to the prior-review JSON gather staged ({ id, body }, or the literal null); its embedded base64 findings marker is decoded and becomes the seed when it validates against the schema\",\n },\n \"head-sha\": {\n type: \"string\",\n description:\n \"Current head SHA, compared against the prior review's embedded reviewed-sha to distinguish a same-commit re-review from a new-commit one; an unknown or mismatched prior SHA is treated as a new commit\",\n },\n out: {\n type: \"string\",\n description: \"Path to write the seed $DRAFT to (an absolute path outside the worktree)\",\n required: true,\n },\n kind: {\n type: \"string\",\n description: \"Schema kind to validate the prior findings against (default: findings)\",\n },\n schema: {\n type: \"string\",\n description: \"Path to a schema file (wins over --kind/--schema-version)\",\n },\n \"schema-version\": {\n type: \"string\",\n description:\n \"Schema major.minor to validate the prior findings against (default: the kind's latest — an older-shaped prior review then falls back to the empty scaffold)\",\n },\n },\n run: async ({ args }) => {\n const outPath = resolve(args.out);\n const kindArg = args.kind || \"findings\";\n const kind: SchemaKind = isSchemaKind(kindArg) ? kindArg : \"findings\";\n if (kind !== kindArg) {\n process.stderr.write(\n `Warning: unknown --kind \"${kindArg}\" — validating against \"findings\"\\n`,\n );\n }\n\n // seed-draft is best-effort and must NEVER fail the review step (the workflow runs it under\n // `set -e`), so every path below either seeds from the prior review or degrades to the\n // empty-but-valid scaffold — none uses the process-exiting require* helpers. The only outcome\n // that skips seeding is a scaffold write that itself throws (e.g. a bad --out directory), which\n // is warned and still exits 0: the agent then writes $DRAFT itself, exactly as before seeding.\n\n // The sidecar marker, written right AFTER the seed so its mtime bounds the seed's: the budget\n // hook treats the draft as agent-written only once its mtime passes the marker's. Only the\n // marker's mtime is ever consumed (budget.ts mainHasWrittenDraft never reads its content), so a\n // one-line sentinel suffices. Best-effort like the seed itself — without the marker the fan-out\n // gate just accepts any existing draft.\n const writeSeedMarker = (): void => {\n try {\n writeFileSync(seedMarkerPath(outPath), \"code-review seed marker\\n\");\n } catch (err) {\n process.stderr.write(\n `Warning: could not write the seed marker beside ${outPath} (${errMsg(err)}) — the seeded draft will count as agent-written\\n`,\n );\n }\n };\n\n const writeScaffold = (): boolean => {\n try {\n writeFileSync(outPath, `${JSON.stringify(noticeFindings(\"\"), null, 2)}\\n`);\n writeSeedMarker();\n process.stderr.write(\n `Seeded ${outPath} with an empty valid scaffold — no decodable prior findings to build on\\n`,\n );\n return true;\n } catch (err) {\n process.stderr.write(\n `Warning: could not write the seed scaffold to ${outPath} (${errMsg(err)}) — the agent will create $DRAFT itself\\n`,\n );\n return false;\n }\n };\n\n // The whole prior comment body gather staged, tolerating a missing/absent/\"null\"/malformed\n // file: it carries both the embedded findings (seeded below when they still validate) and the\n // reviewed-sha that distinguishes a same-commit re-review from a new-commit one.\n const priorBody = ((): string | null => {\n if (!args.prior) return null;\n const raw = ((): unknown => {\n try {\n return JSON.parse(readFileSync(resolve(args.prior), \"utf-8\")) as unknown;\n } catch {\n return null;\n }\n })();\n return typeof raw === \"object\" &&\n raw !== null &&\n \"body\" in raw &&\n typeof raw.body === \"string\"\n ? raw.body\n : null;\n })();\n const priorFindings = priorBody === null ? null : parseFindingsMarker(priorBody);\n\n // Validate + write WITHOUT the process-exiting require* helpers: any failure (bad\n // --schema-version, unreadable schema, non-matching shape, unwritable $DRAFT) degrades to the\n // scaffold so the always-exit-0 contract holds.\n const seededFromPrior =\n priorFindings === null\n ? false\n : ((): boolean => {\n try {\n const schemaPath = args.schema\n ? resolve(args.schema)\n : schemaPathFor(kind, args[\"schema-version\"]);\n if (!validateAgainstSchema(priorFindings, schemaPath).valid) return false;\n writeFileSync(outPath, `${JSON.stringify(priorFindings, null, 2)}\\n`);\n writeSeedMarker();\n const priorList = (priorFindings as { readonly findings?: unknown }).findings;\n const count = Array.isArray(priorList) ? priorList.length : 0;\n process.stderr.write(\n `Seeded ${outPath} from the prior review (${String(count)} finding(s))\\n`,\n );\n return true;\n } catch (err) {\n process.stderr.write(\n `Warning: could not seed from the prior review (${errMsg(err)}) — falling back to the empty scaffold\\n`,\n );\n return false;\n }\n })();\n\n // prior-same/prior-new split on whether the seeded review examined this exact commit; an unknown\n // prior SHA (older comment, or the all-zeros placeholder) falls to prior-new so the agent\n // re-checks against the current diff rather than assuming the code is unchanged. When nothing\n // could be seeded, empty-had-prior still tells the agent a prior review exists (vs a true first\n // review), and none marks even the scaffold write failing.\n const mode = ((): string => {\n if (seededFromPrior) {\n const priorSha = priorBody === null ? null : parseReviewedSha(priorBody);\n return args[\"head-sha\"] && priorSha && priorSha === args[\"head-sha\"].toLowerCase()\n ? \"prior-same\"\n : \"prior-new\";\n }\n if (!writeScaffold()) return \"none\";\n return priorBody === null ? \"empty\" : \"empty-had-prior\";\n })();\n process.stdout.write(`${mode}\\n`);\n },\n});\n\nconst adaptCmd = defineCommand({\n meta: {\n name: \"adapt\",\n description: \"Map a native agent-CLI result envelope onto the abstract SPEC envelope\",\n },\n args: {\n native: {\n type: \"positional\",\n description: \"Path to the native result envelope JSON (from the agent CLI)\",\n required: true,\n },\n adapter: {\n type: \"string\",\n description: 'Adapter to use (currently: \"claude-code\")',\n required: true,\n },\n \"agent-file\": {\n type: \"string\",\n description:\n \"Path to a file the agent was told to write its own validated findings JSON to (wins over the native envelope's structured_output/result when it validates)\",\n },\n \"agent-file-fallback\": {\n type: \"string\",\n description:\n \"Path to the last-valid findings snapshot, tried after --agent-file and before the native envelope; recovers the last valid state when a wall-clock kill left --agent-file truncated, so the review posts that instead of a 'did not complete' notice\",\n },\n route: {\n type: \"string\",\n description:\n 'Review route label to stamp into the envelope (e.g. \"full review\" or \"mechanic\")',\n },\n effort: {\n type: \"string\",\n description: 'Effort label to stamp into the envelope (e.g. \"max\" or \"low\")',\n },\n transcript: {\n type: \"string\",\n description:\n \"Path to the session transcript (main .jsonl). Its tree (main + subagents) gives the true wall + turn count the native envelope under-reports, and refills per-model usage when the native envelope is empty (e.g. after a wall-clock kill)\",\n },\n },\n run: async ({ args }) => {\n const envelope = unwrapAdapt(\n adapt(requireAdapterName(args.adapter), readJSONOrAbsent(args.native), args[\"agent-file\"], {\n route: args.route,\n effort: args.effort,\n agentFileFallbackPath: args[\"agent-file-fallback\"],\n ...(args.transcript\n ? {\n transcriptFallback: (): TranscriptTelemetry =>\n transcriptFallbackFrom(args.transcript),\n }\n : {}),\n }),\n );\n process.stdout.write(`${JSON.stringify(envelope, null, 2)}\\n`);\n },\n});\n\nconst isExtractSchemaKind = (s: string): s is ExtractKind => s === \"findings\" || s === \"triage\";\n\n// no \"prices\" — unlike print-schema's kinds.\nconst requireExtractSchemaKind = (name: string): ExtractKind =>\n isExtractSchemaKind(name)\n ? name\n : fail(`Unknown kind \"${name}\" for extract — expected one of: findings, triage`);\n\n/** Fail-closed triage synthesized when the ladder can't recover a validated triage verdict — never\n * defaults to safe. */\nconst failClosedTriage = (outcome: Exclude<LadderOutcome, { kind: \"ok\" }>): Triage => ({\n safe: false,\n reasons: describeLadderFailure(outcome),\n});\n\nconst extractCmd = defineCommand({\n meta: {\n name: \"extract\",\n description:\n \"Recover findings/triage JSON from a native agent-CLI result envelope via the deterministic extraction ladder\",\n },\n args: {\n native: {\n type: \"positional\",\n description: \"Path to the native result envelope JSON (from the agent CLI)\",\n required: true,\n },\n adapter: {\n type: \"string\",\n description: 'Adapter whose native envelope shape to extract from (currently: \"claude-code\")',\n required: true,\n },\n kind: {\n type: \"string\",\n description: \"Schema kind to extract: findings | triage\",\n required: true,\n },\n \"agent-file\": {\n type: \"string\",\n description:\n \"Path to a file the agent was told to write its own validated JSON to (findings only — a documented no-op for triage)\",\n },\n },\n run: async ({ args }) => {\n requireAdapterName(args.adapter);\n const kind = requireExtractSchemaKind(args.kind);\n const input = { kind, native: readJSON(args.native), agentFilePath: args[\"agent-file\"] };\n const outcome = extractStructured(input);\n\n if (outcome.kind === \"ok\") {\n process.stdout.write(`${JSON.stringify(outcome.candidate, null, 2)}\\n`);\n return;\n }\n // A recovery miss is otherwise opaque (only the generic reason reaches the comment); trace what\n // each rung saw to stderr so the CI log alone explains the failure — no local repro needed.\n if (outcome.kind === \"none\" || outcome.kind === \"ambiguous\") {\n process.stderr.write(`extract: recovery failed —\\n${ladderFailureDiagnostics(input)}\\n`);\n }\n if (kind === \"triage\") {\n process.stdout.write(`${JSON.stringify(failClosedTriage(outcome), null, 2)}\\n`);\n return;\n }\n fail(describeLadderFailure(outcome));\n },\n});\n\nconst withoutPatch = (finding: Finding): Finding => {\n const copy = { ...finding };\n delete copy.patch;\n return copy;\n};\n\nconst readFileLines = (path: string): readonly string[] | null => {\n try {\n const rawLines = readFileSync(path, \"utf-8\").split(\"\\n\");\n return rawLines.length > 0 && rawLines[rawLines.length - 1] === \"\"\n ? rawLines.slice(0, -1)\n : rawLines;\n } catch {\n return null;\n }\n};\n\n/** Align/keep/drop one finding's `patch` against the real file at `<repoRoot>/<finding.path>`:\n * aligned to the patch's removed range, kept as-is for a pure insertion, or dropped (logged) when\n * the file can't be read or the patch doesn't apply. Never throws; a no-patch finding passes through. */\nconst validateFinding = (finding: Finding, repoRoot: string): Finding => {\n if (finding.patch === undefined) return finding;\n const lines = readFileLines(resolve(repoRoot, finding.path));\n if (lines === null) {\n process.stderr.write(\n `validate-patches: ${finding.path}: could not read file at \"${repoRoot}\" — dropping patch\\n`,\n );\n return withoutPatch(finding);\n }\n const result = validatePatch(finding.patch, lines);\n switch (result.kind) {\n case \"anchored\":\n return { ...finding, start_line: result.startLine, end_line: result.endLine };\n case \"keep\":\n // Applies cleanly but has no removed range to anchor a suggestion — leave the finding's own\n // start_line/end_line as the inline anchor; the renderer projects the patch to a ```patch block.\n return finding;\n case \"drop\":\n process.stderr.write(\n `validate-patches: ${finding.path}:${String(finding.start_line)}: ${result.reason} — dropping patch\\n`,\n );\n return withoutPatch(finding);\n }\n};\n\nconst validatePatchesCmd = defineCommand({\n meta: {\n name: \"validate-patches\",\n description:\n \"Validate each finding's patch against the real PR-head tree: align the finding's range and keep the patch when it anchors, keep it unaligned for a pure insertion, or drop it when it doesn't apply\",\n },\n args: {\n findings: {\n type: \"positional\",\n description: \"Path to findings JSON\",\n required: true,\n },\n \"repo-root\": {\n type: \"string\",\n description:\n \"Directory to resolve each finding's path against — the review job's checked-out, clean PR-head tree (default: .)\",\n },\n },\n run: async ({ args }) => {\n const findings = decode(FindingsCodec.decode(readJSON(args.findings)), \"findings\");\n const repoRoot = args[\"repo-root\"] ? resolve(args[\"repo-root\"]) : process.cwd();\n const validated = {\n ...findings,\n findings: findings.findings.map((f) => validateFinding(f, repoRoot)),\n };\n process.stdout.write(`${JSON.stringify(validated, null, 2)}\\n`);\n },\n});\n\nconst requireAdapterName = (name: string): AdapterName =>\n isAdapterName(name) ? name : fail(`Unknown adapter \"${name}\" — supported: claude-code`);\n\nconst isSchemaKind = (s: string): s is SchemaKind =>\n s === \"findings\" || s === \"triage\" || s === \"prices\";\n\nconst requireSchemaKind = (name: string): SchemaKind =>\n isSchemaKind(name)\n ? name\n : fail(`Unknown schema \"${name}\" — expected one of: findings, triage, prices`);\n\nconst requireSchemaPath = (kind: SchemaKind, version: string | undefined): string => {\n try {\n return schemaPathFor(kind, version);\n } catch (err) {\n return fail(errMsg(err));\n }\n};\n\nconst printSchemaCmd = defineCommand({\n meta: {\n name: \"print-schema\",\n description:\n \"Print a bundled schema JSON, ready to hand to a CLI's --json-schema (the $schema draft declaration is stripped)\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Schema to print: findings | triage | prices\",\n required: true,\n },\n \"schema-version\": {\n type: \"string\",\n description: \"Schema major.minor version to print (default: latest)\",\n },\n },\n run: async ({ args }) => {\n const schemaKind = requireSchemaKind(args.name);\n const schemaPath = requireSchemaPath(schemaKind, args[\"schema-version\"]);\n process.stdout.write(`${printableSchema(schemaPath)}\\n`);\n },\n});\n\nconst MAX_NUDGES_DEFAULT = 5;\n\n/** Drain the Stop-hook payload on stdin so the caller never sees EPIPE; its content is unused (the\n * decision comes from the draft on disk). Skips on a TTY, where readFileSync(0) would block forever\n * waiting for an EOF that never comes; the real Stop hook writes then closes, so a held-open pipe\n * isn't the production path. */\nconst drainStdin = (): void => {\n if (process.stdin.isTTY) return;\n try {\n readFileSync(0);\n } catch {\n // no stdin\n }\n};\n\n/** Parse `--max-nudges`: a strict positive integer (`>= 1`). A loose `Number.parseInt` accepts\n * `\"5abc\"`/`\"0x5\"` and `0 >= 0` allows on the first call — both silently DISABLE the gate. Reject\n * anything not matching `^\\d+$`, and reject `< 1`, loudly: a gate that never blocks must be an\n * explicit choice (omit the hook), never a typo. */\nconst requireMaxNudges = (raw: string | undefined): number => {\n if (raw === undefined) return MAX_NUDGES_DEFAULT;\n if (!/^\\d+$/.test(raw)) {\n fail(`--max-nudges must be a non-negative integer; got \"${raw}\"`);\n }\n const n = Number.parseInt(raw, 10);\n if (n < 1) {\n fail(`--max-nudges must be >= 1 — a gate that never blocks must be omitted, not set to ${raw}`);\n }\n return n;\n};\n\nconst stopGateCmd = defineCommand({\n meta: {\n name: \"stop-gate\",\n description:\n \"Claude Code Stop-hook gate: refuse to let the agent end its turn until --draft validates against the schema (bounded by --max-nudges). With --print-settings, emit the --settings JSON that wires this as the Stop hook.\",\n },\n args: {\n draft: {\n type: \"string\",\n description: \"Path to the findings document the agent must produce and keep valid\",\n required: true,\n },\n kind: {\n type: \"string\",\n description:\n \"Schema kind to validate against: findings | triage | prices (default: findings)\",\n },\n schema: { type: \"string\", description: \"Path to a schema file (wins over --kind)\" },\n \"schema-version\": {\n type: \"string\",\n description: \"Schema major.minor to validate against (default: the draft's declared version)\",\n },\n \"max-nudges\": {\n type: \"string\",\n description: `Times to block before relenting so the step fails downstream as before (default: ${String(MAX_NUDGES_DEFAULT)})`,\n },\n counter: {\n type: \"string\",\n description: \"Path for the nudge counter (default: <draft>.nudges)\",\n },\n \"print-settings\": {\n type: \"boolean\",\n description: \"Print the Stop-hook settings JSON that wires this gate, then exit\",\n },\n },\n run: async ({ args }) => {\n const draftPath = resolve(args.draft);\n\n if (args[\"print-settings\"]) {\n const command = defaultHookCommand(draftPath, {\n kind: args.kind,\n schema: args.schema,\n schemaVersion: args[\"schema-version\"],\n maxNudges: args[\"max-nudges\"],\n counter: args.counter,\n });\n process.stdout.write(`${JSON.stringify(stopHookSettings(command))}\\n`);\n return;\n }\n\n drainStdin();\n\n const kind = requireSchemaKind(args.kind || \"findings\");\n const maxNudges = requireMaxNudges(args[\"max-nudges\"]);\n const counterPath = args.counter ? resolve(args.counter) : `${draftPath}.nudges`;\n\n // schemaPathFor throws (rather than the process-exiting requireSchemaPath) so that a draft\n // declaring an unsupported schema_version is caught by draftState and treated as invalid —\n // i.e. a block with a helpful message — instead of crashing the hook and letting the agent stop.\n const state = draftState(draftPath, (parsed) =>\n args.schema\n ? resolve(args.schema)\n : schemaPathFor(kind, args[\"schema-version\"] || derivedSchemaVersion(kind, parsed)),\n );\n\n const nudges = readNudges(counterPath);\n const decision = decideGate(state, nudges, maxNudges, draftPath, kind);\n if (decision.kind === \"block\") {\n // CRITICAL ordering: bump the counter FIRST, and emit the block ONLY after the increment is\n // durably persisted. If the write fails, do NOT block — a block we can't bound loops forever\n // (the counter never advances → `nudges >= maxNudges` is never reached). Allow the stop and\n // log: a missed nudge is far less bad than an unbounded block loop.\n try {\n bumpNudges(counterPath, nudges);\n } catch (err) {\n process.stderr.write(\n `stop-gate: cannot persist nudge counter at ${counterPath} → allowing to avoid an unbounded block loop: ${errMsg(err)}\\n`,\n );\n return;\n }\n process.stdout.write(`${JSON.stringify({ decision: \"block\", reason: decision.reason })}\\n`);\n }\n },\n});\n\nconst gatherCmd = defineCommand({\n meta: {\n name: \"gather\",\n description:\n \"Resolve the PR from the CI head SHA and gather review inputs (diff with git-diff fallback, PR context, prior bot review, failing-job logs) as files for the review agent\",\n },\n args: {\n repo: { type: \"string\", description: \"Repository (owner/name)\", required: true },\n \"head-sha\": {\n type: \"string\",\n description: \"Trusted head SHA to resolve the PR (from workflow_run.head_sha)\",\n required: true,\n },\n \"head-branch\": {\n type: \"string\",\n description: \"Head branch to disambiguate the PR when multiple share a commit\",\n },\n \"run-id\": {\n type: \"string\",\n description:\n \"CI run id (from workflow_run.id); its failing jobs' logs are downloaded on failure\",\n required: true,\n },\n conclusion: {\n type: \"string\",\n description:\n \"CI conclusion (e.g. success | failure); failure triggers failing-job log download\",\n required: true,\n },\n \"bot-login\": {\n type: \"string\",\n description:\n \"Bot login whose last PR comment is captured as prior review (default: github-actions[bot])\",\n },\n \"out-dir\": {\n type: \"string\",\n description: \"Directory to write gathered files into (default: current directory)\",\n },\n },\n run: async ({ args }) => {\n const result = await gather({\n repo: args.repo,\n headSha: args[\"head-sha\"],\n headBranch: args[\"head-branch\"],\n runId: args[\"run-id\"],\n conclusion: args.conclusion,\n botLogin: args[\"bot-login\"] || \"github-actions[bot]\",\n outDir: args[\"out-dir\"] ? resolve(args[\"out-dir\"]) : process.cwd(),\n });\n process.stdout.write(renderOutputs(result));\n },\n});\n\nconst postCmd = defineCommand({\n meta: {\n name: \"post\",\n description:\n \"Post a complete review (inline comments + sticky summary) from findings + envelope + diff\",\n },\n args: {\n findings: {\n type: \"positional\",\n description: \"Path to findings JSON\",\n required: true,\n },\n \"head-sha\": {\n type: \"string\",\n description: \"Trusted head SHA to resolve the PR (from workflow_run.head_sha)\",\n required: true,\n },\n repo: {\n type: \"string\",\n description: \"Repository (owner/name)\",\n required: true,\n },\n usage: {\n type: \"string\",\n description: \"Path to result envelope JSON (from agent CLI)\",\n required: true,\n },\n prices: {\n type: \"string\",\n description:\n \"Path to price map JSON (default: bundled schema/prices.example.json — all zero)\",\n },\n template: {\n type: \"string\",\n description:\n \"Path to Eta template file for the summary comment (default: bundled templates/comment.eta)\",\n },\n \"inline-template\": {\n type: \"string\",\n description: \"Path to inline comment Eta template (default: bundled templates/inline.eta)\",\n },\n route: {\n type: \"string\",\n description:\n \"Review route label; overrides the envelope's route when set (default: read from the envelope)\",\n },\n \"bot-login\": {\n type: \"string\",\n description: \"Bot login to trust for sticky comment upsert (default: github-actions[bot])\",\n },\n \"head-branch\": {\n type: \"string\",\n description: \"Head branch to disambiguate PR when multiple share a commit\",\n },\n effort: {\n type: \"string\",\n description:\n \"Effort label; overrides the envelope's effort when set (default: read from the envelope)\",\n },\n \"test-report\": {\n type: \"string\",\n description: TEST_REPORT_DESCRIPTION,\n },\n \"run-url\": {\n type: \"string\",\n description:\n \"Workflow run URL (transcript/traces), rendered as a link in the LLM Disclosure aside\",\n },\n \"json-url\": {\n type: \"string\",\n description:\n \"URL to the machine-readable findings JSON artifact, pointed at from the sticky and each inline comment\",\n },\n },\n run: async ({ args }) => {\n const priceResolution = resolvePrices(args.prices);\n await post({\n repo: args.repo,\n headSha: args[\"head-sha\"],\n botLogin: args[\"bot-login\"] || \"github-actions[bot]\",\n findingsPath: args.findings,\n envelopePath: args.usage,\n pricesPath: priceResolution.path,\n pricesProvided: priceResolution.kind === \"provided\",\n templatePath: resolveTemplatePath(args.template),\n inlineTemplatePath: resolveInlineTemplatePath(args[\"inline-template\"]),\n route: args.route,\n headBranch: args[\"head-branch\"],\n effort: args.effort,\n testReportPath: args[\"test-report\"],\n runUrl: args[\"run-url\"],\n jsonUrl: args[\"json-url\"],\n postedAt: formatUtc(new Date()),\n });\n },\n});\n\nexport const main = defineCommand({\n meta: {\n name: \"code-review\",\n version: packageVersion,\n description: \"Deterministic commenter for agentic PR review\",\n },\n subCommands: {\n gather: gatherCmd,\n render: renderCmd,\n inline: inlineCmd,\n post: postCmd,\n cost: costCmd,\n \"check-cost\": checkCostCmd,\n validate: validateCmd,\n \"seed-draft\": seedDraftCmd,\n adapt: adaptCmd,\n extract: extractCmd,\n \"validate-patches\": validatePatchesCmd,\n \"print-schema\": printSchemaCmd,\n \"stop-gate\": stopGateCmd,\n \"budget-hook\": budgetHookCmd,\n \"print-settings\": printSettingsCmd,\n deadline: deadlineCmd,\n },\n});\n\n// Skip auto-invocation under the test runner — tests drive `main` directly via citty's runCommand.\nif (!process.env[\"VITEST\"]) {\n await runMain(main);\n}\n"]}
|