generate_cutter_report.py:
- Frame-Locked Compare video (trailer left / source right, single MP4) per
beat replaces two separate side-by-side clips; rendered via accurate
double-seek + black-fill segmented source reconstruction
- Generation timestamp now includes HH:MM:SS (Uhrzeit-Angabe)
- Per-beat segment list for multi-shot beats (TC, duration, offset, scene,
score per segment)
- Score warning badge (yellow) if score < 0.65
- python cli.py rematch --beat N command hint in every card
- Overview table links to each beat card via #anchor
- Cleaner dark/light CSS using design tokens (--fg/--bg/--card/--bd)
- --no-clips flag (replaces --with-clips; default is now with clips)
cli.py:
- _auto_commit_push_reports(): after every report regeneration, stages the
report output files (CUTTER_REPORT.*, output/cutter_clips/, output/report/)
and auto-commits + pushes to origin/main so remote is always current
- Removed the legacy match_report.html call from _regenerate_cutter_report
(CUTTER_REPORT now supersedes it)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Actor-focused multi-frame temporal scan showed the correct action phase
(left woman back to camera, right woman in profile) at t=2618.8s vs
the previously used 2615.5s where both women were in different positions.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Template scan of entire source found the knife/letter-opener close-up at
t=130-133s in the film (scene 17, 127.76-133.04s). Previous wrong match was
pointing at scene 309 (the coffee/window scene) for both shots because the
strong continuity seed from beat 14 overwhelmed the global search.
Two-segment provisional match written to cache manually:
seg[0] knife: scene 17 in=130.32s dur=2.80s score=0.72 (confirmed)
seg[1] coffee: scene 309 in=2615.52s dur=1.28s score=0.38 (provisional)
Regenerated CUTTER_REPORT and match_report with correct beat 15 clips/stills.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- config.toml: revert scoreable_luma/contrast thresholds to 24/58/24 (lowering
them let cross-fade blend frames contaminate content-validation templates,
dropping scores below provisional_content_threshold)
- src/cv/global_scan.py: _is_dark_reference_frame now requires contrast<30 so
genuine dark silhouette frames are not rejected as scoreable; two-path
_is_scoreable_reference_frame separates standard vs fade-content scoring
- cli.py: _keeps_cached_match() guard prevents a weaker single-span rematch
from overwriting a better multi-segment provisional cache entry
- cli.py: _fade_content_shots() restricted to between-island gaps only—
pre-island black leaders were incorrectly emitted as matchable shots
- cli.py: island[0] of _match_unmatched_visual_segments() now uses no
continuity seed so an insert cut at the start of a multi-shot beat is not
forced toward the previous beat's scene
- scripts/generate_cutter_report.py: fix ffmpeg concat demuxer on Windows—
use part.absolute().as_posix() so paths in the concat txt are absolute and
not double-resolved relative to the concat file's directory
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>