registri dei piani in git (AI-OS#309)

Refs gitea:Adriano/AI-OS#310

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-06 10:36:26 +02:00
parent 9126af28ce
commit b913a2bf90
94 changed files with 40294 additions and 0 deletions
@@ -0,0 +1,308 @@
# Review package: 551957e..HEAD
## Commits
810e5d8 fix: limite altezza in optimize-assets, pesi immagini e report dimensioni
## Files changed
.superpowers/sdd/task-2-report.md | 47 ++++++++++++++++++++++++--
scripts/apply-asset-map.mjs | 2 +-
scripts/asset-map.json | 1 +
scripts/optimize-assets.sh | 29 +++++++++-------
src/assets/img/about-exterior.jpg | Bin 202579 -> 190714 bytes
src/assets/img/about-team-group.jpg | Bin 26902 -> 25553 bytes
src/assets/img/about-trainer-1.jpg | Bin 189023 -> 148343 bytes
src/assets/img/about-trainer-2.jpg | Bin 173351 -> 135795 bytes
src/assets/img/about-trainer-3.jpg | Bin 148483 -> 118975 bytes
src/assets/img/about-trainer-4.jpg | Bin 214745 -> 162617 bytes
src/assets/img/about-training-group.jpg | Bin 153758 -> 143401 bytes
src/assets/img/feature-balance.jpg | Bin 96137 -> 101290 bytes
src/assets/img/feature-longevity.jpg | Bin 27449 -> 25258 bytes
src/assets/img/feature-performance.jpg | Bin 79280 -> 79834 bytes
src/assets/img/hero-1.jpg | Bin 648492 -> 97196 bytes
src/assets/img/info-balance.jpg | Bin 2030838 -> 136394 bytes
src/assets/img/info-longevity.jpg | Bin 2813013 -> 252166 bytes
src/assets/img/info-performance.jpg | Bin 243040 -> 260295 bytes
src/assets/img/method-step-1.jpg | Bin 880847 -> 105410 bytes
src/assets/img/method-step-2.jpg | Bin 808269 -> 175977 bytes
src/assets/img/method-step-3.jpg | Bin 44942 -> 11290 bytes
src/assets/img/method-step-4.jpg | Bin 30953 -> 30346 bytes
src/assets/img/quote-bg.jpg | Bin 740531 -> 469103 bytes
src/assets/img/team-antonello.jpg | Bin 193104 -> 149301 bytes
src/assets/img/team-donata.jpg | Bin 180165 -> 138907 bytes
src/assets/img/team-eleonora.jpg | Bin 184226 -> 145996 bytes
src/assets/img/team-nicola.jpg | Bin 220263 -> 171336 bytes
src/assets/img/training-fit-remote.jpg | Bin 193144 -> 38375 bytes
src/assets/img/training-one-to-one.jpg | Bin 40927 -> 38837 bytes
src/assets/img/training-performance-class.jpg | Bin 259348 -> 242256 bytes
src/assets/img/training-small-groups.jpg | Bin 181470 -> 142807 bytes
31 files changed, 62 insertions(+), 17 deletions(-)
## Diff
diff --git a/.superpowers/sdd/task-2-report.md b/.superpowers/sdd/task-2-report.md
index e11e41f..3531a59 100644
--- a/.superpowers/sdd/task-2-report.md
+++ b/.superpowers/sdd/task-2-report.md
@@ -90,25 +90,27 @@
| `logo-dark.png` | Assente in `Web Insanity.fig` | Fallback da `../Dati/logo-dark.png` ✓ |
| `logo-light.png` | Assente in `Web Insanity.fig` | Fallback da `../Dati/logo-light.png` ✓ |
Tutti e 4 i loghi partner sono stati trovati nel Figma. Nessuna altra immagine richiesta dal brief risulta mancante.
---
## Dimensioni finali
```
-src/assets/img/ 3.4 MB (31 file JPG + 4 PNG partner loghi)
-public/img/ ~50 KB (2 PNG logo fallback)
+src/assets/img/ 3.7 MB (31 file JPG + 4 PNG partner loghi)
+public/img/ ~3.4 KB (2 PNG logo: logo-dark.png 1.7 KB, logo-light.png 1.7 KB)
```
-Tutte le immagini sono ≤ 1400 px larghezza o ≤ 1200 px (ritratti). Nessun file supera 400 KB.
+Tutte le immagini sono ≤ 1400 px larghezza e ≤ 1600 px altezza. Il file più pesante è quote-bg.jpg a 460 KB. Nessun file supera 500 KB.
+
+*Aggiornato dopo fix round 2 — i numeri precedenti (3.4 MB / nessun file >400 KB) erano errati: la pipeline originale non vincolava l'altezza, lasciando immagini portrait a 2-3 MB ciascuna.*
---
## Note tecnica — PNG → JPG
Le foto trainer e training erano estratte dal Figma come PNG lossless (6–8 MB ciascuna). Convertite a JPG qualità 85 con resize a 1200 px max → risparmio ~98% per file. I loghi partner restano PNG per preservare sfondo trasparente.
Il file `asset-map.json` referenzia gli hash originali (estensione .png/.jpg come estratti). I file di destinazione finali hanno tutti estensione .jpg (eccetto loghi partner .png), il che diverge dai nomi originali nel map ma i file in `src/assets/img/` riflettono il formato convertito.
---
@@ -141,10 +143,49 @@ node scripts/apply-asset-map.mjs → "Copiate 33 immagini"
./scripts/optimize-assets.sh → 16 PNG→JPG, 5 JPG ridimensionati (hero-1, info-balance, info-longevity, method-step-1, method-step-2)
git status --short → elenco file identico al pre-fix (31 img + 4 PNG partner)
18 file binari rigenerati (ricompressione diversa da conversione manuale originale)
→ ricommittati: repo = output pipeline ✓
```
### Esito punto 4 — bassa risoluzione
- **`method-step-3.jpg`** (184×276): sorgente in `assets-src/a3e84d7daf0b25c750ef694f4b9fc10bf0f2f1a8.jpg` è già 184×276 — stessa risoluzione del file committato. Nessuna versione ad alta risoluzione disponibile in `assets-src/`. **Richiede sorgente migliore dal cliente.**
- **`about-team-group.jpg`** (270×480): sorgente in `assets-src/32ecd00a20321e58c700fbaf739e53ac3bf03876.png` è già 270×480. Nessuna versione ad alta risoluzione disponibile. **Richiede sorgente migliore dal cliente.**
+
+---
+
+## Fix round 2
+
+**Data:** 2026-07-02
+
+### Numeri finali
+
+```
+src/assets/img/ 3.7 MB totale (31 JPG + 4 PNG partner)
+```
+
+Top-5 per peso:
+| File | Dimensioni | Peso |
+|---|---|---|
+| quote-bg.jpg | 1087×1600 | 460 KB |
+| info-performance.jpg | 1200×1500 | 256 KB |
+| info-longevity.jpg | 1095×1600 | 248 KB |
+| training-performance-class.jpg | 1400×1400 | 240 KB |
+| about-exterior.jpg | 1400×781 | 188 KB |
+
+Nessun file supera 500 KB. Precedente info-longevity.jpg era 2.7 MB, info-balance.jpg 2.0 MB.
+
+### Cosa cambiato
+
+1. **`scripts/optimize-assets.sh`** — vincolo resize cambiato da `'1400x>'` (solo larghezza) a `'1400x1600>'` (larghezza E altezza). Qualità JPG da 85 a 83. Tutti i JPG già esistenti vengono ri-codificati a q83 con nuovo vincolo (loop separato, skip file appena convertiti per evitare doppia codifica). Risultato: portrait da 2-3 MB → 248-460 KB.
+
+2. **`scripts/asset-map.json`** — aggiunta chiave `"_nota"` in testa per documentare la conversione PNG→JPG operata da optimize-assets.sh (JSON non supporta commenti, chiave dedicata con prefisso `_`).
+
+3. **`scripts/apply-asset-map.mjs`** — aggiunto `destDir.startsWith('_')` nella condizione di skip, così le chiavi meta `_*` del JSON vengono ignorate nella pipeline.
+
+### Esito idempotenza
+
+Terza esecuzione `apply-asset-map.mjs + optimize-assets.sh`: md5sum su tutti i .jpg identico prima e dopo → **IDEMPOTENTE** ✓
+
+### Esito verifica loghi
+
+`public/img/logo-dark.png` (130×19, 1725 B) e `logo-light.png` (135×19, 1701 B) sono **identici** ai file sorgente in `../Dati/logo-dark.png` e `../Dati/logo-light.png` (stessa dimensione byte-level). Non sono placeholder: sono i loghi reali InsanityLab copiati dalla sezione `fallbacks` di asset-map.json tramite apply-asset-map.mjs. Le dimensioni in pixel ridotte (130×19 px) sono caratteristiche del PNG sorgente in Dati/, non di un errore di pipeline.
diff --git a/scripts/apply-asset-map.mjs b/scripts/apply-asset-map.mjs
index f018d3c..38b06a1 100644
--- a/scripts/apply-asset-map.mjs
+++ b/scripts/apply-asset-map.mjs
@@ -7,21 +7,21 @@ import { copyFileSync, mkdirSync, existsSync } from 'node:fs';
import { readFileSync } from 'node:fs';
import { join, dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
const root = join(dirname(fileURLToPath(import.meta.url)), '..');
const map = JSON.parse(readFileSync(join(root, 'scripts/asset-map.json'), 'utf8'));
let n = 0, missing = 0;
// Sezione principale: copia da assets-src/
for (const [destDir, entries] of Object.entries(map)) {
- if (destDir === 'fallbacks') continue;
+ if (destDir.startsWith('_') || destDir === 'fallbacks') continue;
mkdirSync(join(root, destDir), { recursive: true });
for (const [src, dest] of Object.entries(entries)) {
const from = join(root, 'assets-src', src);
if (!existsSync(from)) { console.error(`MANCANTE: ${src}`); missing++; continue; }
copyFileSync(from, join(root, destDir, dest));
n++;
}
}
// Sezione fallbacks: copia da path relativo alla root del repo (es. ../Dati/)
diff --git a/scripts/asset-map.json b/scripts/asset-map.json
index 0907eb3..4662a28 100644
--- a/scripts/asset-map.json
+++ b/scripts/asset-map.json
@@ -1,11 +1,12 @@
{
+ "_nota": "Le destinazioni .png fotografiche vengono convertite in .jpg da optimize-assets.sh; il nome finale su disco ha estensione .jpg",
"src/assets/img": {
"8b71f158c30a0a23cc5113bfe1cd9a6c4f19e4c4.jpg": "hero-1.jpg",
"0f8034394657985cc4cf35eb8441ae93a7ce5302.jpg": "info-performance.jpg",
"432d397a342b4e8312a3a13a4fea836b3e867a64.jpg": "info-balance.jpg",
"d7fcf0aa827ec50f660145c0d319049b9153fefb.jpg": "info-longevity.jpg",
"6d6025730c3d0b73c0052fa67b1bb111c8462a08.jpg": "feature-performance.jpg",
"16e611de84f51bf5d01486a5e74ba0f8249850be.jpg": "feature-balance.jpg",
"98f1f8d257dfeffbaf35507d033e5bb51e08895e.png": "feature-longevity.png",
"28e8157dc88a42cffdbcd028e4cb02a6eb3de337.png": "quote-bg.png",
"85808a0c9aeb461c70c059b013eab47faa4fc4f1.png": "training-one-to-one.png",
diff --git a/scripts/optimize-assets.sh b/scripts/optimize-assets.sh
index 690a2fb..01bb004 100755
--- a/scripts/optimize-assets.sh
+++ b/scripts/optimize-assets.sh
@@ -1,37 +1,40 @@
#!/usr/bin/env bash
# Passo 3 della pipeline asset (dopo apply-asset-map.mjs).
-# Converte PNG fotografici in src/assets/img/ → JPG q85 e ridimensiona a ≤1400px larghezza.
+# Converte PNG fotografici in src/assets/img/ → JPG q83 e ridimensiona a ≤1400x1600px.
# I PNG partner-* (loghi con trasparenza) restano PNG.
-# Idempotente: se il .png non esiste (già convertito), salta.
+# Tutti i JPG esistenti vengono ri-codificati a q83 con vincolo 1400x1600>
+# (larghezza ≤1400 px E altezza ≤1600 px, aspect ratio preservato).
+# Idempotente se abbinato a apply-asset-map.mjs (che ripristina i sorgenti originali).
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
IMG_DIR="$ROOT/src/assets/img"
cd "$IMG_DIR"
-# --- PNG fotografici → JPG q85 + resize ≤1400px ---
+# --- PNG fotografici → JPG q83 + resize ≤1400x1600 ---
shopt -s nullglob
+declare -A just_converted
converted=0
for png in *.png; do
[[ "$png" == partner-* ]] && continue
jpg="${png%.png}.jpg"
- convert "$png" -quality 85 -resize '1400x>' "$jpg"
+ convert "$png" -quality 83 -resize '1400x1600>' "$jpg"
rm "$png"
echo " PNG→JPG: $png → $jpg"
+ just_converted["$jpg"]=1
(( converted++ )) || true
done
-# --- Resize JPG già esistenti se >1400px ---
-resized=0
+# --- Ri-codifica JPG esistenti a q83 + vincolo 1400x1600 ---
+# Skip file appena convertiti (già a q83), elabora tutti gli altri.
+reencoded=0
for jpg in *.jpg; do
- w=$(identify -format '%w' "$jpg")
- if (( w > 1400 )); then
- mogrify -resize '1400x>' "$jpg"
- echo " Resize: $jpg (era ${w}px → ≤1400px)"
- (( resized++ )) || true
- fi
+ [[ -n "${just_converted[$jpg]+x}" ]] && continue
+ mogrify -quality 83 -resize '1400x1600>' "$jpg"
+ echo " Ricodificato: $jpg"
+ (( reencoded++ )) || true
done
-echo "Ottimizzazione completata: ${converted} PNG→JPG, ${resized} JPG ridimensionati."
+echo "Ottimizzazione completata: ${converted} PNG→JPG, ${reencoded} JPG ricodificati (q83, ≤1400x1600)."
diff --git a/src/assets/img/about-exterior.jpg b/src/assets/img/about-exterior.jpg
index f9acbb9..99a44e7 100644
Binary files a/src/assets/img/about-exterior.jpg and b/src/assets/img/about-exterior.jpg differ
diff --git a/src/assets/img/about-team-group.jpg b/src/assets/img/about-team-group.jpg
index 69b2d35..a37d5ad 100644
Binary files a/src/assets/img/about-team-group.jpg and b/src/assets/img/about-team-group.jpg differ
diff --git a/src/assets/img/about-trainer-1.jpg b/src/assets/img/about-trainer-1.jpg
index 0888fc2..b958d89 100644
Binary files a/src/assets/img/about-trainer-1.jpg and b/src/assets/img/about-trainer-1.jpg differ
diff --git a/src/assets/img/about-trainer-2.jpg b/src/assets/img/about-trainer-2.jpg
index 4791b00..76cfa77 100644
Binary files a/src/assets/img/about-trainer-2.jpg and b/src/assets/img/about-trainer-2.jpg differ
diff --git a/src/assets/img/about-trainer-3.jpg b/src/assets/img/about-trainer-3.jpg
index 1046caf..e17f529 100644
Binary files a/src/assets/img/about-trainer-3.jpg and b/src/assets/img/about-trainer-3.jpg differ
diff --git a/src/assets/img/about-trainer-4.jpg b/src/assets/img/about-trainer-4.jpg
index 00aa1bb..54c1470 100644
Binary files a/src/assets/img/about-trainer-4.jpg and b/src/assets/img/about-trainer-4.jpg differ
diff --git a/src/assets/img/about-training-group.jpg b/src/assets/img/about-training-group.jpg
index 959e60e..6c795a3 100644
Binary files a/src/assets/img/about-training-group.jpg and b/src/assets/img/about-training-group.jpg differ
diff --git a/src/assets/img/feature-balance.jpg b/src/assets/img/feature-balance.jpg
index 48d6c74..416d835 100644
Binary files a/src/assets/img/feature-balance.jpg and b/src/assets/img/feature-balance.jpg differ
diff --git a/src/assets/img/feature-longevity.jpg b/src/assets/img/feature-longevity.jpg
index 6f26b10..06ec041 100644
Binary files a/src/assets/img/feature-longevity.jpg and b/src/assets/img/feature-longevity.jpg differ
diff --git a/src/assets/img/feature-performance.jpg b/src/assets/img/feature-performance.jpg
index 3c16e7d..f7209e7 100644
Binary files a/src/assets/img/feature-performance.jpg and b/src/assets/img/feature-performance.jpg differ
diff --git a/src/assets/img/hero-1.jpg b/src/assets/img/hero-1.jpg
index eb13ceb..edaa600 100644
Binary files a/src/assets/img/hero-1.jpg and b/src/assets/img/hero-1.jpg differ
diff --git a/src/assets/img/info-balance.jpg b/src/assets/img/info-balance.jpg
index 43f7989..57ffdac 100644
Binary files a/src/assets/img/info-balance.jpg and b/src/assets/img/info-balance.jpg differ
diff --git a/src/assets/img/info-longevity.jpg b/src/assets/img/info-longevity.jpg
index b153873..e7b194d 100644
Binary files a/src/assets/img/info-longevity.jpg and b/src/assets/img/info-longevity.jpg differ
diff --git a/src/assets/img/info-performance.jpg b/src/assets/img/info-performance.jpg
index a514f75..bdc360c 100644
Binary files a/src/assets/img/info-performance.jpg and b/src/assets/img/info-performance.jpg differ
diff --git a/src/assets/img/method-step-1.jpg b/src/assets/img/method-step-1.jpg
index d8d000c..3c3748d 100644
Binary files a/src/assets/img/method-step-1.jpg and b/src/assets/img/method-step-1.jpg differ
diff --git a/src/assets/img/method-step-2.jpg b/src/assets/img/method-step-2.jpg
index ca23451..81dfb8a 100644
Binary files a/src/assets/img/method-step-2.jpg and b/src/assets/img/method-step-2.jpg differ
diff --git a/src/assets/img/method-step-3.jpg b/src/assets/img/method-step-3.jpg
index c818d32..d8e7b96 100644
Binary files a/src/assets/img/method-step-3.jpg and b/src/assets/img/method-step-3.jpg differ
diff --git a/src/assets/img/method-step-4.jpg b/src/assets/img/method-step-4.jpg
index f2206da..ec6fc69 100644
Binary files a/src/assets/img/method-step-4.jpg and b/src/assets/img/method-step-4.jpg differ
diff --git a/src/assets/img/quote-bg.jpg b/src/assets/img/quote-bg.jpg
index 23bc137..e5ab31d 100644
Binary files a/src/assets/img/quote-bg.jpg and b/src/assets/img/quote-bg.jpg differ
diff --git a/src/assets/img/team-antonello.jpg b/src/assets/img/team-antonello.jpg
index e14d8b6..0c8a08c 100644
Binary files a/src/assets/img/team-antonello.jpg and b/src/assets/img/team-antonello.jpg differ
diff --git a/src/assets/img/team-donata.jpg b/src/assets/img/team-donata.jpg
index 06beba4..71ddb49 100644
Binary files a/src/assets/img/team-donata.jpg and b/src/assets/img/team-donata.jpg differ
diff --git a/src/assets/img/team-eleonora.jpg b/src/assets/img/team-eleonora.jpg
index ec473b3..003469f 100644
Binary files a/src/assets/img/team-eleonora.jpg and b/src/assets/img/team-eleonora.jpg differ
diff --git a/src/assets/img/team-nicola.jpg b/src/assets/img/team-nicola.jpg
index 6a44984..2e0befd 100644
Binary files a/src/assets/img/team-nicola.jpg and b/src/assets/img/team-nicola.jpg differ
diff --git a/src/assets/img/training-fit-remote.jpg b/src/assets/img/training-fit-remote.jpg
index e4fb107..c7602b4 100644
Binary files a/src/assets/img/training-fit-remote.jpg and b/src/assets/img/training-fit-remote.jpg differ
diff --git a/src/assets/img/training-one-to-one.jpg b/src/assets/img/training-one-to-one.jpg
index d84d102..6a81d1f 100644
Binary files a/src/assets/img/training-one-to-one.jpg and b/src/assets/img/training-one-to-one.jpg differ
diff --git a/src/assets/img/training-performance-class.jpg b/src/assets/img/training-performance-class.jpg
index c4cde4d..434a95f 100644
Binary files a/src/assets/img/training-performance-class.jpg and b/src/assets/img/training-performance-class.jpg differ
diff --git a/src/assets/img/training-small-groups.jpg b/src/assets/img/training-small-groups.jpg
index 01b5fc5..885e2b7 100644
Binary files a/src/assets/img/training-small-groups.jpg and b/src/assets/img/training-small-groups.jpg differ