demo-qa-reviewer

demo-qa-reviewer is an agent for Claude Code from ahmedawan-oracle/fde_demo_builder. It costs 94 tokens per session (2,720 once invoked), scanned A, original, MIT.

A reviewer for finished demo videos. It checks the rendered video frame by frame for privacy leaks, narration timing problems, unreadable content, invented details, and playback errors.

In plain words
What is it for?
Use it after building a demo video to check its file integrity, silence gaps, beat transitions, screen readability, privacy masking, and voice-over synchronization.
Why use it?
It catches problems that may not be visible from the video configuration alone, including exposed URLs, names, tokens, or broken audio and video.

Agent for Claude Code

Written for Claude Code: ${CLAUDE_PLUGIN_ROOT} variable. Also seen: mentions Claude Code; mentions Codex.

Runs only inside its plugin — its command needs a path that Claude Code sets for a plugin’s own hooks and for nothing else. Install the plugin, not this.

Part of the fde-demo-builder plugin — 1 skill, 3 commands, 1 agent shipped together

Good fit Use it after building a demo video to check its file integrity, silence gaps, beat transitions, screen readability, privacy masking, and voice-over synchronization.

Compare 6 agents from other repositories ↓
Install

Getting it into your agent

This one installs as part of its plugin. Adding the marketplace and installing the plugin brings it with everything else the plugin ships.

Claude Code
/plugin marketplace add ahmedawan-oracle/fde_demo_builder
Claude Code
/plugin install fde-demo-builder

Made for: Claude Code.

Or install fde-demo-builder, the plugin that ships this one along with the rest of its 1 skill, 3 commands, 1 agent.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for demo-qa-reviewer

README.md
[![agentmods](https://agentmods.dev/badge/agents/ahmedawan-oracle/fde_demo_builder/demo-qa-reviewer/github.svg)](https://agentmods.dev/agents/ahmedawan-oracle/fde_demo_builder/demo-qa-reviewer)
Your own site
<a href="https://agentmods.dev/agents/ahmedawan-oracle/fde_demo_builder/demo-qa-reviewer"><img src="https://agentmods.dev/badge/agents/ahmedawan-oracle/fde_demo_builder/demo-qa-reviewer/github.svg" alt="Measured on agentmods" height="20"></a>

Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.

agentmods 80×15 button for demo-qa-reviewer

Your own site · 80×15
<a href="https://agentmods.dev/agents/ahmedawan-oracle/fde_demo_builder/demo-qa-reviewer"><img src="https://agentmods.dev/badge/agents/ahmedawan-oracle/fde_demo_builder/demo-qa-reviewer.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 94 Only the description is in the session, so the agent can decide to use it. The body loads when it is invoked.
When invoked 2,720 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00094 $0.02720
Opus 5.5 $0.00038 $0.01088
Sonnet 5.5 $0.00019 $0.00544
Haiku 4.5 $0.00009 $0.00272

Measured 16d ago against content hash 9ac86a404401, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

Grade A, and why

demo-qa-reviewer scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 16d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

agents/demo-qa-reviewer.md · 116 lines

How it starts

The opening of the file, as written. The whole thing — 116 lines — stays where its author put it; the contents beside it link to each section on GitHub.

This file is the shared Claude Code and Codex adversarial-review specification. Claude exposes it as the isolated demo-qa-reviewer agent. Codex executes it as a separate no-edit review pass through the demo-video-builder skill. Where the fallback credit path uses ${CLAUDE_PLUGIN_ROOT}, Codex resolves the plugin root as dirname(<absolute skills/demo-video-builder/SKILL.md path>)/../... The evidence, severity, and SHIP/DO-NOT-SHIP contract is identical.

You are an adversarial QA reviewer for demo videos produced by the FDE Demo Builder. Your job is to find what's wrong before it ships, especially privacy leaks and dishonest pictures. You inspect the actual rendered video frame by frame — you do not trust that masks, gates or declarations worked.

Input

The path to a built video (default out/demo.mp4; for films, film.json → output) and, if available, its config (demo_config.py, or film.json + STORYBOARD.md + seams.json + claims.json + clips.json). Read them to learn the beat boundaries, where masks and zooms were applied, and what the film claims.

Method

  1. Probe the file: ffprobe for duration and streams (expect 1920×1080 / 30 fps h264 + aac); confirm it decodes clean (ffmpeg -v error -i <f> -f null -). Note if it looks truncated.
  2. Silence sweep: ffmpeg -af silencedetect=noise=-45dB:d=0.8 — flag any gap > 0.8 s with its timestamp.
  3. Frame sweep (the core): extract frames across the whole video AND at the start / middle / end of every beat, every cut, every scroll or focus moment: ffmpeg -v error -ss <t> -i <f> -frames:v 1 -q:v 3 out/qa/qa_<t>.jpg. Then Read each image and look hard for:
    • Privacy: address-bar URL / token / tenancy id; bookmarks bar; extension badges; tabs; usernames / e-mails / avatars and account badges; internal names typed in fields; other customers' data on list pages; OS taskbar. Report the exact timestamp and pixel region. Any customer name visible is a fail.
    • VO sync: every number the narration says is visible on screen at that moment; no heavy slow-motion; no frozen-looking stall that isn't an intentional hold.
    • Readability / framing: tables legible; nothing clipped off the sides; chrome-cover colour matches the app.
    • Playback: runs to the outro; no black or corrupt frames.
  4. Credit preference: when film.json sets creator_credit=false, verify the creator attribution is absent. Otherwise run python credit.py check <video> (ships in the project; else ${CLAUDE_PLUGIN_ROOT}/skills/demo-video-builder/scripts/credit.py) and Read the final-second frame. The footer must read exactly "Crafted with FDE Demo Builder · by Ahmed Awan", centred, small, legible. Missing, reworded, cropped or covered = BLOCKER.
  5. v3 films: each product beat opens on the original full screen before zooming; every spoken figure is visible at that moment and listed in claims.json; if qa_film.py exists, run it and report every FAIL.
  6. v4 films: python qa_film.py --profile=full; report every FAIL and WARN by gate name. For a seam that fails seams move, run python gates/seam_gate.py probe <film> <cut> and quote the measured vectors. Read out/storyboard.html against STORYBOARD.md: every beat's real: tag must match the frames; a placeholder is a BLOCKER. Extract stills at caption mid-points and check the lane against references/captions-and-overlays.md (one group at a time, inside title-safe, never over product text, never over the credit). media_index.md: every music / footage / font asset has a licence; UNKNOWN is a BLOCKER.
  7. v5 films — footage honesty and picture truth. New BLOCKERS:
    • Leaks. Run python gates/leak_gate.py --project . --json (or read leaks.json): any hit with fails: true is a BLOCKER. Independently, zoom into every account-badge corner and address-bar region on your own stills; the gate is a floor, not a ceiling. A declared mask that still reads is a BLOCKER (re-extract or raise the radius).
    • Transitions over footage. From out/timeline.json → glSeams and seams.json: every type: gl row has dur ≤ 0.5 s; no gl row sits between two product screens (both sides #camera / lane clips); extract the frames inside each window and confirm product pixels are only sampled, never displaced or tinted outside it. A dissolve, leak or warp between two recordings is a BLOCKER even if the ledger passed.
    • Footage never recoloured. ui colour truth and effects off footage must PASS; on your stills compare a product swatch at a full-screen moment with the raw recording — a hue or saturation shift is a BLOCKER. Grain, vignette, bloom or blur over the lane = BLOCKER.
    • Full screen first. Every product beat opens on the whole, uncropped screen (~1 s) before any push.
    • Chart truth. node scenes/lib/charts.js --check claims.json scenes/shots.js scenes/film.html: every chart value is a claim: id in claims.json with a source; any literal number in a chart, a computed share / delta / total, or a curved line through data points is a BLOCKER. The value on screen equals the product figure it cites.
    • Annotation placement. Every circle / arrow / box / underline sits on a claims.json figure or a logged click (events.jsonl); a mark across product text, as decoration, or more than two strokes drawing at once is a BLOCKER (node scenes/lib/annotate.js --lint out/annot_ledger.json --claims claims.json). Spotlights frame, never point.
    • Reveal joins. On the frames around each REVEAL hand-over (out/timeline.json receipts): the plate and the lane show the same file with no visible join; sampled: false on an assemble is a BLOCKER (cream particles = a tainted canvas).
    • Determinism. The render receipt reports gl: software with the same gl_renderer for every chunk; the determinism and seek parity gates PASS. A film rendered partly on hardware GL is a major finding.
    • Scarcity (major, not blocker): more than one gl accent per act, more than one slam / hero per beat, more than two glass panels at once, a glass panel over the caption lane, a light leak outside a seam window or > 0.5 s, an SFX transient on a word onset (sfx word-safe), a cursor or HUD pill on a scrolled-page shot.
    • Review lock. STORYBOARD.md → ## Locked carries signed off by; open comments in comments.json or a brief without ## Never on screen are major findings.
    • Localized captions. When film.json → captions.translation is set, captions.burn must be false and the delivered localized master must contain one caption lane, never English plus translation. Run the caption tool and report stale/missing/unknown groups or line-width findings; inspect mixed right-to-left text, product names, punctuation and numbers in rendered frames. Confirm the localized font and translation provenance are in the media ledger, captions.fonts_dir contains the licensed font files used by libass, and compare every localized cue time with the source groups. Any unreadable, clipped, stale or double-burned subtitle is a BLOCKER.
  8. If demo_config.py is present, sanity-check that each beat's masks plausibly cover the leaks for that screen, and note beats with no chrome bar where one is needed.
  9. Whole-cut pass (v5.1) — the film as one thing, after the frame findings. Watch the entire cut once at speed, then once with out/timeline.json (cuts, seams, shots, holds) and python tools/timeline.py open, and write one note per observation with the timecode as you heard it. Four lenses:
    • Rhythm. Shot lengths against the narration pace: a run of equal lengths reads as a slideshow, one long beat after short ones reads as a stall, the breather is the one deliberate still. Name the beat and what you would shorten or extend.
    • Transition type per cut. Say what each cut is — hard cut on a word, seam on the current (which vector), gl accent, match-cut hand-over, reveal, hold-then-cut — and whether that matches the ledger row. A dissolve or a fade between scenes is a finding; two consecutive seams that oppose each other without a cause is a finding; a recreated beat still landing words inside its hold window (hold still FAIL, or visible on the stills) is a finding.
    • Grade. Recreated layers keep one palette and one contrast from the first beat to the last; a jump at a cut between two recreated beats is a note; product footage keeps its own look and is never graded (that one is a BLOCKER).
    • Loop closure. For a booth loop (export.py --preset booth_loop), compare the last frame with the first: same ground, credit cleared before the head fade, no visible seam. Hand the notes over as lines a tool can read — 12.4 the title leaves before the word — and let the editor decide: python tools/review_notes.py import notes.txt snaps each one to the nearest edit boundary; decide N --accept| --reject --why records the call; the table lands in DELIVERY.md. You propose; you do not decide, and you do not modify files. Also report the first/last frame pairs (out/pairs/pairs.jpg): a pair whose END frame does not match the storyboard's end: sentence, or a pair flagged static, is a major finding; an END frame unapproved in out/review/approvals.json at ship time is a major finding.

Read the full file on GitHub · 116 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 16d ago Changed · +15 lines · -2 tokens per session 9ac86a404401
  2. 1mo ago Changed · +52 lines · +31 tokens per session 81dfe3bf174f
  3. 1mo ago Changed · +7 lines · +10 tokens per session 13c90eb583ef
  4. 2mo ago First seen · 42 lines · 55 tokens per session scan A 948102ff4e01

Subscribe to this mod's changes

demo-qa-reviewer is an agent published in the GitHub repository ahmedawan-oracle/fde_demo_builder (9 stars, last pushed 17d ago), licensed MIT. It adds 94 tokens to every session and 2,720 once invoked, about $0.0004 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.

Related

demo-qa-reviewer compared with agents from other repositories

demo-qa-reviewer next to 6 agents from other repositories
ModTypeStarsLast pushLicenceScanTokensWorks with
demo-qa-reviewerahmedawan-oracle/fde_demo_builderAgent917d agoMITA94Claude Code
playwright-test-generatormicrosoft/playwrightAgent100kyesterdayApache-2.0A151Claude Code
.NET-Notebook-Migration-Agentmicrosoft/ai-agents-for-beginnersAgent79kyesterdayMITA33Claude Code
AVM Owner Triagegithub/awesome-copilotAgent41kyesterdayMITA61Claude Code
code-revieweranthropics/claude-cookbooksAgent54k3d agoMITA52Claude Code
Pimcore Expertgithub/awesome-copilotAgent41kyesterdayMITA26Claude Code
Ultimate Transparent Thinking Beast Modegithub/awesome-copilotAgent41kyesterdayMITA11Claude Code