FilmForge Frame QA
Nada entra en la película en miniatura. Cada pintura se lee a tamaño completo contra sus hojas, se mide con las herramientas, se puntúa y recibe uno de tres veredictos. El veredicto siempre dice qué ocurre después y cuánto cuesta: aceptar (gratis), corregir en código (gratis, con la llamada exacta) o repintar (2.75 créditos, con el prompt corregido).
Rutas: scripts/, templates/ y config/ a continuación son carpetas dentro de esta skill (el directorio base que se muestra al cargarla), colocadas allí por ./install.sh. Trabajando desde un clon del repositorio, son tools/, templates/ y config/ en su raíz.
El procedimiento
- Hoja de contactos del lote, para verlo como secuencia (¿los vecinos cortan juntos?):
python3 scripts/contact_sheet.py build art/film --shotlist shotlist.yaml --out out/contact_sheet.jpg - Vista completa de cada pintura (lee la imagen en sí, no la hoja).
- Recortes al 100% de lo que importa: caras, manos, el sujeto crítico de escala, cualquier cosa pequeña.
python3 scripts/contact_sheet.py zoom art/film/s03_x.png --out-dir out/zoom --grid 2x2o--box x0,y0,x1,y1. Un lector de imágenes reduce el tamaño de las imágenes grandes; los recortes muestran los píxeles reales. - Mide reglas de color, paleta y exposición:
python3 scripts/ledger.py palette continuity.yaml --paintings art/film --shotlist shotlist.yamlInforma la paleta de cada pintura, su distancia (delta E) del guión de color de la escena, la proporción de cada regla de color prohibido en el fotograma y los saltos de exposición en paradas entre vecinos de una misma escena. - Puntúa el criterio (abajo): nueve criterios, de 0 a 2.
- Decide el veredicto según las reglas a continuación.
- Escribe la entrada en
qa.yaml(formato abajo), luego reconstruye la hoja de contactos con--qa qa.yamlpara las insignias. - Informa: el recuento de veredictos, cada corrección y repintado en una línea, los créditos que costaría un repintado.
El criterio (templates/qa-rubric.md tiene los anclajes de puntuación)
| Criterio | Qué compruebas |
|---|---|
| identidad | caras y marcadores de vestuario contra las hojas |
| anatomía | manos, ojos, extremidades en el sujeto focal |
| escala | cada bloqueo de escala y cada recuento (mide píxeles en los recortes) |
| estilo | el bloqueo de aspecto: medio, línea, color, textura |
| color | el guión de color y las reglas prohibidas (de ledger.py palette) y exposición contra vecinos |
| continuidad | cada accesorio y estado que el libro lista para este plano, y nada fuera de su intervalo |
| historia | el latido se lee en dos segundos |
| composición | encuadre según lo listado, el ojo aterriza en el sujeto, el área de texto tranquila |
| limpio | sin texto pintado, marca de agua, mancha o figura suelta |
Midiendo escala: en un recorte, mide el sujeto y su referencia en píxeles y compara la proporción con el bloqueo de escala. El ejemplo del motor: la polilla abarca 20 px en un dedo de 60 px, donde su bloqueo dice una mano abierta completa (120 px o más en ese encuadre): una sexta parte de su tamaño, escala 0, repintar.
Las reglas del veredicto
- aceptar: ningún criterio en 0, total 15 de 18 o más, sin violación medida.
- corregir: cada fallo tiene una corrección en código (tabla abajo) y nada en 0 en identidad, escala o historia.
- repintar: identidad, escala o historia en 0; anatomía en 0 en el sujeto focal; estilo en 0; o tres o más fallos.
Corregir en código antes de créditos (módulos de painted-film-pipeline)
| Fallo | Módulo y llamada |
|---|---|
| un objeto en un tono incorrecto (una bufanda que hace que un personaje secundario se lea como el héroe) | grade.py IN OUT recolor:x0:y0:x1:y1:lo:hi:new_hue:sat |
| un color prohibido filtrándose (azul antes del final) | grade.py IN OUT blue:0.3 (empuja la banda hacia plata; keep=0.3) o recolor a un tono permitido |
| una figura suelta en un área limpia | un parche de una región limpia desplazada (el patrón de fix_s22.py) |
| mal recorte, tangente, mal espacio de cabeza | el crop: [x0, y0, x1, y1] del plano en píxeles de origen |
| exposición o contraste fuera de sus vecinos | automático: el mapeo igualado asigna el percentil 0.5 y 99.5 de luminancia de cada placa a objetivos compartidos |
| detalle suave | automático: escalado Lanczos 4K con nitidez solo en bordes |
| un fotograma sin vida | movimiento en código (forge-motion), nunca un repintado |
Cada corrección escribe un nuevo archivo (_g), se vuelve a medir y obtiene done: true solo cuando la medición pasa. Detalles y significados de parámetros: references/code-fixes.md.
Repintar: diagnosticar, luego corregir
Nombra la causa como un slot de prompt o una referencia: "falta bloqueo de escala en el slot 4", "hoja adjunta en orden incorrecto", "aspecto parafraseado". Escribe el prompt corregido completo, verifica el presupuesto y entrégaselo a forge-painter. Si la causa afectaría a otros planos (un bloqueo faltante en el libro), dímelo: es un cambio de motor, no un solo repintado.
Formato de entrada qa.yaml
- shot: s02
file: art/film/s02_last_match.png
checked: [fotograma completo, zoom 2x2 al 100%, paleta de ledger]
scores: {identidad: 1, anatomía: 2, escala: 2, estilo: 2, color: 0, continuidad: 2, historia: 2, composición: 2, limpio: 2}
total: 15
max: 18
measured: {no_gold_pct: 4.4, script_dE: 5}
verdict: fix
notes: Un resplandor dorado de la cerilla cubre el 4.4% del fotograma (la regla permite 2% antes de s05) y tiñe la capucha.
fix:
problem: resplandor dorado, tono 38 a 58
module: painted-film-pipeline pipeline/grade.py (recolor)
call: python grade.py s02_last_match.png s02_last_match_g.png recolor:250:250:700:650:38:58:22:0.8
params: {box: [250, 250, 700, 650], hue_band: [38, 58], new_hue: 22, sat: 0.8}
why_not_repaint: una banda de tono en un cuadro
verify: ledger.py palette muestra no-gold por debajo de 2.0% en el archivo _g; la capucha se lee roja al 100%
done: false
Una entrada de repintado tiene repaint: {cause, prompt_changes, credits, corrected_prompt} en lugar de fix.
Hallazgos prácticos de producciones reales
- Escala (repintar): cinco fotogramas de Simorgh dibujaron a la abubilla demasiado pequeña junto a la niña (s21, s25, s33, s36, s39). El código no puede agrandar un sujeto pintado de manera convincente; se programaron para repintado a su tamaño real, y la causa (sin proporción de escala en prompts ni en las hojas) se convirtió en una regla del motor.
- Color (corregir): el azul se filtró en fotogramas antes del final; un tirón de banda hacia plata los corrigió en código.
- Identidad por color (corregir): la bufanda de un personaje secundario coincidía con el color del héroe, por lo que se leía como ella; un recolor de banda de tono dentro de un cuadro lo movió.
- Figura suelta (corregir): una figura pintada extra en un fotograma tranquilo se parcheó a partir de regiones limpias desplazadas.
- La puerta del libro ilustrado: las caras coinciden con las referencias; el aspecto correcto y los colores del guión de color; el área de texto realmente tranquila; el motivo de la página presente; te hace sentir la línea de texto con la que se sienta. Un fallo, rehecho.
Nunca
- Aceptar desde una miniatura o una hoja de contactos sola.
- Repintar lo que el código pueda corregir, o "corregir" en código lo que hace que la historia esté mal.
- Pasar una pintura cuya regla medida falle, incluso si se ve bien.
Lista de verificación de puerta (para el lote)
- Cada pintura leída a tamaño completo, con recortes de caras, manos y sujetos críticos de escala
-
ledger.py paletteejecutado; cada error explicado en un veredicto - Cada pintura tiene una entrada en qa.yaml con puntuaciones, veredicto y la siguiente acción
- Hoja de contactos reconstruida con insignias y revisada
Referencias
references/code-fixes.md: los parámetros de cada corrección, cómo elegirlos y cómo verificarlos