@jphutchins/code-review 0.1.0-alpha.37 → 0.1.0-alpha.39

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schema.ts","../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/validate.ts","../src/stop-gate.ts","../src/budget.ts","../src/format.ts","../src/notice.ts","../src/registry.ts","../src/exec.ts","../src/gh.ts","../src/pr.ts","../src/post.ts","../src/checkrun.ts","../src/command.ts","../src/react.ts","../src/ci.ts","../src/gather.ts","../src/extract.ts","../src/adapt.ts","../src/settings.ts","../src/sandbox.ts","../src/index.ts"],"names":["Eta","key","t","readFileSync","basename","join","dirname","latest","resolvePath","resolve","reviewUrl","unanchoredCount","t2","t3","t4","t5","writeFileSync","scanLine","t6","output"],"mappings":"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","file":"index.js","sourcesContent":["// 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([\n t.literal(\"approve\"),\n t.literal(\"comment\"),\n t.literal(\"changes\"),\n t.literal(\"error\"),\n]);\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 // The run produced a notice rather than a completed review (security-gate block, agent kill, no\n // recoverable findings). An empty `findings` array alone can't say this — a genuine clean review\n // is also empty — so the render suppresses \"clean review\" and the sticky precedence guard refuses\n // to bury a completed review under it. Absent ⇒ a completed review.\n incomplete: t.boolean,\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.5.0\";\n\nexport type Finding = t.TypeOf<typeof FindingCodec>;\nexport type Findings = t.TypeOf<typeof FindingsCodec>;\nexport type Verdict = t.TypeOf<typeof VerdictCodec>;\n\n// The initial $DRAFT scaffold: an empty, neutral findings doc the review agent is told to fill in. It\n// carries \"comment\" (never the pipeline-only \"error\"), so an agent that populates it and forgets to\n// touch the verdict still ships a valid review. A dead-agent recovery of this untouched scaffold is\n// caught by `adapt`'s seed-marker check, not by its verdict — so the verdict stays a plain template.\nexport const emptyFindings = (summary: string): Findings => ({\n schema_version: DEFAULT_SCHEMA_VERSION,\n summary,\n verdict: \"comment\",\n findings: [],\n});\n\n// The findings shape for a run that produced no code-review verdict — an operational failure, a\n// security refusal, or an empty diff with nothing to review. `verdict: \"error\"` is the machine-readable\n// signal that the blob a consumer decodes is NOT a clean pass (verdict \"comment\", findings []), so an\n// agent following the decode-the-JSON contract cannot mistake \"no verdict was produced\" for \"nothing\n// found\". A completed review carries approve/comment/changes.\nexport const incompleteFindings = (summary: string): Findings => ({\n schema_version: DEFAULT_SCHEMA_VERSION,\n summary,\n verdict: \"error\",\n findings: [],\n});\n\n// The one predicate for \"this findings doc is a no-verdict notice, not a completed review\", shared by\n// render and the sticky-precedence guard so the rule lives in a single place. Requires an EMPTY\n// findings array: a doc that carries real findings is a real review whatever its verdict says, so a\n// spurious \"error\" verdict alongside findings can never silently suppress them.\nexport const isIncompleteFindings = (findings: Findings): boolean =>\n findings.verdict === \"error\" && findings.findings.length === 0;\nexport type Triage = t.TypeOf<typeof TriageCodec>;\nexport type Severity = t.TypeOf<typeof SeverityCodec>;\nexport type Side = t.TypeOf<typeof SideCodec>;\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","// 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 type { SeverityCounts } from \"./types.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\n// Decode a base64-in-HTML-comment marker payload, shared by the findings + rounds markers; undefined\n// on any malformed input so callers degrade rather than throw on the render path.\nconst decodeBase64Json = (b64: string): unknown => {\n try {\n return JSON.parse(Buffer.from(b64, \"base64\").toString(\"utf-8\"));\n } catch {\n return undefined;\n }\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// A POSITIVE marker: present only in a sticky the commenter wrote for a COMPLETED review. It is\n// absent from an incomplete notice AND from an in-progress placeholder (which carries forward a prior\n// review's reviewed-sha yet is not itself a completed review) — so a precedence check can tell those\n// apart, which reviewed-sha alone (stamped on notices too) cannot. Re-emitted by the template each\n// write from the render's `incomplete` flag, never carried forward.\nexport const REVIEW_COMPLETE_MARKER = \"<!-- review-complete -->\";\nexport const parseReviewComplete = (body: string): boolean => body.includes(REVIEW_COMPLETE_MARKER);\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 b64 = /<!-- code-review:findings-json;base64 ([A-Za-z0-9+/=]+) -->/.exec(body)?.[1];\n if (b64 === undefined) return null;\n return decodeBase64Json(b64) ?? null;\n};\n\n// Per-full-review-round severity counts, carried in a base64 marker so each completed full review\n// appends its own and the sticky renders the convergence trajectory. A CI-fix mechanic pass carries it\n// forward unchanged (it is not a review round). Best-effort like the findings marker: any\n// non-conforming shape decodes to no history rather than throwing on this render path.\nconst ROUNDS_RE = /<!-- code-review:rounds;base64 ([A-Za-z0-9+/=]+) -->/;\n\n// Non-negative integers only: a crafted/corrupted marker with a negative count would render as a\n// false \"clean\" chip (filtered by `> 0`), and a fractional/huge one as a garbage chip. Rejecting them\n// here drops the bad round instead of carrying it forward on every re-serialize.\nconst isSeverityCounts = (u: unknown): u is SeverityCounts =>\n typeof u === \"object\" &&\n u !== null &&\n ([\"critical\", \"major\", \"minor\", \"nit\"] as const).every((k) => {\n const v = (u as Record<string, unknown>)[k];\n // isSafeInteger (not isInteger): a huge integer-valued float like 1e308 is an integer per\n // Number.isInteger, and would render a garbage `🔴1e+308` chip and re-serialize forward.\n return typeof v === \"number\" && Number.isSafeInteger(v) && v >= 0;\n });\n\nexport const parseRounds = (body: string): readonly SeverityCounts[] => {\n const b64 = ROUNDS_RE.exec(body)?.[1];\n if (b64 === undefined) return [];\n const decoded = decodeBase64Json(b64);\n // Filter, not all-or-nothing: one future-shaped or corrupted round drops only itself rather than\n // erasing the whole trajectory (post re-serializes the parsed array on every write).\n return Array.isArray(decoded) ? decoded.filter(isSeverityCounts) : [];\n};\n\nexport const roundsMarker = (rounds: readonly SeverityCounts[]): string =>\n rounds.length === 0\n ? \"\"\n : `<!-- code-review:rounds;base64 ${Buffer.from(JSON.stringify(rounds), \"utf-8\").toString(\"base64\")} -->`;\n\n// One round's chip: \"🔴4 🟠3\" for findings, \"clean\" for none.\nconst roundChip = (c: SeverityCounts): string => {\n const parts = ([\"critical\", \"major\", \"minor\", \"nit\"] as const)\n .filter((k) => c[k] > 0)\n .map((k) => `${severityEmoji(k)}${String(c[k])}`);\n return parts.length === 0 ? \"clean\" : parts.join(\" \");\n};\n\n// The convergence line: \"**Round 3** · 🔴4 🟠3 → 🟠2 → clean\"; \"\" when there is no round history. The\n// round number is always the true count; the trajectory shows only the most recent chips (with a\n// leading \"…\" when older ones are elided) so a long-running PR's line stays readable and bounded.\nconst TRAJECTORY_CHIPS = 8;\nexport const roundsSummary = (rounds: readonly SeverityCounts[]): string => {\n if (rounds.length === 0) return \"\";\n const chips = rounds.slice(-TRAJECTORY_CHIPS).map(roundChip);\n const trajectory =\n rounds.length > TRAJECTORY_CHIPS ? `… → ${chips.join(\" → \")}` : chips.join(\" → \");\n return `**Round ${String(rounds.length)}** · ${trajectory}`;\n};\n\n// The machine-readable markers to carry forward when a comment's PROSE is replaced but its data must\n// survive — the \"review in progress\" placeholder swaps the visible summary yet must not clobber the\n// re-review seed the review job reads back from the sticky (the embedded findings + reviewed-sha), nor\n// the round-history trajectory. The findings marker is extracted verbatim so both its base64 and\n// jsonUrl-link forms survive; base64 (A–Z a–z 0–9 + / =) and URLs never contain '>', so `[^>]*` stops\n// at its closing `-->`. The STOP directive that always precedes it is re-emitted from\n// AGENTS_STOP_DIRECTIVE (its SSOT above) rather than re-matched, so a future edit to that constant\n// can't silently desync a parallel regex. Returns \"\" when the body carries none of them.\nexport const carryForwardMarkers = (body: string): string => {\n const findings = /<!-- code-review:findings-json[^>]*-->/.exec(body)?.[0];\n const reviewedSha = /<!-- reviewed-sha: [0-9a-fA-F]{40} -->/.exec(body)?.[0];\n const rounds = ROUNDS_RE.exec(body)?.[0];\n const findingsBlock = findings ? `${AGENTS_STOP_DIRECTIVE}\\n${findings}` : undefined;\n return [findingsBlock, reviewedSha, rounds]\n .filter((m): m is string => m !== undefined)\n .join(\"\\n\\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 { isIncompleteFindings } from \"./schema.js\";\nimport type { RenderInput, SeverityCounts } from \"./types.js\";\nimport { computeCost } from \"./cost.js\";\nimport {\n severityEmoji,\n findingsPointer,\n projectPatch,\n formatConfidence,\n roundsMarker,\n roundsSummary,\n} 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 // The meta line prints turns/cost only when there is real usage to print — a present-but-zeroed\n // envelope (the synthesized notice wrap: no models) would otherwise show a false \"$0.00 · turns 0\".\n const hasUsage = input.envelope !== null && input.envelope.models.length > 0;\n // Enforce the invariant here, not just at the producers: a no-verdict notice (isIncompleteFindings)\n // is ALWAYS incomplete however it reached render (an envelope-less notice, a recovered draft), so it\n // never renders \"clean review\" or the review-complete marker.\n const incomplete =\n (input.incomplete ?? input.envelope?.incomplete ?? false) ||\n isIncompleteFindings(input.findings);\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 hasUsage,\n incomplete,\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 roundsMarker: roundsMarker(input.rounds ?? []),\n roundsSummary: roundsSummary(input.rounds ?? []),\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 case \"error\":\n return \"🛠️ no review verdict\";\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\n// A GitHub Actions workflow command (`::warning::…`) is single-line: a CR/LF in the message ends the\n// annotation early, and a following `::…::` in the remainder would be parsed as another command.\n// Collapse line breaks so an untrusted interpolation (e.g. `gh` stderr) can't break out of one.\nexport const annotationSafe = (msg: string): string => msg.replaceAll(/[\\r\\n]+/g, \" \");\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","// 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\n// Each axis carries its own absolute hardReserve, grown with usage so convergence lands earlier the\n// longer the run has gone. axisSeverity then only compares remaining headroom to that reserve.\ninterface Axis {\n readonly used: number;\n readonly limit: number;\n readonly hardReserve: number;\n}\n\nconst growingReserve = (used: number, limit: number, flat: number, r: ReserveParams): number => {\n const usedFrac = Math.min(1, Math.max(0, used / limit));\n return Math.max(flat, (r.frac + r.growth * usedFrac) * limit);\n};\n\nconst costAxis = (i: BudgetInputs): Axis | null =>\n i.spentUsd !== null && i.budgetUsd !== null && i.budgetUsd > 0\n ? {\n used: i.spentUsd,\n limit: i.budgetUsd,\n hardReserve: growingReserve(i.spentUsd, i.budgetUsd, i.reserve.flatUsd, i.reserve),\n }\n : null;\n\nconst timeAxis = (i: BudgetInputs): Axis | null =>\n i.elapsedMs !== null && i.wallMs !== null && i.wallMs > 0\n ? {\n used: i.elapsedMs,\n limit: i.wallMs,\n hardReserve: growingReserve(i.elapsedMs, i.wallMs, i.reserve.flatMs, i.reserve),\n }\n : null;\n\nconst axisSeverity = (a: Axis): 0 | 1 | 2 => {\n const remaining = a.limit - a.used;\n if (remaining <= a.hardReserve) return 2;\n if (remaining <= SOFT_MULTIPLE * a.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)) 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","// The notices the review workflow synthesizes when there is no completed review to post: a security\n// block (triage returned a genuine unsafe verdict), a triage that could not evaluate (an operational\n// failure, not a verdict about the diff), a setup failure before triage could run, a PR head that\n// would not check out, or a run that passed triage but emitted nothing. Their messages and the\n// \"incomplete\" envelope shape live here — one typed SSOT — rather than as jq object literals spread\n// across the workflow YAML, so the commenter renders every one honestly (no false \"clean\n// review\"/\"$0.00\", and an operational failure never reads as a security verdict about the diff) and\n// the sticky precedence guard treats them as non-completing.\n\nimport { DEFAULT_SCHEMA_VERSION, incompleteFindings } from \"./schema.js\";\nimport type { ResultEnvelope } from \"./schema.js\";\n\n// One list is the source of truth for the kind union, its runtime guard, and the CLI's kind listing,\n// so adding a kind is a single edit rather than five that can drift out of sync.\nexport const NOTICE_KINDS = [\n \"security-blocked\",\n \"triage-error\",\n \"setup-failed\",\n \"checkout-failed\",\n \"no-output\",\n] as const;\n\nexport type NoticeKind = (typeof NOTICE_KINDS)[number];\n\nexport const isNoticeKind = (s: string): s is NoticeKind => NOTICE_KINDS.some((k) => k === s);\n\n// A host is safe to name in the raw-rendered, grep-scanned summary only if it can neither break out of\n// its backtick code span (`) nor forge a comment marker (<, >) nor start a new line (\\n, \\r) or table\n// cell (|). This is a render-safety denylist, NOT a hostname grammar: it keeps legitimate but unusual\n// hosts (bracketed IPv6, IDN) a strict pattern would wrongly drop, while still neutralizing a tampered\n// sandbox.json (the agent can rewrite it — the jail confines egress, not the filesystem).\nconst UNSAFE_IN_SUMMARY = /[\\n\\r`<>|]/;\n\n// Cap how many hosts are named: a tampered config could pad allowedDomains until the rendered summary\n// blows past GitHub's 65536-char comment limit and the comment fails to post at all. A real allowlist\n// is a handful; the count is the diagnostic signal, not every entry.\nconst MAX_NAMED_HOSTS = 20;\n\n// The review agent's egress jail (sandbox-runtime) confines ONLY the agent — setup, install, and\n// gather run unfiltered. So when a jailed run produced no review, naming the jail's allowlist turns\n// \"the agent could not reach a host it needed\" into a one-line diagnosis. Pure: pulls\n// network.allowedDomains out of a parsed sandbox config, keeping only render-safe, sanely-sized host\n// strings (capped) and yielding none for any other shape (a missing config, or one before jail setup).\nexport const parseAgentAllowlist = (sandboxConfig: unknown): readonly string[] => {\n const domains = (sandboxConfig as { network?: { allowedDomains?: unknown } } | null | undefined)\n ?.network?.allowedDomains;\n return Array.isArray(domains)\n ? domains\n .filter(\n (d): d is string =>\n typeof d === \"string\" && d.length <= 256 && !UNSAFE_IN_SUMMARY.test(d),\n )\n .slice(0, MAX_NAMED_HOSTS)\n : [];\n};\n\n// Appended only to the notices where a jailed `claude -p` actually ran (no-output, triage-error), so\n// an egress-blocked host it needed is nameable against the allowlist. Framed conditionally — these\n// notices also fire for non-egress causes (a missing key, a wall-clock kill) — so it informs without\n// asserting egress was the cause. Empty allowlist ⇒ empty note.\nconst egressNote = (agentAllowlist: readonly string[]): string =>\n agentAllowlist.length === 0\n ? \"\"\n : `\\n\\nIf the review failed because the agent could not reach a host it needed, note that its network egress is jailed to only ${agentAllowlist\n .map((host) => `\\`${host}\\``)\n .join(\n \", \",\n )}. Add any missing host to the agent's egress allowlist — the reusable workflow's \\`extra_endpoints\\` input, or a single-file workflow's \\`--extra\\` flag on \\`sandbox-config\\`.`;\n\n// Blockquote every line so a multi-line reason stays quoted, not just its first line.\nconst blockquote = (text: string): string => text.replaceAll(\"\\n\", \"\\n> \");\n\n// A reason-bearing notice: when the triage supplied a detail string — a genuine unsafe verdict, or\n// the operational failure it hit — quote it under the lead; otherwise fall back to the no-reason\n// wording. The `typeof` guard fails closed on a null reason too (a JSON round-trip can yield null\n// where the type says undefined), never crashing this render path on `.trim()`.\nconst reasoned = (lead: string, noReason: string, reasons: string | undefined): string =>\n typeof reasons === \"string\" && reasons.trim() !== \"\"\n ? `${lead}\\n\\n> ${blockquote(reasons)}`\n : noReason;\n\nconst noticeSummary = (\n kind: NoticeKind,\n reasons: string | undefined,\n agentAllowlist: readonly string[],\n): string => {\n switch (kind) {\n case \"security-blocked\":\n return reasoned(\n \"### 🛑 Code review skipped by the security gate\\n\\nThe diff was flagged as unsafe to apply and execute:\",\n \"### 🛑 Code review skipped by the security gate\\n\\nThe security triage returned an unsafe verdict without a reason. See workflow logs.\",\n reasons,\n );\n case \"triage-error\":\n return (\n reasoned(\n \"### 🛠️ Security gate could not evaluate\\n\\nThe security triage could not produce a verdict (operational error), so the review failed closed — this is an infrastructure failure, not a finding about this diff. Re-run to retry a transient fault; a persistent one is a configuration issue (see the workflow logs). The triage step reported:\",\n \"### 🛠️ Security gate could not evaluate\\n\\nThe security triage could not produce a verdict (operational error), so the review failed closed — this is an infrastructure failure, not a finding about this diff. Re-run to retry a transient fault; a persistent one is a configuration issue (see the workflow logs).\",\n reasons,\n ) + egressNote(agentAllowlist)\n );\n case \"setup-failed\":\n return \"### 🛠️ Review did not run\\n\\nThe review job failed before the security triage could run (e.g. dependency install or environment setup). See the workflow logs — this is an infrastructure failure, not a security verdict.\";\n case \"checkout-failed\":\n return \"### ⚠️ Could not check out the PR head\\n\\nThe PR head commit could not be fetched or checked out (it may have been force-pushed away, or is otherwise unavailable), so the review was skipped rather than run against the wrong tree. See workflow logs.\";\n case \"no-output\":\n return (\n \"### ⚠️ Review did not complete\\n\\nThe diff passed triage but the review produced no output. See workflow logs.\" +\n egressNote(agentAllowlist)\n );\n }\n};\n\nconst noticeEnvelope = (summary: string): ResultEnvelope => ({\n schema_version: DEFAULT_SCHEMA_VERSION,\n findings: incompleteFindings(summary),\n models: [],\n turns: 0,\n duration_ms: 0,\n vendor_cost_usd: null,\n incomplete: true,\n});\n\nexport const buildNoticeEnvelope = (\n kind: NoticeKind,\n reasons?: string,\n agentAllowlist: readonly string[] = [],\n): ResultEnvelope => noticeEnvelope(noticeSummary(kind, reasons, agentAllowlist));\n\n// A workflow that asks for a kind this CLI does not know is almost always version skew — the pinned\n// CLI is older than the workflow calling it. Degrade to an honest incomplete envelope that names the\n// cause rather than exiting non-zero and crashing the assemble step into posting nothing at all.\nexport const buildUnknownNoticeEnvelope = (kind: string): ResultEnvelope =>\n noticeEnvelope(\n `### ⚠️ Review could not be rendered\\n\\nThe workflow asked for an unrecognized notice kind (\\`${kind}\\`) — the pinned code-review CLI is older than the workflow calling it (check that its version matches). Failing closed. See the workflow logs.`,\n );\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\n// 0.5 widened the verdict enum with the pipeline-only \"error\" value — a backwards-compatible addition,\n// so a 0.4 document is still a valid 0.5 document and resolves through the same widened codec against\n// the flat (now-0.5) schema with an identity upcast. This differs from the dropped 0.2/0.3 minors,\n// which could NOT be honestly upcast (they lacked the required reasoning/confidence). Keeping 0.4 live\n// means a prior sticky embedded by a 0.4 CLI still seeds a re-review after this ships.\nconst findingsTable: readonly VersionEntry<\"findings\", Findings>[] = [\n {\n minor: \"0.4\",\n defaultVersion: \"0.4.0\",\n schemaFile: \"findings.schema.json\",\n codec: FindingsCodec,\n normalize: identity,\n latest: false,\n },\n {\n minor: \"0.5\",\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 child-process boundary for the external CLIs (`gh`, `git`); pure callers inject fakes.\n\nimport { execFile } from \"node:child_process\";\nimport { errMsg } from \"./util.js\";\n\nconst MAX_BUFFER = 100 * 1024 * 1024;\n\n// Node's child_process `timeout` is a `setTimeout` under the hood, which clamps any delay above the\n// signed-32-bit maximum to 1ms — an over-large override would paradoxically kill every call almost\n// instantly. Honor a large-but-valid ceiling; treat an out-of-range value as invalid (fall back).\nconst MAX_TIMEOUT_MS = 2_147_483_647;\n\n// `/^\\d+$/` matches the codebase's other numeric-env parsers (requireMaxNudges, requirePositiveInt):\n// it rejects the surprising forms `Number` would coerce (`\"0.5\"` → 0.5ms, `\"0x10\"`, `\"3e5\"`).\nexport const parseTimeoutMs = (raw: string | undefined, fallback: number): number => {\n if (raw === undefined || !/^\\d+$/.test(raw)) return fallback;\n const parsed = Number(raw);\n return parsed > 0 && parsed <= MAX_TIMEOUT_MS ? parsed : fallback;\n};\n\nconst SUBPROCESS_TIMEOUT_ENV = \"CODE_REVIEW_SUBPROCESS_TIMEOUT_MS\";\nconst DEFAULT_SUBPROCESS_TIMEOUT_MS = 120_000;\n\nexport const subprocessTimeoutMs = (): number =>\n parseTimeoutMs(process.env[SUBPROCESS_TIMEOUT_ENV], DEFAULT_SUBPROCESS_TIMEOUT_MS);\n\n// A child that outlives the timeout is killed via SIGKILL, and `maxBuffer` overflow kills it too;\n// both surface as `killed`, so name which one fired (and fall back to the child's own stderr/error)\n// rather than blame a timeout for an overflow.\nexport const classifyExecError = (err: unknown, stderr: string, timeoutMs: number): string => {\n const e = err as { killed?: boolean; code?: unknown };\n const stderrStr = stderr.trim();\n if (e.code === \"ERR_CHILD_PROCESS_STDIO_MAXBUFFER\")\n return `output exceeded ${String(MAX_BUFFER)} bytes (killed)`;\n // `killed` is set for any signal (the timeout SIGKILL, or an external one), so keep the child's own\n // stderr when it left some — an externally-killed child is still diagnosable from its output.\n if (e.killed === true)\n return `no response within ${String(timeoutMs)}ms (killed a hung child)${stderrStr ? `: ${stderrStr}` : \"\"}`;\n return stderrStr || errMsg(err);\n};\n\nexport type ExecSpec = {\n readonly command: string;\n readonly args: readonly string[];\n readonly label: string;\n readonly timeoutMs: number;\n readonly env?: Readonly<Record<string, string>>;\n readonly stdin?: string;\n};\n\n// A wedged external CLI (a stalled network read, an interactive auth/pager prompt that never\n// returns) would otherwise hang the whole job until the workflow's own wall clock fires. `env` is\n// spread over the inherited environment only when overrides are supplied; untrusted values reach the\n// child via `env.NAME`, never interpolated into a command.\nexport const execFileWithTimeout = (spec: ExecSpec): Promise<string> =>\n new Promise<string>((resolve, reject) => {\n const child = execFile(\n spec.command,\n [...spec.args],\n {\n ...(spec.env ? { env: { ...process.env, ...spec.env } } : {}),\n encoding: \"utf-8\",\n maxBuffer: MAX_BUFFER,\n timeout: spec.timeoutMs,\n killSignal: \"SIGKILL\",\n },\n (err, stdout, stderr) => {\n if (err)\n reject(\n new Error(`${spec.label} failed: ${classifyExecError(err, stderr, spec.timeoutMs)}`),\n );\n else resolve(stdout);\n },\n );\n if (spec.stdin !== undefined) {\n // A SIGKILLed child (timeout/maxBuffer) can tear down its stdin mid-write; without this handler\n // the resulting EPIPE would crash the process instead of letting the promise reject.\n child.stdin?.on(\"error\", () => undefined);\n child.stdin?.end(spec.stdin);\n }\n });\n","// The single GitHub-API shell boundary; pure callers inject a fake GhApi.\n\nimport { execFileWithTimeout, subprocessTimeoutMs } from \"./exec.js\";\n\nexport type GhApi = (\n args: readonly string[],\n stdin?: string,\n env?: Readonly<Record<string, string>>,\n) => Promise<string>;\n\n// The endpoint for the error message: `graphql`, or the first path-shaped arg (a REST endpoint always\n// contains a `/`), so a swallowed 403 names WHICH call failed even for `--method POST <path>` forms\n// where the path is not args[0]. Falls back to args[0] for the pathological no-path case.\nexport const describeEndpoint = (args: readonly string[]): string =>\n args.find((a) => a === \"graphql\" || (a.includes(\"/\") && !a.startsWith(\"-\"))) ??\n args[0] ??\n \"(no endpoint)\";\n\nexport const runGhApi: GhApi = (args, stdin, env) =>\n execFileWithTimeout({\n command: \"gh\",\n args: [\"api\", ...args],\n label: `gh api ${describeEndpoint(args)}`,\n timeoutMs: subprocessTimeoutMs(),\n env,\n stdin,\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\";\nimport { parseJsonl } from \"./transcript.js\";\n\ninterface PrCandidate {\n readonly number: number;\n readonly state: string;\n readonly headRef: string;\n readonly headSha: string;\n}\n\nconst CANDIDATE_JQ =\n \".[] | {number: .number, state: .state, headRef: .head.ref, headSha: .head.sha}\";\n\nconst parseCandidates = (stdout: string): readonly PrCandidate[] =>\n parseJsonl(stdout) as readonly PrCandidate[];\n\n// A fork PR's head commit lives on the fork, unreachable from the base repo, so\n// `commits/{sha}/pulls` returns nothing for it. Fall back to matching head.sha across open PRs,\n// which does reach forks. The commit endpoint stays the primary path: it is a targeted O(1)\n// lookup and resolves same-repo PRs even when head.sha has since advanced past the CI commit.\n//\n// The primary is treated as advisory: a fork head SHA absent from the base repo can 403 (not just\n// return empty) on a read-scoped token, which is exactly when the fork listing is needed — so a\n// throwing primary falls through the same way an empty one does. A genuine permission gap then\n// surfaces on the listing call (named by ghApi), never swallowed silently here.\nconst fetchDirectCandidates = async (\n repo: string,\n headSha: string,\n ghApi: GhApi,\n): Promise<readonly PrCandidate[]> => {\n try {\n return parseCandidates(\n await ghApi([`repos/${repo}/commits/${headSha}/pulls`, \"--jq\", CANDIDATE_JQ]),\n );\n } catch {\n return [];\n }\n};\n\nexport const fetchPrCandidates = async (\n repo: string,\n headSha: string,\n ghApi: GhApi,\n): Promise<readonly PrCandidate[]> => {\n const direct = await fetchDirectCandidates(repo, headSha, ghApi);\n if (direct.length > 0) return direct;\n const open = parseCandidates(\n await ghApi([\n `repos/${repo}/pulls?state=open&per_page=100`,\n \"--paginate\",\n \"--jq\",\n CANDIDATE_JQ,\n ]),\n );\n return open.filter((c) => c.headSha === headSha);\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.find((c) => c.state === \"open\") ?? 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 {\n carryForwardMarkers,\n findingsPointer,\n parseReviewComplete,\n parseReviewedSha,\n parseRounds,\n reviewBodyPointer,\n} from \"./surface.js\";\nimport {\n ResultEnvelopeCodec,\n PriceMapCodec,\n TestSummaryCodec,\n incompleteFindings,\n isIncompleteFindings,\n} 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 // An incomplete result (a notice, not a completed review) must never overwrite a sticky that\n // already shows a completed review — else a superseded/killed/late run buries a real review under a\n // \"did not complete\" that reads as a clean pass. A completed result always writes; an in-progress\n // placeholder is not \"complete\" (it lacks the marker), so its own commenter may still write.\n const existingComplete = existingSticky !== null && parseReviewComplete(existingSticky.body);\n const wouldBuryCompleted = (incomplete: boolean): boolean => incomplete && existingComplete;\n\n // The full-review convergence history carried in the sticky's marker (it survives the announce\n // placeholder via carryForwardMarkers). A completed FULL review appends this run's counts below; a\n // CI-fix mechanic pass and every notice carry it forward unchanged so the trajectory is never lost.\n const priorRounds = existingSticky !== null ? parseRounds(existingSticky.body) : [];\n const leaveInPlace = (): void => {\n process.stderr.write(\n `Review did not complete and the sticky already reflects a completed review — leaving it in place\\n`,\n );\n process.exit(0);\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: incompleteFindings(`### ⚠️ ${message}`),\n envelope: null,\n incomplete: true,\n prices: decodedPrices.right,\n pricesProvided: input.pricesProvided,\n template,\n route: input.route,\n reviewedSha: input.headSha,\n effort: input.effort,\n rounds: priorRounds,\n runUrl: input.runUrl,\n jsonUrl: input.jsonUrl,\n postedAt: input.postedAt,\n }),\n );\n\n if (isEmptyDiff(diff)) {\n if (wouldBuryCompleted(true)) leaveInPlace();\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 if (wouldBuryCompleted(true)) leaveInPlace();\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 // The envelope carried the incomplete flag; with it lost, derive incompleteness from the verdict\n // (render does the same) so an error-verdict findings doc here still reads as a notice and — via\n // the guard below — can't bury a completed review, which this branch previously skipped.\n const envelopelessIncomplete = isIncompleteFindings(findings);\n if (wouldBuryCompleted(envelopelessIncomplete)) leaveInPlace();\n const body = formatMarkdown(\n render({\n findings,\n envelope: null,\n incomplete: envelopelessIncomplete,\n prices: decodedPrices.right,\n pricesProvided: input.pricesProvided,\n template,\n route: input.route,\n reviewedSha: input.headSha,\n effort: input.effort,\n rounds: priorRounds,\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 // A completed review carries real telemetry; adapt (and the workflow's notice wrap) flag a run that\n // produced only a notice. Don't let such a notice bury an existing completed review or post a stray\n // empty inline review over it — leave the real review in place.\n const thisIncomplete = envelope.incomplete === true || isIncompleteFindings(findings);\n if (wouldBuryCompleted(thisIncomplete)) leaveInPlace();\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 currentCounts = computeSeverityCounts(findings.findings);\n\n // A convergence round is a COMPLETED FULL review. The route lives in the envelope (the review job\n // stamps it; `post` is not passed --route in the workflow), so read the effective route the same way\n // render does — `input.route` first, then the envelope — or the feature never grows a round in\n // production. A mechanic pass or any incomplete/failed run carries the trajectory forward unchanged\n // (it is a CI fix or a non-review, not a round). A same-head CI retry simply appends again — an\n // identical chip reads as \"no change\", which is accurate; a reviewed-sha-keyed replace is unsafe\n // because a mechanic stamps a new head without adding a round, so the last round need not be its head.\n const effectiveRoute = input.route ?? envelope.route;\n const rounds =\n effectiveRoute === \"full review\" && !thisIncomplete\n ? [...priorRounds, currentCounts]\n : priorRounds;\n\n const commonRenderInput: Omit<RenderInput, \"inlineDisposition\" | \"reviewUrl\"> = {\n findings,\n envelope,\n incomplete: thisIncomplete,\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: currentCounts,\n rounds,\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\nexport interface AnnounceInput {\n readonly repo: string;\n readonly headSha: string;\n readonly botLogin: string;\n readonly runUrl: string;\n readonly headBranch?: string;\n}\n\n// The placeholder body: the sticky marker, a \"review in progress\" line linking the run, and — when a\n// prior sticky exists — its machine-readable markers carried forward verbatim, so replacing the\n// summary prose never strips the re-review seed the review job reads back (embedded findings +\n// reviewed-sha). The commenter job overwrites this with the real summary when the review completes.\nconst announceBody = (\n headSha: string,\n runUrl: string,\n existingBody: string | undefined,\n): string => {\n const notice = `${DEFAULT_MARKER}\\n\\n🔄 **Code review in progress** for \\`${headSha.slice(0, 7)}\\` — see the [workflow run](${runUrl}) for progress; this comment is updated with the review when it completes.`;\n const carried = existingBody ? carryForwardMarkers(existingBody) : \"\";\n return carried ? `${notice}\\n\\n${carried}` : notice;\n};\n\n// Post (or update) the sticky the moment a review starts, so a workflow_run review — which runs from\n// the default branch and is otherwise invisible on the PR — is visibly under way. Shares post's PR\n// resolution and sticky upsert; the review job holds no write token, so it can't do this itself.\nexport const announce = async (input: AnnounceInput, ghApi: GhApi = runGhApi): Promise<void> => {\n const candidates = await fetchPrCandidates(input.repo, input.headSha, ghApi);\n const resolution = resolvePr(candidates, input.headBranch);\n if (resolution.kind !== \"open\") {\n process.stderr.write(\n `No open PR for ${input.headSha} — nothing to announce (${resolution.kind})\\n`,\n );\n return;\n }\n const existing = await findBotComment(\n input.repo,\n resolution.prNumber,\n input.botLogin,\n DEFAULT_MARKER,\n ghApi,\n );\n // If the sticky already reflects a COMPLETED review OF THIS HEAD, leave it — overwriting it with the\n // in-progress placeholder would hide a finished review (a CI re-run of an already-reviewed commit,\n // or the review+comment pipeline racing ahead of this job). Both conditions matter: a same-head\n // INCOMPLETE notice (which also stamps reviewed-sha) must be replaced by the placeholder on a re-run,\n // and a prior head's sha still gets replaced regardless. `review-complete` is the discriminator the\n // commenter guard uses too, so both write paths agree on what \"completed\" means.\n if (\n existing !== null &&\n parseReviewComplete(existing.body) &&\n parseReviewedSha(existing.body) === input.headSha.toLowerCase()\n ) {\n process.stderr.write(\n `Sticky already reflects a completed review of ${input.headSha} — leaving it in place\\n`,\n );\n return;\n }\n await upsertSticky(\n input.repo,\n resolution.prNumber,\n existing,\n announceBody(input.headSha, input.runUrl, existing?.body),\n ghApi,\n );\n};\n\nconst incompleteBody = (\n headSha: string,\n runUrl: string,\n existingBody: string | undefined,\n): string => {\n const notice = `${DEFAULT_MARKER}\\n\\n⚠️ **Code review did not complete** for \\`${headSha.slice(0, 7)}\\` — the review job failed ([run](${runUrl})). Re-request the review; do not treat this round as spent.`;\n const carried = existingBody ? carryForwardMarkers(existingBody) : \"\";\n return carried ? `${notice}\\n\\n${carried}` : notice;\n};\n\n// The human-readable half of failure attribution (the check-run is the machine half): a review that\n// died leaves NO comment, so a separate always()-job posts this. Shares announce's PR resolution and\n// sticky upsert; the guard is stronger — it never buries a completed review OF ANY head, so a failed\n// run reporting late (after a superseding run already finished) can't clobber the real review.\nexport const reportIncomplete = async (\n input: AnnounceInput,\n ghApi: GhApi = runGhApi,\n): Promise<void> => {\n const candidates = await fetchPrCandidates(input.repo, input.headSha, ghApi);\n const resolution = resolvePr(candidates, input.headBranch);\n if (resolution.kind !== \"open\") {\n process.stderr.write(\n `No open PR for ${input.headSha} — nothing to report (${resolution.kind})\\n`,\n );\n return;\n }\n const existing = await findBotComment(\n input.repo,\n resolution.prNumber,\n input.botLogin,\n DEFAULT_MARKER,\n ghApi,\n );\n if (existing !== null && parseReviewComplete(existing.body)) {\n process.stderr.write(`Sticky already reflects a completed review — leaving it in place\\n`);\n return;\n }\n // The sticky exists but is NOT this run's own placeholder — it belongs to a superseding run whose\n // announce already posted a live \"in progress\" for a newer head. Overwriting it with \"did not\n // complete\" would be a false alarm for a review that is actively running. This run's own placeholder\n // (or a prior failure notice this run posted) embeds this run's URL, so its presence is the signal\n // that overwriting is safe.\n if (existing !== null && !existing.body.includes(input.runUrl)) {\n process.stderr.write(`Sticky belongs to another run — leaving it in place\\n`);\n return;\n }\n await upsertSticky(\n input.repo,\n resolution.prNumber,\n existing,\n incompleteBody(input.headSha, input.runUrl, existing?.body),\n ghApi,\n );\n};\n","// A native check-run on the PR head SHA is the attribution surface #115 asks for: it shows in the\n// PR's own checks list, correlates by construction (it IS on the SHA), and — because the review runs\n// from the base repo's default branch with a write token — works for fork PRs too, whose head commit\n// is reachable in the base repo via the PR ref. The in-progress check is created at review start (the\n// announce job, in its own concurrency group) so it survives a superseding run's cancellation. A\n// completed review finalizes it `neutral` (non-gating); a hard-failed review finalizes it `failure`;\n// a cancelled review leaves its in-progress check intact, so the superseding run that took over keeps\n// the SHA attributed rather than a false failure being stamped on it.\n\nimport type { GhApi } from \"./gh.js\";\nimport { runGhApi } from \"./gh.js\";\nimport { parseJsonl } from \"./transcript.js\";\n\nexport const CHECK_RUN_NAME = \"Code review\";\n\nexport type CheckIntent = \"in_progress\" | \"neutral\" | \"failure\";\n\nexport interface ExistingCheck {\n readonly id: number;\n readonly status: string;\n readonly conclusion: string | null;\n}\n\n// Forward-only across the two writers (comment finalizes `neutral`, attribute_failure finalizes\n// `failure`) that can race on a same-SHA re-run: a completed review is the truth, so `failure` never\n// overwrites a completed `neutral`/`success`, and `in_progress` never re-opens a finished check.\nexport type CheckAction =\n | { readonly kind: \"noop\"; readonly reason: string }\n | {\n readonly kind: \"create\";\n readonly status: \"in_progress\" | \"completed\";\n readonly conclusion?: string;\n }\n | {\n readonly kind: \"patch\";\n readonly id: number;\n readonly status: \"completed\";\n readonly conclusion: string;\n };\n\nconst latest = (checks: readonly ExistingCheck[]): ExistingCheck | null =>\n checks.reduce<ExistingCheck | null>(\n (best, c) => (best === null || c.id > best.id ? c : best),\n null,\n );\n\nconst isOpen = (status: string): boolean => status === \"in_progress\" || status === \"queued\";\nconst settled = new Set([\"success\", \"neutral\", \"skipped\"]);\n\nexport const decideCheckAction = (\n checks: readonly ExistingCheck[],\n intent: CheckIntent,\n): CheckAction => {\n const head = latest(checks);\n switch (intent) {\n case \"in_progress\":\n return head !== null && isOpen(head.status)\n ? { kind: \"noop\", reason: \"a check is already in progress for this head\" }\n : { kind: \"create\", status: \"in_progress\" };\n case \"neutral\":\n if (head === null) return { kind: \"create\", status: \"completed\", conclusion: \"neutral\" };\n return head.status === \"completed\" && head.conclusion === \"neutral\"\n ? { kind: \"noop\", reason: \"the check already records this completed review\" }\n : { kind: \"patch\", id: head.id, status: \"completed\", conclusion: \"neutral\" };\n case \"failure\":\n if (head === null) return { kind: \"create\", status: \"completed\", conclusion: \"failure\" };\n if (head.status === \"completed\" && head.conclusion !== null && settled.has(head.conclusion))\n return { kind: \"noop\", reason: \"a completed review already recorded this head\" };\n return head.status === \"completed\" && head.conclusion === \"failure\"\n ? { kind: \"noop\", reason: \"the check already records this failure\" }\n : { kind: \"patch\", id: head.id, status: \"completed\", conclusion: \"failure\" };\n }\n};\n\nconst CHECK_JQ = \".check_runs[] | {id: .id, status: .status, conclusion: .conclusion}\";\n\nconst fetchChecks = async (\n repo: string,\n headSha: string,\n ghApi: GhApi,\n): Promise<readonly ExistingCheck[]> =>\n parseJsonl(\n await ghApi([\n `repos/${repo}/commits/${headSha}/check-runs?check_name=${encodeURIComponent(CHECK_RUN_NAME)}&per_page=100`,\n \"--paginate\",\n \"--jq\",\n CHECK_JQ,\n ]),\n ) as readonly ExistingCheck[];\n\nconst output = (intent: CheckIntent, runUrl: string): { title: string; summary: string } => {\n switch (intent) {\n case \"in_progress\":\n return {\n title: \"Code review in progress\",\n summary: `The review is running — [see the run](${runUrl}).`,\n };\n case \"neutral\":\n return {\n title: \"Code review complete\",\n summary: `The review was posted — [see the run](${runUrl}).`,\n };\n case \"failure\":\n return {\n title: \"Code review did not complete\",\n summary: `The review job failed — [see the run](${runUrl}). Re-request the review; do not treat this round as spent.`,\n };\n }\n};\n\nexport interface CheckRunInput {\n readonly repo: string;\n readonly headSha: string;\n readonly intent: CheckIntent;\n readonly runUrl: string;\n}\n\n// Resolve the current check, decide the forward-only action, then apply it. Head SHA (not the PR) is\n// the whole key — no PR resolution needed, which is why this also works for fork PRs.\nexport const checkRun = async (input: CheckRunInput, ghApi: GhApi = runGhApi): Promise<void> => {\n const action = decideCheckAction(\n await fetchChecks(input.repo, input.headSha, ghApi),\n input.intent,\n );\n if (action.kind === \"noop\") {\n process.stderr.write(`code-review check-run: ${action.reason} — leaving it\\n`);\n return;\n }\n const body =\n action.kind === \"create\"\n ? {\n name: CHECK_RUN_NAME,\n head_sha: input.headSha,\n status: action.status,\n details_url: input.runUrl,\n ...(action.conclusion ? { conclusion: action.conclusion } : {}),\n output: output(input.intent, input.runUrl),\n }\n : {\n status: action.status,\n conclusion: action.conclusion,\n details_url: input.runUrl,\n output: output(input.intent, input.runUrl),\n };\n const endpoint =\n action.kind === \"create\"\n ? [`--method`, `POST`, `repos/${input.repo}/check-runs`, `--input`, `-`]\n : [\n `--method`,\n `PATCH`,\n `repos/${input.repo}/check-runs/${String(action.id)}`,\n `--input`,\n `-`,\n ];\n await ghApi(endpoint, JSON.stringify(body));\n};\n","// Parses a ChatOps trigger comment (\"/code-review [24m] [$1.00] <instructions>\") into structured\n// review overrides, and resolves the PR head from the comment's PR NUMBER via the API (never from a\n// SHA in the comment). The untrusted comment is parsed here, in type-safe code, not in workflow bash.\n\nimport * as t from \"io-ts\";\nimport type { GhApi } from \"./gh.js\";\nimport { runGhApi } from \"./gh.js\";\n\nexport interface CommandArgs {\n // null ⇒ the commenter did not specify it; the reusable workflow keeps its configured default.\n readonly durationSec: number | null;\n readonly usd: number | null;\n readonly instructions: string;\n // Human-readable adjustments (a clamp hit, a truncation) for the CI log — the sticky footer shows\n // the values actually used, so these are diagnostics, not the user-facing signal.\n readonly notes: readonly string[];\n}\n\nexport type CommandParse =\n { readonly kind: \"not-a-command\" } | { readonly kind: \"command\"; readonly args: CommandArgs };\n\nexport interface ParseOptions {\n readonly trigger: string;\n // null ⇒ no clamp (a comment could then request an unbounded wall/budget — callers set a ceiling).\n readonly maxDurationSec: number | null;\n readonly maxUsd: number | null;\n readonly maxInstructionsLen: number;\n}\n\nconst DURATION_RE = /^(\\d+)(h|m|s)$/;\nconst USD_RE = /^\\$(\\d+(?:\\.\\d+)?)$/;\n\nconst toSeconds = (n: number, unit: string): number =>\n unit === \"h\" ? n * 3600 : unit === \"m\" ? n * 60 : n;\n\n// null when the body does not begin with the trigger as a WHOLE token (so \"/code-reviewer\" is not a\n// hit); otherwise the remainder after the trigger, leading whitespace and all.\nconst stripTrigger = (body: string, trigger: string): string | null => {\n const trimmed = body.replace(/^\\s+/, \"\");\n if (!trimmed.startsWith(trigger)) return null;\n const after = trimmed.slice(trigger.length);\n return after === \"\" || /^\\s/.test(after) ? after : null;\n};\n\n// Consume leading whitespace-delimited tokens that are a duration or a dollar amount (each at most\n// once, either order); stop at the first token that is neither (or a duplicate). The untouched\n// remainder — from that token on, its own leading whitespace included — is the instructions.\nconst scanLeading = (\n s: string,\n acc: { readonly durationSec: number | null; readonly usd: number | null },\n): { readonly durationSec: number | null; readonly usd: number | null; readonly rest: string } => {\n const m = /^(\\s*)(\\S+)([\\s\\S]*)$/.exec(s);\n if (m === null) return { ...acc, rest: \"\" };\n const [, , token = \"\", tail = \"\"] = m;\n const dm = DURATION_RE.exec(token);\n if (dm && acc.durationSec === null)\n return scanLeading(tail, {\n ...acc,\n durationSec: toSeconds(Number.parseInt(dm[1] ?? \"\", 10), dm[2] ?? \"s\"),\n });\n const um = USD_RE.exec(token);\n if (um && acc.usd === null)\n return scanLeading(tail, { ...acc, usd: Number.parseFloat(um[1] ?? \"\") });\n return { ...acc, rest: s };\n};\n\nconst clampDuration = (\n requested: number | null,\n ceiling: number | null,\n): { readonly value: number | null; readonly notes: readonly string[] } =>\n requested !== null && ceiling !== null && requested > ceiling\n ? {\n value: ceiling,\n notes: [\n `requested duration ${String(requested)}s exceeds the ${String(ceiling)}s ceiling — clamped to ${String(ceiling)}s`,\n ],\n }\n : { value: requested, notes: [] };\n\nconst clampUsd = (\n requested: number | null,\n ceiling: number | null,\n): { readonly value: number | null; readonly notes: readonly string[] } =>\n requested !== null && ceiling !== null && requested > ceiling\n ? {\n value: ceiling,\n notes: [\n `requested $${requested.toFixed(2)} exceeds the $${ceiling.toFixed(2)} ceiling — clamped to $${ceiling.toFixed(2)}`,\n ],\n }\n : { value: requested, notes: [] };\n\nconst capInstructions = (\n text: string,\n maxLen: number,\n): { readonly value: string; readonly notes: readonly string[] } =>\n text.length > maxLen\n ? {\n value: text.slice(0, maxLen),\n notes: [\n `instructions truncated from ${String(text.length)} to ${String(maxLen)} characters`,\n ],\n }\n : { value: text, notes: [] };\n\nexport const parseCommandArgs = (body: string, options: ParseOptions): CommandParse => {\n const afterTrigger = stripTrigger(body, options.trigger);\n if (afterTrigger === null) return { kind: \"not-a-command\" };\n const scan = scanLeading(afterTrigger, { durationSec: null, usd: null });\n const duration = clampDuration(scan.durationSec, options.maxDurationSec);\n const usd = clampUsd(scan.usd, options.maxUsd);\n const instructions = capInstructions(scan.rest.trim(), options.maxInstructionsLen);\n return {\n kind: \"command\",\n args: {\n durationSec: duration.value,\n usd: usd.value,\n instructions: instructions.value,\n notes: [...duration.notes, ...usd.notes, ...instructions.notes],\n },\n };\n};\n\nconst PrHeadCodec = t.type({\n head_sha: t.string,\n head_ref: t.string,\n head_repo: t.union([t.string, t.null]),\n state: t.string,\n});\n\nexport const resolvePrHead = async (\n repo: string,\n prNumber: number,\n ghApi: GhApi,\n): Promise<t.TypeOf<typeof PrHeadCodec>> => {\n const stdout = await ghApi([\n `repos/${repo}/pulls/${String(prNumber)}`,\n \"--jq\",\n \"{head_sha: .head.sha, head_ref: .head.ref, head_repo: .head.repo.full_name, state: .state}\",\n ]);\n const decoded = PrHeadCodec.decode(JSON.parse(stdout) as unknown);\n if (decoded._tag === \"Left\") {\n throw new Error(`PR head for #${String(prNumber)} did not match the expected shape`);\n }\n return decoded.right;\n};\n\nexport interface CommandInput {\n readonly repo: string;\n readonly prNumber: number;\n readonly body: string;\n readonly options: ParseOptions;\n}\n\nexport type CommandResult =\n | { readonly kind: \"skip\"; readonly reason: string }\n | {\n readonly kind: \"run\";\n readonly headSha: string;\n readonly headBranch: string;\n readonly headRepo: string;\n readonly args: CommandArgs;\n };\n\nexport const parseCommand = async (\n input: CommandInput,\n ghApi: GhApi = runGhApi,\n): Promise<CommandResult> => {\n const parse = parseCommandArgs(input.body, input.options);\n if (parse.kind === \"not-a-command\") {\n return {\n kind: \"skip\",\n reason: `comment does not begin with the trigger \"${input.options.trigger}\"`,\n };\n }\n const head = await resolvePrHead(input.repo, input.prNumber, ghApi).catch((err: unknown) =>\n err instanceof Error ? err : new Error(String(err)),\n );\n if (head instanceof Error) {\n return {\n kind: \"skip\",\n reason: `could not resolve PR #${String(input.prNumber)}: ${head.message}`,\n };\n }\n if (head.state !== \"open\") {\n return {\n kind: \"skip\",\n reason: `PR #${String(input.prNumber)} is not open (state: ${head.state})`,\n };\n }\n return {\n kind: \"run\",\n headSha: head.head_sha,\n headBranch: head.head_ref,\n headRepo: head.head_repo ?? input.repo,\n args: parse.args,\n };\n};\n\n// A heredoc delimiter guaranteed not to equal any line of the (untrusted) instructions, so the value\n// can't break out of its $GITHUB_OUTPUT block and forge later outputs (e.g. should_run=true). A\n// 128-bit random tag never collides in practice; the bounded recursion is belt-and-braces.\nexport const safeHeredocDelim = (\n instructions: string,\n randomHex: () => string,\n attemptsLeft = 8,\n): string => {\n const candidate = `GHOUT_${randomHex()}`;\n if (!instructions.split(\"\\n\").includes(candidate)) return candidate;\n if (attemptsLeft <= 0) throw new Error(\"could not derive a collision-free heredoc delimiter\");\n return safeHeredocDelim(instructions, randomHex, attemptsLeft - 1);\n};\n\nexport const renderCommandOutputs = (result: CommandResult, delim: string): string => {\n if (result.kind === \"skip\") return \"should_run=false\\n\";\n const { headSha, headBranch, headRepo, args } = result;\n return `${[\n \"should_run=true\",\n `head_sha=${headSha}`,\n `head_branch=${headBranch}`,\n `head_repo=${headRepo}`,\n `duration=${args.durationSec === null ? \"\" : `${String(args.durationSec)}s`}`,\n `usd=${args.usd === null ? \"\" : args.usd.toFixed(2)}`,\n `instructions<<${delim}`,\n args.instructions,\n delim,\n ].join(\"\\n\")}\\n`;\n};\n","// Manages the ChatOps acknowledgement reaction on a PR/issue comment: 👀 on receipt, swapped to 🚀\n// (or 😕) on completion. Reactions are cosmetic, so the CLI wrapper never fails a job over them.\n\nimport * as t from \"io-ts\";\nimport type { GhApi } from \"./gh.js\";\nimport { runGhApi } from \"./gh.js\";\nimport { errMsg, tryParseJson } from \"./util.js\";\n\n// GitHub's fixed reaction vocabulary — there is no ✅; 🚀 (rocket) reads as \"review shipped\".\nexport const REACTIONS = [\n \"+1\",\n \"-1\",\n \"laugh\",\n \"confused\",\n \"heart\",\n \"hooray\",\n \"rocket\",\n \"eyes\",\n] as const;\nexport type Reaction = (typeof REACTIONS)[number];\nexport const isReaction = (s: string): s is Reaction =>\n (REACTIONS as readonly string[]).includes(s);\n\nconst ReactionCodec = t.type({ id: t.number, content: t.string });\n\nexport interface ReactInput {\n readonly repo: string;\n readonly commentId: number;\n readonly add?: Reaction;\n readonly remove?: Reaction;\n}\n\nconst reactionsPath = (repo: string, commentId: number): string =>\n `repos/${repo}/issues/comments/${String(commentId)}/reactions`;\n\nconst removeReactions = async (\n repo: string,\n commentId: number,\n content: Reaction,\n ghApi: GhApi,\n): Promise<void> => {\n // --paginate WITHOUT --jq concatenates pages as `[..][..]` (invalid JSON) once a comment has >100\n // reactions; flatten to one record per line via --jq and decode line by line, like pr.ts. Each\n // undecodable line is logged and skipped rather than silently swallowed.\n const stdout = await ghApi([\n reactionsPath(repo, commentId),\n \"--paginate\",\n \"--jq\",\n \".[] | {id, content}\",\n ]);\n for (const line of stdout.split(\"\\n\").filter((l) => l.trim() !== \"\")) {\n const parsed = tryParseJson(line);\n const decoded = parsed.ok ? ReactionCodec.decode(parsed.value) : undefined;\n if (decoded === undefined || decoded._tag === \"Left\") {\n process.stderr.write(\"code-review react: could not decode a reaction entry — skipping\\n\");\n continue;\n }\n if (decoded.right.content !== content) continue;\n // The token may delete only its OWN reactions; a 403 on someone else's is expected, not fatal.\n await ghApi([\n \"--method\",\n \"DELETE\",\n `${reactionsPath(repo, commentId)}/${String(decoded.right.id)}`,\n ]).catch((err: unknown) =>\n process.stderr.write(\n `code-review react: could not remove reaction ${String(decoded.right.id)} (${errMsg(err)}) — skipping\\n`,\n ),\n );\n }\n};\n\n// Add first, then remove, so the comment is never momentarily unmarked during a 👀→🚀 swap.\nexport const react = async (input: ReactInput, ghApi: GhApi = runGhApi): Promise<void> => {\n if (input.add !== undefined) {\n await ghApi([\n \"--method\",\n \"POST\",\n reactionsPath(input.repo, input.commentId),\n \"-f\",\n `content=${input.add}`,\n ]);\n }\n if (input.remove !== undefined) {\n await removeReactions(input.repo, input.commentId, input.remove, ghApi);\n }\n};\n","// Resolves and waits for a PR head's CI workflow run, so the on-demand comment trigger routes on the\n// SAME real CI conclusion the workflow_run trigger would: success → full review, failure → mechanic\n// with that run's failing-job logs. Without this the comment path reviews blind to CI — throwing away\n// the differentiator. The head SHA is trusted (resolved from the PR number via the API), so it is\n// safe in the query; the workflow name is trusted caller config.\n\nimport { performance } from \"node:perf_hooks\";\nimport * as t from \"io-ts\";\nimport { PathReporter } from \"io-ts/lib/PathReporter.js\";\nimport type { GhApi } from \"./gh.js\";\nimport { runGhApi } from \"./gh.js\";\nimport { parseJsonl } from \"./transcript.js\";\nimport { errMsg } from \"./util.js\";\n\nconst RunCodec = t.type({\n id: t.number,\n name: t.union([t.string, t.null]),\n status: t.union([t.string, t.null]),\n conclusion: t.union([t.string, t.null]),\n run_number: t.number,\n});\n\nexport interface CiRun {\n readonly id: number;\n // queued | in_progress | requested | waiting | pending | completed\n readonly status: string;\n // success | failure | cancelled | timed_out | ... — null until status is completed\n readonly conclusion: string | null;\n}\n\nexport interface CiLookup {\n // The matched run, or null if the named workflow has no run for this head SHA yet.\n readonly run: CiRun | null;\n // Distinct workflow names that DID run for this head SHA — lets a caller tell a mistyped\n // workflowName (which otherwise just times out) from \"the named CI simply has not queued yet\".\n readonly seenNames: readonly string[];\n}\n\n// One projected run object per row across ALL pages: `--paginate` WITHOUT `--jq` concatenates each\n// page's `{workflow_runs: […]}` object into a stream JSON.parse rejects, so only the first page (≤100\n// runs) was ever read — a head SHA with many workflows or re-runs could push the awaited run out of\n// view and the comment path would decline with no diagnostic. `--jq` unwraps `.workflow_runs[]` and\n// streams NDJSON parseJsonl reads line by line, the shape gather/post already use.\nconst RUN_JQ =\n \".workflow_runs[] | {id: .id, name: .name, status: .status, conclusion: .conclusion, run_number: .run_number}\";\n\n// The latest run of the named CI workflow for this head SHA. NOT filtered by triggering event: CI may\n// run on `push` as well as `pull_request`, and the head SHA already pins the commit. Latest = highest\n// run_number, so a re-run supersedes. `run` is null when the named workflow has no run yet (the\n// comment may fire before CI even queues). A row that doesn't match the run shape is dropped rather\n// than aborting the lookup — an empty result then reads as \"not queued yet\" and the caller declines.\nexport const resolveCiRun = async (\n repo: string,\n headSha: string,\n workflowName: string,\n ghApi: GhApi,\n): Promise<CiLookup> => {\n const endpoint = `repos/${repo}/actions/runs?head_sha=${headSha}&per_page=100`;\n const rows = parseJsonl(await ghApi([endpoint, \"--paginate\", \"--jq\", RUN_JQ]));\n const decoded = rows.map((row) => RunCodec.decode(row));\n const runs = decoded.flatMap((d) => (d._tag === \"Right\" ? [d.right] : []));\n // A row that fails the codec is dropped rather than aborting the lookup, but a drop is never normal:\n // a partial drift can silently drop the newest run and route on a stale one, and a total drift reads\n // as an empty result that declines only after a full timeout. So name every drop, with the first\n // failure's field-level detail, so the drifted field is diagnosable without reproducing the call.\n const dropped = decoded.length - runs.length;\n if (dropped > 0) {\n const firstDrift = decoded.find((d) => d._tag === \"Left\");\n const detail =\n firstDrift === undefined ? \"\" : ` (${PathReporter.report(firstDrift).join(\"; \")})`;\n process.stderr.write(\n `Warning: ${String(dropped)} of ${String(rows.length)} workflow-run row(s) from ${endpoint} failed to decode${detail} — excluded from the lookup\\n`,\n );\n }\n const latest = runs\n .filter((r) => r.name === workflowName)\n .reduce<t.TypeOf<typeof RunCodec> | null>(\n (best, r) => (best === null || r.run_number > best.run_number ? r : best),\n null,\n );\n return {\n run:\n latest === null\n ? null\n : { id: latest.id, status: latest.status ?? \"unknown\", conclusion: latest.conclusion },\n seenNames: [...new Set(runs.flatMap((r) => (r.name === null ? [] : [r.name])))],\n };\n};\n\nexport type CiOutcome =\n | { readonly kind: \"concluded\"; readonly conclusion: string; readonly runId: number }\n // No conclusive CI result within the timeout — the run never appeared or never completed. The\n // caller declines to review rather than fabricate a conclusion. seenNames carries the workflow\n // names that DID run, so a mistyped ci_workflow can be diagnosed instead of silently timing out.\n | {\n readonly kind: \"timed-out\";\n readonly runId: number | null;\n readonly seenNames: readonly string[];\n };\n\nexport interface AwaitOptions {\n readonly workflowName: string;\n readonly pollIntervalMs: number;\n readonly timeoutMs: number;\n}\n\nexport interface AwaitDeps {\n readonly ghApi: GhApi;\n readonly sleep: (ms: number) => Promise<void>;\n readonly elapsedMs: () => number;\n}\n\nexport const awaitCiConclusion = async (\n repo: string,\n headSha: string,\n options: AwaitOptions,\n deps: AwaitDeps = { ghApi: runGhApi, sleep: defaultSleep, elapsedMs: monotonicElapsed() },\n): Promise<CiOutcome> => {\n // `--paginate` fetches one page per HTTP request, so a transient blip on any page rejects the whole\n // lookup. Contain it to a diagnostic + empty result rather than let it unwind and abort the wait:\n // the loop is meant to be resilient, so a failed poll should retry until the run settles or the\n // timeout declines, never crash mid-wait.\n const safeResolve = async (): Promise<CiLookup> => {\n try {\n return await resolveCiRun(repo, headSha, options.workflowName, deps.ghApi);\n } catch (err) {\n process.stderr.write(\n `Warning: CI-run lookup for ${headSha} failed (${errMsg(err)}) — retrying until the timeout\\n`,\n );\n return { run: null, seenNames: [] };\n }\n };\n const poll = async (\n lastSeenNames: readonly string[],\n lastRunId: number | null,\n ): Promise<CiOutcome> => {\n const { run, seenNames } = await safeResolve();\n // A run momentarily reports `completed` with a null conclusion before GitHub settles it; treating\n // that as concluded would fabricate a routing decision, so keep polling until the conclusion lands\n // (or the timeout declines) rather than collapsing it to a made-up \"unknown\" the caller can act on.\n if (run !== null && run.status === \"completed\" && run.conclusion !== null)\n return { kind: \"concluded\", conclusion: run.conclusion, runId: run.id };\n // A caught error zeroes this poll's view, so carry the last non-empty observation forward — else a\n // transient failure on the very iteration that times out would erase the run id and workflow names\n // earlier polls saw, misleading the mistyped-workflow-vs-not-queued-yet diagnostic renderCiOutputs\n // depends on.\n const runId = run === null ? lastRunId : run.id;\n const names = seenNames.length > 0 ? seenNames : lastSeenNames;\n if (deps.elapsedMs() >= options.timeoutMs)\n return { kind: \"timed-out\", runId, seenNames: names };\n await deps.sleep(options.pollIntervalMs);\n return poll(names, runId);\n };\n return poll([], null);\n};\n\nexport const defaultSleep = (ms: number): Promise<void> =>\n new Promise((resolvePromise) => setTimeout(resolvePromise, ms));\n\n// performance.now() is monotonic — unlike Date.now(), an NTP/VM wall-clock step back mid-poll can't\n// make elapsedMs() decrease and stall the timeout check the loop depends on.\nexport const monotonicElapsed = (): (() => number) => {\n const start = performance.now();\n return () => performance.now() - start;\n};\n\n// ci_settled distinguishes \"we know the CI result\" from \"we gave up waiting\" so the gate can decline\n// the review on a non-settle rather than run it on a guessed conclusion.\nexport const renderCiOutputs = (outcome: CiOutcome): string =>\n outcome.kind === \"concluded\"\n ? `ci_settled=true\\nci_conclusion=${outcome.conclusion}\\nci_run_id=${String(outcome.runId)}\\n`\n : `ci_settled=false\\nci_run_id=${outcome.runId === null ? \"\" : String(outcome.runId)}\\n`;\n","// Shares post's PR resolution so the review and comment jobs never split-brain on which PR.\n\nimport { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport * as t from \"io-ts\";\nimport { execFileWithTimeout, subprocessTimeoutMs } from \"./exec.js\";\nimport type { GhApi } from \"./gh.js\";\nimport { runGhApi } from \"./gh.js\";\nimport { fetchDiff, fetchPrCandidates, resolvePr } from \"./pr.js\";\nimport { parseJsonl } from \"./transcript.js\";\nimport { errMsg } from \"./util.js\";\n\nexport interface GatherInput {\n readonly repo: string;\n readonly headSha: string;\n readonly headBranch?: string;\n // The repo's default branch — the trusted base the review checks out and the reference point for\n // the full (triage) diff. A PR whose base is a different branch is \"stacked\".\n readonly defaultBranch: 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 // The PR's base is not the default branch (a stacked PR): the review scope (base...head) is a\n // strict subset of what gets checked out + triaged (default...head), so the review prompt frames\n // the extra changes as already-reviewed context.\n readonly stacked: boolean;\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)}\\nstacked=${String(result.stacked)}\\n`;\n }\n};\n\nexport type GitRun = (args: readonly string[]) => Promise<string>;\n\nexport const runGit: GitRun = (args) =>\n execFileWithTimeout({\n command: \"git\",\n args,\n label: `git ${args.join(\" \")}`,\n timeoutMs: subprocessTimeoutMs(),\n });\n\nconst PrMetaCodec = t.type({\n changed_files: t.number,\n base_sha: t.string,\n base_ref: 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.intersection([\n t.type({\n id: t.number,\n body: t.union([t.string, t.null]),\n user: t.type({ login: t.string }),\n }),\n t.partial({\n created_at: t.union([t.string, t.null]),\n author_association: t.union([t.string, t.null]),\n }),\n]);\ntype IssueComment = t.TypeOf<typeof 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, base_ref: .base.ref, 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\n// The review checks out the PR head; the untrusted surface a checkout exposes over the trusted\n// default branch is exactly `default...head`. So triage scans THIS diff (not the PR's base...head),\n// and it is the same diff for a normal PR (base === default). Compare API with a git-diff fallback\n// (fetch the head, diff from the checked-out default-branch tip) mirroring the pr.diff path.\nconst fetchFullDiff = async (\n repo: string,\n defaultBranch: string,\n headSha: string,\n ghApi: GhApi,\n gitRun: GitRun,\n): Promise<string> => {\n try {\n const diff = await ghApi([\n `repos/${repo}/compare/${defaultBranch}...${headSha}`,\n \"-H\",\n \"Accept: application/vnd.github.v3.diff\",\n ]);\n if (diff.length > 0) return diff;\n process.stderr.write(\n `compare diff for ${defaultBranch}...${headSha} was empty — falling back to git diff\\n`,\n );\n } catch (err) {\n process.stderr.write(`compare diff fetch failed (${errMsg(err)}) — falling back to git diff\\n`);\n }\n await gitRun([\"fetch\", \"origin\", headSha]);\n // Three-dot, matching the compare API's semantics (merge-base...head): the checked-out default\n // branch is HEAD, so this is the same untrusted surface the compare primary computes.\n const base = (await gitRun([\"rev-parse\", \"HEAD\"])).trim();\n return gitRun([\"diff\", `${base}...${headSha}`]);\n};\n\nconst CommitCodec = t.type({\n sha: t.string,\n message: t.string,\n author: t.union([t.string, t.null]),\n email: t.union([t.string, t.null]),\n});\nconst COMMIT_JQ =\n \".commits[] | {sha: .sha, message: .commit.message, author: .commit.author.name, email: .commit.author.email}\";\n\n// Commit messages + author identities of every commit in `default...head`. Once the head is checked\n// out, `git log` exposes these to the reviewing agent, so they are an untrusted surface triage must\n// scan for injection. FAIL CLOSED: a fetch failure propagates (never a silent empty scan) — the\n// caller must not expose commit messages it could not vet.\nconst fetchCompareCommits = async (\n repo: string,\n defaultBranch: string,\n headSha: string,\n ghApi: GhApi,\n): Promise<readonly t.TypeOf<typeof CommitCodec>[]> => {\n const rows = parseJsonl(\n await ghApi([\n `repos/${repo}/compare/${defaultBranch}...${headSha}`,\n \"--paginate\",\n \"--jq\",\n COMMIT_JQ,\n ]),\n );\n const decoded = rows.map((row) => CommitCodec.decode(row));\n const commits = decoded.flatMap((d) => (d._tag === \"Right\" ? [d.right] : []));\n // A dropped row is a scan gap, not a no-op: a checkout's `git log` still exposes that commit's\n // message to the agent, so name any drop rather than let an unscanned message pass silently.\n const dropped = decoded.length - commits.length;\n if (dropped > 0) {\n process.stderr.write(\n `Warning: ${String(dropped)} of ${String(rows.length)} commit row(s) failed to decode — their messages are NOT in the triage scan though a checkout's git log still exposes them\\n`,\n );\n }\n return commits;\n};\n\n// One object per row across all pages: `--paginate` WITHOUT `--jq` concatenates each page's JSON\n// array into an invalid `[..][..]` stream JSON.parse rejects, silently losing the prior review (and\n// the conversation) on any PR past the first page; the `--jq` projection streams NDJSON parseJsonl\n// reads line by line — the shape post.ts's findBotComment already uses.\nconst COMMENT_JQ =\n \".[] | {id: .id, body: .body, user: {login: .user.login}, created_at: .created_at, author_association: .author_association}\";\nconst REVIEW_COMMENT_JQ =\n \".[] | {body: .body, user: {login: .user.login}, created_at: .created_at, author_association: .author_association, path: .path, line: .line}\";\nconst REVIEW_JQ =\n \".[] | {body: .body, user: {login: .user.login}, submitted_at: .submitted_at, author_association: .author_association, state: .state}\";\n\nconst ReviewCommentCodec = t.intersection([\n t.type({ body: t.union([t.string, t.null]), user: t.type({ login: t.string }) }),\n t.partial({\n created_at: t.union([t.string, t.null]),\n author_association: t.union([t.string, t.null]),\n path: t.union([t.string, t.null]),\n line: t.union([t.number, t.null]),\n }),\n]);\ntype ReviewComment = t.TypeOf<typeof ReviewCommentCodec>;\n\nconst ReviewCodec = t.intersection([\n t.type({ body: t.union([t.string, t.null]), user: t.type({ login: t.string }) }),\n t.partial({\n submitted_at: t.union([t.string, t.null]),\n author_association: t.union([t.string, t.null]),\n state: t.union([t.string, t.null]),\n }),\n]);\ntype Review = t.TypeOf<typeof ReviewCodec>;\n\n// Fetch + stream-parse a paginated endpoint; null on any transport error (named on stderr so a\n// degraded channel is diagnosable), so a failed fetch never aborts the review — the conversation is\n// best-effort context.\nconst fetchJsonlRows = async (\n ghApi: GhApi,\n endpoint: string,\n jq: string,\n): Promise<readonly unknown[] | null> => {\n try {\n return parseJsonl(await ghApi([endpoint, \"--paginate\", \"--jq\", jq]));\n } catch (err) {\n process.stderr.write(\n `Warning: could not fetch ${endpoint} (${errMsg(err)}) — omitting it from the review context\\n`,\n );\n return null;\n }\n};\n\n// Decode row by row, dropping only the rows that don't validate (e.g. a deleted account's null login)\n// rather than letting one malformed row fail the whole channel the way an atomic `t.array` decode\n// would. null still propagates a failed fetch (rows === null); a bad row is silently skipped.\nconst decodeArrayOrNull = <A>(\n codec: t.Type<A>,\n rows: readonly unknown[] | null,\n): readonly A[] | null => {\n if (rows === null) return null;\n return rows.flatMap((row) => {\n const decoded = codec.decode(row);\n return decoded._tag === \"Right\" ? [decoded.right] : [];\n });\n};\n\n// The bot's own last comment — its embedded findings marker seeds the re-review draft (seed-draft).\nconst priorReviewFrom = (\n comments: readonly IssueComment[],\n botLogin: string,\n): { readonly id: number; readonly body: string | null } | null => {\n const byBot = comments.filter((c) => c.user.login === botLogin);\n const last = byBot[byBot.length - 1];\n return last ? { id: last.id, body: last.body } : null;\n};\n\n// The untrusted PR discussion staged for the review agent to TRIAGE as claims — so a re-review can\n// recognize a finding the author already answered without OBEYING the comment. Everyone but the\n// review bot (its own output is seeded back via prior_review), bounded to the most recent items per\n// channel with each body clipped so a long thread can't blow the agent's context; the workflow frames\n// these files as claims-to-verify, never as instructions.\nconst MAX_CONVERSATION_COMMENTS = 50;\nconst MAX_CONVERSATION_BODY_CHARS = 4000;\n\nconst clip = (body: string): string => {\n if (body.length <= MAX_CONVERSATION_BODY_CHARS) return body;\n const cut = body.slice(0, MAX_CONVERSATION_BODY_CHARS);\n // Don't end on a lone high surrogate (a code point split mid-pair) — drop it so the kept prefix\n // stays well-formed UTF-16.\n const safe = /[\\uD800-\\uDBFF]$/.test(cut) ? cut.slice(0, -1) : cut;\n return `${safe}\\n… [truncated]`;\n};\n\n// Drop the review bot and empty bodies, keep the most recent MAX (logging when it caps), then project.\nconst boundedHuman = <\n A extends { readonly user: { readonly login: string }; readonly body: string | null },\n B,\n>(\n items: readonly A[],\n botLogin: string,\n label: string,\n project: (item: A & { readonly body: string }) => B,\n): readonly B[] => {\n const human = items.filter(\n (a): a is A & { readonly body: string } =>\n a.user.login !== botLogin && typeof a.body === \"string\" && a.body.trim() !== \"\",\n );\n const kept = human.slice(-MAX_CONVERSATION_COMMENTS);\n if (kept.length < human.length) {\n process.stderr.write(\n `Note: PR has ${String(human.length)} ${label} — feeding the review the most recent ${String(MAX_CONVERSATION_COMMENTS)}\\n`,\n );\n }\n return kept.map(project);\n};\n\nconst issueCommentsFrom = (comments: readonly IssueComment[], botLogin: string) =>\n boundedHuman(comments, botLogin, \"discussion comments\", (c) => ({\n author: c.user.login,\n author_association: c.author_association ?? null,\n created_at: c.created_at ?? null,\n body: clip(c.body),\n }));\n\nconst reviewCommentsFrom = (comments: readonly ReviewComment[], botLogin: string) =>\n boundedHuman(comments, botLogin, \"inline review comments\", (c) => ({\n author: c.user.login,\n author_association: c.author_association ?? null,\n created_at: c.created_at ?? null,\n path: c.path ?? null,\n line: c.line ?? null,\n body: clip(c.body),\n }));\n\nconst reviewsFrom = (reviews: readonly Review[], botLogin: string) =>\n boundedHuman(reviews, botLogin, \"review submissions\", (r) => ({\n author: r.user.login,\n author_association: r.author_association ?? null,\n submitted_at: r.submitted_at ?? null,\n state: r.state ?? null,\n body: clip(r.body),\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 stacked = meta.base_ref !== input.defaultBranch;\n\n // pr.diff (base...head) is the review SCOPE — the PR's own change; its endpoint + git-diff fallback\n // are unchanged.\n const prDiff = await (async () => {\n const apiDiff = await fetchApiDiff(input.repo, prNumber, ghApi);\n if (apiDiff !== null && !(apiDiff.length === 0 && meta.changed_files > 0)) return apiDiff;\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 // full.diff (default...head) is the surface a head checkout exposes over the trusted base — what\n // triage scans and what the checkout produces. Same as pr.diff for a normal PR (base === default);\n // a superset for a stacked one, so only then is a separate fetch needed. commits.json carries the\n // messages/authors a checked-out `git log` exposes, scanned by triage alongside the diff.\n const fullDiff = stacked\n ? await fetchFullDiff(input.repo, input.defaultBranch, input.headSha, ghApi, gitRun)\n : prDiff;\n const commits = await fetchCompareCommits(input.repo, input.defaultBranch, input.headSha, ghApi);\n\n writeFileSync(join(input.outDir, \"full.diff\"), fullDiff);\n writeFileSync(join(input.outDir, \"pr.diff\"), prDiff);\n writeFileSync(join(input.outDir, \"commits.json\"), JSON.stringify(commits));\n writeFileSync(\n join(input.outDir, \"pr_context.json\"),\n JSON.stringify({ title: meta.title, body: meta.body }),\n );\n\n // The three conversation fetches are independent — run them together rather than one after another.\n const [issueRows, reviewCommentRows, reviewRows] = await Promise.all([\n fetchJsonlRows(ghApi, `repos/${input.repo}/issues/${String(prNumber)}/comments`, COMMENT_JQ),\n fetchJsonlRows(\n ghApi,\n `repos/${input.repo}/pulls/${String(prNumber)}/comments`,\n REVIEW_COMMENT_JQ,\n ),\n fetchJsonlRows(ghApi, `repos/${input.repo}/pulls/${String(prNumber)}/reviews`, REVIEW_JQ),\n ]);\n const issueComments = decodeArrayOrNull(IssueCommentCodec, issueRows);\n const reviewComments = decodeArrayOrNull(ReviewCommentCodec, reviewCommentRows);\n const reviews = decodeArrayOrNull(ReviewCodec, reviewRows);\n\n const prior = issueComments === null ? null : priorReviewFrom(issueComments, input.botLogin);\n writeFileSync(\n join(input.outDir, \"prior_review.json\"),\n prior === null ? \"null\" : JSON.stringify(prior),\n );\n writeFileSync(\n join(input.outDir, \"pr_conversation.json\"),\n JSON.stringify({\n issue_comments:\n issueComments === null ? [] : issueCommentsFrom(issueComments, input.botLogin),\n review_comments:\n reviewComments === null ? [] : reviewCommentsFrom(reviewComments, input.botLogin),\n reviews: reviews === null ? [] : reviewsFrom(reviews, input.botLogin),\n }),\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(prDiff, \"utf8\"),\n stacked,\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, incompleteFindings } 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 // The agent-file is the UNREVISED seed the pipeline pre-wrote (the agent died before touching it),\n // decided by the caller from the seed-marker mtime. Recovering it would post the seed — a\n // first-review scaffold OR a re-review's PRIOR verdict — as a completed review of the current head:\n // the false-clean-pass class (issue #117). So skip recovery entirely and emit a \"did not complete\"\n // notice, keeping whatever telemetry the run produced.\n readonly seedUnrevised?: boolean;\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 seedUnrevised: boolean,\n): ResultEnvelope => {\n // The agent never wrote the draft — recovering the untouched seed would post it as a completed\n // review of the current head (issue #117). Emit the notice instead, keeping the run's telemetry.\n if (seedUnrevised)\n return {\n schema_version: DEFAULT_SCHEMA_VERSION,\n findings: incompleteFindings(\n \"### ⚠️ Review did not complete\\n\\nThe review agent did not write a review (its draft is the untouched pre-seed). See the workflow logs.\",\n ),\n incomplete: true,\n ...telemetry,\n };\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: incompleteFindings(`### ⚠️ Review did not complete\\n\\n${outcome.reason}`),\n incomplete: true,\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 meta.seedUnrevised === true,\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 meta.seedUnrevised === true,\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","// The untrusted review agent's network jail as one sandbox-runtime (`srt`) settings file (data, not\n// shell). The allowlist is the model endpoint the CLI actually dials plus the GitHub API/host and any\n// consumer-supplied hosts; the host-side proxy denies everything else. Filesystem isolation is off —\n// the threat this closes is network exfil of the burner key, not the throwaway runner's disk — so the\n// jail confines only egress while the agent still reads the worktree and writes its draft freely.\n\nexport interface SandboxConfig {\n readonly network: {\n readonly allowedDomains: readonly string[];\n readonly deniedDomains: readonly string[];\n };\n readonly filesystem: {\n readonly allowRead: readonly string[];\n readonly denyRead: readonly string[];\n readonly allowWrite: readonly string[];\n readonly denyWrite: readonly string[];\n };\n}\n\n// GitHub hosts the agent may reach when it shells out to gh/git during a review.\nconst GITHUB_HOSTS = [\"api.github.com\", \"github.com\"] as const;\n\n// The model host from api_base_url (ANTHROPIC_BASE_URL) — the single source of truth for the endpoint\n// the CLI dials, rather than a hardcoded vendor. Bare hostname (no scheme/port/path) to match the\n// proxy's hostname rule. Throws rather than yield an empty entry that would deny the model itself.\nexport const deriveModelHost = (apiBaseUrl: string): string => {\n const host = URL.canParse(apiBaseUrl) ? new URL(apiBaseUrl).hostname : \"\";\n if (host === \"\") {\n throw new Error(\n `could not derive the model host from api_base_url ${JSON.stringify(apiBaseUrl)} — expected a URL like https://api.deepseek.com/anthropic`,\n );\n }\n return host;\n};\n\n// The consumer's extra_endpoints: the same whitespace-separated host[:port] list they already pass to\n// harden-runner. Ports are dropped — the proxy matches on hostname (the only form validated on the\n// runner), and for HTTPS-only egress a port scope adds nothing.\nexport const parseExtraEndpoints = (extra: string): readonly string[] =>\n extra\n .split(/\\s+/)\n .map((token) => token.replace(/:\\d+$/, \"\"))\n .filter((token) => token.length > 0);\n\nexport const buildSandboxConfig = (opts: {\n readonly apiBaseUrl: string;\n readonly extra?: string;\n}): SandboxConfig => ({\n network: {\n allowedDomains: [\n ...new Set([\n deriveModelHost(opts.apiBaseUrl),\n ...GITHUB_HOSTS,\n ...parseExtraEndpoints(opts.extra ?? \"\"),\n ]),\n ],\n deniedDomains: [],\n },\n filesystem: { allowRead: [], denyRead: [], allowWrite: [\"/\"], denyWrite: [] },\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 { randomBytes } from \"node:crypto\";\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 emptyFindings,\n} from \"./schema.js\";\nimport type { Triage, Finding, PriceMap } from \"./schema.js\";\nimport { parseFindingsMarker, parseReviewedSha } from \"./surface.js\";\nimport {\n buildNoticeEnvelope,\n buildUnknownNoticeEnvelope,\n isNoticeKind,\n parseAgentAllowlist,\n NOTICE_KINDS,\n} from \"./notice.js\";\nimport { announce, post, reportIncomplete } from \"./post.js\";\nimport { type CheckIntent, checkRun } from \"./checkrun.js\";\nimport { parseCommand, renderCommandOutputs, safeHeredocDelim } from \"./command.js\";\nimport { react, isReaction, REACTIONS } from \"./react.js\";\nimport type { Reaction } from \"./react.js\";\nimport { awaitCiConclusion, renderCiOutputs } from \"./ci.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 { buildSandboxConfig } from \"./sandbox.js\";\nimport { annotationSafe, asRecord, errMsg, readFileOrNull, 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\n// The optional sandbox config a notice names its allowlist from. A MISSING/unreadable file is the\n// normal early-failure case (the jail is set up after triage), so it stays silent and is treated as\n// absent. A file that is PRESENT but unparseable is the diagnostic case this feature exists for (a\n// truncated or agent-tampered config), so it warns rather than vanishing. Either way ⇒ undefined, and\n// the notice omits the allowlist rather than crashing the assemble step.\nconst readSandboxConfigForNotice = (path: string): unknown => {\n const text = readFileOrNull(resolve(path));\n if (text === null) return undefined;\n const parsed = tryParseJson(text);\n if (!parsed.ok) {\n process.stderr.write(\n `::warning::${annotationSafe(`code-review notice: ${path} is present but not valid JSON — omitting the agent allowlist from the notice`)}\\n`,\n );\n return undefined;\n }\n return parsed.value;\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(emptyFindings(\"\"), 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 // The agent-file is the untouched pre-seed when it is no newer than its seed marker (the same\n // mtime test the budget hook uses via the seedMarkerPath SSOT). Recovering it would post the seed\n // — a first-review scaffold or a re-review's PRIOR verdict — as a completed review of the current\n // head (issue #117), so adapt emits a \"did not complete\" notice instead. Absent a marker (any\n // non-seeded caller) mainHasWrittenDraft returns true, so this is inert outside the review pipeline.\n const agentFile = args[\"agent-file\"];\n const seedUnrevised = agentFile\n ? !mainHasWrittenDraft(mtimeMsOf(agentFile), mtimeMsOf(seedMarkerPath(agentFile)))\n : false;\n const envelope = unwrapAdapt(\n adapt(requireAdapterName(args.adapter), readJSONOrAbsent(args.native), agentFile, {\n route: args.route,\n effort: args.effort,\n agentFileFallbackPath: args[\"agent-file-fallback\"],\n seedUnrevised,\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 noticeCmd = defineCommand({\n meta: {\n name: \"notice\",\n description:\n \"Emit an abstract envelope for a run that produced no completed review (security block, triage error, setup failure, checkout failure, or empty run) — flagged incomplete so the commenter renders it honestly and won't bury a real review\",\n },\n args: {\n kind: {\n type: \"positional\",\n description: `One of: ${NOTICE_KINDS.join(\", \")} (an unrecognized kind renders a generic incomplete notice rather than failing — the pinned CLI is older than the workflow)`,\n required: true,\n },\n reasons: {\n type: \"string\",\n description:\n \"security-blocked / triage-error only: the triage's fail-closed reason string (empty/omitted ⇒ the no-reason wording)\",\n },\n \"sandbox-config\": {\n type: \"string\",\n description:\n \"no-output / triage-error only: path to the agent's sandbox-runtime settings (sandbox.json); its network.allowedDomains is named in the notice so an egress-blocked review self-diagnoses. Missing or unreadable ⇒ the allowlist is omitted (an early failure runs before the jail is set up).\",\n },\n },\n // An unrecognized kind degrades to a generic incomplete notice instead of exiting non-zero: a\n // `notice <kind>` call under the workflow's `set -euo pipefail` must never crash the assemble\n // step into posting nothing, and an unknown kind almost always means version skew, not a typo.\n run: ({ args }) => {\n if (!isNoticeKind(args.kind)) {\n process.stderr.write(\n `::warning::code-review notice: unrecognized kind \"${annotationSafe(args.kind)}\" — the pinned CLI is older than the workflow calling it; rendering a generic incomplete notice\\n`,\n );\n process.stdout.write(`${JSON.stringify(buildUnknownNoticeEnvelope(args.kind), null, 2)}\\n`);\n return;\n }\n // Read the sandbox config only for the kinds that name the allowlist (a jailed agent ran), so the\n // \"no-output / triage-error only\" contract is enforced by the handler, not just documented.\n const namesAllowlist = args.kind === \"no-output\" || args.kind === \"triage-error\";\n const agentAllowlist =\n namesAllowlist && args[\"sandbox-config\"]\n ? parseAgentAllowlist(readSandboxConfigForNotice(args[\"sandbox-config\"]))\n : [];\n process.stdout.write(\n `${JSON.stringify(buildNoticeEnvelope(args.kind, args.reasons, agentAllowlist), null, 2)}\\n`,\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, untrusted PR conversation to triage, 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 \"default-branch\": {\n type: \"string\",\n description:\n \"The repo's default branch — the trusted base the review checks out, and the reference for the full (triage) diff; a PR based on any other branch is treated as stacked\",\n required: true,\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 defaultBranch: args[\"default-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\nconst announceCmd = defineCommand({\n meta: {\n name: \"announce\",\n description:\n \"Post (or update) the sticky the moment a review starts — an in-progress placeholder linking the run — so a workflow_run review, which runs from the default branch and is otherwise invisible on the PR, is visibly under way. Preserves a prior sticky's embedded findings + reviewed-sha markers so the re-review seed survives the swap.\",\n },\n args: {\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 \"run-url\": {\n type: \"string\",\n description: \"Workflow run URL the placeholder links to\",\n required: true,\n },\n \"bot-login\": {\n type: \"string\",\n description:\n \"Bot login to trust for the sticky comment upsert (default: github-actions[bot])\",\n },\n \"head-branch\": {\n type: \"string\",\n description: \"Head branch to disambiguate the PR when multiple share a commit\",\n },\n },\n run: async ({ args }) => {\n // Best-effort, like `react`: the in-progress sticky is cosmetic, so a transient API error must\n // warn and exit 0 rather than fail its job (the review + real comment proceed regardless).\n await announce({\n repo: args.repo,\n headSha: args[\"head-sha\"],\n botLogin: args[\"bot-login\"] || \"github-actions[bot]\",\n runUrl: args[\"run-url\"],\n headBranch: args[\"head-branch\"],\n }).catch((err: unknown) =>\n // `::warning::` so a persistently broken announce shows up in the run's annotations, not only\n // buried in the step log — `announce` otherwise reports success while having posted nothing.\n process.stderr.write(\n `::warning::code-review announce: could not post the in-progress sticky (${annotationSafe(errMsg(err))}) — continuing (cosmetic)\\n`,\n ),\n );\n },\n});\n\nconst isCheckIntent = (s: string): s is CheckIntent =>\n s === \"in_progress\" || s === \"neutral\" || s === \"failure\";\n\nconst checkRunCmd = defineCommand({\n meta: {\n name: \"check-run\",\n description:\n \"Upsert the native 'Code review' check-run on the head SHA — the attribution surface that appears in the PR's own checks list and (writing to the base repo) works for fork PRs too. `in_progress` at review start, `neutral` when the review completes, `failure` when it didn't. Forward-only: `failure` never overwrites a completed review.\",\n },\n args: {\n repo: { type: \"string\", description: \"Repository (owner/name)\", required: true },\n \"head-sha\": {\n type: \"string\",\n description: \"Head SHA the check-run is anchored to\",\n required: true,\n },\n status: {\n type: \"positional\",\n description: \"One of: in_progress, neutral, failure\",\n required: true,\n },\n \"run-url\": {\n type: \"string\",\n description: \"Workflow run URL the check-run's details link to\",\n required: true,\n },\n },\n run: async ({ args }) => {\n if (!isCheckIntent(args.status)) {\n // Best-effort like `announce`: the check-run is an attribution aid, so an unknown status (version\n // skew) warns and exits 0 rather than failing the job the review otherwise proceeds through.\n process.stderr.write(\n `::warning::code-review check-run: unrecognized status \"${annotationSafe(args.status)}\" — expected in_progress, neutral, or failure; skipping\\n`,\n );\n return;\n }\n await checkRun({\n repo: args.repo,\n headSha: args[\"head-sha\"],\n intent: args.status,\n runUrl: args[\"run-url\"],\n }).catch((err: unknown) =>\n process.stderr.write(\n `::warning::code-review check-run: could not upsert the check-run (${annotationSafe(errMsg(err))}) — continuing (attribution aid)\\n`,\n ),\n );\n },\n});\n\nconst reportIncompleteCmd = defineCommand({\n meta: {\n name: \"report-incomplete\",\n description:\n \"Post (or update) the sticky when a review job hard-failed and posted nothing — an attributed 'did not complete' notice linking the run, telling the reader to re-request. Never buries a completed review, and never overwrites a superseding run's live in-progress placeholder. (A cancelled review is left to the superseding run that took over.)\",\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 \"run-url\": {\n type: \"string\",\n description: \"Workflow run URL the notice links to\",\n required: true,\n },\n \"bot-login\": {\n type: \"string\",\n description:\n \"Bot login to trust for the sticky comment upsert (default: github-actions[bot])\",\n },\n \"head-branch\": {\n type: \"string\",\n description: \"Head branch to disambiguate the PR when multiple share a commit\",\n },\n },\n run: async ({ args }) => {\n await reportIncomplete({\n repo: args.repo,\n headSha: args[\"head-sha\"],\n botLogin: args[\"bot-login\"] || \"github-actions[bot]\",\n runUrl: args[\"run-url\"],\n headBranch: args[\"head-branch\"],\n }).catch((err: unknown) =>\n process.stderr.write(\n `::warning::code-review report-incomplete: could not post the failure notice (${annotationSafe(errMsg(err))}) — continuing\\n`,\n ),\n );\n },\n});\n\n/** Parse a `--max-duration`/ceiling flag to whole seconds; a bad value is trusted-config error, so\n * fail loudly rather than silently disabling the clamp. undefined ⇒ no ceiling. */\nconst requireCeilingSec = (raw: string | undefined): number | null => {\n if (raw === undefined) return null;\n const ms = parseWallMs(raw);\n if (ms === null)\n return fail(`--max-duration must be a duration like 60m, 3600s, or 1h (got \"${raw}\")`);\n return Math.floor(ms / 1000);\n};\n\nconst requireCeilingUsd = (raw: string | undefined): number | null => {\n if (raw === undefined) return null;\n const n = Number.parseFloat(raw.replace(/^\\$/, \"\"));\n if (!Number.isFinite(n) || n < 0) fail(`--max-usd must be a non-negative number (got \"${raw}\")`);\n return n;\n};\n\nconst requireMaxInstructions = (raw: string | undefined): number => {\n if (raw === undefined) return 4000;\n if (!/^\\d+$/.test(raw)) fail(`--max-instructions must be a non-negative integer (got \"${raw}\")`);\n return Number.parseInt(raw, 10);\n};\n\nconst requirePositiveInt = (raw: string, flag: string): number => {\n const n = Number.parseInt(raw, 10);\n return Number.isInteger(n) && n > 0 && /^\\d+$/.test(raw)\n ? n\n : fail(`${flag} must be a positive integer; got \"${raw}\"`);\n};\n\nconst requireWallMs = (raw: string | undefined, flag: string, fallback: string): number => {\n const ms = parseWallMs(raw || fallback);\n return ms === null\n ? fail(`${flag} must be a duration like 30m, 15s, or 1h (got \"${raw ?? \"\"}\")`)\n : ms;\n};\n\nconst parseCommandCmd = defineCommand({\n meta: {\n name: \"parse-command\",\n description:\n 'Resolve a PR\\'s head (SHA/branch/repo) from its NUMBER via the API and parse a ChatOps trigger comment (\"/code-review [24m] [$1.00] <instructions>\") into $GITHUB_OUTPUT lines. The untrusted comment is parsed here in type-safe code, never in workflow bash, and the head is resolved from the trusted PR number, never from the comment text. Emits should_run=false (and nothing else) when the comment is not the trigger, the PR is closed, or resolution fails.',\n },\n args: {\n repo: { type: \"string\", description: \"Repository (owner/name)\", required: true },\n pr: {\n type: \"string\",\n description: \"PR number (from github.event.issue.number — trusted event data)\",\n required: true,\n },\n \"comment-body\": {\n type: \"string\",\n description:\n \"The comment body to parse (default: the CODE_REVIEW_COMMENT_BODY env var — the safe way to pass untrusted text without shell interpolation)\",\n },\n trigger: {\n type: \"string\",\n description: 'Trigger token the comment must begin with (default: \"/code-review\")',\n },\n \"max-duration\": {\n type: \"string\",\n description:\n \"Ceiling the requested duration is clamped to (e.g. 60m); omit for no clamp — a comment could then request an unbounded wall, so set this\",\n },\n \"max-usd\": {\n type: \"string\",\n description: \"Ceiling the requested USD budget is clamped to (e.g. 5); omit for no clamp\",\n },\n \"max-instructions\": {\n type: \"string\",\n description: \"Max characters of free-form instructions kept (default: 4000)\",\n },\n },\n run: async ({ args }) => {\n const body = args[\"comment-body\"] || process.env[\"CODE_REVIEW_COMMENT_BODY\"] || \"\";\n const result = await parseCommand({\n repo: args.repo,\n prNumber: requirePositiveInt(args.pr, \"--pr\"),\n body,\n options: {\n trigger: args.trigger || \"/code-review\",\n maxDurationSec: requireCeilingSec(args[\"max-duration\"]),\n maxUsd: requireCeilingUsd(args[\"max-usd\"]),\n maxInstructionsLen: requireMaxInstructions(args[\"max-instructions\"]),\n },\n });\n if (result.kind === \"skip\") {\n process.stderr.write(`code-review parse-command: not running — ${result.reason}\\n`);\n process.stdout.write(renderCommandOutputs(result, \"UNUSED\"));\n return;\n }\n for (const note of result.args.notes)\n process.stderr.write(`code-review parse-command: ${note}\\n`);\n const delim = safeHeredocDelim(result.args.instructions, () => randomBytes(16).toString(\"hex\"));\n process.stdout.write(renderCommandOutputs(result, delim));\n },\n});\n\nconst requireReaction = (name: string): Reaction =>\n isReaction(name) ? name : fail(`Unknown reaction \"${name}\" — one of: ${REACTIONS.join(\", \")}`);\n\nconst reactCmd = defineCommand({\n meta: {\n name: \"react\",\n description:\n \"Add and/or remove a GitHub reaction on a PR/issue comment — the ChatOps acknowledgement (👀 on receipt, swapped to 🚀 on completion). Cosmetic: warns and exits 0 on any API error so a reaction never fails the job.\",\n },\n args: {\n repo: { type: \"string\", description: \"Repository (owner/name)\", required: true },\n \"comment-id\": {\n type: \"string\",\n description: \"Comment id to react on (github.event.comment.id)\",\n required: true,\n },\n add: { type: \"string\", description: `Reaction to add: ${REACTIONS.join(\" | \")}` },\n remove: {\n type: \"string\",\n description: \"Reaction (of the token owner) to remove after adding — for the 👀→🚀 swap\",\n },\n },\n run: async ({ args }) => {\n const commentId = requirePositiveInt(args[\"comment-id\"], \"--comment-id\");\n const add = args.add ? requireReaction(args.add) : undefined;\n const remove = args.remove ? requireReaction(args.remove) : undefined;\n if (add === undefined && remove === undefined)\n fail(\"react: nothing to do — pass --add and/or --remove\");\n await react({ repo: args.repo, commentId, add, remove }).catch((err: unknown) =>\n process.stderr.write(\n `code-review react: reaction update failed (${errMsg(err)}) — continuing (reactions are cosmetic)\\n`,\n ),\n );\n },\n});\n\nconst awaitCiCmd = defineCommand({\n meta: {\n name: \"await-ci\",\n description:\n \"Wait for the PR head's CI workflow run to conclude, then emit its REAL conclusion + run id to $GITHUB_OUTPUT (ci_settled, ci_conclusion, ci_run_id). The on-demand comment trigger uses this so it routes on the same CI result the CI-completion trigger would — success → full review, failure → mechanic with that run's logs — instead of reviewing blind. Polls until the run completes or the timeout elapses; ci_settled=false ⇒ no conclusive result (caller should decline to review, not guess).\",\n },\n args: {\n repo: { type: \"string\", description: \"Repository (owner/name)\", required: true },\n \"head-sha\": {\n type: \"string\",\n description: \"PR head SHA to find the CI run for (resolved from the trusted PR number)\",\n required: true,\n },\n \"ci-workflow\": {\n type: \"string\",\n description: 'CI workflow name to wait for — the name: of your CI workflow (default: \"CI\")',\n },\n timeout: {\n type: \"string\",\n description: \"Give up waiting after this wall (default: 30m)\",\n },\n \"poll-interval\": {\n type: \"string\",\n description: \"How often to re-check the run status (default: 15s)\",\n },\n },\n run: async ({ args }) => {\n const workflowName = args[\"ci-workflow\"] || \"CI\";\n const outcome = await awaitCiConclusion(args.repo, args[\"head-sha\"], {\n workflowName,\n pollIntervalMs: requireWallMs(args[\"poll-interval\"], \"--poll-interval\", \"15s\"),\n timeoutMs: requireWallMs(args.timeout, \"--timeout\", \"30m\"),\n });\n process.stderr.write(\n outcome.kind === \"concluded\"\n ? `code-review await-ci: CI run ${String(outcome.runId)} (\"${workflowName}\") concluded \"${outcome.conclusion}\"\\n`\n : `code-review await-ci: no run named \"${workflowName}\" concluded before the timeout — not reviewing.${\n outcome.seenNames.length > 0\n ? ` Workflow names seen for this head SHA: ${outcome.seenNames.join(\", \")} — check --ci-workflow matches one.`\n : \" No workflow runs were seen for this head SHA at all.\"\n }\\n`,\n );\n process.stdout.write(renderCiOutputs(outcome));\n },\n});\n\nconst sandboxConfigCmd = defineCommand({\n meta: {\n name: \"sandbox-config\",\n description:\n \"Emit the sandbox-runtime (srt) settings that jail the untrusted review agent's egress: allow the model host (derived from api_base_url), the GitHub API/host, and the consumer's extra_endpoints; deny all else; filesystem isolation off\",\n },\n args: {\n \"api-base-url\": {\n type: \"string\",\n description:\n \"The model endpoint the CLI dials (ANTHROPIC_BASE_URL) — its host is allowlisted\",\n required: true,\n },\n extra: {\n type: \"string\",\n description:\n \"Whitespace-separated host[:port] list of extra domains to allow (the extra_endpoints input)\",\n },\n out: {\n type: \"string\",\n description: \"Write the settings JSON here instead of stdout\",\n },\n },\n run: ({ args }) => {\n const config = buildSandboxConfig({ apiBaseUrl: args[\"api-base-url\"], extra: args.extra });\n const json = `${JSON.stringify(config, null, 2)}\\n`;\n if (args.out) {\n writeFileSync(resolve(args.out), json);\n } else {\n process.stdout.write(json);\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 \"parse-command\": parseCommandCmd,\n react: reactCmd,\n \"await-ci\": awaitCiCmd,\n render: renderCmd,\n inline: inlineCmd,\n post: postCmd,\n announce: announceCmd,\n \"check-run\": checkRunCmd,\n \"report-incomplete\": reportIncompleteCmd,\n cost: costCmd,\n \"check-cost\": checkCostCmd,\n validate: validateCmd,\n \"seed-draft\": seedDraftCmd,\n adapt: adaptCmd,\n notice: noticeCmd,\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 \"sandbox-config\": sandboxConfigCmd,\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/schema.ts","../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/validate.ts","../src/stop-gate.ts","../src/budget.ts","../src/format.ts","../src/notice.ts","../src/registry.ts","../src/exec.ts","../src/gh.ts","../src/pr.ts","../src/post.ts","../src/checkrun.ts","../src/command.ts","../src/react.ts","../src/ci.ts","../src/gather.ts","../src/extract.ts","../src/adapt.ts","../src/settings.ts","../src/sandbox.ts","../src/index.ts"],"names":["Eta","key","t","readFileSync","basename","join","dirname","latest","resolvePath","resolve","reviewUrl","unanchoredCount","t2","t3","t4","t5","writeFileSync","scanLine","t6","output"],"mappings":"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","file":"index.js","sourcesContent":["// 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([\n t.literal(\"approve\"),\n t.literal(\"comment\"),\n t.literal(\"changes\"),\n t.literal(\"error\"),\n]);\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 // The run produced a notice rather than a completed review (security-gate block, agent kill, no\n // recoverable findings). An empty `findings` array alone can't say this — a genuine clean review\n // is also empty — so the render suppresses \"clean review\" and the sticky precedence guard refuses\n // to bury a completed review under it. Absent ⇒ a completed review.\n incomplete: t.boolean,\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.5.0\";\n\nexport type Finding = t.TypeOf<typeof FindingCodec>;\nexport type Findings = t.TypeOf<typeof FindingsCodec>;\nexport type Verdict = t.TypeOf<typeof VerdictCodec>;\n\n// The initial $DRAFT scaffold: an empty, neutral findings doc the review agent is told to fill in. It\n// carries \"comment\" (never the pipeline-only \"error\"), so an agent that populates it and forgets to\n// touch the verdict still ships a valid review. A dead-agent recovery of this untouched scaffold is\n// caught by `adapt`'s seed-marker check, not by its verdict — so the verdict stays a plain template.\nexport const emptyFindings = (summary: string): Findings => ({\n schema_version: DEFAULT_SCHEMA_VERSION,\n summary,\n verdict: \"comment\",\n findings: [],\n});\n\n// The findings shape for a run that produced no code-review verdict — an operational failure, a\n// security refusal, or an empty diff with nothing to review. `verdict: \"error\"` is the machine-readable\n// signal that the blob a consumer decodes is NOT a clean pass (verdict \"comment\", findings []), so an\n// agent following the decode-the-JSON contract cannot mistake \"no verdict was produced\" for \"nothing\n// found\". A completed review carries approve/comment/changes.\nexport const incompleteFindings = (summary: string): Findings => ({\n schema_version: DEFAULT_SCHEMA_VERSION,\n summary,\n verdict: \"error\",\n findings: [],\n});\n\n// The one predicate for \"this findings doc is a no-verdict notice, not a completed review\", shared by\n// render and the sticky-precedence guard so the rule lives in a single place. Requires an EMPTY\n// findings array: a doc that carries real findings is a real review whatever its verdict says, so a\n// spurious \"error\" verdict alongside findings can never silently suppress them.\nexport const isIncompleteFindings = (findings: Findings): boolean =>\n findings.verdict === \"error\" && findings.findings.length === 0;\nexport type Triage = t.TypeOf<typeof TriageCodec>;\nexport type Severity = t.TypeOf<typeof SeverityCodec>;\nexport type Side = t.TypeOf<typeof SideCodec>;\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","// 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 type { SeverityCounts } from \"./types.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\n// Decode a base64-in-HTML-comment marker payload, shared by the findings + rounds markers; undefined\n// on any malformed input so callers degrade rather than throw on the render path.\nconst decodeBase64Json = (b64: string): unknown => {\n try {\n return JSON.parse(Buffer.from(b64, \"base64\").toString(\"utf-8\"));\n } catch {\n return undefined;\n }\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// A POSITIVE marker: present only in a sticky the commenter wrote for a COMPLETED review. It is\n// absent from an incomplete notice AND from an in-progress placeholder (which carries forward a prior\n// review's reviewed-sha yet is not itself a completed review) — so a precedence check can tell those\n// apart, which reviewed-sha alone (stamped on notices too) cannot. Re-emitted by the template each\n// write from the render's `incomplete` flag, never carried forward.\nexport const REVIEW_COMPLETE_MARKER = \"<!-- review-complete -->\";\nexport const parseReviewComplete = (body: string): boolean => body.includes(REVIEW_COMPLETE_MARKER);\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 b64 = /<!-- code-review:findings-json;base64 ([A-Za-z0-9+/=]+) -->/.exec(body)?.[1];\n if (b64 === undefined) return null;\n return decodeBase64Json(b64) ?? null;\n};\n\n// Per-full-review-round severity counts, carried in a base64 marker so each completed full review\n// appends its own and the sticky renders the convergence trajectory. A CI-fix mechanic pass carries it\n// forward unchanged (it is not a review round). Best-effort like the findings marker: any\n// non-conforming shape decodes to no history rather than throwing on this render path.\nconst ROUNDS_RE = /<!-- code-review:rounds;base64 ([A-Za-z0-9+/=]+) -->/;\n\n// The severity keys in descending weight/emphasis order, so every surface (counts validation, chips,\n// the convergence score) iterates them the same way from one source.\nconst SEVERITIES = [\"critical\", \"major\", \"minor\", \"nit\"] as const;\n\n// Non-negative integers only: a crafted/corrupted marker with a negative count would render as a\n// false \"clean\" chip (filtered by `> 0`), and a fractional/huge one as a garbage chip. Rejecting them\n// here drops the bad round instead of carrying it forward on every re-serialize.\nconst isSeverityCounts = (u: unknown): u is SeverityCounts =>\n typeof u === \"object\" &&\n u !== null &&\n SEVERITIES.every((k) => {\n const v = (u as Record<string, unknown>)[k];\n // isSafeInteger (not isInteger): a huge integer-valued float like 1e308 is an integer per\n // Number.isInteger, and would render a garbage `🔴1e+308` chip and re-serialize forward.\n return typeof v === \"number\" && Number.isSafeInteger(v) && v >= 0;\n });\n\nexport const parseRounds = (body: string): readonly SeverityCounts[] => {\n const b64 = ROUNDS_RE.exec(body)?.[1];\n if (b64 === undefined) return [];\n const decoded = decodeBase64Json(b64);\n // Filter, not all-or-nothing: one future-shaped or corrupted round drops only itself rather than\n // erasing the whole trajectory (post re-serializes the parsed array on every write).\n return Array.isArray(decoded) ? decoded.filter(isSeverityCounts) : [];\n};\n\nexport const roundsMarker = (rounds: readonly SeverityCounts[]): string =>\n rounds.length === 0\n ? \"\"\n : `<!-- code-review:rounds;base64 ${Buffer.from(JSON.stringify(rounds), \"utf-8\").toString(\"base64\")} -->`;\n\n// One round's chip: \"🔴4 🟠3\" for findings, \"clean\" for none.\nconst roundChip = (c: SeverityCounts): string => {\n const parts = SEVERITIES.filter((k) => c[k] > 0).map((k) => `${severityEmoji(k)}${String(c[k])}`);\n return parts.length === 0 ? \"clean\" : parts.join(\" \");\n};\n\n// The convergence line: \"**Round 3** · 🔴4 🟠3 → 🟠2 → clean\"; \"\" when there is no round history. The\n// round number is always the true count; the trajectory shows only the most recent chips (with a\n// leading \"…\" when older ones are elided) so a long-running PR's line stays readable and bounded.\nconst TRAJECTORY_CHIPS = 8;\nexport const roundsSummary = (rounds: readonly SeverityCounts[]): string => {\n if (rounds.length === 0) return \"\";\n const chips = rounds.slice(-TRAJECTORY_CHIPS).map(roundChip);\n const trajectory =\n rounds.length > TRAJECTORY_CHIPS ? `… → ${chips.join(\" → \")}` : chips.join(\" → \");\n return `**Round ${String(rounds.length)}** · ${trajectory}`;\n};\n\n// The severity-weighted convergence score and its advisory badge. The score is a pure function of one\n// round's severities; the badge is score ≤ threshold. Nits weigh 0 so the reviewer's self-replenishing\n// nit floor never blocks convergence; the threshold is the single tolerance knob (default 1: unlimited\n// nits plus at most one minor). The weights are the fixed naive scheme (design chose a fixed scheme,\n// only the threshold is user-facing). ADVISORY ONLY — this derives from the reviewer's own severities\n// and never alters the verdict; it exists so an iterating author-agent has a deterministic stop signal.\nconst CONVERGENCE_WEIGHTS: SeverityCounts = { critical: 4, major: 2, minor: 1, nit: 0 };\nexport const DEFAULT_CONVERGENCE_THRESHOLD = 1;\n\nexport const convergenceScore = (counts: SeverityCounts): number =>\n SEVERITIES.reduce((sum, k) => sum + counts[k] * CONVERGENCE_WEIGHTS[k], 0);\n\n// \"**Convergence** 🏁 1 ≤ 1 — converged\" / \"**Convergence** 🔄 2 > 1 — iterating\". The converged glyph\n// is a checkered flag, NOT the verdict badge's ✅, so a reader (or the author-agent this steers) can't\n// skim the line as an approval. Score and threshold print exactly (no lossy rounding) so the shown\n// inequality can never contradict the computed comparison — `toFixed` could display \"1 > 1.0\" for 1 > 0.95.\nexport const convergenceSummary = (\n counts: SeverityCounts,\n threshold: number = DEFAULT_CONVERGENCE_THRESHOLD,\n): string => {\n const score = convergenceScore(counts);\n return score <= threshold\n ? `**Convergence** 🏁 ${String(score)} ≤ ${String(threshold)} — converged`\n : `**Convergence** 🔄 ${String(score)} > ${String(threshold)} — iterating`;\n};\n\n// The machine-readable markers to carry forward when a comment's PROSE is replaced but its data must\n// survive — the \"review in progress\" placeholder swaps the visible summary yet must not clobber the\n// re-review seed the review job reads back from the sticky (the embedded findings + reviewed-sha), nor\n// the round-history trajectory. The findings marker is extracted verbatim so both its base64 and\n// jsonUrl-link forms survive; base64 (A–Z a–z 0–9 + / =) and URLs never contain '>', so `[^>]*` stops\n// at its closing `-->`. The STOP directive that always precedes it is re-emitted from\n// AGENTS_STOP_DIRECTIVE (its SSOT above) rather than re-matched, so a future edit to that constant\n// can't silently desync a parallel regex. Returns \"\" when the body carries none of them.\nexport const carryForwardMarkers = (body: string): string => {\n const findings = /<!-- code-review:findings-json[^>]*-->/.exec(body)?.[0];\n const reviewedSha = /<!-- reviewed-sha: [0-9a-fA-F]{40} -->/.exec(body)?.[0];\n const rounds = ROUNDS_RE.exec(body)?.[0];\n const findingsBlock = findings ? `${AGENTS_STOP_DIRECTIVE}\\n${findings}` : undefined;\n return [findingsBlock, reviewedSha, rounds]\n .filter((m): m is string => m !== undefined)\n .join(\"\\n\\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 { isIncompleteFindings } from \"./schema.js\";\nimport type { RenderInput, SeverityCounts } from \"./types.js\";\nimport { computeCost } from \"./cost.js\";\nimport {\n severityEmoji,\n findingsPointer,\n projectPatch,\n formatConfidence,\n roundsMarker,\n roundsSummary,\n convergenceSummary,\n} 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\n// The single decision \"is THIS run a convergence-defining full-review round?\" — a completed full\n// review (not a CI-fix mechanic pass, not an incomplete notice). post() calls it to decide the round\n// append AND passes the result to render() for the badge gate, so the two can never disagree; render()\n// falls back to it only for the standalone `render` command, which has no post to compute it.\nexport const isConvergenceRound = (\n route: string | null | undefined,\n incomplete: boolean,\n): boolean => route === \"full review\" && !incomplete;\n\nexport const render = (input: RenderInput): string => {\n const eta = new Eta({ autoTrim: false });\n const usageAvailable = input.envelope !== null;\n // The meta line prints turns/cost only when there is real usage to print — a present-but-zeroed\n // envelope (the synthesized notice wrap: no models) would otherwise show a false \"$0.00 · turns 0\".\n const hasUsage = input.envelope !== null && input.envelope.models.length > 0;\n // Enforce the invariant here, not just at the producers: a no-verdict notice (isIncompleteFindings)\n // is ALWAYS incomplete however it reached render (an envelope-less notice, a recovered draft), so it\n // never renders \"clean review\" or the review-complete marker.\n const incomplete =\n (input.incomplete ?? input.envelope?.incomplete ?? false) ||\n isIncompleteFindings(input.findings);\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 const severityCounts = input.severityCounts ?? computeSeverityCounts(input.findings.findings);\n const rounds = input.rounds ?? [];\n // The convergence badge is a property of a completed FULL-REVIEW round: render it only then, from\n // THIS run's counts. A CI-fix mechanic pass, a lost-envelope pass, and a notice each append no round\n // and declare no convergence verdict — a badge from the current findings would sit \"converged\" above\n // a mechanic's fresh critical, and one from a carried-forward prior round would contradict the\n // findings beside it. Neither is a truthful stop signal, so no badge shows; the carried-forward\n // trajectory alone gives context. Prefer post's explicit signal (which also gates the round append,\n // so badge ⇔ append); fall back to the shared predicate for the standalone `render` command. The\n // extra verdict guard closes an edge isIncompleteFindings misses (it flags an \"error\" verdict only\n // when findings are also empty): an error doc that carries findings must still show no badge, never\n // \"converged\" beside the \"no review verdict\" badge.\n const isFullReviewRound =\n (input.convergenceRound ?? isConvergenceRound(route, incomplete)) &&\n input.findings.verdict !== \"error\";\n\n return eta.renderString(input.template, {\n findings: input.findings,\n envelope: input.envelope,\n usageAvailable,\n hasUsage,\n incomplete,\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,\n convergenceSummary: isFullReviewRound\n ? convergenceSummary(severityCounts, input.convergenceThreshold)\n : \"\",\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 roundsMarker: roundsMarker(rounds),\n roundsSummary: roundsSummary(rounds),\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 case \"error\":\n return \"🛠️ no review verdict\";\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\n// A GitHub Actions workflow command (`::warning::…`) is single-line: a CR/LF in the message ends the\n// annotation early, and a following `::…::` in the remainder would be parsed as another command.\n// Collapse line breaks so an untrusted interpolation (e.g. `gh` stderr) can't break out of one.\nexport const annotationSafe = (msg: string): string => msg.replaceAll(/[\\r\\n]+/g, \" \");\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","// 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\n// Each axis carries its own absolute hardReserve, grown with usage so convergence lands earlier the\n// longer the run has gone. axisSeverity then only compares remaining headroom to that reserve.\ninterface Axis {\n readonly used: number;\n readonly limit: number;\n readonly hardReserve: number;\n}\n\nconst growingReserve = (used: number, limit: number, flat: number, r: ReserveParams): number => {\n const usedFrac = Math.min(1, Math.max(0, used / limit));\n return Math.max(flat, (r.frac + r.growth * usedFrac) * limit);\n};\n\nconst costAxis = (i: BudgetInputs): Axis | null =>\n i.spentUsd !== null && i.budgetUsd !== null && i.budgetUsd > 0\n ? {\n used: i.spentUsd,\n limit: i.budgetUsd,\n hardReserve: growingReserve(i.spentUsd, i.budgetUsd, i.reserve.flatUsd, i.reserve),\n }\n : null;\n\nconst timeAxis = (i: BudgetInputs): Axis | null =>\n i.elapsedMs !== null && i.wallMs !== null && i.wallMs > 0\n ? {\n used: i.elapsedMs,\n limit: i.wallMs,\n hardReserve: growingReserve(i.elapsedMs, i.wallMs, i.reserve.flatMs, i.reserve),\n }\n : null;\n\nconst axisSeverity = (a: Axis): 0 | 1 | 2 => {\n const remaining = a.limit - a.used;\n if (remaining <= a.hardReserve) return 2;\n if (remaining <= SOFT_MULTIPLE * a.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)) 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","// The notices the review workflow synthesizes when there is no completed review to post: a security\n// block (triage returned a genuine unsafe verdict), a triage that could not evaluate (an operational\n// failure, not a verdict about the diff), a setup failure before triage could run, a PR head that\n// would not check out, or a run that passed triage but emitted nothing. Their messages and the\n// \"incomplete\" envelope shape live here — one typed SSOT — rather than as jq object literals spread\n// across the workflow YAML, so the commenter renders every one honestly (no false \"clean\n// review\"/\"$0.00\", and an operational failure never reads as a security verdict about the diff) and\n// the sticky precedence guard treats them as non-completing.\n\nimport { DEFAULT_SCHEMA_VERSION, incompleteFindings } from \"./schema.js\";\nimport type { ResultEnvelope } from \"./schema.js\";\n\n// One list is the source of truth for the kind union, its runtime guard, and the CLI's kind listing,\n// so adding a kind is a single edit rather than five that can drift out of sync.\nexport const NOTICE_KINDS = [\n \"security-blocked\",\n \"triage-error\",\n \"setup-failed\",\n \"checkout-failed\",\n \"no-output\",\n] as const;\n\nexport type NoticeKind = (typeof NOTICE_KINDS)[number];\n\nexport const isNoticeKind = (s: string): s is NoticeKind => NOTICE_KINDS.some((k) => k === s);\n\n// A host is safe to name in the raw-rendered, grep-scanned summary only if it can neither break out of\n// its backtick code span (`) nor forge a comment marker (<, >) nor start a new line (\\n, \\r) or table\n// cell (|). This is a render-safety denylist, NOT a hostname grammar: it keeps legitimate but unusual\n// hosts (bracketed IPv6, IDN) a strict pattern would wrongly drop, while still neutralizing a tampered\n// sandbox.json (the agent can rewrite it — the jail confines egress, not the filesystem).\nconst UNSAFE_IN_SUMMARY = /[\\n\\r`<>|]/;\n\n// Cap how many hosts are named: a tampered config could pad allowedDomains until the rendered summary\n// blows past GitHub's 65536-char comment limit and the comment fails to post at all. A real allowlist\n// is a handful; the count is the diagnostic signal, not every entry.\nconst MAX_NAMED_HOSTS = 20;\n\n// The review agent's egress jail (sandbox-runtime) confines ONLY the agent — setup, install, and\n// gather run unfiltered. So when a jailed run produced no review, naming the jail's allowlist turns\n// \"the agent could not reach a host it needed\" into a one-line diagnosis. Pure: pulls\n// network.allowedDomains out of a parsed sandbox config, keeping only render-safe, sanely-sized host\n// strings (capped) and yielding none for any other shape (a missing config, or one before jail setup).\nexport const parseAgentAllowlist = (sandboxConfig: unknown): readonly string[] => {\n const domains = (sandboxConfig as { network?: { allowedDomains?: unknown } } | null | undefined)\n ?.network?.allowedDomains;\n return Array.isArray(domains)\n ? domains\n .filter(\n (d): d is string =>\n typeof d === \"string\" && d.length <= 256 && !UNSAFE_IN_SUMMARY.test(d),\n )\n .slice(0, MAX_NAMED_HOSTS)\n : [];\n};\n\n// Appended only to the notices where a jailed `claude -p` actually ran (no-output, triage-error), so\n// an egress-blocked host it needed is nameable against the allowlist. Framed conditionally — these\n// notices also fire for non-egress causes (a missing key, a wall-clock kill) — so it informs without\n// asserting egress was the cause. Empty allowlist ⇒ empty note.\nconst egressNote = (agentAllowlist: readonly string[]): string =>\n agentAllowlist.length === 0\n ? \"\"\n : `\\n\\nIf the review failed because the agent could not reach a host it needed, note that its network egress is jailed to only ${agentAllowlist\n .map((host) => `\\`${host}\\``)\n .join(\n \", \",\n )}. Add any missing host to the agent's egress allowlist — the reusable workflow's \\`extra_endpoints\\` input, or a single-file workflow's \\`--extra\\` flag on \\`sandbox-config\\`.`;\n\n// Blockquote every line so a multi-line reason stays quoted, not just its first line.\nconst blockquote = (text: string): string => text.replaceAll(\"\\n\", \"\\n> \");\n\n// A reason-bearing notice: when the triage supplied a detail string — a genuine unsafe verdict, or\n// the operational failure it hit — quote it under the lead; otherwise fall back to the no-reason\n// wording. The `typeof` guard fails closed on a null reason too (a JSON round-trip can yield null\n// where the type says undefined), never crashing this render path on `.trim()`.\nconst reasoned = (lead: string, noReason: string, reasons: string | undefined): string =>\n typeof reasons === \"string\" && reasons.trim() !== \"\"\n ? `${lead}\\n\\n> ${blockquote(reasons)}`\n : noReason;\n\nconst noticeSummary = (\n kind: NoticeKind,\n reasons: string | undefined,\n agentAllowlist: readonly string[],\n): string => {\n switch (kind) {\n case \"security-blocked\":\n return reasoned(\n \"### 🛑 Code review skipped by the security gate\\n\\nThe diff was flagged as unsafe to apply and execute:\",\n \"### 🛑 Code review skipped by the security gate\\n\\nThe security triage returned an unsafe verdict without a reason. See workflow logs.\",\n reasons,\n );\n case \"triage-error\":\n return (\n reasoned(\n \"### 🛠️ Security gate could not evaluate\\n\\nThe security triage could not produce a verdict (operational error), so the review failed closed — this is an infrastructure failure, not a finding about this diff. Re-run to retry a transient fault; a persistent one is a configuration issue (see the workflow logs). The triage step reported:\",\n \"### 🛠️ Security gate could not evaluate\\n\\nThe security triage could not produce a verdict (operational error), so the review failed closed — this is an infrastructure failure, not a finding about this diff. Re-run to retry a transient fault; a persistent one is a configuration issue (see the workflow logs).\",\n reasons,\n ) + egressNote(agentAllowlist)\n );\n case \"setup-failed\":\n return \"### 🛠️ Review did not run\\n\\nThe review job failed before the security triage could run (e.g. dependency install or environment setup). See the workflow logs — this is an infrastructure failure, not a security verdict.\";\n case \"checkout-failed\":\n return \"### ⚠️ Could not check out the PR head\\n\\nThe PR head commit could not be fetched or checked out (it may have been force-pushed away, or is otherwise unavailable), so the review was skipped rather than run against the wrong tree. See workflow logs.\";\n case \"no-output\":\n return (\n \"### ⚠️ Review did not complete\\n\\nThe diff passed triage but the review produced no output. See workflow logs.\" +\n egressNote(agentAllowlist)\n );\n }\n};\n\nconst noticeEnvelope = (summary: string): ResultEnvelope => ({\n schema_version: DEFAULT_SCHEMA_VERSION,\n findings: incompleteFindings(summary),\n models: [],\n turns: 0,\n duration_ms: 0,\n vendor_cost_usd: null,\n incomplete: true,\n});\n\nexport const buildNoticeEnvelope = (\n kind: NoticeKind,\n reasons?: string,\n agentAllowlist: readonly string[] = [],\n): ResultEnvelope => noticeEnvelope(noticeSummary(kind, reasons, agentAllowlist));\n\n// A workflow that asks for a kind this CLI does not know is almost always version skew — the pinned\n// CLI is older than the workflow calling it. Degrade to an honest incomplete envelope that names the\n// cause rather than exiting non-zero and crashing the assemble step into posting nothing at all.\nexport const buildUnknownNoticeEnvelope = (kind: string): ResultEnvelope =>\n noticeEnvelope(\n `### ⚠️ Review could not be rendered\\n\\nThe workflow asked for an unrecognized notice kind (\\`${kind}\\`) — the pinned code-review CLI is older than the workflow calling it (check that its version matches). Failing closed. See the workflow logs.`,\n );\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\n// 0.5 widened the verdict enum with the pipeline-only \"error\" value — a backwards-compatible addition,\n// so a 0.4 document is still a valid 0.5 document and resolves through the same widened codec against\n// the flat (now-0.5) schema with an identity upcast. This differs from the dropped 0.2/0.3 minors,\n// which could NOT be honestly upcast (they lacked the required reasoning/confidence). Keeping 0.4 live\n// means a prior sticky embedded by a 0.4 CLI still seeds a re-review after this ships.\nconst findingsTable: readonly VersionEntry<\"findings\", Findings>[] = [\n {\n minor: \"0.4\",\n defaultVersion: \"0.4.0\",\n schemaFile: \"findings.schema.json\",\n codec: FindingsCodec,\n normalize: identity,\n latest: false,\n },\n {\n minor: \"0.5\",\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 child-process boundary for the external CLIs (`gh`, `git`); pure callers inject fakes.\n\nimport { execFile } from \"node:child_process\";\nimport { errMsg } from \"./util.js\";\n\nconst MAX_BUFFER = 100 * 1024 * 1024;\n\n// Node's child_process `timeout` is a `setTimeout` under the hood, which clamps any delay above the\n// signed-32-bit maximum to 1ms — an over-large override would paradoxically kill every call almost\n// instantly. Honor a large-but-valid ceiling; treat an out-of-range value as invalid (fall back).\nconst MAX_TIMEOUT_MS = 2_147_483_647;\n\n// `/^\\d+$/` matches the codebase's other numeric-env parsers (requireMaxNudges, requirePositiveInt):\n// it rejects the surprising forms `Number` would coerce (`\"0.5\"` → 0.5ms, `\"0x10\"`, `\"3e5\"`).\nexport const parseTimeoutMs = (raw: string | undefined, fallback: number): number => {\n if (raw === undefined || !/^\\d+$/.test(raw)) return fallback;\n const parsed = Number(raw);\n return parsed > 0 && parsed <= MAX_TIMEOUT_MS ? parsed : fallback;\n};\n\nconst SUBPROCESS_TIMEOUT_ENV = \"CODE_REVIEW_SUBPROCESS_TIMEOUT_MS\";\nconst DEFAULT_SUBPROCESS_TIMEOUT_MS = 120_000;\n\nexport const subprocessTimeoutMs = (): number =>\n parseTimeoutMs(process.env[SUBPROCESS_TIMEOUT_ENV], DEFAULT_SUBPROCESS_TIMEOUT_MS);\n\n// A child that outlives the timeout is killed via SIGKILL, and `maxBuffer` overflow kills it too;\n// both surface as `killed`, so name which one fired (and fall back to the child's own stderr/error)\n// rather than blame a timeout for an overflow.\nexport const classifyExecError = (err: unknown, stderr: string, timeoutMs: number): string => {\n const e = err as { killed?: boolean; code?: unknown };\n const stderrStr = stderr.trim();\n if (e.code === \"ERR_CHILD_PROCESS_STDIO_MAXBUFFER\")\n return `output exceeded ${String(MAX_BUFFER)} bytes (killed)`;\n // `killed` is set for any signal (the timeout SIGKILL, or an external one), so keep the child's own\n // stderr when it left some — an externally-killed child is still diagnosable from its output.\n if (e.killed === true)\n return `no response within ${String(timeoutMs)}ms (killed a hung child)${stderrStr ? `: ${stderrStr}` : \"\"}`;\n return stderrStr || errMsg(err);\n};\n\nexport type ExecSpec = {\n readonly command: string;\n readonly args: readonly string[];\n readonly label: string;\n readonly timeoutMs: number;\n readonly env?: Readonly<Record<string, string>>;\n readonly stdin?: string;\n};\n\n// A wedged external CLI (a stalled network read, an interactive auth/pager prompt that never\n// returns) would otherwise hang the whole job until the workflow's own wall clock fires. `env` is\n// spread over the inherited environment only when overrides are supplied; untrusted values reach the\n// child via `env.NAME`, never interpolated into a command.\nexport const execFileWithTimeout = (spec: ExecSpec): Promise<string> =>\n new Promise<string>((resolve, reject) => {\n const child = execFile(\n spec.command,\n [...spec.args],\n {\n ...(spec.env ? { env: { ...process.env, ...spec.env } } : {}),\n encoding: \"utf-8\",\n maxBuffer: MAX_BUFFER,\n timeout: spec.timeoutMs,\n killSignal: \"SIGKILL\",\n },\n (err, stdout, stderr) => {\n if (err)\n reject(\n new Error(`${spec.label} failed: ${classifyExecError(err, stderr, spec.timeoutMs)}`),\n );\n else resolve(stdout);\n },\n );\n if (spec.stdin !== undefined) {\n // A SIGKILLed child (timeout/maxBuffer) can tear down its stdin mid-write; without this handler\n // the resulting EPIPE would crash the process instead of letting the promise reject.\n child.stdin?.on(\"error\", () => undefined);\n child.stdin?.end(spec.stdin);\n }\n });\n","// The single GitHub-API shell boundary; pure callers inject a fake GhApi.\n\nimport { execFileWithTimeout, subprocessTimeoutMs } from \"./exec.js\";\n\nexport type GhApi = (\n args: readonly string[],\n stdin?: string,\n env?: Readonly<Record<string, string>>,\n) => Promise<string>;\n\n// The endpoint for the error message: `graphql`, or the first path-shaped arg (a REST endpoint always\n// contains a `/`), so a swallowed 403 names WHICH call failed even for `--method POST <path>` forms\n// where the path is not args[0]. Falls back to args[0] for the pathological no-path case.\nexport const describeEndpoint = (args: readonly string[]): string =>\n args.find((a) => a === \"graphql\" || (a.includes(\"/\") && !a.startsWith(\"-\"))) ??\n args[0] ??\n \"(no endpoint)\";\n\nexport const runGhApi: GhApi = (args, stdin, env) =>\n execFileWithTimeout({\n command: \"gh\",\n args: [\"api\", ...args],\n label: `gh api ${describeEndpoint(args)}`,\n timeoutMs: subprocessTimeoutMs(),\n env,\n stdin,\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\";\nimport { parseJsonl } from \"./transcript.js\";\n\ninterface PrCandidate {\n readonly number: number;\n readonly state: string;\n readonly headRef: string;\n readonly headSha: string;\n}\n\nconst CANDIDATE_JQ =\n \".[] | {number: .number, state: .state, headRef: .head.ref, headSha: .head.sha}\";\n\nconst parseCandidates = (stdout: string): readonly PrCandidate[] =>\n parseJsonl(stdout) as readonly PrCandidate[];\n\n// A fork PR's head commit lives on the fork, unreachable from the base repo, so\n// `commits/{sha}/pulls` returns nothing for it. Fall back to matching head.sha across open PRs,\n// which does reach forks. The commit endpoint stays the primary path: it is a targeted O(1)\n// lookup and resolves same-repo PRs even when head.sha has since advanced past the CI commit.\n//\n// The primary is treated as advisory: a fork head SHA absent from the base repo can 403 (not just\n// return empty) on a read-scoped token, which is exactly when the fork listing is needed — so a\n// throwing primary falls through the same way an empty one does. A genuine permission gap then\n// surfaces on the listing call (named by ghApi), never swallowed silently here.\nconst fetchDirectCandidates = async (\n repo: string,\n headSha: string,\n ghApi: GhApi,\n): Promise<readonly PrCandidate[]> => {\n try {\n return parseCandidates(\n await ghApi([`repos/${repo}/commits/${headSha}/pulls`, \"--jq\", CANDIDATE_JQ]),\n );\n } catch {\n return [];\n }\n};\n\nexport const fetchPrCandidates = async (\n repo: string,\n headSha: string,\n ghApi: GhApi,\n): Promise<readonly PrCandidate[]> => {\n const direct = await fetchDirectCandidates(repo, headSha, ghApi);\n if (direct.length > 0) return direct;\n const open = parseCandidates(\n await ghApi([\n `repos/${repo}/pulls?state=open&per_page=100`,\n \"--paginate\",\n \"--jq\",\n CANDIDATE_JQ,\n ]),\n );\n return open.filter((c) => c.headSha === headSha);\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.find((c) => c.state === \"open\") ?? 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, isConvergenceRound } from \"./render.js\";\nimport { formatMarkdown } from \"./format.js\";\nimport {\n carryForwardMarkers,\n findingsPointer,\n parseReviewComplete,\n parseReviewedSha,\n parseRounds,\n reviewBodyPointer,\n} from \"./surface.js\";\nimport {\n ResultEnvelopeCodec,\n PriceMapCodec,\n TestSummaryCodec,\n incompleteFindings,\n isIncompleteFindings,\n} 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 // Advisory convergence tolerance passed through to render(); omitted ⇒ the render default.\n readonly convergenceThreshold?: number;\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 // An incomplete result (a notice, not a completed review) must never overwrite a sticky that\n // already shows a completed review — else a superseded/killed/late run buries a real review under a\n // \"did not complete\" that reads as a clean pass. A completed result always writes; an in-progress\n // placeholder is not \"complete\" (it lacks the marker), so its own commenter may still write.\n const existingComplete = existingSticky !== null && parseReviewComplete(existingSticky.body);\n const wouldBuryCompleted = (incomplete: boolean): boolean => incomplete && existingComplete;\n\n // The full-review convergence history carried in the sticky's marker (it survives the announce\n // placeholder via carryForwardMarkers). A completed FULL review appends this run's counts below; a\n // CI-fix mechanic pass and every notice carry it forward unchanged so the trajectory is never lost.\n const priorRounds = existingSticky !== null ? parseRounds(existingSticky.body) : [];\n const leaveInPlace = (): void => {\n process.stderr.write(\n `Review did not complete and the sticky already reflects a completed review — leaving it in place\\n`,\n );\n process.exit(0);\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: incompleteFindings(`### ⚠️ ${message}`),\n envelope: null,\n incomplete: true,\n prices: decodedPrices.right,\n pricesProvided: input.pricesProvided,\n template,\n route: input.route,\n reviewedSha: input.headSha,\n effort: input.effort,\n rounds: priorRounds,\n convergenceRound: false,\n runUrl: input.runUrl,\n jsonUrl: input.jsonUrl,\n postedAt: input.postedAt,\n }),\n );\n\n if (isEmptyDiff(diff)) {\n if (wouldBuryCompleted(true)) leaveInPlace();\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 if (wouldBuryCompleted(true)) leaveInPlace();\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 // The envelope carried the incomplete flag; with it lost, derive incompleteness from the verdict\n // (render does the same) so an error-verdict findings doc here still reads as a notice and — via\n // the guard below — can't bury a completed review, which this branch previously skipped.\n const envelopelessIncomplete = isIncompleteFindings(findings);\n if (wouldBuryCompleted(envelopelessIncomplete)) leaveInPlace();\n const body = formatMarkdown(\n render({\n findings,\n envelope: null,\n incomplete: envelopelessIncomplete,\n prices: decodedPrices.right,\n pricesProvided: input.pricesProvided,\n template,\n route: input.route,\n reviewedSha: input.headSha,\n effort: input.effort,\n rounds: priorRounds,\n convergenceRound: false,\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 // A completed review carries real telemetry; adapt (and the workflow's notice wrap) flag a run that\n // produced only a notice. Don't let such a notice bury an existing completed review or post a stray\n // empty inline review over it — leave the real review in place.\n const thisIncomplete = envelope.incomplete === true || isIncompleteFindings(findings);\n if (wouldBuryCompleted(thisIncomplete)) leaveInPlace();\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 currentCounts = computeSeverityCounts(findings.findings);\n\n // A convergence round is a COMPLETED FULL review. The route lives in the envelope (the review job\n // stamps it; `post` is not passed --route in the workflow), so read the effective route the same way\n // render does — `input.route` first, then the envelope — or the feature never grows a round in\n // production. A mechanic pass or any incomplete/failed run carries the trajectory forward unchanged\n // (it is a CI fix or a non-review, not a round). A same-head CI retry simply appends again — an\n // identical chip reads as \"no change\", which is accurate; a reviewed-sha-keyed replace is unsafe\n // because a mechanic stamps a new head without adding a round, so the last round need not be its head.\n const effectiveRoute = input.route ?? envelope.route;\n const isRound = isConvergenceRound(effectiveRoute, thisIncomplete);\n const rounds = isRound ? [...priorRounds, currentCounts] : priorRounds;\n\n const commonRenderInput: Omit<RenderInput, \"inlineDisposition\" | \"reviewUrl\"> = {\n findings,\n envelope,\n incomplete: thisIncomplete,\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: currentCounts,\n rounds,\n convergenceThreshold: input.convergenceThreshold,\n convergenceRound: isRound,\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\nexport interface AnnounceInput {\n readonly repo: string;\n readonly headSha: string;\n readonly botLogin: string;\n readonly runUrl: string;\n readonly headBranch?: string;\n}\n\n// The placeholder body: the sticky marker, a \"review in progress\" line linking the run, and — when a\n// prior sticky exists — its machine-readable markers carried forward verbatim, so replacing the\n// summary prose never strips the re-review seed the review job reads back (embedded findings +\n// reviewed-sha). The commenter job overwrites this with the real summary when the review completes.\nconst announceBody = (\n headSha: string,\n runUrl: string,\n existingBody: string | undefined,\n): string => {\n const notice = `${DEFAULT_MARKER}\\n\\n🔄 **Code review in progress** for \\`${headSha.slice(0, 7)}\\` — see the [workflow run](${runUrl}) for progress; this comment is updated with the review when it completes.`;\n const carried = existingBody ? carryForwardMarkers(existingBody) : \"\";\n return carried ? `${notice}\\n\\n${carried}` : notice;\n};\n\n// Post (or update) the sticky the moment a review starts, so a workflow_run review — which runs from\n// the default branch and is otherwise invisible on the PR — is visibly under way. Shares post's PR\n// resolution and sticky upsert; the review job holds no write token, so it can't do this itself.\nexport const announce = async (input: AnnounceInput, ghApi: GhApi = runGhApi): Promise<void> => {\n const candidates = await fetchPrCandidates(input.repo, input.headSha, ghApi);\n const resolution = resolvePr(candidates, input.headBranch);\n if (resolution.kind !== \"open\") {\n process.stderr.write(\n `No open PR for ${input.headSha} — nothing to announce (${resolution.kind})\\n`,\n );\n return;\n }\n const existing = await findBotComment(\n input.repo,\n resolution.prNumber,\n input.botLogin,\n DEFAULT_MARKER,\n ghApi,\n );\n // If the sticky already reflects a COMPLETED review OF THIS HEAD, leave it — overwriting it with the\n // in-progress placeholder would hide a finished review (a CI re-run of an already-reviewed commit,\n // or the review+comment pipeline racing ahead of this job). Both conditions matter: a same-head\n // INCOMPLETE notice (which also stamps reviewed-sha) must be replaced by the placeholder on a re-run,\n // and a prior head's sha still gets replaced regardless. `review-complete` is the discriminator the\n // commenter guard uses too, so both write paths agree on what \"completed\" means.\n if (\n existing !== null &&\n parseReviewComplete(existing.body) &&\n parseReviewedSha(existing.body) === input.headSha.toLowerCase()\n ) {\n process.stderr.write(\n `Sticky already reflects a completed review of ${input.headSha} — leaving it in place\\n`,\n );\n return;\n }\n await upsertSticky(\n input.repo,\n resolution.prNumber,\n existing,\n announceBody(input.headSha, input.runUrl, existing?.body),\n ghApi,\n );\n};\n\nconst incompleteBody = (\n headSha: string,\n runUrl: string,\n existingBody: string | undefined,\n): string => {\n const notice = `${DEFAULT_MARKER}\\n\\n⚠️ **Code review did not complete** for \\`${headSha.slice(0, 7)}\\` — the review job failed ([run](${runUrl})). Re-request the review; do not treat this round as spent.`;\n const carried = existingBody ? carryForwardMarkers(existingBody) : \"\";\n return carried ? `${notice}\\n\\n${carried}` : notice;\n};\n\n// The human-readable half of failure attribution (the check-run is the machine half): a review that\n// died leaves NO comment, so a separate always()-job posts this. Shares announce's PR resolution and\n// sticky upsert; the guard is stronger — it never buries a completed review OF ANY head, so a failed\n// run reporting late (after a superseding run already finished) can't clobber the real review.\nexport const reportIncomplete = async (\n input: AnnounceInput,\n ghApi: GhApi = runGhApi,\n): Promise<void> => {\n const candidates = await fetchPrCandidates(input.repo, input.headSha, ghApi);\n const resolution = resolvePr(candidates, input.headBranch);\n if (resolution.kind !== \"open\") {\n process.stderr.write(\n `No open PR for ${input.headSha} — nothing to report (${resolution.kind})\\n`,\n );\n return;\n }\n const existing = await findBotComment(\n input.repo,\n resolution.prNumber,\n input.botLogin,\n DEFAULT_MARKER,\n ghApi,\n );\n if (existing !== null && parseReviewComplete(existing.body)) {\n process.stderr.write(`Sticky already reflects a completed review — leaving it in place\\n`);\n return;\n }\n // The sticky exists but is NOT this run's own placeholder — it belongs to a superseding run whose\n // announce already posted a live \"in progress\" for a newer head. Overwriting it with \"did not\n // complete\" would be a false alarm for a review that is actively running. This run's own placeholder\n // (or a prior failure notice this run posted) embeds this run's URL, so its presence is the signal\n // that overwriting is safe.\n if (existing !== null && !existing.body.includes(input.runUrl)) {\n process.stderr.write(`Sticky belongs to another run — leaving it in place\\n`);\n return;\n }\n await upsertSticky(\n input.repo,\n resolution.prNumber,\n existing,\n incompleteBody(input.headSha, input.runUrl, existing?.body),\n ghApi,\n );\n};\n","// A native check-run on the PR head SHA is the attribution surface #115 asks for: it shows in the\n// PR's own checks list, correlates by construction (it IS on the SHA), and — because the review runs\n// from the base repo's default branch with a write token — works for fork PRs too, whose head commit\n// is reachable in the base repo via the PR ref. The in-progress check is created at review start (the\n// announce job, in its own concurrency group) so it survives a superseding run's cancellation. A\n// completed review finalizes it `neutral` (non-gating); a hard-failed review finalizes it `failure`;\n// a cancelled review leaves its in-progress check intact, so the superseding run that took over keeps\n// the SHA attributed rather than a false failure being stamped on it.\n\nimport type { GhApi } from \"./gh.js\";\nimport { runGhApi } from \"./gh.js\";\nimport { parseJsonl } from \"./transcript.js\";\n\nexport const CHECK_RUN_NAME = \"Code review\";\n\nexport type CheckIntent = \"in_progress\" | \"neutral\" | \"failure\";\n\nexport interface ExistingCheck {\n readonly id: number;\n readonly status: string;\n readonly conclusion: string | null;\n}\n\n// Forward-only across the two writers (comment finalizes `neutral`, attribute_failure finalizes\n// `failure`) that can race on a same-SHA re-run: a completed review is the truth, so `failure` never\n// overwrites a completed `neutral`/`success`, and `in_progress` never re-opens a finished check.\nexport type CheckAction =\n | { readonly kind: \"noop\"; readonly reason: string }\n | {\n readonly kind: \"create\";\n readonly status: \"in_progress\" | \"completed\";\n readonly conclusion?: string;\n }\n | {\n readonly kind: \"patch\";\n readonly id: number;\n readonly status: \"completed\";\n readonly conclusion: string;\n };\n\nconst latest = (checks: readonly ExistingCheck[]): ExistingCheck | null =>\n checks.reduce<ExistingCheck | null>(\n (best, c) => (best === null || c.id > best.id ? c : best),\n null,\n );\n\nconst isOpen = (status: string): boolean => status === \"in_progress\" || status === \"queued\";\nconst settled = new Set([\"success\", \"neutral\", \"skipped\"]);\n\nexport const decideCheckAction = (\n checks: readonly ExistingCheck[],\n intent: CheckIntent,\n): CheckAction => {\n const head = latest(checks);\n switch (intent) {\n case \"in_progress\":\n return head !== null && isOpen(head.status)\n ? { kind: \"noop\", reason: \"a check is already in progress for this head\" }\n : { kind: \"create\", status: \"in_progress\" };\n case \"neutral\":\n if (head === null) return { kind: \"create\", status: \"completed\", conclusion: \"neutral\" };\n return head.status === \"completed\" && head.conclusion === \"neutral\"\n ? { kind: \"noop\", reason: \"the check already records this completed review\" }\n : { kind: \"patch\", id: head.id, status: \"completed\", conclusion: \"neutral\" };\n case \"failure\":\n if (head === null) return { kind: \"create\", status: \"completed\", conclusion: \"failure\" };\n if (head.status === \"completed\" && head.conclusion !== null && settled.has(head.conclusion))\n return { kind: \"noop\", reason: \"a completed review already recorded this head\" };\n return head.status === \"completed\" && head.conclusion === \"failure\"\n ? { kind: \"noop\", reason: \"the check already records this failure\" }\n : { kind: \"patch\", id: head.id, status: \"completed\", conclusion: \"failure\" };\n }\n};\n\nconst CHECK_JQ = \".check_runs[] | {id: .id, status: .status, conclusion: .conclusion}\";\n\nconst fetchChecks = async (\n repo: string,\n headSha: string,\n ghApi: GhApi,\n): Promise<readonly ExistingCheck[]> =>\n parseJsonl(\n await ghApi([\n `repos/${repo}/commits/${headSha}/check-runs?check_name=${encodeURIComponent(CHECK_RUN_NAME)}&per_page=100`,\n \"--paginate\",\n \"--jq\",\n CHECK_JQ,\n ]),\n ) as readonly ExistingCheck[];\n\nconst output = (intent: CheckIntent, runUrl: string): { title: string; summary: string } => {\n switch (intent) {\n case \"in_progress\":\n return {\n title: \"Code review in progress\",\n summary: `The review is running — [see the run](${runUrl}).`,\n };\n case \"neutral\":\n return {\n title: \"Code review complete\",\n summary: `The review was posted — [see the run](${runUrl}).`,\n };\n case \"failure\":\n return {\n title: \"Code review did not complete\",\n summary: `The review job failed — [see the run](${runUrl}). Re-request the review; do not treat this round as spent.`,\n };\n }\n};\n\nexport interface CheckRunInput {\n readonly repo: string;\n readonly headSha: string;\n readonly intent: CheckIntent;\n readonly runUrl: string;\n}\n\n// Resolve the current check, decide the forward-only action, then apply it. Head SHA (not the PR) is\n// the whole key — no PR resolution needed, which is why this also works for fork PRs.\nexport const checkRun = async (input: CheckRunInput, ghApi: GhApi = runGhApi): Promise<void> => {\n const action = decideCheckAction(\n await fetchChecks(input.repo, input.headSha, ghApi),\n input.intent,\n );\n if (action.kind === \"noop\") {\n process.stderr.write(`code-review check-run: ${action.reason} — leaving it\\n`);\n return;\n }\n const body =\n action.kind === \"create\"\n ? {\n name: CHECK_RUN_NAME,\n head_sha: input.headSha,\n status: action.status,\n details_url: input.runUrl,\n ...(action.conclusion ? { conclusion: action.conclusion } : {}),\n output: output(input.intent, input.runUrl),\n }\n : {\n status: action.status,\n conclusion: action.conclusion,\n details_url: input.runUrl,\n output: output(input.intent, input.runUrl),\n };\n const endpoint =\n action.kind === \"create\"\n ? [`--method`, `POST`, `repos/${input.repo}/check-runs`, `--input`, `-`]\n : [\n `--method`,\n `PATCH`,\n `repos/${input.repo}/check-runs/${String(action.id)}`,\n `--input`,\n `-`,\n ];\n await ghApi(endpoint, JSON.stringify(body));\n};\n","// Parses a ChatOps trigger comment (\"/code-review [24m] [$1.00] <instructions>\") into structured\n// review overrides, and resolves the PR head from the comment's PR NUMBER via the API (never from a\n// SHA in the comment). The untrusted comment is parsed here, in type-safe code, not in workflow bash.\n\nimport * as t from \"io-ts\";\nimport type { GhApi } from \"./gh.js\";\nimport { runGhApi } from \"./gh.js\";\n\nexport interface CommandArgs {\n // null ⇒ the commenter did not specify it; the reusable workflow keeps its configured default.\n readonly durationSec: number | null;\n readonly usd: number | null;\n readonly instructions: string;\n // Human-readable adjustments (a clamp hit, a truncation) for the CI log — the sticky footer shows\n // the values actually used, so these are diagnostics, not the user-facing signal.\n readonly notes: readonly string[];\n}\n\nexport type CommandParse =\n { readonly kind: \"not-a-command\" } | { readonly kind: \"command\"; readonly args: CommandArgs };\n\nexport interface ParseOptions {\n readonly trigger: string;\n // null ⇒ no clamp (a comment could then request an unbounded wall/budget — callers set a ceiling).\n readonly maxDurationSec: number | null;\n readonly maxUsd: number | null;\n readonly maxInstructionsLen: number;\n}\n\nconst DURATION_RE = /^(\\d+)(h|m|s)$/;\nconst USD_RE = /^\\$(\\d+(?:\\.\\d+)?)$/;\n\nconst toSeconds = (n: number, unit: string): number =>\n unit === \"h\" ? n * 3600 : unit === \"m\" ? n * 60 : n;\n\n// null when the body does not begin with the trigger as a WHOLE token (so \"/code-reviewer\" is not a\n// hit); otherwise the remainder after the trigger, leading whitespace and all.\nconst stripTrigger = (body: string, trigger: string): string | null => {\n const trimmed = body.replace(/^\\s+/, \"\");\n if (!trimmed.startsWith(trigger)) return null;\n const after = trimmed.slice(trigger.length);\n return after === \"\" || /^\\s/.test(after) ? after : null;\n};\n\n// Consume leading whitespace-delimited tokens that are a duration or a dollar amount (each at most\n// once, either order); stop at the first token that is neither (or a duplicate). The untouched\n// remainder — from that token on, its own leading whitespace included — is the instructions.\nconst scanLeading = (\n s: string,\n acc: { readonly durationSec: number | null; readonly usd: number | null },\n): { readonly durationSec: number | null; readonly usd: number | null; readonly rest: string } => {\n const m = /^(\\s*)(\\S+)([\\s\\S]*)$/.exec(s);\n if (m === null) return { ...acc, rest: \"\" };\n const [, , token = \"\", tail = \"\"] = m;\n const dm = DURATION_RE.exec(token);\n if (dm && acc.durationSec === null)\n return scanLeading(tail, {\n ...acc,\n durationSec: toSeconds(Number.parseInt(dm[1] ?? \"\", 10), dm[2] ?? \"s\"),\n });\n const um = USD_RE.exec(token);\n if (um && acc.usd === null)\n return scanLeading(tail, { ...acc, usd: Number.parseFloat(um[1] ?? \"\") });\n return { ...acc, rest: s };\n};\n\nconst clampDuration = (\n requested: number | null,\n ceiling: number | null,\n): { readonly value: number | null; readonly notes: readonly string[] } =>\n requested !== null && ceiling !== null && requested > ceiling\n ? {\n value: ceiling,\n notes: [\n `requested duration ${String(requested)}s exceeds the ${String(ceiling)}s ceiling — clamped to ${String(ceiling)}s`,\n ],\n }\n : { value: requested, notes: [] };\n\nconst clampUsd = (\n requested: number | null,\n ceiling: number | null,\n): { readonly value: number | null; readonly notes: readonly string[] } =>\n requested !== null && ceiling !== null && requested > ceiling\n ? {\n value: ceiling,\n notes: [\n `requested $${requested.toFixed(2)} exceeds the $${ceiling.toFixed(2)} ceiling — clamped to $${ceiling.toFixed(2)}`,\n ],\n }\n : { value: requested, notes: [] };\n\nconst capInstructions = (\n text: string,\n maxLen: number,\n): { readonly value: string; readonly notes: readonly string[] } =>\n text.length > maxLen\n ? {\n value: text.slice(0, maxLen),\n notes: [\n `instructions truncated from ${String(text.length)} to ${String(maxLen)} characters`,\n ],\n }\n : { value: text, notes: [] };\n\nexport const parseCommandArgs = (body: string, options: ParseOptions): CommandParse => {\n const afterTrigger = stripTrigger(body, options.trigger);\n if (afterTrigger === null) return { kind: \"not-a-command\" };\n const scan = scanLeading(afterTrigger, { durationSec: null, usd: null });\n const duration = clampDuration(scan.durationSec, options.maxDurationSec);\n const usd = clampUsd(scan.usd, options.maxUsd);\n const instructions = capInstructions(scan.rest.trim(), options.maxInstructionsLen);\n return {\n kind: \"command\",\n args: {\n durationSec: duration.value,\n usd: usd.value,\n instructions: instructions.value,\n notes: [...duration.notes, ...usd.notes, ...instructions.notes],\n },\n };\n};\n\nconst PrHeadCodec = t.type({\n head_sha: t.string,\n head_ref: t.string,\n head_repo: t.union([t.string, t.null]),\n state: t.string,\n});\n\nexport const resolvePrHead = async (\n repo: string,\n prNumber: number,\n ghApi: GhApi,\n): Promise<t.TypeOf<typeof PrHeadCodec>> => {\n const stdout = await ghApi([\n `repos/${repo}/pulls/${String(prNumber)}`,\n \"--jq\",\n \"{head_sha: .head.sha, head_ref: .head.ref, head_repo: .head.repo.full_name, state: .state}\",\n ]);\n const decoded = PrHeadCodec.decode(JSON.parse(stdout) as unknown);\n if (decoded._tag === \"Left\") {\n throw new Error(`PR head for #${String(prNumber)} did not match the expected shape`);\n }\n return decoded.right;\n};\n\nexport interface CommandInput {\n readonly repo: string;\n readonly prNumber: number;\n readonly body: string;\n readonly options: ParseOptions;\n}\n\nexport type CommandResult =\n | { readonly kind: \"skip\"; readonly reason: string }\n | {\n readonly kind: \"run\";\n readonly headSha: string;\n readonly headBranch: string;\n readonly headRepo: string;\n readonly args: CommandArgs;\n };\n\nexport const parseCommand = async (\n input: CommandInput,\n ghApi: GhApi = runGhApi,\n): Promise<CommandResult> => {\n const parse = parseCommandArgs(input.body, input.options);\n if (parse.kind === \"not-a-command\") {\n return {\n kind: \"skip\",\n reason: `comment does not begin with the trigger \"${input.options.trigger}\"`,\n };\n }\n const head = await resolvePrHead(input.repo, input.prNumber, ghApi).catch((err: unknown) =>\n err instanceof Error ? err : new Error(String(err)),\n );\n if (head instanceof Error) {\n return {\n kind: \"skip\",\n reason: `could not resolve PR #${String(input.prNumber)}: ${head.message}`,\n };\n }\n if (head.state !== \"open\") {\n return {\n kind: \"skip\",\n reason: `PR #${String(input.prNumber)} is not open (state: ${head.state})`,\n };\n }\n return {\n kind: \"run\",\n headSha: head.head_sha,\n headBranch: head.head_ref,\n headRepo: head.head_repo ?? input.repo,\n args: parse.args,\n };\n};\n\n// A heredoc delimiter guaranteed not to equal any line of the (untrusted) instructions, so the value\n// can't break out of its $GITHUB_OUTPUT block and forge later outputs (e.g. should_run=true). A\n// 128-bit random tag never collides in practice; the bounded recursion is belt-and-braces.\nexport const safeHeredocDelim = (\n instructions: string,\n randomHex: () => string,\n attemptsLeft = 8,\n): string => {\n const candidate = `GHOUT_${randomHex()}`;\n if (!instructions.split(\"\\n\").includes(candidate)) return candidate;\n if (attemptsLeft <= 0) throw new Error(\"could not derive a collision-free heredoc delimiter\");\n return safeHeredocDelim(instructions, randomHex, attemptsLeft - 1);\n};\n\nexport const renderCommandOutputs = (result: CommandResult, delim: string): string => {\n if (result.kind === \"skip\") return \"should_run=false\\n\";\n const { headSha, headBranch, headRepo, args } = result;\n return `${[\n \"should_run=true\",\n `head_sha=${headSha}`,\n `head_branch=${headBranch}`,\n `head_repo=${headRepo}`,\n `duration=${args.durationSec === null ? \"\" : `${String(args.durationSec)}s`}`,\n `usd=${args.usd === null ? \"\" : args.usd.toFixed(2)}`,\n `instructions<<${delim}`,\n args.instructions,\n delim,\n ].join(\"\\n\")}\\n`;\n};\n","// Manages the ChatOps acknowledgement reaction on a PR/issue comment: 👀 on receipt, swapped to 🚀\n// (or 😕) on completion. Reactions are cosmetic, so the CLI wrapper never fails a job over them.\n\nimport * as t from \"io-ts\";\nimport type { GhApi } from \"./gh.js\";\nimport { runGhApi } from \"./gh.js\";\nimport { errMsg, tryParseJson } from \"./util.js\";\n\n// GitHub's fixed reaction vocabulary — there is no ✅; 🚀 (rocket) reads as \"review shipped\".\nexport const REACTIONS = [\n \"+1\",\n \"-1\",\n \"laugh\",\n \"confused\",\n \"heart\",\n \"hooray\",\n \"rocket\",\n \"eyes\",\n] as const;\nexport type Reaction = (typeof REACTIONS)[number];\nexport const isReaction = (s: string): s is Reaction =>\n (REACTIONS as readonly string[]).includes(s);\n\nconst ReactionCodec = t.type({ id: t.number, content: t.string });\n\nexport interface ReactInput {\n readonly repo: string;\n readonly commentId: number;\n readonly add?: Reaction;\n readonly remove?: Reaction;\n}\n\nconst reactionsPath = (repo: string, commentId: number): string =>\n `repos/${repo}/issues/comments/${String(commentId)}/reactions`;\n\nconst removeReactions = async (\n repo: string,\n commentId: number,\n content: Reaction,\n ghApi: GhApi,\n): Promise<void> => {\n // --paginate WITHOUT --jq concatenates pages as `[..][..]` (invalid JSON) once a comment has >100\n // reactions; flatten to one record per line via --jq and decode line by line, like pr.ts. Each\n // undecodable line is logged and skipped rather than silently swallowed.\n const stdout = await ghApi([\n reactionsPath(repo, commentId),\n \"--paginate\",\n \"--jq\",\n \".[] | {id, content}\",\n ]);\n for (const line of stdout.split(\"\\n\").filter((l) => l.trim() !== \"\")) {\n const parsed = tryParseJson(line);\n const decoded = parsed.ok ? ReactionCodec.decode(parsed.value) : undefined;\n if (decoded === undefined || decoded._tag === \"Left\") {\n process.stderr.write(\"code-review react: could not decode a reaction entry — skipping\\n\");\n continue;\n }\n if (decoded.right.content !== content) continue;\n // The token may delete only its OWN reactions; a 403 on someone else's is expected, not fatal.\n await ghApi([\n \"--method\",\n \"DELETE\",\n `${reactionsPath(repo, commentId)}/${String(decoded.right.id)}`,\n ]).catch((err: unknown) =>\n process.stderr.write(\n `code-review react: could not remove reaction ${String(decoded.right.id)} (${errMsg(err)}) — skipping\\n`,\n ),\n );\n }\n};\n\n// Add first, then remove, so the comment is never momentarily unmarked during a 👀→🚀 swap.\nexport const react = async (input: ReactInput, ghApi: GhApi = runGhApi): Promise<void> => {\n if (input.add !== undefined) {\n await ghApi([\n \"--method\",\n \"POST\",\n reactionsPath(input.repo, input.commentId),\n \"-f\",\n `content=${input.add}`,\n ]);\n }\n if (input.remove !== undefined) {\n await removeReactions(input.repo, input.commentId, input.remove, ghApi);\n }\n};\n","// Resolves and waits for a PR head's CI workflow run, so the on-demand comment trigger routes on the\n// SAME real CI conclusion the workflow_run trigger would: success → full review, failure → mechanic\n// with that run's failing-job logs. Without this the comment path reviews blind to CI — throwing away\n// the differentiator. The head SHA is trusted (resolved from the PR number via the API), so it is\n// safe in the query; the workflow name is trusted caller config.\n\nimport { performance } from \"node:perf_hooks\";\nimport * as t from \"io-ts\";\nimport { PathReporter } from \"io-ts/lib/PathReporter.js\";\nimport type { GhApi } from \"./gh.js\";\nimport { runGhApi } from \"./gh.js\";\nimport { parseJsonl } from \"./transcript.js\";\nimport { errMsg } from \"./util.js\";\n\nconst RunCodec = t.type({\n id: t.number,\n name: t.union([t.string, t.null]),\n status: t.union([t.string, t.null]),\n conclusion: t.union([t.string, t.null]),\n run_number: t.number,\n});\n\nexport interface CiRun {\n readonly id: number;\n // queued | in_progress | requested | waiting | pending | completed\n readonly status: string;\n // success | failure | cancelled | timed_out | ... — null until status is completed\n readonly conclusion: string | null;\n}\n\nexport interface CiLookup {\n // The matched run, or null if the named workflow has no run for this head SHA yet.\n readonly run: CiRun | null;\n // Distinct workflow names that DID run for this head SHA — lets a caller tell a mistyped\n // workflowName (which otherwise just times out) from \"the named CI simply has not queued yet\".\n readonly seenNames: readonly string[];\n}\n\n// One projected run object per row across ALL pages: `--paginate` WITHOUT `--jq` concatenates each\n// page's `{workflow_runs: […]}` object into a stream JSON.parse rejects, so only the first page (≤100\n// runs) was ever read — a head SHA with many workflows or re-runs could push the awaited run out of\n// view and the comment path would decline with no diagnostic. `--jq` unwraps `.workflow_runs[]` and\n// streams NDJSON parseJsonl reads line by line, the shape gather/post already use.\nconst RUN_JQ =\n \".workflow_runs[] | {id: .id, name: .name, status: .status, conclusion: .conclusion, run_number: .run_number}\";\n\n// The latest run of the named CI workflow for this head SHA. NOT filtered by triggering event: CI may\n// run on `push` as well as `pull_request`, and the head SHA already pins the commit. Latest = highest\n// run_number, so a re-run supersedes. `run` is null when the named workflow has no run yet (the\n// comment may fire before CI even queues). A row that doesn't match the run shape is dropped rather\n// than aborting the lookup — an empty result then reads as \"not queued yet\" and the caller declines.\nexport const resolveCiRun = async (\n repo: string,\n headSha: string,\n workflowName: string,\n ghApi: GhApi,\n): Promise<CiLookup> => {\n const endpoint = `repos/${repo}/actions/runs?head_sha=${headSha}&per_page=100`;\n const rows = parseJsonl(await ghApi([endpoint, \"--paginate\", \"--jq\", RUN_JQ]));\n const decoded = rows.map((row) => RunCodec.decode(row));\n const runs = decoded.flatMap((d) => (d._tag === \"Right\" ? [d.right] : []));\n // A row that fails the codec is dropped rather than aborting the lookup, but a drop is never normal:\n // a partial drift can silently drop the newest run and route on a stale one, and a total drift reads\n // as an empty result that declines only after a full timeout. So name every drop, with the first\n // failure's field-level detail, so the drifted field is diagnosable without reproducing the call.\n const dropped = decoded.length - runs.length;\n if (dropped > 0) {\n const firstDrift = decoded.find((d) => d._tag === \"Left\");\n const detail =\n firstDrift === undefined ? \"\" : ` (${PathReporter.report(firstDrift).join(\"; \")})`;\n process.stderr.write(\n `Warning: ${String(dropped)} of ${String(rows.length)} workflow-run row(s) from ${endpoint} failed to decode${detail} — excluded from the lookup\\n`,\n );\n }\n const latest = runs\n .filter((r) => r.name === workflowName)\n .reduce<t.TypeOf<typeof RunCodec> | null>(\n (best, r) => (best === null || r.run_number > best.run_number ? r : best),\n null,\n );\n return {\n run:\n latest === null\n ? null\n : { id: latest.id, status: latest.status ?? \"unknown\", conclusion: latest.conclusion },\n seenNames: [...new Set(runs.flatMap((r) => (r.name === null ? [] : [r.name])))],\n };\n};\n\nexport type CiOutcome =\n | { readonly kind: \"concluded\"; readonly conclusion: string; readonly runId: number }\n // No conclusive CI result within the timeout — the run never appeared or never completed. The\n // caller declines to review rather than fabricate a conclusion. seenNames carries the workflow\n // names that DID run, so a mistyped ci_workflow can be diagnosed instead of silently timing out.\n | {\n readonly kind: \"timed-out\";\n readonly runId: number | null;\n readonly seenNames: readonly string[];\n };\n\nexport interface AwaitOptions {\n readonly workflowName: string;\n readonly pollIntervalMs: number;\n readonly timeoutMs: number;\n}\n\nexport interface AwaitDeps {\n readonly ghApi: GhApi;\n readonly sleep: (ms: number) => Promise<void>;\n readonly elapsedMs: () => number;\n}\n\nexport const awaitCiConclusion = async (\n repo: string,\n headSha: string,\n options: AwaitOptions,\n deps: AwaitDeps = { ghApi: runGhApi, sleep: defaultSleep, elapsedMs: monotonicElapsed() },\n): Promise<CiOutcome> => {\n // `--paginate` fetches one page per HTTP request, so a transient blip on any page rejects the whole\n // lookup. Contain it to a diagnostic + empty result rather than let it unwind and abort the wait:\n // the loop is meant to be resilient, so a failed poll should retry until the run settles or the\n // timeout declines, never crash mid-wait.\n const safeResolve = async (): Promise<CiLookup> => {\n try {\n return await resolveCiRun(repo, headSha, options.workflowName, deps.ghApi);\n } catch (err) {\n process.stderr.write(\n `Warning: CI-run lookup for ${headSha} failed (${errMsg(err)}) — retrying until the timeout\\n`,\n );\n return { run: null, seenNames: [] };\n }\n };\n const poll = async (\n lastSeenNames: readonly string[],\n lastRunId: number | null,\n ): Promise<CiOutcome> => {\n const { run, seenNames } = await safeResolve();\n // A run momentarily reports `completed` with a null conclusion before GitHub settles it; treating\n // that as concluded would fabricate a routing decision, so keep polling until the conclusion lands\n // (or the timeout declines) rather than collapsing it to a made-up \"unknown\" the caller can act on.\n if (run !== null && run.status === \"completed\" && run.conclusion !== null)\n return { kind: \"concluded\", conclusion: run.conclusion, runId: run.id };\n // A caught error zeroes this poll's view, so carry the last non-empty observation forward — else a\n // transient failure on the very iteration that times out would erase the run id and workflow names\n // earlier polls saw, misleading the mistyped-workflow-vs-not-queued-yet diagnostic renderCiOutputs\n // depends on.\n const runId = run === null ? lastRunId : run.id;\n const names = seenNames.length > 0 ? seenNames : lastSeenNames;\n if (deps.elapsedMs() >= options.timeoutMs)\n return { kind: \"timed-out\", runId, seenNames: names };\n await deps.sleep(options.pollIntervalMs);\n return poll(names, runId);\n };\n return poll([], null);\n};\n\nexport const defaultSleep = (ms: number): Promise<void> =>\n new Promise((resolvePromise) => setTimeout(resolvePromise, ms));\n\n// performance.now() is monotonic — unlike Date.now(), an NTP/VM wall-clock step back mid-poll can't\n// make elapsedMs() decrease and stall the timeout check the loop depends on.\nexport const monotonicElapsed = (): (() => number) => {\n const start = performance.now();\n return () => performance.now() - start;\n};\n\n// ci_settled distinguishes \"we know the CI result\" from \"we gave up waiting\" so the gate can decline\n// the review on a non-settle rather than run it on a guessed conclusion.\nexport const renderCiOutputs = (outcome: CiOutcome): string =>\n outcome.kind === \"concluded\"\n ? `ci_settled=true\\nci_conclusion=${outcome.conclusion}\\nci_run_id=${String(outcome.runId)}\\n`\n : `ci_settled=false\\nci_run_id=${outcome.runId === null ? \"\" : String(outcome.runId)}\\n`;\n","// Shares post's PR resolution so the review and comment jobs never split-brain on which PR.\n\nimport { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport * as t from \"io-ts\";\nimport { execFileWithTimeout, subprocessTimeoutMs } from \"./exec.js\";\nimport type { GhApi } from \"./gh.js\";\nimport { runGhApi } from \"./gh.js\";\nimport { fetchDiff, fetchPrCandidates, resolvePr } from \"./pr.js\";\nimport { parseJsonl } from \"./transcript.js\";\nimport { errMsg } from \"./util.js\";\n\nexport interface GatherInput {\n readonly repo: string;\n readonly headSha: string;\n readonly headBranch?: string;\n // The repo's default branch — the trusted base the review checks out and the reference point for\n // the full (triage) diff. A PR whose base is a different branch is \"stacked\".\n readonly defaultBranch: 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 // The PR's base is not the default branch (a stacked PR): the review scope (base...head) is a\n // strict subset of what gets checked out + triaged (default...head), so the review prompt frames\n // the extra changes as already-reviewed context.\n readonly stacked: boolean;\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)}\\nstacked=${String(result.stacked)}\\n`;\n }\n};\n\nexport type GitRun = (args: readonly string[]) => Promise<string>;\n\nexport const runGit: GitRun = (args) =>\n execFileWithTimeout({\n command: \"git\",\n args,\n label: `git ${args.join(\" \")}`,\n timeoutMs: subprocessTimeoutMs(),\n });\n\nconst PrMetaCodec = t.type({\n changed_files: t.number,\n base_sha: t.string,\n base_ref: 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.intersection([\n t.type({\n id: t.number,\n body: t.union([t.string, t.null]),\n user: t.type({ login: t.string }),\n }),\n t.partial({\n created_at: t.union([t.string, t.null]),\n author_association: t.union([t.string, t.null]),\n }),\n]);\ntype IssueComment = t.TypeOf<typeof 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, base_ref: .base.ref, 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\n// The review checks out the PR head; the untrusted surface a checkout exposes over the trusted\n// default branch is exactly `default...head`. So triage scans THIS diff (not the PR's base...head),\n// and it is the same diff for a normal PR (base === default). Compare API with a git-diff fallback\n// (fetch the head, diff from the checked-out default-branch tip) mirroring the pr.diff path.\nconst fetchFullDiff = async (\n repo: string,\n defaultBranch: string,\n headSha: string,\n ghApi: GhApi,\n gitRun: GitRun,\n): Promise<string> => {\n try {\n const diff = await ghApi([\n `repos/${repo}/compare/${defaultBranch}...${headSha}`,\n \"-H\",\n \"Accept: application/vnd.github.v3.diff\",\n ]);\n if (diff.length > 0) return diff;\n process.stderr.write(\n `compare diff for ${defaultBranch}...${headSha} was empty — falling back to git diff\\n`,\n );\n } catch (err) {\n process.stderr.write(`compare diff fetch failed (${errMsg(err)}) — falling back to git diff\\n`);\n }\n await gitRun([\"fetch\", \"origin\", headSha]);\n // Three-dot, matching the compare API's semantics (merge-base...head): the checked-out default\n // branch is HEAD, so this is the same untrusted surface the compare primary computes.\n const base = (await gitRun([\"rev-parse\", \"HEAD\"])).trim();\n return gitRun([\"diff\", `${base}...${headSha}`]);\n};\n\nconst CommitCodec = t.type({\n sha: t.string,\n message: t.string,\n author: t.union([t.string, t.null]),\n email: t.union([t.string, t.null]),\n});\nconst COMMIT_JQ =\n \".commits[] | {sha: .sha, message: .commit.message, author: .commit.author.name, email: .commit.author.email}\";\n\n// Commit messages + author identities of every commit in `default...head`. Once the head is checked\n// out, `git log` exposes these to the reviewing agent, so they are an untrusted surface triage must\n// scan for injection. FAIL CLOSED: a fetch failure propagates (never a silent empty scan) — the\n// caller must not expose commit messages it could not vet.\nconst fetchCompareCommits = async (\n repo: string,\n defaultBranch: string,\n headSha: string,\n ghApi: GhApi,\n): Promise<readonly t.TypeOf<typeof CommitCodec>[]> => {\n const rows = parseJsonl(\n await ghApi([\n `repos/${repo}/compare/${defaultBranch}...${headSha}`,\n \"--paginate\",\n \"--jq\",\n COMMIT_JQ,\n ]),\n );\n const decoded = rows.map((row) => CommitCodec.decode(row));\n const commits = decoded.flatMap((d) => (d._tag === \"Right\" ? [d.right] : []));\n // A dropped row is a scan gap, not a no-op: a checkout's `git log` still exposes that commit's\n // message to the agent, so name any drop rather than let an unscanned message pass silently.\n const dropped = decoded.length - commits.length;\n if (dropped > 0) {\n process.stderr.write(\n `Warning: ${String(dropped)} of ${String(rows.length)} commit row(s) failed to decode — their messages are NOT in the triage scan though a checkout's git log still exposes them\\n`,\n );\n }\n return commits;\n};\n\n// One object per row across all pages: `--paginate` WITHOUT `--jq` concatenates each page's JSON\n// array into an invalid `[..][..]` stream JSON.parse rejects, silently losing the prior review (and\n// the conversation) on any PR past the first page; the `--jq` projection streams NDJSON parseJsonl\n// reads line by line — the shape post.ts's findBotComment already uses.\nconst COMMENT_JQ =\n \".[] | {id: .id, body: .body, user: {login: .user.login}, created_at: .created_at, author_association: .author_association}\";\nconst REVIEW_COMMENT_JQ =\n \".[] | {body: .body, user: {login: .user.login}, created_at: .created_at, author_association: .author_association, path: .path, line: .line}\";\nconst REVIEW_JQ =\n \".[] | {body: .body, user: {login: .user.login}, submitted_at: .submitted_at, author_association: .author_association, state: .state}\";\n\nconst ReviewCommentCodec = t.intersection([\n t.type({ body: t.union([t.string, t.null]), user: t.type({ login: t.string }) }),\n t.partial({\n created_at: t.union([t.string, t.null]),\n author_association: t.union([t.string, t.null]),\n path: t.union([t.string, t.null]),\n line: t.union([t.number, t.null]),\n }),\n]);\ntype ReviewComment = t.TypeOf<typeof ReviewCommentCodec>;\n\nconst ReviewCodec = t.intersection([\n t.type({ body: t.union([t.string, t.null]), user: t.type({ login: t.string }) }),\n t.partial({\n submitted_at: t.union([t.string, t.null]),\n author_association: t.union([t.string, t.null]),\n state: t.union([t.string, t.null]),\n }),\n]);\ntype Review = t.TypeOf<typeof ReviewCodec>;\n\n// Fetch + stream-parse a paginated endpoint; null on any transport error (named on stderr so a\n// degraded channel is diagnosable), so a failed fetch never aborts the review — the conversation is\n// best-effort context.\nconst fetchJsonlRows = async (\n ghApi: GhApi,\n endpoint: string,\n jq: string,\n): Promise<readonly unknown[] | null> => {\n try {\n return parseJsonl(await ghApi([endpoint, \"--paginate\", \"--jq\", jq]));\n } catch (err) {\n process.stderr.write(\n `Warning: could not fetch ${endpoint} (${errMsg(err)}) — omitting it from the review context\\n`,\n );\n return null;\n }\n};\n\n// Decode row by row, dropping only the rows that don't validate (e.g. a deleted account's null login)\n// rather than letting one malformed row fail the whole channel the way an atomic `t.array` decode\n// would. null still propagates a failed fetch (rows === null); a bad row is silently skipped.\nconst decodeArrayOrNull = <A>(\n codec: t.Type<A>,\n rows: readonly unknown[] | null,\n): readonly A[] | null => {\n if (rows === null) return null;\n return rows.flatMap((row) => {\n const decoded = codec.decode(row);\n return decoded._tag === \"Right\" ? [decoded.right] : [];\n });\n};\n\n// The bot's own last comment — its embedded findings marker seeds the re-review draft (seed-draft).\nconst priorReviewFrom = (\n comments: readonly IssueComment[],\n botLogin: string,\n): { readonly id: number; readonly body: string | null } | null => {\n const byBot = comments.filter((c) => c.user.login === botLogin);\n const last = byBot[byBot.length - 1];\n return last ? { id: last.id, body: last.body } : null;\n};\n\n// The untrusted PR discussion staged for the review agent to TRIAGE as claims — so a re-review can\n// recognize a finding the author already answered without OBEYING the comment. Everyone but the\n// review bot (its own output is seeded back via prior_review), bounded to the most recent items per\n// channel with each body clipped so a long thread can't blow the agent's context; the workflow frames\n// these files as claims-to-verify, never as instructions.\nconst MAX_CONVERSATION_COMMENTS = 50;\nconst MAX_CONVERSATION_BODY_CHARS = 4000;\n\nconst clip = (body: string): string => {\n if (body.length <= MAX_CONVERSATION_BODY_CHARS) return body;\n const cut = body.slice(0, MAX_CONVERSATION_BODY_CHARS);\n // Don't end on a lone high surrogate (a code point split mid-pair) — drop it so the kept prefix\n // stays well-formed UTF-16.\n const safe = /[\\uD800-\\uDBFF]$/.test(cut) ? cut.slice(0, -1) : cut;\n return `${safe}\\n… [truncated]`;\n};\n\n// Drop the review bot and empty bodies, keep the most recent MAX (logging when it caps), then project.\nconst boundedHuman = <\n A extends { readonly user: { readonly login: string }; readonly body: string | null },\n B,\n>(\n items: readonly A[],\n botLogin: string,\n label: string,\n project: (item: A & { readonly body: string }) => B,\n): readonly B[] => {\n const human = items.filter(\n (a): a is A & { readonly body: string } =>\n a.user.login !== botLogin && typeof a.body === \"string\" && a.body.trim() !== \"\",\n );\n const kept = human.slice(-MAX_CONVERSATION_COMMENTS);\n if (kept.length < human.length) {\n process.stderr.write(\n `Note: PR has ${String(human.length)} ${label} — feeding the review the most recent ${String(MAX_CONVERSATION_COMMENTS)}\\n`,\n );\n }\n return kept.map(project);\n};\n\nconst issueCommentsFrom = (comments: readonly IssueComment[], botLogin: string) =>\n boundedHuman(comments, botLogin, \"discussion comments\", (c) => ({\n author: c.user.login,\n author_association: c.author_association ?? null,\n created_at: c.created_at ?? null,\n body: clip(c.body),\n }));\n\nconst reviewCommentsFrom = (comments: readonly ReviewComment[], botLogin: string) =>\n boundedHuman(comments, botLogin, \"inline review comments\", (c) => ({\n author: c.user.login,\n author_association: c.author_association ?? null,\n created_at: c.created_at ?? null,\n path: c.path ?? null,\n line: c.line ?? null,\n body: clip(c.body),\n }));\n\nconst reviewsFrom = (reviews: readonly Review[], botLogin: string) =>\n boundedHuman(reviews, botLogin, \"review submissions\", (r) => ({\n author: r.user.login,\n author_association: r.author_association ?? null,\n submitted_at: r.submitted_at ?? null,\n state: r.state ?? null,\n body: clip(r.body),\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 stacked = meta.base_ref !== input.defaultBranch;\n\n // pr.diff (base...head) is the review SCOPE — the PR's own change; its endpoint + git-diff fallback\n // are unchanged.\n const prDiff = await (async () => {\n const apiDiff = await fetchApiDiff(input.repo, prNumber, ghApi);\n if (apiDiff !== null && !(apiDiff.length === 0 && meta.changed_files > 0)) return apiDiff;\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 // full.diff (default...head) is the surface a head checkout exposes over the trusted base — what\n // triage scans and what the checkout produces. Same as pr.diff for a normal PR (base === default);\n // a superset for a stacked one, so only then is a separate fetch needed. commits.json carries the\n // messages/authors a checked-out `git log` exposes, scanned by triage alongside the diff.\n const fullDiff = stacked\n ? await fetchFullDiff(input.repo, input.defaultBranch, input.headSha, ghApi, gitRun)\n : prDiff;\n const commits = await fetchCompareCommits(input.repo, input.defaultBranch, input.headSha, ghApi);\n\n writeFileSync(join(input.outDir, \"full.diff\"), fullDiff);\n writeFileSync(join(input.outDir, \"pr.diff\"), prDiff);\n writeFileSync(join(input.outDir, \"commits.json\"), JSON.stringify(commits));\n writeFileSync(\n join(input.outDir, \"pr_context.json\"),\n JSON.stringify({ title: meta.title, body: meta.body }),\n );\n\n // The three conversation fetches are independent — run them together rather than one after another.\n const [issueRows, reviewCommentRows, reviewRows] = await Promise.all([\n fetchJsonlRows(ghApi, `repos/${input.repo}/issues/${String(prNumber)}/comments`, COMMENT_JQ),\n fetchJsonlRows(\n ghApi,\n `repos/${input.repo}/pulls/${String(prNumber)}/comments`,\n REVIEW_COMMENT_JQ,\n ),\n fetchJsonlRows(ghApi, `repos/${input.repo}/pulls/${String(prNumber)}/reviews`, REVIEW_JQ),\n ]);\n const issueComments = decodeArrayOrNull(IssueCommentCodec, issueRows);\n const reviewComments = decodeArrayOrNull(ReviewCommentCodec, reviewCommentRows);\n const reviews = decodeArrayOrNull(ReviewCodec, reviewRows);\n\n const prior = issueComments === null ? null : priorReviewFrom(issueComments, input.botLogin);\n writeFileSync(\n join(input.outDir, \"prior_review.json\"),\n prior === null ? \"null\" : JSON.stringify(prior),\n );\n writeFileSync(\n join(input.outDir, \"pr_conversation.json\"),\n JSON.stringify({\n issue_comments:\n issueComments === null ? [] : issueCommentsFrom(issueComments, input.botLogin),\n review_comments:\n reviewComments === null ? [] : reviewCommentsFrom(reviewComments, input.botLogin),\n reviews: reviews === null ? [] : reviewsFrom(reviews, input.botLogin),\n }),\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(prDiff, \"utf8\"),\n stacked,\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, incompleteFindings } 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 // The agent-file is the UNREVISED seed the pipeline pre-wrote (the agent died before touching it),\n // decided by the caller from the seed-marker mtime. Recovering it would post the seed — a\n // first-review scaffold OR a re-review's PRIOR verdict — as a completed review of the current head:\n // the false-clean-pass class (issue #117). So skip recovery entirely and emit a \"did not complete\"\n // notice, keeping whatever telemetry the run produced.\n readonly seedUnrevised?: boolean;\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 seedUnrevised: boolean,\n): ResultEnvelope => {\n // The agent never wrote the draft — recovering the untouched seed would post it as a completed\n // review of the current head (issue #117). Emit the notice instead, keeping the run's telemetry.\n if (seedUnrevised)\n return {\n schema_version: DEFAULT_SCHEMA_VERSION,\n findings: incompleteFindings(\n \"### ⚠️ Review did not complete\\n\\nThe review agent did not write a review (its draft is the untouched pre-seed). See the workflow logs.\",\n ),\n incomplete: true,\n ...telemetry,\n };\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: incompleteFindings(`### ⚠️ Review did not complete\\n\\n${outcome.reason}`),\n incomplete: true,\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 meta.seedUnrevised === true,\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 meta.seedUnrevised === true,\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","// The untrusted review agent's network jail as one sandbox-runtime (`srt`) settings file (data, not\n// shell). The allowlist is the model endpoint the CLI actually dials plus the GitHub API/host and any\n// consumer-supplied hosts; the host-side proxy denies everything else. Filesystem isolation is off —\n// the threat this closes is network exfil of the burner key, not the throwaway runner's disk — so the\n// jail confines only egress while the agent still reads the worktree and writes its draft freely.\n\nexport interface SandboxConfig {\n readonly network: {\n readonly allowedDomains: readonly string[];\n readonly deniedDomains: readonly string[];\n };\n readonly filesystem: {\n readonly allowRead: readonly string[];\n readonly denyRead: readonly string[];\n readonly allowWrite: readonly string[];\n readonly denyWrite: readonly string[];\n };\n}\n\n// GitHub hosts the agent may reach when it shells out to gh/git during a review.\nconst GITHUB_HOSTS = [\"api.github.com\", \"github.com\"] as const;\n\n// The model host from api_base_url (ANTHROPIC_BASE_URL) — the single source of truth for the endpoint\n// the CLI dials, rather than a hardcoded vendor. Bare hostname (no scheme/port/path) to match the\n// proxy's hostname rule. Throws rather than yield an empty entry that would deny the model itself.\nexport const deriveModelHost = (apiBaseUrl: string): string => {\n const host = URL.canParse(apiBaseUrl) ? new URL(apiBaseUrl).hostname : \"\";\n if (host === \"\") {\n throw new Error(\n `could not derive the model host from api_base_url ${JSON.stringify(apiBaseUrl)} — expected a URL like https://api.deepseek.com/anthropic`,\n );\n }\n return host;\n};\n\n// Built-in model-provider host suffixes the derived allowlist entry is expected to match. The jail\n// auto-derives its sole egress allowlist from api_base_url, so a typo'd or stale value now fails OPEN —\n// it dials, and hands MODEL_API_KEY to, whatever host that variable names (the old fixed, PR-reviewed\n// allowlist failed CLOSED instead). A derived host outside these providers (and any consumer-declared\n// host) is warned about loudly by the `sandbox-config` command, or rejected under `--strict-host`.\nconst KNOWN_MODEL_HOST_SUFFIXES = [\"anthropic.com\", \"deepseek.com\"] as const;\n\n// True when host is a SUBDOMAIN of a built-in provider (the model API always lives on a subdomain like\n// api.*, so the bare registrable domain is itself treated as a typo — e.g. a dropped \"api.\" — and the\n// `.`-prefixed suffix keeps the boundary honest, so notanthropic.com and api.anthropic.com.evil.com are\n// both unknown), or an EXACT match for a consumer-declared host. A consumer on another provider declares\n// their host so it passes while a typo of it (a different exact string) does not. Both sides are\n// normalized (lowercased, trailing FQDN dot dropped) so a case/dot variant of a declared host still\n// matches — deriveModelHost returns a URL-parser-lowercased hostname while a declared token is as typed.\nexport const isKnownModelHost = (host: string, declared: readonly string[] = []): boolean => {\n const normalize = (h: string): string => h.replace(/\\.$/, \"\").toLowerCase();\n const target = normalize(host);\n return (\n declared.some((d) => normalize(d) === target) ||\n KNOWN_MODEL_HOST_SUFFIXES.some((suffix) => target.endsWith(`.${suffix}`))\n );\n};\n\n// The consumer's extra_endpoints: the same whitespace-separated host[:port] list they already pass to\n// harden-runner. Ports are dropped — the proxy matches on hostname (the only form validated on the\n// runner), and for HTTPS-only egress a port scope adds nothing.\nexport const parseExtraEndpoints = (extra: string): readonly string[] =>\n extra\n .split(/\\s+/)\n .map((token) => token.replace(/:\\d+$/, \"\"))\n .filter((token) => token.length > 0);\n\nexport const buildSandboxConfig = (opts: {\n readonly apiBaseUrl: string;\n readonly extra?: string;\n}): SandboxConfig => ({\n network: {\n allowedDomains: [\n ...new Set([\n deriveModelHost(opts.apiBaseUrl),\n ...GITHUB_HOSTS,\n ...parseExtraEndpoints(opts.extra ?? \"\"),\n ]),\n ],\n deniedDomains: [],\n },\n filesystem: { allowRead: [], denyRead: [], allowWrite: [\"/\"], denyWrite: [] },\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 { randomBytes } from \"node:crypto\";\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 emptyFindings,\n} from \"./schema.js\";\nimport type { Triage, Finding, PriceMap } from \"./schema.js\";\nimport { parseFindingsMarker, parseReviewedSha } from \"./surface.js\";\nimport {\n buildNoticeEnvelope,\n buildUnknownNoticeEnvelope,\n isNoticeKind,\n parseAgentAllowlist,\n NOTICE_KINDS,\n} from \"./notice.js\";\nimport { announce, post, reportIncomplete } from \"./post.js\";\nimport { type CheckIntent, checkRun } from \"./checkrun.js\";\nimport { parseCommand, renderCommandOutputs, safeHeredocDelim } from \"./command.js\";\nimport { react, isReaction, REACTIONS } from \"./react.js\";\nimport type { Reaction } from \"./react.js\";\nimport { awaitCiConclusion, renderCiOutputs } from \"./ci.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 {\n buildSandboxConfig,\n deriveModelHost,\n isKnownModelHost,\n parseExtraEndpoints,\n} from \"./sandbox.js\";\nimport { annotationSafe, asRecord, errMsg, readFileOrNull, 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\n// The optional sandbox config a notice names its allowlist from. A MISSING/unreadable file is the\n// normal early-failure case (the jail is set up after triage), so it stays silent and is treated as\n// absent. A file that is PRESENT but unparseable is the diagnostic case this feature exists for (a\n// truncated or agent-tampered config), so it warns rather than vanishing. Either way ⇒ undefined, and\n// the notice omits the allowlist rather than crashing the assemble step.\nconst readSandboxConfigForNotice = (path: string): unknown => {\n const text = readFileOrNull(resolve(path));\n if (text === null) return undefined;\n const parsed = tryParseJson(text);\n if (!parsed.ok) {\n process.stderr.write(\n `::warning::${annotationSafe(`code-review notice: ${path} is present but not valid JSON — omitting the agent allowlist from the notice`)}\\n`,\n );\n return undefined;\n }\n return parsed.value;\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 CONVERGENCE_THRESHOLD_DESCRIPTION =\n \"Advisory convergence tolerance: the weighted-severity score (critical 4 · major 2 · minor 1 · nit 0) at or below which the sticky reads as converged (default: 1 — unlimited nits plus at most one minor)\";\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 \"convergence-threshold\": {\n type: \"string\",\n description: CONVERGENCE_THRESHOLD_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 convergenceThreshold: parseConvergenceThreshold(args[\"convergence-threshold\"]),\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\n/** Parse `--convergence-threshold`: a non-negative decimal, or undefined when absent/blank (the render\n * layer then applies DEFAULT_CONVERGENCE_THRESHOLD as the SSOT default). An unset optional workflow\n * input expands to \"\" — treat empty/whitespace as absent so the step falls back to the default rather\n * than hard-failing under `set -euo pipefail`. Match the whole string before parsing — `parseFloat`\n * alone silently accepts a numeric prefix (`\"1,5\"`→1, `\"0x10\"`→0) — and reject a non-finite result\n * (a 309+-digit string parses to Infinity, which would make `score <= threshold` always true, a false\n * \"converged\"); a malformed value must fail loudly, the same class the prefix guard covers. */\nconst parseConvergenceThreshold = (raw: string | undefined): number | undefined => {\n const trimmed = raw?.trim();\n if (trimmed === undefined || trimmed === \"\") return undefined;\n if (!/^\\d+(\\.\\d+)?$/.test(trimmed)) {\n fail(`--convergence-threshold must be a non-negative number; got \"${trimmed}\"`);\n }\n const n = Number.parseFloat(trimmed);\n if (!Number.isFinite(n)) {\n fail(`--convergence-threshold is too large to be a meaningful tolerance; got \"${trimmed}\"`);\n }\n return n;\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(emptyFindings(\"\"), 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 // The agent-file is the untouched pre-seed when it is no newer than its seed marker (the same\n // mtime test the budget hook uses via the seedMarkerPath SSOT). Recovering it would post the seed\n // — a first-review scaffold or a re-review's PRIOR verdict — as a completed review of the current\n // head (issue #117), so adapt emits a \"did not complete\" notice instead. Absent a marker (any\n // non-seeded caller) mainHasWrittenDraft returns true, so this is inert outside the review pipeline.\n const agentFile = args[\"agent-file\"];\n const seedUnrevised = agentFile\n ? !mainHasWrittenDraft(mtimeMsOf(agentFile), mtimeMsOf(seedMarkerPath(agentFile)))\n : false;\n const envelope = unwrapAdapt(\n adapt(requireAdapterName(args.adapter), readJSONOrAbsent(args.native), agentFile, {\n route: args.route,\n effort: args.effort,\n agentFileFallbackPath: args[\"agent-file-fallback\"],\n seedUnrevised,\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 noticeCmd = defineCommand({\n meta: {\n name: \"notice\",\n description:\n \"Emit an abstract envelope for a run that produced no completed review (security block, triage error, setup failure, checkout failure, or empty run) — flagged incomplete so the commenter renders it honestly and won't bury a real review\",\n },\n args: {\n kind: {\n type: \"positional\",\n description: `One of: ${NOTICE_KINDS.join(\", \")} (an unrecognized kind renders a generic incomplete notice rather than failing — the pinned CLI is older than the workflow)`,\n required: true,\n },\n reasons: {\n type: \"string\",\n description:\n \"security-blocked / triage-error only: the triage's fail-closed reason string (empty/omitted ⇒ the no-reason wording)\",\n },\n \"sandbox-config\": {\n type: \"string\",\n description:\n \"no-output / triage-error only: path to the agent's sandbox-runtime settings (sandbox.json); its network.allowedDomains is named in the notice so an egress-blocked review self-diagnoses. Missing or unreadable ⇒ the allowlist is omitted (an early failure runs before the jail is set up).\",\n },\n },\n // An unrecognized kind degrades to a generic incomplete notice instead of exiting non-zero: a\n // `notice <kind>` call under the workflow's `set -euo pipefail` must never crash the assemble\n // step into posting nothing, and an unknown kind almost always means version skew, not a typo.\n run: ({ args }) => {\n if (!isNoticeKind(args.kind)) {\n process.stderr.write(\n `::warning::code-review notice: unrecognized kind \"${annotationSafe(args.kind)}\" — the pinned CLI is older than the workflow calling it; rendering a generic incomplete notice\\n`,\n );\n process.stdout.write(`${JSON.stringify(buildUnknownNoticeEnvelope(args.kind), null, 2)}\\n`);\n return;\n }\n // Read the sandbox config only for the kinds that name the allowlist (a jailed agent ran), so the\n // \"no-output / triage-error only\" contract is enforced by the handler, not just documented.\n const namesAllowlist = args.kind === \"no-output\" || args.kind === \"triage-error\";\n const agentAllowlist =\n namesAllowlist && args[\"sandbox-config\"]\n ? parseAgentAllowlist(readSandboxConfigForNotice(args[\"sandbox-config\"]))\n : [];\n process.stdout.write(\n `${JSON.stringify(buildNoticeEnvelope(args.kind, args.reasons, agentAllowlist), null, 2)}\\n`,\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, untrusted PR conversation to triage, 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 \"default-branch\": {\n type: \"string\",\n description:\n \"The repo's default branch — the trusted base the review checks out, and the reference for the full (triage) diff; a PR based on any other branch is treated as stacked\",\n required: true,\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 defaultBranch: args[\"default-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 \"convergence-threshold\": {\n type: \"string\",\n description: CONVERGENCE_THRESHOLD_DESCRIPTION,\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 convergenceThreshold: parseConvergenceThreshold(args[\"convergence-threshold\"]),\n postedAt: formatUtc(new Date()),\n });\n },\n});\n\nconst announceCmd = defineCommand({\n meta: {\n name: \"announce\",\n description:\n \"Post (or update) the sticky the moment a review starts — an in-progress placeholder linking the run — so a workflow_run review, which runs from the default branch and is otherwise invisible on the PR, is visibly under way. Preserves a prior sticky's embedded findings + reviewed-sha markers so the re-review seed survives the swap.\",\n },\n args: {\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 \"run-url\": {\n type: \"string\",\n description: \"Workflow run URL the placeholder links to\",\n required: true,\n },\n \"bot-login\": {\n type: \"string\",\n description:\n \"Bot login to trust for the sticky comment upsert (default: github-actions[bot])\",\n },\n \"head-branch\": {\n type: \"string\",\n description: \"Head branch to disambiguate the PR when multiple share a commit\",\n },\n },\n run: async ({ args }) => {\n // Best-effort, like `react`: the in-progress sticky is cosmetic, so a transient API error must\n // warn and exit 0 rather than fail its job (the review + real comment proceed regardless).\n await announce({\n repo: args.repo,\n headSha: args[\"head-sha\"],\n botLogin: args[\"bot-login\"] || \"github-actions[bot]\",\n runUrl: args[\"run-url\"],\n headBranch: args[\"head-branch\"],\n }).catch((err: unknown) =>\n // `::warning::` so a persistently broken announce shows up in the run's annotations, not only\n // buried in the step log — `announce` otherwise reports success while having posted nothing.\n process.stderr.write(\n `::warning::code-review announce: could not post the in-progress sticky (${annotationSafe(errMsg(err))}) — continuing (cosmetic)\\n`,\n ),\n );\n },\n});\n\nconst isCheckIntent = (s: string): s is CheckIntent =>\n s === \"in_progress\" || s === \"neutral\" || s === \"failure\";\n\nconst checkRunCmd = defineCommand({\n meta: {\n name: \"check-run\",\n description:\n \"Upsert the native 'Code review' check-run on the head SHA — the attribution surface that appears in the PR's own checks list and (writing to the base repo) works for fork PRs too. `in_progress` at review start, `neutral` when the review completes, `failure` when it didn't. Forward-only: `failure` never overwrites a completed review.\",\n },\n args: {\n repo: { type: \"string\", description: \"Repository (owner/name)\", required: true },\n \"head-sha\": {\n type: \"string\",\n description: \"Head SHA the check-run is anchored to\",\n required: true,\n },\n status: {\n type: \"positional\",\n description: \"One of: in_progress, neutral, failure\",\n required: true,\n },\n \"run-url\": {\n type: \"string\",\n description: \"Workflow run URL the check-run's details link to\",\n required: true,\n },\n },\n run: async ({ args }) => {\n if (!isCheckIntent(args.status)) {\n // Best-effort like `announce`: the check-run is an attribution aid, so an unknown status (version\n // skew) warns and exits 0 rather than failing the job the review otherwise proceeds through.\n process.stderr.write(\n `::warning::code-review check-run: unrecognized status \"${annotationSafe(args.status)}\" — expected in_progress, neutral, or failure; skipping\\n`,\n );\n return;\n }\n await checkRun({\n repo: args.repo,\n headSha: args[\"head-sha\"],\n intent: args.status,\n runUrl: args[\"run-url\"],\n }).catch((err: unknown) =>\n process.stderr.write(\n `::warning::code-review check-run: could not upsert the check-run (${annotationSafe(errMsg(err))}) — continuing (attribution aid)\\n`,\n ),\n );\n },\n});\n\nconst reportIncompleteCmd = defineCommand({\n meta: {\n name: \"report-incomplete\",\n description:\n \"Post (or update) the sticky when a review job hard-failed and posted nothing — an attributed 'did not complete' notice linking the run, telling the reader to re-request. Never buries a completed review, and never overwrites a superseding run's live in-progress placeholder. (A cancelled review is left to the superseding run that took over.)\",\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 \"run-url\": {\n type: \"string\",\n description: \"Workflow run URL the notice links to\",\n required: true,\n },\n \"bot-login\": {\n type: \"string\",\n description:\n \"Bot login to trust for the sticky comment upsert (default: github-actions[bot])\",\n },\n \"head-branch\": {\n type: \"string\",\n description: \"Head branch to disambiguate the PR when multiple share a commit\",\n },\n },\n run: async ({ args }) => {\n await reportIncomplete({\n repo: args.repo,\n headSha: args[\"head-sha\"],\n botLogin: args[\"bot-login\"] || \"github-actions[bot]\",\n runUrl: args[\"run-url\"],\n headBranch: args[\"head-branch\"],\n }).catch((err: unknown) =>\n process.stderr.write(\n `::warning::code-review report-incomplete: could not post the failure notice (${annotationSafe(errMsg(err))}) — continuing\\n`,\n ),\n );\n },\n});\n\n/** Parse a `--max-duration`/ceiling flag to whole seconds; a bad value is trusted-config error, so\n * fail loudly rather than silently disabling the clamp. undefined ⇒ no ceiling. */\nconst requireCeilingSec = (raw: string | undefined): number | null => {\n if (raw === undefined) return null;\n const ms = parseWallMs(raw);\n if (ms === null)\n return fail(`--max-duration must be a duration like 60m, 3600s, or 1h (got \"${raw}\")`);\n return Math.floor(ms / 1000);\n};\n\nconst requireCeilingUsd = (raw: string | undefined): number | null => {\n if (raw === undefined) return null;\n const n = Number.parseFloat(raw.replace(/^\\$/, \"\"));\n if (!Number.isFinite(n) || n < 0) fail(`--max-usd must be a non-negative number (got \"${raw}\")`);\n return n;\n};\n\nconst requireMaxInstructions = (raw: string | undefined): number => {\n if (raw === undefined) return 4000;\n if (!/^\\d+$/.test(raw)) fail(`--max-instructions must be a non-negative integer (got \"${raw}\")`);\n return Number.parseInt(raw, 10);\n};\n\nconst requirePositiveInt = (raw: string, flag: string): number => {\n const n = Number.parseInt(raw, 10);\n return Number.isInteger(n) && n > 0 && /^\\d+$/.test(raw)\n ? n\n : fail(`${flag} must be a positive integer; got \"${raw}\"`);\n};\n\nconst requireWallMs = (raw: string | undefined, flag: string, fallback: string): number => {\n const ms = parseWallMs(raw || fallback);\n return ms === null\n ? fail(`${flag} must be a duration like 30m, 15s, or 1h (got \"${raw ?? \"\"}\")`)\n : ms;\n};\n\nconst parseCommandCmd = defineCommand({\n meta: {\n name: \"parse-command\",\n description:\n 'Resolve a PR\\'s head (SHA/branch/repo) from its NUMBER via the API and parse a ChatOps trigger comment (\"/code-review [24m] [$1.00] <instructions>\") into $GITHUB_OUTPUT lines. The untrusted comment is parsed here in type-safe code, never in workflow bash, and the head is resolved from the trusted PR number, never from the comment text. Emits should_run=false (and nothing else) when the comment is not the trigger, the PR is closed, or resolution fails.',\n },\n args: {\n repo: { type: \"string\", description: \"Repository (owner/name)\", required: true },\n pr: {\n type: \"string\",\n description: \"PR number (from github.event.issue.number — trusted event data)\",\n required: true,\n },\n \"comment-body\": {\n type: \"string\",\n description:\n \"The comment body to parse (default: the CODE_REVIEW_COMMENT_BODY env var — the safe way to pass untrusted text without shell interpolation)\",\n },\n trigger: {\n type: \"string\",\n description: 'Trigger token the comment must begin with (default: \"/code-review\")',\n },\n \"max-duration\": {\n type: \"string\",\n description:\n \"Ceiling the requested duration is clamped to (e.g. 60m); omit for no clamp — a comment could then request an unbounded wall, so set this\",\n },\n \"max-usd\": {\n type: \"string\",\n description: \"Ceiling the requested USD budget is clamped to (e.g. 5); omit for no clamp\",\n },\n \"max-instructions\": {\n type: \"string\",\n description: \"Max characters of free-form instructions kept (default: 4000)\",\n },\n },\n run: async ({ args }) => {\n const body = args[\"comment-body\"] || process.env[\"CODE_REVIEW_COMMENT_BODY\"] || \"\";\n const result = await parseCommand({\n repo: args.repo,\n prNumber: requirePositiveInt(args.pr, \"--pr\"),\n body,\n options: {\n trigger: args.trigger || \"/code-review\",\n maxDurationSec: requireCeilingSec(args[\"max-duration\"]),\n maxUsd: requireCeilingUsd(args[\"max-usd\"]),\n maxInstructionsLen: requireMaxInstructions(args[\"max-instructions\"]),\n },\n });\n if (result.kind === \"skip\") {\n process.stderr.write(`code-review parse-command: not running — ${result.reason}\\n`);\n process.stdout.write(renderCommandOutputs(result, \"UNUSED\"));\n return;\n }\n for (const note of result.args.notes)\n process.stderr.write(`code-review parse-command: ${note}\\n`);\n const delim = safeHeredocDelim(result.args.instructions, () => randomBytes(16).toString(\"hex\"));\n process.stdout.write(renderCommandOutputs(result, delim));\n },\n});\n\nconst requireReaction = (name: string): Reaction =>\n isReaction(name) ? name : fail(`Unknown reaction \"${name}\" — one of: ${REACTIONS.join(\", \")}`);\n\nconst reactCmd = defineCommand({\n meta: {\n name: \"react\",\n description:\n \"Add and/or remove a GitHub reaction on a PR/issue comment — the ChatOps acknowledgement (👀 on receipt, swapped to 🚀 on completion). Cosmetic: warns and exits 0 on any API error so a reaction never fails the job.\",\n },\n args: {\n repo: { type: \"string\", description: \"Repository (owner/name)\", required: true },\n \"comment-id\": {\n type: \"string\",\n description: \"Comment id to react on (github.event.comment.id)\",\n required: true,\n },\n add: { type: \"string\", description: `Reaction to add: ${REACTIONS.join(\" | \")}` },\n remove: {\n type: \"string\",\n description: \"Reaction (of the token owner) to remove after adding — for the 👀→🚀 swap\",\n },\n },\n run: async ({ args }) => {\n const commentId = requirePositiveInt(args[\"comment-id\"], \"--comment-id\");\n const add = args.add ? requireReaction(args.add) : undefined;\n const remove = args.remove ? requireReaction(args.remove) : undefined;\n if (add === undefined && remove === undefined)\n fail(\"react: nothing to do — pass --add and/or --remove\");\n await react({ repo: args.repo, commentId, add, remove }).catch((err: unknown) =>\n process.stderr.write(\n `code-review react: reaction update failed (${errMsg(err)}) — continuing (reactions are cosmetic)\\n`,\n ),\n );\n },\n});\n\nconst awaitCiCmd = defineCommand({\n meta: {\n name: \"await-ci\",\n description:\n \"Wait for the PR head's CI workflow run to conclude, then emit its REAL conclusion + run id to $GITHUB_OUTPUT (ci_settled, ci_conclusion, ci_run_id). The on-demand comment trigger uses this so it routes on the same CI result the CI-completion trigger would — success → full review, failure → mechanic with that run's logs — instead of reviewing blind. Polls until the run completes or the timeout elapses; ci_settled=false ⇒ no conclusive result (caller should decline to review, not guess).\",\n },\n args: {\n repo: { type: \"string\", description: \"Repository (owner/name)\", required: true },\n \"head-sha\": {\n type: \"string\",\n description: \"PR head SHA to find the CI run for (resolved from the trusted PR number)\",\n required: true,\n },\n \"ci-workflow\": {\n type: \"string\",\n description: 'CI workflow name to wait for — the name: of your CI workflow (default: \"CI\")',\n },\n timeout: {\n type: \"string\",\n description: \"Give up waiting after this wall (default: 30m)\",\n },\n \"poll-interval\": {\n type: \"string\",\n description: \"How often to re-check the run status (default: 15s)\",\n },\n },\n run: async ({ args }) => {\n const workflowName = args[\"ci-workflow\"] || \"CI\";\n const outcome = await awaitCiConclusion(args.repo, args[\"head-sha\"], {\n workflowName,\n pollIntervalMs: requireWallMs(args[\"poll-interval\"], \"--poll-interval\", \"15s\"),\n timeoutMs: requireWallMs(args.timeout, \"--timeout\", \"30m\"),\n });\n process.stderr.write(\n outcome.kind === \"concluded\"\n ? `code-review await-ci: CI run ${String(outcome.runId)} (\"${workflowName}\") concluded \"${outcome.conclusion}\"\\n`\n : `code-review await-ci: no run named \"${workflowName}\" concluded before the timeout — not reviewing.${\n outcome.seenNames.length > 0\n ? ` Workflow names seen for this head SHA: ${outcome.seenNames.join(\", \")} — check --ci-workflow matches one.`\n : \" No workflow runs were seen for this head SHA at all.\"\n }\\n`,\n );\n process.stdout.write(renderCiOutputs(outcome));\n },\n});\n\nconst sandboxConfigCmd = defineCommand({\n meta: {\n name: \"sandbox-config\",\n description:\n \"Emit the sandbox-runtime (srt) settings that jail the untrusted review agent's egress: allow the model host (derived from api_base_url), the GitHub API/host, and the consumer's extra_endpoints; deny all else; filesystem isolation off\",\n },\n args: {\n \"api-base-url\": {\n type: \"string\",\n description:\n \"The model endpoint the CLI dials (ANTHROPIC_BASE_URL) — its host is allowlisted\",\n required: true,\n },\n extra: {\n type: \"string\",\n description:\n \"Whitespace-separated host[:port] list of extra domains to allow (the extra_endpoints input)\",\n },\n out: {\n type: \"string\",\n description: \"Write the settings JSON here instead of stdout\",\n },\n \"known-model-host\": {\n type: \"string\",\n description:\n \"Additional model HOST(S) to treat as known (space-separated bare hostnames, not URLs) — the consumer's declared host(s) for a provider outside the built-in set; a derived host outside the built-ins and this list warns (or fails under --strict-host)\",\n },\n \"strict-host\": {\n type: \"boolean\",\n description:\n \"Fail (instead of warning) when the model host derived from api_base_url is not a well-known or declared host — closes the fail-open-on-typo gap where a mistyped api_base_url would still be allowlisted and sent the key\",\n },\n },\n run: ({ args }) => {\n // The jail derives its ONLY egress allowlist entry from api_base_url; a typo now fails OPEN (dials\n // whatever it names). Warn loudly on an unknown host so a misconfiguration is visible in the setup\n // log, or hard-fail under --strict-host. A consumer on a provider outside the built-in set declares\n // it via --known-model-host so it passes while a typo of it does not.\n const modelHost = deriveModelHost(args[\"api-base-url\"]);\n // Both --known-model-host AND --extra count as declared: extra_endpoints already allowlists a\n // consumer's self-hosted model host through this same jail (and the reusable documents that use),\n // so treating it as known avoids warning on a host the admin explicitly vouched for.\n const declaredHosts = [\n ...(args[\"known-model-host\"] ? parseExtraEndpoints(args[\"known-model-host\"]) : []),\n ...(args.extra ? parseExtraEndpoints(args.extra) : []),\n ];\n if (!isKnownModelHost(modelHost, declaredHosts)) {\n const message = `code-review sandbox-config: derived model host \"${modelHost}\" is not a well-known or declared host — the jail will allow egress to it and send MODEL_API_KEY there; verify api_base_url is correct`;\n // Both paths surface as GitHub annotations (::error:: hard-fails, ::warning:: continues), so the\n // same condition is visible the same way whether or not --strict-host is set.\n if (args[\"strict-host\"]) {\n process.stderr.write(`::error::${annotationSafe(message)}\\n`);\n process.exit(1);\n }\n process.stderr.write(`::warning::${annotationSafe(message)}\\n`);\n }\n const config = buildSandboxConfig({ apiBaseUrl: args[\"api-base-url\"], extra: args.extra });\n const json = `${JSON.stringify(config, null, 2)}\\n`;\n if (args.out) {\n writeFileSync(resolve(args.out), json);\n } else {\n process.stdout.write(json);\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 \"parse-command\": parseCommandCmd,\n react: reactCmd,\n \"await-ci\": awaitCiCmd,\n render: renderCmd,\n inline: inlineCmd,\n post: postCmd,\n announce: announceCmd,\n \"check-run\": checkRunCmd,\n \"report-incomplete\": reportIncompleteCmd,\n cost: costCmd,\n \"check-cost\": checkCostCmd,\n validate: validateCmd,\n \"seed-draft\": seedDraftCmd,\n adapt: adaptCmd,\n notice: noticeCmd,\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 \"sandbox-config\": sandboxConfigCmd,\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"]}