Build Log · July 18, 2026

Arc Audit Proof — Provenance to One Verified Claim

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.

  • ForgeKit OS
  • Arc Slice
  • Audit
  • Foundation Hardening
canonical provenance imports remaining from forgekit-os/scripts/spikes/ — fully moved to forgekit-os/scripts/transcript/
0

canonical provenance imports remaining from forgekit-os/scripts/spikes/ — fully moved to forgekit-os/scripts/transcript/

total OS + transcript + audit tests passing under npm run test:os after this session (up from 36 pre-session)
48/48

total OS + transcript + audit tests passing under npm run test:os after this session (up from 36 pre-session)

real outcome for the real claim 'Added 5 new regression tests ... 27/27 total passing' against its linked transcript evidence
verified

real outcome for the real claim 'Added 5 new regression tests ... 27/27 total passing' against its linked transcript evidence

Timeline

  1. Start

    External verdict received, Charge scoped

    Zeb reviewed the prior session's retro, confirmed the product decision holds, named three technical seams, and delivered the full Arc Audit Proof Charge in one message

  2. +5m

    Crucible scope decided

    Asked Zeb whether to run Council on the whole Charge, Chapter 2 only, or skip — chose Chapter 2 only; Chapter 1 proceeded straight to build as a mechanical refactor

  3. +20m

    Chapter 1: files moved, imports repointed

    transcript-adapter.mjs -> transcript/parser.mjs, derive-arc-preview.mjs -> transcript/derive.mjs, tests + fixtures moved via git mv; provider-adapters/, spikes/run-arc-spike.mjs all repointed to the new stable location, zero duplication

  4. +30m

    Derivation versioning added, reproven

    DERIVATION_ID/DERIVATION_VERSION exported from derive.mjs; metricsHash now covers a {derivation, result} envelope; re-ran resolve-transcript-reference.mjs against the real proof session — still reproducible (new hash, correctly different from before, since the envelope changed), sourceIntegrity/endBoundaryStatus still complete

  5. +35m

    Tests wired into npm run test:os

    Both new Chapter 1 test files added to package.json's test:os chain — directly closing the exact gap the external verdict flagged for the prior session

  6. +45m

    Council ran on Chapter 2 design

    architect/qe/steward reviewed the claim-adapter shape and four-outcome model — recommendation: ship as designed, with two implementation-discipline callouts (structured matching, structural unverified-default) both built into the code, not left as convention

  7. +65m

    Claim adapter built, real claim found

    command-execution-claim.mjs + audit-claim.mjs written; located a real retro claim ('27/27 tests passing') and its genuine matching Bash tool_use + tool_result pair in the proof session's actual transcript

  8. +75m

    Three controls run — one surfaced a real precision lesson

    Control 1's first attempt matched an unrelated earlier failed command in the same transcript, correctly returning contradicted (not a bug — genuine evidence). Tightened the command_pattern to the exact final invocation; re-ran, got verified with the real '27/27' evidence. Controls 2 and 3 both passed on the first attempt.

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.”
— This session, on Control 1's unplanned first-attempt contradicted result