-
-
The outbound ledger from a run against the live Parallel Search API — provider, request id, response time. No returned page is shown.
-
Measured, not claimed: 34 labelled claims over three passes. 0-1 false confirmations, and the 7 wrongly withheld published beside them.
-
The firewall in the log: CONFIDENTIAL and OFF_THE_RECORD segments are blocked before any search. Nothing sent, no call made, reason given.
-
The caption order sheet that goes to the edit house. Checked against is the column a director fills in by hand at two in the morning.
-
One button, one real run on the night rushes. Four deliverables by morning; nothing on this page is pre-generated.
Inspiration
I direct and produce factual television in Tokyo — the 5-to-15-minute features that fill news and information programmes. The job has a shape that nobody outside it sees: the shoot ends at seven in the evening, and then the director goes home alone with the cards and does three jobs at once. Log what is on them. Check the numbers people said on camera, because a store count or a price that was true on shoot day may not be true on air day. Draft a cut. That is the night, every time, and it is the night before the edit house.
Two things in that night are genuinely dangerous, and both are quiet.
The first is a number that goes to air with nobody behind it. Not a lie — an approximation somebody said in an interview, which becomes a caption because it sounded specific.
The second is worse. In an interview, people say things and then ask you not to use them. "Off the record — we're signing a lease on a second location next month." One remark like that surviving into a timeline is a career-level incident, and the only thing standing between the remark and the edit is a tired person's memory at two in the morning.
Transcription, rough-cut assembly and spoken-claim verification all already exist, as separate products. CurrentCut's contribution is the chain: a confidentiality gate that runs before any search, and then evidence carried from the utterance all the way to the caption order sheet.
What it does
A director drops the night's rushes on the page, presses Run the overnight demo, and goes to bed. By morning there are four things waiting, all generated, all reviewable:
- A source-linked script. Every factual line carries the source it was checked against — or says, in plain words, why it has none. "Checked, but no primary source to credit: the figure stands, the attribution does not." "Their own figure — nobody publishes it. Attribute it to the speaker."
- A rough cut, assembled by FFmpeg, with those captions burnt in.
- A caption order sheet (.xlsx) — the document a director actually emails to the edit house. This is the part that is not obvious unless you have done the job. It adds the column I currently fill in by hand: Checked against, naming the pages each figure was verified against. That is the column a director fills in at two in the morning, and it is now filled in.
- A record of everything held back, with the reason, so nothing disappears silently.
The adoption path is deliberately small. CurrentCut does not ask anyone to replace their editor, their NLE or their edit house. It hands back the same caption order sheet the director already emails in the morning, with the checking column filled in.
The confidentiality firewall is the piece I care most about. Every segment is labelled PUBLIC / EDITORIAL_ONLY / CONFIDENTIAL / OFF_THE_RECORD / PERSONAL_DATA / NEEDS_HUMAN_REVIEW before any search runs. Gemini proposes a label; a deterministic rule layer may only make a label stricter, never looser, and uncertainty fails closed. Every outbound query passes through one choke point that refuses restricted labels, unapproved claims, and any query containing raw transcript text — and every attempt, allowed or blocked, is written to an egress ledger before it is sent and again when it returns. Nothing is deleted on the director's behalf: material that was held back is listed, with its reason, for a human to release by name.
How I built it
One ADK agent (LlmAgent) runs seven tools in a fixed order:
Gemini video understanding
→ confidentiality gate (labels every segment; nothing has been searched yet)
→ claim extraction (self-contained claims only)
→ Parallel Search API (only for claims the gate cleared)
→ scriptwriter (source-linked lines)
→ caption order sheet (.xlsx for the edit house)
→ FFmpeg rough cut
The fixed order is the point, not a limitation. The gate runs before retrieval every time and nothing can route around it. When the model's tool loop fails — and it does, intermittently, by prefixing tool names with the app name — the same seven steps run in the same order in code, and the trace records both the failure and the fallback rather than quietly substituting one for the other.
| Capability | Service | Where in code |
|---|---|---|
| Video/audio understanding | Gemini (google-genai) |
services/agent/app/clients/gemini_client.py |
| Agent orchestration | Google ADK (google-adk) |
services/agent/app/adk_pipeline.py |
| Live web verification | Parallel Search API (parallel-web) |
services/agent/app/clients/parallel_client.py |
| Cutting and rendering (non-AI) | FFmpeg | services/agent/app/agents/rough_cut.py |
Hosted on Cloud Run, keys in Secret Manager. No AI service outside Google and Parallel is called at runtime.
Why Parallel is load-bearing rather than decorative. The product's promise is that a line either names the page it was checked against or explains its absence. That is a retrieval problem with an unusual requirement: the answer "nothing supports this" has to be trustworthy, because it is printed on the sheet and a director acts on it. Two things follow. Queries name the body that would publish the figure, not just the figure (federal minimum wage $7.25 an hour | US Department of Labor federal minimum wage), and excerpts are requested long enough to actually contain a number — with the default budget the pages came back at 42–299 characters and the figures simply were not in them.
How support is decided. A retrieved page supports a claim only when entity, attribute and value all match (app/agents/evidence.py). This is why the extractor is required to produce self-contained claims: "the price is ¥1,980" would verify against any page containing those digits — an early version credited a Fire TV Stick sale — so the subject is restored before anything is searched. A single non-primary source is not enough to call a figure confirmed, and a measured value more than three years old does not confirm a present-tense claim, while a rule that is in force until changed (a tax rate, a statutory minimum) is not stale merely because it was set years ago.
Challenges I ran into
"No confirmations" turned out to be four separate bugs, not one flaky model. Runs kept producing zero verified claims and it looked like variance. Measuring instead of guessing found: statutory figures misfiled as the speaker's own private numbers, so they were never searched at all; excerpt budgets too small to contain a number; a batch-alignment bug that threw away every verdict the model returned without an index; and transient API errors displayed identically to "nothing backs this". Confirmed claims went from 0, 0, 0 to 2–3 every run.
The confidentiality gate blocked every legitimate English query. It tested for a 12-character overlap with the transcript — a phrase in Japanese, but federal minim is 13 characters in English. Three lawful public-record claims went unverified while the log recorded a leak that had not happened. Japanese now measures characters and English measures five consecutive words.
Splitting off-record sentences was a mistake, and I removed my own feature. I had built something that kept the clean part of a segment and dropped the restricted sentence. It loosened the firewall: "Off the record, we're signing a lease next month. It hasn't been announced." — the second sentence carries no marker, so it survived. The boundary is a judgement about topic, not about where the marker sits. Now, if any part of a segment is restricted the whole segment stops, a suggested per-sentence reading is offered as a proposal with its timings marked as estimates, and release requires a named human.
Nobody says "off the record". They say "this stays between us", "don't use that", "keep that out", 「今のはナシで」, 「放送では使わないで」. The detector is deliberately wide, because a false positive costs one click and a miss puts on air something a person asked you not to broadcast.
A defect I only found by opening the finished artefact. A data caption row said "do not use this figure", and the quote-follow row one line below — the same sentence, in the speaker's own words — said "as recorded" with no note at all. An edit house works down that sheet one row at a time. The judgement and the sentence had come apart. Rows now name the row that holds the verdict: "Same figure as No.13 — follow the note on that row."
Accomplishments that I'm proud of
The failures are published next to the headline. eval/measured.md holds 34 labelled claims judged over three consecutive passes with a real model: 0–1 false confirmations, and 7 claim lines wrongly withheld — the same seven every pass, and six of those seven are one approximate figure in different wordings. A checker that confirms nothing scores a perfect zero on false confirmations, so the two numbers only mean anything together. The open defect is named rather than averaged away.
The button runs the pipeline; it does not replay a recording. Every artefact you can download after a run was made by that run, against the bundled footage. Measured wall-clock from click to finished artefacts on the demo shoot: 192 seconds. A night's rushes take longer and are read in parallel pieces.
The caption order sheet. Of everything here, this is the piece that says the problem is understood from the inside. It is the real document, in the real format — the shoot's own language, two lines maximum, a figure never broken across a line break, a name super shown once per speaker rather than on every line, and, on a Japanese sheet, thirteen characters a line and no punctuation — with one column added that no such sheet has ever had.
What I learned
The model proposes; code decides. Every safety property that survived contact with real runs is enforced deterministically. Gemini once mis-heard "off the record" as a nonsense word and the rule layer still caught the segment, because the rule layer was not asking the model for permission.
A claim without a subject will match anything. "The price is ¥1,980" is not a claim, it is a number looking for a home.
"Fixed" is a claim about the artefact, not about the commit. The chain-of-custody fix was in the code and the tests were green, and the finished demo film still showed the broken sheet — because that still had been captured thirty-seven minutes before the fix landed. The only reliable check is to open the thing you are about to ship.
What's next for CurrentCut
- Ingest that runs while the director sleeps — a watch folder or resumable upload, rather than a browser holding several gigabytes.
- A cheap first pass that finds speech, so the detailed read only covers the parts that carry it.
- Learning a programme's house structure from its own past scripts (implemented, not yet proven at scale): the sheet already names the beats a corner usually has and flags the ones with no footage — "no material; this corner usually runs about fifteen seconds of exterior here" — while there is still time to go and shoot it.
- An approximation tolerance. Six of the seven misses are one hedged figure ("about 56,000 stores" against a retrieved 55,979). A claim hedged by its speaker should be checked against the tolerance the speaker actually stated.
Where this sits against what already exists
Transcript-driven editing, searchable rushes, timecoded scripts, EDL export and agentic assembly all ship today — Trint's Story Builder, Descript's Underlord, Avid PhraseFind AI, Adobe Premiere's Media Intelligence, Axle AI. Verification of spoken claims against sources ships too: Factiverse does exactly that. What none of them do is carry a verdict along the whole chain — utterance → timecode → claim → evidence → script line → caption → the sheet that goes to the edit house — or decide, before any of it, what is not allowed to leave the room. The claim here is about the chain, not about any single link in it.
About the demo material
The interview footage is generated with Veo — no real people, nothing that needs a release. For this published video, the pages the search returns are invented, on reserved .example domains that can never resolve to a real site, following the organisers' guidance that published material should not show third-party names, titles or URLs returned by live search. Everything else is the code running: the same pipeline, the same gate, the same sheet. The hosted app calls the live Parallel Search API, and the film shows one shot of that — the outbound ledger with provider: parallel, the request id and the response time — with no returned page on screen. The queries the system sends do name real publishing bodies, because naming the body that publishes a figure is how the search is supposed to work.
Log in or sign up for Devpost to join the conversation.