Skip to content

Il kit, passi 1-5: la geometria esce da Topics senza cambiare un pixel - #13

Merged
antoninobig-beep merged 6 commits into
mainfrom
kit-blocco-1-5
Sep 15, 2026
Merged

antoninobig-beep merged 6 commits into
mainfrom
kit-blocco-1-5

Conversation

@antoninobig-beep

Copy link
Copy Markdown
Collaborator

Primo blocco del piano del kit: passi 1-5, solo refactor. Le sei scene di Topics escono identiche a main, fotogramma per fotogramma; quello che cambia e' dove sta il codice e cosa i banchi riescono a misurare.

Cosa entra

  1. La geometria prende lo stage come parametro. kit/stage.ts (16:9, 9:16, 4:5) e kit/rig.ts (prospettiva, origine, spinta per ingrandimento e per riempimento). CAM-06 ha il suo banco, drift.py, su due lastre (Topics e una lastra sonda sintetica) e tre rapporti: scarto massimo 2,03 px, i due negativi scappano di 39,5-99,8 px in 6 varianti su 6.
  2. Un solo blocco di ripresa. kit/Shot.tsx prende il posto delle sei copie del rig CSS 3D che le scene si portavano dietro.
  3. La proiezione esatta con la camera inclinata. kit/project.ts confrontato con Chromium da project-check.py su 36 casi: errore massimo 0,04 px, 103,7 px con l'origine sbagliata. I quattro banchi che si calcolavano la geometria con un node -e interno ora la chiedono a scripts/manifest.mjs, e no-product-literals.sh boccia chi torna a farlo.
  4. La camera diventa un dato. kit/camera.ts (tracce, poseAt, checkChain) e le tracce di Topics. GIU-04 e CAM-01 hanno finalmente un banco: chain-check.py (7 inversioni, tutte a giunte ferme; senza easing diventano inversioni in moto e il banco boccia) e fill-geom.py (5 scene coperte su ogni frame dal 20%; BoardOrbit non dichiara piu' fill, perche' l'orbita mostra i bordi apposta).
  5. Topics in una cartella sua. Tutto quello che e' di Topics sta in video/src/products/topics/. Fuori restano il kit, il cursore e gli aiuti frame-locked, cioe' quello che un altro prodotto puo' usare cosi' com'e'.

Come si sa che non cambia niente

  • still-identity.sh main: stessi sha256 dei PNG di remotion still su tutte le scene (primo, secondo, mezzo, penultimo, ultimo frame), piu' le finestre che i cinque di default non attraversano: UIMockup 20-81, PromptInput 125-300, BoardOrbit 100-140. Il negativo (una posa spostata di 1 px) esce 1.
  • geometry-snapshot.mjs: 140 valori identici a main.
  • I banchi del manifest stampano le stesse righe di prima; il fixture di fixture-screenshot.sh ha lo stesso hash.
  • Riproduzione locale dei passi CI estratti dal workflow (lint, misure, negativi, assemblaggio, pagina): tutti rc=0. In locale le misure girano sui render gia' presenti, che valgono perche' i fotogrammi sono identici, e i negativi saltano solo il caso di beats.sh senza tesseract, che vuole sudo. Il render vero lo fa questa CI, perche' la chiave della cache cambia con video/src.

Da sapere

🤖 Generated with Claude Code

Antonino Cuzzola and others added 6 commits September 15, 2026 12:21
…stre e tre rapporti

slabPointOnScreen e centreOn avevano 1920 e 1080 scritti dentro: valevano solo
in 16:9. Adesso stanno in video/src/kit/rig.ts con stage, rig e lastra come
parametri, insieme a zoomForPush, pushForZoom e pushForFill (la spinta che fa
occupare a un rettangolo una frazione del quadro). slab.ts tiene tutti i suoi
export e chiama il kit con i numeri di Topics: geometry-snapshot.mjs fotografa
38 costanti, sette pose e le funzioni su punti campione, e prima e dopo sono la
stessa stringa. still-identity.sh rende cinque fotogrammi di ogni scena da main
e da qui: trenta su trenta identici, e uno spostamento di un pixel lo boccia.

L'origine della prospettiva e' una scelta del rig, non un risultato della
geometria. drift.py lo prova sul render con sei specimen di CAM-06: la card di
Topics e quella di una lastra sonda (chiara, verticale, scala 1, un prodotto che
non esiste) in 16:9, 9:16 e 4:5. Il bersaglio resta entro 4 px dall'origine dal
primo all'ultimo frame, 2,03 al peggio. Boccia in tutte e sei le varianti la
spinta senza compensazione, e quella con lo spostamento calcolato sul 46% e il
CSS al 50%, che parte esatta e scappa di 39,5-99,8 px come prevede la formula.

scripts/manifest.mjs calcola dal kit cosa i banchi devono trovare.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Il piano attenuato dietro, lo spessore, la lastra e la luce sul quadro stavano
ricopiati a mano in tutte e sei le scene, con prospettiva 2600, origine
"50% 46%", (1920 - SLAB_W) / 2, scale(1.04) e i sette numeri di parallasse del
piano dietro scritti in ogni copia, mentre i banchi misuravano costanti di
slab.ts che nessuna scena leggeva. Adesso le scene passano a kit/Shot.tsx la
posa e il contenuto, i numeri dell'aspetto di Topics stanno una volta sola in
primitives/material.ts, e lo stage viene dalla composition.

Le sei copie differivano in tre punti, che Shot prende come props: la
dissolvenza del quadro in UIMockup, il cursore dentro la lastra in CardHandoff e
PromptInput, il filo di luce sul bordo basso che PromptInput e BoardOrbit non
hanno. SlabEdge e SlabLighting escono da SlabChrome, dove nessuno li usa piu'.

still-identity.sh contro main: cinque fotogrammi per scena, trenta su trenta
identici, strumento ripetibile.

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

kit/project.ts dice dove finisce sullo schermo un punto della lastra a una
posa qualsiasi, rifacendo in aritmetica la catena CSS di Shot: scala, rotateX,
rotateY, spinta, prospettiva attorno all'origine del rig. project-check.py la
confronta con getBoundingClientRect di Chromium su 36 casi (due lastre, tre
stage, le sei pose della catena di Topics, cinque punti ciascuno): errore
massimo 0,040 px, e con l'origine sbagliata nel CSS arriva a 103,7 px e il
banco se ne accorge.

handoff-travel, focus-sharpness, fixture-screenshot e contrast-floor si
calcolavano la geometria di Topics in uno script node dentro di se'. Adesso la
chiedono a manifest.mjs, che la calcola una volta in video/src/manifest/topics.ts:
uscite identiche riga per riga, fixture con lo stesso hash.
no-product-literals.sh boccia un banco che torna a leggere video/src da se', e
sui banchi del commit prima segnala esattamente quei quattro.

In CI setup-node gira sempre, perche' il passo della pagina legge i moduli .ts
del kit anche quando i render arrivano dalla cache.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Ogni scena calcolava la camera dentro il componente: solo il render poteva dire
la posa a un frame qualsiasi. kit/camera.ts la rende una traccia (una curva per
asse) che poseAt legge con interpolate ed Easing di Remotion, con gli stessi
argomenti delle scene. Le sei tracce stanno in primitives/tracks.ts e le scene
le leggono. still-identity.sh accetta i fotogrammi da confrontare: identici a
main anche nei frame 20-81 di UIMockup e attorno all'assestamento di PromptInput
e BoardOrbit. Il cursore prende il frame della scena invece del proprio orologio.

chain-check.py (GIU-04) legge le tracce lungo la catena: nessuna inversione in
moto, sette inversioni tutte a giunte ferme; senza easing diventano in moto e il
banco boccia. fill-geom.py (CAM-01) proietta la lastra con la posa di ogni frame:
cinque scene coprono i quattro bordi con almeno 5,4 px, arretrate di 1500 le
boccia tutte. Al primo giro ha bocciato BoardOrbit, e aveva ragione: l'orbita
lascia scoperti i bordi apposta. La scena dichiarava fill e il vecchio banco sui
pixel la promuoveva; ora non lo dichiara piu'.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ltro prodotto puo' usare

La lastra, i token, l'arredo, il materiale, le tracce, la geometria dei banchi e
le sei scene stanno in video/src/products/topics/. Fuori restano il kit, il
cursore e gli aiuti frame-locked. Tolti i ponti di geometry.ts verso il kit:
chi ha bisogno di una funzione di ripresa la chiama dal kit con stage e rig.

Nessun numero cambia: geometry-snapshot da' gli stessi 140 valori di main,
still-identity e' identico a main su tutte le scene e sulle finestre di
UIMockup, PromptInput e BoardOrbit, i banchi del manifest stampano le stesse
righe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… pagina con lo script

CAM-01 e GIU-04 hanno un banco dal passo 4: 31 su 36, 4 da scrivere, 1 fuori CI.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@antoninobig-beep
antoninobig-beep merged commit a720a3d into main Sep 15, 2026
1 check passed
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