save_measurement non verifica coerenza fra quota, versione e produzione #5

Closed
opened 2026-09-21 20:14:36 +00:00 by Adriano · 3 comments
Owner

GRAVITÀ: alta
FILE: src/backend/services/measurement_service.py:216 ; src/backend/api/routers/vision.py:67-72 (stesso buco su production_run_id)
COSA: non si verifica che la quota appartenga alla versione, che il run esista, sia della stessa ricetta, sia running.
INPUT: (a) quota della ricetta A con version_id della ricetta B → 200. (b) misura della ricetta B dentro un run della ricetta A → 200. (c) misura su run chiuso → 200 con synced_to_csv=False, resta fuori dal CSV già emesso. (d) run in pausa accetta misure.
VERIFICATO: script pytest → "SUBTASK di ricetta A su VERSIONE di ricetta B -> 200", "MISURA di ALTRA ricetta nel run -> 200", "MISURA su run CHIUSO -> 200 synced_to_csv= False".

ORIGINE: revisione fable del 21/09/2026 su ramo V3.0.0, commit 8cc5e82. Documento completo: _output/2026-09-21-TieMeasureFlow-revisione.md su Wasabi.

GRAVITÀ: alta FILE: src/backend/services/measurement_service.py:216 ; src/backend/api/routers/vision.py:67-72 (stesso buco su `production_run_id`) COSA: non si verifica che la quota appartenga alla versione, che il run esista, sia della stessa ricetta, sia `running`. INPUT: (a) quota della ricetta A con `version_id` della ricetta B → 200. (b) misura della ricetta B dentro un run della ricetta A → 200. (c) misura su run chiuso → 200 con `synced_to_csv=False`, resta fuori dal CSV già emesso. (d) run in pausa accetta misure. VERIFICATO: script pytest → "SUBTASK di ricetta A su VERSIONE di ricetta B -> 200", "MISURA di ALTRA ricetta nel run -> 200", "MISURA su run CHIUSO -> 200 synced_to_csv= False". ORIGINE: revisione fable del 21/09/2026 su ramo `V3.0.0`, commit 8cc5e82. Documento completo: `_output/2026-09-21-TieMeasureFlow-revisione.md` su Wasabi.
Adriano added the bug label 2026-09-21 20:14:36 +00:00
Adriano added the assegnata:jeeg label 2026-09-21 20:22:09 +00:00
Author
Owner

⚡ jeeg — preso in carico 2026-09-21T20:22:09Z
ramo: lavoro/jeeg · capacità: docker, gpu, systemd

⚡ jeeg — **preso in carico** 2026-09-21T20:22:09Z ramo: `lavoro/jeeg` · capacità: docker, gpu, systemd
Author
Owner

ANALISI (passo 1) — ramo lavoro/jeeg, worktree ~/lavoro/TieMeasureFlow su jeeg, lotto A1

MODIFICHE: src/backend/services/measurement_service.py save_measurement — prima dell'insert: (a) la quota deve appartenere a un task di version_id → altrimenti 422; (b) se production_run_id è dato: il run deve esistere (404), essere della stessa ricetta della versione (422), essere in stato che ammette misure: chiama la guardia esistente _require_measurable di src/backend/services/production_service.py (o equivalente) → 409 se chiuso o in pausa. Esporre la verifica (b) come funzione riusabile validate_run_for_version(db, run_id, version_id) perché il lotto visione la chiamerà da vision_service.
TEST: nuovi casi in src/backend/tests/ (file misure esistente): quota di ricetta A con versione di B → 422; misura di B in run di A → 422; run chiuso → 409; run in pausa → 409; caso valido → 200.
NON TOCCARE: src/backend/api/routers/vision.py e vision_service.py (lotto C1).

ANALISI (passo 1) — ramo `lavoro/jeeg`, worktree `~/lavoro/TieMeasureFlow` su jeeg, lotto A1 MODIFICHE: src/backend/services/measurement_service.py `save_measurement` — prima dell'insert: (a) la quota deve appartenere a un task di `version_id` → altrimenti 422; (b) se `production_run_id` è dato: il run deve esistere (404), essere della stessa ricetta della versione (422), essere in stato che ammette misure: chiama la guardia esistente `_require_measurable` di src/backend/services/production_service.py (o equivalente) → 409 se chiuso o in pausa. Esporre la verifica (b) come funzione riusabile `validate_run_for_version(db, run_id, version_id)` perché il lotto visione la chiamerà da vision_service. TEST: nuovi casi in src/backend/tests/ (file misure esistente): quota di ricetta A con versione di B → 422; misura di B in run di A → 422; run chiuso → 409; run in pausa → 409; caso valido → 200. NON TOCCARE: src/backend/api/routers/vision.py e vision_service.py (lotto C1).
Author
Owner

Soluzione

ESITO: fatto
COSA: save_measurement verifica quota↔versione (422) e, con production_run_id, validate_run_for_version: run inesistente 404, altra ricetta 422, chiuso o in pausa 409. La stessa funzione è usata da vision_service.execute_task.
COMMIT (ramo lavoro/jeeg, unito su V3.0.0 a d483fa1): 7b01507
PROVA: uv run --extra server --extra client --extra dev pytest -q → 622 passed, 4 skipped (erano 391); visione su Python 3.13 → 16 passed (erano 8).

**Soluzione** ESITO: fatto COSA: `save_measurement` verifica quota↔versione (422) e, con `production_run_id`, `validate_run_for_version`: run inesistente 404, altra ricetta 422, chiuso o in pausa 409. La stessa funzione è usata da vision_service.execute_task. COMMIT (ramo lavoro/jeeg, unito su V3.0.0 a d483fa1): 7b01507 PROVA: `uv run --extra server --extra client --extra dev pytest -q` → 622 passed, 4 skipped (erano 391); visione su Python 3.13 → 16 passed (erano 8).
Adriano removed the assegnata:jeeg label 2026-09-21 21:56:07 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#5