Skip to content

HAC-336: assemble the final cut, and gate it against the evidence it shows - #37

Open
qmarcelle wants to merge 2 commits into
mainfrom
hac/336-final-media-assembly
Open

HAC-336: assemble the final cut, and gate it against the evidence it shows#37
qmarcelle wants to merge 2 commits into
mainfrom
hac/336-final-media-assembly

Conversation

@qmarcelle

Copy link
Copy Markdown
Contributor

Closes the HAC-336 assembly. 3:49.5 against the 4:00 ceiling, 1920×1080 H.264, no audio track, 21 beats.

media/hac-336/exports/IL-MOT-020-interlock-final-cut-1920x1080.mp4

What this owns

The edit, and no facts. Every number on screen was frozen by HAC-330, HAC-343 or HAC-324 before this package existed; the six new boards read those files rather than restating them. evidence/cut.json is the one authored file — beats, holds, sources, proof classes, narration, claim citations — and everything else under media/hac-336 derives from it plus frozen evidence.

Two proof classes, one reset

HAC-333's SB-06 lands at B09, and the separation is mechanical, not editorial.

  • Before — HAC-330's counterfactual (140 > 130WITHHOLD_SERIALIZE120 <= 130, checks 24/24, perturbed evidence → ALLOW_PARALLEL140 > 130) and HAC-343's bounded four-arm evaluation. Paper field.
  • After — the HAC-324 authoritative filmed run, correlation ilk-hac340-cloud-1787536029323: five frames captured while a real gemini-3.5-flash agent traversed Google ADK 1.35.1 on Cloud Run through the Interlock MCP proxy, producing ALLOW + receipt, an EXECUTED mutation at 105 <= 130, an independently authenticated OBSERVED read-back at alpha=45, and Cloud Logging correlation. Ink field.

The gate refuses class-B material before the reset, class-A material after it, a filmed capture presented under any class but B, and the frozen HAC-340 reference run's correlation id anywhere in judge-facing copy.

Three decisions worth review

The architecture board is new rather than reused. IL-DIAG-011 and IL-DIAG-012 already explain this topology — and they name interlock-hac340-proxy-00002-wzf and correlation …1786730369123, which belong to the frozen reference run. Beside filmed footage that would put two run identities in one act, the collapse HAC-324 exists to prevent. IL-DIAG-020 is bound to the filmed run and nothing else.

The only operation applied to filmed evidence is a crop. A rectangle of the original pixels, scaled uniformly, chrome around it. No recolouring, no redaction, no compositing, no text inside the stage. Every crop rectangle is declared in the cut and compared by the gate, so a crop that quietly excluded an inconvenient line reads as a rectangle that moved. All five promoted scenes appear; the gate fails if one is dropped.

There is no audio track, and the gate fails if one appears. HAC-333 froze this cut as muted. The captions carry the narration so a voice-over later is a matter of reading them aloud; synthetic speech was not generated, because a channel no gate can check and no human spoke is not an accessibility feature.

The gate

pnpm run check:film — Node builtins only. It reads the committed MP4's own moov boxes rather than shelling out to ffprobe, because a gate that needs a tool CI does not have is a gate that gets skipped, and a skipped gate reads as a pass.

It fails on: a cut over four minutes; an encoded duration that disagrees with the derived one; a frame rebuilt after the encode; a filmed frame whose bytes do not hash to the digest the HAC-324 capture manifest promoted; a promoted scene dropped without record; a crop that moved; a claim citation with no ledger row; a filmed-run row whose JSON pointer stopped resolving; a forbidden phrasing asserted without negation; a missing boundary statement; the HAC-343 ablation control separated from its comparison; a beat in the opening thirty seconds with no muted reading; a caption drifted from its narration; an audio track; a declared input whose bytes moved; a declared revision the evidence no longer carries.

28 cases in test/hac-336-film-gates.test.mjs prove it fails on each.

Gates run locally

Command Result
pnpm run check (12 gates, now including check:film) PASS
pnpm run typecheck PASS
pnpm run build PASS
pnpm run test 686 passed / 23 files
source-files-are-text, canonical-spelling PASS

Cold read — not run

media/hac-341/cold-read/ is the protocol for this cut too: three technically competent readers unfamiliar with the build, one at a time, no pre-explanation. No result is claimed. Until three real readers complete it, this package stays READY_FOR_HUMAN_TEST, nothing describes the media as frozen, and HAC-337 does not start.

Known, and deliberately not reopened

The HAC-335 freshness audit's gate gap — the package freshness gate does not independently assert capturedFromSha equals the capture manifest's capture revision — is untouched. Final assembly demonstrated no concrete correctness problem arising from it, so expanding HAC-336 into gate engineering would be scope the issue does not authorise.

…shows

The judge-facing video, as a repository-native contract. HAC-336 owns the edit
and no facts: every number on screen was frozen by HAC-330, HAC-343 or HAC-324
before this package existed, and each of the six new boards reads those files
rather than restating them.

3:49.5 against the 4:00 ceiling. 1920x1080, H.264, no audio track. The cut is
twenty-one still holds joined by a 0.4s crossfade, so the only motion in four
minutes is a state change between two frozen frames.

Two proof classes, separated by HAC-333's SB-06 reset at B09 and kept apart
mechanically. Before it: the HAC-330 counterfactual and the HAC-343 bounded
four-arm evaluation, on paper. After it: the HAC-324 authoritative filmed run
-- correlation ilk-hac340-cloud-1787536029323, five frames captured while a real
gemini-3.5-flash agent traversed Google ADK 1.35.1 on Cloud Run through the
Interlock MCP proxy -- on ink. The gate refuses class-B material before the
reset, class-A material after it, and the frozen HAC-340 reference run's
correlation id anywhere in judge-facing copy.

Three decisions worth naming.

The architecture board is new rather than reused. IL-DIAG-011 and IL-DIAG-012
already explain this topology, and they also name proxy-00002-wzf and
correlation ...1786730369123, which belong to the frozen reference run. Putting
either beside filmed footage would place two run identities in one act, which is
the collapse HAC-324 exists to prevent. IL-DIAG-020 is bound to the filmed run
and to nothing else.

The only operation applied to filmed evidence is a crop: a rectangle of the
original pixels, scaled uniformly, with chrome drawn around it. A 1920x1080
terminal capture with its content in the top third is unreadable at video
bitrates. Every crop rectangle is declared in the cut and compared by the gate,
so a crop that quietly excluded an inconvenient line shows up as a rectangle
that moved.

There is no audio, and the gate fails if one appears. HAC-333 froze this cut as
muted. The captions carry the narration text so a voice-over is later a matter
of reading them aloud; synthetic speech was not generated, because a channel no
gate can check and no human spoke is not an accessibility feature.

The gate is Node builtins only -- it reads the committed MP4's own moov boxes
rather than shelling out to ffprobe -- because a gate that needs a tool CI does
not have is a gate that gets skipped, and a skipped gate reads as a pass. Twenty
eight cases in test/hac-336-film-gates.test.mjs prove it fails on the defects it
exists to catch.

The cold read has not been run. media/hac-341/cold-read/ is the protocol for
this cut too, and until three real readers complete it nothing here describes
the media as frozen.
Copilot AI lite review requested due to automatic review settings August 24, 2026 12:59
@vercel

vercel Bot commented Aug 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
interlock Ready Ready Preview Aug 24, 2026 1:04pm

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@codecov

codecov Bot commented Aug 24, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

SonarCloud flagged javascript:S4036 twice on build-video.mjs: invoking a bare
`ffmpeg` through execFileSync resolves it through PATH, so whatever the first
writable directory on PATH offers is what encodes the submission video.

The finding is right, and not only about substitution. The binary that produced
the final cut should be something the render manifest can state, not whatever
the shell found that afternoon. `resolveFfmpeg()` searches a fixed list of
absolute locations, honours an FFMPEG override that must itself be absolute, and
fails with the list it looked in rather than falling back to a name lookup. The
resolved path is now recorded as `encoderPath`.

The re-encode produced byte-identical output, so only the manifest moved.
@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants