Skip to content

feat(enrich): video frame descriptions + full transcript into enrich#75

Merged
VGonPa merged 1 commit into
developfrom
feat/enrich-video-content
Jul 5, 2026
Merged

feat(enrich): video frame descriptions + full transcript into enrich#75
VGonPa merged 1 commit into
developfrom
feat/enrich-video-content

Conversation

@VGonPa

@VGonPa VGonPa commented Jul 5, 2026

Copy link
Copy Markdown
Owner

What

Make digested videos get the same treatment as text: a content-based summary + topic assignment grounded in what the video says (ASR) and what it shows (frame descriptions).

The gap (verified in code)

A digested video carries a full transcript and per-frame descriptions, but enrich only saw a 12k-truncated transcript and never the frame descriptions (those live on x_video.frames[].description, a different field from the MediaPhotoDescribed photo descriptions). So slide/screen-share videos with no speech contributed zero content signal → tweet-only summary/topics.

Change

  • New shared _video_frame_descriptions(item) helper (executors/api.py), threaded into both enrich engines:
    • api prompt: a Video frames (slides/screens shown) block, bounded by the new FRAME_DESC_CHAR_LIMIT with a [… N further frames omitted …] marker.
    • worksheet (manual/claude-code): video_frame_descriptions field (all frames).
  • A mute screen-share video now contributes visual topic signal even with has_speech=False.
  • The worksheet carries the FULL transcript (judged by a full-context agent, so summary/topics aren't front-biased to the first ~13 min); the api engine keeps its TRANSCRIPT_CHAR_LIMIT bound. The two engines diverge on input size by design (documented).

Why now

Unblocks the backfill of the 433 pending-enrich items (217 videos) via the worksheet engine ("our Claude") — see plan zz-support-files/docs/implementation-plans/video-content-enrich.md.

Tests

  • api: frames section present/absent/bounded/ordering + frames present when no speech.
  • worksheet: frame descriptions field + full (untruncated) transcript (replaces the old truncation test — intentional behaviour change).

Gate

✅ 1107 tests · 95% cov · ruff/format/mypy/radon/bandit/vulture/interrogate/deptry all green.

🤖 Generated with Claude Code

…rich

Digested videos now contribute what they SHOW (key-frame descriptions) and the
FULL spoken transcript to the summary/topics enrichment — not just a 12k-truncated
transcript with frames ignored.

- New shared `_video_frame_descriptions` helper (executors/api.py), threaded into
  both the api prompt (bounded by the new FRAME_DESC_CHAR_LIMIT, with a "frames
  omitted" marker) and the manual/claude-code worksheet (all frames). A mute
  screen-share video now contributes visual topic signal even with no speech.
- The worksheet carries the FULL transcript (agent-judged, full context); the api
  engine keeps its TRANSCRIPT_CHAR_LIMIT bound. The two engines diverge on input
  size by design.

Closes the "digested videos get a tweet-only summary" gap for the worksheet
backfill. Gate green: 1107 tests, 95% cov.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@VGonPa VGonPa merged commit 7c5fc87 into develop Jul 5, 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