Livepeer Agent · Alpha Field-Test Analysis

Agentic video editing: six reported gaps, one contract failure

A structured analysis of the issues reported in the GTM kickoff → typographic social cut creative brief, verified against the codebase, with a minimal, consistently-scoped proposal for each root cause.

Source report — GTM kickoff cut, two design systems (Cowork, 2026-07-27) Outcome under test — 3 renders shipped, $0.00 network spend Verified againststoryboard-a3 @ origin/main 3980aa10
The reframe

“Zero network spend” is not a saving and it is not six missing features. It is one contract failure wearing six masks.

Almost every primitive the brief needed already exists as computehyperframes-render composites HTML/CSS typography over video; ffmpeg-overlay can place a PiP; the supervision tracker already emits a per-frame sidecar. The agent could not reach them because the capability cards don’t publish enough to plan (which price is real?) or call (what are the parameters?). The dominant fix is to finish the capability contract already half-built on this branch — not to build a compositor.

Contents

1 · Method & scope

The report is an unusually good field test: nothing crashed, the deliverables shipped, and the author did their own root-cause pass. This analysis does three things on top of it:

  1. Verify each reported symptom against source — file and line, not paraphrase — so we separate genuine capability gaps from metadata drift.
  2. Collapse six reported fixes into their true root causes — several are the same underlying problem, and two are not compute problems at all.
  3. Propose one consistent, minimal fix per root cause, sequenced by leverage, explicitly reconciled with the plans already in flight (docs/editing-gaps-plan.md and the capability-standardization effort).

Every claim below was checked in the working tree. Where the report and the code disagree, §7 records the correction.

2 · Symptom → root-cause matrix

The report lists six things to fix. They collapse to four root causes — and the top two are contract/metadata, not missing compute.

Reported symptomVerified?Root causeReal nature
#4 · ffmpeg-overlay metering contradictory — per-second in list_capabilities vs per-call in describe_capability (~1000×) Yes RC-1 Two un-reconciled price sources (live orch vs static mirror)
#5 · hyperframes-render / -caption / ffmpeg-overlay publish no input schema — cannot call without a probing round-trip Yes RC-1 Input schema is an optional field the golden gate ignores
#1 · overlay can’t express a timed, positioned PiP — no start/end, no x/y → 14 scenes for a 17 s brief Yes RC-2 Thin primitive missing 2 params; capable one (hyperframes) unreachable
#2 · No tracking primitive an overlay can bind to — sidecar produced but never consumed as an anchor Yes RC-2 Missing binding contract between two things that already exist
#3 · transcribe(burn) is paragraph-granular, no word split, no type styling Yes RC-3 Shared upstream ASR ceiling + no styled-caption compositor wired
#6 · No colour-grading capability among the 34 tool caps Yes RC-4 Genuinely absent; lowest priority; adjacent family exists

Colour code — RC-1 contract RC-2 composition RC-3 captions RC-4 missing cap. RC-1 accounts for two symptoms and de-risks RC-2 and RC-3, which is why it leads the sequence.

ROOT CAUSE 1CONTRACTHighest leverage

The capability contract has no single, enforced source of truth — for price or for how to call it

What was reported

Metering is off by ~1000×; capability cards publish identity, price and latency but no input schema, so an agent “cannot call it without a probing round trip.”

What is actually true

Both are real, and both are the same class of defect: the card an agent reads is assembled from several hand-maintained sources that are never reconciled, and the one field that would let an agent call a tool cap is optional.

Mechanism — price

Mechanism — invocation schema

Key insight — this is already half-solved on this branch. The standardization effort ships descriptor.ts with an io block (a real per-cap input schema), a two-tier self-validating ToolCapability price shape, and the draft_capability / cap_add authoring path that validate both. The supervision caps missed the input schema precisely because they were added the old way — hand-edited maps + registry.json — bypassing cap_add. The golden gate didn’t catch it because usage is optional. The fix is to finish and enforce what exists, not to invent anything.
ROOT CAUSE 2COMPOSITIONHighest thesis value

The overlay primitive can’t express a timed, positioned, or subject-tracked overlay — yet a compositor that can already exists (and is unreachable, per RC-1)

What was reported

#1 — overlay has five fixed anchors and no start-time or x/y, so a single 8.55 s PiP forces slicing the A-roll into 14 scenes. #2 — nothing binds a tracker to an overlay; “an overlay stuck to a moving subject… was 30 lines of OpenCV locally.”

What is actually true

Both confirmed. overlay is thin wiring; its image branch forwards only corner/center anchor + scale/opacity/padding — no time, no x/y. overlay.ts:21–62,112–119. And the supervision sidecar is produced and even persisted onto the scene blob, but no code reads it back to drive a position.

The narrower truth

The gap is not “we can’t composite.” hyperframes-render takes arbitrary HTML/CSS over a background video (create-media.ts:2670–2687) — it can express timed (CSS animation) and absolutely-positioned typography and PiP. The real gap is: the cheap, discoverable overlay primitive can’t do timed PiP, and the capable one is undiscoverable because it publishes no schema (RC-1). So RC-1 already removes half of RC-2’s pain.

Tension to surface honestly. The tracked-overlay gap (#2) — which the field report calls “the highest-leverage gap for the ‘agents will edit video’ thesis… the demo everyone wants” — is exactly the subject-tracked reframe that docs/editing-gaps-plan.md (PR-3) deferred as over-engineering. A real customer brief just inverted that call. The resolution isn’t “build the big reframe engine”; it’s to ship the narrow anchor contract (sidecar → overlay position) that PR-3 was avoiding, which is far smaller than a general reframe.
ROOT CAUSE 3CAPTIONSShared blocker

No word-level ASR from the network, and no styled caption compositor wired — the same ceiling the plan already hit

What was reported

#3 — transcribe(burn) returns paragraph-granularity styling: no word-level split, no font/fill/stroke/position. “Word timings came from local faster-whisper again. Second confirmation — see LAT-27.”

What is actually true

transcribe takes only source_url, burn, language and forwards wizper’s segment chunks 1:1 to ffmpeg-burn-subtitles with zero styling params. transcribe.ts:25–43,101–115,199. hyperframes-caption is registered but unimplemented (name only, no handler).

This consolidates with a gap the team already spiked. docs/editing-gaps-plan.md PR-1 found per-word filler removal for clean_speech not buildable for one reason: the live ASR (wizper) rejects word-level timestamps, and that restriction lives in the VM-side payment-critical byoc inference-adapter, out of this repo. So word-level captions (#3) and word-level filler removal (PR-1) are blocked by a single upstream limitation. The report’s “word timings came from local faster-whisper again” is the third independent confirmation of the same ceiling. Fix it once and two features unblock.
ROOT CAUSE 4MISSING CAPLowest priority

A genuinely-absent minor cap (colour grade) and the two-step tracking friction

7 · Corrections to the report

The report is accurate on substance. Three details should be corrected so the fixes target the right thing:

8 · Proposal & sequence

One principle, applied consistently: Reconcile and publish the contract first; most gaps then close by making existing compute reachable. Add new parameters only where a primitive is genuinely one field short, and add exactly one small new cap. Reuse hyperframes-render and the existing ASR path rather than building new engines.

S1 · RC-1 Complete the capability contract do first · foundational

S1a

Reconcile price, then guard it. Make the committed mirror’s display_price_usd/unit_kind provably consistent with the live VM CAPABILITIES_JSON, and add a drift check (same class as the existing golden test, but across the static↔live boundary) that fails CI when they disagree. Have describe_capability label its price with source and surface the live figure when it differs. Finishes the two-tier ToolCapability enforcement — no new pricing system. → closes #4.

S1b

Make the invocation schema a required, golden-gated field. Promote usage.inputs / descriptor.io from optional to required for every live tool cap, ideally mirrored from the VM container’s @tool(schema=…) decorator so there is one source. Backfill ffmpeg-overlay, hyperframes-render, hyperframes-caption, supervision-* now — the param names already exist hardcoded and just need lifting. Then describe_capability publishes real params and run_capability can validate. → closes #5; de-risks S2 and S3 by making hyperframes-render callable.

S1c

Route all new caps through cap_add / draft_capability, which already validate io + offering, so a schema-less cap can’t be registered again. The supervision caps bypassed this — that bypass is the regression to close.

S2 · RC-2 Timed / positioned / tracked overlay flagship demo

S2a

Extend overlay’s image branch with start/end (or start+duration) and optional normalized x/y, forwarded to ffmpeg-overlay’s overlay=x:y:enable='between(t,…)'. A bounded param addition, not a compositor. → closes #1; kills the 14-scene workaround.

S2b

Define the anchor contract: let overlay accept track_sidecar_url + track_id, read the per-frame coordinates the supervision sidecar already produces, and emit a time-varying position (ffmpeg sendcmd, or delegate to hyperframes-render with a keyframed absolute position). → closes #2 — the “overlay stuck to a moving subject” demo. Reuses an output that exists today.

✓ SHIPPED ffmpeg-overlay gained a track keyframe param (ffmpeg sendcmd), and overlay accepts track or a track_sidecar_url (+ track_class) that reduces any detector/track sidecar to the path. Deployed + verified live: the overlay follows a moving subject.

S2c

Halve the tracking friction: have analyze_video_tracks auto-chain yolo-detect when detections_url is absent (one call, not two) and correct the availability labeling. Small, honest ergonomics.

S3 · RC-3 Word-level styled captions one upstream unlock

S3a

Unlock word-level timestamps at the VM byoc inference-adapter — the single upstream blocker shared with clean_speech PR-1. It is out-of-repo and payment-adjacent, so scope it carefully, but it unblocks two features, which is why it beats per-feature hacks.

S3b

Implement hyperframes-caption as the styled word-level path (font/fill/stroke/position via HTML/CSS through the existing hyperframes-render compositor), fed by the word timings from S3a, and add a granularity + style passthrough to transcribe(burn). Reuses the compositor — no new typography engine. → closes #3.

S3c

If S3a can’t land soon: document hyperframes-render as the interim type path (as the report suggests) and state honestly that word timings still require local ASR. Don’t mark the gap closed while the ceiling stands.

S4 · RC-4 One small cap, or a stated non-goal lowest priority

S4a

Add ffmpeg-colorgrade (LUT / eq / curves) to the ffmpeg-* tool family — deterministic, cheap, per-call, fits the existing pattern — or explicitly document colour grading as a capture-time non-goal. Either way it becomes stated, not discovered. → closes #6.

Recommended order

S1a + S1b — the contract. Cheapest, additive, already scaffolded; converts several “missing capability” symptoms into “already-capable-and-now-discoverable,” and is a prerequisite for calling hyperframes-render in S2/S3.
S2a — timed / xy overlay. Small param extension; removes the most acute workaround (14 scenes → 1 call).
S2b + S2c — the track anchor. Highest thesis value: the motion-tracked overlay demo. Scoped to the anchor contract, not a reframe engine.
S3a + S3b — word-level captions. One upstream unlock that also clears clean_speech PR-1, then wire the existing compositor.
S4a — colour grade. One cap or a documented non-goal. Do last.

9 · Fit with existing plans

Existing artifactRelationship to this proposal
docs/editing-gaps-plan.md · PR-2 (overlay)This is the overlay the report critiques. S2a/S2b extend it with the timed/tracked parameters it deliberately kept out — a continuation, not a rewrite.
docs/editing-gaps-plan.md · PR-3 (tracked reframe, deferred)The field test elevates this from “deferred over-engineering” to top thesis value. Re-open it scoped to the anchor contract only (S2b), which is much smaller than the general reframe PR-3 was avoiding.
docs/editing-gaps-plan.md · PR-1 (clean_speech)Shares RC-3’s upstream ASR ceiling. S3a is the common unlock; sequence them together.
Capability standardization (descriptor.ts, cap_add, ToolCapability)Already solves the price half of RC-1. S1a enforces it across the static↔live boundary; S1b extends the same standard to the invocation schema, which it does not yet cover. Pure continuation of work in flight.
docs/editing-gaps-plan.md · stale ffmpeg-cutlist referenceMinor: the no-regression section still names a cap the spike killed. Worth a one-line cleanup when PR-1 is next touched.

10 · Anti-over-engineering guardrails

Bottom line. Six reported gaps → four root causes → one dominant fix. The compute to satisfy this brief mostly exists on the network today; the agent couldn’t reach it because the capability cards don’t publish enough to plan or call. Finish the contract already half-built on this branch, add two small overlay parameters and one anchor binding, make one upstream ASR unlock, and add one small cap — and “agentic video editing” goes from $0.00 because nothing was reachable to reachable end-to-end, without building a compositor.

Analysis verified against storyboard-a3 @ origin/main 3980aa10 · worktree branch worktree-gtm-editing-gaps-proposal · 2026-07-27.