Quote e task con misure si modificano e cancellano sul posto: lo storico cambia tolleranze #4

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

GRAVITÀ: alta
FILE: src/backend/api/routers/tasks.py:353 (update_subtask), :382 (delete_subtask), :263 (update_task), :286 (delete_task)
COSA: controllano solo is_current, non version_has_measurements. Il copy-on-write esiste solo in create_task e update_recipe. I pass_fail storici non corrispondono più ai limiti; SPC ed export usano i limiti nuovi.
INPUT: misura 10.0 su nominale 10 (pass), poi PUT /api/subtasks/1 {"utl":9,"ltl":8} → 200, versioni restano [1]. DELETE /api/subtasks/1 con misure → 204.
VERIFICATO: script pytest su SQLite → "PUT subtask con misure -> 200", "VERSIONI dopo modifica: [1]", "DELETE subtask con misure -> 204".
PRESUNTO: su MySQL il DELETE dà IntegrityError → 500 (FK measurements.subtask_id senza ondelete).
TEST: src/backend/tests/test_tasks.py non ha casi con misure presenti.

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/api/routers/tasks.py:353 (update_subtask), :382 (delete_subtask), :263 (update_task), :286 (delete_task) COSA: controllano solo `is_current`, non `version_has_measurements`. Il copy-on-write esiste solo in `create_task` e `update_recipe`. I `pass_fail` storici non corrispondono più ai limiti; SPC ed export usano i limiti nuovi. INPUT: misura 10.0 su nominale 10 (pass), poi `PUT /api/subtasks/1 {"utl":9,"ltl":8}` → 200, versioni restano [1]. `DELETE /api/subtasks/1` con misure → 204. VERIFICATO: script pytest su SQLite → "PUT subtask con misure -> 200", "VERSIONI dopo modifica: [1]", "DELETE subtask con misure -> 204". PRESUNTO: su MySQL il DELETE dà IntegrityError → 500 (FK `measurements.subtask_id` senza ondelete). TEST: `src/backend/tests/test_tasks.py` non ha casi con misure presenti. 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:07 +00:00
Author
Owner

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

⚡ jeeg — **preso in carico** 2026-09-21T20:22:07Z 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/api/routers/tasks.py — in update_task, delete_task, update_subtask, delete_subtask (e create_subtask se manca): dopo _ensure_version_is_current, se la versione ha misure (riusa l'helper version_has_measurements già usato da create_task/update_recipe in src/backend/services/recipe_service.py) applica lo stesso copy-on-write di create_task: crea la nuova versione, ritrova nella copia il task/la quota corrispondente (stessa posizione/ordine) e applica lì modifica o cancellazione. La versione con misure resta intatta. Se il copy-on-write non è riusabile senza riscrivere recipe_service, ripiego accettabile: 409 con detail «version has measurements: create a new version».
TEST: src/backend/tests/test_tasks.py — PUT e DELETE di quota e di task con misure presenti: la versione vecchia conserva limiti e quote, le misure restano legate alla versione vecchia, esiste una versione nuova corrente con la modifica.
NON TOCCARE: il comportamento su versioni senza misure (modifica sul posto).

ANALISI (passo 1) — ramo `lavoro/jeeg`, worktree `~/lavoro/TieMeasureFlow` su jeeg, lotto A1 MODIFICHE: src/backend/api/routers/tasks.py — in `update_task`, `delete_task`, `update_subtask`, `delete_subtask` (e `create_subtask` se manca): dopo `_ensure_version_is_current`, se la versione ha misure (riusa l'helper `version_has_measurements` già usato da `create_task`/`update_recipe` in src/backend/services/recipe_service.py) applica lo stesso copy-on-write di `create_task`: crea la nuova versione, ritrova nella copia il task/la quota corrispondente (stessa posizione/ordine) e applica lì modifica o cancellazione. La versione con misure resta intatta. Se il copy-on-write non è riusabile senza riscrivere recipe_service, ripiego accettabile: 409 con detail «version has measurements: create a new version». TEST: src/backend/tests/test_tasks.py — PUT e DELETE di quota e di task con misure presenti: la versione vecchia conserva limiti e quote, le misure restano legate alla versione vecchia, esiste una versione nuova corrente con la modifica. NON TOCCARE: il comportamento su versioni senza misure (modifica sul posto).
Author
Owner

Soluzione

ESITO: fatto
COSA: Copy-on-write esteso a update/delete di task e quote e a create_subtask (_task_for_write, _subtask_for_write in src/backend/api/routers/tasks.py): una versione con misure non si tocca più, la modifica atterra sulla copia nella nuova versione. L'editor (templates/maker/task_editor.html) ricarica la pagina quando il backend risponde 409 o restituisce id diversi, perché dopo il copy-on-write gli id in memoria sono vecchi. Il sospetto MissingGreenlet in create_task non è riproducibile: resta il test di guardia.
COMMIT (ramo lavoro/jeeg, unito su V3.0.0 a d483fa1): b27d56d; 2b00f83; 77d95fd
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: Copy-on-write esteso a update/delete di task e quote e a create_subtask (`_task_for_write`, `_subtask_for_write` in src/backend/api/routers/tasks.py): una versione con misure non si tocca più, la modifica atterra sulla copia nella nuova versione. L'editor (templates/maker/task_editor.html) ricarica la pagina quando il backend risponde 409 o restituisce id diversi, perché dopo il copy-on-write gli id in memoria sono vecchi. Il sospetto MissingGreenlet in create_task non è riproducibile: resta il test di guardia. COMMIT (ramo lavoro/jeeg, unito su V3.0.0 a d483fa1): b27d56d; 2b00f83; 77d95fd 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:05 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#4