Generated study media in the Library (council-gated video MVI) - #3
Merged
Conversation
NotebookLM-generated study aids join the Study Studio behind the 2026-08-12 council architecture: a manifest-driven 'AI aids' Library tab, binaries kept outside git in a local media folder, and a hard transcript gate before anything plays. - studio/src/content/generated-media.json: tracked manifest (id, sha256, source commit 890b294, reviewState) — the only source of servable ids - backend: GET /api/media/status (presence + checksum state) and GET /media/{id}, which serves only manifest-known, reviewed, checksum-clean files from the local media dir (CCA_STUDIO_MEDIA_DIR, default ~/ccaf-media); SPA catch-all now excludes media/ - Library: third tab with provenance notice, truth label ('the notes win'), review-pending and media-not-installed states, captions track, and an always-readable transcript - assets: thumbnail, WebVTT captions, and a hand-corrected Whisper transcript for the 9:24 video overview (reviewState stays 'pending' until the learner's first listen-through confirms it) - GENERATED-MEDIA-NOTICE.md: provenance + license exclusion (media is not covered by the MIT grant; no public redistribution until a documented rights check) - tests: 10 new server tests (unknown id, pending, missing, corrupt, token, SPA shadowing, manifest-asset agreement); Library test covers the honest labels and never-play-unreviewed rule Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- manifest items without a full 64-hex sha256 are rejected outright (fail closed instead of skipping verification) - resolved media paths must stay inside the media directory (symlink confinement), and the checksum TOCTOU trust boundary is documented - pending-state copy now says what actually happens: the player is off and the transcript is shown precisely so human review can happen - GENERATED-MEDIA-NOTICE points at the real manifest path - lint-exam-facts now also scans .vtt captions and generated-media.json - provenance text capped at 65ch per the dyslexia reading standard Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this is
The first council-approved slice of NotebookLM media integration: a new AI aids tab on the Library page, fed by a tracked
generated-media.jsonmanifest, with the 9:24 whole-course video overview as the first item.Council architecture (2026-08-12 Frontier run)
CCA_STUDIO_MEDIA_DIR, default~/ccaf-media); the repo tracks only text: manifest, transcript, VTT captions, thumbnail, notice.reviewState: pending— the backend refuses to serve it and the UI shows an honest 'Review pending' card until the learner's listen-through confirms the transcript. Whisper transcript + captions are already in and lint-clean (all three known corrections are taught correctly in the recording).Tests
Out of scope (council stop-line)
22:41 audio deep-dive, flashcard promotion (50 cards verified separately: 26 pass / 21 rewrite / 3 reject), mind-map UI, slide decks, per-unit media.
🤖 Generated with Claude Code