CSV: deviazione della quota NaN vuota nel backend, «NaN» nel CSV del browser #124

Closed
opened 2026-10-28 21:01:01 +00:00 by Adriano · 4 comments
Owner

src/backend/api/routers/measurements.py:362-366 e src/backend/services/production_export_service.py:163 scrivono la deviazione vuota quando value è None (#118); src/frontend/flask_app/static/js/csv-export.js:98 e templates/measure/task_complete.html scrivono «NaN». Stessa misura, due forme nelle esportazioni. Trovato dalla revisione Fable di #118-#121 (28/10).

src/backend/api/routers/measurements.py:362-366 e src/backend/services/production_export_service.py:163 scrivono la deviazione vuota quando value è None (#118); src/frontend/flask_app/static/js/csv-export.js:98 e templates/measure/task_complete.html scrivono «NaN». Stessa misura, due forme nelle esportazioni. Trovato dalla revisione Fable di #118-#121 (28/10).
Adriano added the bug label 2026-10-28 21:01:01 +00:00
Author
Owner

ANALISI (Opus, passo 1) — correzioni della revisione Fable di #118-#121, un solo agente Sonnet.

RIF: gitea:Adriano/TieMeasureFlow#123 #124 #125 (+ #118 per le etichette). Worktree C:/Users/Adriano/lavoro/TieMeasureFlow-rev118, ramo lavoro/daitarn-tmf-rev118, base 815d49d (= 43ef220 + pannello operatore su <tmf-viewer> di #122). Frontend in src/frontend/flask_app/.

#123 — Registra riattivo sul frame già registrato

FILE: static/js/vision_execute.js (versione 815d49d).

  • Nuovo stato recordedBlob: null (commento // #123: ...): il frame salvato dall'ultimo Registra riuscito.
  • record(): al successo (saved = true) this.recordedBlob = blob.
  • canRecord: !!this.lastBlob && this.lastBlob !== this.recordedBlob && !this.saved && !this.registering.
  • Listener task-result-reset: saved = false; preview = !!this.result && this.lastBlob !== this.recordedBlob (il badge «Anteprima, non registrata» non compare sul frame già registrato); poi, con camera in modo impulsivo (hasCamera && !inLinea), this.grab() (nuovo frame come all'apertura della pagina, init fa lo stesso), altrimenti this.kick() come oggi.
  • In linea in pausa dopo il reset: resta sul frame vecchio, Registra spento finché un frame nuovo arriva (Riprendi). Senza camera: invariato (il file scelto si registra da sé, acquire → _emitRecorded).
    TEST: estendi tests/js/test_vision_rows.js o tests/js/test_vision_zoom.js (finti come quelli esistenti): dopo record riuscito + task-result-reset → canRecord falso e preview falso; un frame nuovo (lastBlob diverso) → canRecord vero; in impulsivo il reset chiama grab una volta. tests/test_vision_rows_js.py, tests/test_vision_zoom_js.py, tests/test_template_js_syntax.py verdi.

#118 — etichetta NaN sull'immagine

FILE: static/js/vision_overlay.js labels() (~riga 252). Oggi una riga con value null/undefined/''/bool viene saltata. Nuovo: se l'ancoraggio esiste, l'etichetta c'è con testo r.name + ' NaN ' + (r.unit || '') e status della riga (fail). Number(null) resta da evitare (è 0): il test di null va prima della conversione. Valori non finiti (NaN, Infinity da stringa) → stessa etichetta NaN.
TEST: tests/js/test_vision_overlay.js: il caso «value null → nessuna etichetta» diventa «value null → etichetta con 'NaN', status della riga»; riga senza ancoraggio → ancora nessuna etichetta. tests/test_vision_overlay_js.py verde.

#124 — deviazione NaN nelle esportazioni backend

FILE: src/backend/api/routers/measurements.py (~362-366): deviazione "NaN" quando m.value is None, altrimenti come oggi (vuota se deviation None). src/backend/services/production_export_service.py (~163): stessa regola. Controlla src/backend/services/report_service.py (~431): se c'è la deviazione, stessa regola.
TEST: nel test CSV esistente di #118 (src/backend/tests/test_nan_measurements.py) asserisci anche la deviazione NaN; idem per l'export di produzione se ha già un test con NaN (altrimenti aggiungine uno breve sullo stile del file).

#125 — test

  • src/backend/tests/test_vision_execute.py:219: rinomina in test_a_nan_quote_needs_supervisor_authorisation, docstring: la quota NaN è un fail come gli altri e chiede il capoturno (pending_authorisation), la prossima acquisizione non è bloccata. Aggiungi l'assert che prova l'ultima frase: una seconda POST /api/vision/execute sullo stesso task risponde 200 (il fixture worker_says è già lì).
  • src/backend/tests/test_migrations.py classe TestMeasurementValueNullableMigration: nuovo test test_022_keeps_rows: upgrade a 021_task_acquisition, inserisci 3 righe in measurements con sqlite3 (colonne NOT NULL senza default riempite come fa lo script C:/Users/Adriano/AppData/Local/Temp/claude/D--Sorgenti-AI-OS/e91af050-3fbb-422c-b846-0ae1addac919/scratchpad/mig_check.py, da leggere), upgrade head → stesso conteggio e somma di value, stessi nomi di indici, pragma integrity_check = ok, una riga con value NULL accettata.

NON TOCCARE: templates/measure/task_execute.html, static/js/image_viewer.js, static/js/save_image.js, templates/maker/task_editor.html, static/js/dxf_recipe_wizard.js, scripts/, il blocco di tolleranza (pending_authorisation, decisione: la quota NaN resta un fail che chiede il capoturno).

ANALISI (Opus, passo 1) — correzioni della revisione Fable di #118-#121, un solo agente Sonnet. RIF: gitea:Adriano/TieMeasureFlow#123 #124 #125 (+ #118 per le etichette). Worktree `C:/Users/Adriano/lavoro/TieMeasureFlow-rev118`, ramo `lavoro/daitarn-tmf-rev118`, base `815d49d` (= `43ef220` + pannello operatore su `<tmf-viewer>` di #122). Frontend in `src/frontend/flask_app/`. ## #123 — Registra riattivo sul frame già registrato FILE: `static/js/vision_execute.js` (versione `815d49d`). - Nuovo stato `recordedBlob: null` (commento `// #123: ...`): il frame salvato dall'ultimo Registra riuscito. - `record()`: al successo (`saved = true`) `this.recordedBlob = blob`. - `canRecord`: `!!this.lastBlob && this.lastBlob !== this.recordedBlob && !this.saved && !this.registering`. - Listener `task-result-reset`: `saved = false`; `preview = !!this.result && this.lastBlob !== this.recordedBlob` (il badge «Anteprima, non registrata» non compare sul frame già registrato); poi, con camera in modo impulsivo (`hasCamera && !inLinea`), `this.grab()` (nuovo frame come all'apertura della pagina, `init` fa lo stesso), altrimenti `this.kick()` come oggi. - In linea in pausa dopo il reset: resta sul frame vecchio, Registra spento finché un frame nuovo arriva (Riprendi). Senza camera: invariato (il file scelto si registra da sé, `acquire` → `_emitRecorded`). TEST: estendi `tests/js/test_vision_rows.js` o `tests/js/test_vision_zoom.js` (finti come quelli esistenti): dopo record riuscito + `task-result-reset` → `canRecord` falso e `preview` falso; un frame nuovo (`lastBlob` diverso) → `canRecord` vero; in impulsivo il reset chiama `grab` una volta. `tests/test_vision_rows_js.py`, `tests/test_vision_zoom_js.py`, `tests/test_template_js_syntax.py` verdi. ## #118 — etichetta NaN sull'immagine FILE: `static/js/vision_overlay.js` `labels()` (~riga 252). Oggi una riga con `value` null/undefined/''/bool viene saltata. Nuovo: se l'ancoraggio esiste, l'etichetta c'è con testo `r.name + ' NaN ' + (r.unit || '')` e `status` della riga (fail). `Number(null)` resta da evitare (è 0): il test di null va prima della conversione. Valori non finiti (NaN, Infinity da stringa) → stessa etichetta NaN. TEST: `tests/js/test_vision_overlay.js`: il caso «value null → nessuna etichetta» diventa «value null → etichetta con 'NaN', status della riga»; riga senza ancoraggio → ancora nessuna etichetta. `tests/test_vision_overlay_js.py` verde. ## #124 — deviazione NaN nelle esportazioni backend FILE: `src/backend/api/routers/measurements.py` (~362-366): deviazione `"NaN"` quando `m.value is None`, altrimenti come oggi (vuota se `deviation` None). `src/backend/services/production_export_service.py` (~163): stessa regola. Controlla `src/backend/services/report_service.py` (~431): se c'è la deviazione, stessa regola. TEST: nel test CSV esistente di #118 (`src/backend/tests/test_nan_measurements.py`) asserisci anche la deviazione `NaN`; idem per l'export di produzione se ha già un test con NaN (altrimenti aggiungine uno breve sullo stile del file). ## #125 — test - `src/backend/tests/test_vision_execute.py:219`: rinomina in `test_a_nan_quote_needs_supervisor_authorisation`, docstring: la quota NaN è un fail come gli altri e chiede il capoturno (pending_authorisation), la prossima acquisizione non è bloccata. Aggiungi l'assert che prova l'ultima frase: una seconda `POST /api/vision/execute` sullo stesso task risponde 200 (il fixture `worker_says` è già lì). - `src/backend/tests/test_migrations.py` classe `TestMeasurementValueNullableMigration`: nuovo test `test_022_keeps_rows`: upgrade a `021_task_acquisition`, inserisci 3 righe in `measurements` con sqlite3 (colonne NOT NULL senza default riempite come fa lo script `C:/Users/Adriano/AppData/Local/Temp/claude/D--Sorgenti-AI-OS/e91af050-3fbb-422c-b846-0ae1addac919/scratchpad/mig_check.py`, da leggere), upgrade head → stesso conteggio e somma di `value`, stessi nomi di indici, `pragma integrity_check` = ok, una riga con `value NULL` accettata. NON TOCCARE: `templates/measure/task_execute.html`, `static/js/image_viewer.js`, `static/js/save_image.js`, `templates/maker/task_editor.html`, `static/js/dxf_recipe_wizard.js`, `scripts/`, il blocco di tolleranza (`pending_authorisation`, decisione: la quota NaN resta un fail che chiede il capoturno).
Adriano added the assegnata:daitarn label 2026-10-28 21:01:50 +00:00
Author
Owner

🔵 daitarn — preso in carico 2026-10-28T21:01:48Z
ramo: lavoro/daitarn · capacità: build-windows, gpu

🔵 daitarn — **preso in carico** 2026-10-28T21:01:48Z ramo: `lavoro/daitarn` · capacità: build-windows, gpu
Adriano removed the assegnata:daitarn label 2026-10-29 03:08:05 +00:00
Author
Owner

🤖 goldrake — liberata nessun segno di daitarn da 6.1 h — 2026-10-29T03:08:05Z

🤖 goldrake — **liberata** nessun segno di daitarn da 6.1 h — 2026-10-29T03:08:05Z
Author
Owner

Soluzione

Deviazione della quota NaN uguale nel CSV del backend e in quello del browser. Commit 2f0a5aa (unione f44b578). Ramo lavoro/daitarn-tmf-dxfcal @ 5897a9e. Deploy su TMF-FIERA (DESKTOP-RABEHJJ) 29/10/2026 08:53 con dep118.ps1: 26 file, hash SHA256 uguali al manifesto, 4 porte su in 24 s, worker ok, frontend 200; backup in C:\Tielogic\backup\pre-118.

**Soluzione** Deviazione della quota NaN uguale nel CSV del backend e in quello del browser. Commit 2f0a5aa (unione f44b578). Ramo lavoro/daitarn-tmf-dxfcal @ 5897a9e. Deploy su TMF-FIERA (DESKTOP-RABEHJJ) 29/10/2026 08:53 con dep118.ps1: 26 file, hash SHA256 uguali al manifesto, 4 porte su in 24 s, worker ok, frontend 200; backup in C:\Tielogic\backup\pre-118.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#124