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>
10 KiB
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/workflows → backend/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-NNNen pied - Dans le code :
# DETTE-NNNen commentaire au-dessus de la ligne concernée (pour les contournements localisables)