longevity: modulo check-up sulla Scheda Rapida Profilazione Fisica di Nicola #13

Closed
opened 2026-09-27 19:55:57 +00:00 by Adriano · 6 comments
Owner

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):

  • Pre-test: FC riposo, pressione, SpO2, peso. ⚠️ in call Nicola dice che FC/pressione/SpO2 «non hanno senso di esistere»: da confermare prima di tenerli.
  • Mobilità: back scratch dx-sopra e sx-sopra (cm, due valori, NON la differenza); sit and reach (cm, negativo se non arriva ai piedi, 0 = tocca, positivo oltre).
  • Equilibrio: flamingo 60 s, cadute — 4 valori: dx/sx × occhi aperti/chiusi (la scheda ne ha 2, in call Nicola conferma che sono 4).
  • Forza presa: handgrip dx e sx (kg). A regime letto dal VALD (#3), non digitato.
  • Forza spinta: tendina test usato (5RM panca manubri | push-up max | 5RM panca bilanciere) + valore 1 (kg o rip) + valore 2 (rip, se 5RM).
  • Forza trazione: tendina (5RM rematore | trazioni) + valori come sopra.
  • Arti inferiori: tendina (1-minute sit-to-stand, sedia 42 cm | 5RM squat) + valori.
  • Core: plank su ginocchia o plank gomiti (s).
  • Aerobico (sempre ultimo): tendina (6MWT | Queen's College Step | 2 km walking | MUTT | MILFIT | Calibre) + distanza/tempo/watt/VO2 + FC finale/recupero; dettaglio MUTT: FC per velocità 7,5…14,5, FC max, FC a 1' e 2', VAM. Per lo score conta solo il VO2max; le FC servono al trainer.
  • Note operatore.
    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/
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): - Pre-test: FC riposo, pressione, SpO2, peso. ⚠️ in call Nicola dice che FC/pressione/SpO2 «non hanno senso di esistere»: da confermare prima di tenerli. - Mobilità: back scratch dx-sopra e sx-sopra (cm, due valori, NON la differenza); sit and reach (cm, negativo se non arriva ai piedi, 0 = tocca, positivo oltre). - Equilibrio: flamingo 60 s, cadute — 4 valori: dx/sx × occhi aperti/chiusi (la scheda ne ha 2, in call Nicola conferma che sono 4). - Forza presa: handgrip dx e sx (kg). A regime letto dal VALD (#3), non digitato. - Forza spinta: tendina test usato (5RM panca manubri | push-up max | 5RM panca bilanciere) + valore 1 (kg o rip) + valore 2 (rip, se 5RM). - Forza trazione: tendina (5RM rematore | trazioni) + valori come sopra. - Arti inferiori: tendina (1-minute sit-to-stand, sedia 42 cm | 5RM squat) + valori. - Core: plank su ginocchia o plank gomiti (s). - Aerobico (sempre ultimo): tendina (6MWT | Queen's College Step | 2 km walking | MUTT | MILFIT | Calibre) + distanza/tempo/watt/VO2 + FC finale/recupero; dettaglio MUTT: FC per velocità 7,5…14,5, FC max, FC a 1' e 2', VAM. Per lo score conta solo il VO2max; le FC servono al trainer. - Note operatore. 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/
Adriano added the sviluppo label 2026-09-27 19:55:57 +00:00
Author
Owner

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.

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.
Adriano added the assegnata:daitarn label 2026-09-27 20:38:30 +00:00
Author
Owner

🔵 daitarn — preso in carico 2026-09-27T20:38:29Z
ramo: lavoro/daitarn · capacità: build-windows, gpu

🔵 daitarn — **preso in carico** 2026-09-27T20:38:29Z ramo: `lavoro/daitarn` · capacità: build-windows, gpu
Author
Owner

ANALISI (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

  • Adriano 27/09: via pressione e SpO2 dal pre-test, resta FC a riposo; solo staff; correzione = sovrascrittura.
  • Dal manuale: handgrip = MEDIA dx/sx; back scratch = MEDIA dx/sx; pressione, SpO2, composizione, spalla → Wellness Tower; HRV → Stress Index; HRR = FC max − FC dopo 1' al MUTT.
  • Nostre, da confermare con Nicola (scritte nell'issue, non nel codice come verità):
    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)

  1. src/lib/longevity/registro.ts, FISICI.
    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)»).
  2. src/lib/longevity/motore/index.ts: accanto a misureValideAlla (firma e risultato INVARIATI) una funzione che dà anche la posizione di recenza di ogni test_id (0 = più recente, stesso ORDER BY). sottoDominiDellaSessione la passa a sottoDominiFisici.
  3. src/lib/longevity/motore/fisici.ts, sottoDominiFisici(m, eta, sesso, recenza?): recenza opzionale; senza, vale solo l'ordine di priorità (i test esistenti non cambiano).
    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.
    • handgrip: [media(f_handgrip_dx_kg, f_handgrip_sx_kg) — servono ENTRAMBI; f_handgrip_kg storico] → scoreHandgrip.
    • spinta: [f_panca_bil (carico, rip, peso) → scoreSollevamentoSuPeso TIERS_BENCH; f_pushup_rip → scorePushup].
    • trazione: [f_row (invariato)]. f_trazioni_rip solo registrato.
    • arti_inferiori: [f_squat (invariato); f_sit_to_stand_rip → scoreSitToStand(rip, eta, sesso, bmi) con bmi = peso/(altezza/100)^2 dalle misure].
    • core e plank: f_plank_sec invariato; f_plank_ginocchia_sec solo registrato.
    • vo2max: [f_vo2max; f_mutt_vam → vo2maxDaMutt; f_milfit_watt+peso → vo2maxDaMilfit; f_walk2km_min+f_walk2km_fc_bpm+eta+bmi → vo2maxDa2kmWalk; f_step_hr_recovery → vo2maxDaStepTest] → scoreVo2max. Oggi è cascata a priorità fissa: diventa regola dei gruppi.
    • hrr: [f_mutt_fc_max_bpm − f_mutt_fc_1min_bpm (entrambi); f_hrr_1min_bpm storico] → scoreRecuperoCardiaco.
    • flamingo: [media(f_flamingo_oa_dx, f_flamingo_oa_sx) — entrambi; f_flamingo_cadute storico] → scoreFlamingo.
    • back_scratch: [media(dx, sx) — entrambi; f_back_scratch_cm storico] → scoreBackScratch.
    • pressione, wellness_tower_cardio, grasso, muscolo, whr, hrv, sit_and_reach, spalla: invariati.
      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.

ANALISI (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 - Adriano 27/09: via pressione e SpO2 dal pre-test, resta FC a riposo; solo staff; correzione = sovrascrittura. - Dal manuale: handgrip = MEDIA dx/sx; back scratch = MEDIA dx/sx; pressione, SpO2, composizione, spalla → Wellness Tower; HRV → Stress Index; HRR = FC max − FC dopo 1' al MUTT. - Nostre, da confermare con Nicola (scritte nell'issue, non nel codice come verità): 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) 1. src/lib/longevity/registro.ts, FISICI. 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)»). 2. src/lib/longevity/motore/index.ts: accanto a misureValideAlla (firma e risultato INVARIATI) una funzione che dà anche la posizione di recenza di ogni test_id (0 = più recente, stesso ORDER BY). sottoDominiDellaSessione la passa a sottoDominiFisici. 3. src/lib/longevity/motore/fisici.ts, sottoDominiFisici(m, eta, sesso, recenza?): recenza opzionale; senza, vale solo l'ordine di priorità (i test esistenti non cambiano). 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. - handgrip: [media(f_handgrip_dx_kg, f_handgrip_sx_kg) — servono ENTRAMBI; f_handgrip_kg storico] → scoreHandgrip. - spinta: [f_panca_bil (carico, rip, peso) → scoreSollevamentoSuPeso TIERS_BENCH; f_pushup_rip → scorePushup]. - trazione: [f_row (invariato)]. f_trazioni_rip solo registrato. - arti_inferiori: [f_squat (invariato); f_sit_to_stand_rip → scoreSitToStand(rip, eta, sesso, bmi) con bmi = peso/(altezza/100)^2 dalle misure]. - core e plank: f_plank_sec invariato; f_plank_ginocchia_sec solo registrato. - vo2max: [f_vo2max; f_mutt_vam → vo2maxDaMutt; f_milfit_watt+peso → vo2maxDaMilfit; f_walk2km_min+f_walk2km_fc_bpm+eta+bmi → vo2maxDa2kmWalk; f_step_hr_recovery → vo2maxDaStepTest] → scoreVo2max. Oggi è cascata a priorità fissa: diventa regola dei gruppi. - hrr: [f_mutt_fc_max_bpm − f_mutt_fc_1min_bpm (entrambi); f_hrr_1min_bpm storico] → scoreRecuperoCardiaco. - flamingo: [media(f_flamingo_oa_dx, f_flamingo_oa_sx) — entrambi; f_flamingo_cadute storico] → scoreFlamingo. - back_scratch: [media(dx, sx) — entrambi; f_back_scratch_cm storico] → scoreBackScratch. - pressione, wellness_tower_cardio, grasso, muscolo, whr, hrv, sit_and_reach, spalla: invariati. 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 <select>: 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 <details>. 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.
Author
Owner

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): abd0626 registro + motore (regola dei gruppi, recenzaValideAlla); f57a07a test motore; cffb0a6 etichette sit-to-stand (1 minuto) e push-up (donne sulle ginocchia); c8187ce struttura modulo, pagina, API; 81021d1 test modulo/API; b0f30f9 correzioni 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.

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): abd0626 registro + motore (regola dei gruppi, recenzaValideAlla); f57a07a test motore; cffb0a6 etichette sit-to-stand (1 minuto) e push-up (donne sulle ginocchia); c8187ce struttura modulo, pagina, API; 81021d1 test modulo/API; b0f30f9 correzioni 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.
Adriano removed the assegnata:daitarn label 2026-09-28 02:38:03 +00:00
Author
Owner

🤖 goldrake — liberata nessun segno di daitarn da 6.0 h — 2026-09-28T02:38:03Z

🤖 goldrake — **liberata** nessun segno di daitarn da 6.0 h — 2026-09-28T02:38:03Z
Author
Owner

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 — main b0f30f9.
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.

**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 — main b0f30f9. 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.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/InsanityLab-web#13