1. Action-group classifier conflated object-touches and person-touches.
"man touches the red door with a small object" was being tagged as
forehead_touch because "touch" was in the forehead_touch needles set.
That made the realign pass yank Beat 16 from scene 451 (correct: man
painting red door, IV stand) over to scene 623 (woman/man in bed) —
a totally wrong shot at score 0.344.
Fix: removed generic "touch*" verbs from forehead_touch's needle set.
forehead_touch is now added in _semantic_action_groups() only when a
touch verb is paired with an explicit body-part target (forehead,
face, cheek, head, hand, ...) and not paired with an object target
(door, handle, brush, tool, lock, ...).
Effect on Beat 16 after `match --beat 16 --vision`:
scene 623 in=5476.28 score=0.344 -> scene 451 in=3912.48 score=0.626.
2. Cutter-report stills/clips were keyed by source-video mtime, so a
match-position change without a video change served stale frames from
the previous match. Dropped the mtime cache; both extractors now
render fresh every time. Slower (~minute per full regen) but correct.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The legacy HTML report under output/report/ (match_report.html plus per-beat
ref/src/compare MP4s) is now part of the repository so the remote always
shows the latest preview state. Added gitignore exception. Total ~26 MB on
disk; comparable to the cutter_clips assets we already track.
Auto-regenerated on every match command via _regenerate_cutter_report, so
this stays in sync without manual intervention.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1. Cutter-report source clip for multi-segment beats was using only the
primary in/out, which equals the FIRST segment's range. Beat 10 with
3 shots therefore showed only ~0.88 s of source instead of all 3.32 s.
Added extract_concat_clip(): renders each segment as its own MP4 and
concatenates them via ffmpeg's concat demuxer into one continuous
source clip the same length as the trailer beat.
Per-segment intermediate clips (beat_NN_source_seg00.mp4 etc.) are
kept too so individual shots stay inspectable.
2. _regenerate_cutter_report now also regenerates the legacy
output/report/match_report.html via src.pipeline.reporter.generate_report.
Both reports stay in sync after every match command.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Bug: the report rendered every preview clip at most 3 s, so any beat longer
than 3 s (e.g. beat 02 at 8.56 s) only got a fragment in the cutter report
and looked wrong. The hard 3 s cap was an early prototype constant that
silently truncated normal-length beats.
Trailer clip is now the full beat duration so the cutter sees the entire
reference beat. Source clip is the full matched duration (may be shorter
than the beat when the match drops before the beat ends — that's correct,
the cutter needs to see exactly the matched span).
A 30 s safety cap stays as a guard against runaway durations but it should
never trip on a normal trailer beat.
All existing clips were dropped and re-rendered so the report on disk
matches the new logic.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Refreshed CUTTER_REPORT.{md,html} plus stills and clips from the latest
match cache. Notable changes vs prior cache:
- 6 confirmed (was 5): newly confirmed beats 2, 9, 12, 17 (beat 8 lost
confirmed status, beat 18 lost match entirely; both will be addressed
per-beat).
- Beat 2: previously unmatched -> scene 3 in=35.190s score 0.761 (OK).
- Beat 20: scene 613 in=5284.706s score 0.663 (OK), correct phase via
recovery.
- Beats 21, 23: previously unmatched -> now provisional via recovery.
- Beat 18: regression, currently MAN. (was confirmed before).
- Beat 24: still MAN. (end credits, expected).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- cli.py auto-regen now produces video clips on every match (no opt-in
flag). Best presentation comes first; speed cost (~minutes per match)
is accepted.
- output/cutter_stills/ and output/cutter_clips/ are no longer gitignored.
All 45 stills and 45 short MP4 previews are committed alongside the
CUTTER_REPORT.{md,html} so the remote repo always shows the current
state — even when the report files are inspected without running the
generator.
- Other output/ contents (FCPXML, EDL, debug folders, HTML report) stay
ignored.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>