Skip to content

Sprint commerciali: un commercial si fa con lastra, file del film e dati - #15

Merged
antoninobig-beep merged 19 commits into
mainfrom
sprint-commerciali
Sep 16, 2026
Merged

antoninobig-beep merged 19 commits into
mainfrom
sprint-commerciali

Conversation

@antoninobig-beep

@antoninobig-beep antoninobig-beep commented Sep 15, 2026

Copy link
Copy Markdown
Collaborator

Sta sopra la #14 (blocco 6): finche' quella non e' mergiata, il diff qui contiene anche i suoi commit.

Cosa cambia

Alla fine di questo sprint, per fare il film di un prodotto servono tre cose: la lastra (la sua UI in DOM, divisa nelle parti che la camera separa), un file del film (chiavi di camera per formato, cosa succede sulla lastra, le frasi) e i dati. Le animazioni si prendono dal kit, con i numeri degli script gia' dentro; i controlli girano da soli nei tre formati.

La prova e' video/src/products/demo/: Registro, uno sportello richieste inventato, 45 secondi, 1350 frame, in 16:9, 9:16 e 4:5, costruito solo con i pezzi del kit. Niente di Cifra o di Zeno.

I due banchi del film

  • film-rules.py calcola le regole di regia sui dati, senza render (meno di un secondo): camera senza inversioni e ferma ai capi, soste delle battute, battute che non si pestano i piedi, esitazione prima della pressione, catene di conseguenze, ordine delle consegne, nessun cambio di stato a camera ferma. Sette copie guaste, una per regola, e il negativo nomina la regola che deve accorgersene (--regola).
  • film-type.py misura la tipografia sui fotogrammi che il manifest indica. Il film si rende due volte: com'e' e con il solo strato tipografico bianco sul nero, che e' la maschera delle lettere. Poi bordo del quadro e contrasto WCAG a riquadri di 48 px, contando il peggiore. Negativi: corpo doppio, fondo scuro tolto, e maschera sporca (esce 3, perche' non sta misurando lettere).

Cosa hanno trovato sul film di esempio

Ogni voce qui sotto stava in fotogrammi che avevo gia' guardato a occhio:

Difetto Misura Correzione
Fondo scuro tarato sul 16:9 frasi a 2,8:1 in 9:16 il fondo sale con la frase (6,3:1 e oltre)
Scambio TYP-04 buco di una lettera fra "un" e "lavoro." la cella passa da una larghezza all'altra con due copie invisibili, senza misurare in JavaScript
Maschera fra due righe la parola che esce passa sopra la base di quella sopra 0,06em fra le righe, 0,28em ai bordi esterni
Chiusura 1,53:1 sotto la frase finale Film prende dim e vela tutta la ripresa; l'ultima chiave del 16:9 scende di 108 unita'
Didascalia 1,03:1 nel riquadro peggiore, 3,34:1 di media misura a riquadri, bianco pieno, ancoraggio per formato
Carattere di sistema Helvetica Neue sul Mac, clone di Arial in CI Inter da file (kit/font.ts, OFL accanto)

CI

Un job film per rapporto, con la sua cache: esegue i controlli del film e poi renderizza i 1350 frame come artefatto da guardare. formato fa girare tutti gli altri (--tranne film-demo). Il deploy non aspetta il film, che non sta sulla pagina.

Il kit da un altro repository

Provato davvero: un progetto Remotion separato che importa il kit da un percorso, carica il suo carattere dalla sua cartella public e fa girare questi banchi sul suo film nei tre rapporti, con expect.sh e bench-coverage.py verdi. Serve a questo il modulo di banco per percorso, --moduli per i controlli, --progetto in film-type.py e PROGETTO in framelocked-verdict.sh. Il README lo spiega passo per passo.

Verifiche

  • 14 controlli del film per rapporto, tutti col codice atteso, in 16:9, 9:16 e 4:5; copertura verde.
  • still-identity.sh origin/main: le sei scene di Topics sono identiche fotogramma per fotogramma.
  • npm run lint, no-product-literals.sh: puliti.
  • Render locale del film: 2 min 53 s per il 16:9.

🤖 Generated with Claude Code


Aggiunto dopo: la chiusura col marchio

Lockup nel kit (il marchio arriva come nodo: qui e' scritto in DOM, nel repo dei film sara' l'asset vero), con la sua regola: la chiusura deve essere tutta in campo almeno venti frame prima della fine, e il guasto marchio-tardi la fa scattare. Rifare i conti della chiusura ha trovato due difetti di tempo nel film di esempio, che nessuna immagine faceva vedere:

  • la battitura partiva tre frame prima del clic sul campo (testo in un campo non attivo): adesso TYPING.start si calcola da FIELD_CLICK;
  • la mano partiva verso il pulsante al f1020 mentre la battitura finiva al f1088: la scena dell'assistente sta quaranta frame prima e la mano parte a testo finito.

E un difetto della misura: nella maschera finiva anche il segno quadrato del marchio, viola nel render, contato come lettere (4,14:1). Il segno sta fuori dalla maschera.

15 controlli del film per rapporto, tutti col codice atteso nei tre formati.

La prima run di CI (commit precedente)

Tutti e sette i job verdi. Tempi: pagina 5,0 min; formato 15,7 / 15,0 / 10,0; film 11,1 / 10,4 / 9,3. La run intera sta in 16 minuti perche' i job vanno insieme.

Antonino Cuzzola and others added 19 commits September 15, 2026 18:37
…in moduli puri

Il catalogo dichiara i rapporti e Root registra ogni scena in 16:9, 9:16 e 4:5,
piu' TopicsFilm, le stesse scene in finestre (kit/film.ts, kit/SceneWindow.tsx),
misurato da film-identity.sh contro le scene da sole. Le pose verticali vengono
dalla regola R (poses.ts) e il thread va a capo dove finisce il quadro. I tempi
di CardHandoff e di PromptInput escono dai componenti in moduli puri, per i
banchi. expect.sh e bench-coverage.py pronti per i controlli generati.

Il 16:9 resta identico a main (still-identity su tutte le scene e sulle
finestre di UIMockup, CardHandoff e PromptInput).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…erati, provini in ogni formato

manifest.mjs prende --ratio (chain, fill, film, project-cases con le pose del
rapporto), ha 'bench NOME' che legge la geometria di un banco dal suo modulo
sotto il prodotto, e 'checks' che raccoglie i controlli da scripts/checks/*.mjs
nel formato di expect.sh. I provini del tempo stanno nel catalogo e Root li
registra nei tre rapporti. no-product-literals guarda i prodotti, non il kit,
anche nelle sottocartelle.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… i negativi --must-fail

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…hiarate dalla scena

tempo.py confrontava i primi 480x270 byte: in 9:16 era il terzo alto del quadro.
Adesso scala a un quarto del lato e confronta tutto. Le soglie che non scalano
(il ritardo della card sulla mano) le dichiara CardHandoff nel manifest: fuori
da quelle finestre il tempo normalizzato deve coincidere, dentro il residuo
deve esserci. fixture-tempo.sh e fixture-trim.sh prendono rapporto e percorsi.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
seam.sh controllava la separazione prima della soglia, quindi una giunta rotta
usciva 2 (misura inutile) e mai 1. Adesso 2 solo se anche il taglio di
controllo e' quasi zero. rest-point.sh prende --ratio; i due negativi (ritaglio
mosso, fermo immagine) sono generati per rapporto con tempi presi dalla durata.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…lo, negativi in ogni formato

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… per la fixture, il vuoto esce 3

Il ritaglio sull'intestazione del thread si proietta con la posa del rapporto
(nel 16:9 resta {0,410,628,40}). Un ritaglio senza testo usciva 1 dando la colpa
al pavimento: adesso esce 3. La fixture a 0,25 e' un remotion still invece di
450 fotogrammi, e il banco controlla che il quadro sia quello del rapporto.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…l quadro, soglia misurata

La geometria e' la card all'ultimo fotogramma nel quadro del rapporto e la
stessa zona della lastra al primo, proiettata con yaw e pitch veri; K dalle
larghezze proiettate. Il banco esce 3 se il quadro non e' lo stage o un
ritaglio non esce della dimensione chiesta (prima dava 449159000x). Nitidezza a
mezzo pixel e soglia 1,35: render veri 2,81/1,79/2,02, screenshot 1,09/1,14/1,06.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Il banco contava il quadro intero e in 9:16 e 4:5, con il pulsante d'invio fuori
quadro, promuoveva scarto 2 qualunque fosse lo scarto vero. Adesso guarda due
zone proiettate dal manifest nel tratto a camera ferma: lo svuotamento del campo
e la bolla nella coda del thread. Tre copie guaste per rapporto (eventi fusi,
interfaccia lenta, clic mancato) escono 1. Scarto misurato: 5 frame, 4 sul
provino veloce in 9:16. Tolto uno slideY ridondante che tsc segnalava.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…in quadro, OCR sulla zona

I sei frame e le parole copiate dalla scena diventano il manifest: campioni
dalla battitura, dall'invio e dallo streaming, verificati crescenti; tolte le
parole che lo scambio precedente del thread gia' mostrava (thread.ts). L'OCR
legge thread e campo alla posa ferma del rapporto. TESSERACT sostituisce il
sudo mv nel negativo; aggiunti due negativi veri, fermo immagine e coda coperta.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ddrizzata

In 9:16 la camera segue la card e sullo schermo si misurava la panoramica; e i
campioni prima della presa facevano passare un taglio secco. Adesso ogni
campione del trascinamento si raddrizza sulla lastra con la camera di quel frame
(angoli proiettati dal manifest), e il baricentro del cambiamento si legge li'.
Le intestazioni delle colonne, ferme durante il gesto, controllano il
raddrizzamento: zero pixel sui render veri, 40-150 su un fermo immagine, che
prima in 9:16 attraversava 208 px. Fermo, contrario e taglio escono 1 in ogni
rapporto.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ggiornati

pagina (dimostrazioni e proiezione, senza render), formato x3 (render, provini,
expect.sh sui controlli del manifest, bench-coverage col suo negativo),
deploy (assembla col 16:9 e pubblica). Cache per rapporto. Tolti i comandi
vecchi del manifest e benches.ts. film-identity: il negativo guarda il frame in
cui la camera corre, calcolato dalla traccia.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
In CI (ImageMagick 6) la coppia al contrario di seam risultava quasi identica e
l'inizio di BoardOrbit in 9:16 sfondava la soglia di rest-point, mentre sul Mac
(ImageMagick 7) passavano. compare -fuzz non conta allo stesso modo nelle due
versioni. _pixeldiff.sh fa il conto con ffmpeg, grigio e soglia 20 su 255:
giunte fino allo 0,21%, tagli di controllo 2,8-11%, coppia al contrario 41%.
rest-point ricalibrato sui tre rapporti (peggiore 0,24, soglia 0,45). Gli
artefatti della CI si caricano anche quando un banco boccia.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…eografie, testo, cursore, tipografia, film di esempio

kit/filmCamera.ts: la camera di un film intero a chiavi per formato, cubica
monotona (niente scavalchi), velocita' zero ai capi, checkFilmCamera.
kit/FilmView.tsx: il componente Film. Shot prende strati a profondita' diverse
(CAM-02) e la luce dello schermo sul piano (MAT-02). kit/choreo.ts (CHR-01/02/03,
TXT-04), kit/text.ts (TXT-01/02/03/05), kit/cursorArc.ts (CUR-01/02),
kit/type.ts e TypeLine.tsx (TYP-01/02/03/04/05/09/10) con le regole di sosta e
di battute. products/demo: Registro, un prodotto inventato, e DemoFilm in tre
formati, costruito solo con i pezzi del kit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…it consumabile

I due banchi del film e il job che li fa girare, piu' quello che hanno trovato
sul film di esempio.

film-rules.py calcola le regole di regia sui dati, senza renderizzare: camera
senza inversioni e ferma ai capi, soste delle battute, battute che non si
pestano i piedi, esitazione prima della pressione, catene di conseguenze,
ordine delle consegne, nessun cambio di stato a camera ferma. Ogni regola ha la
sua copia guasta (products/demo/rules.ts) e il negativo la nomina con --regola:
un guasto che fa scattare un'altra regola non copre la sua.

film-type.py misura la tipografia sui fotogrammi che il manifest indica, con il
film reso due volte: com'e' e con il solo strato tipografico bianco sul nero,
che e' la maschera delle lettere. Contrasto WCAG a riquadri di 48 px, contando
il peggiore: la media nascondeva la didascalia della chiusura, bianca sulla
lastra bianca per tre caratteri (1,03:1 contro una media di 3,34:1). Frasi da
3:1, didascalie da 4,5:1. I negativi sono il corpo doppio (esce dal quadro), il
fondo scuro tolto (non si legge) e la maschera sporca, che esce 3 perche' non
sta misurando lettere.

Quello che i banchi hanno trovato, e che si vedeva bene in ogni fotogramma che
qualcuno aveva guardato:
- il fondo scuro sotto le frasi era tarato sul 16:9 e nel 9:16 lasciava la
  frase a 2,8:1; adesso sale con lei (6,3:1 e oltre);
- lo scambio di TYP-04 lasciava il buco di una lettera fra "un" e "lavoro.",
  perche' la cella era larga quanto la parola piu' larga: adesso passa da una
  larghezza all'altra con due copie invisibili di corpo calante e crescente,
  senza misurare niente in JavaScript;
- la maschera di una riga sporgeva di 0,28em anche verso la riga accanto e la
  parola che usciva passava sopra la base di quella sopra: fra due righe adesso
  sporge 0,06em;
- la chiusura attenuava l'opacita' delle parti della UI ma non il fondo della
  lastra (1,53:1 sotto la frase): adesso Film prende `dim` e vela tutta la
  ripresa sotto la tipografia, e l'ultima chiave del 16:9 scende di 108 unita'
  perche' la lastra finisca sopra la frase;
- il carattere veniva dal sistema, cioe' Helvetica Neue sul Mac e un clone di
  Arial in CI: adesso il film carica Inter da file (kit/font.ts, OFL accanto al
  file).

La passata della maschera la fa il kit: `Film` prende `solo` e toglie lastra,
bordo, copia dietro, luce e velo. Prima era il materiale trasparente di ogni
film, e il primo film scritto fuori da questo repo se l'e' dimenticato.

CI: un job `film` per rapporto, con la sua cache, che esegue i controlli del
film e poi renderizza i 1350 frame come artefatto; `formato` gira tutti gli
altri (--tranne film-demo). Il deploy non lo aspetta: il film non sta sulla
pagina.

Il kit si usa da un altro repository, ed e' stato provato: un progetto Remotion
separato che importa il kit da un percorso, carica il suo carattere dalla sua
cartella public e fa girare questi banchi sul suo film nei tre rapporti, con
expect.sh e bench-coverage.py verdi. Per questo manifest.mjs prende un modulo di
banco per percorso e i moduli dei controlli da un'altra cartella (--moduli),
film-type.py prende --progetto e framelocked-verdict.sh legge PROGETTO.

Le sei scene di Topics restano identiche a origin/main (still-identity.sh).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Il passo che mancava allo sprint: la chiusura degli script (al f1300 marchio,
chiamata all'azione, dominio). `Lockup` sta nel kit e prende il marchio come
nodo, perche' nel repo dei film e' l'asset vero del prodotto e qui non puo'
stare; le righe salgono dalla maschera, sfalsate, e non escono piu'.

La regola che ci va accanto: la chiusura deve essere tutta in campo almeno venti
frame prima della fine (kit/type.ts `lockupProblems`), perche' un marchio che
sta ancora salendo sull'ultimo fotogramma non e' una chiusura, e nei social
l'ultimo fotogramma e' quello che resta fermo nel feed. Il guasto
`marchio-tardi` la fa scattare.

Per farci stare il marchio, la frase finale sale di un blocco a f1224, che cade
fra l'uscita di "Approvato." e l'ingresso della chiusura: in quei due fotogrammi
sul vetro non c'e' niente, quindi lo spostamento non si vede.

Rifare i conti della chiusura ha trovato due difetti di tempo nel film:
- la battitura partiva tre frame prima del clic sul campo, cioe' il testo
  compariva in un campo non ancora attivo: adesso `TYPING.start` si calcola da
  `FIELD_CLICK`;
- la mano partiva verso il pulsante al f1020 mentre la battitura finiva al 1088:
  adesso la scena dell'assistente sta quaranta frame prima (clic 868, battitura
  872-1055, pressione 1088) e la mano parte a testo finito.

E un difetto della misura: nella maschera della tipografia finiva anche il segno
quadrato del marchio, che nel render e' viola, e film-type.py lo contava come
lettere (4,14:1 contro una soglia di 4,5). Il segno sta fuori dalla maschera: e'
un marchio, non una lettera.

15 controlli del film per rapporto, tutti col codice atteso nei tre formati.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@antoninobig-beep
antoninobig-beep merged commit 4927096 into main Sep 16, 2026
@antoninobig-beep
antoninobig-beep deleted the sprint-commerciali branch September 16, 2026 07:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant