docs(handoff): clôture session 2026-05-09

Session de 6h consacrée au fix DETTE-006 (bug d'échelle pixel
grounding). Bilan : 2/5 commits fix faits (smart_resize + refactor
parser bbox_2d), 3/5 bloqués par découverte DETTE-010 (divergence
factor 28 vs 32 sur checkpoint Qwen3-VL-8B-Instruct, à instruire
demain matin).

Effets de bord positifs : registre dette technique créé
(14 entrées P1/P2/P3), investigation mémoire visuelle orpheline
documentée, infra clarifiée (vLLM absent, Transformers direct retenu,
checkpoint Qwen3-VL-8B fp16 téléchargé 17 GB).

Voir docs/handoffs/2026-05-09_session_audit.md pour détail.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-05-09 15:53:26 +02:00
parent df5ad59330
commit cfe4fa5999

View File

@@ -0,0 +1,168 @@
# HANDOFF — Session 2026-05-09 (clôture)
Rédigé le 2026-05-09 15:46 CEST.
## 1. ÉTAT FACTUEL DU REPO
- Branche : `feature/qw-suite-mai`
- 10 commits du jour (les plus récents en HEAD) :
- `df5ad5933` docs(dette): MAJ DETTE-010 (config trouvé, divergences) + création DETTE-014 (smart_resize calé sur mauvaise référence)
- `bfbf0f9c3` refactor(grounding): centralise parser bbox_2d
- `ecc5a233a` docs(dette): création DETTE-013 env tests dev local
- `4df1ba577` docs(dette): création DETTE-011 bug cv2 Python 3.12
- `0d7bcd18a` feat(grounding): module smart_resize officiel Qwen3-VL
- `e9702b4df` docs(dette): création DETTE-010 vérif preprocessor_config Qwen3-VL
- `293e54b4e` docs(dette): création DETTE-012 (vLLM hors scope) + maj DETTE-010 (cible Transformers + AWQ)
- `e0b47e451` docs(refs): commit groupé docs de référence session 2026-05-08
- `5dc20cc85` docs(dette): rectif mapping DETTE-005 + DETTE-008/009 + investigation mémoire visuelle orpheline
- `88ed103de` docs(dette): création registre dette technique + 7 entrées rétroactives
- Pas de push (tous commits locaux)
- Working directory : modifications antérieures intactes
(héritées du handoff 2026-05-08, hors scope cette session)
- Checkpoint Qwen3-VL-8B-Instruct fp16 téléchargé localement
(`~/.cache/huggingface/hub/models--Qwen--Qwen3-VL-8B-Instruct/`,
17 GB, 16/16 fichiers, 0 `.incomplete`)
- Total : 2 modules purs créés (smart_resize, bbox_parser) + 100%
coverage (58 tests unitaires) + registre dette créé avec 14
entrées + 96 lignes nettes sur resolve_engine.py.
## 2. DÉCISIONS PRISES CETTE SESSION
- **Cible backend grounding** : Transformers direct (pas vLLM —
vLLM absent de la machine, infra inexistante, cf. DETTE-012).
Cohérent avec `core/grounding/server.py` déjà câblé en
Transformers et service systemd `rpa-grounding.service`.
- **Modèle cible** : `Qwen/Qwen3-VL-8B-Instruct` fp16 (16 GB safetensors)
+ chargement Transformers avec `BitsAndBytesConfig(load_in_4bit=True,
bnb_4bit_quant_type="nf4")` à la volée (~5-6 GB VRAM runtime).
Pas d'AWQ officiel disponible pour Qwen3-VL-8B
(`Qwen/Qwen3-VL-8B-Instruct-AWQ` → 404 HF, repo inexistant).
- **T2A v2 désactivé** durant la session pour libérer la VRAM
partagée du RTX 5070 (12 GB).
- **Strict no-op sémantique sur le refactor parser bbox_2d**
(commit 2/5 `bfbf0f9c3`) : préservation des contrats sémantiques
des 3 sites d'appel via paramètre `formats=` (pas seulement
préservation comportementale).
- **Investigation DETTE-010 en fin de journée a révélé une
divergence majeure** : `factor` effectif probable 32 (vs 28
hypothèse matin) car `patch_size=16` dans le `preprocessor_config.json`
du checkpoint Qwen3-VL-8B-Instruct ; convention
`size.longest_edge`/`shortest_edge` différente de `min_pixels`/`max_pixels`.
→ Arrêt avant commit 3/5 du fix DETTE-006 pour reprendre demain
matin frais avec investigation propre, plutôt que coder à
l'aveugle sur fin de journée.
## 3. PROBLÈMES OUVERTS (par criticité)
- **[P0] DETTE-006 — Bug d'échelle pixel grounding**
fix en cours, 2/5 commits faits (smart_resize + refactor parser),
3/5 bloqués par DETTE-010 + DETTE-014 (alignement convention
Qwen3-VL effective).
- **[P1] DETTE-010 IN_PROGRESS** — investigation
`Qwen2VLImageProcessorFast` + sémantique `longest_edge`/`shortest_edge`
+ `patch_size=16` requise demain matin. Bloquant Étape 2
(validation grounding isolée). Date revue : 2026-05-10.
- **[P1] DETTE-014 OPEN** — module `core/grounding/smart_resize.py`
calé sur `Qwen2VLImageProcessor` (factor=28, max=1_003_520) alors
que le checkpoint utilise `Qwen2VLImageProcessorFast` avec
`patch_size=16` (factor probable 32). À réaligner après DETTE-010.
- **[P2] Autres dettes (P2/P3)** listées dans
`docs/DETTE_TECHNIQUE.md` (DETTE-001 à 014) — pas urgent, revues
par défaut +14 jours sauf P1 listées ci-dessus.
## 4. PROCHAINE ACTION CONCRÈTE (demain matin)
- **Étape A** : lire
`transformers.models.qwen2_vl.image_processing_qwen2_vl_fast`
pour comprendre les défauts effectifs (`min_pixels`, `max_pixels`,
interaction `patch_size × merge_size``factor`) et la sémantique
de `size.longest_edge`/`shortest_edge` (côté max ou produit total ?).
- **Étape B** : tester le chargement runtime via
`AutoProcessor.from_pretrained('Qwen/Qwen3-VL-8B-Instruct')` puis
inspecter ses attributs (`processor.image_processor.size`,
`processor.image_processor.patch_size`, etc.) pour confirmer la
convention réelle au runtime.
- **Étape C** : tirer la convention validée et décider de
l'ajustement de `core/grounding/smart_resize.py` :
- soit ajuster `FACTOR_DEFAULT` / bornes du module existant
(et adapter les tests),
- soit créer un nouveau module dédié Qwen3-VL si la sémantique
diverge trop (ex: `core/grounding/smart_resize_qwen3.py`).
- **Étape D** : commit 3/5 du fix DETTE-006 avec convention validée
(les 4 sites de `resolve_engine.py` parseront enfin par
`resized_w/h` au lieu de `small_w/h`).
- **Critère de succès Étape 2** (validation grounding isolée) :
sur fixture `data/training/live_sessions/bg_DESKTOP-58D5CAC_windows/shots/heartbeat_1773792436.png`
(2560×1600), bouton OK localisé à `cx ≈ 0.45-0.55` (vs 0.17 le 8 mai).
- **Critère de succès Étape 3** (replay e2e) : workflow rpa complet
sur 1 dossier MOREL sans clic aberrant, latence acceptable.
## 5. CE QUE LE PROCHAIN CLAUDE DOIT LIRE (ordre)
- @docs/handoffs/2026-05-09_session_audit.md (ce fichier)
- @docs/DETTE_TECHNIQUE.md (en particulier DETTE-010 et DETTE-014, P1 bloquants)
- @/home/dom/.cache/huggingface/hub/models--Qwen--Qwen3-VL-8B-Instruct/snapshots/0c351dd01ed87e9c1b53cbc748cba10e6187ff3b/preprocessor_config.json
(config réel du checkpoint, pivot pour DETTE-010)
- @core/grounding/smart_resize.py (module à éventuellement réaligner)
- @core/grounding/bbox_parser.py (commit 2/5 OK strict no-op, à conserver)
- @docs/MIGRATION_VLM_PLAN_2026-05-09.md (plan original toujours
valide pour la suite, mais cible backend ajustée :
Transformers direct, pas vLLM)
- @docs/handoffs/2026-05-08_session_audit.md (handoff veille,
pour contexte si besoin)
## 6. RÈGLES DE LA JOURNÉE À RESPECTER DEMAIN
- Maximes Dom : « il faut prendre le temps d'aller vite »,
« rustine interdite », « on lit la doc avant de faire quoi que ce soit ».
- **Investigation infra** : ne jamais conclure à l'absence d'un
composant sans avoir vérifié N endroits possibles
(PATH, autres venvs, conda, Docker, système, autres caches).
Leçon DETTE-012 vLLM : conclusion hâtive « stack vLLM absente »
sur fouille partielle, rectifié par Dom. Présenter les
vérifications négatives comme partielles et demander
confirmation, pas comme une absence définitive.
- **Refactor de code mature** : préserver les contrats sémantiques
en plus des comportements techniques. Leçon refactor parser
Occ 3 + Occ 4 : strict no-op via paramètre `formats=` plutôt
que centralisation laxe qui élargit silencieusement les formats
acceptés.
- **Validation explicite par étape**, stop pour relecture diff
sur tout code prod. Pas d'enchaînement A→B→C sans GO entre les
étapes structurantes.
- **Datage** : forcer `date '+%Y-%m-%d %H:%M %Z'` avant tout
commentaire daté.
- **Désactivation contrôle** : flag env + log WARNING + entrée
dette + revue +14j (et registre central
`docs/DETTE_TECHNIQUE.md`).
- **Git destructeur** : jamais en combo, atomique, validation
explicite.
- **Un commit = une intention** (respecté sur les 10 commits du jour).
## 7. NOTES POUR LA PROCHAINE SESSION
- **Action pré-prochaine session — hygiène git** : commit
`chore(docs): déplacement business_docs vers archive/`
pour consolider en 1 commit la suppression à la racine
(ANALYSE_MOAT_RPA_VISION_V3.md, PITCH_INVESTISSEURS_RPA_VISION_V3.md
`D` dans `git status`) et l'ajout dans `archive/business_docs/`
(encore en `?? archive/`). Pas de DETTE associée, juste hygiène.
- **Mécanisme de délestage VRAM rpa_v3** : à documenter dans le
module concerné (path à retrouver), trace de fonctionnalité
transversale.
- **Bug cv2 (DETTE-011) + env tests (DETTE-013)** : la batterie
`pytest tests/unit/` entière n'est pas exécutable en dev local
sans configuration spécifique (`RPA_API_TOKEN` ou
`RPA_AUTH_DISABLED` + version cv2 compatible Python 3.12).
Prévoir une session dédiée pour rétablir l'exécution complète
ou découpler les tests purs des tests qui chargent
`agent_v0.server_v1.api_stream`.
- **Audit exhaustif modules orphelins** (au-delà périmètre AUDIT
serveur) : mentionné dans
`docs/INVESTIGATION_MEMOIRE_VISUELLE_ORPHELINE_2026-05-09.md` §6,
dette identifiée sans numéro réservé. À instruire post-démo
Kerella.
- **DETTE-010 + DETTE-014 sont la première chose à débloquer
demain matin**. Sans cet alignement, le commit 3/5 du fix
DETTE-006 et l'Étape 2 (validation grounding isolée) sont
impossibles à instruire correctement.