Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 61 additions & 4 deletions .github/workflows/showcase.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,10 @@ jobs:
path: video/out
key: ${{ steps.key.outputs.value }}

# Node 22 serve anche quando i render arrivano dalla cache: il passo della
# pagina chiede al manifest i casi della proiezione, e il manifest legge i
# moduli .ts del kit, che il Node preinstallato sul runner non sa leggere.
- uses: actions/setup-node@v4
if: steps.cache.outputs.cache-hit != 'true'
with:
node-version: 22
cache: npm
Expand Down Expand Up @@ -108,9 +110,9 @@ jobs:

# Le misure che possono fallire. Se una scena e' rotta, il deploy non parte.
#
# Le generiche (riempimento di ogni scena, giunta di ogni coppia adiacente)
# arrivano dal catalogo. Le altre sono legate a una scena sola e restano
# scritte qui: derivarle da un elenco nasconderebbe che esistono.
# Le generiche (la giunta di ogni coppia adiacente) arrivano dal catalogo.
# Le altre sono legate a una scena sola e restano scritte qui: derivarle da
# un elenco nasconderebbe che esistono.
- name: misure
if: steps.cache.outputs.cache-hit != 'true'
run: |
Expand All @@ -127,6 +129,19 @@ jobs:
./scripts/beats.sh
./scripts/contrast-floor.py

# CAM-06 FUORI DA TOPICS. Il bersaglio resta sull'origine della
# prospettiva mentre la camera avanza, su due lastre (Topics e la
# lastra sonda, chiara e verticale) e in tre rapporti. E' il primo
# banco che non guarda solo Topics in 16:9.
./scripts/drift.py

# LA CAMERA COME DATO. Le tracce di products/topics/tracks.ts sono quelle che
# le scene passano al render: da li' si misura che la camera non torni
# mai indietro in moto (GIU-04) e che la lastra copra i quattro bordi
# del quadro su ogni frame (CAM-01), senza chiederlo ai pixel.
./scripts/chain-check.py
./scripts/fill-geom.py

# IL TEMPO. Le battute interne di una scena sono scritte rispetto a una
# durata di riferimento e `durationInFrames` le scala tutte, quindi
# cambiare la velocita' di una clip e' cambiare un numero in
Expand Down Expand Up @@ -159,6 +174,29 @@ jobs:
[ "$rc" = 1 ] || { echo "framelocked-verdict.sh sulla sonda con Math.random: atteso 1, ottenuto $rc" >&2; cat /tmp/fv.log >&2; exit 1; }
echo "framelocked-verdict.sh boccia la sonda con Math.random, come deve."

# drift.py deve bocciare i due guasti in TUTTE e sei le varianti, non in
# una: --must-fail esce 0 solo se ognuna esce dalla tolleranza. Senza lo
# spostamento il bersaglio parte gia' fuori posto; con l'origine
# sbagliata parte giusto e scappa mentre la camera avanza, che e'
# l'incidente raccontato dalla grammatica.
for guasto in '{"compensate": false}' '{"originMismatch": true}'; do
rc=0; ./scripts/drift.py --props "$guasto" --must-fail > /tmp/drift.log 2>&1 || rc=$?
[ "$rc" = 0 ] || { echo "drift.py con $guasto: almeno una variante promossa, o misura mancata (rc=$rc)" >&2; cat /tmp/drift.log >&2; exit 1; }
done
echo "drift.py boccia i due guasti in tutte e sei le varianti, come deve."

# chain-check.py deve accorgersi della stessa catena senza easing, dove
# le giunte non sono piu' ferme e le inversioni diventano in moto.
rc=0; ./scripts/chain-check.py --linear --must-fail > /tmp/cc.log 2>&1 || rc=$?
[ "$rc" = 0 ] || { echo "chain-check.py promuove una catena che si inverte in moto (rc=$rc)" >&2; cat /tmp/cc.log >&2; exit 1; }
echo "chain-check.py boccia la catena senza easing, come deve."

# fill-geom.py deve bocciare ogni scena con la camera arretrata: e' il
# difetto che fill-measure.sh sui pixel promuoveva.
rc=0; ./scripts/fill-geom.py --push-offset -1500 --must-fail > /tmp/fg.log 2>&1 || rc=$?
[ "$rc" = 0 ] || { echo "fill-geom.py promuove una lastra arretrata (rc=$rc)" >&2; cat /tmp/fg.log >&2; exit 1; }
echo "fill-geom.py boccia la lastra arretrata in ogni scena, come deve."

./scripts/fixture-screenshot.sh
if ./scripts/focus-sharpness.sh video/out/.fixture-card-focus-screenshot.mp4 >/dev/null 2>&1; then
echo "focus-sharpness.sh promuove una scena fatta di screenshot: non misura niente." >&2
Expand Down Expand Up @@ -256,6 +294,25 @@ jobs:
# banco che guarda dei pixel del browser invece del DOM.
python3 -m pip install --quiet --disable-pip-version-check playwright pillow
python3 -m playwright install --with-deps chromium

# La proiezione del kit (kit/project.ts) contro Chromium: due lastre,
# tre stage, le sei pose della catena, cinque punti ciascuno. E deve
# accorgersi di un'origine della prospettiva sbagliata nel CSS.
./scripts/project-check.py
rc=0; ./scripts/project-check.py --origin-mismatch --must-fail > /tmp/pc.log 2>&1 || rc=$?
[ "$rc" = 0 ] || { echo "project-check.py non si accorge dell'origine sbagliata (rc=$rc)" >&2; cat /tmp/pc.log >&2; exit 1; }
echo "project-check.py boccia l'origine sbagliata, come deve."

# Nessun banco si calcola da se' la geometria di un prodotto: la chiede
# al manifest. E il controllo deve bocciare una copia dei banchi in cui
# uno torna a importare topics/geometry.ts.
./scripts/no-product-literals.sh
mkdir -p /tmp/banchi-guasti && cp scripts/*.sh scripts/*.py scripts/*.mjs /tmp/banchi-guasti/
printf '%s\n' "read -r X < <(node --input-type=module -e 'const m = await import(\"\$ROOT/video/src/products/topics/geometry.ts\"); console.log(m.THREAD_TOP)')" >> /tmp/banchi-guasti/handoff-travel.sh
rc=0; ./scripts/no-product-literals.sh /tmp/banchi-guasti > /tmp/npl.log 2>&1 || rc=$?
[ "$rc" = 1 ] || { echo "no-product-literals.sh promuove un banco che importa topics/geometry.ts (rc=$rc)" >&2; cat /tmp/npl.log >&2; exit 1; }
echo "no-product-literals.sh boccia un banco che importa topics/geometry.ts, come deve."

./scripts/demo-check.py

# E i cicli si devono chiudere. Le demo girano in loop: se l'ultimo
Expand Down
Loading
Loading