film-qa
Du prüfst Frames und Zahlen, nicht Absichten. Ein BESTANDEN braucht Beweise: einen Dateipfad, den du geöffnet hast, oder eine Zahl, die du gemessen hast.
Alles andere ist NICHT GEPRÜFT: <Grund>. Schreibe niemals BESTANDEN für etwas, das du nicht angesehen oder gemessen hast.
Pfade (relativ zu launch-video/ oder studio/ im launchfilm-Repository): Filmquelle films/<slug>/ (film.json,
STORYBOARD.md, BRIEF.md), Render out/<slug>/, QA qa/<slug>/ (die CLI schreibt report.md; du schreibst QA.md daneben).
Exakte CLI-Flags: npx launchfilm <cmd> --help. Befehle mit getesteter Syntax: references/commands.md.
Verfahren
- Automatischer Durchlauf.
npx launchfilm qa <slug>→ lies zuerstqa/<slug>/report.md(Kontaktbögen, ffprobe, Lautstärke, automatische Prüfungen). Kopiere seine gemessenen Zahlen in QA.md als Beweis; miss nicht erneut, was es gemessen hat. - Kontaktbögen. Öffne jeden Kontaktbogen, den der Bericht auflistet (oder
npx launchfilm sheet <slug>). Lies jede Zelle. Liste die Dateien, die du geöffnet hast, in QA.md auf (T12-Beweis). - Standbilder.
npx launchfilm still <slug> <t> --preset <id>für jedes Preset, das der Film ausliefert, bei: jeder Aufnahmegrenze- 6 fr, jedem Texteinsatz + Halte-/2, Frame 0, dem letzten Frame und jedem Intervall, das der Freeze- oder Black-Frame-Scan markiert.
Plus ein Standbild bei
--scale 0.25(480×270 für 16:9) auf dem Helden-Text-Frame: die X-Timeline-Vorschau. Lies jedes PNG.
- 6 fr, jedem Texteinsatz + Halte-/2, Frame 0, dem letzten Frame und jedem Intervall, das der Freeze- oder Black-Frame-Scan markiert.
Plus ein Standbild bei
- Messe, was der Bericht nicht gemessen hat: Lautstärke, True Peak, schwarze Frames, eingefrorene Intervalle, Schnittzeitpunkte vs. Beats, Kontrast hinter Text, Safe Zones, Bildzeilenlängen. Befehle in references/commands.md.
- Blocking-Checks T1–T12 unten, dann Lieferchecks D1–D16. Jeder erhält BESTANDEN / NICHT BESTANDEN / NICHT GEPRÜFT + Beweis + Regel.
- Schreibe
qa/<slug>/QA.mdvon references/qa-template.md. - Korrektur-Schleife. Jedes NICHT BESTANDEN: gib den Befund an scene-build oder sound mit Frame-Nummern weiter, rendere nur den betroffenen Bereich neu
(
npx remotion render … --frames=<a>-<b>oder das CLI-Äquivalent), überprüfe diese Punkte erneut. Maximal 2 Schleifen; melde dann die verbleibenden NICHT BESTANDEN dem Benutzer mit beigefügten Standbildern. Stufe niemals ein NICHT BESTANDEN auf BESTANDEN herab, ohne neue Beweise.
Blocking-Checks: die 12 Tells (craft/00)
| Id | Bestehensbedingung | Beweis |
|---|---|---|
| T1 statisch | kein eingefrorenes Intervall ≥ 0,6 s außer der Endcard-Settle (≤ 3 s); jedes markierte Intervall durch Standbilder an seinem Start und Ende mit Drift oder Bewegung verifiziert | freezedetect-Ausgabe + 2 Standbilder pro Intervall |
| T2 Standard-Easing | grep G1 (scene-build) leer in films/<slug>; keine CSS-Transitions | grep-Ausgabe |
| T3 alles auf einmal | jede Gruppe von ≥ 3 Geschwistern tritt gestaffelt ein (partielle Zustände in einer Kontaktbogenzelle sichtbar oder Staffelung ≥ 1 fr im Code); Gruppen-Eintritt ≤ 24 fr | Kontaktbogen-Zell-Referenzen oder Code-Zeilen |
| T4 eine Geschwindigkeit | Film > 20 s hat ≥ 1 Rhythmusbruch (Stille, Smash Cut zu Schwarz, Palette Flip, Halten ≥ 2× median shot); Launch-Modus: jeder Schnitt innerhalb ±2 fr eines Beats | film.json-Grenzen vs. beats.json; erkannte Schnitte |
| T5 Sound | jedes visuelle Ereignis in film.json hat ein SFX oder wird von VO/Musik abgedeckt; Musik duckt unter VO; echte Stille, wo geplant | Ereigniszählung mit/ohne Sound; Lautstärke eines VO-Fensters vs. eines Musik-Fensters |
| T6 Text als Label | Helden-Text ≥ 8 % der Frame-Höhe, wenn Text die Nachricht ist (Aussagen 10 %); jeder Text hält ≥ 0,2 × (Wörter + 1) s; ≤ 3 Zeilen; Untertitel ≤ 2 Zeilen | Tabelle pro Eintrag |
| T7 flaches Aussehen | Launch-Modus: Grain + Vignette vorhanden; eine benannte Treatment pro Sektion; Produktmodus: Haarfeinheiten, weiche Schatten; kein Banding im dunkelsten Gradienten des mp4-Standbilds | grep + Standbild aus dem mp4 |
| T8 Web-Layout | ein Brennpunkt pro Standbild; kein Absatz > 3 Zeilen; keine Aufzählungszeichen; UI-Chrome nur, wo das Chrome der Punkt ist | Standbilder |
| T9 generisches Stock | jedes Footage-Clip in films/<slug>/footage/SOURCES.md mit Quelle + Lizenz; Stock-Clips abgestuft und ≤ 1,5 s geschnitten | SOURCES.md + Standbilder |
| T10 dekorative Übergänge | Übergänge ⊂ Vokabular; Nicht-Schnitt-Übergänge ≤ 1 pro 5 s; blur-dissolve ≤ 12 fr | film.json |
| T11 Vorlage vor Geschichte | STORYBOARD.md hat approved:; Frame 0 nicht schwarz und unterscheidet sich vom Standbild bei 0,5 s; Kategorie des Produkts klar bis 1,5 s (x, li) / 1 s (reel); Auszahlung nach dem Problem; ≥ 2 s Ruhe auf Markenoberfläche am Ende | Standbilder 0, 0,5, 1,5 s, letzte 2 s |
| T12 nie hingesehen | diese QA: jeder Kontaktbogen und jedes Standbild als geöffnet aufgelistet | Dateiliste in QA.md |
| Jedes NICHT BESTANDEN in T1–T12 blockiert Render-zum-Versand und Paket. |
Lieferchecks (pro Preset; Nummerierung = craft/08#delivery-checks)
Werte aus harness.config.json presets, sonst craft/10#presets. Verwende diese IDs exakt; craft/08 und QA.md teilen sie.
| Id | Bestehensbedingung |
|---|---|
| D1 | Video h264, Profil High (Remotions ffprobe druckt 100), pix_fmt yuv420p, Container mp4 |
| D2 | Breite × Höhe exakt die des Presets |
| D3 | konstante fps = Kompositions-fps (r_frame_rate = avg_frame_rate) |
| D4 | Dauer = film.json ±1 fr und innerhalb des Längenbereichs des Presets (x-16x9 ≤ 140 s, reel-9x16 ≤ 90 s) |
| D5 | Audio aac LC (Remotions ffprobe druckt 1), 48000 Hz, 2 Kanäle, ~192 kbps; hero-loop: kein Audiostream |
| D6 | integrierte Lautstärke −14 ±1 LUFS; True Peak ≤ −1,5 dBTP; VO −16…−14 LUFS, wo messbar |
| D7 | moov vor mdat (faststart) |
| D8 | Poster = Frame 0 dieses Presets vorhanden, gleiche Größe, nicht schwarz (YAVG > 20), zeigt den Hook |
| D9 | SRT neben dem Render für jedes Preset mit VO; dieselben Phrasen wie die Untertitel; HH:MM:SS,mmm; ≤ 2 Zeilen; ≥ 0,8 s jede; Zeiten ±2 fr |
| D10 | nichts Wichtiges (Untertitel, Text, Logo, die verwendete UI) außerhalb der Safe-Zone des Presets (Overlay-Standbild) |
| D11 | Untertitel eingebrannt auf jedem Preset mit VO (hero-loop: keine, ph-16x9 gemäß seiner Konfiguration); ≤ 2 Zeilen; ≤ 42 Zeichen/Zeile (16:9), ≤ 32 (4:5, 1:1, 9:16); niemals über dem sich ändernden Element; Kontrast ≥ 4,5:1 für Untertitel und Text über Footage, ≥ 3:1 Akzent auf Hintergrund; lesbar auf den 480 px (16:9) und 360 px (4:5, 9:16) breiten Standbildern |
| D12 | Freeze- und Black-Listen stimmen mit den vorgesehenen Halten und Black-Beats überein (nur die in film.json oder STORYBOARD aufgeführten) |
| D13 | BT.709-Tags oder ungetaggt HD; der dunkelste Gradient zeigt keine neuen Banding-Artefakte im mp4-Standbild vs. dem PNG |
| D14 | Dateigröße unter dem Limit: x ≤ 512 MB, README hero ≤ 10 MB |
| D15 | out/<slug>/credits.txt listet jedes CC BY-Asset mit seinem Credit auf; films/<slug>/footage/SOURCES.md vollständig |
| D16 | hero-loop nur: Frame N gleich Frame 0; eine 3× geloopte Datei zeigt keinen Sprung an den Nahtstellen |
Text-über-Zeit-Lesbarkeit
Für jedes Textelement in film.json (Aussagen, Untertitel, Labels, UI-Kopien, auf die die VO zeigt): Wörter, In/Out-Frames, Halten = (Out − In) / fps, erforderlich = 0,2 × (Wörter + 1) s. Überprüfe auch beim 480×270-Standbild, dass die Heldenzeile noch lesbar ist (Buchstaben unterscheidbar). Eine Zeile pro Eintrag in QA.md.
Regeln für den Bericht
- Jedes BESTANDEN zitiert Beweise:
qa/<slug>/stills/x-16x9-12.30.png,I = −14,2 LUFS,grep G1: 0 Zeilen. - Gemessene Zahlen behalten Einheiten und das Werkzeug, das sie erzeugt hat (
system ffmpeg 8.1 ebur128oderremotion ffmpeg loudnorm). Remotions gebündeltes ffmpeg fehltebur128,signalstats,freezedetect,tile,drawboxund rawvideo-Ausgabe: verwende ein System-ffmpeg dafür und gib das an; falls keines existiert, sind diese Punkte NICHT GEPRÜFT. - Ein NICHT BESTANDEN nennt den Frame-Bereich, die Regel (
craft/NN#anchoroderT#/D#) und den vorgeschlagenen Fix. - Der Zusammenfassungsblock sagt FERTIG nur, wenn T1–T12 und D1–D16 alle BESTANDEN sind (D16 nur für hero-loop) (NICHT GEPRÜFT zählt als nicht fertig, mit Grund).