Cross-machine process provenance (capture v2)

Make per-session process provenance (model, tokens, churn, outcome — cost derived at display) **complete across machines and people**, so a work item's committed proof carries every role's record regardless of which machine each pipeline session ran on.

verdict PASSscore 46 / 46findings 15 (0 risk · 2 debt · 13 obs)duration 3h 34mrejection cycles 0shipped Jun 8, 2026surface cli

Pipeline timeline

Intent to proven code in 3h 34m across Think, Plan, and 3 Build→Verify phases.

Think
17m
Plan
93m
Build 1
33m
Verify 1
7m
Build 2
18m
Verify 2
7m
Build 3
17m
Verify 3
7m

Assertion ledger

46 claims, each independently verified. Showing 8 — show all →

IDSaysMatcher
A001Every launched agent gets a unique run id so its work can be matched laterverifiedok
A002Tagging a session never strips the agent's existing environmentverifiedok
A003Session start records a lightweight pointer to the live sessionverifiedok
A004The session-start hook does no heavy work — it writes no bufferverifiedok
A005The retired end-of-session hook is harmless on installs that still have itverifiedok
A006Each role's session is recorded as its own provenance file at save timeverifiedok
A007Provenance carries token counts and model, not a dollar figure, in gitverifiedok
A008Derived counts include the token totals the cost is computed fromverifiedok

Findings 15 total

obspackages/cli/src/commands/artifact.tsmonitor
No-work re-validation leaves the provenance file modified-but-unstaged in the working tree. captureProvenanceAtSave writes provenance/{role}-{id}.json to disk BEFORE the no-changes guard; on the no-op path only `git reset -- provenancePaths` runs (unstage), which does not restore working-tree content. On the Claude fallback path captured_at is a fresh wall-clock each call, so the file churns on every re-save. AC9 ('no staged provenance') is met; this is beyond-AC. Risk: a downstream clean-tree assumption (future ana command, user pre-push hook) could trip on the lingering change.
obspackages/cli/src/utils/forensics.tsmonitor
resolveTranscriptPath is exported from forensics.ts but has zero importers anywhere — its only consumer is the internal call at forensics.ts:695. Per the project rule 'flag exports with zero imports anywhere', the export keyword is needless public-API surface. The spec instructed the builder to keep it exported, so this is partly an upstream hint that did not pan out (no other consumer materialized).
obspackages/cli/src/commands/work-proof.tsclosed
Capture v2 deletes the home-global forensics buffer read and the recordBelongsToWorktree worktree-path matcher from assembleProcessAttestation, replacing them with per-session committed provenance files. This resolves the session-capture C8 finding (assembly still read the machine-wide ~/.ana/forensics/sessions.jsonl and still used recordBelongsToWorktree). Verified by grep: neither symbol remains anywhere in src/.
obspackages/cli/src/commands/_capture.tsclosed
executeDerive's body (synchronous full-transcript readFileSync + per-line JSON.parse before process.exit(0) on SessionEnd/Stop) is deleted — the function is now a pure no-op kept only so commander tolerates an un-pruned --derive hook. This resolves the session-capture C11 finding about the unbounded synchronous derive read on the hook path.
obspackages/cli/tests/commands/artifact-provenance.test.tsmonitor
The no-work re-validation integration test asserts only `git diff --staged --quiet` (nothing staged) but does not assert a clean working tree (`git status --porcelain` empty). It therefore passes despite the modified-but-unstaged provenance file the no-op path leaves behind (see the artifact.ts code finding). A stronger assertion would have surfaced that beyond-AC behavior.
+10more findings

Provenance

Who ran what, and what it cost. Recomputable estimates from the shared price table — subordinate to the verdict, never gating.

model claude-opus-4-8
sessionturnstoolsinoutcachecost
build22110211.6k113.5k15.7M$12.21
verify92396.9k28.5k3.3M$3.20
build 2175877.8k55.5k9.9M$7.22
verify 2102456.7k25.8k3.4M$3.02
build 392437.0k39.8k4.0M$3.70
verify 3114487.0k32.5k3.9M$3.32
TOTAL 6 sessions$32.66 (table 2026-06-14)
churn 23 files · +2196/−1063

Integrity seal

scopesha256:d82576af6962c...
contractsha256:300546c9ebe06...
plansha256:cd38d4eb04d60...
spec-1sha256:12a60cc158383...
spec-2sha256:8fe089e5366ac...
spec-3sha256:913e1f3364325...
build-report-1sha256:5a0a54a5dc849...
build-data-1sha256:3b88f7e4bab5d...
verify-report-1sha256:baa54617428d2...
verify-data-1sha256:26e01bbe384e2...
build-report-2sha256:ade5c164d9bc0...
build-data-2sha256:6bd90beb60920...
verify-report-2sha256:b14675395dbb3...
verify-data-2sha256:201e2e3175cda...
build-report-3sha256:f19bd5f818c60...
build-data-3sha256:82ba0645d0d66...
verify-report-3sha256:17f34a3173e1e...
verify-data-3sha256:b918713ca70e0...
audit cmd$ ana proof audit cross-machine-provenance   → all hashes match