altimate-receipts 0.5.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-EKMFU3ES.js → chunk-543NGQTN.js} +2 -2
- package/dist/{chunk-GOLRNSZT.js → chunk-ASPLZPMQ.js} +11 -2
- package/dist/{chunk-GOLRNSZT.js.map → chunk-ASPLZPMQ.js.map} +1 -1
- package/dist/{chunk-EYM5WETZ.js → chunk-DBQWQVZZ.js} +139 -19
- package/dist/chunk-DBQWQVZZ.js.map +1 -0
- package/dist/cli.js +267 -118
- package/dist/cli.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/mcp/server.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-EYM5WETZ.js.map +0 -1
- /package/dist/{chunk-EKMFU3ES.js.map → chunk-543NGQTN.js.map} +0 -0
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/hook/installGitHook.ts","../src/hook/prePush.ts","../src/trace/gitCommand.ts","../src/hook/settingsMerge.ts","../src/receipt/assert.ts","../src/report/badge.ts","../src/report/diff.ts","../src/report/eval.ts","../src/report/log.ts","../src/report/prune.ts","../src/report/sarif.ts","../src/report/stats.ts","../src/share/handoff.ts","../src/trace/commitMatch.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n realpathSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, relative } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { deriveFindings } from \"./findings/findings.js\";\nimport type { DerivedSummary } from \"./findings/spans.js\";\nimport { deriveSpans } from \"./findings/spans.js\";\nimport { installGitHook, wirePrepareScript } from \"./hook/installGitHook.js\";\nimport { type HookDialect, readStdin, runHookPrePush } from \"./hook/prePush.js\";\nimport { mergeHookIntoSettings } from \"./hook/settingsMerge.js\";\nimport {\n type Assertion,\n assertExitCode,\n evaluateAsserts,\n loadAsserts,\n renderAssertResults,\n} from \"./receipt/assert.js\";\nimport { type Receipt, type ReceiptScope, buildReceipt } from \"./receipt/build.js\";\nimport { canonicalize } from \"./receipt/canonical.js\";\nimport { badgeEndpoint } from \"./report/badge.js\";\nimport { renderCard, renderList } from \"./report/card.js\";\nimport { diffReceipts, renderDiff } from \"./report/diff.js\";\nimport {\n type FieldRow,\n firedCategories,\n renderFieldScan,\n summarizeFieldScan,\n} from \"./report/eval.js\";\nimport {\n collectGuardrails,\n renderGuardrailsBlock,\n upsertGuardrailsSection,\n} from \"./report/guardrails.js\";\nimport { loadReceiptHistory, renderLog } from \"./report/log.js\";\nimport { branchSlug, planPrune } from \"./report/prune.js\";\nimport { toSarif } from \"./report/sarif.js\";\nimport { deriveTargets } from \"./report/sessions.js\";\nimport { computeStats, renderStats } from \"./report/stats.js\";\nimport { computeTrends, renderTrends, upsertTrendsSection } from \"./report/trends.js\";\nimport { copyToClipboard } from \"./share/clipboard.js\";\nimport { buildHandoff, renderHandoffMarkdown } from \"./share/handoff.js\";\nimport { renderShareMarkdown } from \"./share/markdown.js\";\nimport { redactReceipt } from \"./share/redact.js\";\nimport { toDsseEnvelope } from \"./sign/envelope.js\";\nimport { compareToTranscript, rederiveFromTranscript } from \"./sign/rederive.js\";\nimport { verifyBundle } from \"./sign/verify.js\";\nimport { authoredBranch, branchShas } from \"./trace/commitMatch.js\";\nimport { applyDiffScope, changedFiles, inDiff, narrowEffort } from \"./trace/diffScope.js\";\nimport {\n anyDetected,\n inRepo,\n listSessions,\n loadSession,\n rootsHint,\n selectForBranch,\n selectSummary,\n} from \"./trace/load.js\";\nimport { agentIds } from \"./trace/registry.js\";\nimport { sliceByBranch } from \"./trace/slice.js\";\nimport type { AgentSource, Session, SessionSummary } from \"./trace/types.js\";\nimport { getVersion } from \"./version.js\";\n\nconst HELP = `\n🧾 receipts — proof, not vibes\n\n A deterministic, cross-agent Report Card of what your coding agent actually did.\n Reads the agent's own transcript locally. No account, no upload, no model calls.\n\nUsage\n receipts [selector] Print the Agent Report Card for a session\n receipts --list List recent sessions (then: receipts <n>)\n receipts --json [selector] Emit the Receipt object (in-toto Statement)\n receipts --share [selector] Print a redacted, paste-ready Markdown summary\n receipts --handoff [selector] Print a verifiable handoff brief (done/open/risk/next/verify)\n receipts guardrails [sel] Paste-ready prevention rules (AGENTS.md / CLAUDE.md)\n from the findings (--last N to aggregate sessions)\n receipts trends Cross-session digest: grades, recurring findings,\n and evidence over your last N sessions (default 10)\n receipts pr Write this PR's redacted Receipt to .receipts/\n (diff-scoped: only this change's findings)\n receipts envelope <receipt> Wrap a Receipt as an unsigned DSSE envelope\n receipts verify <bundle> Verify a Receipt (+ --transcript to prove fidelity)\n receipts diff [<a> <b>] What changed between two Receipts (no args: last two; --json)\n receipts log [dir] List the committed receipts in .receipts/ (--last N)\n receipts stats [dir] Dogfooding scoreboard: how often it ran + what it caught\n receipts eval Flag-rate of the detectors over your real local sessions (--last N, --json)\n receipts badge [receipt] shields.io endpoint JSON for a README/PR badge (--out f)\n receipts sarif [receipt] SARIF 2.1.0 for GitHub code-scanning (inline + Security tab; --out f)\n receipts prune [dir] Remove committed receipts for merged/deleted branches (--dry-run)\n receipts init One-command adopt: PR-check workflow + the repo-committed\n agent hook; --pr also branches, commits, pushes + opens the PR\n (--prepare wires the git floor; --agents codex too)\n receipts hook pre-push (called by hooks, not humans) attach the receipt on push\n (--agent claude | codex | git selects the payload dialect)\n receipts install-hook Write the self-updating pre-push hook into .git/hooks\n receipts setup-local Add the hook to YOUR ~/.claude/settings.json (only fires\n in repos that have adopted the Receipts workflow)\n receipts rederive <file> Reproduce the canonical Receipt from a transcript\n receipts assert [selector] Check the receipt against committed .receipts/asserts.json (CI gate)\n receipts mcp Start the MCP server (stdio) for IDEs/agents\n\n selector: a list number (e.g. 3), a session id, or part of the title.\n With no selector, the most recent session is used.\n\nOptions\n --list List recent sessions and exit\n --agent <name> Limit to one agent: claude-code | codex | cursor | openclaw\n --json Emit the Receipt as JSON (no card)\n --compact With --json, emit canonical (sorted, minified) JSON\n --share Emit a redacted Markdown summary for sharing\n --redact With --json, redact secrets from the Receipt\n --out <path> With --json, write to a file instead of stdout\n --base <ref> With pr, the diff base to scope against (default: main)\n --store <mode> With pr, where the receipt goes: commit (default) | none\n (print to stdout, write nothing). Also RECEIPTS_STORE env.\n --branch <name> With pr, fall back to a branch slice (default: current)\n --whole-session With pr, use the whole session (no scoping)\n --last <n> With guardrails / trends, span the last n sessions\n --copy Also copy --share / --json output to the clipboard\n --no-color Disable ANSI color (also honors NO_COLOR)\n -v, --version Print the version and exit\n -h, --help Print this help and exit\n\nSigning is done in CI by the \"Verified-by: Receipts\" GitHub Action (Sigstore\nkeyless via GitHub Artifact Attestations). See docs/verified-by.md.\n\nReceipts reports what an agent DID — not whether it was correct. Your tests are\nthe oracle for success. Evidence, not judgement.\n\nNote: a Receipt can contain titles, file paths, and command snippets from the\ntranscript (possibly secrets). Plain --json is local only; use --share or\n--json --redact to mask secrets before the output leaves your machine.\n\nDocs: https://github.com/AltimateAI/altimate-receipts\n`;\n\ntype Command =\n | \"envelope\"\n | \"verify\"\n | \"pr\"\n | \"mcp\"\n | \"rederive\"\n | \"guardrails\"\n | \"trends\"\n | \"diff\"\n | \"log\"\n | \"stats\"\n | \"eval\"\n | \"badge\"\n | \"sarif\"\n | \"prune\"\n | \"init\"\n | \"assert\"\n | \"hook\"\n | \"install-hook\"\n | \"setup-local\";\nconst COMMANDS = new Set<Command>([\n \"envelope\",\n \"verify\",\n \"pr\",\n \"mcp\",\n \"rederive\",\n \"guardrails\",\n \"trends\",\n \"diff\",\n \"log\",\n \"stats\",\n \"eval\",\n \"badge\",\n \"prune\",\n \"sarif\",\n \"init\",\n \"assert\",\n \"hook\",\n \"install-hook\",\n \"setup-local\",\n]);\n\ninterface ParsedArgs {\n help: boolean;\n version: boolean;\n list: boolean;\n json: boolean;\n compact: boolean;\n share: boolean;\n handoff: boolean;\n redact: boolean;\n copy: boolean;\n color: boolean;\n dryRun: boolean;\n wholeSession: boolean;\n prepare: boolean;\n /** `init --agents <list>` — extra agent hook files to write (SPEC-0069) */\n pr: boolean;\n agents?: string[];\n agent?: AgentSource;\n /** `hook pre-push --agent <claude|git>` payload dialect (SPEC-0066) */\n hookDialect?: HookDialect;\n out?: string;\n branchScope?: string;\n base?: string;\n store?: string;\n transcript?: string;\n last?: number;\n command?: Command;\n file?: string;\n /** second positional (e.g. the `b` receipt for `receipts diff <a> <b>`) */\n second?: string;\n selector?: string;\n}\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const args = argv.slice(2);\n const parsed: ParsedArgs = {\n help: false,\n version: false,\n list: false,\n json: false,\n compact: false,\n share: false,\n handoff: false,\n redact: false,\n copy: false,\n dryRun: false,\n wholeSession: false,\n prepare: false,\n pr: false,\n color: !process.env.NO_COLOR && process.stdout.isTTY === true,\n };\n const positionals: string[] = [];\n for (let i = 0; i < args.length; i++) {\n const a = args[i];\n if (a === \"-h\" || a === \"--help\") {\n parsed.help = true;\n } else if (a === \"-v\" || a === \"--version\") {\n parsed.version = true;\n } else if (a === \"--list\") {\n parsed.list = true;\n } else if (a === \"--json\") {\n parsed.json = true;\n } else if (a === \"--compact\") {\n parsed.compact = true;\n } else if (a === \"--share\") {\n parsed.share = true;\n } else if (a === \"--handoff\") {\n parsed.handoff = true;\n } else if (a === \"--redact\") {\n parsed.redact = true;\n } else if (a === \"--copy\") {\n parsed.copy = true;\n } else if (a === \"--out\") {\n parsed.out = args[++i];\n } else if (a === \"--branch\") {\n parsed.branchScope = args[++i];\n } else if (a === \"--base\") {\n parsed.base = args[++i];\n } else if (a === \"--store\") {\n parsed.store = args[++i];\n } else if (a === \"--transcript\") {\n parsed.transcript = args[++i];\n } else if (a === \"--last\") {\n const n = Number(args[++i]);\n if (Number.isFinite(n) && n > 0) {\n parsed.last = Math.floor(n);\n }\n } else if (a === \"--dry-run\") {\n parsed.dryRun = true;\n } else if (a === \"--whole-session\") {\n parsed.wholeSession = true;\n } else if (a === \"--prepare\") {\n parsed.prepare = true;\n } else if (a === \"--pr\") {\n parsed.pr = true;\n } else if (a === \"--agents\") {\n parsed.agents = (args[++i] ?? \"\").split(\",\").filter(Boolean);\n } else if (a === \"--agent\") {\n const next = args[i + 1];\n if (next && agentIds().includes(next as AgentSource)) {\n parsed.agent = next as AgentSource;\n i++;\n } else if (next === \"claude\" || next === \"codex\" || next === \"git\") {\n parsed.hookDialect = next; // `hook pre-push --agent <dialect>` (SPEC-0066)\n i++;\n }\n } else if (a === \"--no-color\") {\n parsed.color = false;\n } else if (a === \"--color\") {\n parsed.color = true;\n } else if (!a.startsWith(\"-\")) {\n positionals.push(a);\n }\n }\n if (positionals[0] && COMMANDS.has(positionals[0] as Command)) {\n parsed.command = positionals[0] as Command;\n parsed.file = positionals[1];\n parsed.second = positionals[2];\n } else {\n parsed.selector = positionals[0];\n }\n return parsed;\n}\n\nexport async function run(argv: string[]): Promise<number> {\n const args = parseArgs(argv);\n\n if (args.version) {\n process.stdout.write(`${getVersion()}\\n`);\n return 0;\n }\n if (args.help) {\n process.stdout.write(`${HELP}\\n`);\n return 0;\n }\n\n if (args.command === \"envelope\") {\n return runEnvelope(args.file);\n }\n if (args.command === \"verify\") {\n return runVerify(args.file, { transcript: args.transcript, branch: args.branchScope });\n }\n if (args.command === \"diff\") {\n return runDiff(args.file, args.second, { json: args.json, out: args.out });\n }\n if (args.command === \"log\") {\n return runLog(args.file, { json: args.json, last: args.last, out: args.out });\n }\n if (args.command === \"stats\") {\n return runStats(args.file, { json: args.json, out: args.out });\n }\n if (args.command === \"eval\") {\n return runEval({ json: args.json, limit: args.last, agent: args.agent });\n }\n if (args.command === \"badge\") {\n return runBadge(args.file, { out: args.out });\n }\n if (args.command === \"sarif\") {\n return runSarif(args.file, { out: args.out });\n }\n if (args.command === \"prune\") {\n return runPrune(args.file, { dryRun: args.dryRun });\n }\n if (args.command === \"init\") {\n return runInit({ prepare: args.prepare, agents: args.agents, pr: args.pr });\n }\n if (args.command === \"hook\") {\n return runHook(args.file, args.hookDialect ?? \"claude\");\n }\n if (args.command === \"install-hook\") {\n return runInstallHook();\n }\n if (args.command === \"setup-local\") {\n return runSetupLocal();\n }\n if (args.command === \"rederive\") {\n return runRederive(args.file, {\n branch: args.branchScope,\n redact: args.redact,\n compact: args.compact,\n });\n }\n if (args.command === \"guardrails\") {\n // for `guardrails`, the positional (args.file) is a session selector\n return runGuardrails({\n selector: args.file,\n agent: args.agent,\n last: args.last,\n out: args.out,\n copy: args.copy,\n json: args.json,\n });\n }\n if (args.command === \"trends\") {\n return runTrends({\n selector: args.file,\n agent: args.agent,\n last: args.last,\n out: args.out,\n copy: args.copy,\n json: args.json,\n color: args.color,\n });\n }\n if (args.command === \"pr\") {\n return runPr({\n out: args.out,\n branch: args.branchScope,\n base: args.base,\n wholeSession: args.wholeSession,\n store: args.store,\n });\n }\n if (args.command === \"assert\") {\n return runAssert({ selector: args.file, agent: args.agent, json: args.json });\n }\n if (args.command === \"mcp\") {\n // Dynamic import keeps the MCP SDK out of every other code path.\n const { startStdio } = await import(\"./mcp/server.js\");\n await startStdio();\n // Stay alive while the transport serves stdio; resolve when the client\n // closes the input stream (so the process exits cleanly).\n await new Promise<void>((resolve) => {\n process.stdin.once(\"close\", resolve);\n process.stdin.once(\"end\", resolve);\n });\n return 0;\n }\n\n if (!(await anyDetected())) {\n process.stderr.write(\n `No agent transcripts found under ${rootsHint()}.\\nRun a coding-agent session first, then try again.\\n`,\n );\n return 1;\n }\n\n const sessions = await listSessions(args.agent);\n\n if (args.list) {\n process.stdout.write(renderList(sessions, { color: args.color }));\n return 0;\n }\n\n const summary = selectSummary(sessions, args.selector);\n if (!summary) {\n process.stderr.write(\n args.selector\n ? `No session matched \"${args.selector}\". Try \\`receipts --list\\`.\\n`\n : \"No sessions found.\\n\",\n );\n return 1;\n }\n\n const session = await loadSession(summary);\n if (!session) {\n process.stderr.write(`Could not read session: ${summary.id}\\n`);\n return 1;\n }\n\n const derived = deriveSpans(session);\n const findings = deriveFindings(derived);\n\n if (args.json) {\n let receipt = await buildReceipt(session, derived, findings);\n if (args.redact) {\n receipt = redactReceipt(receipt);\n }\n const out = args.compact ? canonicalize(receipt) : JSON.stringify(receipt, null, 2);\n if (args.out) {\n writeFileSync(args.out, `${out}\\n`);\n process.stderr.write(`Receipt written to ${args.out}\\n`);\n return 0;\n }\n emit(out, args.copy, \"Receipt\");\n return 0;\n }\n\n if (args.share) {\n const md = renderShareMarkdown({ summary, session, derived, findings });\n emit(md.trimEnd(), args.copy, \"Shareable summary\");\n return 0;\n }\n\n if (args.handoff) {\n const receipt = redactReceipt(await buildReceipt(session, derived, findings));\n const md = renderHandoffMarkdown(buildHandoff(receipt, findings));\n emit(md.trimEnd(), args.copy, \"Handoff\");\n return 0;\n }\n\n process.stdout.write(renderCard({ summary, derived, findings }, { color: args.color }));\n return 0;\n}\n\nfunction git(args: string[]): string {\n const r = spawnSync(\"git\", args, { encoding: \"utf8\" });\n return r.status === 0 ? r.stdout.trim() : \"\";\n}\n\n/**\n * `receipts pr` — find the session that built the current git branch (matching\n * gitBranch + repo root from the transcript), and write its redacted Receipt to\n * `.receipts/<branch>.json` so the \"Verified-by: Receipts\" workflow can sign it.\n */\n/** How many recent in-repo sessions to scan when the branch session didn't produce the\n * diff (the integration-branch / squash-merge case). Bounds the cost of the fallback. */\nconst PR_SELECT_SCAN = 150;\n\n/** A loaded session + its derived evidence, returned by the `pr` session picker. */\ninterface PickedSession {\n summary: SessionSummary;\n session: Session;\n derived: DerivedSummary;\n}\n\n/** How many of `files` (the diff) a session's edits touched — the evidence that this\n * session actually produced (part of) the change. */\nexport function diffOverlap(derived: DerivedSummary, files: readonly string[]): number {\n return derived.filesChanged.filter((f) => inDiff(f.path, files)).length;\n}\n\n/** Earliest author time (epoch ms) of any commit unique to this branch, or null when\n * unknowable (no base, no commits yet, no git). Author time — not commit time — keeps\n * rebases and cherry-picks permissive: carried-over work keeps its old author date, so\n * the old session that produced it stays eligible (SPEC-0068 R3). */\nexport function branchBirthMs(base?: string): number | null {\n if (!base) {\n return null;\n }\n const out = git([\"log\", \"--reverse\", \"--format=%at\", `${base}..HEAD`]);\n const first = Number(out.split(\"\\n\")[0]?.trim());\n return Number.isFinite(first) && first > 0 ? first * 1000 : null;\n}\n\n/** A fallback-scan candidate is stale — and ineligible — when it ended before the\n * branch's first commit was authored: a session that ended before the branch existed\n * cannot have produced its diff (SPEC-0068 R3). Unknown times ⇒ not stale (guard off). */\nexport function staleForBranch(endedAt: number | undefined, birthMs: number | null): boolean {\n return birthMs != null && endedAt != null && endedAt < birthMs;\n}\n\n/**\n * Pick the session that backs a diff-scoped `receipts pr`. A diff-scoped receipt is about\n * *who produced this change*, so the right session is the one whose edits **overlap the\n * diff** — not merely one carrying the branch tag. The branch-matched session is tried\n * first (cheap, the common feature-branch case); only when it didn't touch the diff (an\n * integration/release branch whose work was merged from feature branches, or a squash\n * workflow — where the branch tag carries only unrelated sessions) do we scan recent\n * in-repo sessions for the real author. Evidence-based: only a session that edited a diff\n * file can win, so this never mis-attributes an unrelated session's work (cf. M56). Returns\n * the branch session (even at 0 overlap) as an honest last resort, or null if none.\n */\nasync function pickForDiff(\n all: SessionSummary[],\n branch: string,\n repoRoot: string | undefined,\n files: readonly string[],\n birthMs: number | null = null,\n shas: readonly string[] = [],\n): Promise<PickedSession | null> {\n const load = async (sum: SessionSummary): Promise<PickedSession | null> => {\n const session = await loadSession(sum);\n if (!session) {\n return null;\n }\n return { summary: sum, session, derived: deriveSpans(session) };\n };\n\n // 0) strongest evidence first (SPEC-0069): a session whose `git commit`/`git push`\n // OUTPUT carries one of this branch's commit SHAs authored the branch — exact and\n // agent-agnostic (Codex/Cursor record no branch tags and often edit via shell, so\n // the tag and edit-overlap selectors below can't see them). The pool is NOT\n // repo-filtered: a commit SHA is globally unique, so a session run from another\n // checkout (worktree, cross-repo tooling) attributes correctly too. Most-recent\n // first; the first authored match wins.\n if (shas.length > 0) {\n for (const sum of all.slice(0, PR_SELECT_SCAN)) {\n const cand = await load(sum);\n if (cand && authoredBranch(cand.derived.spans, shas)) {\n return cand;\n }\n }\n }\n\n // 1) cheap path: the branch-matched session, if it actually produced the diff.\n const primarySum = selectForBranch(all, branch, repoRoot);\n const primary = primarySum ? await load(primarySum) : null;\n if (primary && diffOverlap(primary.derived, files) > 0) {\n return primary;\n }\n\n // 2) the branch session didn't touch the diff → find the session that did, among the\n // most-recent in-repo sessions (bounded). Most-recent-first, so ties keep the newest.\n // Stale guard (SPEC-0068 R3): unlike the tag-matched primary, a scan candidate's only\n // evidence is file overlap — and an old session that once edited the same hot file\n // (.husky/pre-push, cli.ts, README) overlaps every later diff that touches it. A\n // session that ended before this branch's first commit was authored is excluded.\n let best: PickedSession | null = null;\n let bestScore = 0;\n const recent = all\n .filter((s) => inRepo(s.projectPath, repoRoot))\n .filter((s) => !staleForBranch(s.endedAt, birthMs))\n .slice(0, PR_SELECT_SCAN);\n for (const sum of recent) {\n const cand = await load(sum);\n if (!cand) {\n continue;\n }\n const score = diffOverlap(cand.derived, files);\n if (score > bestScore) {\n best = cand;\n bestScore = score;\n }\n }\n return best ?? primary;\n}\n\nasync function runPr(opts: {\n out?: string;\n branch?: string;\n base?: string;\n store?: string;\n wholeSession?: boolean;\n}): Promise<number> {\n const branch = opts.branch || git([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n const repoRoot = git([\"rev-parse\", \"--show-toplevel\"]);\n if (!branch || branch === \"HEAD\") {\n process.stderr.write(\"receipts pr: not on a git branch (use --branch <name>).\\n\");\n return 1;\n }\n\n // Diff-scope by default: the receipt reflects only this PR's change. The changed\n // file set is recorded in `predicate.scope` so the receipt stays re-derivable\n // (SPEC-0013). Fall back to a branch slice, then the whole session, and say which.\n const diff = opts.wholeSession ? null : changedFiles(opts.base);\n const all = await listSessions();\n const picked = diff\n ? await pickForDiff(\n all,\n branch,\n repoRoot || undefined,\n diff.files,\n branchBirthMs(diff.base),\n branchShas(diff.base),\n )\n : await (async () => {\n const sum = selectForBranch(all, branch, repoRoot || undefined);\n return sum ? { summary: sum, session: await loadSession(sum), derived: null } : null;\n })();\n\n if (!picked || !picked.session) {\n process.stderr.write(\n `receipts pr: no agent session found for branch \"${branch}\" in this repo.\\nBuild the branch with a coding agent first, or run \\`receipts --list\\`.\\n`,\n );\n return 1;\n }\n const { summary, session } = picked;\n\n let scopedSession = session;\n let derived = picked.derived ?? deriveSpans(session);\n let findings = deriveFindings(derived);\n let scope: ReceiptScope = { kind: \"session\" };\n let scopeNote = \"whole session\";\n\n if (diff) {\n const sd = applyDiffScope(derived, findings, diff.files, session.projectPath);\n derived = sd.derived;\n findings = sd.findings;\n scope = { kind: \"diff\", base: diff.base, files: diff.files };\n scopeNote = `diff vs ${diff.base} (${diff.files.length} file${diff.files.length === 1 ? \"\" : \"s\"})`;\n // Branch-narrowed effort (SPEC-0068 R4): this branch's turns ∩ diff-file edits.\n // `scope.branch` records the narrowing so rederive reproduces it byte-for-byte.\n const slice = sliceByBranch(session, branch);\n const eff = narrowEffort(slice ? deriveSpans(slice) : null, diff.files);\n if (eff) {\n derived = { ...derived, diffCostUsd: eff.cost, diffTokens: eff.tokens, diffTurns: eff.turns };\n scope.branch = branch;\n }\n } else if (!opts.wholeSession) {\n const slice = sliceByBranch(session, branch);\n if (slice) {\n scopedSession = slice;\n derived = deriveSpans(slice);\n findings = deriveFindings(derived);\n scope = { kind: \"branch\", branch };\n scopeNote = `branch ${branch} (no git diff)`;\n } else {\n scopeNote = \"whole session (no diff / branch tags)\";\n }\n }\n\n const receipt = redactReceipt(await buildReceipt(scopedSession, derived, findings, { scope }));\n const json = `${JSON.stringify(receipt, null, 2)}\\n`;\n\n // M65 (SPEC-0064): where the receipt lives is configurable; default `commit` keeps today's\n // behavior. `none` emits to stdout and writes nothing (opt out of committed receipts). The\n // clutter-reducing transports (`ephemeral`/`notes`/`upload`) are not built yet — they fall\n // back to `commit` with a notice so nothing silently changes.\n const store = (opts.store || process.env.RECEIPTS_STORE || \"commit\").toLowerCase();\n if (store === \"none\") {\n process.stdout.write(json);\n process.stderr.write(\n `receipts pr: store=none — printed the receipt (Grade ${receipt.predicate.grade}, ${scopeNote}); wrote nothing.\\n`,\n );\n return 0;\n }\n if ([\"ephemeral\", \"notes\", \"upload\"].includes(store)) {\n process.stderr.write(\n `receipts pr: store=${store} not yet implemented (SPEC-0064) — using \\`commit\\`.\\n`,\n );\n } else if (store !== \"commit\") {\n process.stderr.write(`receipts pr: unknown store=${store} — using \\`commit\\`.\\n`);\n }\n\n const safe = branch.replace(/[/\\\\]/g, \"-\");\n const dir = join(repoRoot || \".\", \".receipts\");\n const out = opts.out ?? join(dir, `${safe}.json`);\n mkdirSync(dir, { recursive: true });\n // Mark receipts linguist-generated so GitHub collapses them in PR diffs (the\n // \"one more JSON in every PR\" complaint — docs/research/receipt-transport-options.md).\n // Written here, not just in init, so existing adopters pick it up on their next receipt.\n const attrs = join(dir, \".gitattributes\");\n if (!existsSync(attrs)) {\n writeFileSync(attrs, \"* linguist-generated\\n\");\n git([\"add\", attrs]);\n }\n writeFileSync(out, json);\n git([\"add\", out]); // best-effort stage\n\n const rel = repoRoot ? relative(repoRoot, out) : out;\n process.stderr.write(\n `receipts pr: wrote ${rel} (Grade ${receipt.predicate.grade}, ${scopeNote}) from \"${summary.title ?? \"untitled\"}\".\\n`,\n );\n return 0;\n}\n\n/**\n * `receipts guardrails [selector] [--last N]` — turn findings into a paste-ready\n * prevention block (AGENTS.md / CLAUDE.md). Aggregates the deduped guardrailRules.\n */\nasync function runGuardrails(opts: {\n selector?: string;\n agent?: AgentSource;\n last?: number;\n out?: string;\n copy?: boolean;\n json?: boolean;\n}): Promise<number> {\n if (!(await anyDetected())) {\n process.stderr.write(`No agent transcripts found under ${rootsHint()}.\\n`);\n return 1;\n }\n\n const derivations = await deriveTargets({\n agent: opts.agent,\n last: opts.last,\n selector: opts.selector,\n });\n if (derivations.length === 0) {\n process.stderr.write(\"guardrails: no matching session.\\n\");\n return 1;\n }\n const findingSets = derivations.map((d) => d.findings);\n\n const rules = collectGuardrails(findingSets);\n const block = renderGuardrailsBlock(rules, opts.json ? \"json\" : \"md\");\n\n if (opts.out) {\n const existing = existsSync(opts.out) ? readFileSync(opts.out, \"utf8\") : \"\";\n writeFileSync(opts.out, upsertGuardrailsSection(existing, block));\n process.stderr.write(\n `guardrails: wrote ${rules.length} rule(s) to ${opts.out} (from ${findingSets.length} session${findingSets.length === 1 ? \"\" : \"s\"}).\\n`,\n );\n return 0;\n }\n\n emit(block, opts.copy ?? false, \"Guardrails\");\n if (opts.last) {\n process.stderr.write(`(from the last ${findingSets.length} sessions)\\n`);\n }\n return 0;\n}\n\n/**\n * `receipts trends [--last N]` — a cross-session digest: grade movement, the finding\n * kinds that recur most, and evidence totals over your last N sessions. Reuses the\n * same per-session derivation as the Report Card; deterministic, zero model calls.\n */\nasync function runTrends(opts: {\n selector?: string;\n agent?: AgentSource;\n last?: number;\n out?: string;\n copy?: boolean;\n json?: boolean;\n color?: boolean;\n}): Promise<number> {\n if (!(await anyDetected())) {\n process.stderr.write(`No agent transcripts found under ${rootsHint()}.\\n`);\n return 1;\n }\n\n // A trend needs a window: default to the last 10 sessions. An explicit selector\n // pins a single session; --last N overrides both.\n const requested = opts.last && opts.last > 0 ? opts.last : opts.selector ? 1 : 10;\n const derivations = await deriveTargets(\n opts.last && opts.last > 0\n ? { agent: opts.agent, last: opts.last }\n : opts.selector\n ? { agent: opts.agent, selector: opts.selector }\n : { agent: opts.agent, last: 10 },\n );\n if (derivations.length === 0) {\n process.stderr.write(\"trends: no matching sessions.\\n\");\n return 1;\n }\n\n // deriveTargets is most-recent-first; the digest reads oldest → newest.\n const inputs = derivations\n .slice()\n .reverse()\n .map((d) => ({ derived: d.derived, findings: d.findings }));\n const trends = computeTrends(inputs, requested);\n\n if (opts.out) {\n const block = renderTrends(trends, \"md\");\n const existing = existsSync(opts.out) ? readFileSync(opts.out, \"utf8\") : \"\";\n writeFileSync(opts.out, upsertTrendsSection(existing, block));\n process.stderr.write(\n `trends: wrote section to ${opts.out} (from ${trends.window.used} sessions).\\n`,\n );\n return 0;\n }\n\n if (opts.json) {\n emit(renderTrends(trends, \"json\"), opts.copy ?? false, \"Trends\");\n return 0;\n }\n\n process.stdout.write(renderTrends(trends, \"card\", { color: opts.color }));\n if (opts.copy) {\n const ok = copyToClipboard(renderTrends(trends, \"card\", { color: false }));\n process.stderr.write(\n ok ? \"Trends copied to clipboard.\\n\" : \"Clipboard unavailable — copy the output above.\\n\",\n );\n }\n return 0;\n}\n\n/** `receipts envelope <receipt.json>` — wrap a Receipt as an unsigned DSSE envelope. */\nfunction runEnvelope(file?: string): number {\n if (!file) {\n process.stderr.write(\"Usage: receipts envelope <receipt.json>\\n\");\n return 1;\n }\n try {\n const receipt = JSON.parse(readFileSync(file, \"utf8\"));\n process.stdout.write(`${JSON.stringify(toDsseEnvelope(receipt), null, 2)}\\n`);\n return 0;\n } catch (err) {\n process.stderr.write(`Could not read ${file}: ${err instanceof Error ? err.message : err}\\n`);\n return 1;\n }\n}\n\n/** `receipts verify <bundle> [--transcript <t> --branch b]` — structural + re-derivation. */\nasync function runVerify(\n file?: string,\n opts: { transcript?: string; branch?: string } = {},\n): Promise<number> {\n if (!file) {\n process.stderr.write(\"Usage: receipts verify <bundle.json> [--transcript <t> [--branch b]]\\n\");\n return 1;\n }\n let input: unknown;\n try {\n input = JSON.parse(readFileSync(file, \"utf8\"));\n } catch (err) {\n process.stderr.write(`Could not read ${file}: ${err instanceof Error ? err.message : err}\\n`);\n return 1;\n }\n const result = verifyBundle(input);\n if (!result.ok) {\n process.stderr.write(\"✗ Invalid Receipt:\\n\");\n for (const e of result.errors) {\n process.stderr.write(` - ${e}\\n`);\n }\n return 1;\n }\n\n const sig = result.signed\n ? `signed${result.rekorLogIndex !== undefined ? ` · Rekor #${result.rekorLogIndex}` : \"\"}`\n : \"unsigned\";\n process.stdout.write(`✓ Valid Receipt — Grade ${result.grade} · ${sig}\\n`);\n if (result.signer) {\n process.stdout.write(` signer: ${result.signer}\\n`);\n }\n\n // Re-derivation: prove the Receipt is faithful to its transcript (L1).\n if (opts.transcript && result.receipt) {\n const cmp = await compareToTranscript(result.receipt, opts.transcript, { branch: opts.branch });\n if (!cmp.rederived) {\n process.stderr.write(\" ✗ could not re-derive from the supplied transcript\\n\");\n return 1;\n }\n if (!cmp.matches) {\n process.stderr.write(\n \" ✗ re-derivation MISMATCH — the Receipt does not match its transcript (possibly hand-edited)\\n\",\n );\n return 1;\n }\n process.stdout.write(\" ✓ re-derived — faithful to the transcript (L1)\\n\");\n return 0;\n }\n\n process.stdout.write(\n \" Note: structural check only. Pass --transcript to prove fidelity (L1); `gh attestation verify` for full Sigstore/Rekor.\\n\",\n );\n return 0;\n}\n\n/** `receipts diff <a.json> <b.json>` — what changed between two receipts (M51). */\nfunction runDiff(\n fileA?: string,\n fileB?: string,\n opts: { json?: boolean; out?: string } = {},\n): number {\n let pathA = fileA;\n let pathB = fileB;\n // No args → \"what changed since the last run\": diff the two most recent committed\n // receipts in .receipts/ (composes `log`'s history with `diff`). A = older, B = newest.\n if (!pathA && !pathB) {\n const hist = loadReceiptHistory(\".receipts\");\n if (hist.length < 2) {\n process.stderr.write(\n `receipts diff: need two receipts. Found ${hist.length} in .receipts/ — pass two explicitly: receipts diff <a.json> <b.json>.\\n`,\n );\n return 1;\n }\n pathA = join(\".receipts\", `${hist[1].name}.json`); // second-newest = baseline\n pathB = join(\".receipts\", `${hist[0].name}.json`); // newest = new\n process.stdout.write(`receipts diff: ${hist[1].name} → ${hist[0].name} (most recent two)\\n\\n`);\n }\n if (!pathA || !pathB) {\n process.stderr.write(\n \"Usage: receipts diff [<receiptA.json> <receiptB.json>] [--json] [--out <f>]\\n\" +\n \" with no args, diffs the two most recent receipts in .receipts/\\n\",\n );\n return 1;\n }\n const read = (f: string): Receipt | null => {\n let input: unknown;\n try {\n input = JSON.parse(readFileSync(f, \"utf8\"));\n } catch (err) {\n process.stderr.write(`Could not read ${f}: ${err instanceof Error ? err.message : err}\\n`);\n return null;\n }\n const res = verifyBundle(input);\n if (!res.ok || !res.receipt) {\n process.stderr.write(`✗ ${f} is not a valid Receipt:\\n`);\n for (const e of res.errors) process.stderr.write(` - ${e}\\n`);\n return null;\n }\n return res.receipt;\n };\n const a = read(pathA);\n const b = read(pathB);\n if (!a || !b) return 1;\n\n const delta = diffReceipts(a, b);\n const output = opts.json ? `${JSON.stringify(delta, null, 2)}\\n` : renderDiff(delta);\n if (opts.out) {\n writeFileSync(opts.out, output);\n process.stdout.write(`receipts diff: wrote ${opts.out}\\n`);\n } else {\n process.stdout.write(output);\n }\n return 0;\n}\n\n/** `receipts log [dir]` — list the committed receipts in `.receipts/` (M52). */\nfunction runLog(dir?: string, opts: { json?: boolean; last?: number; out?: string } = {}): number {\n const all = loadReceiptHistory(dir ?? \".receipts\");\n const shown = opts.last ? all.slice(0, opts.last) : all;\n const output = opts.json ? `${JSON.stringify(shown, null, 2)}\\n` : renderLog(shown, all.length);\n if (opts.out) {\n writeFileSync(opts.out, output);\n process.stdout.write(`receipts log: wrote ${opts.out}\\n`);\n } else {\n process.stdout.write(output);\n }\n return 0;\n}\n\n/** `receipts stats [dir]` — dogfooding scoreboard over the committed receipts (M53). */\nfunction runStats(dir?: string, opts: { json?: boolean; out?: string } = {}): number {\n const stats = computeStats(dir ?? \".receipts\");\n const output = opts.json ? `${JSON.stringify(stats, null, 2)}\\n` : renderStats(stats);\n if (opts.out) {\n writeFileSync(opts.out, output);\n process.stdout.write(`receipts stats: wrote ${opts.out}\\n`);\n } else {\n process.stdout.write(output);\n }\n return 0;\n}\n\n/** `receipts badge` (M59) — emit a shields.io endpoint JSON for a committed receipt (the\n * branch receipt by default), an at-a-glance factual state for a README/PR badge. States the\n * finding count, colors by worst severity; never a quality verdict (R2). Deterministic. */\nfunction runBadge(file?: string, opts: { out?: string } = {}): number {\n const repoRoot = git([\"rev-parse\", \"--show-toplevel\"]) || \".\";\n const branch = git([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n const path =\n file ??\n (branch && branch !== \"HEAD\"\n ? join(repoRoot, \".receipts\", `${branch.replace(/[/\\\\]/g, \"-\")}.json`)\n : undefined);\n if (!path || !existsSync(path)) {\n process.stderr.write(\n `receipts badge: no receipt found${path ? ` at ${path}` : \"\"}. Run \\`receipts pr\\` first, or pass a receipt path.\\n`,\n );\n return 1;\n }\n let input: unknown;\n try {\n input = JSON.parse(readFileSync(path, \"utf8\"));\n } catch {\n process.stderr.write(`receipts badge: could not parse ${path}\\n`);\n return 1;\n }\n const res = verifyBundle(input);\n if (!res.ok || !res.receipt) {\n process.stderr.write(`receipts badge: ${path} is not a valid Receipt.\\n`);\n return 1;\n }\n const output = `${JSON.stringify(badgeEndpoint(res.receipt.predicate), null, 2)}\\n`;\n if (opts.out) {\n writeFileSync(opts.out, output);\n process.stdout.write(`receipts badge: wrote ${opts.out}\\n`);\n } else {\n process.stdout.write(output);\n }\n return 0;\n}\n\n/** `receipts sarif` (M63) — emit SARIF 2.1.0 for a committed receipt (the branch receipt by\n * default) so GitHub code-scanning can post findings inline + in the Security tab. Pure\n * transform; uploading is the user's CI step (see docs/sarif.md). */\nfunction runSarif(file?: string, opts: { out?: string } = {}): number {\n const repoRoot = git([\"rev-parse\", \"--show-toplevel\"]) || \".\";\n const branch = git([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n const path =\n file ??\n (branch && branch !== \"HEAD\"\n ? join(repoRoot, \".receipts\", `${branch.replace(/[/\\\\]/g, \"-\")}.json`)\n : undefined);\n if (!path || !existsSync(path)) {\n process.stderr.write(\n `receipts sarif: no receipt found${path ? ` at ${path}` : \"\"}. Run \\`receipts pr\\` first, or pass a receipt path.\\n`,\n );\n return 1;\n }\n let input: unknown;\n try {\n input = JSON.parse(readFileSync(path, \"utf8\"));\n } catch {\n process.stderr.write(`receipts sarif: could not parse ${path}\\n`);\n return 1;\n }\n const res = verifyBundle(input);\n if (!res.ok || !res.receipt) {\n process.stderr.write(`receipts sarif: ${path} is not a valid Receipt.\\n`);\n return 1;\n }\n const output = `${JSON.stringify(toSarif(res.receipt), null, 2)}\\n`;\n if (opts.out) {\n writeFileSync(opts.out, output);\n process.stdout.write(`receipts sarif: wrote ${opts.out}\\n`);\n } else {\n process.stdout.write(output);\n }\n return 0;\n}\n\n/** `receipts prune` (M65b) — the committed-receipt clutter reducer: remove\n * `.receipts/<branch>.json` files whose branch no longer exists on the remote (merged/deleted),\n * keeping live-branch receipts + the example files. Live branches come from `git ls-remote`; if\n * that can't be read, it aborts and removes nothing. `--dry-run` previews. */\nfunction runPrune(dir?: string, opts: { dryRun?: boolean } = {}): number {\n const repoRoot = git([\"rev-parse\", \"--show-toplevel\"]) || \".\";\n const dpath = dir ?? join(repoRoot, \".receipts\");\n let files: string[];\n try {\n files = readdirSync(dpath).filter((f) => f.endsWith(\".json\"));\n } catch {\n process.stderr.write(`receipts prune: no ${dpath} directory.\\n`);\n return 0;\n }\n const ls = git([\"ls-remote\", \"--heads\", \"origin\"]);\n if (ls === null) {\n process.stderr.write(\n \"receipts prune: could not list remote branches (offline / no 'origin'?) — aborting, nothing removed.\\n\",\n );\n return 1;\n }\n const liveSlugs = new Set(\n ls\n .split(\"\\n\")\n .map((l) => l.split(\"refs/heads/\")[1])\n .filter(Boolean)\n .map((b) => branchSlug(b.trim())),\n );\n const { keep, remove } = planPrune(files, liveSlugs);\n if (remove.length === 0) {\n process.stdout.write(`receipts prune: nothing to prune (${keep.length} receipt(s) kept).\\n`);\n return 0;\n }\n if (opts.dryRun) {\n process.stdout.write(\n `receipts prune (dry-run): would remove ${remove.length}/${files.length} receipt(s), keep ${keep.length}:\\n`,\n );\n for (const f of remove) {\n process.stdout.write(` - ${f}\\n`);\n }\n return 0;\n }\n for (const f of remove) {\n const p = join(dpath, f);\n if (git([\"rm\", \"-f\", \"--\", p]) === null) {\n try {\n unlinkSync(p);\n } catch {\n /* already gone */\n }\n }\n }\n process.stdout.write(\n `receipts prune: removed ${remove.length} receipt(s) for merged/deleted branches; kept ${keep.length}.\\n`,\n );\n return 0;\n}\n\n/** `receipts eval` — field scan (M57): run the work-account detectors over your own real\n * local agent sessions and report how often each merge-surface category fires. A flag rate\n * the human interprets (a flag may be a true finding or an FP), never a verdict. Local-first\n * (reads only local sessions), deterministic, 0 model calls. `--last N` bounds the scan\n * (default 200, most-recent first). The labeled precision/recall corpus is a dev/CI artifact\n * (see `eval/corpus.json` + `test/eval.test.ts`), not shipped through this command. */\nasync function runEval(\n opts: { json?: boolean; limit?: number; agent?: AgentSource } = {},\n): Promise<number> {\n const limit = opts.limit && opts.limit > 0 ? opts.limit : 200;\n const summaries = (await listSessions(opts.agent)).slice(0, limit);\n const rows: FieldRow[] = [];\n for (const summary of summaries) {\n const session = await loadSession(summary);\n if (!session) {\n continue;\n }\n const { main, minor } = deriveFindings(deriveSpans(session));\n rows.push({\n title: summary.title ?? summary.id,\n categories: [...firedCategories([...main, ...minor])],\n });\n }\n const scan = summarizeFieldScan(rows);\n process.stdout.write(opts.json ? `${JSON.stringify(scan, null, 2)}\\n` : renderFieldScan(scan));\n return 0;\n}\n\n/** `receipts init` — one-command integration (SPEC-0066): scaffold the quiet-mode\n * \"Verified by Receipts\" PR-check workflow AND the repo-committed Claude Code hook\n * (a frozen npx one-liner in .claude/settings.json — every contributor gets it on\n * clone, behavior updates ship via npm). `--prepare` additionally wires the git-hook\n * floor into package.json. Each artifact is independently idempotent. `--pr` then\n * does the ceremony too: branch, commit (only the generated files), push, open the\n * PR — each step best-effort, degrading to printed instructions. */\nfunction runInit(opts: { prepare?: boolean; agents?: string[]; pr?: boolean } = {}): number {\n const lines: string[] = [];\n /** files this run actually created or changed — the exact commit for `--pr` */\n const written: string[] = [];\n\n const v = getVersion();\n // Float the major tag (`v0`, `v1` — the `actions/checkout@v4` pattern) so adopters get new\n // minor/patch features automatically on the next CI run; only a major bump needs a workflow\n // edit. Security-strict adopters can pin a full version (vX.Y.Z) or a commit SHA instead.\n const major = /^(\\d+)\\.\\d+\\.\\d+/.exec(v)?.[1];\n const tag = major ? `v${major}` : \"v0\";\n const dir = \".github/workflows\";\n const path = `${dir}/receipts.yml`;\n if (existsSync(path)) {\n lines.push(`receipts init: ${path} already exists — leaving it untouched.`);\n } else {\n mkdirSync(dir, { recursive: true });\n writeFileSync(path, workflowContent(tag, v));\n written.push(path);\n lines.push(`receipts init: wrote ${path} (tracking ${tag}, quiet + non-blocking).`);\n }\n\n // The agent-embedded trigger: generation fires inside any Claude Code session\n // that pushes — repo state, not machine state, so there is nothing to install.\n const settingsPath = join(\".claude\", \"settings.json\");\n const merged = mergeHookIntoSettings(settingsPath);\n if (!merged.ok) {\n lines.push(`receipts init: ${merged.reason}.`);\n } else if (merged.changed) {\n written.push(settingsPath);\n lines.push(`receipts init: added the receipts pre-push hook to ${settingsPath}.`);\n } else {\n lines.push(`receipts init: ${settingsPath} already has the receipts hook.`);\n }\n const ignorePath = join(\".claude\", \".gitignore\");\n if (!existsSync(ignorePath)) {\n writeFileSync(ignorePath, \"*\\n!settings.json\\n!.gitignore\\n\");\n written.push(ignorePath);\n lines.push(`receipts init: wrote ${ignorePath} (commit settings.json, ignore the rest).`);\n }\n // Codex native trigger (SPEC-0069 R4): same schema as Claude's settings hooks,\n // different file + dialect. Written when asked for (--agents codex) or when the\n // repo already carries a .codex/ dir (the team clearly uses Codex).\n if (opts.agents?.includes(\"codex\") || existsSync(\".codex\")) {\n const codexPath = join(\".codex\", \"hooks.json\");\n const m = mergeHookIntoSettings(\n codexPath,\n \"npx -y altimate-receipts@latest hook pre-push --agent codex\",\n );\n if (!m.ok) {\n lines.push(`receipts init: ${m.reason}.`);\n } else if (m.changed) {\n written.push(codexPath);\n lines.push(`receipts init: added the receipts pre-push hook to ${codexPath}.`);\n } else {\n lines.push(`receipts init: ${codexPath} already has the receipts hook.`);\n }\n }\n\n // Receipts are linguist-generated: GitHub collapses them in PR diffs, so the\n // committed .receipts/<branch>.json never adds review noise.\n const attrsPath = join(\".receipts\", \".gitattributes\");\n if (!existsSync(attrsPath)) {\n mkdirSync(\".receipts\", { recursive: true });\n writeFileSync(attrsPath, \"* linguist-generated\\n\");\n written.push(attrsPath);\n lines.push(`receipts init: wrote ${attrsPath} (receipts collapse in PR diffs).`);\n }\n\n if (opts.prepare) {\n const wired = wirePrepareScript(\"package.json\");\n if (!wired.ok) {\n lines.push(`receipts init: ${wired.reason}.`);\n } else if (wired.changed) {\n written.push(\"package.json\");\n lines.push(\n \"receipts init: wired `prepare` in package.json — `npm install` now self-installs the git hook.\",\n );\n } else {\n lines.push(\"receipts init: package.json `prepare` already wired.\");\n }\n }\n\n if (opts.pr) {\n openAdoptionPr(written, lines);\n } else {\n lines.push(\" Commit these, open a PR, and receipts attach themselves from then on.\");\n lines.push(\" (Or let init do that too: `npx altimate-receipts init --pr`.)\");\n }\n if (written.includes(settingsPath)) {\n // Field-observed: a session that ran init then pushed got no receipt — agent\n // runtimes snapshot project hooks at session START, so the hook arms next session.\n lines.push(\" Note: agent sessions load hooks at startup — restart any running session once.\");\n }\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n return 0;\n}\n\nconst ADOPT_BRANCH = \"chore/adopt-receipts\";\n\n/** `init --pr` — finish the ceremony: branch, commit ONLY the files init generated,\n * push, open the PR (gh when available, else the GitHub compare URL). Every step is\n * best-effort: a failure prints what to do by hand and never loses the files. */\nfunction openAdoptionPr(written: string[], lines: string[]): void {\n if (written.length === 0) {\n lines.push(\"receipts init: nothing new to commit — the repo is already integrated.\");\n return;\n }\n if (!git([\"rev-parse\", \"--git-dir\"])) {\n lines.push(\"receipts init: not a git repository — commit the files above manually.\");\n return;\n }\n if (git([\"rev-parse\", \"--verify\", \"--quiet\", ADOPT_BRANCH]) !== \"\") {\n lines.push(\n `receipts init: branch ${ADOPT_BRANCH} already exists — commit the files above to it manually.`,\n );\n return;\n }\n if (spawnSync(\"git\", [\"checkout\", \"-b\", ADOPT_BRANCH], { encoding: \"utf8\" }).status !== 0) {\n lines.push(`receipts init: could not create branch ${ADOPT_BRANCH} — commit manually.`);\n return;\n }\n spawnSync(\"git\", [\"add\", \"--\", ...written], { encoding: \"utf8\" });\n // No --no-verify: the repo's own pre-commit checks should see the change. If they\n // reject it, the files stay staged on the branch for the owner to finish.\n const commit = spawnSync(\n \"git\",\n [\"commit\", \"-m\", \"chore: adopt receipts — zero-install agent-work verification\"],\n { encoding: \"utf8\" },\n );\n if (commit.status !== 0) {\n lines.push(\n `receipts init: commit failed (pre-commit hooks?) — files are staged on ${ADOPT_BRANCH}; finish manually.`,\n );\n return;\n }\n lines.push(`receipts init: committed ${written.length} file(s) on ${ADOPT_BRANCH}.`);\n const push = spawnSync(\"git\", [\"push\", \"-u\", \"origin\", ADOPT_BRANCH], { encoding: \"utf8\" });\n if (push.status !== 0) {\n lines.push(\n \"receipts init: push failed (no remote / auth?) — push the branch and open a PR manually.\",\n );\n return;\n }\n lines.push(`receipts init: pushed ${ADOPT_BRANCH}.`);\n const gh = spawnSync(\n \"gh\",\n [\n \"pr\",\n \"create\",\n \"--title\",\n \"chore: adopt receipts — zero-install agent-work verification\",\n \"--body\",\n \"Adds the Verified-by-Receipts PR check and the repo-committed agent hook (generated by `npx altimate-receipts init --pr`). Contributors install nothing — see https://github.com/AltimateAI/altimate-receipts/blob/main/docs/onboarding.md\",\n ],\n { encoding: \"utf8\" },\n );\n if (gh.status === 0) {\n lines.push(`receipts init: opened the PR — ${gh.stdout.trim().split(\"\\n\").pop()}`);\n return;\n }\n const remote = git([\"remote\", \"get-url\", \"origin\"]);\n const slug = remote ? /github\\.com[:/]([^/]+\\/[^/.]+)/.exec(remote)?.[1] : undefined;\n lines.push(\n slug\n ? `receipts init: open the PR here — https://github.com/${slug}/pull/new/${ADOPT_BRANCH}`\n : \"receipts init: branch pushed — open a PR from it in your forge.\",\n );\n}\n\nfunction workflowContent(tag: string, v: string): string {\n return `name: Verified by Receipts\n\n# Deterministic \"what did the coding agent actually do?\" check on PRs. Quiet + non-blocking\n# pilot: acts only when a branch commits an agent Receipt (.receipts/<branch>.json);\n# otherwise silent. Adds a new \"Receipts\" check only — touches no existing workflow.\n# Docs: https://github.com/AltimateAI/altimate-receipts/blob/main/docs/onboarding-internal.md\n\non:\n pull_request:\n\npermissions:\n contents: read\n id-token: write # Sigstore keyless signing of the receipt\n attestations: write # record the attestation\n pull-requests: write # post the Receipts comment\n checks: write # post the Receipts check\n\njobs:\n receipts:\n # Tracks the ${tag} major tag (auto-gets minor/patch features). Pin a full version\n # (e.g. @v${v}) or a commit SHA for immutability.\n uses: AltimateAI/altimate-receipts/.github/workflows/receipts.reusable.yml@${tag}\n with:\n require-receipt: false # never fail a PR that has no receipt (soft pilot)\n notify-when-missing: false # stay silent unless a receipt is present\n # block-on: \"\" # informational check; never blocks a merge\n`;\n}\n\n/** `receipts hook pre-push --agent <claude|git>` — the agent-embedded trigger\n * (SPEC-0066 R1). Reads one payload from stdin, decides, and at most adds a\n * receipt commit. Never blocks: see src/hook/prePush.ts. */\nasync function runHook(kind: string | undefined, dialect: HookDialect): Promise<number> {\n if (kind !== \"pre-push\") {\n process.stderr.write(\"Usage: receipts hook pre-push [--agent claude|git]\\n\");\n return 1;\n }\n const stdin = await readStdin();\n const res = await runHookPrePush(dialect, stdin, async () => runPr({}));\n if (res.message) {\n process.stderr.write(`${res.message}\\n`);\n }\n return res.exit;\n}\n\n/** `receipts install-hook` — write the npx-shim pre-push hook into .git/hooks\n * (the universal floor; SPEC-0066 R6). */\nfunction runInstallHook(): number {\n const res = installGitHook();\n if (!res.ok) {\n process.stderr.write(`receipts install-hook: ${res.reason}.\\n`);\n return 1;\n }\n const note = {\n installed: `installed ${res.path}`,\n unchanged: `${res.path} already installed`,\n chained: `installed ${res.path} (existing hook preserved as pre-push.local, runs first)`,\n }[res.action];\n process.stdout.write(`receipts install-hook: ${note}.\\n`);\n return 0;\n}\n\n/** `receipts setup-local` — merge the self-gated hook into the USER's\n * ~/.claude/settings.json (SPEC-0066 R8), for repos that commit only the\n * workflow file. Inert outside integrated repos (the R4 gate). */\nfunction runSetupLocal(): number {\n const path = join(homedir(), \".claude\", \"settings.json\");\n const res = mergeHookIntoSettings(path);\n if (!res.ok) {\n process.stderr.write(`receipts setup-local: ${res.reason}.\\n`);\n return 1;\n }\n process.stdout.write(\n res.changed\n ? `receipts setup-local: added the receipts hook to ${path} — active only in repos with the Receipts workflow.\\n`\n : `receipts setup-local: ${path} already has the receipts hook.\\n`,\n );\n return 0;\n}\n\n/** `receipts rederive <transcript>` — reproduce the canonical Receipt from a transcript. */\nasync function runRederive(\n file?: string,\n opts: { branch?: string; redact?: boolean; compact?: boolean } = {},\n): Promise<number> {\n if (!file) {\n process.stderr.write(\"Usage: receipts rederive <transcript.jsonl> [--branch b] [--redact]\\n\");\n return 1;\n }\n const receipt = await rederiveFromTranscript(file, { branch: opts.branch, redact: opts.redact });\n if (!receipt) {\n process.stderr.write(`receipts rederive: could not read a session from ${file}\\n`);\n return 1;\n }\n const out = opts.compact ? canonicalize(receipt) : JSON.stringify(receipt, null, 2);\n process.stdout.write(`${out}\\n`);\n return 0;\n}\n\n/** `receipts assert [selector]` — evaluate `.receipts/asserts.json` against the receipt\n * (a local CI gate the user controls). Exit non-zero iff an error-severity assertion fails\n * or the asserts file is malformed; a missing file is a clean no-op. */\nasync function runAssert(opts: {\n selector?: string;\n agent?: AgentSource;\n json?: boolean;\n}): Promise<number> {\n const repoRoot = git([\"rev-parse\", \"--show-toplevel\"]) || \".\";\n let asserts: Assertion[];\n try {\n asserts = loadAsserts(repoRoot);\n } catch (e) {\n process.stderr.write(`receipts assert: ${(e as Error).message}\\n`);\n return 2; // config error — distinct from an assertion failure\n }\n if (asserts.length === 0) {\n process.stdout.write(`${renderAssertResults([])}\\n`);\n return 0; // absent file ⇒ no-op\n }\n\n const summary = selectSummary(await listSessions(opts.agent), opts.selector);\n if (!summary) {\n process.stderr.write(\n opts.selector\n ? `No session matched \"${opts.selector}\". Try \\`receipts --list\\`.\\n`\n : \"No sessions found.\\n\",\n );\n return 1;\n }\n const session = await loadSession(summary);\n if (!session) {\n process.stderr.write(`Could not read session: ${summary.id}\\n`);\n return 1;\n }\n const derived = deriveSpans(session);\n const receipt = await buildReceipt(session, derived, deriveFindings(derived));\n const results = evaluateAsserts(receipt, asserts);\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(results, null, 2)}\\n`);\n } else {\n process.stdout.write(`${renderAssertResults(results)}\\n`);\n }\n return assertExitCode(results);\n}\n\n/** Write `text` to stdout; if `copy`, also try the clipboard and note the result. */\nfunction emit(text: string, copy: boolean, label: string): void {\n process.stdout.write(`${text}\\n`);\n if (copy) {\n const ok = copyToClipboard(text);\n process.stderr.write(\n ok\n ? `\\n${label} copied to clipboard.\\n`\n : \"\\nClipboard unavailable — copy the output above.\\n\",\n );\n }\n}\n\n// Run only when executed directly as the CLI — not when imported by a test.\n// Resolve symlinks on argv[1] before comparing: Node sets import.meta.url to the\n// realpath of this module, but process.argv[1] is the path as invoked. When the CLI\n// runs through a symlink — e.g. the global npm bin (/usr/local/bin/receipts ->\n// …/dist/cli.js), or under macOS /tmp -> /private/tmp — the two differ and the guard\n// would wrongly treat the entrypoint as an import, running nothing (exit 0, no output).\nfunction resolveEntry(p: string | undefined): string | undefined {\n if (p === undefined) return undefined;\n try {\n return realpathSync(p);\n } catch {\n return p;\n }\n}\nconst entry = resolveEntry(process.argv[1]);\nconst isMain = entry !== undefined && import.meta.url === pathToFileURL(entry).href;\nif (isMain) {\n // Set process.exitCode rather than calling process.exit(): process.exit()\n // terminates before pending async writes to stdout/stderr flush, which silently\n // truncates output when stdout is a pipe/file/redirect (not a TTY). Every command\n // resolves cleanly with no lingering handles, so the process exits naturally once\n // the event loop drains — after the output has flushed.\n run(process.argv)\n .then((code) => {\n process.exitCode = code;\n })\n .catch((err: unknown) => {\n process.stderr.write(`receipts: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exitCode = 1;\n });\n}\n","import { spawnSync } from \"node:child_process\";\nimport { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { isAbsolute, join } from \"node:path\";\n\n/**\n * `receipts install-hook` (SPEC-0066 R6, hardened by SPEC-0068 R1/R2) — the\n * universal floor: a git pre-push hook for humans pushing agent work from a\n * terminal and for agents without a hook system. The script is a frozen npx\n * shim; behavior updates ship via npm. The write location honors the repo's\n * actual hook manager: `.git/hooks` by default, the user-hook dir for husky\n * repos, or a custom `core.hooksPath`.\n */\n\n/** Marker that identifies a pre-push script as ours (idempotency + upgrades). */\nconst MARKER = \"altimate-receipts\";\n\n/** The set-`e`-proof shim body (SPEC-0068 R2). Hook runners (husky among them)\n * may execute hooks under `set -e`, where a bare non-zero npx exit would abort\n * the script — and block the push — before the exit-code check runs. The\n * `|| code=$?` capture keeps every failure path non-blocking; exit 42\n * (REPUSH_EXIT) is the only code that stops the push. */\nconst SHIM_BODY = `command -v npx >/dev/null 2>&1 || exit 0\ncode=0\nnpx -y altimate-receipts@latest hook pre-push --agent git || code=$?\nif [ \"$code\" -eq 42 ]; then exit 1; fi\nexit 0\n`;\n\n/** The git-hooks-dir variant: chains a preserved pre-existing hook first (it\n * gets no stdin refs — pre-push hooks rarely read them — and its failure still\n * blocks, it's the user's gate). */\nconst HOOK_SCRIPT = `#!/bin/sh\n# Verified-by-Receipts pre-push hook — generated by \\`receipts install-hook\\` (altimate-receipts).\n# Attaches this branch's agent receipt before pushing. Best-effort: only the\n# deliberate \"receipt attached, push again\" signal (exit 42) ever stops a push.\nhookdir=$(dirname \"$0\")\nif [ -x \"$hookdir/pre-push.local\" ]; then\n \"$hookdir/pre-push.local\" \"$@\" </dev/null || exit $?\nfi\n${SHIM_BODY}`;\n\n/** The husky variant: husky runs each .husky/<hook> file itself (no shebang,\n * no pre-push.local convention) and is the chaining layer already. */\nconst HUSKY_SCRIPT = `# Verified-by-Receipts pre-push hook — generated by \\`receipts install-hook\\` (altimate-receipts).\n# Attaches this branch's agent receipt before pushing. Best-effort: only the\n# deliberate \"receipt attached, push again\" signal (exit 42) ever stops a push.\n${SHIM_BODY}`;\n\nexport type InstallResult =\n | { ok: true; action: \"installed\" | \"unchanged\" | \"chained\"; path: string }\n | { ok: false; reason: string };\n\nfunction git(args: string[], cwd?: string): string | null {\n const r = spawnSync(\"git\", args, { encoding: \"utf8\", cwd });\n return r.status === 0 ? r.stdout.trim() : null;\n}\n\nconst abs = (p: string, cwd?: string): string =>\n isAbsolute(p) ? p : join(cwd ?? process.cwd(), p);\n\n/** Where this repo actually executes pre-push hooks (SPEC-0068 R1).\n * `--git-path hooks` follows `core.hooksPath`, so a husky repo would resolve to\n * `.husky/_` — a directory husky regenerates, where a written hook silently\n * dies. Inspect `core.hooksPath` explicitly instead. */\nexport function resolveHookTarget(\n cwd?: string,\n): { kind: \"git\" | \"custom\" | \"husky\"; dir: string } | null {\n if (git([\"rev-parse\", \"--git-dir\"], cwd) === null) {\n return null;\n }\n const hooksPath = git([\"config\", \"core.hooksPath\"], cwd);\n if (hooksPath) {\n const parts = hooksPath.split(/[\\\\/]/);\n if (parts.includes(\".husky\")) {\n // husky owns hook dispatch; user hooks live in <repo>/.husky, never `_`\n const root = git([\"rev-parse\", \"--show-toplevel\"], cwd) ?? cwd ?? process.cwd();\n return { kind: \"husky\", dir: join(root, \".husky\") };\n }\n return { kind: \"custom\", dir: abs(hooksPath, cwd) };\n }\n const p = git([\"rev-parse\", \"--git-path\", \"hooks\"], cwd);\n return p ? { kind: \"git\", dir: abs(p, cwd) } : null;\n}\n\n/** Back-compat export: the resolved hooks dir (tests + older callers). */\nexport function hooksDir(cwd?: string): string | null {\n return resolveHookTarget(cwd)?.dir ?? null;\n}\n\nexport function installGitHook(cwd?: string): InstallResult {\n const target = resolveHookTarget(cwd);\n if (!target) {\n return { ok: false, reason: \"not a git repository\" };\n }\n const script = target.kind === \"husky\" ? HUSKY_SCRIPT : HOOK_SCRIPT;\n mkdirSync(target.dir, { recursive: true });\n const hookPath = join(target.dir, \"pre-push\");\n const local = join(target.dir, \"pre-push.local\");\n\n if (existsSync(hookPath)) {\n const current = readFileSync(hookPath, \"utf8\");\n if (current.includes(MARKER)) {\n if (current === script) {\n return { ok: true, action: \"unchanged\", path: hookPath };\n }\n // ours but an older revision — rewrite in place\n writeFileSync(hookPath, script);\n chmodSync(hookPath, 0o755);\n return { ok: true, action: \"installed\", path: hookPath };\n }\n if (target.kind === \"husky\") {\n // husky runs exactly one file per hook and it's the user's; don't edit it\n // (SPEC-0068 NG5) — tell them what to append instead.\n return {\n ok: false,\n reason: `${hookPath} already exists — append this to it:\\n${SHIM_BODY}`,\n };\n }\n // a foreign hook: preserve it as pre-push.local (invoked first by ours)\n if (existsSync(local)) {\n return {\n ok: false,\n reason: `${hookPath} and ${local} both exist and aren't receipts hooks — resolve manually`,\n };\n }\n renameSync(hookPath, local);\n writeFileSync(hookPath, script);\n chmodSync(hookPath, 0o755);\n return { ok: true, action: \"chained\", path: hookPath };\n }\n\n writeFileSync(hookPath, script);\n chmodSync(hookPath, 0o755);\n return { ok: true, action: \"installed\", path: hookPath };\n}\n\n/**\n * `receipts init --prepare` (R7): wire `install-hook` into package.json's\n * `prepare` script so `npm install` self-installs the floor for every\n * contributor. Append with `&&` if a prepare exists; never clobber; idempotent.\n */\nexport type PrepareResult = { ok: true; changed: boolean } | { ok: false; reason: string };\n\nconst PREPARE_CMD = \"npx -y altimate-receipts@latest install-hook\";\n\nexport function wirePrepareScript(pkgPath: string): PrepareResult {\n if (!existsSync(pkgPath)) {\n return { ok: false, reason: `${pkgPath} not found — \\`--prepare\\` needs a package.json` };\n }\n const raw = readFileSync(pkgPath, \"utf8\");\n let pkg: Record<string, unknown>;\n try {\n pkg = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return { ok: false, reason: `${pkgPath} is not valid JSON — leaving it untouched` };\n }\n if (pkg.scripts === undefined) {\n pkg.scripts = {};\n }\n const scripts = pkg.scripts as Record<string, string>;\n const prepare = scripts.prepare;\n if (prepare?.includes(PREPARE_CMD)) {\n return { ok: true, changed: false };\n }\n scripts.prepare = prepare ? `${prepare} && ${PREPARE_CMD}` : PREPARE_CMD;\n // keep the file's indentation (npm writes 2 spaces; some repos use 4 or tabs)\n const indent = raw.match(/^(\\s+)\"/m)?.[1] ?? \" \";\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, indent)}\\n`);\n return { ok: true, changed: true };\n}\n","import { spawnSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { gitInvocations } from \"../trace/gitCommand.js\";\n\n/**\n * `receipts hook pre-push` (SPEC-0066) — the agent-embedded trigger. One frozen\n * command line, two payload dialects:\n *\n * --agent claude Claude Code PreToolUse stdin JSON; fires only when the Bash\n * tool is about to run a real `git push`, and commits the\n * receipt BEFORE the push so it rides the agent's own push.\n * --agent git the git pre-push stdin protocol; fires on a branch push and\n * keeps the capped commit-then-re-push flow (a pre-push hook\n * cannot add commits to the in-flight push).\n *\n * Everything here is best-effort: every failure path exits 0 with at most one\n * stderr line. The hook may only ever add a commit — it must never block the\n * agent's tool call or fail a push.\n */\n\n/** `codex` shares Claude's payload shape exactly (same hooks.json schema, same\n * `tool_name`/`tool_input.command`/`cwd` stdin fields, exit-0-allows) — verified\n * against the Codex hooks docs + a live capture (SPEC-0069 R4). */\nexport type HookDialect = \"claude\" | \"codex\" | \"git\";\n\n/** Exit code the generated git hook script maps to \"stop this push, re-push\" —\n * deliberately distinctive so an npx/registry failure (exit 1) is never mistaken\n * for the intentional signal and can never block a push. */\nexport const REPUSH_EXIT = 42;\n\nconst ATTACH_SUBJECT = (branch: string) => `chore(receipts): attach agent receipt for ${branch}`;\n\nfunction git(args: string[], cwd?: string): string {\n const r = spawnSync(\"git\", args, { encoding: \"utf8\", cwd });\n return r.status === 0 ? r.stdout.trim() : \"\";\n}\n\n/* ------------------------------------------------------------------ matcher */\n\n/** A refspec that names a tag (tag-only pushes carry no branch work). */\nconst TAG_REFSPEC = /^(refs\\/tags\\/|v\\d+(\\.\\d+)*$)/;\n\n/**\n * Does this Bash command string contain a real branch `git push`? (SPEC-0066 R2.)\n * Token scan via the shared `gitInvocations` (quote-blanked, simple-command-anchored\n * — `echo \"git push\"`, `git pushup`, message text never fire; under-fires on exotic\n * quoting by design, Q3), plus push-specific exclusions: dry runs and tag-only\n * pushes carry no branch work.\n */\nexport function isGitPush(command: string): boolean {\n for (const { sub, rest } of gitInvocations(command)) {\n if (sub !== \"push\") {\n continue;\n }\n if (rest.includes(\"--dry-run\") || rest.includes(\"-n\") || rest.includes(\"--tags\")) {\n continue;\n }\n // refspec analysis: `git push origin v1.2.3` (tag-only) must not fire; a\n // pure-flag or remote-only push targets the current branch and does fire.\n const refspecs = rest.filter((t) => !t.startsWith(\"-\")).slice(1); // first positional = remote\n if (refspecs.length > 0 && refspecs.every((r) => TAG_REFSPEC.test(r))) {\n continue;\n }\n return true;\n }\n return false;\n}\n\n/** The git pre-push stdin protocol: `<local_ref> <sha> <remote_ref> <sha>` lines.\n * True iff at least one pushed ref is a branch (tag-only pushes don't trigger). */\nexport function gitStdinPushesBranch(stdin: string): boolean {\n return stdin.split(\"\\n\").some((line) => line.trim().startsWith(\"refs/heads/\"));\n}\n\n/* ----------------------------------------------------------------- gate/cap */\n\nconst hasMarker = (root: string): boolean =>\n existsSync(join(root, \".github\", \"workflows\", \"receipts.yml\")) ||\n existsSync(join(root, \".receipts\"));\n\n/**\n * The universal self-gate (SPEC-0066 R4): the hook is inert unless this repo has\n * opted in — `receipts init`'s workflow file or an existing `.receipts/`. One\n * frozen one-liner therefore works committed in a repo's settings AND in a\n * user's ~/.claude/settings.json without ever firing in non-integrated repos.\n *\n * Worktrees (field-observed in altimate-router): a worktree created before\n * adoption has neither marker in its checkout even though the repo opted in —\n * so also accept the marker in the PRIMARY checkout (the git common dir's\n * parent). Old worktrees then stay covered by the git floor and user-level\n * hooks instead of going silent.\n */\nexport function repoOptedIn(repoRoot: string): boolean {\n if (hasMarker(repoRoot)) {\n return true;\n }\n const common = git([\"rev-parse\", \"--git-common-dir\"], repoRoot);\n if (common.endsWith(\"/.git\")) {\n const primary = common.slice(0, -\"/.git\".length);\n if (primary && primary !== repoRoot) {\n return hasMarker(primary);\n }\n }\n return false;\n}\n\n/** Is HEAD already this branch's receipt-attach commit? The git-mode cap (R6):\n * one auto-commit per push attempt, so a live, still-growing session can never\n * re-push-loop — at worst the receipt is one snapshot behind, honestly. */\nexport function headIsAttachCommit(branch: string, cwd?: string): boolean {\n return git([\"log\", \"-1\", \"--format=%s\"], cwd) === ATTACH_SUBJECT(branch);\n}\n\n/* ------------------------------------------------------------------- runner */\n\n/** Claude Code PreToolUse payload — only the fields we read; extras tolerated. */\ninterface ClaudePayload {\n tool_name?: string;\n tool_input?: { command?: string };\n cwd?: string;\n}\n\nexport async function readStdin(stream: NodeJS.ReadableStream = process.stdin): Promise<string> {\n let data = \"\";\n for await (const chunk of stream) {\n data += chunk;\n }\n return data;\n}\n\nexport interface HookResult {\n exit: number;\n /** single stderr line, when there's something worth saying */\n message?: string;\n}\n\n/**\n * Decide + act for one hook invocation. `generate` is the existing `receipts pr`\n * pipeline (injected to keep this module free of the CLI's session machinery).\n */\nexport async function runHookPrePush(\n dialect: HookDialect,\n stdin: string,\n generate: () => Promise<number>,\n): Promise<HookResult> {\n try {\n if (process.env.RECEIPTS_HOOK === \"0\") {\n return { exit: 0 };\n }\n // Honor the storage opt-out (SPEC-0064): store=none means \"no committed\n // receipts\", so the hook has nothing to attach and stays silent.\n if ((process.env.RECEIPTS_STORE || \"commit\").toLowerCase() === \"none\") {\n return { exit: 0 };\n }\n\n if (dialect === \"claude\" || dialect === \"codex\") {\n let payload: ClaudePayload;\n try {\n payload = JSON.parse(stdin) as ClaudePayload;\n } catch {\n return { exit: 0 };\n }\n if (payload.tool_name !== \"Bash\" || !payload.tool_input?.command) {\n return { exit: 0 };\n }\n if (payload.cwd && existsSync(payload.cwd)) {\n process.chdir(payload.cwd); // generate against the session's repo\n }\n if (!isGitPush(payload.tool_input.command)) {\n return { exit: 0 };\n }\n } else if (!gitStdinPushesBranch(stdin)) {\n return { exit: 0 };\n }\n\n const repoRoot = git([\"rev-parse\", \"--show-toplevel\"]);\n if (!repoRoot || !repoOptedIn(repoRoot)) {\n return { exit: 0 };\n }\n const branch = git([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n if (!branch || branch === \"HEAD\") {\n return { exit: 0 };\n }\n if (dialect === \"git\" && headIsAttachCommit(branch)) {\n return { exit: 0 }; // cap: already attached this push attempt — let it through\n }\n\n // Run the pipeline with stderr muted: a human pushing a hand-written branch\n // must not see \"no agent session found\" on every push (R3: one line max,\n // and only when we actually attach something).\n const write = process.stderr.write.bind(process.stderr);\n process.stderr.write = (() => true) as typeof process.stderr.write;\n let generated: number;\n try {\n generated = await generate();\n } finally {\n process.stderr.write = write;\n }\n if (generated !== 0) {\n return { exit: 0 }; // no matching session / generation declined — never block\n }\n if (!git([\"status\", \"--porcelain\", \".receipts/\"])) {\n return { exit: 0 }; // receipt unchanged — push proceeds untouched\n }\n spawnSync(\"git\", [\"add\", \".receipts/\"], { encoding: \"utf8\" });\n // Pathspec commit: only .receipts/ lands, whatever else is staged stays staged.\n const commit = spawnSync(\n \"git\",\n [\"commit\", \"--no-verify\", \"-m\", ATTACH_SUBJECT(branch), \"--\", \".receipts/\"],\n { encoding: \"utf8\" },\n );\n if (commit.status !== 0) {\n return { exit: 0 };\n }\n if (dialect === \"git\") {\n return {\n exit: REPUSH_EXIT,\n message: `📎 Receipts: attached an agent receipt for '${branch}' — rerun the same \\`git push\\` command to include it.`,\n };\n }\n return {\n exit: 0,\n message: `receipts: attached an agent receipt for '${branch}' — it rides this push.`,\n };\n } catch {\n return { exit: 0 }; // SPEC-0066 R3: any failure → silent allow\n }\n}\n","/**\n * Shared git-invocation tokenizer (extracted in SPEC-0069 — the M67 push matcher\n * and the M70 authorship matcher need identical discipline). Quoted text is\n * blanked first, so `git push` inside a prompt string (`codex exec \"...git\n * push...\"`, `echo \"git push\"`, commit-message text) never reads as a git call;\n * then each `&&`/`||`/`;`/`|`-separated simple command must START with `git`\n * (after env assignments / benign wrappers and git's global flags).\n */\n\n/** Shell wrappers that may legitimately precede `git` in a simple command. */\nconst WRAPPERS = new Set([\"command\", \"exec\", \"nohup\", \"time\", \"env\"]);\n/** Global git flags between `git` and the subcommand that consume a value. */\nconst GIT_VALUE_FLAGS = new Set([\"-C\", \"-c\", \"--git-dir\", \"--work-tree\", \"--exec-path\"]);\n\nexport interface GitInvocation {\n /** the git subcommand: \"push\", \"commit\", \"log\", … */\n sub: string;\n /** tokens after the subcommand (flags + positionals) */\n rest: string[];\n}\n\n/** Every real `git <sub> …` invocation in a (possibly compound) shell command. */\nexport function gitInvocations(command: string): GitInvocation[] {\n const blanked = command\n .replace(/\\\\[\"']/g, \" \")\n .replace(/'[^']*'/g, \" \")\n .replace(/\"[^\"]*\"/g, \" \");\n const out: GitInvocation[] = [];\n for (const simple of blanked.split(/(?:&&|\\|\\||[;|\\n])/)) {\n const tokens = simple.trim().split(/\\s+/).filter(Boolean);\n let i = 0;\n while (\n i < tokens.length &&\n (/^[A-Za-z_][A-Za-z0-9_]*=/.test(tokens[i]) || WRAPPERS.has(tokens[i]))\n ) {\n i++;\n }\n if (tokens[i] !== \"git\") {\n continue;\n }\n i++;\n while (i < tokens.length && tokens[i].startsWith(\"-\")) {\n const flag = tokens[i];\n i++;\n if (GIT_VALUE_FLAGS.has(flag)) {\n i++;\n }\n }\n const sub = tokens[i];\n if (sub) {\n out.push({ sub, rest: tokens.slice(i + 1) });\n }\n }\n return out;\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\n/**\n * Deep-merge the Receipts hook entry into a Claude Code settings.json — used by\n * `receipts init` (the repo's .claude/settings.json) and `receipts setup-local`\n * (the user's ~/.claude/settings.json). SPEC-0066 R5/R8: preserve every existing\n * key and hook, be idempotent, and back off (never clobber) on a malformed file.\n *\n * The command is a FROZEN one-liner: all behavior lives behind npx, so published\n * updates reach every contributor with no re-commit and — because agent runtimes\n * record hook trust against the command text — no re-approval.\n */\nexport const HOOK_COMMAND = \"npx -y altimate-receipts@latest hook pre-push\";\n\ninterface HookEntry {\n matcher?: string;\n hooks?: Array<{ type?: string; command?: string }>;\n}\n\nexport type MergeResult = { ok: true; changed: boolean } | { ok: false; reason: string };\n\n/** Add a PreToolUse→Bash→command entry to `path`, creating the file if absent.\n * Anything already in the file survives byte-meaning-identically. Codex's\n * hooks.json uses the exact same schema as Claude Code's settings hooks\n * (SPEC-0069 R4), so one merger serves both — `command` defaults to Claude's. */\nexport function mergeHookIntoSettings(path: string, command: string = HOOK_COMMAND): MergeResult {\n let settings: Record<string, unknown> = {};\n if (existsSync(path)) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(path, \"utf8\"));\n } catch {\n return { ok: false, reason: `${path} is not valid JSON — leaving it untouched` };\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n return { ok: false, reason: `${path} is not a JSON object — leaving it untouched` };\n }\n settings = parsed as Record<string, unknown>;\n }\n\n if (settings.hooks === undefined) {\n settings.hooks = {};\n }\n const hooks = settings.hooks as Record<string, unknown>;\n if (typeof hooks !== \"object\" || hooks === null || Array.isArray(hooks)) {\n return { ok: false, reason: `${path} has a non-object \"hooks\" key — leaving it untouched` };\n }\n if (hooks.PreToolUse === undefined) {\n hooks.PreToolUse = [];\n }\n const pre = hooks.PreToolUse as HookEntry[];\n if (!Array.isArray(pre)) {\n return { ok: false, reason: `${path} has a non-array hooks.PreToolUse — leaving it untouched` };\n }\n const present = pre.some((e) => e?.hooks?.some((h) => h?.command === command));\n if (present) {\n return { ok: true, changed: false };\n }\n pre.push({ matcher: \"Bash\", hooks: [{ type: \"command\", command }] });\n\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(settings, null, 2)}\\n`);\n return { ok: true, changed: true };\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Receipt, ReceiptPredicate } from \"./build.js\";\n\n/**\n * Receipt assertions (M34, SPEC-0036) — eval-as-code WITHOUT the model judge. A committed\n * `.receipts/asserts.json` of deterministic `{path, op, value}` checks is evaluated\n * mechanically against the just-derived receipt: the **user** supplies the oracle, and\n * Receipts only does exact comparison over evidence it already attests. Pure function of\n * the receipt + the committed file ⇒ re-derivable; zero model calls; no quality verdict.\n */\n\nexport type AssertOp =\n | \"eq\"\n | \"ne\"\n | \"lt\"\n | \"lte\"\n | \"gt\"\n | \"gte\"\n | \"matches\"\n | \"in\"\n | \"empty\"\n | \"exists\";\n\nconst OPS = new Set<AssertOp>([\n \"eq\",\n \"ne\",\n \"lt\",\n \"lte\",\n \"gt\",\n \"gte\",\n \"matches\",\n \"in\",\n \"empty\",\n \"exists\",\n]);\n\nexport interface Assertion {\n /** dotted accessor into `predicate` (e.g. `evidence.costUsd`, `grade`) or a finding\n * selector (`findings.<id>` count, `findings.severity.<level>` count). */\n path: string;\n op: AssertOp;\n value?: unknown;\n /** `error` (default) gates the exit code; `warn` reports but does not fail. */\n severity?: \"error\" | \"warn\";\n}\n\nexport interface AssertResult {\n assertion: Assertion;\n pass: boolean;\n actual: unknown;\n /** a config/usage error (bad op, missing field for a comparison, …) — never a silent pass */\n error?: string;\n}\n\n/** Resolve a dotted `path` into the receipt predicate, with finding selectors. */\nexport function resolvePath(predicate: ReceiptPredicate, path: string): unknown {\n if (path === \"findings\" || path.startsWith(\"findings.\")) {\n const rest = path === \"findings\" ? \"\" : path.slice(\"findings.\".length);\n if (rest === \"\") {\n return predicate.findings.length;\n }\n if (rest.startsWith(\"severity.\")) {\n const level = rest.slice(\"severity.\".length);\n return predicate.findings.filter((f) => f.severity === level).length;\n }\n // `findings.<id>` → count of findings whose id equals or is prefixed by it (so a\n // category like `destructive-git` matches `destructive-git-<span>`).\n return predicate.findings.filter((f) => f.id === rest || f.id.startsWith(`${rest}-`)).length;\n }\n // dotted get into the predicate (evidence.*, grade, scope.*, session.*)\n let cur: unknown = predicate;\n for (const key of path.split(\".\")) {\n if (cur == null || typeof cur !== \"object\") {\n return undefined;\n }\n cur = (cur as Record<string, unknown>)[key];\n }\n return cur;\n}\n\nconst isNum = (v: unknown): v is number => typeof v === \"number\" && Number.isFinite(v);\nconst isEmpty = (v: unknown): boolean =>\n v == null ||\n v === \"\" ||\n v === 0 ||\n (Array.isArray(v) && v.length === 0) ||\n (typeof v === \"object\" && Object.keys(v as object).length === 0);\n\n/** Apply one operator; returns `{pass}` or `{error}` for a config/type misuse. */\nfunction applyOp(\n op: AssertOp,\n actual: unknown,\n value: unknown,\n): { pass: boolean } | { error: string } {\n const needNum = (): { error: string } | null =>\n isNum(actual) && isNum(value)\n ? null\n : { error: `op '${op}' needs a numeric field and value (got ${JSON.stringify(actual)})` };\n switch (op) {\n case \"exists\":\n return { pass: actual !== undefined && actual !== null };\n case \"empty\":\n return { pass: isEmpty(actual) };\n case \"eq\":\n return { pass: actual === value };\n case \"ne\":\n return { pass: actual !== value };\n case \"lt\":\n return needNum() ?? { pass: (actual as number) < (value as number) };\n case \"lte\":\n return needNum() ?? { pass: (actual as number) <= (value as number) };\n case \"gt\":\n return needNum() ?? { pass: (actual as number) > (value as number) };\n case \"gte\":\n return needNum() ?? { pass: (actual as number) >= (value as number) };\n case \"matches\": {\n if (typeof actual !== \"string\" || typeof value !== \"string\") {\n return { error: `op 'matches' needs a string field and a string pattern` };\n }\n try {\n return { pass: new RegExp(value).test(actual) };\n } catch (e) {\n return { error: `invalid regex '${value}': ${(e as Error).message}` };\n }\n }\n case \"in\":\n return Array.isArray(value)\n ? { pass: value.includes(actual) }\n : { error: `op 'in' needs an array value` };\n default:\n return { error: `unknown op '${op}'` };\n }\n}\n\n/** Validate + normalise one raw assertion entry; returns an error string when malformed. */\nfunction validateAssertion(raw: unknown): { assertion: Assertion } | { error: string } {\n if (!raw || typeof raw !== \"object\") {\n return { error: \"assertion must be an object\" };\n }\n const r = raw as Record<string, unknown>;\n if (typeof r.path !== \"string\" || !r.path) {\n return { error: \"assertion.path must be a non-empty string\" };\n }\n if (typeof r.op !== \"string\" || !OPS.has(r.op as AssertOp)) {\n return { error: `assertion.op '${String(r.op)}' is not one of ${[...OPS].join(\"|\")}` };\n }\n if (r.severity !== undefined && r.severity !== \"error\" && r.severity !== \"warn\") {\n return { error: \"assertion.severity must be 'error' or 'warn'\" };\n }\n return {\n assertion: {\n path: r.path,\n op: r.op as AssertOp,\n value: r.value,\n severity: (r.severity as \"error\" | \"warn\") ?? \"error\",\n },\n };\n}\n\n/** Read `.receipts/asserts.json` (JSON-only v1, no new dependency). Returns `[]` when\n * absent (the command is then a no-op). Throws on malformed JSON / wrong shape. */\nexport function loadAsserts(repoRoot: string): Assertion[] {\n const path = join(repoRoot, \".receipts\", \"asserts.json\");\n let text: string;\n try {\n text = readFileSync(path, \"utf8\");\n } catch {\n return []; // absent ⇒ no-op\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch (e) {\n throw new Error(`.receipts/asserts.json is not valid JSON: ${(e as Error).message}`);\n }\n const list = Array.isArray(parsed)\n ? parsed\n : parsed &&\n typeof parsed === \"object\" &&\n Array.isArray((parsed as { asserts?: unknown }).asserts)\n ? (parsed as { asserts: unknown[] }).asserts\n : null;\n if (!list) {\n throw new Error(\".receipts/asserts.json must be an array or { asserts: [...] }\");\n }\n const out: Assertion[] = [];\n for (const raw of list) {\n const v = validateAssertion(raw);\n if (\"error\" in v) {\n throw new Error(`invalid assertion: ${v.error} (${JSON.stringify(raw)})`);\n }\n out.push(v.assertion);\n }\n return out;\n}\n\n/** Evaluate every assertion against the receipt — pure, total, no model. */\nexport function evaluateAsserts(receipt: Receipt, asserts: readonly Assertion[]): AssertResult[] {\n return asserts.map((assertion) => {\n const actual = resolvePath(receipt.predicate, assertion.path);\n // a comparison op on a missing field is a config error, never a silent pass.\n if (\n actual === undefined &&\n assertion.op !== \"exists\" &&\n assertion.op !== \"empty\" &&\n assertion.op !== \"ne\"\n ) {\n return { assertion, pass: false, actual, error: `path '${assertion.path}' not found` };\n }\n const res = applyOp(assertion.op, actual, assertion.value);\n return \"error\" in res\n ? { assertion, pass: false, actual, error: res.error }\n : { assertion, pass: res.pass, actual };\n });\n}\n\n/** Exit code: non-zero iff an error-severity assertion failed or hit a config error. */\nexport function assertExitCode(results: readonly AssertResult[]): number {\n return results.some((r) => (!r.pass || r.error) && (r.assertion.severity ?? \"error\") === \"error\")\n ? 1\n : 0;\n}\n\n/** Human-readable report of the assertion run. */\nexport function renderAssertResults(results: readonly AssertResult[]): string {\n if (results.length === 0) {\n return \"receipts assert: no assertions (.receipts/asserts.json absent) — nothing to check.\";\n }\n const lines = results.map((r) => {\n const { path, op, value, severity } = r.assertion;\n const expr = `${path} ${op}${value === undefined ? \"\" : ` ${JSON.stringify(value)}`}`;\n if (r.error) {\n return ` ⚠️ ERROR ${expr} — ${r.error}`;\n }\n const tag = r.pass ? \" ✅ PASS \" : severity === \"warn\" ? \" 🟡 WARN \" : \" ❌ FAIL \";\n return `${tag} ${expr} (actual: ${JSON.stringify(r.actual)})`;\n });\n const failed = results.filter(\n (r) => !r.pass && (r.assertion.severity ?? \"error\") === \"error\",\n ).length;\n const warned = results.filter((r) => !r.pass && r.assertion.severity === \"warn\").length;\n const passed = results.filter((r) => r.pass).length;\n lines.push(\n ` ${passed} passed · ${failed} failed${warned ? ` · ${warned} warned` : \"\"} of ${results.length}`,\n );\n return lines.join(\"\\n\");\n}\n","import type { GradeLetter } from \"../findings/grade.js\";\n\n/**\n * `receipts badge` (M59) — a [shields.io endpoint](https://shields.io/badges/endpoint-badge)\n * JSON for a repo's README/PR: an at-a-glance, **factual** state of the agent-work receipt.\n * It states the finding count (and colors by worst severity) — never a quality verdict about\n * the code (R2). Pure function of the receipt's findings; deterministic; zero model calls.\n *\n * Hosting is the user's choice (commit the JSON + a raw URL, or publish it from CI); this only\n * emits the endpoint object. Works once a repo is public (shields.io must reach the URL).\n */\n\nexport interface ShieldsEndpoint {\n schemaVersion: 1;\n label: string;\n message: string;\n color: string;\n}\n\ntype Sev = \"critical\" | \"high\" | \"medium\" | \"low\";\nconst SEV_ORDER: readonly Sev[] = [\"critical\", \"high\", \"medium\", \"low\"];\n\n/** The worst severity present in a finding set, or undefined when empty. */\nexport function worstSeverity(findings: readonly { severity: Sev }[]): Sev | undefined {\n return SEV_ORDER.find((s) => findings.some((f) => f.severity === s));\n}\n\n/**\n * Build the shields.io endpoint object from a receipt predicate. Message is the finding\n * count (factual); color maps to the worst severity (clean → brightgreen, critical/high →\n * red, medium → orange, low → yellow). The synthesized grade is deliberately NOT the\n * message — the badge states what was found, not a verdict.\n */\nexport function badgeEndpoint(predicate: {\n grade?: GradeLetter;\n findings?: readonly { severity: Sev }[];\n}): ShieldsEndpoint {\n const findings = predicate.findings ?? [];\n const n = findings.length;\n const worst = worstSeverity(findings);\n const color =\n n === 0\n ? \"brightgreen\"\n : worst === \"critical\" || worst === \"high\"\n ? \"red\"\n : worst === \"medium\"\n ? \"orange\"\n : \"yellow\";\n const message = n === 0 ? \"no findings\" : `${n} finding${n === 1 ? \"\" : \"s\"}`;\n return { schemaVersion: 1, label: \"receipts\", message, color };\n}\n","import { formatCostAlways, formatTokens } from \"../findings/format.js\";\nimport type { Receipt, ReceiptFinding } from \"../receipt/build.js\";\n\n/**\n * Receipt-to-receipt diff (M51) — \"what changed between two agent runs?\" A pure,\n * deterministic comparison of two receipts Receipts already emits (a re-run on the\n * same PR, last night's run vs tonight's, agent A vs agent B). It reports **deltas and\n * counts** — files/edits/commands, cost/tokens, findings added/removed, the\n * test-observation flip, both grades — and **never a judgement** (no \"better / worse /\n * regressed / improved\"). The reader decides; the diff states facts (SPEC-0000 R2).\n *\n * Deterministic · zero model calls · no schema change · same {a, b} → identical delta.\n */\n\nexport interface CountDelta {\n key: string;\n label: string;\n a: number;\n b: number;\n delta: number;\n}\n\nexport interface ReceiptDelta {\n grade: { a: string; b: string };\n counts: CountDelta[];\n cost: { a: number; b: number; delta: number };\n testsObserved: { a: boolean; b: boolean };\n findingsAdded: ReceiptFinding[];\n findingsRemoved: ReceiptFinding[];\n findingsCommon: number;\n scope: { a: string; b: string };\n}\n\n/** Stable cross-run identity for a finding. The raw `id` embeds span indices that\n * differ between runs, so identity is the human-stable (title + filePath) pair. */\nfunction findingKey(f: ReceiptFinding): string {\n return `${f.title}\u0000${f.filePath ?? \"\"}`;\n}\n\nfunction scopeLabel(r: Receipt): string {\n const s = r.predicate.scope;\n if (!s || s.kind === \"session\") return \"whole session\";\n if (s.kind === \"branch\") return `branch ${s.branch ?? \"?\"}`;\n return `diff (${(s.files ?? []).length} files${s.base ? ` vs ${s.base}` : \"\"})`;\n}\n\nexport function diffReceipts(a: Receipt, b: Receipt): ReceiptDelta {\n const ea = a.predicate.evidence;\n const eb = b.predicate.evidence;\n const count = (key: string, label: string, va: number, vb: number): CountDelta => ({\n key,\n label,\n a: va,\n b: vb,\n delta: vb - va,\n });\n const counts: CountDelta[] = [\n count(\"filesChanged\", \"files changed\", ea.filesChanged, eb.filesChanged),\n count(\"edits\", \"edits\", ea.edits, eb.edits),\n count(\"commands\", \"commands\", ea.commands, eb.commands),\n count(\"reads\", \"reads\", ea.reads, eb.reads),\n count(\"destructiveOps\", \"destructive ops\", ea.destructiveOps, eb.destructiveOps),\n count(\"tokens\", \"tokens\", ea.tokens.total, eb.tokens.total),\n ];\n\n const aKeys = new Set(a.predicate.findings.map(findingKey));\n const bKeys = new Set(b.predicate.findings.map(findingKey));\n const findingsAdded = b.predicate.findings.filter((f) => !aKeys.has(findingKey(f)));\n const findingsRemoved = a.predicate.findings.filter((f) => !bKeys.has(findingKey(f)));\n const findingsCommon = a.predicate.findings.filter((f) => bKeys.has(findingKey(f))).length;\n\n return {\n grade: { a: a.predicate.grade, b: b.predicate.grade },\n counts,\n cost: { a: ea.costUsd, b: eb.costUsd, delta: eb.costUsd - ea.costUsd },\n testsObserved: { a: ea.testsRan, b: eb.testsRan },\n findingsAdded,\n findingsRemoved,\n findingsCommon,\n scope: { a: scopeLabel(a), b: scopeLabel(b) },\n };\n}\n\nconst SEV_ICON: Record<string, string> = { critical: \"⛔\", high: \"⚠️\", medium: \"🔍\", low: \"·\" };\n\n/** Signed-delta string, neutral: \"+3\" / \"-2\" / \"±0\". No value judgement on direction. */\nfunction signed(n: number): string {\n if (n === 0) return \"±0\";\n return n > 0 ? `+${n}` : `${n}`;\n}\n\nfunction findingLines(fs: readonly ReceiptFinding[]): string[] {\n return fs.map((f) => {\n const loc = f.filePath ? ` (\\`${f.filePath}\\`)` : \"\";\n return ` ${SEV_ICON[f.severity] ?? \"·\"} ${f.title}${loc}`;\n });\n}\n\n/** Render the delta as plain text (A = baseline, B = new). Facts only. */\nexport function renderDiff(d: ReceiptDelta): string {\n const out: string[] = [];\n out.push(\"Receipt diff — A (baseline) → B (new)\");\n out.push(\"\");\n out.push(`Grade: ${d.grade.a} → ${d.grade.b}`);\n out.push(`Scope: A ${d.scope.a} · B ${d.scope.b}`);\n out.push(\"\");\n out.push(\"Evidence:\");\n for (const c of d.counts) {\n out.push(` ${c.label}: ${c.a} → ${c.b} (${signed(c.delta)})`);\n }\n const cd = d.cost;\n const costDelta =\n cd.delta === 0 ? \"±0\" : (cd.delta > 0 ? \"+\" : \"-\") + formatCostAlways(Math.abs(cd.delta));\n out.push(` cost: ${formatCostAlways(cd.a)} → ${formatCostAlways(cd.b)} (${costDelta})`);\n out.push(\n ` tokens (total): ${formatTokens(d.counts.find((c) => c.key === \"tokens\")?.a ?? 0)} → ${formatTokens(d.counts.find((c) => c.key === \"tokens\")?.b ?? 0)}`,\n );\n const to = d.testsObserved;\n const toStr = (v: boolean) => (v ? \"observed\" : \"not observed\");\n out.push(` test command: ${toStr(to.a)} → ${toStr(to.b)}${to.a !== to.b ? \" (changed)\" : \"\"}`);\n out.push(\"\");\n out.push(\n `Findings: ${d.findingsAdded.length} only in B · ${d.findingsRemoved.length} only in A · ${d.findingsCommon} in both`,\n );\n if (d.findingsAdded.length) {\n out.push(\"\");\n out.push(\"Only in B (new):\");\n out.push(...findingLines(d.findingsAdded));\n }\n if (d.findingsRemoved.length) {\n out.push(\"\");\n out.push(\"Only in A (absent from B):\");\n out.push(...findingLines(d.findingsRemoved));\n }\n out.push(\"\");\n out.push(\"Deterministic · 0 model calls · evidence, not judgement.\");\n return `${out.join(\"\\n\")}\\n`;\n}\n","import type { AgentSource } from \"../trace/types.js\";\nimport { CHECK_CATALOG, checkForId } from \"./checks.js\";\n\n/**\n * `receipts eval` (M57) — a precision/recall harness for the **work-account**, not the code.\n *\n * Receipts' thesis is that a human reviews the agent's *work* (a faithful, deterministic\n * account of what it did) instead of re-reading the agent's *output*. That only holds if the\n * account is trustworthy: one false alarm and the reviewer goes back to reading diffs. So the\n * near-zero-FP bar (SPEC-0000 R3) is existential — and until now, unmeasured. This turns it\n * into a number: run the detectors over a hand-labeled corpus, compare what fired to the\n * ground truth, and compute precision/recall/F1.\n *\n * It is **dev/CI tooling, not the product path**: it adds no detector, calls no model (R1),\n * and renders no verdict about any code (R2) — it measures *detector fidelity*. The unit of\n * scoring is (session × merge-surface category): each fixture's ground truth and the\n * detectors' output are both sets of {@link CHECK_CATALOG} keys (advisory cost/loop findings\n * are out of scope by construction — they aren't in the catalog).\n */\n\n/** A finding, reduced to the one field the harness needs. */\nexport interface ScorableFinding {\n id: string;\n}\n\n/** The merge-surface category keys a finding set fired (reusing the existing taxonomy). */\nexport function firedCategories(findings: readonly ScorableFinding[]): Set<string> {\n const keys = new Set<string>();\n for (const f of findings) {\n const c = checkForId(f.id);\n if (c) {\n keys.add(c.key);\n }\n }\n return keys;\n}\n\n/**\n * The categories the curated corpus scores precision/recall over: the **deterministic\n * STATEMENT detectors** whose near-zero-FP we guarantee (SPEC-0000 R3). The heuristic,\n * confidence-weighted \"QUESTION\" detectors (blind/unverified edits, duplication, unfulfilled\n * promises, swallowed errors, stubbed impls — see `findings.ts`) need full-session context to\n * be meaningful and fire as artifacts on minimal single-behavior fixtures, so they are out of\n * the curated precision claim. The field scan (`receipts eval`) exercises them over real\n * sessions, where they belong.\n */\nexport const SCORED_CATEGORIES: ReadonlySet<string> = new Set([\n \"destructive\",\n \"git-history\",\n \"secrets\",\n \"cicd\",\n \"lockfile\",\n \"tests\",\n \"weakening\",\n \"injection\",\n \"trojan\",\n \"malformed\",\n \"truncated\",\n \"tool-calls\",\n]);\n\n/** Restrict a set of category keys to the scored (deterministic) scope. */\nexport function scoped(keys: Iterable<string>): string[] {\n return [...keys].filter((k) => SCORED_CATEGORIES.has(k));\n}\n\n/** One labeled corpus row: a fixture and the categories that *should* fire ([] = clean). */\nexport interface CorpusEntry {\n fixture: string;\n /** merge-surface category keys (CHECK_CATALOG) expected to fire; empty ⇒ clean session */\n expect: string[];\n /** adapter to load the fixture through (default claude-code) */\n source?: AgentSource;\n /** why this fixture is labeled this way (kept honest, human-readable) */\n note?: string;\n}\n\n/** The per-entry input to scoring: expected vs. actually-fired category keys. */\nexport interface ScoredEntry {\n fixture: string;\n expected: string[];\n fired: string[];\n /** fired but not expected — the false positives that erode trust */\n fp: string[];\n /** expected but not fired — the misses */\n fn: string[];\n}\n\nexport interface CategoryMetric {\n key: string;\n label: string;\n tp: number;\n fp: number;\n fn: number;\n precision: number;\n recall: number;\n f1: number;\n}\n\nexport interface EvalMetrics {\n entries: number;\n tp: number;\n fp: number;\n fn: number;\n precision: number;\n recall: number;\n f1: number;\n perCategory: CategoryMetric[];\n details: ScoredEntry[];\n}\n\n/** Precision/recall with an empty denominator = 1 (firing nothing on a clean session is\n * perfect, not undefined; missing nothing is perfect recall). */\nconst ratio = (num: number, denom: number): number => (denom === 0 ? 1 : num / denom);\nconst f1Of = (p: number, r: number): number => (p + r === 0 ? 0 : (2 * p * r) / (p + r));\n\n/**\n * Score a corpus run into a confusion matrix at (session × category) granularity. Pure: the\n * caller is responsible for loading fixtures and deriving findings; this only does the math,\n * so it is unit-testable without any I/O.\n */\nexport function scoreCorpus(\n results: readonly { fixture: string; expected: readonly string[]; fired: ReadonlySet<string> }[],\n): EvalMetrics {\n const label = new Map(CHECK_CATALOG.map((c) => [c.key, c.label] as const));\n const cat = new Map<string, { tp: number; fp: number; fn: number }>();\n const bump = (key: string, field: \"tp\" | \"fp\" | \"fn\") => {\n const row = cat.get(key) ?? { tp: 0, fp: 0, fn: 0 };\n row[field]++;\n cat.set(key, row);\n };\n\n let tp = 0;\n let fp = 0;\n let fn = 0;\n const details: ScoredEntry[] = [];\n\n for (const r of results) {\n const expected = new Set(r.expected);\n const fpKeys: string[] = [];\n const fnKeys: string[] = [];\n for (const key of r.fired) {\n if (expected.has(key)) {\n tp++;\n bump(key, \"tp\");\n } else {\n fp++;\n fpKeys.push(key);\n bump(key, \"fp\");\n }\n }\n for (const key of expected) {\n if (!r.fired.has(key)) {\n fn++;\n fnKeys.push(key);\n bump(key, \"fn\");\n }\n }\n details.push({\n fixture: r.fixture,\n expected: [...expected],\n fired: [...r.fired],\n fp: fpKeys,\n fn: fnKeys,\n });\n }\n\n const perCategory: CategoryMetric[] = [...cat.entries()]\n .map(([key, v]) => {\n const precision = ratio(v.tp, v.tp + v.fp);\n const recall = ratio(v.tp, v.tp + v.fn);\n return {\n key,\n label: label.get(key) ?? key,\n ...v,\n precision,\n recall,\n f1: f1Of(precision, recall),\n };\n })\n .sort((a, b) => b.tp + b.fn - (a.tp + a.fn) || a.label.localeCompare(b.label));\n\n const precision = ratio(tp, tp + fp);\n const recall = ratio(tp, tp + fn);\n return {\n entries: results.length,\n tp,\n fp,\n fn,\n precision,\n recall,\n f1: f1Of(precision, recall),\n perCategory,\n details,\n };\n}\n\nconst pct = (n: number): string => `${(100 * n).toFixed(1)}%`;\n\n/** Render the corpus confusion matrix as facts-only text (the trust artifact). */\nexport function renderEval(m: EvalMetrics): string {\n const out: string[] = [];\n out.push(`Receipts detector eval — ${m.entries} labeled session${m.entries === 1 ? \"\" : \"s\"}`);\n out.push(\"\");\n out.push(\n `Precision ${pct(m.precision)} · Recall ${pct(m.recall)} · F1 ${pct(m.f1)} (TP ${m.tp} · FP ${m.fp} · FN ${m.fn})`,\n );\n out.push(\"\");\n if (m.perCategory.length) {\n out.push(\"By category:\");\n for (const c of m.perCategory) {\n out.push(\n ` ${c.label.padEnd(26)} P ${pct(c.precision).padStart(6)} R ${pct(c.recall).padStart(6)} (tp ${c.tp} fp ${c.fp} fn ${c.fn})`,\n );\n }\n }\n const fps = m.details.filter((d) => d.fp.length);\n const fns = m.details.filter((d) => d.fn.length);\n if (fps.length) {\n out.push(\"\", \"False positives (fired but should be clean):\");\n for (const d of fps) out.push(` ${d.fixture}: ${d.fp.join(\", \")}`);\n }\n if (fns.length) {\n out.push(\"\", \"Misses (expected but did not fire):\");\n for (const d of fns) out.push(` ${d.fixture}: ${d.fn.join(\", \")}`);\n }\n out.push(\"\", \"Deterministic · 0 model calls · measures detector fidelity, not code quality.\");\n return `${out.join(\"\\n\")}\\n`;\n}\n\n/** One real session's contribution to the field scan. */\nexport interface FieldRow {\n title: string;\n categories: string[];\n}\n\nexport interface FieldScan {\n scanned: number;\n flagged: number;\n byCategory: { key: string; label: string; sessions: number }[];\n rows: FieldRow[];\n}\n\n/** Aggregate a field scan over real local sessions: how often the work-account flags real\n * work, by category. A rate the human interprets — never a verdict (a flag may be a true\n * finding or an FP). */\nexport function summarizeFieldScan(rows: readonly FieldRow[]): FieldScan {\n const label = new Map(CHECK_CATALOG.map((c) => [c.key, c.label] as const));\n const cat = new Map<string, number>();\n let flagged = 0;\n for (const r of rows) {\n if (r.categories.length) {\n flagged++;\n }\n for (const key of new Set(r.categories)) {\n cat.set(key, (cat.get(key) ?? 0) + 1);\n }\n }\n const byCategory = [...cat.entries()]\n .map(([key, sessions]) => ({ key, label: label.get(key) ?? key, sessions }))\n .sort((a, b) => b.sessions - a.sessions || a.label.localeCompare(b.label));\n return { scanned: rows.length, flagged, byCategory, rows: [...rows] };\n}\n\n/** Render the field scan as facts-only text. */\nexport function renderFieldScan(s: FieldScan): string {\n if (s.scanned === 0) {\n return \"No local agent sessions found to scan.\\n\";\n }\n const out: string[] = [];\n out.push(`Receipts field scan — ${s.scanned} real local session${s.scanned === 1 ? \"\" : \"s\"}`);\n out.push(\"\");\n const rate = Math.round((100 * s.flagged) / s.scanned);\n out.push(`Flagged: ${s.flagged}/${s.scanned} sessions (${rate}%) carried ≥1 merge-surface flag`);\n out.push(\"\");\n if (s.byCategory.length === 0) {\n out.push(\"No merge-surface category fired on any scanned session.\");\n } else {\n out.push(\"By category (sessions flagged):\");\n for (const c of s.byCategory) {\n out.push(` ${c.label.padEnd(26)} ${c.sessions}`);\n }\n }\n out.push(\n \"\",\n \"A flag may be a true finding or a false positive — this is a flag rate you interpret,\",\n \"not a verdict. Deterministic · 0 model calls · reads only local sessions.\",\n );\n return `${out.join(\"\\n\")}\\n`;\n}\n","import { readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Severity } from \"../findings/findings.js\";\nimport { formatCostAlways } from \"../findings/format.js\";\nimport type { GradeLetter } from \"../findings/grade.js\";\nimport { verifyBundle } from \"../sign/verify.js\";\n\n/**\n * `receipts log` (M52) — a chronological list of the committed receipts in `.receipts/`\n * (one line per receipt: date, grade, change-cost, finding count + top severity, scope,\n * name). The `git log` of receipts: the local, history-aware companion to `receipts diff`\n * (which compares two) and `receipts trends` (which aggregates sessions). It reads the\n * COMMITTED receipts, not live sessions, so it answers \"what receipts have we attached,\n * and what do they say?\" — a view nothing else provides.\n *\n * Deterministic · zero model calls · local-first · lists recorded facts (each receipt's\n * own grade/cost/findings), never a synthesized judgement.\n */\n\nconst SEV_ICON: Record<Severity, string> = { critical: \"⛔\", high: \"⚠️\", medium: \"🔍\", low: \"·\" };\nconst SEV_RANK: Record<Severity, number> = { critical: 0, high: 1, medium: 2, low: 3 };\n\nexport interface LogEntry {\n name: string;\n grade: GradeLetter;\n costUsd: number;\n findings: number;\n topSeverity?: Severity;\n scope: string;\n endedAt?: number;\n}\n\n/** Files in `.receipts/` that are config/examples, not receipts. */\nconst NON_RECEIPT = /(?:^|\\/)(?:asserts(?:\\.example)?|sample)\\.json$/i;\n\nfunction scopeLabel(\n scope: { kind: string; files?: string[]; branch?: string } | undefined,\n): string {\n if (!scope || scope.kind === \"session\") return \"session\";\n if (scope.kind === \"branch\") return `branch ${scope.branch ?? \"?\"}`;\n return `diff ${(scope.files ?? []).length}f`;\n}\n\nfunction isoDate(ms: number | undefined): string {\n if (!ms || !Number.isFinite(ms)) return \"—\".padEnd(10);\n return new Date(ms).toISOString().slice(0, 10);\n}\n\n/** Load and validate the committed receipts under `dir`, most-recent first. */\nexport function loadReceiptHistory(dir: string): LogEntry[] {\n let files: string[];\n try {\n files = readdirSync(dir).filter((f) => f.endsWith(\".json\") && !NON_RECEIPT.test(f));\n } catch {\n return [];\n }\n const entries: LogEntry[] = [];\n for (const f of files) {\n let input: unknown;\n try {\n input = JSON.parse(readFileSync(join(dir, f), \"utf8\"));\n } catch {\n continue;\n }\n const res = verifyBundle(input);\n if (!res.ok || !res.receipt) continue;\n const p = res.receipt.predicate;\n const fs = p.findings ?? [];\n let topSeverity: Severity | undefined;\n for (const x of fs) {\n if (!topSeverity || SEV_RANK[x.severity] < SEV_RANK[topSeverity]) topSeverity = x.severity;\n }\n entries.push({\n name: f.replace(/\\.json$/i, \"\"),\n grade: p.grade,\n costUsd: p.evidence.diffCostUsd ?? p.evidence.costUsd,\n findings: fs.length,\n topSeverity,\n scope: scopeLabel(p.scope),\n endedAt: p.session?.endedAt,\n });\n }\n // most-recent first; receipts without a timestamp sort last (by name, stable)\n entries.sort((a, b) => (b.endedAt ?? 0) - (a.endedAt ?? 0) || a.name.localeCompare(b.name));\n return entries;\n}\n\n/** Render the history as an aligned text table (most-recent first). Facts only. */\nexport function renderLog(entries: readonly LogEntry[], total = entries.length): string {\n if (!entries.length) return \"No committed receipts found in .receipts/.\\n\";\n const rows = entries.map((e) => {\n const findings =\n e.findings === 0\n ? \"0\"\n : `${e.findings} ${e.topSeverity ? SEV_ICON[e.topSeverity] : \"\"}`.trim();\n return {\n date: isoDate(e.endedAt),\n grade: e.grade,\n cost: formatCostAlways(e.costUsd),\n findings,\n scope: e.scope,\n name: e.name,\n };\n });\n const w = (key: keyof (typeof rows)[number], head: string) =>\n Math.max(head.length, ...rows.map((r) => r[key].length));\n const wDate = w(\"date\", \"DATE\");\n const wGrade = Math.max(5, ...rows.map((r) => r.grade.length));\n const wCost = w(\"cost\", \"COST\");\n const wFind = w(\"findings\", \"FINDINGS\");\n const wScope = w(\"scope\", \"SCOPE\");\n const head = `${\"DATE\".padEnd(wDate)} ${\"GRADE\".padEnd(wGrade)} ${\"COST\".padEnd(wCost)} ${\"FINDINGS\".padEnd(wFind)} ${\"SCOPE\".padEnd(wScope)} RECEIPT`;\n const lines = rows.map(\n (r) =>\n `${r.date.padEnd(wDate)} ${r.grade.padEnd(wGrade)} ${r.cost.padEnd(wCost)} ${r.findings.padEnd(wFind)} ${r.scope.padEnd(wScope)} ${r.name}`,\n );\n const header = `Receipt history — .receipts/ (${total} receipt${total === 1 ? \"\" : \"s\"}${entries.length < total ? `, showing ${entries.length}` : \"\"})`;\n return `${header}\\n\\n${head}\\n${lines.join(\"\\n\")}\\n\\n<cost = this change's cost (diff-scoped where available) · grade is each receipt's own recorded grade · evidence, not judgement>\\n`;\n}\n","/**\n * `receipts prune` (M65b / SPEC-0064 \"ephemeral\") — the committed-receipt clutter reducer.\n *\n * A receipt is a per-branch PR artifact: CI reads/signs/comments it during the PR. After the\n * branch merges (and is deleted), the committed `.receipts/<branch>.json` is dead weight that\n * accumulates on the trunk forever (the PR comment + attestation are the durable record). This\n * removes receipts whose branch no longer exists, keeping live-branch receipts and the\n * non-branch example files. Pure planning here; the CLI does the git/fs + the live-branch read.\n */\n\n/** Example/config files in `.receipts/` that are never branch receipts — always kept. */\nconst PROTECTED = /(?:^|\\/)(?:asserts(?:\\.example)?|sample)\\.json$/i;\n\n/** The committed-receipt filename slug for a branch (matches `receipts pr`'s naming). */\nexport function branchSlug(branch: string): string {\n return branch.replace(/[/\\\\]/g, \"-\");\n}\n\nexport interface PrunePlan {\n keep: string[];\n remove: string[];\n}\n\n/**\n * Partition receipt files into keep/remove: keep the protected example files and any whose slug\n * belongs to a live branch; remove the rest (merged/deleted branches). Pure — `liveSlugs` is the\n * set of `branchSlug(branch)` for branches that still exist (resolved by the caller from git).\n */\nexport function planPrune(files: readonly string[], liveSlugs: ReadonlySet<string>): PrunePlan {\n const keep: string[] = [];\n const remove: string[] = [];\n for (const f of files) {\n const base = f.split(\"/\").pop() ?? f;\n const slug = base.replace(/\\.json$/i, \"\");\n if (PROTECTED.test(base) || liveSlugs.has(slug)) {\n keep.push(f);\n } else {\n remove.push(f);\n }\n }\n return { keep, remove };\n}\n","import type { Receipt, ReceiptFinding } from \"../receipt/build.js\";\nimport { type CheckSeverity, checkForId } from \"./checks.js\";\n\n/**\n * `receipts sarif` (M63) — render a receipt's findings as a SARIF 2.1.0 log so GitHub\n * code-scanning can post them **inline on the diff** and in the **Security tab** (the native\n * machine-findings surface). Unlocked by M62: file-anchored findings now carry `line`, so each\n * maps to a SARIF result with `region.startLine`. Pure transform of a verified receipt;\n * deterministic; zero model calls. It re-presents the same facts (R2) — no new judgement.\n *\n * Uploading is the user's CI step (`github/codeql-action/upload-sarif`, needs\n * `security-events: write` + GHAS on private repos) — see docs/sarif.md.\n */\n\nconst INFO_URI = \"https://github.com/AltimateAI/altimate-receipts\";\n\nexport interface SarifLog {\n $schema: string;\n version: \"2.1.0\";\n runs: SarifRun[];\n}\ninterface SarifRun {\n tool: { driver: { name: string; informationUri: string; version?: string; rules: SarifRule[] } };\n results: SarifResult[];\n}\ninterface SarifRule {\n id: string;\n name: string;\n shortDescription: { text: string };\n defaultConfiguration: { level: SarifLevel };\n helpUri: string;\n}\ninterface SarifResult {\n ruleId: string;\n ruleIndex: number;\n level: SarifLevel;\n message: { text: string };\n locations?: {\n physicalLocation: {\n artifactLocation: { uri: string };\n region?: { startLine: number };\n };\n }[];\n partialFingerprints: { receiptsId: string };\n}\ntype SarifLevel = \"error\" | \"warning\" | \"note\";\n\n/** SARIF severity level for a finding's severity (the catalog/PR-comment mapping). */\nfunction levelOf(severity: CheckSeverity | undefined): SarifLevel {\n if (severity === \"critical\" || severity === \"high\") return \"error\";\n if (severity === \"medium\") return \"warning\";\n return \"note\";\n}\n\n/** Stable rule id for a finding: the merge-surface category key when it's in the catalog\n * (groups like the PR comment), else the finding-id prefix with the volatile span suffix\n * stripped (e.g. `claimed-commit-none-gen-3` → `claimed-commit-none`). */\nfunction ruleIdOf(id: string): string {\n const check = checkForId(id);\n if (check) return check.key;\n return id.replace(/-(?:tool|gen|span|s)-?\\d.*$/i, \"\") || id;\n}\n\n/** Map a finding's `filePath` to a repo-relative path: prefer the matching scope-file entry\n * (so code-scanning anchors correctly), else fall back to the basename. */\nfunction repoRelative(filePath: string, scopeFiles: readonly string[]): string {\n const base = filePath.split(\"/\").pop() ?? filePath;\n for (const sf of scopeFiles) {\n if (sf === filePath || sf.endsWith(`/${filePath}`) || filePath.endsWith(`/${sf}`)) return sf;\n if ((sf.split(\"/\").pop() ?? sf) === base) return sf;\n }\n return base;\n}\n\n/** Build a SARIF 2.1.0 log from a verified receipt. */\nexport function toSarif(receipt: Receipt): SarifLog {\n const p = receipt.predicate;\n const scopeFiles = p.scope?.files ?? [];\n const findings: ReceiptFinding[] = p.findings ?? [];\n\n // Collect rules (deduped by ruleId), tracking the worst level seen per rule.\n const ruleOrder: string[] = [];\n const rules = new Map<string, SarifRule>();\n const sevRank: Record<SarifLevel, number> = { error: 0, warning: 1, note: 2 };\n\n const results: SarifResult[] = findings.map((f) => {\n const ruleId = ruleIdOf(f.id);\n const level = levelOf(f.severity);\n const existing = rules.get(ruleId);\n if (!existing) {\n ruleOrder.push(ruleId);\n rules.set(ruleId, {\n id: ruleId,\n name: checkForId(f.id)?.label ?? ruleId,\n shortDescription: { text: checkForId(f.id)?.label ?? ruleId },\n defaultConfiguration: { level },\n helpUri: INFO_URI,\n });\n } else if (sevRank[level] < sevRank[existing.defaultConfiguration.level]) {\n existing.defaultConfiguration.level = level;\n }\n const uri = f.filePath ? repoRelative(f.filePath, scopeFiles) : undefined;\n const result: SarifResult = {\n ruleId,\n ruleIndex: ruleOrder.indexOf(ruleId),\n level,\n message: { text: f.detail ? `${f.title} — ${f.detail}` : f.title },\n // Stable across commits: rule + path, never the volatile span id.\n partialFingerprints: { receiptsId: `${ruleId}::${uri ?? \"session\"}` },\n };\n if (uri) {\n result.locations = [\n {\n physicalLocation: {\n artifactLocation: { uri },\n ...(f.line ? { region: { startLine: f.line } } : {}),\n },\n },\n ];\n }\n return result;\n });\n\n // ruleIndex was assigned by first-seen order; finalize the rules array in that order.\n const ruleList = ruleOrder.map((id) => rules.get(id) as SarifRule);\n\n return {\n $schema: \"https://json.schemastore.org/sarif-2.1.0.json\",\n version: \"2.1.0\",\n runs: [\n {\n tool: {\n driver: {\n name: \"Receipts\",\n informationUri: INFO_URI,\n version: p.generator?.version,\n rules: ruleList,\n },\n },\n results,\n },\n ],\n };\n}\n","import { readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { GradeLetter } from \"../findings/grade.js\";\nimport { verifyBundle } from \"../sign/verify.js\";\nimport { checkForId } from \"./checks.js\";\n\n/**\n * `receipts stats` (M53) — a dogfooding scoreboard over the committed receipts in\n * `.receipts/`. Answers the two questions a pilot owner asks: **how often did Receipts\n * run, and what did it catch?** It aggregates the receipts the tool already wrote — how\n * many, the grade distribution, the flagged rate, and findings rolled up **by check\n * category** (which agent-failure modes actually show up here, ranked). Pure read + count\n * over local JSON; deterministic, zero model calls. It reports counts, never a verdict.\n *\n * This is the local measurement surface; an org-wide rollup (across repos) is a thin\n * scheduled job on top of the same per-repo numbers.\n */\n\nconst NON_RECEIPT = /(?:^|\\/)(?:asserts(?:\\.example)?|sample)\\.json$/i;\n\nexport interface ReceiptStats {\n /** how many valid committed receipts (≈ how many PRs Receipts ran on) */\n receipts: number;\n /** files in the dir that weren't valid receipts (skipped) */\n skipped: number;\n /** receipts with ≥1 finding */\n flagged: number;\n /** A/B/C/F counts */\n grades: Record<GradeLetter, number>;\n /** finding count rolled up by check category, ranked desc; label is human-readable */\n byCategory: { key: string; icon: string; label: string; findings: number; receipts: number }[];\n /** total findings across all receipts */\n totalFindings: number;\n}\n\n/** Aggregate the committed receipts under `dir` into a dogfooding scoreboard. */\nexport function computeStats(dir: string): ReceiptStats {\n let files: string[];\n try {\n files = readdirSync(dir).filter((f) => f.endsWith(\".json\") && !NON_RECEIPT.test(f));\n } catch {\n files = [];\n }\n const grades: Record<GradeLetter, number> = { A: 0, B: 0, C: 0, F: 0 };\n const cat = new Map<\n string,\n { icon: string; label: string; findings: number; receipts: number }\n >();\n let receipts = 0;\n let skipped = 0;\n let flagged = 0;\n let totalFindings = 0;\n\n for (const f of files) {\n let input: unknown;\n try {\n input = JSON.parse(readFileSync(join(dir, f), \"utf8\"));\n } catch {\n skipped++;\n continue;\n }\n const res = verifyBundle(input);\n if (!res.ok || !res.receipt) {\n skipped++;\n continue;\n }\n receipts++;\n const p = res.receipt.predicate;\n grades[p.grade] = (grades[p.grade] ?? 0) + 1;\n const findings = p.findings ?? [];\n if (findings.length) flagged++;\n totalFindings += findings.length;\n // which categories this receipt touched (count receipts once per category)\n const seen = new Set<string>();\n for (const finding of findings) {\n const c = checkForId(finding.id);\n if (!c) continue;\n const row = cat.get(c.key) ?? { icon: c.icon, label: c.label, findings: 0, receipts: 0 };\n row.findings++;\n if (!seen.has(c.key)) {\n row.receipts++;\n seen.add(c.key);\n }\n cat.set(c.key, row);\n }\n }\n\n const byCategory = [...cat.entries()]\n .map(([key, v]) => ({ key, ...v }))\n .sort((a, b) => b.findings - a.findings || a.label.localeCompare(b.label));\n\n return { receipts, skipped, flagged, grades, byCategory, totalFindings };\n}\n\n/** Render the scoreboard as plain text. Facts only. */\nexport function renderStats(s: ReceiptStats): string {\n if (s.receipts === 0) return \"No committed receipts found in .receipts/.\\n\";\n const out: string[] = [];\n out.push(\n `Receipts scoreboard — ${s.receipts} receipt${s.receipts === 1 ? \"\" : \"s\"} in .receipts/`,\n );\n out.push(\"\");\n const pct = (n: number) => `${Math.round((100 * n) / s.receipts)}%`;\n out.push(\n `Grades: 🟢 A ${s.grades.A} · 🟡 B ${s.grades.B} · 🟠 C ${s.grades.C} · 🔴 F ${s.grades.F}`,\n );\n out.push(`Flagged: ${s.flagged}/${s.receipts} receipts (${pct(s.flagged)}) carried ≥1 finding`);\n out.push(\"\");\n if (s.byCategory.length === 0) {\n out.push(\"Problems caught: none — every committed receipt was clean.\");\n } else {\n out.push(\n `Problems caught (${s.totalFindings} findings across ${s.byCategory.length} categories):`,\n );\n for (const c of s.byCategory) {\n out.push(\n ` ${c.icon} ${c.label.padEnd(26)} ${c.findings} finding${c.findings === 1 ? \"\" : \"s\"} in ${c.receipts} receipt${c.receipts === 1 ? \"\" : \"s\"}`,\n );\n }\n }\n if (s.skipped) {\n out.push(\"\", `<${s.skipped} non-receipt/invalid file${s.skipped === 1 ? \"\" : \"s\"} skipped>`);\n }\n out.push(\"\", \"Deterministic · 0 model calls · counts of recorded receipts, not a verdict.\");\n return `${out.join(\"\\n\")}\\n`;\n}\n","import type { FindingSet } from \"../findings/findings.js\";\nimport type { Receipt } from \"../receipt/build.js\";\nimport { redact } from \"./redact.js\";\n\n/**\n * Verifiable handoff brief (SPEC-0025 / M23). A pure projection of a session's Receipt +\n * findings into typed sections (DONE / OPEN / RISK / NEXT / PREVENT / VERIFY) the next\n * agent or human can read AND check (re-derive the subject hash). Deterministic, zero\n * model calls, no new schema. Evidence, not judgement: NEXT/PREVENT are the VERBATIM\n * fixPrompt/guardrailRule strings the findings engine already produced — no invented\n * advice, no readiness verdict.\n */\n\nconst OPEN_IDS = new Set([\"unverified-change\", \"claimed-commit-none\", \"fake-green\"]);\n\nexport interface Handoff {\n subject: string;\n grade: string;\n done: { filesChanged: number; edits: number; commands: number; reads: number; testsRan: boolean };\n open: string[];\n risk: { severity: string; title: string }[];\n next: string[];\n prevent: string[];\n verify: string;\n}\n\nexport function buildHandoff(receipt: Receipt, findings: FindingSet): Handoff {\n const all = [...findings.main, ...findings.minor];\n const ev = receipt.predicate.evidence;\n return {\n subject: receipt.subject[0]?.digest.sha256 ?? \"\",\n grade: receipt.predicate.grade,\n done: {\n filesChanged: ev.filesChanged,\n edits: ev.edits,\n commands: ev.commands,\n reads: ev.reads,\n testsRan: ev.testsRan,\n },\n open: all.filter((f) => OPEN_IDS.has(f.id)).map((f) => redact(f.title)),\n risk: all\n .filter((f) => f.severity === \"high\" || f.severity === \"critical\")\n .map((f) => ({ severity: f.severity, title: redact(f.title) })),\n next: all\n .map((f) => f.fixPrompt)\n .filter((p): p is string => !!p)\n .map(redact),\n prevent: all\n .map((f) => f.guardrailRule)\n .filter((g): g is string => !!g)\n .map(redact),\n verify: `receipts rederive <transcript> # reproduces subject ${(receipt.subject[0]?.digest.sha256 ?? \"\").slice(0, 12)}…`,\n };\n}\n\nexport function renderHandoffMarkdown(h: Handoff): string {\n const lines: string[] = [];\n lines.push(`# Handoff — Grade ${h.grade}`, \"\");\n lines.push(\n \"## ✅ Done\",\n `${h.done.filesChanged} files changed · ${h.done.edits} edits · ${h.done.commands} commands · ${h.done.reads} reads · tests ran: ${h.done.testsRan ? \"yes\" : \"no\"}`,\n \"\",\n );\n if (h.open.length) {\n lines.push(\"## 🚧 Open\", ...h.open.map((o) => `- ${o}`), \"\");\n }\n if (h.risk.length) {\n lines.push(\n \"## 🛡️ Risk\",\n ...h.risk.map((r) => `- **${r.severity.toUpperCase()}** ${r.title}`),\n \"\",\n );\n }\n if (h.next.length) {\n lines.push(\"## ⏭️ Next\", ...h.next.map((n) => `- ${n}`), \"\");\n }\n if (h.prevent.length) {\n lines.push(\"## 🧷 Prevent\", ...h.prevent.map((p) => `- ${p}`), \"\");\n }\n lines.push(\"## 🔎 Verify\", `\\`${h.verify}\\``, \"\");\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n","import { spawnSync } from \"node:child_process\";\nimport type { DerivedSpan } from \"../findings/spans.js\";\nimport { gitInvocations } from \"./gitCommand.js\";\n\n/**\n * Commit-SHA attribution (SPEC-0069 / M70). When any agent runs `git commit` or\n * `git push`, the captured output carries the commit SHA (\"[feat-x 5f8a31d] msg\",\n * \"abc1234..def5678 feat-x -> feat-x\"). Matching those SHAs against the branch's\n * `git log` gives an exact, agent-agnostic session↔branch binding — no branch\n * tags, no edit spans, nothing new recorded. Prior art: aider stamps commits,\n * git-ai/Entire attach notes; we read the binding the transcript already holds.\n */\n\n/** Max branch commits to match against — far beyond any sane PR; newest first. */\nconst SHA_CAP = 200;\n\n/** Full SHAs of the commits unique to this branch (newest first), or [] when\n * unknowable (no base / no commits / no git). */\nexport function branchShas(base?: string, cwd?: string): string[] {\n if (!base) {\n return [];\n }\n const r = spawnSync(\"git\", [\"log\", `--max-count=${SHA_CAP}`, \"--format=%H\", `${base}..HEAD`], {\n encoding: \"utf8\",\n cwd,\n });\n if (r.status !== 0) {\n return [];\n }\n return r.stdout.split(\"\\n\").filter((s) => /^[0-9a-f]{40}$/.test(s));\n}\n\nconst HEX_RUN = /\\b[0-9a-f]{7,40}\\b/g;\n\n/** The command string of a tool span, across agent input shapes: Claude's\n * `{command}` object, Codex's raw arguments JSON string (`'{\"cmd\":\"…\"}'`, string\n * or argv array inside). Raw inputs per R5. */\nfunction commandOf(input: unknown): string {\n if (typeof input === \"string\") {\n const t = input.trim();\n if (t.startsWith(\"{\")) {\n try {\n return commandOf(JSON.parse(t));\n } catch {\n return input;\n }\n }\n return input;\n }\n if (input && typeof input === \"object\") {\n const o = input as Record<string, unknown>;\n for (const key of [\"command\", \"cmd\"]) {\n const v = o[key];\n if (typeof v === \"string\") {\n return v;\n }\n if (Array.isArray(v)) {\n return v.filter((t) => typeof t === \"string\").join(\" \");\n }\n }\n }\n return \"\";\n}\n\n/**\n * Is this command a real `git commit`/`git push` invocation? Tokenized via the\n * shared M67-discipline matcher — an orchestrating session running\n * `codex exec \"...then git push...\"` (the SHA-bearing instruction-in-a-string\n * case, observed live) never counts as the author of its child agent's commits.\n */\nexport function isGitWrite(command: string): boolean {\n return gitInvocations(command).some((g) => g.sub === \"commit\" || g.sub === \"push\");\n}\n\n/**\n * Did this session author any of the branch's commits? True iff a hex run (≥7\n * chars) in the OUTPUT of a `git commit`/`git push` command span prefixes one of\n * the branch's full SHAs. Output-only: a SHA pasted into a command's input isn't\n * authorship. Deterministic string scan; zero git calls.\n */\nexport function authoredBranch(spans: readonly DerivedSpan[], shas: readonly string[]): boolean {\n if (shas.length === 0) {\n return false;\n }\n for (const s of spans) {\n if (s.kind !== \"tool\" || typeof s.output !== \"string\") {\n continue;\n }\n if (!isGitWrite(commandOf(s.input))) {\n continue;\n }\n for (const token of s.output.match(HEX_RUN) ?? []) {\n if (shas.some((full) => full.startsWith(token))) {\n return true;\n }\n }\n }\n return false;\n}\n"],"mappings":"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","names":["spawnSync","existsSync","mkdirSync","readFileSync","readdirSync","writeFileSync","join","spawnSync","existsSync","join","git","spawnSync","existsSync","join","existsSync","mkdirSync","readFileSync","writeFileSync","readFileSync","join","readFileSync","join","SEV_ICON","scopeLabel","readFileSync","join","head","readFileSync","readdirSync","join","NON_RECEIPT","readdirSync","readFileSync","join","spawnSync","spawnSync","writeFileSync","git","spawnSync","join","mkdirSync","existsSync","readFileSync","readdirSync"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/hook/installGitHook.ts","../src/hook/prePush.ts","../src/report/store.ts","../src/trace/gitCommand.ts","../src/hook/settingsMerge.ts","../src/receipt/assert.ts","../src/report/badge.ts","../src/report/diff.ts","../src/report/eval.ts","../src/report/log.ts","../src/report/prune.ts","../src/report/sarif.ts","../src/report/stats.ts","../src/share/handoff.ts","../src/trace/commitMatch.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n realpathSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, relative } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { deriveFindings } from \"./findings/findings.js\";\nimport type { DerivedSummary } from \"./findings/spans.js\";\nimport { deriveSpans } from \"./findings/spans.js\";\nimport { installGitHook, wirePrepareScript } from \"./hook/installGitHook.js\";\nimport { type HookDialect, readStdin, runHookPrePush } from \"./hook/prePush.js\";\nimport { primaryCheckout } from \"./hook/prePush.js\";\nimport { mergeHookIntoSettings, settingsStore } from \"./hook/settingsMerge.js\";\nimport {\n type Assertion,\n assertExitCode,\n evaluateAsserts,\n loadAsserts,\n renderAssertResults,\n} from \"./receipt/assert.js\";\nimport { type Receipt, type ReceiptScope, buildReceipt } from \"./receipt/build.js\";\nimport { canonicalize } from \"./receipt/canonical.js\";\nimport { badgeEndpoint } from \"./report/badge.js\";\nimport { renderCard, renderList } from \"./report/card.js\";\nimport { diffReceipts, renderDiff } from \"./report/diff.js\";\nimport {\n type FieldRow,\n firedCategories,\n renderFieldScan,\n summarizeFieldScan,\n} from \"./report/eval.js\";\nimport {\n collectGuardrails,\n renderGuardrailsBlock,\n upsertGuardrailsSection,\n} from \"./report/guardrails.js\";\nimport { loadReceiptHistory, renderLog } from \"./report/log.js\";\nimport { branchSlug, planPrune } from \"./report/prune.js\";\nimport { toSarif } from \"./report/sarif.js\";\nimport { deriveTargets } from \"./report/sessions.js\";\nimport { computeStats, renderStats } from \"./report/stats.js\";\nimport { listReceiptRefs, readReceiptRef, writeReceiptRef } from \"./report/store.js\";\nimport { computeTrends, renderTrends, upsertTrendsSection } from \"./report/trends.js\";\nimport { copyToClipboard } from \"./share/clipboard.js\";\nimport { buildHandoff, renderHandoffMarkdown } from \"./share/handoff.js\";\nimport { renderShareMarkdown } from \"./share/markdown.js\";\nimport { redactReceipt } from \"./share/redact.js\";\nimport { toDsseEnvelope } from \"./sign/envelope.js\";\nimport { compareToTranscript, rederiveFromTranscript } from \"./sign/rederive.js\";\nimport { verifyBundle } from \"./sign/verify.js\";\nimport { authoredBranch, branchShas } from \"./trace/commitMatch.js\";\nimport { applyDiffScope, changedFiles, inDiff, narrowEffort } from \"./trace/diffScope.js\";\nimport {\n anyDetected,\n inRepo,\n listSessions,\n loadSession,\n rootsHint,\n selectForBranch,\n selectSummary,\n} from \"./trace/load.js\";\nimport { agentIds } from \"./trace/registry.js\";\nimport { sliceByBranch } from \"./trace/slice.js\";\nimport type { AgentSource, Session, SessionSummary } from \"./trace/types.js\";\nimport { getVersion } from \"./version.js\";\n\nconst HELP = `\n🧾 receipts — proof, not vibes\n\n A deterministic, cross-agent Report Card of what your coding agent actually did.\n Reads the agent's own transcript locally. No account, no upload, no model calls.\n\nUsage\n receipts [selector] Print the Agent Report Card for a session\n receipts --list List recent sessions (then: receipts <n>)\n receipts --json [selector] Emit the Receipt object (in-toto Statement)\n receipts --share [selector] Print a redacted, paste-ready Markdown summary\n receipts --handoff [selector] Print a verifiable handoff brief (done/open/risk/next/verify)\n receipts guardrails [sel] Paste-ready prevention rules (AGENTS.md / CLAUDE.md)\n from the findings (--last N to aggregate sessions)\n receipts trends Cross-session digest: grades, recurring findings,\n and evidence over your last N sessions (default 10)\n receipts pr Write this PR's redacted Receipt to .receipts/\n (diff-scoped: only this change's findings)\n receipts envelope <receipt> Wrap a Receipt as an unsigned DSSE envelope\n receipts verify <bundle> Verify a Receipt (+ --transcript to prove fidelity)\n receipts diff [<a> <b>] What changed between two Receipts (no args: last two; --json)\n receipts log [dir] List the committed receipts in .receipts/ (--last N)\n receipts stats [dir] Dogfooding scoreboard: how often it ran + what it caught\n receipts eval Flag-rate of the detectors over your real local sessions (--last N, --json)\n receipts badge [receipt] shields.io endpoint JSON for a README/PR badge (--out f)\n receipts sarif [receipt] SARIF 2.1.0 for GitHub code-scanning (inline + Security tab; --out f)\n receipts prune [dir] Remove committed receipts for merged/deleted branches (--dry-run)\n receipts init One-command adopt: PR-check workflow + the repo-committed\n agent hook; --pr also branches, commits, pushes + opens the PR\n (--prepare wires the git floor; --agents codex too)\n receipts hook pre-push (called by hooks, not humans) attach the receipt on push\n (--agent claude | codex | git selects the payload dialect)\n receipts install-hook Write the self-updating pre-push hook into .git/hooks\n receipts setup-local Add the hook to YOUR ~/.claude/settings.json (only fires\n in repos that have adopted the Receipts workflow)\n receipts rederive <file> Reproduce the canonical Receipt from a transcript\n receipts assert [selector] Check the receipt against committed .receipts/asserts.json (CI gate)\n receipts mcp Start the MCP server (stdio) for IDEs/agents\n\n selector: a list number (e.g. 3), a session id, or part of the title.\n With no selector, the most recent session is used.\n\nOptions\n --list List recent sessions and exit\n --agent <name> Limit to one agent: claude-code | codex | cursor | openclaw\n --json Emit the Receipt as JSON (no card)\n --compact With --json, emit canonical (sorted, minified) JSON\n --share Emit a redacted Markdown summary for sharing\n --redact With --json, redact secrets from the Receipt\n --out <path> With --json, write to a file instead of stdout\n --base <ref> With pr, the diff base to scope against (default: main)\n --store <mode> With pr, where the receipt goes: commit (default) | none\n (print to stdout, write nothing). Also RECEIPTS_STORE env.\n --branch <name> With pr, fall back to a branch slice (default: current)\n --whole-session With pr, use the whole session (no scoping)\n --last <n> With guardrails / trends, span the last n sessions\n --copy Also copy --share / --json output to the clipboard\n --no-color Disable ANSI color (also honors NO_COLOR)\n -v, --version Print the version and exit\n -h, --help Print this help and exit\n\nSigning is done in CI by the \"Verified-by: Receipts\" GitHub Action (Sigstore\nkeyless via GitHub Artifact Attestations). See docs/verified-by.md.\n\nReceipts reports what an agent DID — not whether it was correct. Your tests are\nthe oracle for success. Evidence, not judgement.\n\nNote: a Receipt can contain titles, file paths, and command snippets from the\ntranscript (possibly secrets). Plain --json is local only; use --share or\n--json --redact to mask secrets before the output leaves your machine.\n\nDocs: https://github.com/AltimateAI/altimate-receipts\n`;\n\ntype Command =\n | \"envelope\"\n | \"verify\"\n | \"pr\"\n | \"mcp\"\n | \"rederive\"\n | \"guardrails\"\n | \"trends\"\n | \"diff\"\n | \"log\"\n | \"stats\"\n | \"eval\"\n | \"badge\"\n | \"sarif\"\n | \"prune\"\n | \"init\"\n | \"assert\"\n | \"hook\"\n | \"install-hook\"\n | \"setup-local\";\nconst COMMANDS = new Set<Command>([\n \"envelope\",\n \"verify\",\n \"pr\",\n \"mcp\",\n \"rederive\",\n \"guardrails\",\n \"trends\",\n \"diff\",\n \"log\",\n \"stats\",\n \"eval\",\n \"badge\",\n \"prune\",\n \"sarif\",\n \"init\",\n \"assert\",\n \"hook\",\n \"install-hook\",\n \"setup-local\",\n]);\n\ninterface ParsedArgs {\n help: boolean;\n version: boolean;\n list: boolean;\n json: boolean;\n compact: boolean;\n share: boolean;\n handoff: boolean;\n redact: boolean;\n copy: boolean;\n color: boolean;\n dryRun: boolean;\n wholeSession: boolean;\n prepare: boolean;\n /** `init --agents <list>` — extra agent hook files to write (SPEC-0069) */\n pr: boolean;\n agents?: string[];\n agent?: AgentSource;\n /** `hook pre-push --agent <claude|git>` payload dialect (SPEC-0066) */\n hookDialect?: HookDialect;\n out?: string;\n branchScope?: string;\n base?: string;\n store?: string;\n transcript?: string;\n last?: number;\n command?: Command;\n file?: string;\n /** second positional (e.g. the `b` receipt for `receipts diff <a> <b>`) */\n second?: string;\n selector?: string;\n}\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const args = argv.slice(2);\n const parsed: ParsedArgs = {\n help: false,\n version: false,\n list: false,\n json: false,\n compact: false,\n share: false,\n handoff: false,\n redact: false,\n copy: false,\n dryRun: false,\n wholeSession: false,\n prepare: false,\n pr: false,\n color: !process.env.NO_COLOR && process.stdout.isTTY === true,\n };\n const positionals: string[] = [];\n for (let i = 0; i < args.length; i++) {\n const a = args[i];\n if (a === \"-h\" || a === \"--help\") {\n parsed.help = true;\n } else if (a === \"-v\" || a === \"--version\") {\n parsed.version = true;\n } else if (a === \"--list\") {\n parsed.list = true;\n } else if (a === \"--json\") {\n parsed.json = true;\n } else if (a === \"--compact\") {\n parsed.compact = true;\n } else if (a === \"--share\") {\n parsed.share = true;\n } else if (a === \"--handoff\") {\n parsed.handoff = true;\n } else if (a === \"--redact\") {\n parsed.redact = true;\n } else if (a === \"--copy\") {\n parsed.copy = true;\n } else if (a === \"--out\") {\n parsed.out = args[++i];\n } else if (a === \"--branch\") {\n parsed.branchScope = args[++i];\n } else if (a === \"--base\") {\n parsed.base = args[++i];\n } else if (a === \"--store\") {\n parsed.store = args[++i];\n } else if (a === \"--transcript\") {\n parsed.transcript = args[++i];\n } else if (a === \"--last\") {\n const n = Number(args[++i]);\n if (Number.isFinite(n) && n > 0) {\n parsed.last = Math.floor(n);\n }\n } else if (a === \"--dry-run\") {\n parsed.dryRun = true;\n } else if (a === \"--whole-session\") {\n parsed.wholeSession = true;\n } else if (a === \"--prepare\") {\n parsed.prepare = true;\n } else if (a === \"--pr\") {\n parsed.pr = true;\n } else if (a === \"--agents\") {\n parsed.agents = (args[++i] ?? \"\").split(\",\").filter(Boolean);\n } else if (a === \"--agent\") {\n const next = args[i + 1];\n if (next && agentIds().includes(next as AgentSource)) {\n parsed.agent = next as AgentSource;\n i++;\n } else if (next === \"claude\" || next === \"codex\" || next === \"git\") {\n parsed.hookDialect = next; // `hook pre-push --agent <dialect>` (SPEC-0066)\n i++;\n }\n } else if (a === \"--no-color\") {\n parsed.color = false;\n } else if (a === \"--color\") {\n parsed.color = true;\n } else if (!a.startsWith(\"-\")) {\n positionals.push(a);\n }\n }\n if (positionals[0] && COMMANDS.has(positionals[0] as Command)) {\n parsed.command = positionals[0] as Command;\n parsed.file = positionals[1];\n parsed.second = positionals[2];\n } else {\n parsed.selector = positionals[0];\n }\n return parsed;\n}\n\nexport async function run(argv: string[]): Promise<number> {\n const args = parseArgs(argv);\n\n if (args.version) {\n process.stdout.write(`${getVersion()}\\n`);\n return 0;\n }\n if (args.help) {\n process.stdout.write(`${HELP}\\n`);\n return 0;\n }\n\n if (args.command === \"envelope\") {\n return runEnvelope(args.file);\n }\n if (args.command === \"verify\") {\n return runVerify(args.file, { transcript: args.transcript, branch: args.branchScope });\n }\n if (args.command === \"diff\") {\n return runDiff(args.file, args.second, { json: args.json, out: args.out });\n }\n if (args.command === \"log\") {\n return runLog(args.file, { json: args.json, last: args.last, out: args.out });\n }\n if (args.command === \"stats\") {\n return runStats(args.file, { json: args.json, out: args.out });\n }\n if (args.command === \"eval\") {\n return runEval({ json: args.json, limit: args.last, agent: args.agent });\n }\n if (args.command === \"badge\") {\n return runBadge(args.file, { out: args.out });\n }\n if (args.command === \"sarif\") {\n return runSarif(args.file, { out: args.out });\n }\n if (args.command === \"prune\") {\n return runPrune(args.file, { dryRun: args.dryRun });\n }\n if (args.command === \"init\") {\n return runInit({ prepare: args.prepare, agents: args.agents, pr: args.pr });\n }\n if (args.command === \"hook\") {\n return runHook(args.file, args.hookDialect ?? \"claude\");\n }\n if (args.command === \"install-hook\") {\n return runInstallHook();\n }\n if (args.command === \"setup-local\") {\n return runSetupLocal();\n }\n if (args.command === \"rederive\") {\n return runRederive(args.file, {\n source: args.agent,\n branch: args.branchScope,\n redact: args.redact,\n compact: args.compact,\n });\n }\n if (args.command === \"guardrails\") {\n // for `guardrails`, the positional (args.file) is a session selector\n return runGuardrails({\n selector: args.file,\n agent: args.agent,\n last: args.last,\n out: args.out,\n copy: args.copy,\n json: args.json,\n });\n }\n if (args.command === \"trends\") {\n return runTrends({\n selector: args.file,\n agent: args.agent,\n last: args.last,\n out: args.out,\n copy: args.copy,\n json: args.json,\n color: args.color,\n });\n }\n if (args.command === \"pr\") {\n return runPr({\n out: args.out,\n branch: args.branchScope,\n base: args.base,\n wholeSession: args.wholeSession,\n store: args.store,\n });\n }\n if (args.command === \"assert\") {\n return runAssert({ selector: args.file, agent: args.agent, json: args.json });\n }\n if (args.command === \"mcp\") {\n // Dynamic import keeps the MCP SDK out of every other code path.\n const { startStdio } = await import(\"./mcp/server.js\");\n await startStdio();\n // Stay alive while the transport serves stdio; resolve when the client\n // closes the input stream (so the process exits cleanly).\n await new Promise<void>((resolve) => {\n process.stdin.once(\"close\", resolve);\n process.stdin.once(\"end\", resolve);\n });\n return 0;\n }\n\n if (!(await anyDetected())) {\n process.stderr.write(\n `No agent transcripts found under ${rootsHint()}.\\nRun a coding-agent session first, then try again.\\n`,\n );\n return 1;\n }\n\n const sessions = await listSessions(args.agent);\n\n if (args.list) {\n process.stdout.write(renderList(sessions, { color: args.color }));\n return 0;\n }\n\n const summary = selectSummary(sessions, args.selector);\n if (!summary) {\n process.stderr.write(\n args.selector\n ? `No session matched \"${args.selector}\". Try \\`receipts --list\\`.\\n`\n : \"No sessions found.\\n\",\n );\n return 1;\n }\n\n const session = await loadSession(summary);\n if (!session) {\n process.stderr.write(`Could not read session: ${summary.id}\\n`);\n return 1;\n }\n\n const derived = deriveSpans(session);\n const findings = deriveFindings(derived);\n\n if (args.json) {\n let receipt = await buildReceipt(session, derived, findings);\n if (args.redact) {\n receipt = redactReceipt(receipt);\n }\n const out = args.compact ? canonicalize(receipt) : JSON.stringify(receipt, null, 2);\n if (args.out) {\n writeFileSync(args.out, `${out}\\n`);\n process.stderr.write(`Receipt written to ${args.out}\\n`);\n return 0;\n }\n emit(out, args.copy, \"Receipt\");\n return 0;\n }\n\n if (args.share) {\n const md = renderShareMarkdown({ summary, session, derived, findings });\n emit(md.trimEnd(), args.copy, \"Shareable summary\");\n return 0;\n }\n\n if (args.handoff) {\n const receipt = redactReceipt(await buildReceipt(session, derived, findings));\n const md = renderHandoffMarkdown(buildHandoff(receipt, findings));\n emit(md.trimEnd(), args.copy, \"Handoff\");\n return 0;\n }\n\n process.stdout.write(renderCard({ summary, derived, findings }, { color: args.color }));\n return 0;\n}\n\nfunction git(args: string[]): string {\n const r = spawnSync(\"git\", args, { encoding: \"utf8\" });\n return r.status === 0 ? r.stdout.trim() : \"\";\n}\n\n/**\n * `receipts pr` — find the session that built the current git branch (matching\n * gitBranch + repo root from the transcript), and write its redacted Receipt to\n * `.receipts/<branch>.json` so the \"Verified-by: Receipts\" workflow can sign it.\n */\n/** How many recent in-repo sessions to scan when the branch session didn't produce the\n * diff (the integration-branch / squash-merge case). Bounds the cost of the fallback. */\nconst PR_SELECT_SCAN = 150;\n\n/** A loaded session + its derived evidence, returned by the `pr` session picker. */\ninterface PickedSession {\n summary: SessionSummary;\n session: Session;\n derived: DerivedSummary;\n}\n\n/** How many of `files` (the diff) a session's edits touched — the evidence that this\n * session actually produced (part of) the change. */\nexport function diffOverlap(derived: DerivedSummary, files: readonly string[]): number {\n return derived.filesChanged.filter((f) => inDiff(f.path, files)).length;\n}\n\n/** Earliest author time (epoch ms) of any commit unique to this branch, or null when\n * unknowable (no base, no commits yet, no git). Author time — not commit time — keeps\n * rebases and cherry-picks permissive: carried-over work keeps its old author date, so\n * the old session that produced it stays eligible (SPEC-0068 R3). */\nexport function branchBirthMs(base?: string): number | null {\n if (!base) {\n return null;\n }\n const out = git([\"log\", \"--reverse\", \"--format=%at\", `${base}..HEAD`]);\n const first = Number(out.split(\"\\n\")[0]?.trim());\n return Number.isFinite(first) && first > 0 ? first * 1000 : null;\n}\n\n/** A fallback-scan candidate is stale — and ineligible — when it ended before the\n * branch's first commit was authored: a session that ended before the branch existed\n * cannot have produced its diff (SPEC-0068 R3). Unknown times ⇒ not stale (guard off). */\nexport function staleForBranch(endedAt: number | undefined, birthMs: number | null): boolean {\n return birthMs != null && endedAt != null && endedAt < birthMs;\n}\n\n/**\n * Pick the session that backs a diff-scoped `receipts pr`. A diff-scoped receipt is about\n * *who produced this change*, so the right session is the one whose edits **overlap the\n * diff** — not merely one carrying the branch tag. The branch-matched session is tried\n * first (cheap, the common feature-branch case); only when it didn't touch the diff (an\n * integration/release branch whose work was merged from feature branches, or a squash\n * workflow — where the branch tag carries only unrelated sessions) do we scan recent\n * in-repo sessions for the real author. Evidence-based: only a session that edited a diff\n * file can win, so this never mis-attributes an unrelated session's work (cf. M56). Returns\n * the branch session (even at 0 overlap) as an honest last resort, or null if none.\n */\nasync function pickForDiff(\n all: SessionSummary[],\n branch: string,\n repoRoot: string | undefined,\n files: readonly string[],\n birthMs: number | null = null,\n shas: readonly string[] = [],\n): Promise<PickedSession | null> {\n const load = async (sum: SessionSummary): Promise<PickedSession | null> => {\n const session = await loadSession(sum);\n if (!session) {\n return null;\n }\n return { summary: sum, session, derived: deriveSpans(session) };\n };\n\n // 0) strongest evidence first (SPEC-0069): a session whose `git commit`/`git push`\n // OUTPUT carries one of this branch's commit SHAs authored the branch — exact and\n // agent-agnostic (Codex/Cursor record no branch tags and often edit via shell, so\n // the tag and edit-overlap selectors below can't see them). The pool is NOT\n // repo-filtered: a commit SHA is globally unique, so a session run from another\n // checkout (worktree, cross-repo tooling) attributes correctly too. Most-recent\n // first; the first authored match wins.\n if (shas.length > 0) {\n for (const sum of all.slice(0, PR_SELECT_SCAN)) {\n const cand = await load(sum);\n if (cand && authoredBranch(cand.derived.spans, shas)) {\n return cand;\n }\n }\n }\n\n // 1) cheap path: the branch-matched session, if it actually produced the diff.\n const primarySum = selectForBranch(all, branch, repoRoot);\n const primary = primarySum ? await load(primarySum) : null;\n if (primary && diffOverlap(primary.derived, files) > 0) {\n return primary;\n }\n\n // 2) the branch session didn't touch the diff → find the session that did, among the\n // most-recent in-repo sessions (bounded). Most-recent-first, so ties keep the newest.\n // Stale guard (SPEC-0068 R3): unlike the tag-matched primary, a scan candidate's only\n // evidence is file overlap — and an old session that once edited the same hot file\n // (.husky/pre-push, cli.ts, README) overlaps every later diff that touches it. A\n // session that ended before this branch's first commit was authored is excluded.\n let best: PickedSession | null = null;\n let bestScore = 0;\n const recent = all\n .filter((s) => inRepo(s.projectPath, repoRoot))\n .filter((s) => !staleForBranch(s.endedAt, birthMs))\n .slice(0, PR_SELECT_SCAN);\n for (const sum of recent) {\n const cand = await load(sum);\n if (!cand) {\n continue;\n }\n const score = diffOverlap(cand.derived, files);\n if (score > bestScore) {\n best = cand;\n bestScore = score;\n }\n }\n return best ?? primary;\n}\n\nasync function runPr(opts: {\n out?: string;\n branch?: string;\n base?: string;\n store?: string;\n wholeSession?: boolean;\n}): Promise<number> {\n const branch = opts.branch || git([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n const repoRoot = git([\"rev-parse\", \"--show-toplevel\"]);\n if (!branch || branch === \"HEAD\") {\n process.stderr.write(\"receipts pr: not on a git branch (use --branch <name>).\\n\");\n return 1;\n }\n\n // Diff-scope by default: the receipt reflects only this PR's change. The changed\n // file set is recorded in `predicate.scope` so the receipt stays re-derivable\n // (SPEC-0013). Fall back to a branch slice, then the whole session, and say which.\n const diff = opts.wholeSession ? null : changedFiles(opts.base);\n const all = await listSessions();\n const picked = diff\n ? await pickForDiff(\n all,\n branch,\n repoRoot || undefined,\n diff.files,\n branchBirthMs(diff.base),\n branchShas(diff.base),\n )\n : await (async () => {\n const sum = selectForBranch(all, branch, repoRoot || undefined);\n return sum ? { summary: sum, session: await loadSession(sum), derived: null } : null;\n })();\n\n if (!picked || !picked.session) {\n process.stderr.write(\n `receipts pr: no agent session found for branch \"${branch}\" in this repo.\\nBuild the branch with a coding agent first, or run \\`receipts --list\\`.\\n`,\n );\n return 1;\n }\n const { summary, session } = picked;\n\n let scopedSession = session;\n let derived = picked.derived ?? deriveSpans(session);\n let findings = deriveFindings(derived);\n let scope: ReceiptScope = { kind: \"session\" };\n let scopeNote = \"whole session\";\n\n if (diff) {\n const sd = applyDiffScope(derived, findings, diff.files, session.projectPath);\n derived = sd.derived;\n findings = sd.findings;\n scope = { kind: \"diff\", base: diff.base, files: diff.files };\n scopeNote = `diff vs ${diff.base} (${diff.files.length} file${diff.files.length === 1 ? \"\" : \"s\"})`;\n // Branch-narrowed effort (SPEC-0068 R4): this branch's turns ∩ diff-file edits.\n // `scope.branch` records the narrowing so rederive reproduces it byte-for-byte.\n const slice = sliceByBranch(session, branch);\n const eff = narrowEffort(slice ? deriveSpans(slice) : null, diff.files);\n if (eff) {\n derived = { ...derived, diffCostUsd: eff.cost, diffTokens: eff.tokens, diffTurns: eff.turns };\n scope.branch = branch;\n }\n } else if (!opts.wholeSession) {\n const slice = sliceByBranch(session, branch);\n if (slice) {\n scopedSession = slice;\n derived = deriveSpans(slice);\n findings = deriveFindings(derived);\n scope = { kind: \"branch\", branch };\n scopeNote = `branch ${branch} (no git diff)`;\n } else {\n scopeNote = \"whole session (no diff / branch tags)\";\n }\n }\n\n const receipt = redactReceipt(await buildReceipt(scopedSession, derived, findings, { scope }));\n const json = `${JSON.stringify(receipt, null, 2)}\\n`;\n\n // M65 (SPEC-0064): where the receipt lives is configurable; default `commit` keeps today's\n // behavior. `none` emits to stdout and writes nothing; `ref` (SPEC-0070) stores it at\n // refs/receipts/<slug> with no tree files. `ephemeral`/`upload` remain unbuilt — they fall\n // back to `commit` with a notice so nothing silently changes.\n const store = (\n opts.store ||\n process.env.RECEIPTS_STORE ||\n (repoRoot\n ? (settingsStore(repoRoot) ?? settingsStore(primaryCheckout(repoRoot) ?? \"\"))\n : undefined) ||\n \"commit\"\n ).toLowerCase();\n if (store === \"none\") {\n process.stdout.write(json);\n process.stderr.write(\n `receipts pr: store=none — printed the receipt (Grade ${receipt.predicate.grade}, ${scopeNote}); wrote nothing.\\n`,\n );\n return 0;\n }\n if ([\"ephemeral\", \"notes\", \"upload\"].includes(store)) {\n process.stderr.write(\n `receipts pr: store=${store} not yet implemented (SPEC-0064) — using \\`commit\\`.\\n`,\n );\n } else if (store !== \"commit\" && store !== \"ref\") {\n process.stderr.write(`receipts pr: unknown store=${store} — using \\`commit\\`.\\n`);\n }\n\n const safe = branch.replace(/[/\\\\]/g, \"-\");\n\n // store=ref (SPEC-0070): the receipt lives at refs/receipts/<slug> — no tree\n // files, no PR-diff entry, nothing on main. The hook pushes the ref alongside\n // the branch; CI fetches it. Falls back to `commit` if the plumbing fails.\n if (store === \"ref\") {\n const w = writeReceiptRef(safe, branch, json, summary.endedAt, repoRoot || undefined);\n if (w.ok) {\n process.stderr.write(\n `receipts pr: wrote ${w.ref} (Grade ${receipt.predicate.grade}, ${scopeNote}) from \"${summary.title ?? \"untitled\"}\" — no tree files.\\n`,\n );\n return 0;\n }\n process.stderr.write(`receipts pr: store=ref failed (${w.reason}) — using \\`commit\\`.\\n`);\n }\n\n const dir = join(repoRoot || \".\", \".receipts\");\n const out = opts.out ?? join(dir, `${safe}.json`);\n mkdirSync(dir, { recursive: true });\n // Mark receipts linguist-generated so GitHub collapses them in PR diffs (the\n // \"one more JSON in every PR\" complaint — docs/research/receipt-transport-options.md).\n // Written here, not just in init, so existing adopters pick it up on their next receipt.\n const attrs = join(dir, \".gitattributes\");\n if (!existsSync(attrs)) {\n writeFileSync(attrs, \"* linguist-generated\\n\");\n git([\"add\", attrs]);\n }\n writeFileSync(out, json);\n git([\"add\", out]); // best-effort stage\n\n const rel = repoRoot ? relative(repoRoot, out) : out;\n process.stderr.write(\n `receipts pr: wrote ${rel} (Grade ${receipt.predicate.grade}, ${scopeNote}) from \"${summary.title ?? \"untitled\"}\".\\n`,\n );\n return 0;\n}\n\n/**\n * `receipts guardrails [selector] [--last N]` — turn findings into a paste-ready\n * prevention block (AGENTS.md / CLAUDE.md). Aggregates the deduped guardrailRules.\n */\nasync function runGuardrails(opts: {\n selector?: string;\n agent?: AgentSource;\n last?: number;\n out?: string;\n copy?: boolean;\n json?: boolean;\n}): Promise<number> {\n if (!(await anyDetected())) {\n process.stderr.write(`No agent transcripts found under ${rootsHint()}.\\n`);\n return 1;\n }\n\n const derivations = await deriveTargets({\n agent: opts.agent,\n last: opts.last,\n selector: opts.selector,\n });\n if (derivations.length === 0) {\n process.stderr.write(\"guardrails: no matching session.\\n\");\n return 1;\n }\n const findingSets = derivations.map((d) => d.findings);\n\n const rules = collectGuardrails(findingSets);\n const block = renderGuardrailsBlock(rules, opts.json ? \"json\" : \"md\");\n\n if (opts.out) {\n const existing = existsSync(opts.out) ? readFileSync(opts.out, \"utf8\") : \"\";\n writeFileSync(opts.out, upsertGuardrailsSection(existing, block));\n process.stderr.write(\n `guardrails: wrote ${rules.length} rule(s) to ${opts.out} (from ${findingSets.length} session${findingSets.length === 1 ? \"\" : \"s\"}).\\n`,\n );\n return 0;\n }\n\n emit(block, opts.copy ?? false, \"Guardrails\");\n if (opts.last) {\n process.stderr.write(`(from the last ${findingSets.length} sessions)\\n`);\n }\n return 0;\n}\n\n/**\n * `receipts trends [--last N]` — a cross-session digest: grade movement, the finding\n * kinds that recur most, and evidence totals over your last N sessions. Reuses the\n * same per-session derivation as the Report Card; deterministic, zero model calls.\n */\nasync function runTrends(opts: {\n selector?: string;\n agent?: AgentSource;\n last?: number;\n out?: string;\n copy?: boolean;\n json?: boolean;\n color?: boolean;\n}): Promise<number> {\n if (!(await anyDetected())) {\n process.stderr.write(`No agent transcripts found under ${rootsHint()}.\\n`);\n return 1;\n }\n\n // A trend needs a window: default to the last 10 sessions. An explicit selector\n // pins a single session; --last N overrides both.\n const requested = opts.last && opts.last > 0 ? opts.last : opts.selector ? 1 : 10;\n const derivations = await deriveTargets(\n opts.last && opts.last > 0\n ? { agent: opts.agent, last: opts.last }\n : opts.selector\n ? { agent: opts.agent, selector: opts.selector }\n : { agent: opts.agent, last: 10 },\n );\n if (derivations.length === 0) {\n process.stderr.write(\"trends: no matching sessions.\\n\");\n return 1;\n }\n\n // deriveTargets is most-recent-first; the digest reads oldest → newest.\n const inputs = derivations\n .slice()\n .reverse()\n .map((d) => ({ derived: d.derived, findings: d.findings }));\n const trends = computeTrends(inputs, requested);\n\n if (opts.out) {\n const block = renderTrends(trends, \"md\");\n const existing = existsSync(opts.out) ? readFileSync(opts.out, \"utf8\") : \"\";\n writeFileSync(opts.out, upsertTrendsSection(existing, block));\n process.stderr.write(\n `trends: wrote section to ${opts.out} (from ${trends.window.used} sessions).\\n`,\n );\n return 0;\n }\n\n if (opts.json) {\n emit(renderTrends(trends, \"json\"), opts.copy ?? false, \"Trends\");\n return 0;\n }\n\n process.stdout.write(renderTrends(trends, \"card\", { color: opts.color }));\n if (opts.copy) {\n const ok = copyToClipboard(renderTrends(trends, \"card\", { color: false }));\n process.stderr.write(\n ok ? \"Trends copied to clipboard.\\n\" : \"Clipboard unavailable — copy the output above.\\n\",\n );\n }\n return 0;\n}\n\n/** `receipts envelope <receipt.json>` — wrap a Receipt as an unsigned DSSE envelope. */\nfunction runEnvelope(file?: string): number {\n if (!file) {\n process.stderr.write(\"Usage: receipts envelope <receipt.json>\\n\");\n return 1;\n }\n try {\n const receipt = JSON.parse(readFileSync(file, \"utf8\"));\n process.stdout.write(`${JSON.stringify(toDsseEnvelope(receipt), null, 2)}\\n`);\n return 0;\n } catch (err) {\n process.stderr.write(`Could not read ${file}: ${err instanceof Error ? err.message : err}\\n`);\n return 1;\n }\n}\n\n/** `receipts verify <bundle> [--transcript <t> --branch b]` — structural + re-derivation. */\nasync function runVerify(\n file?: string,\n opts: { transcript?: string; branch?: string } = {},\n): Promise<number> {\n if (!file) {\n process.stderr.write(\"Usage: receipts verify <bundle.json> [--transcript <t> [--branch b]]\\n\");\n return 1;\n }\n let input: unknown;\n try {\n input = JSON.parse(readFileSync(file, \"utf8\"));\n } catch (err) {\n process.stderr.write(`Could not read ${file}: ${err instanceof Error ? err.message : err}\\n`);\n return 1;\n }\n const result = verifyBundle(input);\n if (!result.ok) {\n process.stderr.write(\"✗ Invalid Receipt:\\n\");\n for (const e of result.errors) {\n process.stderr.write(` - ${e}\\n`);\n }\n return 1;\n }\n\n const sig = result.signed\n ? `signed${result.rekorLogIndex !== undefined ? ` · Rekor #${result.rekorLogIndex}` : \"\"}`\n : \"unsigned\";\n process.stdout.write(`✓ Valid Receipt — Grade ${result.grade} · ${sig}\\n`);\n if (result.signer) {\n process.stdout.write(` signer: ${result.signer}\\n`);\n }\n\n // Re-derivation: prove the Receipt is faithful to its transcript (L1).\n if (opts.transcript && result.receipt) {\n const cmp = await compareToTranscript(result.receipt, opts.transcript, { branch: opts.branch });\n if (!cmp.rederived) {\n process.stderr.write(\" ✗ could not re-derive from the supplied transcript\\n\");\n return 1;\n }\n if (!cmp.matches) {\n process.stderr.write(\n \" ✗ re-derivation MISMATCH — the Receipt does not match its transcript (possibly hand-edited)\\n\",\n );\n return 1;\n }\n process.stdout.write(\" ✓ re-derived — faithful to the transcript (L1)\\n\");\n return 0;\n }\n\n process.stdout.write(\n \" Note: structural check only. Pass --transcript to prove fidelity (L1); `gh attestation verify` for full Sigstore/Rekor.\\n\",\n );\n return 0;\n}\n\n/** `receipts diff <a.json> <b.json>` — what changed between two receipts (M51). */\nfunction runDiff(\n fileA?: string,\n fileB?: string,\n opts: { json?: boolean; out?: string } = {},\n): number {\n let pathA = fileA;\n let pathB = fileB;\n // No args → \"what changed since the last run\": diff the two most recent committed\n // receipts in .receipts/ (composes `log`'s history with `diff`). A = older, B = newest.\n if (!pathA && !pathB) {\n const hist = loadReceiptHistory(\".receipts\");\n if (hist.length < 2) {\n process.stderr.write(\n `receipts diff: need two receipts. Found ${hist.length} in .receipts/ — pass two explicitly: receipts diff <a.json> <b.json>.\\n`,\n );\n return 1;\n }\n // `<slug>@ref` entries are ref-stored (SPEC-0070) — resolved by `read` below.\n const sourceOf = (name: string): string =>\n name.endsWith(\"@ref\") ? name : join(\".receipts\", `${name}.json`);\n pathA = sourceOf(hist[1].name); // second-newest = baseline\n pathB = sourceOf(hist[0].name); // newest = new\n process.stdout.write(`receipts diff: ${hist[1].name} → ${hist[0].name} (most recent two)\\n\\n`);\n }\n if (!pathA || !pathB) {\n process.stderr.write(\n \"Usage: receipts diff [<receiptA.json> <receiptB.json>] [--json] [--out <f>]\\n\" +\n \" with no args, diffs the two most recent receipts in .receipts/\\n\",\n );\n return 1;\n }\n const read = (f: string): Receipt | null => {\n let input: unknown;\n try {\n const raw = f.endsWith(\"@ref\") ? readReceiptRef(f.slice(0, -\"@ref\".length)) : null;\n input = JSON.parse(raw ?? readFileSync(f, \"utf8\"));\n } catch (err) {\n process.stderr.write(`Could not read ${f}: ${err instanceof Error ? err.message : err}\\n`);\n return null;\n }\n const res = verifyBundle(input);\n if (!res.ok || !res.receipt) {\n process.stderr.write(`✗ ${f} is not a valid Receipt:\\n`);\n for (const e of res.errors) process.stderr.write(` - ${e}\\n`);\n return null;\n }\n return res.receipt;\n };\n const a = read(pathA);\n const b = read(pathB);\n if (!a || !b) return 1;\n\n const delta = diffReceipts(a, b);\n const output = opts.json ? `${JSON.stringify(delta, null, 2)}\\n` : renderDiff(delta);\n if (opts.out) {\n writeFileSync(opts.out, output);\n process.stdout.write(`receipts diff: wrote ${opts.out}\\n`);\n } else {\n process.stdout.write(output);\n }\n return 0;\n}\n\n/** `receipts log [dir]` — list the committed receipts in `.receipts/` (M52). */\nfunction runLog(dir?: string, opts: { json?: boolean; last?: number; out?: string } = {}): number {\n const all = loadReceiptHistory(dir ?? \".receipts\");\n const shown = opts.last ? all.slice(0, opts.last) : all;\n const output = opts.json ? `${JSON.stringify(shown, null, 2)}\\n` : renderLog(shown, all.length);\n if (opts.out) {\n writeFileSync(opts.out, output);\n process.stdout.write(`receipts log: wrote ${opts.out}\\n`);\n } else {\n process.stdout.write(output);\n }\n return 0;\n}\n\n/** `receipts stats [dir]` — dogfooding scoreboard over the committed receipts (M53). */\nfunction runStats(dir?: string, opts: { json?: boolean; out?: string } = {}): number {\n const stats = computeStats(dir ?? \".receipts\");\n const output = opts.json ? `${JSON.stringify(stats, null, 2)}\\n` : renderStats(stats);\n if (opts.out) {\n writeFileSync(opts.out, output);\n process.stdout.write(`receipts stats: wrote ${opts.out}\\n`);\n } else {\n process.stdout.write(output);\n }\n return 0;\n}\n\n/** `receipts badge` (M59) — emit a shields.io endpoint JSON for a committed receipt (the\n * branch receipt by default), an at-a-glance factual state for a README/PR badge. States the\n * finding count, colors by worst severity; never a quality verdict (R2). Deterministic. */\nfunction runBadge(file?: string, opts: { out?: string } = {}): number {\n const repoRoot = git([\"rev-parse\", \"--show-toplevel\"]) || \".\";\n const branch = git([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n const path =\n file ??\n (branch && branch !== \"HEAD\"\n ? join(repoRoot, \".receipts\", `${branch.replace(/[/\\\\]/g, \"-\")}.json`)\n : undefined);\n if (!path || !existsSync(path)) {\n process.stderr.write(\n `receipts badge: no receipt found${path ? ` at ${path}` : \"\"}. Run \\`receipts pr\\` first, or pass a receipt path.\\n`,\n );\n return 1;\n }\n let input: unknown;\n try {\n input = JSON.parse(readFileSync(path, \"utf8\"));\n } catch {\n process.stderr.write(`receipts badge: could not parse ${path}\\n`);\n return 1;\n }\n const res = verifyBundle(input);\n if (!res.ok || !res.receipt) {\n process.stderr.write(`receipts badge: ${path} is not a valid Receipt.\\n`);\n return 1;\n }\n const output = `${JSON.stringify(badgeEndpoint(res.receipt.predicate), null, 2)}\\n`;\n if (opts.out) {\n writeFileSync(opts.out, output);\n process.stdout.write(`receipts badge: wrote ${opts.out}\\n`);\n } else {\n process.stdout.write(output);\n }\n return 0;\n}\n\n/** `receipts sarif` (M63) — emit SARIF 2.1.0 for a committed receipt (the branch receipt by\n * default) so GitHub code-scanning can post findings inline + in the Security tab. Pure\n * transform; uploading is the user's CI step (see docs/sarif.md). */\nfunction runSarif(file?: string, opts: { out?: string } = {}): number {\n const repoRoot = git([\"rev-parse\", \"--show-toplevel\"]) || \".\";\n const branch = git([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n const path =\n file ??\n (branch && branch !== \"HEAD\"\n ? join(repoRoot, \".receipts\", `${branch.replace(/[/\\\\]/g, \"-\")}.json`)\n : undefined);\n if (!path || !existsSync(path)) {\n process.stderr.write(\n `receipts sarif: no receipt found${path ? ` at ${path}` : \"\"}. Run \\`receipts pr\\` first, or pass a receipt path.\\n`,\n );\n return 1;\n }\n let input: unknown;\n try {\n input = JSON.parse(readFileSync(path, \"utf8\"));\n } catch {\n process.stderr.write(`receipts sarif: could not parse ${path}\\n`);\n return 1;\n }\n const res = verifyBundle(input);\n if (!res.ok || !res.receipt) {\n process.stderr.write(`receipts sarif: ${path} is not a valid Receipt.\\n`);\n return 1;\n }\n const output = `${JSON.stringify(toSarif(res.receipt), null, 2)}\\n`;\n if (opts.out) {\n writeFileSync(opts.out, output);\n process.stdout.write(`receipts sarif: wrote ${opts.out}\\n`);\n } else {\n process.stdout.write(output);\n }\n return 0;\n}\n\n/** `receipts prune` (M65b) — the committed-receipt clutter reducer: remove\n * `.receipts/<branch>.json` files whose branch no longer exists on the remote (merged/deleted),\n * keeping live-branch receipts + the example files. Live branches come from `git ls-remote`; if\n * that can't be read, it aborts and removes nothing. `--dry-run` previews. */\nfunction runPrune(dir?: string, opts: { dryRun?: boolean } = {}): number {\n const repoRoot = git([\"rev-parse\", \"--show-toplevel\"]) || \".\";\n const dpath = dir ?? join(repoRoot, \".receipts\");\n let files: string[];\n try {\n files = readdirSync(dpath).filter((f) => f.endsWith(\".json\"));\n } catch {\n process.stderr.write(`receipts prune: no ${dpath} directory.\\n`);\n return 0;\n }\n const ls = git([\"ls-remote\", \"--heads\", \"origin\"]);\n if (ls === null) {\n process.stderr.write(\n \"receipts prune: could not list remote branches (offline / no 'origin'?) — aborting, nothing removed.\\n\",\n );\n return 1;\n }\n const liveSlugs = new Set(\n ls\n .split(\"\\n\")\n .map((l) => l.split(\"refs/heads/\")[1])\n .filter(Boolean)\n .map((b) => branchSlug(b.trim())),\n );\n const { keep, remove } = planPrune(files, liveSlugs);\n if (remove.length === 0) {\n const prunedRefs = pruneReceiptRefs(liveSlugs, opts.dryRun ?? false);\n if (prunedRefs === 0) {\n process.stdout.write(`receipts prune: nothing to prune (${keep.length} receipt(s) kept).\\n`);\n }\n return 0;\n }\n if (opts.dryRun) {\n process.stdout.write(\n `receipts prune (dry-run): would remove ${remove.length}/${files.length} receipt(s), keep ${keep.length}:\\n`,\n );\n for (const f of remove) {\n process.stdout.write(` - ${f}\\n`);\n }\n pruneReceiptRefs(liveSlugs, true);\n return 0;\n }\n pruneReceiptRefs(liveSlugs, false);\n for (const f of remove) {\n const p = join(dpath, f);\n if (git([\"rm\", \"-f\", \"--\", p]) === null) {\n try {\n unlinkSync(p);\n } catch {\n /* already gone */\n }\n }\n }\n process.stdout.write(\n `receipts prune: removed ${remove.length} receipt(s) for merged/deleted branches; kept ${keep.length}.\\n`,\n );\n return 0;\n}\n\n/** Prune ref-stored receipts (SPEC-0070): a refs/receipts/<slug> whose branch is\n * gone from origin is deleted locally and on the remote. Shares runPrune's\n * liveness basis (origin's heads) and dry-run semantics. */\nfunction pruneReceiptRefs(liveSlugs: Set<string>, dryRun: boolean): number {\n const refs = listReceiptRefs().filter(({ slug }) => !liveSlugs.has(slug));\n if (refs.length === 0) {\n return 0;\n }\n for (const { ref, slug } of refs) {\n if (dryRun) {\n process.stdout.write(` - ${ref}\\n`);\n continue;\n }\n git([\"update-ref\", \"-d\", ref]);\n git([\"push\", \"origin\", `:${ref}`]); // best-effort remote cleanup\n process.stdout.write(`receipts prune: removed ${ref} (branch ${slug} gone).\\n`);\n }\n return refs.length;\n}\n\n/** `receipts eval` — field scan (M57): run the work-account detectors over your own real\n * local agent sessions and report how often each merge-surface category fires. A flag rate\n * the human interprets (a flag may be a true finding or an FP), never a verdict. Local-first\n * (reads only local sessions), deterministic, 0 model calls. `--last N` bounds the scan\n * (default 200, most-recent first). The labeled precision/recall corpus is a dev/CI artifact\n * (see `eval/corpus.json` + `test/eval.test.ts`), not shipped through this command. */\nasync function runEval(\n opts: { json?: boolean; limit?: number; agent?: AgentSource } = {},\n): Promise<number> {\n const limit = opts.limit && opts.limit > 0 ? opts.limit : 200;\n const summaries = (await listSessions(opts.agent)).slice(0, limit);\n const rows: FieldRow[] = [];\n for (const summary of summaries) {\n const session = await loadSession(summary);\n if (!session) {\n continue;\n }\n const { main, minor } = deriveFindings(deriveSpans(session));\n rows.push({\n title: summary.title ?? summary.id,\n categories: [...firedCategories([...main, ...minor])],\n });\n }\n const scan = summarizeFieldScan(rows);\n process.stdout.write(opts.json ? `${JSON.stringify(scan, null, 2)}\\n` : renderFieldScan(scan));\n return 0;\n}\n\n/** `receipts init` — one-command integration (SPEC-0066): scaffold the quiet-mode\n * \"Verified by Receipts\" PR-check workflow AND the repo-committed Claude Code hook\n * (a frozen npx one-liner in .claude/settings.json — every contributor gets it on\n * clone, behavior updates ship via npm). `--prepare` additionally wires the git-hook\n * floor into package.json. Each artifact is independently idempotent. `--pr` then\n * does the ceremony too: branch, commit (only the generated files), push, open the\n * PR — each step best-effort, degrading to printed instructions. */\nfunction runInit(opts: { prepare?: boolean; agents?: string[]; pr?: boolean } = {}): number {\n const lines: string[] = [];\n /** files this run actually created or changed — the exact commit for `--pr` */\n const written: string[] = [];\n\n const v = getVersion();\n // Float the major tag (`v0`, `v1` — the `actions/checkout@v4` pattern) so adopters get new\n // minor/patch features automatically on the next CI run; only a major bump needs a workflow\n // edit. Security-strict adopters can pin a full version (vX.Y.Z) or a commit SHA instead.\n const major = /^(\\d+)\\.\\d+\\.\\d+/.exec(v)?.[1];\n const tag = major ? `v${major}` : \"v0\";\n const dir = \".github/workflows\";\n const path = `${dir}/receipts.yml`;\n if (existsSync(path)) {\n lines.push(`receipts init: ${path} already exists — leaving it untouched.`);\n } else {\n mkdirSync(dir, { recursive: true });\n writeFileSync(path, workflowContent(tag, v));\n written.push(path);\n lines.push(`receipts init: wrote ${path} (tracking ${tag}, quiet + non-blocking).`);\n }\n\n // The agent-embedded trigger: generation fires inside any Claude Code session\n // that pushes — repo state, not machine state, so there is nothing to install.\n const settingsPath = join(\".claude\", \"settings.json\");\n const merged = mergeHookIntoSettings(settingsPath);\n if (!merged.ok) {\n lines.push(`receipts init: ${merged.reason}.`);\n } else if (merged.changed) {\n written.push(settingsPath);\n lines.push(`receipts init: added the receipts pre-push hook to ${settingsPath}.`);\n } else {\n lines.push(`receipts init: ${settingsPath} already has the receipts hook.`);\n }\n const ignorePath = join(\".claude\", \".gitignore\");\n if (!existsSync(ignorePath)) {\n writeFileSync(ignorePath, \"*\\n!settings.json\\n!.gitignore\\n\");\n written.push(ignorePath);\n lines.push(`receipts init: wrote ${ignorePath} (commit settings.json, ignore the rest).`);\n }\n // Codex native trigger (SPEC-0069 R4): same schema as Claude's settings hooks,\n // different file + dialect. Written when asked for (--agents codex) or when the\n // repo already carries a .codex/ dir (the team clearly uses Codex).\n if (opts.agents?.includes(\"codex\") || existsSync(\".codex\")) {\n const codexPath = join(\".codex\", \"hooks.json\");\n const m = mergeHookIntoSettings(\n codexPath,\n \"npx -y altimate-receipts@latest hook pre-push --agent codex\",\n );\n if (!m.ok) {\n lines.push(`receipts init: ${m.reason}.`);\n } else if (m.changed) {\n written.push(codexPath);\n lines.push(`receipts init: added the receipts pre-push hook to ${codexPath}.`);\n } else {\n lines.push(`receipts init: ${codexPath} already has the receipts hook.`);\n }\n }\n\n // Receipts are linguist-generated: GitHub collapses them in PR diffs, so the\n // committed .receipts/<branch>.json never adds review noise.\n const attrsPath = join(\".receipts\", \".gitattributes\");\n if (!existsSync(attrsPath)) {\n mkdirSync(\".receipts\", { recursive: true });\n writeFileSync(attrsPath, \"* linguist-generated\\n\");\n written.push(attrsPath);\n lines.push(`receipts init: wrote ${attrsPath} (receipts collapse in PR diffs).`);\n }\n\n if (opts.prepare) {\n const wired = wirePrepareScript(\"package.json\");\n if (!wired.ok) {\n lines.push(`receipts init: ${wired.reason}.`);\n } else if (wired.changed) {\n written.push(\"package.json\");\n lines.push(\n \"receipts init: wired `prepare` in package.json — `npm install` now self-installs the git hook.\",\n );\n } else {\n lines.push(\"receipts init: package.json `prepare` already wired.\");\n }\n }\n\n if (opts.pr) {\n openAdoptionPr(written, lines);\n } else {\n lines.push(\" Commit these, open a PR, and receipts attach themselves from then on.\");\n lines.push(\" (Or let init do that too: `npx altimate-receipts init --pr`.)\");\n }\n if (written.includes(settingsPath)) {\n // Field-observed: a session that ran init then pushed got no receipt — agent\n // runtimes snapshot project hooks at session START, so the hook arms next session.\n lines.push(\" Note: agent sessions load hooks at startup — restart any running session once.\");\n }\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n return 0;\n}\n\nconst ADOPT_BRANCH = \"chore/adopt-receipts\";\n\n/** `init --pr` — finish the ceremony: branch, commit ONLY the files init generated,\n * push, open the PR (gh when available, else the GitHub compare URL). Every step is\n * best-effort: a failure prints what to do by hand and never loses the files. */\nfunction openAdoptionPr(written: string[], lines: string[]): void {\n if (written.length === 0) {\n lines.push(\"receipts init: nothing new to commit — the repo is already integrated.\");\n return;\n }\n if (!git([\"rev-parse\", \"--git-dir\"])) {\n lines.push(\"receipts init: not a git repository — commit the files above manually.\");\n return;\n }\n if (git([\"rev-parse\", \"--verify\", \"--quiet\", ADOPT_BRANCH]) !== \"\") {\n lines.push(\n `receipts init: branch ${ADOPT_BRANCH} already exists — commit the files above to it manually.`,\n );\n return;\n }\n if (spawnSync(\"git\", [\"checkout\", \"-b\", ADOPT_BRANCH], { encoding: \"utf8\" }).status !== 0) {\n lines.push(`receipts init: could not create branch ${ADOPT_BRANCH} — commit manually.`);\n return;\n }\n spawnSync(\"git\", [\"add\", \"--\", ...written], { encoding: \"utf8\" });\n // No --no-verify: the repo's own pre-commit checks should see the change. If they\n // reject it, the files stay staged on the branch for the owner to finish.\n const commit = spawnSync(\n \"git\",\n [\"commit\", \"-m\", \"chore: adopt receipts — zero-install agent-work verification\"],\n { encoding: \"utf8\" },\n );\n if (commit.status !== 0) {\n lines.push(\n `receipts init: commit failed (pre-commit hooks?) — files are staged on ${ADOPT_BRANCH}; finish manually.`,\n );\n return;\n }\n lines.push(`receipts init: committed ${written.length} file(s) on ${ADOPT_BRANCH}.`);\n const push = spawnSync(\"git\", [\"push\", \"-u\", \"origin\", ADOPT_BRANCH], { encoding: \"utf8\" });\n if (push.status !== 0) {\n lines.push(\n \"receipts init: push failed (no remote / auth?) — push the branch and open a PR manually.\",\n );\n return;\n }\n lines.push(`receipts init: pushed ${ADOPT_BRANCH}.`);\n const gh = spawnSync(\n \"gh\",\n [\n \"pr\",\n \"create\",\n \"--title\",\n \"chore: adopt receipts — zero-install agent-work verification\",\n \"--body\",\n \"Adds the Verified-by-Receipts PR check and the repo-committed agent hook (generated by `npx altimate-receipts init --pr`). Contributors install nothing — see https://github.com/AltimateAI/altimate-receipts/blob/main/docs/onboarding.md\",\n ],\n { encoding: \"utf8\" },\n );\n if (gh.status === 0) {\n lines.push(`receipts init: opened the PR — ${gh.stdout.trim().split(\"\\n\").pop()}`);\n return;\n }\n const remote = git([\"remote\", \"get-url\", \"origin\"]);\n const slug = remote ? /github\\.com[:/]([^/]+\\/[^/.]+)/.exec(remote)?.[1] : undefined;\n lines.push(\n slug\n ? `receipts init: open the PR here — https://github.com/${slug}/pull/new/${ADOPT_BRANCH}`\n : \"receipts init: branch pushed — open a PR from it in your forge.\",\n );\n}\n\nfunction workflowContent(tag: string, v: string): string {\n return `name: Verified by Receipts\n\n# Deterministic \"what did the coding agent actually do?\" check on PRs. Quiet + non-blocking\n# pilot: acts only when a branch commits an agent Receipt (.receipts/<branch>.json);\n# otherwise silent. Adds a new \"Receipts\" check only — touches no existing workflow.\n# Docs: https://github.com/AltimateAI/altimate-receipts/blob/main/docs/onboarding-internal.md\n\non:\n pull_request:\n\npermissions:\n contents: read\n id-token: write # Sigstore keyless signing of the receipt\n attestations: write # record the attestation\n pull-requests: write # post the Receipts comment\n checks: write # post the Receipts check\n\njobs:\n receipts:\n # Tracks the ${tag} major tag (auto-gets minor/patch features). Pin a full version\n # (e.g. @v${v}) or a commit SHA for immutability.\n uses: AltimateAI/altimate-receipts/.github/workflows/receipts.reusable.yml@${tag}\n with:\n require-receipt: false # never fail a PR that has no receipt (soft pilot)\n notify-when-missing: false # stay silent unless a receipt is present\n # block-on: \"\" # informational check; never blocks a merge\n`;\n}\n\n/** `receipts hook pre-push --agent <claude|git>` — the agent-embedded trigger\n * (SPEC-0066 R1). Reads one payload from stdin, decides, and at most adds a\n * receipt commit. Never blocks: see src/hook/prePush.ts. */\nasync function runHook(kind: string | undefined, dialect: HookDialect): Promise<number> {\n if (kind !== \"pre-push\") {\n process.stderr.write(\"Usage: receipts hook pre-push [--agent claude|git]\\n\");\n return 1;\n }\n const stdin = await readStdin();\n const res = await runHookPrePush(dialect, stdin, async () => runPr({}));\n if (res.message) {\n process.stderr.write(`${res.message}\\n`);\n }\n return res.exit;\n}\n\n/** `receipts install-hook` — write the npx-shim pre-push hook into .git/hooks\n * (the universal floor; SPEC-0066 R6). */\nfunction runInstallHook(): number {\n const res = installGitHook();\n if (!res.ok) {\n process.stderr.write(`receipts install-hook: ${res.reason}.\\n`);\n return 1;\n }\n const note = {\n installed: `installed ${res.path}`,\n unchanged: `${res.path} already installed`,\n chained: `installed ${res.path} (existing hook preserved as pre-push.local, runs first)`,\n }[res.action];\n process.stdout.write(`receipts install-hook: ${note}.\\n`);\n return 0;\n}\n\n/** `receipts setup-local` — merge the self-gated hook into the USER's\n * ~/.claude/settings.json (SPEC-0066 R8), for repos that commit only the\n * workflow file. Inert outside integrated repos (the R4 gate). */\nfunction runSetupLocal(): number {\n const path = join(homedir(), \".claude\", \"settings.json\");\n const res = mergeHookIntoSettings(path);\n if (!res.ok) {\n process.stderr.write(`receipts setup-local: ${res.reason}.\\n`);\n return 1;\n }\n process.stdout.write(\n res.changed\n ? `receipts setup-local: added the receipts hook to ${path} — active only in repos with the Receipts workflow.\\n`\n : `receipts setup-local: ${path} already has the receipts hook.\\n`,\n );\n return 0;\n}\n\n/** `receipts rederive <transcript>` — reproduce the canonical Receipt from a transcript. */\nasync function runRederive(\n file?: string,\n opts: { source?: AgentSource; branch?: string; redact?: boolean; compact?: boolean } = {},\n): Promise<number> {\n if (!file) {\n process.stderr.write(\n \"Usage: receipts rederive <transcript.jsonl> [--agent a] [--branch b] [--redact]\\n\",\n );\n return 1;\n }\n const receipt = await rederiveFromTranscript(file, {\n source: opts.source,\n branch: opts.branch,\n redact: opts.redact,\n });\n if (!receipt) {\n process.stderr.write(`receipts rederive: could not read a session from ${file}\\n`);\n return 1;\n }\n const out = opts.compact ? canonicalize(receipt) : JSON.stringify(receipt, null, 2);\n process.stdout.write(`${out}\\n`);\n return 0;\n}\n\n/** `receipts assert [selector]` — evaluate `.receipts/asserts.json` against the receipt\n * (a local CI gate the user controls). Exit non-zero iff an error-severity assertion fails\n * or the asserts file is malformed; a missing file is a clean no-op. */\nasync function runAssert(opts: {\n selector?: string;\n agent?: AgentSource;\n json?: boolean;\n}): Promise<number> {\n const repoRoot = git([\"rev-parse\", \"--show-toplevel\"]) || \".\";\n let asserts: Assertion[];\n try {\n asserts = loadAsserts(repoRoot);\n } catch (e) {\n process.stderr.write(`receipts assert: ${(e as Error).message}\\n`);\n return 2; // config error — distinct from an assertion failure\n }\n if (asserts.length === 0) {\n process.stdout.write(`${renderAssertResults([])}\\n`);\n return 0; // absent file ⇒ no-op\n }\n\n const summary = selectSummary(await listSessions(opts.agent), opts.selector);\n if (!summary) {\n process.stderr.write(\n opts.selector\n ? `No session matched \"${opts.selector}\". Try \\`receipts --list\\`.\\n`\n : \"No sessions found.\\n\",\n );\n return 1;\n }\n const session = await loadSession(summary);\n if (!session) {\n process.stderr.write(`Could not read session: ${summary.id}\\n`);\n return 1;\n }\n const derived = deriveSpans(session);\n const receipt = await buildReceipt(session, derived, deriveFindings(derived));\n const results = evaluateAsserts(receipt, asserts);\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(results, null, 2)}\\n`);\n } else {\n process.stdout.write(`${renderAssertResults(results)}\\n`);\n }\n return assertExitCode(results);\n}\n\n/** Write `text` to stdout; if `copy`, also try the clipboard and note the result. */\nfunction emit(text: string, copy: boolean, label: string): void {\n process.stdout.write(`${text}\\n`);\n if (copy) {\n const ok = copyToClipboard(text);\n process.stderr.write(\n ok\n ? `\\n${label} copied to clipboard.\\n`\n : \"\\nClipboard unavailable — copy the output above.\\n\",\n );\n }\n}\n\n// Run only when executed directly as the CLI — not when imported by a test.\n// Resolve symlinks on argv[1] before comparing: Node sets import.meta.url to the\n// realpath of this module, but process.argv[1] is the path as invoked. When the CLI\n// runs through a symlink — e.g. the global npm bin (/usr/local/bin/receipts ->\n// …/dist/cli.js), or under macOS /tmp -> /private/tmp — the two differ and the guard\n// would wrongly treat the entrypoint as an import, running nothing (exit 0, no output).\nfunction resolveEntry(p: string | undefined): string | undefined {\n if (p === undefined) return undefined;\n try {\n return realpathSync(p);\n } catch {\n return p;\n }\n}\nconst entry = resolveEntry(process.argv[1]);\nconst isMain = entry !== undefined && import.meta.url === pathToFileURL(entry).href;\nif (isMain) {\n // Set process.exitCode rather than calling process.exit(): process.exit()\n // terminates before pending async writes to stdout/stderr flush, which silently\n // truncates output when stdout is a pipe/file/redirect (not a TTY). Every command\n // resolves cleanly with no lingering handles, so the process exits naturally once\n // the event loop drains — after the output has flushed.\n run(process.argv)\n .then((code) => {\n process.exitCode = code;\n })\n .catch((err: unknown) => {\n process.stderr.write(`receipts: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exitCode = 1;\n });\n}\n","import { spawnSync } from \"node:child_process\";\nimport { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { isAbsolute, join } from \"node:path\";\n\n/**\n * `receipts install-hook` (SPEC-0066 R6, hardened by SPEC-0068 R1/R2) — the\n * universal floor: a git pre-push hook for humans pushing agent work from a\n * terminal and for agents without a hook system. The script is a frozen npx\n * shim; behavior updates ship via npm. The write location honors the repo's\n * actual hook manager: `.git/hooks` by default, the user-hook dir for husky\n * repos, or a custom `core.hooksPath`.\n */\n\n/** Marker that identifies a pre-push script as ours (idempotency + upgrades). */\nconst MARKER = \"altimate-receipts\";\n\n/** The set-`e`-proof shim body (SPEC-0068 R2). Hook runners (husky among them)\n * may execute hooks under `set -e`, where a bare non-zero npx exit would abort\n * the script — and block the push — before the exit-code check runs. The\n * `|| code=$?` capture keeps every failure path non-blocking; exit 42\n * (REPUSH_EXIT) is the only code that stops the push. */\nconst SHIM_BODY = `command -v npx >/dev/null 2>&1 || exit 0\ncode=0\nnpx -y altimate-receipts@latest hook pre-push --agent git || code=$?\nif [ \"$code\" -eq 42 ]; then exit 1; fi\nexit 0\n`;\n\n/** The git-hooks-dir variant: chains a preserved pre-existing hook first (it\n * gets no stdin refs — pre-push hooks rarely read them — and its failure still\n * blocks, it's the user's gate). */\nconst HOOK_SCRIPT = `#!/bin/sh\n# Verified-by-Receipts pre-push hook — generated by \\`receipts install-hook\\` (altimate-receipts).\n# Attaches this branch's agent receipt before pushing. Best-effort: only the\n# deliberate \"receipt attached, push again\" signal (exit 42) ever stops a push.\nhookdir=$(dirname \"$0\")\nif [ -x \"$hookdir/pre-push.local\" ]; then\n \"$hookdir/pre-push.local\" \"$@\" </dev/null || exit $?\nfi\n${SHIM_BODY}`;\n\n/** The husky variant: husky runs each .husky/<hook> file itself (no shebang,\n * no pre-push.local convention) and is the chaining layer already. */\nconst HUSKY_SCRIPT = `# Verified-by-Receipts pre-push hook — generated by \\`receipts install-hook\\` (altimate-receipts).\n# Attaches this branch's agent receipt before pushing. Best-effort: only the\n# deliberate \"receipt attached, push again\" signal (exit 42) ever stops a push.\n${SHIM_BODY}`;\n\nexport type InstallResult =\n | { ok: true; action: \"installed\" | \"unchanged\" | \"chained\"; path: string }\n | { ok: false; reason: string };\n\nfunction git(args: string[], cwd?: string): string | null {\n const r = spawnSync(\"git\", args, { encoding: \"utf8\", cwd });\n return r.status === 0 ? r.stdout.trim() : null;\n}\n\nconst abs = (p: string, cwd?: string): string =>\n isAbsolute(p) ? p : join(cwd ?? process.cwd(), p);\n\n/** Where this repo actually executes pre-push hooks (SPEC-0068 R1).\n * `--git-path hooks` follows `core.hooksPath`, so a husky repo would resolve to\n * `.husky/_` — a directory husky regenerates, where a written hook silently\n * dies. Inspect `core.hooksPath` explicitly instead. */\nexport function resolveHookTarget(\n cwd?: string,\n): { kind: \"git\" | \"custom\" | \"husky\"; dir: string } | null {\n if (git([\"rev-parse\", \"--git-dir\"], cwd) === null) {\n return null;\n }\n const hooksPath = git([\"config\", \"core.hooksPath\"], cwd);\n if (hooksPath) {\n const parts = hooksPath.split(/[\\\\/]/);\n if (parts.includes(\".husky\")) {\n // husky owns hook dispatch; user hooks live in <repo>/.husky, never `_`\n const root = git([\"rev-parse\", \"--show-toplevel\"], cwd) ?? cwd ?? process.cwd();\n return { kind: \"husky\", dir: join(root, \".husky\") };\n }\n return { kind: \"custom\", dir: abs(hooksPath, cwd) };\n }\n const p = git([\"rev-parse\", \"--git-path\", \"hooks\"], cwd);\n return p ? { kind: \"git\", dir: abs(p, cwd) } : null;\n}\n\n/** Back-compat export: the resolved hooks dir (tests + older callers). */\nexport function hooksDir(cwd?: string): string | null {\n return resolveHookTarget(cwd)?.dir ?? null;\n}\n\nexport function installGitHook(cwd?: string): InstallResult {\n const target = resolveHookTarget(cwd);\n if (!target) {\n return { ok: false, reason: \"not a git repository\" };\n }\n const script = target.kind === \"husky\" ? HUSKY_SCRIPT : HOOK_SCRIPT;\n mkdirSync(target.dir, { recursive: true });\n const hookPath = join(target.dir, \"pre-push\");\n const local = join(target.dir, \"pre-push.local\");\n\n if (existsSync(hookPath)) {\n const current = readFileSync(hookPath, \"utf8\");\n if (current.includes(MARKER)) {\n if (current === script) {\n return { ok: true, action: \"unchanged\", path: hookPath };\n }\n // ours but an older revision — rewrite in place\n writeFileSync(hookPath, script);\n chmodSync(hookPath, 0o755);\n return { ok: true, action: \"installed\", path: hookPath };\n }\n if (target.kind === \"husky\") {\n // husky runs exactly one file per hook and it's the user's; don't edit it\n // (SPEC-0068 NG5) — tell them what to append instead.\n return {\n ok: false,\n reason: `${hookPath} already exists — append this to it:\\n${SHIM_BODY}`,\n };\n }\n // a foreign hook: preserve it as pre-push.local (invoked first by ours)\n if (existsSync(local)) {\n return {\n ok: false,\n reason: `${hookPath} and ${local} both exist and aren't receipts hooks — resolve manually`,\n };\n }\n renameSync(hookPath, local);\n writeFileSync(hookPath, script);\n chmodSync(hookPath, 0o755);\n return { ok: true, action: \"chained\", path: hookPath };\n }\n\n writeFileSync(hookPath, script);\n chmodSync(hookPath, 0o755);\n return { ok: true, action: \"installed\", path: hookPath };\n}\n\n/**\n * `receipts init --prepare` (R7): wire `install-hook` into package.json's\n * `prepare` script so `npm install` self-installs the floor for every\n * contributor. Append with `&&` if a prepare exists; never clobber; idempotent.\n */\nexport type PrepareResult = { ok: true; changed: boolean } | { ok: false; reason: string };\n\nconst PREPARE_CMD = \"npx -y altimate-receipts@latest install-hook\";\n\nexport function wirePrepareScript(pkgPath: string): PrepareResult {\n if (!existsSync(pkgPath)) {\n return { ok: false, reason: `${pkgPath} not found — \\`--prepare\\` needs a package.json` };\n }\n const raw = readFileSync(pkgPath, \"utf8\");\n let pkg: Record<string, unknown>;\n try {\n pkg = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return { ok: false, reason: `${pkgPath} is not valid JSON — leaving it untouched` };\n }\n if (pkg.scripts === undefined) {\n pkg.scripts = {};\n }\n const scripts = pkg.scripts as Record<string, string>;\n const prepare = scripts.prepare;\n if (prepare?.includes(PREPARE_CMD)) {\n return { ok: true, changed: false };\n }\n scripts.prepare = prepare ? `${prepare} && ${PREPARE_CMD}` : PREPARE_CMD;\n // keep the file's indentation (npm writes 2 spaces; some repos use 4 or tabs)\n const indent = raw.match(/^(\\s+)\"/m)?.[1] ?? \" \";\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, indent)}\\n`);\n return { ok: true, changed: true };\n}\n","import { spawnSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { pushReceiptRef, readReceiptRef } from \"../report/store.js\";\nimport { gitInvocations } from \"../trace/gitCommand.js\";\nimport { settingsStore } from \"./settingsMerge.js\";\n\n/**\n * `receipts hook pre-push` (SPEC-0066) — the agent-embedded trigger. One frozen\n * command line, two payload dialects:\n *\n * --agent claude Claude Code PreToolUse stdin JSON; fires only when the Bash\n * tool is about to run a real `git push`, and commits the\n * receipt BEFORE the push so it rides the agent's own push.\n * --agent git the git pre-push stdin protocol; fires on a branch push and\n * keeps the capped commit-then-re-push flow (a pre-push hook\n * cannot add commits to the in-flight push).\n *\n * Everything here is best-effort: every failure path exits 0 with at most one\n * stderr line. The hook may only ever add a commit — it must never block the\n * agent's tool call or fail a push.\n */\n\n/** `codex` shares Claude's payload shape exactly (same hooks.json schema, same\n * `tool_name`/`tool_input.command`/`cwd` stdin fields, exit-0-allows) — verified\n * against the Codex hooks docs + a live capture (SPEC-0069 R4). */\nexport type HookDialect = \"claude\" | \"codex\" | \"git\";\n\n/** Exit code the generated git hook script maps to \"stop this push, re-push\" —\n * deliberately distinctive so an npx/registry failure (exit 1) is never mistaken\n * for the intentional signal and can never block a push. */\nexport const REPUSH_EXIT = 42;\n\nconst ATTACH_SUBJECT = (branch: string) => `chore(receipts): attach agent receipt for ${branch}`;\n\nfunction git(args: string[], cwd?: string): string {\n const r = spawnSync(\"git\", args, { encoding: \"utf8\", cwd });\n return r.status === 0 ? r.stdout.trim() : \"\";\n}\n\n/* ------------------------------------------------------------------ matcher */\n\n/** A refspec that names a tag (tag-only pushes carry no branch work). */\nconst TAG_REFSPEC = /^(refs\\/tags\\/|v\\d+(\\.\\d+)*$)/;\n\n/**\n * Does this Bash command string contain a real branch `git push`? (SPEC-0066 R2.)\n * Token scan via the shared `gitInvocations` (quote-blanked, simple-command-anchored\n * — `echo \"git push\"`, `git pushup`, message text never fire; under-fires on exotic\n * quoting by design, Q3), plus push-specific exclusions: dry runs and tag-only\n * pushes carry no branch work.\n */\nexport function isGitPush(command: string): boolean {\n for (const { sub, rest } of gitInvocations(command)) {\n if (sub !== \"push\") {\n continue;\n }\n if (rest.includes(\"--dry-run\") || rest.includes(\"-n\") || rest.includes(\"--tags\")) {\n continue;\n }\n // refspec analysis: `git push origin v1.2.3` (tag-only) must not fire; a\n // pure-flag or remote-only push targets the current branch and does fire.\n const refspecs = rest.filter((t) => !t.startsWith(\"-\")).slice(1); // first positional = remote\n if (refspecs.length > 0 && refspecs.every((r) => TAG_REFSPEC.test(r))) {\n continue;\n }\n return true;\n }\n return false;\n}\n\n/** The git pre-push stdin protocol: `<local_ref> <sha> <remote_ref> <sha>` lines.\n * True iff at least one pushed ref is a branch (tag-only pushes don't trigger). */\nexport function gitStdinPushesBranch(stdin: string): boolean {\n return stdin.split(\"\\n\").some((line) => line.trim().startsWith(\"refs/heads/\"));\n}\n\n/* ----------------------------------------------------------------- gate/cap */\n\nconst hasMarker = (root: string): boolean =>\n existsSync(join(root, \".github\", \"workflows\", \"receipts.yml\")) ||\n existsSync(join(root, \".receipts\"));\n\n/**\n * The universal self-gate (SPEC-0066 R4): the hook is inert unless this repo has\n * opted in — `receipts init`'s workflow file or an existing `.receipts/`. One\n * frozen one-liner therefore works committed in a repo's settings AND in a\n * user's ~/.claude/settings.json without ever firing in non-integrated repos.\n *\n * Worktrees (field-observed in altimate-router): a worktree created before\n * adoption has neither marker in its checkout even though the repo opted in —\n * so also accept the marker in the PRIMARY checkout (the git common dir's\n * parent). Old worktrees then stay covered by the git floor and user-level\n * hooks instead of going silent.\n */\nexport function repoOptedIn(repoRoot: string): boolean {\n if (hasMarker(repoRoot)) {\n return true;\n }\n const primary = primaryCheckout(repoRoot);\n return primary ? hasMarker(primary) : false;\n}\n\n/** The primary checkout behind a worktree (git common dir's parent), or null. */\nexport function primaryCheckout(repoRoot: string): string | null {\n const common = git([\"rev-parse\", \"--git-common-dir\"], repoRoot);\n if (common.endsWith(\"/.git\")) {\n const primary = common.slice(0, -\"/.git\".length);\n if (primary && primary !== repoRoot) {\n return primary;\n }\n }\n return null;\n}\n\n/** Is HEAD already this branch's receipt-attach commit? The git-mode cap (R6):\n * one auto-commit per push attempt, so a live, still-growing session can never\n * re-push-loop — at worst the receipt is one snapshot behind, honestly. */\nexport function headIsAttachCommit(branch: string, cwd?: string): boolean {\n return git([\"log\", \"-1\", \"--format=%s\"], cwd) === ATTACH_SUBJECT(branch);\n}\n\n/**\n * Receipts are per-PR artifacts; a push to the DEFAULT branch must not attach one\n * (field-observed: a `git push` while on main committed a whole-session Grade-F\n * `main.json` onto altimate-router's trunk). Resolve the default from\n * origin/HEAD; fall back to the conventional names when the remote head is\n * unset locally.\n */\nexport function isDefaultBranch(branch: string, cwd?: string): boolean {\n const head = git([\"symbolic-ref\", \"--short\", \"refs/remotes/origin/HEAD\"], cwd);\n if (head) {\n return head === `origin/${branch}`;\n }\n return branch === \"main\" || branch === \"master\";\n}\n\n/* ------------------------------------------------------------------- runner */\n\n/** Claude Code PreToolUse payload — only the fields we read; extras tolerated. */\ninterface ClaudePayload {\n tool_name?: string;\n tool_input?: { command?: string };\n cwd?: string;\n}\n\nexport async function readStdin(stream: NodeJS.ReadableStream = process.stdin): Promise<string> {\n let data = \"\";\n for await (const chunk of stream) {\n data += chunk;\n }\n return data;\n}\n\nexport interface HookResult {\n exit: number;\n /** single stderr line, when there's something worth saying */\n message?: string;\n}\n\n/**\n * Decide + act for one hook invocation. `generate` is the existing `receipts pr`\n * pipeline (injected to keep this module free of the CLI's session machinery).\n */\nexport async function runHookPrePush(\n dialect: HookDialect,\n stdin: string,\n generate: () => Promise<number>,\n): Promise<HookResult> {\n try {\n if (process.env.RECEIPTS_HOOK === \"0\") {\n return { exit: 0 };\n }\n // Honor the storage opt-out (SPEC-0064): store=none means \"no committed\n // receipts\", so the hook has nothing to attach and stays silent.\n if ((process.env.RECEIPTS_STORE || \"commit\").toLowerCase() === \"none\") {\n return { exit: 0 };\n }\n\n if (dialect === \"claude\" || dialect === \"codex\") {\n let payload: ClaudePayload;\n try {\n payload = JSON.parse(stdin) as ClaudePayload;\n } catch {\n return { exit: 0 };\n }\n if (payload.tool_name !== \"Bash\" || !payload.tool_input?.command) {\n return { exit: 0 };\n }\n if (payload.cwd && existsSync(payload.cwd)) {\n process.chdir(payload.cwd); // generate against the session's repo\n }\n if (!isGitPush(payload.tool_input.command)) {\n return { exit: 0 };\n }\n } else if (!gitStdinPushesBranch(stdin)) {\n return { exit: 0 };\n }\n\n const repoRoot = git([\"rev-parse\", \"--show-toplevel\"]);\n if (!repoRoot || !repoOptedIn(repoRoot)) {\n return { exit: 0 };\n }\n const branch = git([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n if (!branch || branch === \"HEAD\" || isDefaultBranch(branch)) {\n return { exit: 0 };\n }\n\n // Store resolution (SPEC-0070 R3): process env beats the repo-committed\n // default in .claude/settings.json (worktree-aware via the primary checkout).\n const store = (\n process.env.RECEIPTS_STORE ||\n settingsStore(repoRoot) ||\n settingsStore(primaryCheckout(repoRoot) ?? \"\") ||\n \"commit\"\n ).toLowerCase();\n if (store === \"none\") {\n return { exit: 0 };\n }\n process.env.RECEIPTS_STORE = store; // the pipeline below resolves identically\n\n if (store !== \"ref\" && dialect === \"git\" && headIsAttachCommit(branch)) {\n return { exit: 0 }; // cap: already attached this push attempt — let it through\n }\n\n // Run the pipeline with stderr muted: a human pushing a hand-written branch\n // must not see \"no agent session found\" on every push (R3: one line max,\n // and only when we actually attach something).\n const write = process.stderr.write.bind(process.stderr);\n process.stderr.write = (() => true) as typeof process.stderr.write;\n let generated: number;\n try {\n generated = await generate();\n } finally {\n process.stderr.write = write;\n }\n if (generated !== 0) {\n return { exit: 0 }; // no matching session / generation declined — never block\n }\n\n // store=ref (SPEC-0070): the receipt is a sibling ref, not a branch commit —\n // push it ourselves and let the branch push proceed untouched. No re-push\n // dance in either dialect: a ref push never modifies the in-flight branch.\n if (store === \"ref\") {\n const slug = branch.replace(/[/\\\\]/g, \"-\");\n if (readReceiptRef(slug) == null) {\n return { exit: 0 };\n }\n const pushed = pushReceiptRef(slug);\n return {\n exit: 0,\n message: pushed\n ? `receipts: receipt at refs/receipts/${slug} — travels alongside this push.`\n : `receipts: wrote refs/receipts/${slug}; pushing it failed — push the ref manually.`,\n };\n }\n\n if (!git([\"status\", \"--porcelain\", \".receipts/\"])) {\n return { exit: 0 }; // receipt unchanged — push proceeds untouched\n }\n spawnSync(\"git\", [\"add\", \".receipts/\"], { encoding: \"utf8\" });\n // Pathspec commit: only .receipts/ lands, whatever else is staged stays staged.\n const commit = spawnSync(\n \"git\",\n [\"commit\", \"--no-verify\", \"-m\", ATTACH_SUBJECT(branch), \"--\", \".receipts/\"],\n { encoding: \"utf8\" },\n );\n if (commit.status !== 0) {\n return { exit: 0 };\n }\n if (dialect === \"git\") {\n return {\n exit: REPUSH_EXIT,\n message: `📎 Receipts: attached an agent receipt for '${branch}' — rerun the same \\`git push\\` command to include it.`,\n };\n }\n return {\n exit: 0,\n message: `receipts: attached an agent receipt for '${branch}' — it rides this push.`,\n };\n } catch {\n return { exit: 0 }; // SPEC-0066 R3: any failure → silent allow\n }\n}\n","import { spawnSync } from \"node:child_process\";\n\n/**\n * `store=ref` (SPEC-0070 / M71): receipts as git objects on\n * `refs/receipts/<slug>` — zero files in the working tree, nothing in PR diffs,\n * nothing accumulating on main. Pure plumbing (hash-object → mktree →\n * commit-tree → update-ref): no index, no checkout, no worktree contact.\n *\n * The wrapping commit (rather than a bare blob ref) keeps the object GC-rooted\n * on every host, `git show`-friendly, and carries the branch name in its\n * message so `prune --refs` can recover it. Determinism: fixed identity and the\n * session's own end time as both dates — same receipt bytes ⇒ same commit SHA.\n */\n\nconst IDENT = [\"-c\", \"user.name=receipts\", \"-c\", \"user.email=receipts@altimate.ai\"];\n\nexport const RECEIPT_REF_PREFIX = \"refs/receipts/\";\nexport const receiptRef = (slug: string): string => `${RECEIPT_REF_PREFIX}${slug}`;\n\ninterface GitResult {\n out: string;\n ok: boolean;\n err?: string;\n}\n\nfunction git(\n args: string[],\n opts: { cwd?: string; input?: string; env?: NodeJS.ProcessEnv } = {},\n): GitResult {\n const r = spawnSync(\"git\", args, {\n encoding: \"utf8\",\n cwd: opts.cwd,\n input: opts.input,\n env: opts.env ? { ...process.env, ...opts.env } : process.env,\n });\n return { out: (r.stdout ?? \"\").trim(), ok: r.status === 0, err: (r.stderr ?? \"\").trim() };\n}\n\nexport type WriteRefResult =\n | { ok: true; ref: string; commit: string }\n | { ok: false; reason: string };\n\n/** Write `json` as refs/receipts/<slug> (force-updates an existing ref). */\nexport function writeReceiptRef(\n slug: string,\n branch: string,\n json: string,\n endedAtMs: number | undefined,\n cwd?: string,\n): WriteRefResult {\n const blob = git([\"hash-object\", \"-w\", \"--stdin\"], { cwd, input: json });\n if (!blob.ok) {\n return { ok: false, reason: \"hash-object failed (not a git repository?)\" };\n }\n const tree = git([\"mktree\"], { cwd, input: `100644 blob ${blob.out}\\treceipt.json\\n` });\n if (!tree.ok) {\n return { ok: false, reason: \"mktree failed\" };\n }\n // Deterministic commit: fixed identity, the session's end time as both dates\n // (clamped to epoch second 1 — git rejects a raw timestamp of 0).\n const when = `@${Math.max(1, Math.floor((endedAtMs ?? 0) / 1000))} +0000`;\n const commit = git([...IDENT, \"commit-tree\", tree.out, \"-m\", `receipt: ${branch}`], {\n cwd,\n env: { GIT_AUTHOR_DATE: when, GIT_COMMITTER_DATE: when },\n });\n if (!commit.ok) {\n return { ok: false, reason: `commit-tree failed: ${commit.err}` };\n }\n const ref = receiptRef(slug);\n const upd = git([\"update-ref\", ref, commit.out], { cwd });\n if (!upd.ok) {\n return { ok: false, reason: `update-ref ${ref} failed` };\n }\n return { ok: true, ref, commit: commit.out };\n}\n\n/** Read the receipt JSON stored at refs/receipts/<slug>, or null. */\nexport function readReceiptRef(slug: string, cwd?: string): string | null {\n const r = git([\"cat-file\", \"blob\", `${receiptRef(slug)}:receipt.json`], { cwd });\n return r.ok ? r.out : null;\n}\n\n/** The branch a receipt ref was written for (recovered from the commit message). */\nexport function refBranch(ref: string, cwd?: string): string | null {\n const r = git([\"log\", \"-1\", \"--format=%s\", ref], { cwd });\n const m = r.ok ? /^receipt: (.+)$/.exec(r.out) : null;\n return m ? m[1] : null;\n}\n\n/** All local receipt refs: [{ref, slug}]. */\nexport function listReceiptRefs(cwd?: string): Array<{ ref: string; slug: string }> {\n const r = git([\"for-each-ref\", RECEIPT_REF_PREFIX, \"--format=%(refname)\"], { cwd });\n if (!r.ok || !r.out) {\n return [];\n }\n return r.out\n .split(\"\\n\")\n .filter(Boolean)\n .map((ref) => ({ ref, slug: ref.slice(RECEIPT_REF_PREFIX.length) }));\n}\n\n/** Push the receipt ref to `remote` (force — receipts regenerate). Best-effort. */\nexport function pushReceiptRef(slug: string, remote = \"origin\", cwd?: string): boolean {\n const ref = receiptRef(slug);\n return git([\"push\", remote, `+${ref}:${ref}`], { cwd }).ok;\n}\n","/**\n * Shared git-invocation tokenizer (extracted in SPEC-0069 — the M67 push matcher\n * and the M70 authorship matcher need identical discipline). Quoted text is\n * blanked first, so `git push` inside a prompt string (`codex exec \"...git\n * push...\"`, `echo \"git push\"`, commit-message text) never reads as a git call;\n * then each `&&`/`||`/`;`/`|`-separated simple command must START with `git`\n * (after env assignments / benign wrappers and git's global flags).\n */\n\n/** Shell wrappers that may legitimately precede `git` in a simple command. */\nconst WRAPPERS = new Set([\"command\", \"exec\", \"nohup\", \"time\", \"env\"]);\n/** Global git flags between `git` and the subcommand that consume a value. */\nconst GIT_VALUE_FLAGS = new Set([\"-C\", \"-c\", \"--git-dir\", \"--work-tree\", \"--exec-path\"]);\n\nexport interface GitInvocation {\n /** the git subcommand: \"push\", \"commit\", \"log\", … */\n sub: string;\n /** tokens after the subcommand (flags + positionals) */\n rest: string[];\n}\n\n/** Every real `git <sub> …` invocation in a (possibly compound) shell command. */\nexport function gitInvocations(command: string): GitInvocation[] {\n const blanked = command\n .replace(/\\\\[\"']/g, \" \")\n .replace(/'[^']*'/g, \" \")\n .replace(/\"[^\"]*\"/g, \" \");\n const out: GitInvocation[] = [];\n for (const simple of blanked.split(/(?:&&|\\|\\||[;|\\n])/)) {\n const tokens = simple.trim().split(/\\s+/).filter(Boolean);\n let i = 0;\n while (\n i < tokens.length &&\n (/^[A-Za-z_][A-Za-z0-9_]*=/.test(tokens[i]) || WRAPPERS.has(tokens[i]))\n ) {\n i++;\n }\n if (tokens[i] !== \"git\") {\n continue;\n }\n i++;\n while (i < tokens.length && tokens[i].startsWith(\"-\")) {\n const flag = tokens[i];\n i++;\n if (GIT_VALUE_FLAGS.has(flag)) {\n i++;\n }\n }\n const sub = tokens[i];\n if (sub) {\n out.push({ sub, rest: tokens.slice(i + 1) });\n }\n }\n return out;\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\n/**\n * Deep-merge the Receipts hook entry into a Claude Code settings.json — used by\n * `receipts init` (the repo's .claude/settings.json) and `receipts setup-local`\n * (the user's ~/.claude/settings.json). SPEC-0066 R5/R8: preserve every existing\n * key and hook, be idempotent, and back off (never clobber) on a malformed file.\n *\n * The command is a FROZEN one-liner: all behavior lives behind npx, so published\n * updates reach every contributor with no re-commit and — because agent runtimes\n * record hook trust against the command text — no re-approval.\n */\nexport const HOOK_COMMAND = \"npx -y altimate-receipts@latest hook pre-push\";\n\ninterface HookEntry {\n matcher?: string;\n hooks?: Array<{ type?: string; command?: string }>;\n}\n\nexport type MergeResult = { ok: true; changed: boolean } | { ok: false; reason: string };\n\n/**\n * The repo-committed store default (SPEC-0070 R3): `.claude/settings.json` →\n * `env.RECEIPTS_STORE`. Claude Code exports project env to sessions natively;\n * the hook reads the same key here so the git/codex dialects honor it too.\n * No new config file — the knob lives in the file adopters already commit.\n */\nexport function settingsStore(root: string): string | undefined {\n try {\n const s = JSON.parse(readFileSync(join(root, \".claude\", \"settings.json\"), \"utf8\")) as {\n env?: Record<string, unknown>;\n };\n const v = s?.env?.RECEIPTS_STORE;\n return typeof v === \"string\" && v ? v : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Add a PreToolUse→Bash→command entry to `path`, creating the file if absent.\n * Anything already in the file survives byte-meaning-identically. Codex's\n * hooks.json uses the exact same schema as Claude Code's settings hooks\n * (SPEC-0069 R4), so one merger serves both — `command` defaults to Claude's. */\nexport function mergeHookIntoSettings(path: string, command: string = HOOK_COMMAND): MergeResult {\n let settings: Record<string, unknown> = {};\n if (existsSync(path)) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(path, \"utf8\"));\n } catch {\n return { ok: false, reason: `${path} is not valid JSON — leaving it untouched` };\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n return { ok: false, reason: `${path} is not a JSON object — leaving it untouched` };\n }\n settings = parsed as Record<string, unknown>;\n }\n\n if (settings.hooks === undefined) {\n settings.hooks = {};\n }\n const hooks = settings.hooks as Record<string, unknown>;\n if (typeof hooks !== \"object\" || hooks === null || Array.isArray(hooks)) {\n return { ok: false, reason: `${path} has a non-object \"hooks\" key — leaving it untouched` };\n }\n if (hooks.PreToolUse === undefined) {\n hooks.PreToolUse = [];\n }\n const pre = hooks.PreToolUse as HookEntry[];\n if (!Array.isArray(pre)) {\n return { ok: false, reason: `${path} has a non-array hooks.PreToolUse — leaving it untouched` };\n }\n const present = pre.some((e) => e?.hooks?.some((h) => h?.command === command));\n if (present) {\n return { ok: true, changed: false };\n }\n pre.push({ matcher: \"Bash\", hooks: [{ type: \"command\", command }] });\n\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(settings, null, 2)}\\n`);\n return { ok: true, changed: true };\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Receipt, ReceiptPredicate } from \"./build.js\";\n\n/**\n * Receipt assertions (M34, SPEC-0036) — eval-as-code WITHOUT the model judge. A committed\n * `.receipts/asserts.json` of deterministic `{path, op, value}` checks is evaluated\n * mechanically against the just-derived receipt: the **user** supplies the oracle, and\n * Receipts only does exact comparison over evidence it already attests. Pure function of\n * the receipt + the committed file ⇒ re-derivable; zero model calls; no quality verdict.\n */\n\nexport type AssertOp =\n | \"eq\"\n | \"ne\"\n | \"lt\"\n | \"lte\"\n | \"gt\"\n | \"gte\"\n | \"matches\"\n | \"in\"\n | \"empty\"\n | \"exists\";\n\nconst OPS = new Set<AssertOp>([\n \"eq\",\n \"ne\",\n \"lt\",\n \"lte\",\n \"gt\",\n \"gte\",\n \"matches\",\n \"in\",\n \"empty\",\n \"exists\",\n]);\n\nexport interface Assertion {\n /** dotted accessor into `predicate` (e.g. `evidence.costUsd`, `grade`) or a finding\n * selector (`findings.<id>` count, `findings.severity.<level>` count). */\n path: string;\n op: AssertOp;\n value?: unknown;\n /** `error` (default) gates the exit code; `warn` reports but does not fail. */\n severity?: \"error\" | \"warn\";\n}\n\nexport interface AssertResult {\n assertion: Assertion;\n pass: boolean;\n actual: unknown;\n /** a config/usage error (bad op, missing field for a comparison, …) — never a silent pass */\n error?: string;\n}\n\n/** Resolve a dotted `path` into the receipt predicate, with finding selectors. */\nexport function resolvePath(predicate: ReceiptPredicate, path: string): unknown {\n if (path === \"findings\" || path.startsWith(\"findings.\")) {\n const rest = path === \"findings\" ? \"\" : path.slice(\"findings.\".length);\n if (rest === \"\") {\n return predicate.findings.length;\n }\n if (rest.startsWith(\"severity.\")) {\n const level = rest.slice(\"severity.\".length);\n return predicate.findings.filter((f) => f.severity === level).length;\n }\n // `findings.<id>` → count of findings whose id equals or is prefixed by it (so a\n // category like `destructive-git` matches `destructive-git-<span>`).\n return predicate.findings.filter((f) => f.id === rest || f.id.startsWith(`${rest}-`)).length;\n }\n // dotted get into the predicate (evidence.*, grade, scope.*, session.*)\n let cur: unknown = predicate;\n for (const key of path.split(\".\")) {\n if (cur == null || typeof cur !== \"object\") {\n return undefined;\n }\n cur = (cur as Record<string, unknown>)[key];\n }\n return cur;\n}\n\nconst isNum = (v: unknown): v is number => typeof v === \"number\" && Number.isFinite(v);\nconst isEmpty = (v: unknown): boolean =>\n v == null ||\n v === \"\" ||\n v === 0 ||\n (Array.isArray(v) && v.length === 0) ||\n (typeof v === \"object\" && Object.keys(v as object).length === 0);\n\n/** Apply one operator; returns `{pass}` or `{error}` for a config/type misuse. */\nfunction applyOp(\n op: AssertOp,\n actual: unknown,\n value: unknown,\n): { pass: boolean } | { error: string } {\n const needNum = (): { error: string } | null =>\n isNum(actual) && isNum(value)\n ? null\n : { error: `op '${op}' needs a numeric field and value (got ${JSON.stringify(actual)})` };\n switch (op) {\n case \"exists\":\n return { pass: actual !== undefined && actual !== null };\n case \"empty\":\n return { pass: isEmpty(actual) };\n case \"eq\":\n return { pass: actual === value };\n case \"ne\":\n return { pass: actual !== value };\n case \"lt\":\n return needNum() ?? { pass: (actual as number) < (value as number) };\n case \"lte\":\n return needNum() ?? { pass: (actual as number) <= (value as number) };\n case \"gt\":\n return needNum() ?? { pass: (actual as number) > (value as number) };\n case \"gte\":\n return needNum() ?? { pass: (actual as number) >= (value as number) };\n case \"matches\": {\n if (typeof actual !== \"string\" || typeof value !== \"string\") {\n return { error: `op 'matches' needs a string field and a string pattern` };\n }\n try {\n return { pass: new RegExp(value).test(actual) };\n } catch (e) {\n return { error: `invalid regex '${value}': ${(e as Error).message}` };\n }\n }\n case \"in\":\n return Array.isArray(value)\n ? { pass: value.includes(actual) }\n : { error: `op 'in' needs an array value` };\n default:\n return { error: `unknown op '${op}'` };\n }\n}\n\n/** Validate + normalise one raw assertion entry; returns an error string when malformed. */\nfunction validateAssertion(raw: unknown): { assertion: Assertion } | { error: string } {\n if (!raw || typeof raw !== \"object\") {\n return { error: \"assertion must be an object\" };\n }\n const r = raw as Record<string, unknown>;\n if (typeof r.path !== \"string\" || !r.path) {\n return { error: \"assertion.path must be a non-empty string\" };\n }\n if (typeof r.op !== \"string\" || !OPS.has(r.op as AssertOp)) {\n return { error: `assertion.op '${String(r.op)}' is not one of ${[...OPS].join(\"|\")}` };\n }\n if (r.severity !== undefined && r.severity !== \"error\" && r.severity !== \"warn\") {\n return { error: \"assertion.severity must be 'error' or 'warn'\" };\n }\n return {\n assertion: {\n path: r.path,\n op: r.op as AssertOp,\n value: r.value,\n severity: (r.severity as \"error\" | \"warn\") ?? \"error\",\n },\n };\n}\n\n/** Read `.receipts/asserts.json` (JSON-only v1, no new dependency). Returns `[]` when\n * absent (the command is then a no-op). Throws on malformed JSON / wrong shape. */\nexport function loadAsserts(repoRoot: string): Assertion[] {\n const path = join(repoRoot, \".receipts\", \"asserts.json\");\n let text: string;\n try {\n text = readFileSync(path, \"utf8\");\n } catch {\n return []; // absent ⇒ no-op\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch (e) {\n throw new Error(`.receipts/asserts.json is not valid JSON: ${(e as Error).message}`);\n }\n const list = Array.isArray(parsed)\n ? parsed\n : parsed &&\n typeof parsed === \"object\" &&\n Array.isArray((parsed as { asserts?: unknown }).asserts)\n ? (parsed as { asserts: unknown[] }).asserts\n : null;\n if (!list) {\n throw new Error(\".receipts/asserts.json must be an array or { asserts: [...] }\");\n }\n const out: Assertion[] = [];\n for (const raw of list) {\n const v = validateAssertion(raw);\n if (\"error\" in v) {\n throw new Error(`invalid assertion: ${v.error} (${JSON.stringify(raw)})`);\n }\n out.push(v.assertion);\n }\n return out;\n}\n\n/** Evaluate every assertion against the receipt — pure, total, no model. */\nexport function evaluateAsserts(receipt: Receipt, asserts: readonly Assertion[]): AssertResult[] {\n return asserts.map((assertion) => {\n const actual = resolvePath(receipt.predicate, assertion.path);\n // a comparison op on a missing field is a config error, never a silent pass.\n if (\n actual === undefined &&\n assertion.op !== \"exists\" &&\n assertion.op !== \"empty\" &&\n assertion.op !== \"ne\"\n ) {\n return { assertion, pass: false, actual, error: `path '${assertion.path}' not found` };\n }\n const res = applyOp(assertion.op, actual, assertion.value);\n return \"error\" in res\n ? { assertion, pass: false, actual, error: res.error }\n : { assertion, pass: res.pass, actual };\n });\n}\n\n/** Exit code: non-zero iff an error-severity assertion failed or hit a config error. */\nexport function assertExitCode(results: readonly AssertResult[]): number {\n return results.some((r) => (!r.pass || r.error) && (r.assertion.severity ?? \"error\") === \"error\")\n ? 1\n : 0;\n}\n\n/** Human-readable report of the assertion run. */\nexport function renderAssertResults(results: readonly AssertResult[]): string {\n if (results.length === 0) {\n return \"receipts assert: no assertions (.receipts/asserts.json absent) — nothing to check.\";\n }\n const lines = results.map((r) => {\n const { path, op, value, severity } = r.assertion;\n const expr = `${path} ${op}${value === undefined ? \"\" : ` ${JSON.stringify(value)}`}`;\n if (r.error) {\n return ` ⚠️ ERROR ${expr} — ${r.error}`;\n }\n const tag = r.pass ? \" ✅ PASS \" : severity === \"warn\" ? \" 🟡 WARN \" : \" ❌ FAIL \";\n return `${tag} ${expr} (actual: ${JSON.stringify(r.actual)})`;\n });\n const failed = results.filter(\n (r) => !r.pass && (r.assertion.severity ?? \"error\") === \"error\",\n ).length;\n const warned = results.filter((r) => !r.pass && r.assertion.severity === \"warn\").length;\n const passed = results.filter((r) => r.pass).length;\n lines.push(\n ` ${passed} passed · ${failed} failed${warned ? ` · ${warned} warned` : \"\"} of ${results.length}`,\n );\n return lines.join(\"\\n\");\n}\n","import type { GradeLetter } from \"../findings/grade.js\";\n\n/**\n * `receipts badge` (M59) — a [shields.io endpoint](https://shields.io/badges/endpoint-badge)\n * JSON for a repo's README/PR: an at-a-glance, **factual** state of the agent-work receipt.\n * It states the finding count (and colors by worst severity) — never a quality verdict about\n * the code (R2). Pure function of the receipt's findings; deterministic; zero model calls.\n *\n * Hosting is the user's choice (commit the JSON + a raw URL, or publish it from CI); this only\n * emits the endpoint object. Works once a repo is public (shields.io must reach the URL).\n */\n\nexport interface ShieldsEndpoint {\n schemaVersion: 1;\n label: string;\n message: string;\n color: string;\n}\n\ntype Sev = \"critical\" | \"high\" | \"medium\" | \"low\";\nconst SEV_ORDER: readonly Sev[] = [\"critical\", \"high\", \"medium\", \"low\"];\n\n/** The worst severity present in a finding set, or undefined when empty. */\nexport function worstSeverity(findings: readonly { severity: Sev }[]): Sev | undefined {\n return SEV_ORDER.find((s) => findings.some((f) => f.severity === s));\n}\n\n/**\n * Build the shields.io endpoint object from a receipt predicate. Message is the finding\n * count (factual); color maps to the worst severity (clean → brightgreen, critical/high →\n * red, medium → orange, low → yellow). The synthesized grade is deliberately NOT the\n * message — the badge states what was found, not a verdict.\n */\nexport function badgeEndpoint(predicate: {\n grade?: GradeLetter;\n findings?: readonly { severity: Sev }[];\n}): ShieldsEndpoint {\n const findings = predicate.findings ?? [];\n const n = findings.length;\n const worst = worstSeverity(findings);\n const color =\n n === 0\n ? \"brightgreen\"\n : worst === \"critical\" || worst === \"high\"\n ? \"red\"\n : worst === \"medium\"\n ? \"orange\"\n : \"yellow\";\n const message = n === 0 ? \"no findings\" : `${n} finding${n === 1 ? \"\" : \"s\"}`;\n return { schemaVersion: 1, label: \"receipts\", message, color };\n}\n","import { formatCostAlways, formatTokens } from \"../findings/format.js\";\nimport type { Receipt, ReceiptFinding } from \"../receipt/build.js\";\n\n/**\n * Receipt-to-receipt diff (M51) — \"what changed between two agent runs?\" A pure,\n * deterministic comparison of two receipts Receipts already emits (a re-run on the\n * same PR, last night's run vs tonight's, agent A vs agent B). It reports **deltas and\n * counts** — files/edits/commands, cost/tokens, findings added/removed, the\n * test-observation flip, both grades — and **never a judgement** (no \"better / worse /\n * regressed / improved\"). The reader decides; the diff states facts (SPEC-0000 R2).\n *\n * Deterministic · zero model calls · no schema change · same {a, b} → identical delta.\n */\n\nexport interface CountDelta {\n key: string;\n label: string;\n a: number;\n b: number;\n delta: number;\n}\n\nexport interface ReceiptDelta {\n grade: { a: string; b: string };\n counts: CountDelta[];\n cost: { a: number; b: number; delta: number };\n testsObserved: { a: boolean; b: boolean };\n findingsAdded: ReceiptFinding[];\n findingsRemoved: ReceiptFinding[];\n findingsCommon: number;\n scope: { a: string; b: string };\n}\n\n/** Stable cross-run identity for a finding. The raw `id` embeds span indices that\n * differ between runs, so identity is the human-stable (title + filePath) pair. */\nfunction findingKey(f: ReceiptFinding): string {\n return `${f.title}\u0000${f.filePath ?? \"\"}`;\n}\n\nfunction scopeLabel(r: Receipt): string {\n const s = r.predicate.scope;\n if (!s || s.kind === \"session\") return \"whole session\";\n if (s.kind === \"branch\") return `branch ${s.branch ?? \"?\"}`;\n return `diff (${(s.files ?? []).length} files${s.base ? ` vs ${s.base}` : \"\"})`;\n}\n\nexport function diffReceipts(a: Receipt, b: Receipt): ReceiptDelta {\n const ea = a.predicate.evidence;\n const eb = b.predicate.evidence;\n const count = (key: string, label: string, va: number, vb: number): CountDelta => ({\n key,\n label,\n a: va,\n b: vb,\n delta: vb - va,\n });\n const counts: CountDelta[] = [\n count(\"filesChanged\", \"files changed\", ea.filesChanged, eb.filesChanged),\n count(\"edits\", \"edits\", ea.edits, eb.edits),\n count(\"commands\", \"commands\", ea.commands, eb.commands),\n count(\"reads\", \"reads\", ea.reads, eb.reads),\n count(\"destructiveOps\", \"destructive ops\", ea.destructiveOps, eb.destructiveOps),\n count(\"tokens\", \"tokens\", ea.tokens.total, eb.tokens.total),\n ];\n\n const aKeys = new Set(a.predicate.findings.map(findingKey));\n const bKeys = new Set(b.predicate.findings.map(findingKey));\n const findingsAdded = b.predicate.findings.filter((f) => !aKeys.has(findingKey(f)));\n const findingsRemoved = a.predicate.findings.filter((f) => !bKeys.has(findingKey(f)));\n const findingsCommon = a.predicate.findings.filter((f) => bKeys.has(findingKey(f))).length;\n\n return {\n grade: { a: a.predicate.grade, b: b.predicate.grade },\n counts,\n cost: { a: ea.costUsd, b: eb.costUsd, delta: eb.costUsd - ea.costUsd },\n testsObserved: { a: ea.testsRan, b: eb.testsRan },\n findingsAdded,\n findingsRemoved,\n findingsCommon,\n scope: { a: scopeLabel(a), b: scopeLabel(b) },\n };\n}\n\nconst SEV_ICON: Record<string, string> = { critical: \"⛔\", high: \"⚠️\", medium: \"🔍\", low: \"·\" };\n\n/** Signed-delta string, neutral: \"+3\" / \"-2\" / \"±0\". No value judgement on direction. */\nfunction signed(n: number): string {\n if (n === 0) return \"±0\";\n return n > 0 ? `+${n}` : `${n}`;\n}\n\nfunction findingLines(fs: readonly ReceiptFinding[]): string[] {\n return fs.map((f) => {\n const loc = f.filePath ? ` (\\`${f.filePath}\\`)` : \"\";\n return ` ${SEV_ICON[f.severity] ?? \"·\"} ${f.title}${loc}`;\n });\n}\n\n/** Render the delta as plain text (A = baseline, B = new). Facts only. */\nexport function renderDiff(d: ReceiptDelta): string {\n const out: string[] = [];\n out.push(\"Receipt diff — A (baseline) → B (new)\");\n out.push(\"\");\n out.push(`Grade: ${d.grade.a} → ${d.grade.b}`);\n out.push(`Scope: A ${d.scope.a} · B ${d.scope.b}`);\n out.push(\"\");\n out.push(\"Evidence:\");\n for (const c of d.counts) {\n out.push(` ${c.label}: ${c.a} → ${c.b} (${signed(c.delta)})`);\n }\n const cd = d.cost;\n const costDelta =\n cd.delta === 0 ? \"±0\" : (cd.delta > 0 ? \"+\" : \"-\") + formatCostAlways(Math.abs(cd.delta));\n out.push(` cost: ${formatCostAlways(cd.a)} → ${formatCostAlways(cd.b)} (${costDelta})`);\n out.push(\n ` tokens (total): ${formatTokens(d.counts.find((c) => c.key === \"tokens\")?.a ?? 0)} → ${formatTokens(d.counts.find((c) => c.key === \"tokens\")?.b ?? 0)}`,\n );\n const to = d.testsObserved;\n const toStr = (v: boolean) => (v ? \"observed\" : \"not observed\");\n out.push(` test command: ${toStr(to.a)} → ${toStr(to.b)}${to.a !== to.b ? \" (changed)\" : \"\"}`);\n out.push(\"\");\n out.push(\n `Findings: ${d.findingsAdded.length} only in B · ${d.findingsRemoved.length} only in A · ${d.findingsCommon} in both`,\n );\n if (d.findingsAdded.length) {\n out.push(\"\");\n out.push(\"Only in B (new):\");\n out.push(...findingLines(d.findingsAdded));\n }\n if (d.findingsRemoved.length) {\n out.push(\"\");\n out.push(\"Only in A (absent from B):\");\n out.push(...findingLines(d.findingsRemoved));\n }\n out.push(\"\");\n out.push(\"Deterministic · 0 model calls · evidence, not judgement.\");\n return `${out.join(\"\\n\")}\\n`;\n}\n","import type { AgentSource } from \"../trace/types.js\";\nimport { CHECK_CATALOG, checkForId } from \"./checks.js\";\n\n/**\n * `receipts eval` (M57) — a precision/recall harness for the **work-account**, not the code.\n *\n * Receipts' thesis is that a human reviews the agent's *work* (a faithful, deterministic\n * account of what it did) instead of re-reading the agent's *output*. That only holds if the\n * account is trustworthy: one false alarm and the reviewer goes back to reading diffs. So the\n * near-zero-FP bar (SPEC-0000 R3) is existential — and until now, unmeasured. This turns it\n * into a number: run the detectors over a hand-labeled corpus, compare what fired to the\n * ground truth, and compute precision/recall/F1.\n *\n * It is **dev/CI tooling, not the product path**: it adds no detector, calls no model (R1),\n * and renders no verdict about any code (R2) — it measures *detector fidelity*. The unit of\n * scoring is (session × merge-surface category): each fixture's ground truth and the\n * detectors' output are both sets of {@link CHECK_CATALOG} keys (advisory cost/loop findings\n * are out of scope by construction — they aren't in the catalog).\n */\n\n/** A finding, reduced to the one field the harness needs. */\nexport interface ScorableFinding {\n id: string;\n}\n\n/** The merge-surface category keys a finding set fired (reusing the existing taxonomy). */\nexport function firedCategories(findings: readonly ScorableFinding[]): Set<string> {\n const keys = new Set<string>();\n for (const f of findings) {\n const c = checkForId(f.id);\n if (c) {\n keys.add(c.key);\n }\n }\n return keys;\n}\n\n/**\n * The categories the curated corpus scores precision/recall over: the **deterministic\n * STATEMENT detectors** whose near-zero-FP we guarantee (SPEC-0000 R3). The heuristic,\n * confidence-weighted \"QUESTION\" detectors (blind/unverified edits, duplication, unfulfilled\n * promises, swallowed errors, stubbed impls — see `findings.ts`) need full-session context to\n * be meaningful and fire as artifacts on minimal single-behavior fixtures, so they are out of\n * the curated precision claim. The field scan (`receipts eval`) exercises them over real\n * sessions, where they belong.\n */\nexport const SCORED_CATEGORIES: ReadonlySet<string> = new Set([\n \"destructive\",\n \"git-history\",\n \"secrets\",\n \"cicd\",\n \"lockfile\",\n \"tests\",\n \"weakening\",\n \"injection\",\n \"trojan\",\n \"malformed\",\n \"truncated\",\n \"tool-calls\",\n]);\n\n/** Restrict a set of category keys to the scored (deterministic) scope. */\nexport function scoped(keys: Iterable<string>): string[] {\n return [...keys].filter((k) => SCORED_CATEGORIES.has(k));\n}\n\n/** One labeled corpus row: a fixture and the categories that *should* fire ([] = clean). */\nexport interface CorpusEntry {\n fixture: string;\n /** merge-surface category keys (CHECK_CATALOG) expected to fire; empty ⇒ clean session */\n expect: string[];\n /** adapter to load the fixture through (default claude-code) */\n source?: AgentSource;\n /** why this fixture is labeled this way (kept honest, human-readable) */\n note?: string;\n}\n\n/** The per-entry input to scoring: expected vs. actually-fired category keys. */\nexport interface ScoredEntry {\n fixture: string;\n expected: string[];\n fired: string[];\n /** fired but not expected — the false positives that erode trust */\n fp: string[];\n /** expected but not fired — the misses */\n fn: string[];\n}\n\nexport interface CategoryMetric {\n key: string;\n label: string;\n tp: number;\n fp: number;\n fn: number;\n precision: number;\n recall: number;\n f1: number;\n}\n\nexport interface EvalMetrics {\n entries: number;\n tp: number;\n fp: number;\n fn: number;\n precision: number;\n recall: number;\n f1: number;\n perCategory: CategoryMetric[];\n details: ScoredEntry[];\n}\n\n/** Precision/recall with an empty denominator = 1 (firing nothing on a clean session is\n * perfect, not undefined; missing nothing is perfect recall). */\nconst ratio = (num: number, denom: number): number => (denom === 0 ? 1 : num / denom);\nconst f1Of = (p: number, r: number): number => (p + r === 0 ? 0 : (2 * p * r) / (p + r));\n\n/**\n * Score a corpus run into a confusion matrix at (session × category) granularity. Pure: the\n * caller is responsible for loading fixtures and deriving findings; this only does the math,\n * so it is unit-testable without any I/O.\n */\nexport function scoreCorpus(\n results: readonly { fixture: string; expected: readonly string[]; fired: ReadonlySet<string> }[],\n): EvalMetrics {\n const label = new Map(CHECK_CATALOG.map((c) => [c.key, c.label] as const));\n const cat = new Map<string, { tp: number; fp: number; fn: number }>();\n const bump = (key: string, field: \"tp\" | \"fp\" | \"fn\") => {\n const row = cat.get(key) ?? { tp: 0, fp: 0, fn: 0 };\n row[field]++;\n cat.set(key, row);\n };\n\n let tp = 0;\n let fp = 0;\n let fn = 0;\n const details: ScoredEntry[] = [];\n\n for (const r of results) {\n const expected = new Set(r.expected);\n const fpKeys: string[] = [];\n const fnKeys: string[] = [];\n for (const key of r.fired) {\n if (expected.has(key)) {\n tp++;\n bump(key, \"tp\");\n } else {\n fp++;\n fpKeys.push(key);\n bump(key, \"fp\");\n }\n }\n for (const key of expected) {\n if (!r.fired.has(key)) {\n fn++;\n fnKeys.push(key);\n bump(key, \"fn\");\n }\n }\n details.push({\n fixture: r.fixture,\n expected: [...expected],\n fired: [...r.fired],\n fp: fpKeys,\n fn: fnKeys,\n });\n }\n\n const perCategory: CategoryMetric[] = [...cat.entries()]\n .map(([key, v]) => {\n const precision = ratio(v.tp, v.tp + v.fp);\n const recall = ratio(v.tp, v.tp + v.fn);\n return {\n key,\n label: label.get(key) ?? key,\n ...v,\n precision,\n recall,\n f1: f1Of(precision, recall),\n };\n })\n .sort((a, b) => b.tp + b.fn - (a.tp + a.fn) || a.label.localeCompare(b.label));\n\n const precision = ratio(tp, tp + fp);\n const recall = ratio(tp, tp + fn);\n return {\n entries: results.length,\n tp,\n fp,\n fn,\n precision,\n recall,\n f1: f1Of(precision, recall),\n perCategory,\n details,\n };\n}\n\nconst pct = (n: number): string => `${(100 * n).toFixed(1)}%`;\n\n/** Render the corpus confusion matrix as facts-only text (the trust artifact). */\nexport function renderEval(m: EvalMetrics): string {\n const out: string[] = [];\n out.push(`Receipts detector eval — ${m.entries} labeled session${m.entries === 1 ? \"\" : \"s\"}`);\n out.push(\"\");\n out.push(\n `Precision ${pct(m.precision)} · Recall ${pct(m.recall)} · F1 ${pct(m.f1)} (TP ${m.tp} · FP ${m.fp} · FN ${m.fn})`,\n );\n out.push(\"\");\n if (m.perCategory.length) {\n out.push(\"By category:\");\n for (const c of m.perCategory) {\n out.push(\n ` ${c.label.padEnd(26)} P ${pct(c.precision).padStart(6)} R ${pct(c.recall).padStart(6)} (tp ${c.tp} fp ${c.fp} fn ${c.fn})`,\n );\n }\n }\n const fps = m.details.filter((d) => d.fp.length);\n const fns = m.details.filter((d) => d.fn.length);\n if (fps.length) {\n out.push(\"\", \"False positives (fired but should be clean):\");\n for (const d of fps) out.push(` ${d.fixture}: ${d.fp.join(\", \")}`);\n }\n if (fns.length) {\n out.push(\"\", \"Misses (expected but did not fire):\");\n for (const d of fns) out.push(` ${d.fixture}: ${d.fn.join(\", \")}`);\n }\n out.push(\"\", \"Deterministic · 0 model calls · measures detector fidelity, not code quality.\");\n return `${out.join(\"\\n\")}\\n`;\n}\n\n/** One real session's contribution to the field scan. */\nexport interface FieldRow {\n title: string;\n categories: string[];\n}\n\nexport interface FieldScan {\n scanned: number;\n flagged: number;\n byCategory: { key: string; label: string; sessions: number }[];\n rows: FieldRow[];\n}\n\n/** Aggregate a field scan over real local sessions: how often the work-account flags real\n * work, by category. A rate the human interprets — never a verdict (a flag may be a true\n * finding or an FP). */\nexport function summarizeFieldScan(rows: readonly FieldRow[]): FieldScan {\n const label = new Map(CHECK_CATALOG.map((c) => [c.key, c.label] as const));\n const cat = new Map<string, number>();\n let flagged = 0;\n for (const r of rows) {\n if (r.categories.length) {\n flagged++;\n }\n for (const key of new Set(r.categories)) {\n cat.set(key, (cat.get(key) ?? 0) + 1);\n }\n }\n const byCategory = [...cat.entries()]\n .map(([key, sessions]) => ({ key, label: label.get(key) ?? key, sessions }))\n .sort((a, b) => b.sessions - a.sessions || a.label.localeCompare(b.label));\n return { scanned: rows.length, flagged, byCategory, rows: [...rows] };\n}\n\n/** Render the field scan as facts-only text. */\nexport function renderFieldScan(s: FieldScan): string {\n if (s.scanned === 0) {\n return \"No local agent sessions found to scan.\\n\";\n }\n const out: string[] = [];\n out.push(`Receipts field scan — ${s.scanned} real local session${s.scanned === 1 ? \"\" : \"s\"}`);\n out.push(\"\");\n const rate = Math.round((100 * s.flagged) / s.scanned);\n out.push(`Flagged: ${s.flagged}/${s.scanned} sessions (${rate}%) carried ≥1 merge-surface flag`);\n out.push(\"\");\n if (s.byCategory.length === 0) {\n out.push(\"No merge-surface category fired on any scanned session.\");\n } else {\n out.push(\"By category (sessions flagged):\");\n for (const c of s.byCategory) {\n out.push(` ${c.label.padEnd(26)} ${c.sessions}`);\n }\n }\n out.push(\n \"\",\n \"A flag may be a true finding or a false positive — this is a flag rate you interpret,\",\n \"not a verdict. Deterministic · 0 model calls · reads only local sessions.\",\n );\n return `${out.join(\"\\n\")}\\n`;\n}\n","import { readFileSync, readdirSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { Severity } from \"../findings/findings.js\";\nimport { formatCostAlways } from \"../findings/format.js\";\nimport type { GradeLetter } from \"../findings/grade.js\";\nimport { verifyBundle } from \"../sign/verify.js\";\nimport { listReceiptRefs, readReceiptRef } from \"./store.js\";\n\n/**\n * `receipts log` (M52) — a chronological list of the committed receipts in `.receipts/`\n * (one line per receipt: date, grade, change-cost, finding count + top severity, scope,\n * name). The `git log` of receipts: the local, history-aware companion to `receipts diff`\n * (which compares two) and `receipts trends` (which aggregates sessions). It reads the\n * COMMITTED receipts, not live sessions, so it answers \"what receipts have we attached,\n * and what do they say?\" — a view nothing else provides.\n *\n * Deterministic · zero model calls · local-first · lists recorded facts (each receipt's\n * own grade/cost/findings), never a synthesized judgement.\n */\n\nconst SEV_ICON: Record<Severity, string> = { critical: \"⛔\", high: \"⚠️\", medium: \"🔍\", low: \"·\" };\nconst SEV_RANK: Record<Severity, number> = { critical: 0, high: 1, medium: 2, low: 3 };\n\nexport interface LogEntry {\n name: string;\n grade: GradeLetter;\n costUsd: number;\n findings: number;\n topSeverity?: Severity;\n scope: string;\n endedAt?: number;\n}\n\n/** Files in `.receipts/` that are config/examples, not receipts. */\nconst NON_RECEIPT = /(?:^|\\/)(?:asserts(?:\\.example)?|sample)\\.json$/i;\n\nfunction scopeLabel(\n scope: { kind: string; files?: string[]; branch?: string } | undefined,\n): string {\n if (!scope || scope.kind === \"session\") return \"session\";\n if (scope.kind === \"branch\") return `branch ${scope.branch ?? \"?\"}`;\n return `diff ${(scope.files ?? []).length}f`;\n}\n\nfunction isoDate(ms: number | undefined): string {\n if (!ms || !Number.isFinite(ms)) return \"—\".padEnd(10);\n return new Date(ms).toISOString().slice(0, 10);\n}\n\n/** Load and validate the committed receipts under `dir` — plus, since SPEC-0070,\n * any `refs/receipts/*` ref-stored receipts — most-recent first. */\nexport function loadReceiptHistory(dir: string): LogEntry[] {\n let files: string[];\n try {\n files = readdirSync(dir).filter((f) => f.endsWith(\".json\") && !NON_RECEIPT.test(f));\n } catch {\n files = [];\n }\n const sources: Array<{ name: string; raw: string | null }> = files.map((f) => {\n try {\n return { name: f, raw: readFileSync(join(dir, f), \"utf8\") };\n } catch {\n return { name: f, raw: null };\n }\n });\n // Refs are listed relative to the receipts dir's repo (its parent), never the\n // process cwd — a log over some other directory must not see this repo's refs.\n const repo = dirname(dir);\n for (const { slug } of listReceiptRefs(repo)) {\n sources.push({ name: `${slug}@ref`, raw: readReceiptRef(slug, repo) });\n }\n const entries: LogEntry[] = [];\n for (const { name: f, raw } of sources) {\n if (raw == null) {\n continue;\n }\n let input: unknown;\n try {\n input = JSON.parse(raw);\n } catch {\n continue;\n }\n const res = verifyBundle(input);\n if (!res.ok || !res.receipt) continue;\n const p = res.receipt.predicate;\n const fs = p.findings ?? [];\n let topSeverity: Severity | undefined;\n for (const x of fs) {\n if (!topSeverity || SEV_RANK[x.severity] < SEV_RANK[topSeverity]) topSeverity = x.severity;\n }\n entries.push({\n name: f.replace(/\\.json$/i, \"\"),\n grade: p.grade,\n costUsd: p.evidence.diffCostUsd ?? p.evidence.costUsd,\n findings: fs.length,\n topSeverity,\n scope: scopeLabel(p.scope),\n endedAt: p.session?.endedAt,\n });\n }\n // most-recent first; receipts without a timestamp sort last (by name, stable)\n entries.sort((a, b) => (b.endedAt ?? 0) - (a.endedAt ?? 0) || a.name.localeCompare(b.name));\n return entries;\n}\n\n/** Render the history as an aligned text table (most-recent first). Facts only. */\nexport function renderLog(entries: readonly LogEntry[], total = entries.length): string {\n if (!entries.length) return \"No committed receipts found in .receipts/.\\n\";\n const rows = entries.map((e) => {\n const findings =\n e.findings === 0\n ? \"0\"\n : `${e.findings} ${e.topSeverity ? SEV_ICON[e.topSeverity] : \"\"}`.trim();\n return {\n date: isoDate(e.endedAt),\n grade: e.grade,\n cost: formatCostAlways(e.costUsd),\n findings,\n scope: e.scope,\n name: e.name,\n };\n });\n const w = (key: keyof (typeof rows)[number], head: string) =>\n Math.max(head.length, ...rows.map((r) => r[key].length));\n const wDate = w(\"date\", \"DATE\");\n const wGrade = Math.max(5, ...rows.map((r) => r.grade.length));\n const wCost = w(\"cost\", \"COST\");\n const wFind = w(\"findings\", \"FINDINGS\");\n const wScope = w(\"scope\", \"SCOPE\");\n const head = `${\"DATE\".padEnd(wDate)} ${\"GRADE\".padEnd(wGrade)} ${\"COST\".padEnd(wCost)} ${\"FINDINGS\".padEnd(wFind)} ${\"SCOPE\".padEnd(wScope)} RECEIPT`;\n const lines = rows.map(\n (r) =>\n `${r.date.padEnd(wDate)} ${r.grade.padEnd(wGrade)} ${r.cost.padEnd(wCost)} ${r.findings.padEnd(wFind)} ${r.scope.padEnd(wScope)} ${r.name}`,\n );\n const header = `Receipt history — .receipts/ (${total} receipt${total === 1 ? \"\" : \"s\"}${entries.length < total ? `, showing ${entries.length}` : \"\"})`;\n return `${header}\\n\\n${head}\\n${lines.join(\"\\n\")}\\n\\n<cost = this change's cost (diff-scoped where available) · grade is each receipt's own recorded grade · evidence, not judgement>\\n`;\n}\n","/**\n * `receipts prune` (M65b / SPEC-0064 \"ephemeral\") — the committed-receipt clutter reducer.\n *\n * A receipt is a per-branch PR artifact: CI reads/signs/comments it during the PR. After the\n * branch merges (and is deleted), the committed `.receipts/<branch>.json` is dead weight that\n * accumulates on the trunk forever (the PR comment + attestation are the durable record). This\n * removes receipts whose branch no longer exists, keeping live-branch receipts and the\n * non-branch example files. Pure planning here; the CLI does the git/fs + the live-branch read.\n */\n\n/** Example/config files in `.receipts/` that are never branch receipts — always kept. */\nconst PROTECTED = /(?:^|\\/)(?:asserts(?:\\.example)?|sample)\\.json$/i;\n\n/** The committed-receipt filename slug for a branch (matches `receipts pr`'s naming). */\nexport function branchSlug(branch: string): string {\n return branch.replace(/[/\\\\]/g, \"-\");\n}\n\nexport interface PrunePlan {\n keep: string[];\n remove: string[];\n}\n\n/**\n * Partition receipt files into keep/remove: keep the protected example files and any whose slug\n * belongs to a live branch; remove the rest (merged/deleted branches). Pure — `liveSlugs` is the\n * set of `branchSlug(branch)` for branches that still exist (resolved by the caller from git).\n */\nexport function planPrune(files: readonly string[], liveSlugs: ReadonlySet<string>): PrunePlan {\n const keep: string[] = [];\n const remove: string[] = [];\n for (const f of files) {\n const base = f.split(\"/\").pop() ?? f;\n const slug = base.replace(/\\.json$/i, \"\");\n if (PROTECTED.test(base) || liveSlugs.has(slug)) {\n keep.push(f);\n } else {\n remove.push(f);\n }\n }\n return { keep, remove };\n}\n","import type { Receipt, ReceiptFinding } from \"../receipt/build.js\";\nimport { type CheckSeverity, checkForId } from \"./checks.js\";\n\n/**\n * `receipts sarif` (M63) — render a receipt's findings as a SARIF 2.1.0 log so GitHub\n * code-scanning can post them **inline on the diff** and in the **Security tab** (the native\n * machine-findings surface). Unlocked by M62: file-anchored findings now carry `line`, so each\n * maps to a SARIF result with `region.startLine`. Pure transform of a verified receipt;\n * deterministic; zero model calls. It re-presents the same facts (R2) — no new judgement.\n *\n * Uploading is the user's CI step (`github/codeql-action/upload-sarif`, needs\n * `security-events: write` + GHAS on private repos) — see docs/sarif.md.\n */\n\nconst INFO_URI = \"https://github.com/AltimateAI/altimate-receipts\";\n\nexport interface SarifLog {\n $schema: string;\n version: \"2.1.0\";\n runs: SarifRun[];\n}\ninterface SarifRun {\n tool: { driver: { name: string; informationUri: string; version?: string; rules: SarifRule[] } };\n results: SarifResult[];\n}\ninterface SarifRule {\n id: string;\n name: string;\n shortDescription: { text: string };\n defaultConfiguration: { level: SarifLevel };\n helpUri: string;\n}\ninterface SarifResult {\n ruleId: string;\n ruleIndex: number;\n level: SarifLevel;\n message: { text: string };\n locations?: {\n physicalLocation: {\n artifactLocation: { uri: string };\n region?: { startLine: number };\n };\n }[];\n partialFingerprints: { receiptsId: string };\n}\ntype SarifLevel = \"error\" | \"warning\" | \"note\";\n\n/** SARIF severity level for a finding's severity (the catalog/PR-comment mapping). */\nfunction levelOf(severity: CheckSeverity | undefined): SarifLevel {\n if (severity === \"critical\" || severity === \"high\") return \"error\";\n if (severity === \"medium\") return \"warning\";\n return \"note\";\n}\n\n/** Stable rule id for a finding: the merge-surface category key when it's in the catalog\n * (groups like the PR comment), else the finding-id prefix with the volatile span suffix\n * stripped (e.g. `claimed-commit-none-gen-3` → `claimed-commit-none`). */\nfunction ruleIdOf(id: string): string {\n const check = checkForId(id);\n if (check) return check.key;\n return id.replace(/-(?:tool|gen|span|s)-?\\d.*$/i, \"\") || id;\n}\n\n/** Map a finding's `filePath` to a repo-relative path: prefer the matching scope-file entry\n * (so code-scanning anchors correctly), else fall back to the basename. */\nfunction repoRelative(filePath: string, scopeFiles: readonly string[]): string {\n const base = filePath.split(\"/\").pop() ?? filePath;\n for (const sf of scopeFiles) {\n if (sf === filePath || sf.endsWith(`/${filePath}`) || filePath.endsWith(`/${sf}`)) return sf;\n if ((sf.split(\"/\").pop() ?? sf) === base) return sf;\n }\n return base;\n}\n\n/** Build a SARIF 2.1.0 log from a verified receipt. */\nexport function toSarif(receipt: Receipt): SarifLog {\n const p = receipt.predicate;\n const scopeFiles = p.scope?.files ?? [];\n const findings: ReceiptFinding[] = p.findings ?? [];\n\n // Collect rules (deduped by ruleId), tracking the worst level seen per rule.\n const ruleOrder: string[] = [];\n const rules = new Map<string, SarifRule>();\n const sevRank: Record<SarifLevel, number> = { error: 0, warning: 1, note: 2 };\n\n const results: SarifResult[] = findings.map((f) => {\n const ruleId = ruleIdOf(f.id);\n const level = levelOf(f.severity);\n const existing = rules.get(ruleId);\n if (!existing) {\n ruleOrder.push(ruleId);\n rules.set(ruleId, {\n id: ruleId,\n name: checkForId(f.id)?.label ?? ruleId,\n shortDescription: { text: checkForId(f.id)?.label ?? ruleId },\n defaultConfiguration: { level },\n helpUri: INFO_URI,\n });\n } else if (sevRank[level] < sevRank[existing.defaultConfiguration.level]) {\n existing.defaultConfiguration.level = level;\n }\n const uri = f.filePath ? repoRelative(f.filePath, scopeFiles) : undefined;\n const result: SarifResult = {\n ruleId,\n ruleIndex: ruleOrder.indexOf(ruleId),\n level,\n message: { text: f.detail ? `${f.title} — ${f.detail}` : f.title },\n // Stable across commits: rule + path, never the volatile span id.\n partialFingerprints: { receiptsId: `${ruleId}::${uri ?? \"session\"}` },\n };\n if (uri) {\n result.locations = [\n {\n physicalLocation: {\n artifactLocation: { uri },\n ...(f.line ? { region: { startLine: f.line } } : {}),\n },\n },\n ];\n }\n return result;\n });\n\n // ruleIndex was assigned by first-seen order; finalize the rules array in that order.\n const ruleList = ruleOrder.map((id) => rules.get(id) as SarifRule);\n\n return {\n $schema: \"https://json.schemastore.org/sarif-2.1.0.json\",\n version: \"2.1.0\",\n runs: [\n {\n tool: {\n driver: {\n name: \"Receipts\",\n informationUri: INFO_URI,\n version: p.generator?.version,\n rules: ruleList,\n },\n },\n results,\n },\n ],\n };\n}\n","import { readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { GradeLetter } from \"../findings/grade.js\";\nimport { verifyBundle } from \"../sign/verify.js\";\nimport { checkForId } from \"./checks.js\";\n\n/**\n * `receipts stats` (M53) — a dogfooding scoreboard over the committed receipts in\n * `.receipts/`. Answers the two questions a pilot owner asks: **how often did Receipts\n * run, and what did it catch?** It aggregates the receipts the tool already wrote — how\n * many, the grade distribution, the flagged rate, and findings rolled up **by check\n * category** (which agent-failure modes actually show up here, ranked). Pure read + count\n * over local JSON; deterministic, zero model calls. It reports counts, never a verdict.\n *\n * This is the local measurement surface; an org-wide rollup (across repos) is a thin\n * scheduled job on top of the same per-repo numbers.\n */\n\nconst NON_RECEIPT = /(?:^|\\/)(?:asserts(?:\\.example)?|sample)\\.json$/i;\n\nexport interface ReceiptStats {\n /** how many valid committed receipts (≈ how many PRs Receipts ran on) */\n receipts: number;\n /** files in the dir that weren't valid receipts (skipped) */\n skipped: number;\n /** receipts with ≥1 finding */\n flagged: number;\n /** A/B/C/F counts */\n grades: Record<GradeLetter, number>;\n /** finding count rolled up by check category, ranked desc; label is human-readable */\n byCategory: { key: string; icon: string; label: string; findings: number; receipts: number }[];\n /** total findings across all receipts */\n totalFindings: number;\n}\n\n/** Aggregate the committed receipts under `dir` into a dogfooding scoreboard. */\nexport function computeStats(dir: string): ReceiptStats {\n let files: string[];\n try {\n files = readdirSync(dir).filter((f) => f.endsWith(\".json\") && !NON_RECEIPT.test(f));\n } catch {\n files = [];\n }\n const grades: Record<GradeLetter, number> = { A: 0, B: 0, C: 0, F: 0 };\n const cat = new Map<\n string,\n { icon: string; label: string; findings: number; receipts: number }\n >();\n let receipts = 0;\n let skipped = 0;\n let flagged = 0;\n let totalFindings = 0;\n\n for (const f of files) {\n let input: unknown;\n try {\n input = JSON.parse(readFileSync(join(dir, f), \"utf8\"));\n } catch {\n skipped++;\n continue;\n }\n const res = verifyBundle(input);\n if (!res.ok || !res.receipt) {\n skipped++;\n continue;\n }\n receipts++;\n const p = res.receipt.predicate;\n grades[p.grade] = (grades[p.grade] ?? 0) + 1;\n const findings = p.findings ?? [];\n if (findings.length) flagged++;\n totalFindings += findings.length;\n // which categories this receipt touched (count receipts once per category)\n const seen = new Set<string>();\n for (const finding of findings) {\n const c = checkForId(finding.id);\n if (!c) continue;\n const row = cat.get(c.key) ?? { icon: c.icon, label: c.label, findings: 0, receipts: 0 };\n row.findings++;\n if (!seen.has(c.key)) {\n row.receipts++;\n seen.add(c.key);\n }\n cat.set(c.key, row);\n }\n }\n\n const byCategory = [...cat.entries()]\n .map(([key, v]) => ({ key, ...v }))\n .sort((a, b) => b.findings - a.findings || a.label.localeCompare(b.label));\n\n return { receipts, skipped, flagged, grades, byCategory, totalFindings };\n}\n\n/** Render the scoreboard as plain text. Facts only. */\nexport function renderStats(s: ReceiptStats): string {\n if (s.receipts === 0) return \"No committed receipts found in .receipts/.\\n\";\n const out: string[] = [];\n out.push(\n `Receipts scoreboard — ${s.receipts} receipt${s.receipts === 1 ? \"\" : \"s\"} in .receipts/`,\n );\n out.push(\"\");\n const pct = (n: number) => `${Math.round((100 * n) / s.receipts)}%`;\n out.push(\n `Grades: 🟢 A ${s.grades.A} · 🟡 B ${s.grades.B} · 🟠 C ${s.grades.C} · 🔴 F ${s.grades.F}`,\n );\n out.push(`Flagged: ${s.flagged}/${s.receipts} receipts (${pct(s.flagged)}) carried ≥1 finding`);\n out.push(\"\");\n if (s.byCategory.length === 0) {\n out.push(\"Problems caught: none — every committed receipt was clean.\");\n } else {\n out.push(\n `Problems caught (${s.totalFindings} findings across ${s.byCategory.length} categories):`,\n );\n for (const c of s.byCategory) {\n out.push(\n ` ${c.icon} ${c.label.padEnd(26)} ${c.findings} finding${c.findings === 1 ? \"\" : \"s\"} in ${c.receipts} receipt${c.receipts === 1 ? \"\" : \"s\"}`,\n );\n }\n }\n if (s.skipped) {\n out.push(\"\", `<${s.skipped} non-receipt/invalid file${s.skipped === 1 ? \"\" : \"s\"} skipped>`);\n }\n out.push(\"\", \"Deterministic · 0 model calls · counts of recorded receipts, not a verdict.\");\n return `${out.join(\"\\n\")}\\n`;\n}\n","import type { FindingSet } from \"../findings/findings.js\";\nimport type { Receipt } from \"../receipt/build.js\";\nimport { redact } from \"./redact.js\";\n\n/**\n * Verifiable handoff brief (SPEC-0025 / M23). A pure projection of a session's Receipt +\n * findings into typed sections (DONE / OPEN / RISK / NEXT / PREVENT / VERIFY) the next\n * agent or human can read AND check (re-derive the subject hash). Deterministic, zero\n * model calls, no new schema. Evidence, not judgement: NEXT/PREVENT are the VERBATIM\n * fixPrompt/guardrailRule strings the findings engine already produced — no invented\n * advice, no readiness verdict.\n */\n\nconst OPEN_IDS = new Set([\"unverified-change\", \"claimed-commit-none\", \"fake-green\"]);\n\nexport interface Handoff {\n subject: string;\n grade: string;\n done: { filesChanged: number; edits: number; commands: number; reads: number; testsRan: boolean };\n open: string[];\n risk: { severity: string; title: string }[];\n next: string[];\n prevent: string[];\n verify: string;\n}\n\nexport function buildHandoff(receipt: Receipt, findings: FindingSet): Handoff {\n const all = [...findings.main, ...findings.minor];\n const ev = receipt.predicate.evidence;\n return {\n subject: receipt.subject[0]?.digest.sha256 ?? \"\",\n grade: receipt.predicate.grade,\n done: {\n filesChanged: ev.filesChanged,\n edits: ev.edits,\n commands: ev.commands,\n reads: ev.reads,\n testsRan: ev.testsRan,\n },\n open: all.filter((f) => OPEN_IDS.has(f.id)).map((f) => redact(f.title)),\n risk: all\n .filter((f) => f.severity === \"high\" || f.severity === \"critical\")\n .map((f) => ({ severity: f.severity, title: redact(f.title) })),\n next: all\n .map((f) => f.fixPrompt)\n .filter((p): p is string => !!p)\n .map(redact),\n prevent: all\n .map((f) => f.guardrailRule)\n .filter((g): g is string => !!g)\n .map(redact),\n verify: `receipts rederive <transcript> # reproduces subject ${(receipt.subject[0]?.digest.sha256 ?? \"\").slice(0, 12)}…`,\n };\n}\n\nexport function renderHandoffMarkdown(h: Handoff): string {\n const lines: string[] = [];\n lines.push(`# Handoff — Grade ${h.grade}`, \"\");\n lines.push(\n \"## ✅ Done\",\n `${h.done.filesChanged} files changed · ${h.done.edits} edits · ${h.done.commands} commands · ${h.done.reads} reads · tests ran: ${h.done.testsRan ? \"yes\" : \"no\"}`,\n \"\",\n );\n if (h.open.length) {\n lines.push(\"## 🚧 Open\", ...h.open.map((o) => `- ${o}`), \"\");\n }\n if (h.risk.length) {\n lines.push(\n \"## 🛡️ Risk\",\n ...h.risk.map((r) => `- **${r.severity.toUpperCase()}** ${r.title}`),\n \"\",\n );\n }\n if (h.next.length) {\n lines.push(\"## ⏭️ Next\", ...h.next.map((n) => `- ${n}`), \"\");\n }\n if (h.prevent.length) {\n lines.push(\"## 🧷 Prevent\", ...h.prevent.map((p) => `- ${p}`), \"\");\n }\n lines.push(\"## 🔎 Verify\", `\\`${h.verify}\\``, \"\");\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n","import { spawnSync } from \"node:child_process\";\nimport type { DerivedSpan } from \"../findings/spans.js\";\nimport { gitInvocations } from \"./gitCommand.js\";\n\n/**\n * Commit-SHA attribution (SPEC-0069 / M70). When any agent runs `git commit` or\n * `git push`, the captured output carries the commit SHA (\"[feat-x 5f8a31d] msg\",\n * \"abc1234..def5678 feat-x -> feat-x\"). Matching those SHAs against the branch's\n * `git log` gives an exact, agent-agnostic session↔branch binding — no branch\n * tags, no edit spans, nothing new recorded. Prior art: aider stamps commits,\n * git-ai/Entire attach notes; we read the binding the transcript already holds.\n */\n\n/** Max branch commits to match against — far beyond any sane PR; newest first. */\nconst SHA_CAP = 200;\n\n/** Full SHAs of the commits unique to this branch (newest first), or [] when\n * unknowable (no base / no commits / no git). */\nexport function branchShas(base?: string, cwd?: string): string[] {\n if (!base) {\n return [];\n }\n const r = spawnSync(\"git\", [\"log\", `--max-count=${SHA_CAP}`, \"--format=%H\", `${base}..HEAD`], {\n encoding: \"utf8\",\n cwd,\n });\n if (r.status !== 0) {\n return [];\n }\n return r.stdout.split(\"\\n\").filter((s) => /^[0-9a-f]{40}$/.test(s));\n}\n\nconst HEX_RUN = /\\b[0-9a-f]{7,40}\\b/g;\n\n/** The command string of a tool span, across agent input shapes: Claude's\n * `{command}` object, Codex's raw arguments JSON string (`'{\"cmd\":\"…\"}'`, string\n * or argv array inside). Raw inputs per R5. */\nfunction commandOf(input: unknown): string {\n if (typeof input === \"string\") {\n const t = input.trim();\n if (t.startsWith(\"{\")) {\n try {\n return commandOf(JSON.parse(t));\n } catch {\n return input;\n }\n }\n return input;\n }\n if (input && typeof input === \"object\") {\n const o = input as Record<string, unknown>;\n for (const key of [\"command\", \"cmd\"]) {\n const v = o[key];\n if (typeof v === \"string\") {\n return v;\n }\n if (Array.isArray(v)) {\n return v.filter((t) => typeof t === \"string\").join(\" \");\n }\n }\n }\n return \"\";\n}\n\n/**\n * Is this command a real `git commit`/`git push` invocation? Tokenized via the\n * shared M67-discipline matcher — an orchestrating session running\n * `codex exec \"...then git push...\"` (the SHA-bearing instruction-in-a-string\n * case, observed live) never counts as the author of its child agent's commits.\n */\nexport function isGitWrite(command: string): boolean {\n return gitInvocations(command).some((g) => g.sub === \"commit\" || g.sub === \"push\");\n}\n\n/**\n * Did this session author any of the branch's commits? True iff a hex run (≥7\n * chars) in the OUTPUT of a `git commit`/`git push` command span prefixes one of\n * the branch's full SHAs. Output-only: a SHA pasted into a command's input isn't\n * authorship. Deterministic string scan; zero git calls.\n */\nexport function authoredBranch(spans: readonly DerivedSpan[], shas: readonly string[]): boolean {\n if (shas.length === 0) {\n return false;\n }\n for (const s of spans) {\n if (s.kind !== \"tool\" || typeof s.output !== \"string\") {\n continue;\n }\n if (!isGitWrite(commandOf(s.input))) {\n continue;\n }\n for (const token of s.output.match(HEX_RUN) ?? []) {\n if (shas.some((full) => full.startsWith(token))) {\n return true;\n }\n }\n }\n return false;\n}\n"],"mappings":"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","names":["spawnSync","existsSync","mkdirSync","readFileSync","readdirSync","writeFileSync","join","spawnSync","existsSync","join","spawnSync","git","git","existsSync","mkdirSync","readFileSync","writeFileSync","join","git","spawnSync","existsSync","join","readFileSync","join","readFileSync","dirname","join","SEV_ICON","scopeLabel","readFileSync","join","dirname","head","readFileSync","readdirSync","join","NON_RECEIPT","readdirSync","readFileSync","join","spawnSync","spawnSync","writeFileSync","git","spawnSync","join","mkdirSync","existsSync","readFileSync","readdirSync"]}
|