calesthio/generated-media-qa
Provider-independent quality assurance for AI-generated and AI-assisted media. Use when reviewing, accepting, revising, or reporting on images, video, audio, avatars, ads, product content, social clips, explainers, localization, mixed-source edits, captions, accessibility, provenance, model metadata, safety/policy, and delivery readiness.
npx skills add https://github.com/calesthio/generative-media-skills --skill generated-media-qa
Treat QA as a release decision, not a vibe check. Judge the deliverable against the approved brief, platform specifications, legal/safety constraints, and the audience context. Record enough evidence that another agent or producer can reproduce the decision.
Documented facts are requirements from the brief, platform specs, legal/policy guidance, delivery standards, accessibility standards, or provider documentation. Cite them or name the source and verification date.
Empirical observations are what you directly measured or inspected in the asset: frame size, duration, loudness, sync offset, OCR output, transcript mismatch, visual artifact, metadata, or a timestamped defect.
Production heuristics are professional judgments used when no explicit spec exists: whether a hand artifact is audience-visible, whether a product packshot feels trustworthy, whether an accent is intelligible for the target market, whether a social caption is too fast for mobile. Label these as heuristics and avoid pretending they are universal standards.
Do not start with random artifact hunting. Build the acceptance frame first.
Collect:
If the brief is missing, write a provisional QA basis such as: "Reviewing against supplied asset, target platform: Instagram Reels, inferred goal: 15 s product teaser. Product-claim and legal review cannot pass until facts and rights are supplied."
Create a small matrix before deep inspection:
| Area | Pass evidence | Typical reject evidence |
|---|---|---|
| Brief conformance | Message, product, audience, tone, duration, format, and call to action match the approved brief | Wrong product, missing CTA, wrong locale, off-brand tone, materially changed promise |
| Technical delivery | File opens, spec matches, no corruption, correct duration/fps/aspect, audio/captions present as required | Wrong aspect, corrupt frames, missing audio, bad encode, unsupported caption file |
| Generated-media realism | No audience-visible anatomy, physics, identity, text, logo, continuity, or temporal defects | Warped hands/faces, unreadable text, drifting identity, morphing product, flicker, impossible motion |
| Audio and speech | Intelligible, synced, no clipping/noise/pops, correct language/voice, loudness meets target | Dialogue buried, lip sync off, clipping, wrong voice, mistranslation |
| Accessibility | Captions, transcript, alt text, audio description, safe flashing, and player affordances meet the delivery context | Missing captions where required, unreadable captions, unsafe flashes, visual-only information with no alternative |
| Rights and provenance | Source rights, consent, metadata, and AI disclosure are documented | Unlicensed source, unapproved likeness/voice, missing synthetic disclosure, unverifiable origin |
| Safety/policy | No disallowed deception, unsafe advice, discriminatory content, or platform-prohibited claims | Misleading synthetic person/event, unsupported health claim, unsafe instructions, regulated-product violation |
Then inspect. Do not let a single attractive frame override a failed acceptance criterion.
When the delivery includes generated shot descriptions, search metadata, prompt reconstructions, source captions, or dataset annotations, review language separately from pixel/audio quality.
Accessibility captions, subtitles, and audio description have separate audience and standards requirements. Do not replace them with production descriptions. Use precise-video-description to define or repair the observation contract; use video-description-oversight for the complete pre-caption/critique/post-caption review workflow. This lane only ensures the final delivery's language assets align with the reviewed source and declared use.
Use automated checks for measurable properties and human review for perceptual defects. Automated file QC catches many delivery failures, but it cannot decide whether a generated product label is semantically wrong or whether a synthetic spokesperson feels deceptive.
Check:
For broadcast or premium delivery, use the client/platform spec as the authority. SMPTE describes IMF as a file-based media format for storing and delivering audiovisual masters across versions and territories. DPP/AS-11-style workflows use explicit technical and editorial metadata. These are not default requirements for a TikTok draft, but they are useful models for disciplined delivery tracking.
Generated media needs targeted inspection beyond normal color and compression checks.
Inspect still frames at 100% and at the intended viewing size. Scrub video slowly, then watch once without pausing on the target device class. Many AI defects are only obvious during motion, and many "defects" disappear at normal mobile viewing size.
High-priority checks:
Production heuristic: accept small artifacts only when they are not visible at intended size, do not affect the subject/product/message, and will not become a meme or trust-breaker. Reject or revise any defect on a face, hand, product, logo, legal copy, price, medical/financial statement, or safety instruction.
Use the delivery spec first. If none exists, choose a target appropriate to the platform and document it as a production heuristic.
Documented facts:
Review:
Accessibility is part of QA, not a last-minute export option.
Documented facts:
Check:
Generated media QA must include origin and usage review. Do not present metadata as proof of truth; use it as one trust signal.
Documented facts:
trainedAlgorithmicMedia for media created using generative AI and compositeWithTrainedAlgorithmicMedia for composites containing generative-AI elements.DigitalSourceType from AI-generated images; relevant NewsCodes include TrainedAlgorithmicMedia. Verified 2026-07-10; platform requirements are volatile.Review:
Apply the relevant model, platform, legal, and client policies. Platform facts change; verify at delivery time for regulated or high-risk content.
Flag or reject:
Use severity to decide whether to accept, revise, regenerate, or escalate.
Critical: must not ship. Examples: wrong product/claim, missing rights or consent, deceptive synthetic endorsement, disallowed safety/policy content, inaccessible required captions, unsafe flashing, corrupted final file, unintelligible core dialogue, wrong legal copy, or platform-required disclosure missing.
Major: revise before normal release unless stakeholder explicitly accepts risk. Examples: visible face/hand/logo defect, lip-sync drift, continuity break that harms comprehension, caption timing failures, audio clipping, noisy mix, bad localization, wrong brand color on key asset, or noticeable compositing seam.
Minor: fix if efficient; can ship with documented acceptance for low-stakes drafts. Examples: small background artifact, slight caption line break awkwardness, non-critical metadata typo, tiny compression artifact not visible at target size.
Observation: record without blocking. Examples: "AI-generated background texture visible on pause only", "music slightly more energetic than brief but message remains clear."
Do not use "minor" for defects on faces, bodies, product labels, logos, safety warnings, prices, legal copy, public figures, or accessibility requirements.
Write reports that make action obvious:
For revision loops, require a delta review plus spot checks around changed areas and one full playback/viewing pass. Fixing one generated defect often creates another nearby.
Use scripts/normalize_qa_report.py when a QA report needs a stable JSON handoff for automation, ticket creation, release gates, or producer review. The helper is Python 3.11+ and uses only the standard library. It validates the report shape, normalizes and sorts findings, summarizes severity counts, and computes a mechanical disposition from an explicit policy supplied in the report or via CLI.
Run it from a copied skill package or this repository:
python scripts/normalize_qa_report.py report.json
python scripts/normalize_qa_report.py report.json --policy '{"dispositions":{"critical":"reject","major":"hold","minor":"ready","observation":"ready"},"waivable_severities":["major"],"non_waivable_areas":["rights","accessibility","safety","policy"]}'
Exit codes:
0: valid report and mechanical disposition is ready.2: validly parsed report that results in hold or reject, or a report with schema validation findings.3: operational parse/read/write failure, such as invalid JSON or an unreadable file.The input JSON must include:
asset_id: stable asset or delivery ID.review: object with reviewer and ISO-compatible date; include target platform, intended use, and source package when available.policy: explicit disposition rules. Provide dispositions mapping each severity (critical, major, minor, observation) to ready, hold, or reject. Optional waivable_severities lists severities that a supplied waiver may mechanically unblock. Optional non_waivable_areas is extended by the script to always include rights, accessibility, safety, and policy.checks: array of automated or manual checks with id, status (pass, fail, not_applicable, or not_checked), required evidence_type, and evidence detail.findings: array with severity, area, issue, evidence_type, evidence_detail, and a locator (timecode, frame, or region) whenever the evidence is an empirical observation or the issue is visual, audio, captions, accessibility, or safety related.Evidence type must remain one of documented_fact, empirical_observation, or heuristic. Do not collapse these lanes during normalization: a documented platform requirement, a measured artifact, and a professional judgment have different authority.
Waivers are intentionally narrow. A blocking finding can be mechanically unblocked only when the policy allows that severity and the finding includes a waiver with non-empty owner and reference. The helper never waives rights, accessibility, safety, or policy findings, even if a report supplies a waiver.
The helper does not inspect media, judge subjective quality, verify claims, grant rights/accessibility/safety exceptions, or issue final approval. Its output includes mechanical_only: true and final_approval: false; a producer, reviewer, legal owner, accessibility owner, or release owner still has to make the actual acceptance decision.
Example minimal input:
{
"asset_id": "skincare-ad-v004",
"review": {
"reviewer": "QA Agent",
"date": "2026-07-11T12:20:00Z",
"target_platform": "paid social",
"intended_use": "public product ad",
"source_package": "delivery-package-v004"
},
"policy": {
"dispositions": {
"critical": "reject",
"major": "hold",
"minor": "ready",
"observation": "ready"
},
"waivable_severities": ["major"],
"non_waivable_areas": ["rights", "accessibility", "safety", "policy"]
},
"checks": [
{
"id": "claim-substantiation",
"status": "fail",
"evidence_type": "documented_fact",
"evidence_detail": "Product fact sheet does not approve disease-treatment claims."
}
],
"findings": [
{
"severity": "critical",
"area": "policy",
"issue": "Overlay makes an unsupported eczema treatment claim.",
"evidence_type": "documented_fact",
"evidence_detail": "Approved product facts allow dry-skin support only; the video says 'repairs eczema overnight'.",
"timecode": "00:06.000",
"recommended_fix": "Replace with approved copy and send revised ad through legal and QA review.",
"owner": "Legal review",
"retest_required": true
}
]
}
| Deliverable | Minimum QA focus |
|---|---|
| Still image | Brief fit, dimensions, crop/safe area, product/logo/text accuracy, anatomy, rights, metadata/provenance, platform disclosure, alt text if needed |
| Social clip | Hook timing, platform aspect/duration, mobile readability, captions, music/dialogue balance, generated motion artifacts, flashes, thumbnail/frame hold, disclosure |
| Explainer | Factual accuracy, script-to-visual alignment, narration intelligibility, captions/transcript, diagrams/text, pacing, source citations if factual, accessibility |
| Product ad | Product truth, legal/claim substantiation, packshot fidelity, price/offer accuracy, brand rules, CTA, rights, synthetic endorsements, platform ad policy |
| Avatar/spokesperson | Consent, identity/voice approval, lip sync, gaze/gesture naturalness, disclosure, language/accent, uncanny artifacts, claims |
| Localization/dub | Translation accuracy, cultural fit, units/names, subtitle timing, dub sync, voice approval, local legal claims, on-screen text replacement |
| Mixed-source edit | Source rights, continuity, color/grain match, compositing seams, provenance per ingredient, edit rhythm, captions/audio mix |
| Broadcast/premium master | Client spec, automated QC, loudness, color/HDR, captions/subtitles, PSE/flashing, metadata, IMF/AS-11 or client package rules where applicable |
Context: 15 s vertical skincare ad for Instagram Reels. Approved brief says "show the blue 50 ml bottle, no medical claims, CTA: Shop the summer set." Source package includes generated video, brand logo, music license, product facts, and prompt metadata.
Acceptance basis: 1080x1920 vertical, 15 s max, brand color guide, product fact sheet, FTC truthful-advertising posture, platform synthetic-media disclosure checked on delivery date.
Findings:
| Severity | Time/region | Issue | Evidence | Recommended fix |
|---|---|---|---|---|
| Critical | 00:06 text overlay | Unsupported claim "repairs eczema overnight" | Product facts only allow "supports dry skin barrier"; health claim not approved | Replace with approved claim; legal review revised copy |
| Major | 00:08 bottle label | AI label reads "HYDRATlON" with wrong letterform | Manual inspection and OCR mismatch | Regenerate packshot from locked product render or composite approved label |
| Major | Full mix | Music masks CTA | Phone speaker playback; last three words hard to understand | Duck music -6 dB under CTA and retest intelligibility |
| Minor | 00:03 background | Small warped leaf visible on pause | Not visible at normal playback | Accept if no other render is needed |
Verdict: Reject until claim and product label are fixed; retest final playback, captions, loudness, and disclosure after revision.
Why this example is structured this way: the critical issue is legal/claim risk, not visual polish. A visually beautiful ad with a false product claim fails QA.
Context: English training video localized into Spanish, French, and Japanese with synthetic avatar dubbing. Target is internal LMS, not public ads. The client provided consent for the avatar performer and requires captions.
Workflow:
Expected failure modes: avatar mouth over-opens on Japanese vowels, Spanish text overruns caption safe area, French dub starts 300 ms late after a pause, translated safety warning changes "must" to "may."
Verdict rule: a locale with mistranslated safety instructions is Critical even if the video file is technically perfect.
Context: A 60 s explainer combines AI-generated diagrams, licensed stock footage, generated narration, and a human-edited timeline.
Review:
Pass condition: all factual/statistical claims trace to approved source material, and no generated visual introduces a new unsupported claim.
Take calesthio/generated-media-qa from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.