fix(anchors): lève 2 nits revue — contrat crop corrompu + workflow_id sidecar — 2026-07-03

Suite revue adversariale MERGE-READY (« non-bloquant ≠ oublié », Dom) :

1. Contrat crop CORROMPU figé par test : `materialize_anchor_from_b64` retire la
   clé `_anchor_image_base64` de params AVANT le try (pop). Un crop inexploitable
   (b64 invalide, PNG au magic cassé) → pas d'exception, anchor_id NULL, aucun
   VisualAnchor, ET clé retirée (pas de donnée morte volumineuse dans les params).
   3 cas paramétrés verrouillent ce comportement assumé. Docstring clarifiée.

2. `workflow_id` réintroduit dans le sidecar metadata.json (parité avec la route
   d'origine avant refactor). Nouveau paramètre optionnel du helper, passé par les
   deux appelants live (route HTTP + bridge R1). 2 tests : présent quand fourni,
   absent sinon (pas de clé None parasite). Backfill inchangé (workflow_id optionnel).

TDD : +5 tests. 29 tests unit VERTS, 0 régression.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-07-03 10:43:36 +02:00
parent 0a70ac1334
commit 9d99c370b3
4 changed files with 113 additions and 4 deletions

View File

@@ -335,7 +335,9 @@ def import_learned_workflow(workflow_id: str):
# NE PAS supprimer _anchor_bbox : conservé dans params pour que le
# frontend lise x_pct/y_pct et affiche la zone ciblée.
from services.anchor_image_service import materialize_anchor_from_b64
materialize_anchor_from_b64(step, params, db_session=db.session)
materialize_anchor_from_b64(
step, params, db_session=db.session, workflow_id=wf_id
)
step.parameters = params
db.session.add(step)