Refs gitea:Adriano/AI-OS#310 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
8.2 KiB
Task 1 — Il guscio: layout e foglio di stile — report
Stato: completato. 5/5 test nuovi verdi, suite completa allo stato atteso (1 fallito
pre-esistente e fuori perimetro), npx tsc --noEmit pulito. Commit fatto.
Commit: 34c66ca — "longevity: il guscio della piattaforma, senza semaforo sui punteggi"
File aggiunti (solo questi, git add esplicito, nessun -A):
src/layouts/Longevity.astrosrc/styles/longevity.csssrc/pages/longevity/index.astrotests/longevity/pagine.test.ts
Procedura seguita (TDD)
Step 1-2: test scritto, verificato rosso
Comando:
npm test -- tests/longevity/pagine.test.ts
Esito (prima dell'implementazione): 5 falliti — ENOENT su src/layouts/Longevity.astro
e src/styles/longevity.css (file non esistenti), e existsSync(.../index.astro) a false.
Step 3: implementazione
src/layouts/Longevity.astro— nienteimport Header/Footerpubblico,<meta name="robots" content="noindex, nofollow" />, propstitle,crumbs,variante('referto' | 'gestionale', default'referto'). Solo la formarefertoè realizzata in questo task: una colonna (.lg-shell,max-width: 760px) senza navigazione, come richiesto dal brief — la barra laterale gestionale arriva col piano successivo.src/styles/longevity.css— globale, prefissato.lg, con le variabili locali richieste:Nessuna variabile--lg-tratteggio: #d8d2c8; /* il perimetro di ciò che non sappiamo */ --lg-fuori-range: #b05a4e; /* SOLO per una misura sospetta, mai per un punteggio */--lg-ok/--lg-buono/--lg-verde: l'intensità di un punteggio è affidata a--lg-intensita(0..1), consumata comeopacitysu.lg-score__bar-fillsopra un unico colore d'accento (var(--c-accent)), non a un colore diverso per fascia.src/pages/longevity/index.astro— nessun indice, soloAstro.redirect('/longevity/io')(la rotta/longevity/ioarriva col Task 3; per ora la protezione è già del middleware esistente suisProtectedPath/canAccessAdminPath, nessuna modifica adauth.tsnecessaria: le regole per/longevityci sono già).
Step 4: test target verde
Comando:
npm test -- tests/longevity/pagine.test.ts
Output:
Test Files 1 passed (1)
Tests 5 passed (5)
Step 5: suite completa + typecheck
Comando:
npm test
Output (coda):
❯ tests/modifiche-agosto.test.ts (25 tests | 1 failed) 72ms
× l'inaugurazione dice la data e che il programma manca ancora 8ms
FAIL tests/modifiche-agosto.test.ts > promo ed eventi > l'inaugurazione dice la data e che il programma manca ancora
AssertionError: expected 'Inaugurazione' to contain '19 settembre 2026'
Test Files 1 failed | 37 passed (38)
Tests 1 failed | 313 passed (314)
Esattamente il rosso pre-esistente dichiarato nel brief (fuori perimetro, non toccato) — nessun altro test rotto, i 5 nuovi inclusi nel verde.
Comando:
npx tsc --noEmit
Output: nessuno (exit pulito).
Step 6: commit
git status --porcelain # solo i 4 file nuovi, nessun altro modificato
git add src/layouts/Longevity.astro src/styles/longevity.css src/pages/longevity/index.astro tests/longevity/pagine.test.ts
git commit -m "longevity: il guscio della piattaforma, senza semaforo sui punteggi"
[feat/longevity 34c66ca] longevity: il guscio della piattaforma, senza semaforo sui punteggi
4 files changed, 176 insertions(+)
git status dopo il commit: albero pulito.
Dubbi / note per chi esegue il Task 2/3
src/pages/longevity/index.astroreindirizza a/longevity/io, che non esiste ancora (arriva col Task 3): finché il Task 3 non è fatto, visitare/longevity/produce un redirect verso una rotta 404. È il comportamento descritto dal brief, non un difetto di questo task.- La variante
gestionaleè dichiarata nel tipoPropsdiLongevity.astro(condata-variantesul<body>per un eventuale hook CSS futuro) ma il corpo del layout renderizza solo la forma a colonna: nessuna barra laterale è stata costruita, come da perimetro del task ("questo task realizza la prima; la seconda arriva col piano del gestionale"). - Non ho toccato
src/lib/auth.ts: le regole per/longevity(incluso il ramo/longevity/gestionaleper il ruolotrainer) risultavano già presenti inRULESeisProtectedPath, presumibilmente da un piano precedente (strato dati). Segnalo per conferma, nel caso non fosse atteso.
Rinforzo dopo revisione (2026-08-22)
Stato: completato. Commit 2ea822a sopra a 34c66ca.
Tre correzioni chieste dal coordinatore, tutte in tests/longevity/pagine.test.ts (unico
file toccato, nessuna modifica a layout/CSS/pagina):
-
Test anti-semaforo reso strutturale. Il vecchio test cercava tre nomi vietati nel CSS — un colore scritto direttamente (esadecimale) o una variabile con un altro nome lo aggiravano. Il nuovo test (
nelle regole di un punteggio compaiono solo i colori ammessi...) fa il contrario: prende ogni regola CSS il cui selettore contienelg-score, estrae ogni dichiarazione su una proprietà-colore (color,background,border-*-color,outline-color,fill,stroke), e verifica che il valore siavar(--nome)con--nomein un allowlist esplicito (l'accento del sito, il tratteggio, il fuori range, più i token neutri di testo/sfondo già in uso). Qualunque letterale (hex,rgb(), nome CSS) ovar()fuori allowlist è una violazione raccolta in un array che il test pretende vuoto. Il vecchio test sui nomi vietati è rimasto come controllo separato (cattura anche un token dichiarato ma mai usato, es.--lg-verde-scuro: ...;non referenziato in nessuna regola). -
Test sulla rotta rinforzato. Prima verificava solo
existsSync. Ora legge il file e controlla che contengaAstro.redirect('/longevity/io')con una regex sul contenuto, non solo sull'esistenza. -
Prefisso classi, un carattere.
c.startsWith('lg')accettava anchelgfoo(senza trattino). Cambiato inc === 'lg' || c.startsWith('lg-').
Prova richiesta: il test nuovo diventa rosso davvero
Backup del CSS reale, poi due regressioni iniettate una alla volta (gli esempi dati dal coordinatore), test rilanciato, poi ripristino e riverifica verde.
Regressione 1 — verde esadecimale su una classe di punteggio, aggiunta in coda al
foglio: .lg-score--alto { color: #6f8f6a; }. Comando: npm test -- tests/longevity/pagine.test.ts.
Output (estratto):
tests/longevity/pagine.test.ts (6 tests | 1 failed)
x nelle regole di un punteggio compaiono solo i colori ammessi: l'accento, il tratteggio, il fuori range
AssertionError: expected [ Array(1) ] to deeply equal []
+ ".lg-score--alto { color: #6f8f6a }"
Test Files 1 failed (1)
Tests 1 failed | 5 passed (6)
Rosso, come atteso. (La stringa riportata include anche il commento sulla riga precedente perché il parser del test cattura tutto ciò che precede la graffa aperta — cosmetico, non inficia la rilevazione.)
Regressione 2 — variabile con nome innocuo: .lg-score--alto { color: var(--lg-buona-salute); }.
Stesso comando. Output: Tests 1 failed | 5 passed (6) — rosso, stesso test.
Ripristino dal backup fatto prima delle due prove, poi verifica che il file torni
identico all'HEAD già committato (git diff --stat senza output) e che il test torni
verde:
Test Files 1 passed (1)
Tests 6 passed (6)
Verifiche finali
npm test -- tests/longevity/pagine.test.ts → 6/6 verdi.
npm test → Test Files 1 failed | 37 passed (38), Tests 1 failed | 314 passed (315);
il fallito è sempre e solo tests/modifiche-agosto.test.ts > ... inaugurazione ...
(pre-esistente, fuori perimetro, non toccato).
npx tsc --noEmit → nessun output, pulito.
Commit
git status --porcelain prima di committare mostrava solo tests/longevity/pagine.test.ts
modificato.
git add tests/longevity/pagine.test.ts
git commit -m "longevity: test anti-semaforo strutturale (colori ammessi, non nomi vietati) e rotta verificata sul contenuto"
Risultato:
[feat/longevity 2ea822a] longevity: test anti-semaforo strutturale (colori ammessi, non nomi vietati) e rotta verificata sul contenuto
1 file changed, 44 insertions(+), 4 deletions(-)