docs(coordination): sync agent inboxes and active decisions

This commit is contained in:
Dom
2026-06-02 16:30:14 +02:00
parent f2e9aac6b7
commit 9b8bdfdbbe
756 changed files with 72879 additions and 0 deletions

View File

@@ -0,0 +1,95 @@
# Synthese direction — 2026-05-25
- `Objet`: capitalisation des avancees, echecs utiles, corrections et prochaines etapes
- `Contexte`: stabilisation Lea avant demo reportee au 2026-06-01
- `Canal source`: `docs/coordination/inbox_codex/`, `inbox_claude/`, `outbox_gemini/`
## Ce qui a réellement avance
Le projet est passe d'un comportement opaque a un systeme mesurable.
Les verrous principaux identifies et traites aujourd'hui :
- replay : garde single in-flight posee et testee ;
- UI pause : correction de fermeture de bulle stale et amelioration troncature ;
- FeedbackBus / agent_chat : CORS corrige, OWL-v2 desactive par defaut, UI detection desactivee par defaut, CLIP GPU libere ;
- Ollama : inventaire des modeles critiques retrouve, incident de store clarifie ;
- build replay : instrumentation C2b puis diagnostic C2c ;
- perf build : C2d-bis reduit le build skip a environ 270 ms sur fixture ;
- VLM : D5-v2 pose un profil qwen3.5 JSON centralise ;
- contexte bbox legacy : D5-v3a mini-fix force `num_ctx=4096` sur trois appels bbox pour eviter l'heritage Modelfile `8192`.
## Echecs utiles et corrections de trajectoire
1. Hypothese initiale fausse : les crops/base64 n'etaient pas le goulot.
Correction : C2c a montre que `SomEngine.analyze` et `_gemma4_read_element` dominaient step4.
2. `RPA_SKIP_INTENTION_ENRICHMENT` ne suffisait pas.
Correction : C2d-bis ajoute `RPA_SKIP_BUILD_VISION=true` et un short-circuit quand `vision_info.text` existe.
3. qwen3.5 sans prefill/ctx adequat est instable ou lent.
Correction : D5-v2 impose `num_ctx=4096`, prefill `{"x_pct":`, temperature 0 et parsing JSON tolerant.
4. Migration D5-v3 mecanique refusee.
Correction : separation claire entre grounding JSON qwen3.5 et grounding bbox qwen2.5vl.
5. Fuite `num_ctx=8192` cachee.
Correction : preuve `ollama show qwen2.5vl:7b-rpa --modelfile` puis mini-fix explicite `num_ctx=4096`.
## Decisions structurantes
- Claude execute/analyse et propose des patchs focalises.
- Gemini relit, contredit et valide independamment.
- Codex arbitre, cadre les frontieres et lance les tests.
- Dom tranche les choix produit/demo.
- Pas de live replay sans autorisation explicite.
- Pas de modification Windows tant que le lot serveur n'est pas stabilise.
- Pas de commit tant que Codex n'a pas regroupe proprement les changements.
## Profil demo vise
Flags deja valides en principe :
- `RPA_SKIP_INTENTION_ENRICHMENT=true`
- `RPA_SKIP_BUILD_VISION=true`
- `RPA_EASYOCR_GPU=0`
- `AGENT_CHAT_ENABLE_OWL=0`
- `AGENT_CHAT_ENABLE_UI_DETECTION=0`
Attention : ne pas forcer globalement `RPA_GROUNDING_MODEL=qwen3.5:9b` tant que les chemins runtime bbox legacy peuvent encore lire cette variable. Le profil qwen3.5 D5-v2 est pose, mais pas encore consomme par les callers runtime.
## Tests confirmes par Codex
- C2d-bis : 6 tests verts.
- D5-v2 : 16 tests verts.
- D5-v3a mini-fix : 4 tests verts.
- Lot cible elargi D5-v3a/D5-v2/C2d-bis/C1/replay guard : exit 0 avec xfail attendu.
- Healthcheck local precedent : OK.
## Risques restants
- D5-v3b helper bbox non realise : les appels raw restent, mais avec `num_ctx=4096`.
- Windows executor contient encore des `num_ctx=8192` : report D5-v3c.
- Smoke live court Bloc-notes relance apres recablage : `replay_sess_1c0bfb42`, `16/16`, 0 failed, 0 pause Lea.
- Worktree tres large et sale : commit/freeze doivent etre faits avec discipline.
- Coordination bruyante : il faut indexer/synthetiser avant archivage.
## Prochaine sequence recommandee
1. Figer la capitalisation du smoke live `replay_sess_1c0bfb42`.
2. Informer Claude/Gemini avec demande de reponse explicite.
3. Auditer le worktree par missions avant tout commit.
4. Preparer une sequence de commits propres pour le lot stabilisation.
5. Garder D5-v3b/qwen3.5 runtime hors scope jusqu'au freeze du lot courant.
## Messages sources majeurs
- `2026-05-25_1500_claude-to-codex_C2c-analyse-step4-crops.md`
- `2026-05-25_1630_gemini-to-codex_revue-independante-C2c.md`
- `2026-05-25_1720_claude-to-codex_C2d-bis-resultat-skip-build-vision.md`
- `2026-05-25_1745_gemini-to-codex_accept-C2d-bis-GO-D5v3.md`
- `2026-05-25_1815_claude-to-codex_D5v3a-inventaire-constat-note-D5v3b.md`
- `2026-05-25_1835_gemini-to-codex_revue-D5v3a-favorable.md`
- `2026-05-25_1900_claude-to-codex_D5v3a-mini-fix-resultat.md`
- `2026-05-25_2000_gemini-to-codex_INFO-levee-risque-R6.md`
- `active/2026-05-25_runbook-profil-demo-smoke.md`

View File

@@ -0,0 +1,223 @@
# Synthese Codex - Reuse coeur Lea micro-apprentissage
Date: 2026-05-27 19:50
De: Codex
Pour: Dom, Qwen, Claude
Sources: retours Qwen 19:35, Claude 19:36/19:37
## Verdict
Consensus Qwen + Claude + Codex:
GO reuse, NOGO nouveau framework.
Le bon niveau d'apprentissage n'est ni le clic, ni le workflow metier complet. C'est la **competence courte verifiee**.
Une competence Lea doit contenir au minimum:
- intention humaine: ce que Dom voulait faire,
- methode observee ou choisie: raccourci, texte, geste ou fallback,
- preconditions: etat minimal attendu de l'ecran,
- marqueur de succes: preuve observable apres action,
- message d'echec humainement comprehensible,
- statut memoire: observee, candidate, supervisee, stable.
Le risque principal n'est pas le manque de code. Le risque principal est de recoder une brique alors que les morceaux existent deja.
## Architecture retenue
Pipeline minimal:
`live_events.jsonl`
-> `tools/session_cleaner.py`
-> `agent_v0/server_v1/stream_processor.py`
-> `core/workflow/shadow_observer.py`
-> `core/workflow/shadow_validator.py`
-> `agent_chat/gesture_catalog.py`
-> `agent_v0/server_v1/replay_verifier.py`
-> `agent_v0/server_v1/replay_learner.py` / `core/learning/target_memory_store.py`
Roles:
- `live_events.jsonl`: preuve brute primaire.
- `session_cleaner.py`: nettoyage humain et suppression des parasites.
- `stream_processor.py`: consolidation en actions rejouables, sans perdre `key_combo`.
- `shadow_observer.py`: comprehension provisoire en francais.
- `shadow_validator.py`: validation/correction humaine de l'intention et de la preuve.
- `gesture_catalog.py`: gestes symboliques connus, surtout clavier et OS.
- `replay_verifier.py`: gate obligatoire apres action.
- `replay_learner.py` et `target_memory_store.py`: memoire seulement apres succes verifie.
## Invariants
1. Pas de boite a clic: une competence ne se definit pas par des coordonnees.
2. Pas de promotion sans triplet `intention + methode + preuve`.
3. La postcondition ne prouve pas la methode: `SearchHost.exe` prouve que la recherche est ouverte, pas que `Win+S` a ete tape.
4. Pas de memoire sans verification post-action.
5. Pas de succes silencieux: si l'etat attendu n'apparait pas, Lea explique ce qu'elle cherchait.
6. Pas de message generique visible: bannir `un element`, `cette action`, `bonne cible` sans contexte.
7. VLM en fallback, pas dans le chemin nominal quand fenetre/process/texte suffisent.
8. VWB reste hors boucle pour ces micro-gestes; on peut lire les traces, pas relancer la mecanique lourde.
## Unite de travail
Nom propose: `MicroEpisode`.
Champs minimum:
- `session_id`
- `intent`
- `observed_action`
- `pre_state`
- `success_marker`
- `verification_result`
- `human_validation`
- `replay_action`
- `memory_status`
Promotion:
- `observed`: trace propre disponible.
- `candidate`: intention + methode + preuve formulees.
- `supervised`: replay reussi et validation humaine.
- `stable`: plusieurs succes verifies sur contextes differents.
Seuil retenu pour stable:
- proposition stricte: 3 succes consecutifs sur 3 contextes differents,
- minimum temporaire acceptable pour avancer: 2 succes verifies sans echec, mais pas d'AUTO production.
## P0 retenu
Objectif court: competence `ouvrir_recherche_windows`.
Session de reference:
- `data/training/live_sessions/streaming_sessions/sess_20260527T185155_98ad9a.json`
- `data/training/live_sessions/live_events.jsonl`
Definition candidate:
- intention: ouvrir la recherche Windows,
- methode observee: `key_combo ["win", "s"]`,
- precondition: session Windows active, focus non captif,
- marqueur de succes: fenetre active `Rechercher` ou process `SearchHost.exe` ou champ `Rechercher` visible,
- parasites a exclure: systray, pythonw, fenetre Lea, Acces vocal, interactions de fin de capture.
Sortie attendue:
- Lea sait dire: "J'ai observe que tu ouvres la recherche Windows avec Win+S."
- Lea rejoue.
- Lea verifie `Rechercher/SearchHost.exe`.
- Lea classe la competence en candidate/supervisee, pas stable tant que la repetition manque.
## Plan petites touches
### Etape 1 - ne rien recapturer inutilement
Faire un inventaire offline des traces existantes:
- `data/training/live_sessions/**/live_events.jsonl`
- `data/training/live_sessions/streaming_sessions/*.json`
- `/home/dom/data/workflows/*.json`
- `data/learning/events/**/resolution_events.jsonl`
- `data/learning/replay_results/*.jsonl`
Chercher:
- `SearchHost.exe`, `Rechercher`, `win+s`, `key_combo`,
- Chrome / Edge,
- Word / WINWORD,
- `Alt+F4`,
- textes saisis.
But: reutiliser les sessions deja presentes avant de demander de nouvelles demonstrations a Dom.
### Etape 2 - formaliser le premier episode
Creer un artefact lisible, meme simple, pour `ouvrir_recherche_windows`.
Format cible a court terme:
- YAML ou JSON inspectable,
- pas de dependance UI lourde,
- pas de coordonnees durables,
- success marker explicite.
Chemin propose:
- `data/competences/observed/open_windows_search.yaml`
### Etape 3 - verifier avant memoire
Brancher la verification specifique:
- verifier fenetre/process/texte,
- si OK: enregistrer comme candidate/supervisee,
- si KO: message 4 champs.
Contrat message:
- `INTENTION`: ce que Lea essaie de faire,
- `ATTENDU`: ce qu'elle attendait a l'ecran,
- `VU`: ce qu'elle observe vraiment,
- `DEMANDE`: ce que l'humain peut faire ou confirmer.
### Etape 4 - repeter sur variantes
Rejouer la competence sur:
- recherche deja fermee,
- recherche deja ouverte,
- focus dans une autre fenetre,
- ecran primaire / secondaire si possible,
- DPI different ensuite.
But: prouver que ce n'est pas une trace spatiale.
## Repartition proposee
### Codex
- piloter la synthese,
- garder le fil critique,
- brancher le premier `MicroEpisode` / competence courte si Dom valide le passage au code,
- verifier tests et non-regression capture/session cleaner.
### Qwen
Mission suivante recommandee:
- inventaire offline des corpus/traces existants,
- lister les sessions deja exploitables pour:
- ouvrir recherche Windows,
- saisir une requete,
- ouvrir navigateur,
- ouvrir/fermer Word,
- produire un tableau session -> competence candidate -> preuve -> qualite -> risque.
### Claude
Mission suivante recommandee:
- definir le contrat competence minimal et les invariants de promotion,
- auditer les points exacts ou brancher `message_contract.py`,
- proposer les messages humains P0/P1 en format 4 champs,
- verifier que la strategie ne retombe pas dans une boite a clic.
## Decisions a acter avec Dom
1. Unite officielle: `competence courte verifiee`.
2. Stockage initial: YAML/JSON inspectable, puis memoire SQLite/JSONL quand verifie.
3. Promotion stable: 3 succes / 3 contextes differents pour AUTO; moins que ca reste supervise.
4. Message humain: contrat 4 champs obligatoire pour les pauses.
5. VWB: reference seulement, pas chemin principal.
6. Premiere competence: `ouvrir_recherche_windows`, car la session propre existe deja.
## Conclusion
On ne repart pas de zero.
La prochaine preuve utile est petite mais fondamentale: Lea observe `Win+S`, comprend "ouvrir la recherche Windows", rejoue, verifie l'etat ecran, parle clairement en cas de doute, puis seulement memorise.
Si cette boucle est propre, les competences suivantes deviennent naturelles: saisir une requete, ouvrir navigateur, ouvrir Word, fermer Word, puis variants DPI/ecrans.

View File

@@ -0,0 +1,74 @@
# Addendum Codex - Base de connaissances dashboard
Date: 2026-05-27 19:53
De: Codex
Pour: Dom, Qwen, Claude
Lien avec: `docs/coordination/syntheses/2026-05-27_1950_codex_SYNTHESE-reuse-lea-core-micro-apprentissage.md`
## Observation Dom
Dom signale l'ecran `Base de connaissances` du dashboard.
Cet ecran confirme que le projet possede deja une base exploitable:
- memoire visuelle FAISS: 13 666 vecteurs indexes / embeddings calcules,
- sessions observees: 63 sessions, 3 machines,
- machine principale `DESKTOP-58D5CAC_windows`: 29 sessions, derniere activite 2026-05-27 18:51,
- reflexes natifs: 28 patterns connus,
- workflows: 29 workflows appris.
Sources code:
- page: `web_dashboard/templates/knowledge_base.html`
- route stats: `web_dashboard/app.py` (`/api/knowledge-base/stats`)
- patterns: `core/knowledge/ui_patterns.py`
## Impact sur le plan
Cela ne contredit pas le choix `competence courte verifiee`; cela le renforce.
La base de connaissances devient le **point d'entree d'inventaire** avant toute nouvelle demonstration humaine:
1. regarder ce que Lea sait deja,
2. identifier les traces candidates,
3. nettoyer seulement ce qui est utile,
4. promouvoir en competence courte verifiee si `intention + methode + preuve` sont presents.
## Ajustement P0
Avant de recapturer, Qwen doit exploiter:
- les 63 sessions observees,
- les 28 reflexes natifs,
- les 29 workflows appris,
- l'index FAISS comme memoire visuelle disponible, mais pas comme preuve unique.
P0 reste:
- competence: `ouvrir_recherche_windows`,
- session reference: `sess_20260527T185155_98ad9a`,
- preuve: `Rechercher` / `SearchHost.exe` / champ visible,
- statut: candidate/supervisee, pas stable sans repetition.
## Regle ajoutee
Le dashboard `Base de connaissances` sert de carte d'inventaire et de health-check memoire.
Il ne remplace pas la verification:
- un workflow appris n'est pas automatiquement une competence stable,
- un pattern connu n'est pas automatiquement adapte au contexte,
- un vecteur FAISS n'est pas une preuve de succes,
- une session observee doit etre nettoyee et validee.
## Mission ajustee
Qwen:
- partir du dashboard / API / sources pour produire l'inventaire des savoirs existants,
- relier sessions, patterns et workflows a des competences candidates.
Claude:
- integrer le dashboard comme source d'audit et de statut,
- garder les invariants de promotion pour eviter qu'un "savoir present" soit confondu avec un "savoir verifie".

View File

@@ -0,0 +1,134 @@
# Addendum Codex - Chaine apprentissage Graph / FAISS
Date: 2026-05-27 19:56
De: Codex
Pour: Dom, Qwen, Claude
Lien avec:
- `docs/coordination/syntheses/2026-05-27_1950_codex_SYNTHESE-reuse-lea-core-micro-apprentissage.md`
- `docs/coordination/syntheses/2026-05-27_1953_codex_ADDENDUM-base-connaissances-dashboard.md`
## Recadrage Dom
Dom rappelle qu'il existe deja toute une chaine d'apprentissage:
- graphes,
- FAISS,
- embeddings,
- workflows,
- memoire visuelle,
- apprentissage continu.
Ce point est important: `competence courte verifiee` ne signifie pas repartir sur une chaine simplifiee.
Cela signifie: **definir l'unite de promotion et de validation qui traverse la chaine existante**.
## Chaine existante a reutiliser
Briques identifiees:
- `core/pipeline/workflow_pipeline.py`
- orchestre `RawSession -> ScreenStates -> UIElements -> Embeddings -> Workflow`,
- initialise `CLIPEmbedder`, `FusionEngine`, `StateEmbeddingBuilder`, `FAISSManager`, `GraphBuilder`, `NodeMatcher`, `LearningManager`, `HierarchicalMatcher`, `TargetResolver`, `ActionExecutor`.
- `core/graph/graph_builder.py`
- construit des graphes de workflow depuis sessions,
- detecte des patterns repetes via DBSCAN sur embeddings,
- produit nodes/edges de workflow.
- `core/graph/node_matcher.py`
- matche l'etat courant contre des nodes candidats,
- utilise FAISS si disponible, fallback lineaire sinon.
- `core/embedding/faiss_manager.py`
- indexation et recherche vectorielle,
- sauvegarde/chargement d'index et metadonnees,
- migration auto Flat -> IVF au-dela de 10k embeddings.
- `core/embedding/state_embedding_builder.py`
- construit les embeddings multimodaux d'etat.
- `core/grounding/shadow_learning_hook.py`
- apprend depuis les clics humains en Shadow,
- enrichit le store de signatures d'elements.
- `core/workflow/semantic_matcher.py`
- matche les workflows appris.
- `core/learning/*`
- apprentissage continu, feedback, versioning, memoire.
- `core/federation/faiss_global.py`
- consolidation / federation FAISS.
## Position corrigee
Le pipeline cible devient:
`capture live`
-> `session_cleaner`
-> `stream_processor`
-> `WorkflowPipeline / GraphBuilder`
-> `embeddings / FAISS / NodeMatcher`
-> `shadow_observer / shadow_validator`
-> `gesture_catalog / ui_patterns`
-> `replay_verifier`
-> `replay_learner / target_memory_store`
-> `knowledge_base dashboard`
La competence courte verifiee est le contrat de promotion:
- elle ne remplace pas les graphes,
- elle ne remplace pas FAISS,
- elle ne remplace pas la memoire visuelle,
- elle donne un statut humain et operationnel a un apprentissage issu de ces briques.
## Regle de conception
On ne code pas une nouvelle chaine.
On ajoute, si necessaire, une couche fine de **classification / promotion**:
- ce que la chaine a observe,
- ce que la chaine a reconnu,
- ce que la chaine peut rejouer,
- ce que la chaine a verifie,
- ce que l'humain a valide,
- ce qui peut etre marque comme competence stable.
## Consequence pour P0
Pour `ouvrir_recherche_windows`, il faut regarder les deux niveaux:
1. Niveau court terme:
- session propre,
- `Win+S`,
- postcondition `Rechercher/SearchHost.exe`,
- replay verifie.
2. Niveau chaine d'apprentissage:
- est-ce que la session est deja indexee dans FAISS ?
- est-ce qu'un node/cluster represente l'etat `Recherche Windows ouverte` ?
- est-ce que les workflows appris contiennent deja ce pattern ?
- est-ce que la memoire visuelle retrouve des etats similaires ?
- est-ce que le dashboard expose ce savoir ?
## Mission ajustee
Qwen:
- inclure `WorkflowPipeline`, `GraphBuilder`, `NodeMatcher`, `FAISSManager`, `StateEmbeddingBuilder`, `ShadowLearningHook` dans l'inventaire,
- dire quelles briques sont actives, lesquelles sont dormantes, lesquelles sont seulement offline,
- relier les donnees dashboard aux modules qui les produisent.
Claude:
- verifier que le contrat `competence courte verifiee` s'insere au-dessus de la chaine existante,
- eviter toute formulation qui ferait croire qu'on contourne Graph/FAISS,
- proposer ou placer le statut `observed/candidate/supervised/stable` sans casser les stores existants.
## Synthese
La bonne formulation est:
**On ne repart pas sur une competence courte a la place de la chaine d'apprentissage. On utilise la competence courte verifiee comme unite lisible, validable et promouvable dans la chaine d'apprentissage existante Graph / FAISS / Shadow / Replay / Memoire.**

View File

@@ -0,0 +1,112 @@
# BROUILLON Codex — Etape 2 primitives generiques
- `Auteur`: Codex
- `Date`: 2026-05-28 09:40 Europe/Paris
- `Statut`: brouillon de travail, pas un GO de generation YAML
- `Contexte`: Dom a confirme le lancement de l'etape 2 apres ACK R1/R2 Claude/Qwen.
## Decision de cadrage proposee
Ne pas creer 1 competence par raccourci ou par contexte applicatif.
Une primitive N1 est un **template parametre**. Une competence contextualisee N2 instancie un ou plusieurs templates N1, puis porte sa propre precondition et son propre `success_marker`.
Exemple:
```yaml
methods:
- id: keyboard_win_s
primitive_ref: key_combo
kind: key_combo
parameters:
keys: ["win", "s"]
```
`open_windows_search` reste donc une competence N2 contextualisee. `Win+S` est seulement une instanciation de `key_combo`.
## Sources locales utilisees
- `agent_chat/gesture_catalog.py`: catalogue existant de gestes Windows, navigateur, edition.
- `agent_v0/agent_v1/core/executor.py`: execution deja orientee `click`, `type/text_input`, `key_combo`, `scroll`, `wait`.
- `tools/competence_validator.py`: socle actuel valide surtout `key_combo` et `text_input` observes.
- `data/competences/candidate/open_windows_search.yaml`: P0 candidate.
- `data/competences/observed/saisir_requete_recherche.yaml`: P1 observed.
- Sessions utiles confirmees offline:
- `sess_20260527T185155_98ad9a`: `Win+S`, texte recherche Windows.
- `sess_20260413T063906_a93e7b`: texte `chrome`, recherche navigateur `voiture electrique`.
- `sess_20260331T151328_780a5b`: texte `word`, saisie Word.
- `sess_20260330T175739_6e190b`: saisie Word.
- `sess_20260324T165824_55b380`: `Win+R`, `Alt+F4`, saisie Bloc-notes.
## Les 10 primitives N1 candidates
| # | Primitive N1 | Role | Parametres minimaux | Methode actuelle | Success marker generique | Statut |
|---|---|---|---|---|---|---|
| 1 | `key_combo` | Executer un raccourci clavier parametre | `keys`, `context_guard`, `expected_effect` | `kind: key_combo` | fourni par la N2 appelante | utilisable maintenant |
| 2 | `text_input_focused` | Saisir du texte dans le champ deja focus | `text`, `target_context`, `concat_rule`, `clear_before`, `submit_after` | `kind: text_input` | `text_input_reconstructed_equals` offline, OCR/replay en supervised | utilisable maintenant |
| 3 | `click_anchor` | Cliquer une cible UI semantique, sans coordonnee durable | `anchor_ref` ou `target_spec`, `button`, `click_count`, `region_hint` | futur `click_anchor` / executor `click` | element actif, fenetre/titre change, action_result | a cadrer avant YAML observe |
| 4 | `scroll_view` | Faire defiler une zone active ou cible | `direction`, `amount`, `unit`, `container_hint` | executor `scroll` existe | contenu/scrollbar change ou idempotence documentee | a cadrer avant YAML observe |
| 5 | `wait_for_state` | Attendre une postcondition sans action utilisateur | `markers`, `timeout_ms`, `stable_for_ms` | executor `wait` existe | markers satisfaits apres attente | utile pour chainage |
| 6 | `focus_window` | Garantir qu'une fenetre/process est actif | `title_in`, `process_name`, `window_ref`, `if_missing` | composition: Alt+Tab/click/window API selon runtime | active window/process match | a garder prudent |
| 7 | `gesture_command` | Wrapper semantique autour du `GestureCatalog` | `gesture_id`, `context`, `parameters` optionnels | resolution vers `key_combo` | fourni par la N2 appelante | evite fragmentation |
| 8 | `ui_element_present` | Observer qu'un element UI existe | `role`, `text`, `anchor_ref`, `region_hint` | OCR/UIA/FastDetector/VLM selon runtime | element present avec evidence source | marker, pas action |
| 9 | `active_window_matches` | Observer titre/process/fenetre active | `title_in`, `process_name`, `mode` | heartbeat/window metadata | active title/process match | marker deja utilise |
| 10 | `dialog_policy` | Traiter ou refuser un dialogue connu | `dialog_match`, `policy`, `allowed_actions` | resolver/dialog guard existant | dialogue disparu ou pause humaine conforme contrat | a garder fail-closed |
## Regles anti-fragmentation
1. Pas de YAML N1 par raccourci (`ctrl+s`, `ctrl+w`, `win+r`). Tout passe par `key_combo` ou `gesture_command`.
2. Pas de YAML N1 par contexte de saisie (`search`, `word`, `browser`). Tout passe par `text_input_focused`; la N2 porte le contexte et le success marker.
3. `click_anchor` interdit les coordonnees durables. Les bbox restent dans les stores runtime, pas dans le YAML.
4. Les primitives 8 et 9 sont des primitives de verification/observation. Elles peuvent apparaitre dans `preconditions` ou `success_marker`, pas comme action principale.
5. `dialog_policy` doit rester conservateur: UAC, SmartScreen, Windows Security => pause humaine.
## Mapping avec le backlog socle
| Competence N2 | Instanciation N1 proposee |
|---|---|
| `open_windows_search` | `key_combo(keys=["win","s"])` + `active_window_matches(SearchHost.exe/Rechercher)` |
| `saisir_requete_recherche` | `text_input_focused(text=query)` + `ui_element_present/text_input_reconstructed_equals` |
| `saisir_texte_word` | `text_input_focused(text=document_text)` + `active_window_matches(WINWORD.EXE)` |
| `close_active_window` | `gesture_command(gesture_id="win_close")` + `active_window_changed/window_absent` |
| `open_chrome` | N2 composee: `open_windows_search` + `text_input_focused("chrome")` + `key_combo(["enter"])` |
| `navigate_url_chrome` | `gesture_command("chrome_address_bar")` + `text_input_focused(url)` + `key_combo(["enter"])` |
| `close_tab_chrome` | `gesture_command("chrome_close_tab")` |
| `save_document` | `gesture_command("edit_save")`; success marker souvent idempotent, doit etre contextualise |
| `scroll_down` | `scroll_view(direction="down")` |
| `copy_text` | `gesture_command("edit_copy")`; success marker difficile offline, supervised conseille |
## Proposition de schema minimal a ajouter plus tard
Ne pas modifier le validateur maintenant sans ACK collectif. Si valide, ajout minimal futur:
```yaml
methods:
- id: keyboard_win_s
kind: key_combo
primitive_ref: key_combo
parameters:
keys: ["win", "s"]
```
Puis le validateur pourrait controler:
- `primitive_ref` appartient a une liste connue.
- les parametres requis de la primitive sont presents.
- les `kind` actuels restent compatibles avec l'execution existante.
## Questions ouvertes pour Claude/Qwen
1. Faut-il garder `gesture_command` comme primitive N1 distincte de `key_combo`, ou seulement comme alias de catalogue ?
2. Faut-il compter `ui_element_present` et `active_window_matches` comme primitives N1, ou les nommer explicitement "markers N1" ?
3. `dialog_policy` doit-il entrer dans les 10 primitives maintenant, ou rester dans les guards runtime hors competence ?
4. Est-ce que `focus_window` est suffisamment actionnable aujourd'hui, ou doit-il rester N2/contextualise ?
## Recommandation Codex
Valider d'abord une taxonomie en deux sous-listes:
- **N1 actions**: `key_combo`, `text_input_focused`, `click_anchor`, `scroll_view`, `wait_for_state`, `focus_window`, `gesture_command`.
- **N1 markers/guards**: `ui_element_present`, `active_window_matches`, `dialog_policy`.
Ensuite seulement, generer un registre/template YAML de primitives et adapter le validateur par un patch borne.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,86 @@
# Inventaire dry-run multi-session
- run_id: `multi_extract_2026-05-28T17:24:19+00:00`
- sessions_ok: 10 / 10
- candidates_total: 23
- apply_eligible_total: 7
- blocked_total: 16
- rejected_total: 204
## Candidats Apply-Eligible
### 1. `click_addbutton_wait_notepad_exe`
- session: `sess_20260417T133324_30c2d0` (A1 click source)
- primitives: click_anchor, wait_for_state
- confidence: 0.7
- segment: `{'keep': [13, 14, 15, 16], 'method': [15, 16], 'success': [16]}`
- gaps: click_target_semantics_not_observed_offline, no_ocr_offline
- validator: `would_pass`
### 2. `key_win_r_wait_explorer_exe`
- session: `sess_20260324T165824_55b380` (P3-B/W3/W4 source)
- primitives: key_combo, wait_for_state
- confidence: 0.9
- segment: `{'keep': [1, 2, 3, 4], 'method': [3, 4], 'success': [4]}`
- gaps: none
- validator: `would_pass`
### 3. `key_ctrl_s_wait_notepad_exe`
- session: `sess_20260324T165824_55b380` (P3-B/W3/W4 source)
- primitives: key_combo, wait_for_state
- confidence: 0.9
- segment: `{'keep': [54, 55, 56, 57], 'method': [56, 57], 'success': [57]}`
- gaps: none
- validator: `would_pass`
### 4. `key_alt_f4_wait_windowsterminal_exe`
- session: `sess_20260324T165824_55b380` (P3-B/W3/W4 source)
- primitives: key_combo, wait_for_state
- confidence: 0.9
- segment: `{'keep': [70, 71, 72, 73], 'method': [72, 73], 'success': [73]}`
- gaps: none
- validator: `would_pass`
### 5. `click_nouvel_onglet_wait_chrome_exe`
- session: `sess_20260417T215116_316c21` (windows_vm second session)
- primitives: click_anchor, wait_for_state
- confidence: 0.7
- segment: `{'keep': [5, 6, 7, 8], 'method': [7, 8], 'success': [8]}`
- gaps: click_target_semantics_not_observed_offline, no_ocr_offline
- validator: `would_pass`
### 6. `click_so_iazxhgsedkduppcyhoay_73_wait_chrome_exe`
- session: `sess_20260417T215116_316c21` (windows_vm second session)
- primitives: click_anchor, wait_for_state
- confidence: 0.7
- segment: `{'keep': [15, 16, 17, 18], 'method': [17, 18], 'success': [18]}`
- gaps: click_target_semantics_not_observed_offline, no_ocr_offline
- validator: `would_pass`
### 7. `click_systemtrayicon_wait_explorer_exe`
- session: `sess_20260417T215116_316c21` (windows_vm second session)
- primitives: click_anchor, wait_for_state
- confidence: 0.7
- segment: `{'keep': [45, 46, 47, 48], 'method': [47, 48], 'success': [48]}`
- gaps: click_target_semantics_not_observed_offline, no_ocr_offline
- validator: `would_pass`
## Sessions
- `sess_20260527T185155_98ad9a` (P0/P1 source): 4 candidates, 0 eligible, 3 rejected
- `sess_20260417T133324_30c2d0` (A1 click source): 5 candidates, 1 eligible, 1 rejected
- `sess_20260330T175739_6e190b` (P2 Word source): 1 candidates, 0 eligible, 25 rejected
- `sess_20260324T165824_55b380` (P3-B/W3/W4 source): 5 candidates, 3 eligible, 8 rejected
- `sess_20260318T010719_62a058` (P3-A scroll source): 0 candidates, 0 eligible, 142 rejected
- `sess_20260527T184533_8512ac` (recent 2026-05-27 18:45): 3 candidates, 0 eligible, 6 rejected
- `sess_20260527T171412_737571` (recent 2026-05-27 17:14): 0 candidates, 0 eligible, 3 rejected
- `sess_20260527T171110_ca856a` (recent 2026-05-27 17:11): 0 candidates, 0 eligible, 3 rejected
- `sess_20260527T170656_e16163` (recent 2026-05-27 17:06): 0 candidates, 0 eligible, 4 rejected
- `sess_20260417T215116_316c21` (windows_vm second session): 5 candidates, 3 eligible, 9 rejected