Files
Adriano b913a2bf90 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>
2026-10-06 10:36:26 +02:00

111 lines
13 KiB
Markdown

Task 1: complete (commits 9780e51..5f7ed1f, review clean)
Minor: README indica porta dev 3000, Astro 5 usa 4321 — correggere in review finale
Remote GitLab configurato: ssh://git@git.tielogic.xyz:222/Adriano/InsanityLab-web.git — push iniziale ok. Task 17 = solo push finale + verifica.
Task 2 round 2 chiuso (810e5d8): pesi ok 3.7MB, pipeline idempotente. Round 3 in corso: loghi in Dati/ = PROWESS++ (template), logo vero estratto da PDF Figma.
Nota per operatore: chiedere comunque al cliente il logo vettoriale ufficiale (SVG/AI).
Task 2: complete (commits 5f7ed1f..4445c42, 3 fix round, review chiusa — loghi verificati dal controller)
Aperti per cliente: method-step-3.jpg 184px e about-team-group.jpg 270px bassa risoluzione; logo ufficiale vettoriale da richiedere.
Task 3: complete (commits 4445c42..c9a9ff9, review clean)
Task 4: complete (commits c9a9ff9..42d603b, review clean)
Task 5: complete (commits 42d603b..d3b5e67, review clean)
Minor: listPublished passa category:undefined anche quando la query non lo usa — cosmetico
Task 6: complete (commits d3b5e67..6caba6f, review clean)
Minor x3: trailing slash /admin/login/; middleware usa startsWith('/api/') nel ramo 401; createUser senza upsert (diverge da create-user.mjs)
Task 8: complete (commits 6caba6f..ac75720, 1 fix round apostrofi, review chiusa con verifica controller)
Task 7: complete (commits ac75720..2fdd1b9, review clean)
Minor x3: aria-label burger statico; input senza label espliciti; logo-light 140px (autorizzati ~120)
Task 9: complete (commits 2fdd1b9..45e5214, review clean; deviazioni da PDF valutate corrette)
Minor: heading Training senza .container wrapper; verifica virgola citazione (RISOLTA dal controller: PDF ha la virgola, implementazione corretta)
Da verificare in browser reale prima del go-live: ritratti TeamSection (probabile artefatto lazy-load screenshot)
Task 10: complete (commits 45e5214..c4cb05e, 1 fix round, review chiusa)
Minor a ledger: tgrid--founders identica a tgrid; direction:rtl per invertire colonne (rischio bidi mitigato)
Aperti per cliente: testi Storylab 2025/2026/OGGI; foto Eva+4 staff; foto hi-res sezione About/Metodo/Convenzioni
Task 11: complete (commits c4cb05e..ed35491, review clean)
Minor: CTA lezione di prova nel PDF ha immagine decorativa, brief solo testo — valutare in rifinitura
Task 12: complete (commits ed35491..be4d933, review clean)
Minor gap brief-vs-PDF: eventuali immagini card /programs, icone sidebar, posizione colonna FAQ — rifinitura
Task 13: complete (commits be4d933..e984010, review clean)
Minor: fase rossa TDD non documentata nel report
Note: rate-limit in-memory (ok single-process); mapsQuery da site.ts costante → nessun vettore XSS (adjudicato controller)
Task 14: complete (commits e984010..f3fb2fe, review clean)
Dipendenza critica: set:html su body_html si fida del DB — la sanitizzazione al salvataggio (Task 15) è OBBLIGATORIA
Task 15: complete (commits f3fb2fe..f0ad162, review clean — XSS chain e traversal verificati su build prod)
Minor x3: DELETE senza check esistenza; upload solo extension-whitelist (no magic byte); cover URL non validata
Da verificare in browser: editor TipTap interattivo
Task 16: complete (commits f0ad162..29d633c, review clean, smoke exit 0)
Task 17: complete (remote GitLab verificato, tutto pushato, tree pulito)
Review finale: READY_WITH_FIXES → fix applicati (6d19637): sitemap filter admin, categorie sidebar reali, 404 vero blog, og:image, README porta+Astro7. Tutte le verifiche verdi. BRANCH PRONTO.
## Piano 2026-07-05: contenuti taggati + pannello editor (branch feat/contenuti-taggati)
Task 1: complete (commits 83237fe..c7d9d4b, review clean)
Task 2: complete (commits c7d9d4b..274a6c7, 1 fix round regex bypass — refuso del piano, corretto anche nel doc; review chiusa)
Minor a ledger: assert duplicato tests/roles.test.ts
Task 3: complete (commits 0f94b50..5f1d9f3, review clean)
Minor a ledger: verifica runtime editor 403/redirect rimandata a Task 15/17
Task 4: complete (commits 5f1d9f3..6f51aec, review clean)
Task 5: complete (commits 6f51aec..b22cc40, review clean)
Minor a ledger: sync seed duplicato db.ts/content.ts (mandato dal piano per evitare ciclo import)
Task 6: complete (commits b22cc40..b079ded, review clean)
Minor a ledger: 1 hint astro check nuovo (probabile typing widths TImg) da riguardare quando consumato
Task 7: complete (commits b079ded..f4c350a, review clean; tag logo image aggiunti su indicazione controller)
Task 8: complete (commits f4c350a..3f01721, review clean)
Minor a ledger: TImg ramo override droppa widths/sizes/data-* — rivedere se/quando override immagini con animazioni
Task 9: complete (commits 3f01721..34fd3d2, review clean)
Minor a ledger: TImg prop height aggiunta (additiva); h2 training usa data-tag manuale con toLowerCase, stili preset non applicati su quel tag
Task 10: complete (commits 34fd3d2..b84463c: about+timeline d5b19f2 + fix short-name b84463c; review: codice ok, Critical era stato repo — causato da doppio dispatch controller, edit-war tra 2 subagent, risolto; HEAD stabile verificato)
LEZIONE CONTROLLER: mai ridispatchare un task se il primo agent risulta ancora vivo
Task 11: complete (commits b84463c..31354c4, review clean)
Task 12: complete (commits 31354c4..3551fae; interrotto da spegnimento PC, ripreso e chiuso: bf38fc8 estrazione + 3551fae fix round review)
Review: 2 Minor fixati — (1) contentImageUrl passava sempre stringa → hero contact perdeva ottimizzazione webp, ora getImageOverride() ?? contactHero; (2) mapsQuery da site.ts divergeva da indirizzo taggato, ora da t('global.contact.*')
Nota: PageHero ora accetta bgImage string|ImageMetadata (previsto dal piano per override da /uploads)
Task 13: complete (commits 3551fae..b5c0c10: 685ef4a flip SSR+sitemap + b5c0c10 fix round; review clean, 2 Minor fixati: dep @astrojs/sitemap rimossa, README aggiornato)
Deviazione consapevole: query sitemap usa solo draft=0 (senza published_at<=now del piano) per coerenza con src/lib/posts.ts — adjudicata ok dal reviewer
Verifica: build ok, 44 test, sitemap 12 <loc>, /programs/inesistente 404, tutte route vetrina 200 in SSR
Task 14: complete (commits b5c0c10..bf19cba: eda4d73 TDD API + bf19cba fix round; review chiusa, 2 Minor fixati: guard body null su PUT, TAG_RE+randomBytes su nome file upload)
47 test verdi; verifiche HTTP complete via curl con cookie admin (401 senza cookie, editor coperto da EDITOR_ALLOWED regex — verificato dal reviewer)
Nota curl dev: i POST richiedono header Origin per il checkOrigin CSRF di Astro
Task 15: complete (commits bf19cba..608b1b6: be52781 pannello + 608b1b6 fix round; review clean, 3 Minor fixati: guard decodeURIComponent, PUT ritorna value salvato + data-q aggiornato post-save, aria-label su search/input/file)
Verifica implementatore: 391 righe/6 gruppi, 0 tag in "Altro"; UI testata con Playwright (save, upload, restore, nav editor, redirect /admin→/admin/content); screenshot in scratchpad
Nota: PUT /api/admin/content/[tag] ora risponde { ok, value } (value post-sanitizzazione)
Task 16: complete (commit 56ca6ec, review CLEAN)
Minor a ledger: listener scroll/resize per badge (~99 in home, layout thrashing potenziale — tool interno, accettato); doppio badge su home.quote.text (aria-hidden duplicato, cosmetico)
Task 17: complete (commit 8495d9e: smoke esteso sitemap/data-tag/annotate-anonimo; utente editor locale creato e verificato: /admin→302 /admin/content, PUT contenuti 200, POST posts 403; smoke exit 0 su build prod)
Trappola trovata: EADDRINUSE silenzioso su porta 4399 se resta un server stantio — lo smoke passava contro la build vecchia; fuser -k 4399/tcp prima di rilanciare
Review finale: READY_WITH_FIXES → fix applicati (c975dca): card programmi home taggate (Major), README sezione Gestione Contenuti, import type ImageMetadata in about, commento scaffolding seed rimosso. Tutte verifiche verdi (47 test, astro check 0 err, smoke exit 0).
Task 18: complete (2026-07-05). Merge ff main 83237fe→c975dca, push Gitea ok. VPS: git pull + docker compose up -d --build ok. Verifica prod: tutte route 200, sitemap 12 loc, data-tag in home, 0 badge anonimo, blog invariato. Utente editor prod creato nel container (docker compose exec -T insanitylab npm run create-user); verificato con login vero: pannello 200, PUT tag → visibile sul sito → ripristinato, badge annotate da loggato, POST posts 403. Credenziali consegnate all'operatore (da salvare in Vaultwarden). PIANO COMPLETO.
## Piano 2026-07-05: utenti/ruoli/login/GUID/modifica inline (branch feat/utenti-ruoli-login)
Base branch: d4cf359
Task 1: complete (commit d4cf359..5cea895, review clean)
Minor: import createUser inutilizzato in content-db.test.ts (da brief); test migrazione editor->superuser esercita SQL non il path createDb (noto, coperto da smoke prod)
Task 2: complete (commit 5cea895..e87a464, review clean)
Minor: fallback matrice su pathname con query — nullo, middleware usa url.pathname (senza query); copertura test prefix-confusion parziale su /api/admin/users
Task 3: complete (commit e87a464..db92fc9, review clean)
Task 4: complete (commit db92fc9..6d1e260, review clean)
Task 5: complete (commit 6d1e260..c3267c9, review clean — ownership pre-azione verificata, nessun bypass)
Task 6: complete (commit c3267c9..5ce10da, review clean — variante routing B: GET in [tag].ts, index.ts rimosso)
Task 7: complete (commit 5ce10da..6b85872, review clean)
Low(sicurezza): safeNext non blocca varianti backslash (/\evil) — valutare hardening in review finale
Nota: middleware redirige a /admin/login (alias voluto), /login pubblica parallela
Task 8: complete (commit 6b85872..71cd162, review clean)
Nota: Base.astro ora fa getSessionUser ad ogni request (necessario per header); query leggera su singleton, accettabile
Task 9: complete (commit 71cd162..8423716, review clean — check ruolo nell'endpoint, unica barriera, presente)
Task 10: complete (commit 8423716..22d72be, review clean — XSS mitigato via value sanitizzato dal PUT; interazione browser badge/modal DA CONFERMARE in verifica funzionale Task 14)
Task 11: complete (commit 22d72be..2bf6b3d, review clean — nessun ruolo editor residuo, coerenza colonne thead/tbody)
Task 12: complete (commit 2bf6b3d..0f2b2ba, review clean)
Task 13: complete (commit 0f2b2ba..c36ad4c, review clean — tutte le guardie self/ultimo-admin/isRole verificate, no leak hash)
Low(accettato by design): campo password nuovo-utente type=text (admin deve vedere/consegnare la pw, coerente con reset-password)
Task 14: complete (commit c36ad4c..be77285, review clean — smoke exit 0)
Minor: incoerenza stilistica smoke (fail=1 inline vs || fail=1) + check badge anonimo ridondante, entrambi cosmetici
Fix fuori-piano: create-user.mjs validava ancora admin/editor → aggiornato a admin/superuser/user (commit dopo be77285)
Task 14 verifica funzionale (controller, playwright-core + chromium): 22/23+ownership PASS.
Verificato a runtime: anon Accedi/no-badge, /admin/users 302; user gating (no content/no users, no toggle), POST articolo 201; superuser badge+guid (111 badge), toggle presente, MODAL INLINE salva+aggiorna in-place+ripristino, no /admin/users; admin gestione utenti (crea/reset-pw 12char/cambio-ruolo/elimina), self-delete 403; ownership: user PUT/DELETE su post altrui 403.
Note: 2 falsi negativi risolti (stringa toggle-tags nello script vs elemento; waitForSelector [hidden] vs attributo). Rate limit login 5/15min in-memory scatta con run ripetuti (atteso), reset al restart.
Review finale (opus): READY_WITH_FIXES → 2 Important fixati (commit 7211d74):
I1 safeNext bloccava open redirect via backslash (/\evil → //evil, attivabile dal ramo già-loggato senza credenziali)
I2 /admin/edit/[id] senza guardia ownership: user poteva leggere corpo/bozze altrui → aggiunto canModifyPost+redirect
Verifica runtime I2: redirect a /admin, contenuto bozza NON esposto (PASS). Fix re-reviewati Approved, 70 test verdi.
Minor lasciati (triati dalla review): rate-limit login su clientAddress dietro proxy (bucket globale, pre-esistente come /admin/login — valutare X-Forwarded-For in futuro); sanitizeInline senza rel=noopener (cosmetico); vari test-only e by-design.
BRANCH MERGIATO: ff main → 7211d74, push Gitea ok, branch feature eliminato. 70/70 test. DEPLOY VPS in attesa di conferma operatore (sito live).
DEPLOY PROD OK (2026-07-05): git pull + docker compose up -d --build. Verificato: editor->superuser applicata (superuser), guid UUID popolati+univoci, author_id presente; /login 302 login reale, GET /api/admin/users 200, GET /api/admin/content/[tag] 200 con guid, POST /api/admin/showtags 200, /admin/users 200; anon /admin/users 302, Accedi+data-guid in home. Admin temp verifytmp creato e rimosso. PIANO COMPLETO.