Build Log
Arc Audit Proof — Provenance to One Verified Claim
July 18, 2026
Chapter 1 removed canonical provenance's dependency on the experimental spike namespace, wired its tests into the standard suite, and added derivation versioning. Chapter 2 proved ForgeKit can mechanically evaluate one real retro claim against its linked transcript evidence — with the unverified/contradicted boundary held structurally, not just by convention.
Timeline
What shipped
forgekit-os/scripts/transcript/parser.mjs (moved from spikes/transcript-adapter.mjs) + forgekit-os/scripts/transcript/derive.mjs (moved from spikes/derive-arc-preview.mjs) — the stable, provider-neutral parsing and deterministic-derivation core. Logic unchanged from the proven spike version; only the header comments and one import path changed
DERIVATION_ID/DERIVATION_VERSION exported from derive.mjs; metricsHash now hashes a {derivation, result} envelope instead of the result alone — lets a future consumer distinguish 'source changed' from 'derivation logic changed' when a hash differs
Two new scoped accessors added to parser.mjs: loadToolUseCommand (redacted, capped command text for a specific tool_use block) and loadToolResultOutcome (is_error flag + capped tail snippet for a specific tool_result block) — both follow the exact same scoped, secret-redacted, length-capped pattern as the pre-existing loadRawSnippet
forgekit-os/scripts/provider-adapters/claude-code.mjs, resolve-transcript-reference.mjs, propose-transcript-reference.mjs, and forgekit-os/scripts/spikes/run-arc-spike.mjs all repointed to import from forgekit-os/scripts/transcript/ — zero remaining canonical or debug-CLI dependency on the spike namespace for parsing/derivation logic
package.json test:os — wired in both Chapter 1's relocated test suite AND Chapter 2's new audit test suite, in the same session each was written (not deferred)
forgekit-os/scripts/audit/command-execution-claim.mjs — the claim evaluator. Four-outcome model (verified/contradicted/unverified/not_mechanically_observable) with the unverified-default made structural: exactly one code path reaches 'contradicted', requiring a real matched tool_use AND a real error tool_result
forgekit-os/scripts/audit/audit-claim.mjs — CLI/library entry point that resolves a session's transcript_reference via the canonical provider adapter and runs a claim evaluator against it
forgekit-os/scripts/audit/tests/audit-claim.test.mjs — 7 tests covering all three required controls plus a structural-guarantee unit test, a privacy check, and two honest-failure-mode tests (no reference, inaccessible source)
Ran the real audit against a real claim from the real proof session's own retro ('Added 5 new regression tests ... 27/27 total passing') — verified against actual matching transcript evidence (tool_use uuid e346ea4e..., tool_result uuid e83039ba...)
“The structural guarantee held under evidence the design didn't anticipate, which is stronger proof than the three planned controls alone.”