longevity: modulo check-up sulla Scheda Rapida Profilazione Fisica di Nicola #13
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
COSA: il modulo del check-up rifatto sulla «Scheda Rapida Profilazione Fisica» di Nicola (profilazione_fisica_rapida.html), nel suo ordine di esecuzione. È anche il modulo della prima profilazione di un cliente nuovo (issue flusso nuovo cliente).
CAMPI (dalla scheda):
IMPATTO: nuovi test_id in lib/longevity/registro.ts (oggi mancano sit-to-stand, panca, trazioni, flamingo per lato/occhi, handgrip per lato, back scratch per lato, plank ginocchia, test aerobici diversi dal MUTT) e mappatura in lib/longevity/motore/fisici.ts dei test alternativi sulla stessa sotto-metrica (spinta, trazione, arti inferiori, cardio). Il test scelto va salvato con la misura: il cliente cambia test nel tempo (camminata → MUTT, rematore → trazioni) e il grafico per test deve segnare il cambio.
DOMANDE A NICOLA: soglia per passare da rematore a trazioni («dovrebbe saperla Claude»: nei documenti non c'è); come si combinano dx/sx e occhi aperti/chiusi nello score; tenere o no FC/pressione/SpO2.
FATTO QUANDO: il modulo in produzione ha i campi e l'ordine della scheda; ogni test alternativo alimenta la sotto-metrica giusta; test sul motore per ogni alternativa.
FONTE: call Adriano–Nicola 27/09/2026, trascrizione e allegati in wasabi:adp-work/AI-OS/projects/azienda/clienti/Insanity_Lab/Longevity_Project/docs/2026-09-27_call/
DECISIONE (Adriano, 27/09/2026): pressione e saturazione a riposo si TOLGONO dal modulo. FC a riposo resta. La scheda di profilazione non è visibile al cliente: solo staff.
🔵 daitarn — preso in carico 2026-09-27T20:38:29Z
ramo:
lavoro/daitarn· capacità: build-windows, gpuANALISI (passo 1, Opus) — gitea:Adriano/InsanityLab-web#13
RAMO: lavoro/daitarn a
2231a47(= origin/main). Cartella: apps/platforms.FONTI: Scheda Rapida (profilazione_fisica_rapida.html) + «ISL_Manuale_Batteria_Test_Completo.docx» di Nicola (27/09/2026, archiviato in wasabi:adp-work/AI-OS/projects/azienda/clienti/Insanity_Lab/Longevity_Project/docs/2026-09-27_call/). Il manuale conferma le formule già nel motore (MUTT 0,2×VAM+3,5; Queen's; UKK 2 km; MILFIT; bande VO2max; HRR Cole) e decide diversi punti aperti.
DECISIONI
a. Un test senza tabella di riferimento nel manuale si REGISTRA ma non dà punteggio (manuale §1: senza fonte → percentili interni futuri): panca manubri, trazioni, plank sulle ginocchia, 6MWT, flamingo occhi chiusi, FC per step MUTT, FC riposo, FC 2'.
b. Flamingo: punteggio = media dx/sx a occhi APERTI (la tabella Eurofit è a occhi aperti); occhi chiusi registrato.
c. Più test sulla stessa sotto-metrica (spinta, trazione, arti inferiori, VO2max, HRR): vale il test COMPLETO più recente del cliente; a parità di sessione, l'ordine di priorità sotto.
d. Nessun BMI di ripiego: si aggiunge l'altezza al pre-test; senza altezza sit-to-stand e 2 km non danno punteggio.
e. Handgrip in kg (le funzioni lavorano in kg); la conversione dai Newton del VALD è lavoro di #3.
f. La soglia di passaggio di ogni progressione compare nel modulo come testo d'aiuto; nessun suggerimento automatico (eventuale lavoro futuro).
UNITÀ A — registro e motore (un agente)
Nuovi test_id, attivo_da: DA, range di plausibilità larghi come gli altri:
f_altezza_cm (100-230, Composizione Corporea); f_fc_riposo_bpm (30-130);
f_back_scratch_dx_cm, f_back_scratch_sx_cm (-40..30);
f_flamingo_oa_dx, f_flamingo_oa_sx, f_flamingo_oc_dx, f_flamingo_oc_sx (cadute, 0-60);
f_handgrip_dx_kg, f_handgrip_sx_kg (5-100);
f_panca_man_carico_kg (kg per manubrio), f_panca_man_rip; f_panca_bil_carico_kg, f_panca_bil_rip;
f_trazioni_rip (0-60); f_sit_to_stand_rip (0-80); f_plank_ginocchia_sec (0-600);
f_6mwt_m (50-1200); f_walk2km_min (8-40), f_walk2km_fc_bpm (60-220); f_milfit_watt (20-500);
f_mutt_fc_max_bpm, f_mutt_fc_1min_bpm, f_mutt_fc_2min_bpm (40-230);
f_mutt_fc_7_5, f_mutt_fc_8_5, …, f_mutt_fc_14_5 (8 step da 1 km/h, 40-230).
Dismessi con attivo_a: '2026-09-28', MAI cancellati (le sessioni passate li usano, limite #12):
f_handgrip_kg, f_back_scratch_cm, f_flamingo_cadute, f_hrr_1min_bpm.
Restano attivi e invariati tutti gli altri, compresi f_pa_*, f_spo2_pct (Wellness Tower, import #3).
Etichette leggibili dal trainer, col protocollo breve dove serve (es. «Push-up massimali (donne sulle ginocchia)»).
Regola dei gruppi: per ogni sotto-metrica si considerano solo le alternative COMPLETE (tutti gli ingressi presenti, età/peso/altezza compresi), si sceglie quella la cui misura più recente ha recenza minore, a parità l'ordine qui sotto. Un'alternativa «solo registrata» non entra nel gruppo.
Aggiornare il commento di testa («FUORI DAL PERIMETRO»): 2 km, sit-to-stand, milfit ora dentro.
test-fisici.ts NON si tocca (porting dell'oracolo). Nessuna nuova voce in PESI_ASSE.
TEST A (tests/longevity/motore-fisici.test.ts o file nuovo): un caso per ogni alternativa che dà punteggio (valore atteso calcolato con la funzione di test-fisici); media dx/sx; un lato solo → nessun punteggio; recenza: pushup a gennaio + panca a marzo → vale panca, e viceversa; alternativa incompleta più recente (sit-to-stand senza altezza) → vale la precedente completa; storico f_handgrip_kg ancora letto; test «solo registrati» non producono chiavi; la cascata del VO2 per una sessione con solo f_vo2max resta uguale. Test di sessione (motore-fisici-sessione.test.ts): su DB, due sessioni con test diversi, lo score usa il più recente. Il caso reale (motore-caso-reale.test.ts) resta verde senza toccarne i numeri.
UNITÀ B — modulo, API, nota (secondo agente, dopo A)
4. src/lib/longevity/gestionale.ts: struttura del modulo nell'ordine del manuale (Pre-test → Mobilità → Equilibrio → Presa → Core → Forza spinta → Forza trazione → Arti inferiori → Aerobico → «Strumenti (Wellness Tower, Stress Index) finché non arriva l'import»). Una costante con sezioni; una sezione ha campi fissi oppure alternative [{chiave, nome, soglia (testo del manuale), campi: test_id[]}]. campiDelCheckup resta com'è per chi la usa oggi, o si sostituisce aggiornando i chiamanti: scelta dell'agente, detta nel rapporto. Regole: si mostrano solo test attivi alla data; un test f_* attivo alla data ma assente dalla struttura (i dismessi, correggendo una sessione vecchia) finisce in una sezione «Altre misure», mai perso. Pressione e SpO2 NON compaiono nel modulo (restano nel registro). Alternativa preselezionata: in correzione quella con campi nella sessione; in un check-up nuovo quella usata nell'ultimo check-up del cliente; altrimenti la prima (il livello neofita).
5. src/pages/longevity/gestionale/cliente/[code]/checkup.astro: sezioni come sopra; per le alternative radio button (niente : tests/longevity/referto.test.ts intercetta la parola) con nome e soglia di passaggio, i campi di ogni alternativa in un fieldset; poco JS che nasconde i fieldset non scelti (senza JS restano tutti visibili e funziona lo stesso). Dettaglio MUTT (FC per step) in . Campo «Note operatore» (textarea) solo per un check-up nuovo. 6. src/pages/api/longevity/gestionale/checkup.ts: per le sezioni ad alternative si tengono SOLO i campi dell'alternativa scelta dalla radio (i campi compilati di altre alternative si scartano). Nota operatore non vuota → aggiungiVoce del giornale (src/lib/longevity/giornale.ts, #16) con data della sessione e autore = utente loggato, dopo il salvataggio riuscito. Il resto invariato (correzione #12 compresa). TEST B: struttura (ordine sezioni, pressione/SpO2 assenti, dismesso in «Altre misure» su una data vecchia); API: campi di un'alternativa non scelta scartati; nota → voce di giornale; nota vuota → nessuna voce; preselezione dall'ultimo check-up. NON TOCCARE: motore/test-fisici.ts, motore/curve.ts, cascata.ts, PESI_*, questionario, anagrafica/identity, pagine cliente (/longevity/io, /longevity/progressione), schema DB (niente colonne nuove: i test sono righe di registro_test, seminate da seedRegistro). PROVA: in apps/platforms npx vitest run (baseline Windows: 277 verdi, 4 rossi di piattaforma — campus-lib resolveAsset; anagrafica.test.ts separatori \; EPERM in gestionale.test.ts e questionario-pagina.test.ts; nessun rosso nuovo), npx tsc --noEmit, npm run build. DEPLOY: nessuna migrazione a mano: seedRegistro (registro.ts:160, INSERT OR REPLACE) all'apertura del DB aggiunge le voci nuove e scrive attivo_a sui dismessi. Punteggi congelati delle sessioni esistenti: non si ricalcolano (lo storico resta); le sessioni nuove, e quelle corrette con #12, usano le regole nuove.
ESITO: fatto sul ramo, non in main né in produzione
RIF: gitea:Adriano/InsanityLab-web#13
COSA: controllo finale (passo 3, Opus) delle unità A e B scritte da Sonnet: il diff fa quello che dice l'analisi.
COMMIT (ramo lavoro/daitarn, pushato):
abd0626registro + motore (regola dei gruppi, recenzaValideAlla);f57a07atest motore;cffb0a6etichette sit-to-stand (1 minuto) e push-up (donne sulle ginocchia);c8187cestruttura modulo, pagina, API;81021d1test modulo/API;b0f30f9correzioni del controllo.CORRETTO AL CONTROLLO: (1) etichetta sit-to-stand «30 secondi» → 1 minuto; (2) una sezione senza radio nel form scartava in silenzio i campi delle alternative non-prime → ora senza radio non si scarta nulla; (3) nota > 5000 caratteri persa in silenzio dopo il salvataggio → rifiutata prima di scrivere, maxlength sulla textarea.
SCELTE DEGLI AGENTI accettate: recenza di un'alternativa a più campi = il suo ingresso più vecchio; peso/altezza/età non contano per la recenza; stessa sessione = stessa posizione, pareggio rotto dall'ordine del gruppo; campiDelCheckup lasciata per la vista di dettaglio sessione, modulo da strutturaCheckup; pressione/SpO2 esclusi anche da «Altre misure».
PROVA: apps/platforms
npx vitest run→ 314 verdi, 4 rossi = baseline Windows (campus-lib resolveAsset; anagrafica.test.ts separatori\, segnala solo anagrafica.ts e db.ts; EPERM x2);npx tsc --noEmit→ 0 errori;npm run build→ ok.DA CONFERMARE CON NICOLA: le decisioni a-f dell'analisi (test senza tabella registrati senza punteggio; flamingo solo occhi aperti; vale il test completo più recente; altezza obbligatoria per sit-to-stand e 2 km; handgrip in kg; soglie solo come testo).
MANCA: via di Adriano per merge su main e deploy (backup DB prima; nessuna migrazione: seedRegistro aggiunge le voci e scrive attivo_a all'apertura). Non provato in browser loggato.
🤖 goldrake — liberata nessun segno di daitarn da 6.0 h — 2026-09-28T02:38:03Z
Soluzione
ESITO: fatto, in produzione
RIF: gitea:Adriano/InsanityLab-web#13
COSA: modulo del check-up sulla Scheda Rapida e sul Manuale Batteria Test di Nicola (27/09/2026): sezioni nell'ordine del manuale, scelta del test per ogni progressione con la soglia di passaggio, pressione e SpO2 fuori dal modulo, nota operatore nel giornale (#16). 32 test_id nuovi; f_handgrip_kg, f_back_scratch_cm, f_flamingo_cadute, f_hrr_1min_bpm dismessi con attivo_a 2026-09-28 (restano per lo storico). Motore: regola dei gruppi (vale l'alternativa completa più recente), media dx/sx per handgrip, back scratch, flamingo occhi aperti; HRR da MUTT (FC max − FC 1'); sit-to-stand, 2 km, MILFIT e panca bilanciere danno punteggio.
FILE: apps/platforms/src/lib/longevity/registro.ts; motore/fisici.ts; motore/index.ts (recenzaValideAlla); gestionale.ts (strutturaCheckup e aiuti); pages/api/longevity/gestionale/checkup.ts; pages/longevity/gestionale/cliente/[code]/checkup.astro; test motore-fisici-gruppi, gestionale-modulo-checkup, checkup-alternative-api.
COMMIT:
abd0626,f57a07a,cffb0a6,c8187ce,81021d1,b0f30f9— mainb0f30f9.PROVA: vitest 314 verdi + 4 rossi di baseline Windows; tsc 0 errori; build ok. VPS 28/09 06:11 UTC: backup /opt/docker/insanitylab-platforms/backup/20260928T0611*-pre-13 (3 DB, integrity ok), container ricostruito, 56 test f_* nel registro, 4 dismessi con attivo_a 2026-09-28, integrity ok, /longevity/gestionale → 302 al login.
MANCA: prova in browser loggato (password trainer-prova ce l'ha Adriano); conferma di Nicola delle decisioni nostre → issue a parte.