Files
rpa_vision_v3/docs/DETTE_TECHNIQUE.md
Dom c0e4c382be
Some checks failed
tests / Lint (ruff + black) (push) Failing after 1m45s
tests / Tests unitaires (sans GPU) (push) Failing after 1m51s
tests / Tests sécurité (critique) (push) Has been skipped
docs(dette): acte DETTE-018/019 (garde-seuil grounding) + inscrit DETTE-015..017
DETTE-018: method="grounding_vlm" legacy non gardé par _RESOLUTION_MIN_SCORES
(seul prefixe memory_ traité ; reste = match exact) → Check-1 seuil jamais appliqué
au chemin legacy. Mode qwen3vl ("grounding", seuil 0.60) correctement gardé.
DETTE-019: confiance figée 0.85 en dur dans _resolve_by_grounding (return) pour les
deux modes → garde-seuil (0.60) reçoit toujours 0.85, filtre inopérant.
Découvertes au câblage qwen3vl (5c5ce747b) + validation E2E 2026-06-13 (15/15, 0 dangereux).
Inscrit aussi DETTE-015/016/017 restées non commitées.

refs DETTE-018 DETTE-019

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 09:33:58 +02:00

10 KiB

Registre de dette technique

Registre central des dettes techniques identifiées sur le projet. Règle : toute désactivation de contrôle ou contournement assumé fait l'objet d'une entrée. Revue par défaut à création + 14 jours.

Statuts

  • OPEN : à traiter
  • IN_PROGRESS : en cours de résolution
  • RESOLVED : résolu (date résolution + commit ref)
  • ACCEPTED : assumé définitivement, pas de résolution prévue

Sévérités

P0 / P1 / P2 / P3 (alignées sur convention handoffs)

Entrées

ID Date création Date revue Sévérité Statut Description Origine
DETTE-001 2026-05-08 2026-05-22 P1 OPEN Pré-check OCR spatialement aveugle docs/BUG_PRECHECK_SPATIAL_BLINDNESS_2026-05-08.md
DETTE-002 2026-05-08 2026-05-22 P2 OPEN Exemption drift > 0.20 si template_matching ≥ 0.95 ou hybrid_text_direct ≥ 0.80 (resolve_engine.py:2367-2390) docs/AUDIT_CONTROLES_DEBRANCHES_2026-05-08.md (F2.2.1)
DETTE-003 2026-05-08 2026-05-22 P2 OPEN Self-healing Win+D au retry 1 retiré (revert 22c0a2ba6, replay_engine.py) docs/AUDIT_CONTROLES_DEBRANCHES_2026-05-08.md (F2.2.3)
DETTE-004 2026-05-08 2026-05-22 P2 OPEN Cascade OmniParser/YOLO neutralisée — _resolve_by_yolo défini, importé, jamais appelé (resolve_engine.py:293) docs/AUDIT_CONTROLES_DEBRANCHES_2026-05-08.md (F2.4.1)
DETTE-005 2026-05-08 2026-05-22 P2 OPEN Sous-système mémoire visuelle orphelin — VisualEmbeddingManager + ScreenshotValidationManager (core/visual/*) définis mais jamais instanciés en runtime docs/INVESTIGATION_MEMOIRE_VISUELLE_ORPHELINE_2026-05-09.md
DETTE-006 2026-05-08 2026-05-23 P0 IN_PROGRESS Bug échelle pixel grounding Ollama smart_resize non-déterministe docs/MIGRATION_VLM_PLAN_2026-05-09.md
DETTE-007 2026-05-09 2026-05-23 P3 OPEN Trois implémentations smart_resize coexistent (server.py, infigui_worker.py, nouveau module officiel). Unification post-démo Kerella. commit feat(grounding): module smart_resize officiel
DETTE-008 2026-05-09 2026-05-23 P2 OPEN Pre-check VLM par-clic désactivé via if False: (observe_reason_act.py:1704-1713) docs/AUDIT_CONTROLES_DEBRANCHES_2026-05-08.md (F6.1.1)
DETTE-009 2026-05-09 2026-05-23 P3 OPEN ShadowLearningHook (core/grounding/shadow_learning_hook.py) défini mais jamais instancié — Phase 6 du pipeline FAST→SMART→THINK non câblée à l'observation Shadow docs/INVESTIGATION_MEMOIRE_VISUELLE_ORPHELINE_2026-05-09.md
DETTE-010 2026-05-09 2026-05-10 P1 IN_PROGRESS preprocessor_config.json du checkpoint Qwen3-VL-8B-Instruct lu (snapshot 0c351dd01ed87...) : image_processor_type=Qwen2VLImageProcessorFast (variant différent de Qwen2VLImageProcessor lue ce matin), patch_size=16 (vs 14 hypothèse matin → factor probable 32 au lieu de 28), size={longest_edge: 16_777_216, shortest_edge: 65_536} (convention différente de min_pixels/max_pixels), min_pixels/max_pixels absents du config. Investigation requise demain matin : lire transformers.models.qwen2_vl.image_processing_qwen2_vl_fast pour comprendre défauts effectifs et sémantique. Conséquence pour module smart_resize.py : peut nécessiter ajustement (factor, bornes, sémantique). Étape 2 (validation grounding isolée) DOIT être précédée de cette investigation. docs/MIGRATION_VLM_PLAN_2026-05-09.md + commit 0d7bcd18a (smart_resize) + investigation 2026-05-09
DETTE-011 2026-05-09 2026-05-23 P2 OPEN Bug cv2.gapi.wip.draw.Text manquant en Python 3.12 (déclenché par import agent_v0.server_v1 dans tests/unit/conftest.py:26). Bloque pytest-cov sur tous les tests qui importent la chaîne. Contournement actuel : stub cv2 + coverage API directe. Investigation : version cv2 vs Python 3.12 compat, ou import conditionnel dans conftest. session 2026-05-09 (découvert pendant TDD smart_resize)
DETTE-012 2026-05-09 2026-05-23 P3 OPEN Migration backend grounding vers vLLM (option mentionnée dans plan migration mais infra absente : pas d'install vLLM, pas de service systemd dédié). Choix Transformers direct retenu pour fix DETTE-006. Migration vLLM à instruire séparément si bénéfice mesuré post-démo Kerella. docs/MIGRATION_VLM_PLAN_2026-05-09.md + investigation infra session 2026-05-09
DETTE-013 2026-05-09 2026-05-23 P2 OPEN Environnement de tests dev local cassé : pytest tests/unit/ déclenche sys.exit(1) via import api_stream sans RPA_API_TOKEN/RPA_AUTH_DISABLED définis (api_stream.py:135, fail-closed sécurité commit 93ef93e56). Combiné avec DETTE-011 (cv2 dans conftest), la batterie de tests unitaires complète n'est pas exécutable en dev local sans configuration environnement spécifique. À documenter (env vars requises) ou refactor (découpler tests purs des tests chargeant api_stream). session 2026-05-09 (découvert pendant validation refactor bbox_parser)
DETTE-014 2026-05-09 2026-05-10 P1 OPEN Module core/grounding/smart_resize.py commité ce matin (commit 0d7bcd18a) calé sur la référence transformers.qwen2_vl.image_processing_qwen2_vl (factor=28, max_pixels=1_003_520). Le checkpoint Qwen3-VL-8B-Instruct utilise en réalité Qwen2VLImageProcessorFast avec patch_size=16 (factor probable 32) et convention size.longest_edge/shortest_edge. À réaligner après investigation DETTE-010 demain. Module pur, testé à 100% sur la convention actuelle — la convention reste valide en référence, mais ne s'applique pas à ce checkpoint. commit 0d7bcd18a + investigation DETTE-010 du 2026-05-09
DETTE-015 2026-06-09 2026-06-23 P1 OPEN Double stockage des workflows incohérent. La route API VWB /api/workflows/ lit des fichiers JSON via WorkflowDatabase("data/workflows") (api/workflows.py:53, chemin relatif au cwd), alors qu'une DB SQLAlchemy propre coexiste (visual_workflow_builder/backend/instance/workflows.db, table workflows + migrations Alembic). Le worker DGX persiste les workflows appris dans data/training/workflows/{machine_id}/ en JSON, mais ne les écrit pas dans la DB VWB : l'assimilation Léa fonctionne, mais le workflow appris reste hors source SQLAlchemy/VWB (2026-06-12, session M2). Deux sources de vérité non synchronisées → la divergence de WorkingDirectory dev (cwd=backend) vs DGX (cwd=racine) a causé le bug « 0 workflows servis » (P0-1, 2026-06-09). Contournement POC en place : symlink data/workflowsbackend/data/workflows (sans sudo, réversible). Fragilités : dépendance au cwd, pas d'écriture atomique/validation schéma, 3e store legacy data/training/workflows, pont VWB/Léa existant mais non branché automatiquement post-finalize. Cible consolidation : unifier la persistance workflows sur la DB SQLAlchemy existante (source unique, transactions, review/édition VWB, fin des bugs de cwd), avec bascule progressive sous flag pour ne pas casser le POC DGX. docs/PLAN_MIGRATION_WORKFLOWS_STORE_2026-06-09.md + RESULTAT-P0-DASHBOARD-CORRECTIONS (2026-06-09) + M2 assimilation DGX 2026-06-12
DETTE-016 2026-06-10 2026-06-24 P2 ACCEPTED Auth agents POC avec RPA_API_TOKEN global partagé et machine_id auto-déclaré : _verify_token() valide le Bearer global et _guard_agent_registry_access() vérifie que le machine_id déclaré est actif, mais ne prouve pas cryptographiquement que le client est bien ce poste. Risque accepté pour POC contrôlé LAN/non exposé internet ; à reconsidérer avant distribution multi-TIM élargie, exposition réseau non maîtrisée ou exigence de révocation non contournable par poste. WP-C token par poste Patch 1-3 reste local/inerte, Patch 4 runtime annulé pour le POC. docs/coordination/inbox_codex/2026-06-10_1450_qwen-to-codex-claude-dom_DECISION-WPC-ABANDON-DETTE.md + docs/coordination/active/2026-06-10_1440_anti-doublon-wpc-verdict.md
DETTE-017 2026-06-12 2026-06-12 P0 OPEN Auth Bearer désactivée (RPA_AUTH_DISABLED=true) sur streaming 5005 ET agent-chat 5004 du DGX, appliquée comme « fix » heartbeat B3 (rustine). Démontré inutile : les 3 tokens (DGX proc, DGX .env.local, Windows .env) sont identiques (SHA256 43749362b1, len 43) → l'auth peut être réactivée sans casser le heartbeat. Exposition 0.0.0.0:5004/5005 restreinte par iptables au seul poste 192.168.1.11 ; dashboard 5001 conserve son auth. Exception temporaire validée par Dom (2026-06-12 09:35) pour test M2 local sur données factices. ROLLBACK OBLIGATOIRE avant toute sortie clinique / données patient : RPA_AUTH_DISABLED=false dans .env.local DGX + sudo systemctl restart rpa-streaming.service rpa-agent-chat.service puis vérif (401 sans token / 200 avec / heartbeat maintenu). docs/coordination/active/2026-06-12_0935_decision-dom-auth-off-exception-m2.md + alerte 2026-06-11_1535
DETTE-018 2026-06-13 2026-06-27 P2 OPEN Garde-seuil inopérant sur le chemin grounding legacy : _resolve_by_grounding retourne method="grounding_vlm" (resolve_engine.py:1121, mode RPA_GROUNDING_ENGINE OFF), clé absente de _RESOLUTION_MIN_SCORES qui ne traite en préfixe que memory_ (toutes les autres clés = match exact) → le Check-1 du validateur (seuil min de confiance) ne s'applique jamais à ce chemin. Le mode qwen3vl_vllm est lui correctement gardé (method="grounding", clé exacte, seuil 0.60). Aligner le legacy (clé gardée ou renommage) tant que le mode legacy reste activable. Découvert au câblage qwen3vl (commit 5c5ce747b) + validation E2E 2026-06-13
DETTE-019 2026-06-13 2026-06-27 P2 OPEN Confiance grounding figée à 0.85 en dur dans le return de _resolve_by_grounding (resolve_engine.py:1128-1130 : matched_element.confidence et score), pour les DEUX modes (legacy et qwen3vl). Le garde-seuil (0.60) reçoit donc toujours 0.85 quel que soit le grounding réel → le filtre ne discrimine jamais la vraie qualité de localisation. Propager une confiance réelle (signal modèle/cascade) pour rendre le seuil opérant. Découvert au câblage qwen3vl (commit 5c5ce747b) + validation E2E 2026-06-13

Convention de référencement

  • Dans les messages de commit : refs DETTE-NNN en pied
  • Dans le code : # DETTE-NNN en commentaire au-dessus de la ligne concernée (pour les contournements localisables)