Skip to content

Report audio that outlives the video; scope the cover family to the delivered opening - #24

Merged
leochenpm merged 3 commits into
sync/production-previewfrom
sync/delivery-qa-gaps
Aug 12, 2026
Merged

Report audio that outlives the video; scope the cover family to the delivered opening#24
leochenpm merged 3 commits into
sync/production-previewfrom
sync/delivery-qa-gaps

Conversation

@leochenpm

Copy link
Copy Markdown
Collaborator

Batch 11 of the release_1.6.5 sync. Stacked on #23. Re-mapped from Orkas f7668adb6 (adapted — see below) and the cover-scoping half of 274678ccf/bafbdcda8.

1. The mix's A/V mismatch, reported honestly

Upstream hard-fails a mix that TRUNCATES narration — its filter uses -shortest, so an over-long track really loses audio. Porting that verbatim would assert a falsehood here: OSS's mix has no -shortest and amix runs to the longest input, so the failure shape is the opposite — the written file carries audio past the video's end, playing over a frozen or absent picture. Now:

  • mix() probes its own output and reports av_mismatch { video_duration_sec, audio_duration_sec, audio_overrun_sec } past 0.3s, with a plain-language warning appended to the coverage report.
  • The coverage over message stops claiming "will be truncated" — a claim the real-ffmpeg test proves false.
  • stage-assemble tier 3 names the rule: never deliver a file whose sound outlives its picture.

2. The cover family belongs to the delivered opening

Cover semantics are a whole-video property — frame 0 of the delivered video is its poster — yet every AUTO middle segment was cover-blocked (COVER_CONTRACT_INCOMPLETE, rendered cover checks, EMPTY_HOOK_FRAME) over a poster it will never be. ovs draft --not-opening (MCP not_opening):

  • skips the cover contract in designContractIssues and the rendered cover checks in runContractHtmlQa;
  • keeps blank-frame integrity: the first-frame label downgrades from EMPTY_HOOK_FRAME to BLANK_SAMPLE_FRAME but stays an error — a blank first frame on a middle segment is a visible gap at the cut;
  • stage-assemble passes the flag for every non-opening compose child.

Deliberately not ported

The narration-map audio-coverage check (upstream NARRATION_MAP_AUDIO_COVERAGE_INCOMPLETE): narration-map.json has no writer anywhere in OSS — a check against fields nobody produces is dead code. It needs the map writer first; recorded as the follow-on.

Verification

Full OVS_E2E=1 suite 287/288. Real ffmpeg: a 4s tone on a 2s base → over + av_mismatch.audio_overrun_sec > 1, warning says "outlives its video", and no "truncated" claim. Unit: cover family skipped for non-opening while non-cover gaps still block. Draft integration: the same missing-cover contract blocks as the opening and moves past the design gate as a middle segment.

🤖 Generated with Claude Code

https://claude.ai/code/session_01VL7mRpmEphLAbcH7YmABnV

leochenpm and others added 2 commits August 12, 2026 11:29
… cover family to the delivered opening

Sync of the two remaining delivery-QA gaps from Orkas release_1.6.5
(f7668adb6 adapted, 274678ccf/bafbdcda8 cover scoping), each reshaped
to what OSS's pipeline actually does:

- mix A/V mismatch: upstream hard-fails on TRUNCATED narration because
  its mix uses -shortest. OSS's mix has no -shortest and amix runs to
  the longest input, so the failure shape here is the opposite — the
  written file carries audio past the video's end (sound over a frozen
  or absent picture). mix() now probes its own OUTPUT and reports
  av_mismatch {video/audio/overrun} past 0.3s, appends a plain-language
  warning, and the coverage 'over' message stops claiming a truncation
  that never happens. stage-assemble tier 3 names the rule: never
  deliver a file whose sound outlives its picture.
- Cover family scoped to the delivered opening: cover semantics are a
  whole-video property — frame 0 of the DELIVERED video is its poster —
  yet every AUTO middle segment was cover-blocked over a poster it will
  never be. `ovs draft --not-opening` (MCP not_opening) skips the cover
  contract in designContractIssues, the rendered cover checks in
  runContractHtmlQa, and downgrades the first-frame label from
  EMPTY_HOOK_FRAME to BLANK_SAMPLE_FRAME — still an error, because a
  blank first frame on a middle segment is a visible gap at the cut.
  stage-assemble passes the flag for every non-opening compose child.

Deliberately NOT ported (again, with the reason recorded): the
narration-map audio-coverage check (D22) — narration-map.json has no
writer anywhere in OSS, so a check against fields nobody produces would
be dead code; it needs the map writer first.

Verified: full OVS_E2E=1 suite 287/288. Real-ffmpeg case proves the
overrun file is written and reported ('over' + av_mismatch, no
"truncated" claim); unit cases pin cover-family skip vs non-cover gaps
for non-opening segments; a draft integration shows the middle segment
moving past E_DESIGN_CONTRACT_BLOCKED to the next real gate while the
opening posture still blocks.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VL7mRpmEphLAbcH7YmABnV
Bumps the pinned render backend (packages/tools dependency, the npx
fallback spec in DEFAULT_HYPERFRAMES_SPEC, and the README mentions).

Compatibility verified against everything OSS actually invokes:
- Full OVS_E2E=1 suite 287/288 green, including the real hyperframes
  render e2e and the draft pipeline.
- Real `ovs snapshot` end-to-end on 0.7.106: the frame naming contract
  (`frame-<NN>-at-<T>s.png`, index-ordered), contact-sheet.jpg, multi
  `--at`, and `--describe false` all behave as the preview-evidence
  code assumes.
- Every flag OSS passes still exists (snapshot --at/--describe/
  --output, render --output/--quality, check --json, lint); the
  check --json section shape is unchanged, so the draft disposition
  parser keeps working.

Capability probe (the reason this upgrade was tried first): 0.7.106
still exposes NO deterministic per-element visibility evidence. The
pinned-scene fixture (`#scene-hook{opacity:1!important}` overlaying
every later scene) passes `check --json` with ok:true and zero
findings, exactly as on 0.7.60; `inspect` is a deprecated overflow
checker; `snapshot --describe` remains Gemini-vision (non-deterministic,
needs GEMINI_API_KEY). Building the INACTIVE_SCENE_VISIBLE-class
checks therefore still requires a headless-browser DOM sampler — a
separate dependency decision, not part of this bump.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VL7mRpmEphLAbcH7YmABnV
Upgrade hyperframes 0.7.60 → 0.7.106
@leochenpm
leochenpm merged commit e6cf46f into sync/production-preview Aug 12, 2026
1 check passed
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.

1 participant