docs(coordination): sync agent inboxes and active decisions
This commit is contained in:
95
docs/coordination/syntheses/2026-05-25_synthese-direction.md
Normal file
95
docs/coordination/syntheses/2026-05-25_synthese-direction.md
Normal 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`
|
||||
@@ -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.
|
||||
@@ -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".
|
||||
@@ -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.**
|
||||
@@ -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
@@ -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
|
||||
Reference in New Issue
Block a user