Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
645226e
feat(accessibility): médiation programmatique via AT-SPI2 / D-Bus en …
leandre755 Sep 12, 2026
694fe3e
fix(accessibility): durcissement résolution d'index, livraison native…
leandre755 Sep 12, 2026
b2b8666
fix(accessibility): isolation stricte des snapshots et livraison nati…
leandre755 Sep 12, 2026
a5711e0
fix(accessibility): point d'entrée console script gui-agent-atspi et …
leandre755 Sep 12, 2026
0aa9a22
fix(accessibility): résolution sémantique d'action, repli D-Bus et ne…
leandre755 Sep 12, 2026
6033afb
fix(accessibility): build hook wheel natif, repli d-bus get_app_state…
leandre755 Sep 12, 2026
1076aaa
fix(accessibility): tag wheel plateforme, validation architecture elf…
leandre755 Sep 12, 2026
0e0ae4d
fix(accessibility): restructuration etanche multi-os et application i…
leandre755 Sep 12, 2026
b69441f
fix(accessibility): durcissement multi-plateforme, detection binaire …
leandre755 Sep 12, 2026
73ef1a8
fix(accessibility): harmonisation chemins scripts, tag wheel platefor…
leandre755 Sep 13, 2026
8178a90
fix(accessibility): separation console script atspi, shim editable gu…
leandre755 Sep 13, 2026
6d6686c
fix(accessibility): tag wheel audite manylinux, isolation multi-snaps…
leandre755 Sep 13, 2026
45ca723
fix(core): decodeur incremental utf-8 dans repl et gardes psscriptroo…
leandre755 Sep 13, 2026
a03c4a4
docs(gcc): update test ledger and session handoff for final coderabbi…
leandre755 Sep 13, 2026
f8c261c
docs(gcc): harmonize pytest duration and enrich technical signatures …
leandre755 Sep 13, 2026
3357bba
docs(gcc): record final Greptile 5/5 certification and CodeRabbit 0 f…
leandre755 Sep 13, 2026
5eed00d
fix(accessibility): durcissement bus AT-SPI, jetons MCP et conformite…
leandre755 Sep 13, 2026
d5b90f7
style(rust): formatage rustfmt du mediateur atspi
leandre755 Sep 13, 2026
43a5a80
fix(accessibility): transmission d'identifiant MCP, bus AT-SPI brut e…
leandre755 Sep 13, 2026
4d67d06
fix(uninstall): prise en charge securisee des repertoires de captures…
leandre755 Sep 13, 2026
4bcdbb9
fix(uninstall): durcissement des frontieres de purge et motifs strict…
leandre755 Sep 13, 2026
2ab261f
fix(uninstall): prise en compte des motifs recording et web_screensho…
leandre755 Sep 13, 2026
213508e
fix(uninstall): restriction stricte des motifs de purge aux formats a…
leandre755 Sep 13, 2026
112456b
docs(gcc): certification du score Greptile 5/5 sur PR #137
leandre755 Sep 13, 2026
2e931e8
fix(uninstall): validation stricte regex des noms d'artefacts et sync…
leandre755 Sep 13, 2026
a63e404
fix(atspi): rejet des element_index hors bornes et synchronisation do…
leandre755 Sep 13, 2026
2452b7b
docs(gcc): consignation de la confirmation CodeRabbit et résolution d…
leandre755 Sep 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
221 changes: 221 additions & 0 deletions .GCC/branches/plan_accessibility_phase_1.md

Large diffs are not rendered by default.

32 changes: 32 additions & 0 deletions .GCC/branches/test.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,4 +109,36 @@ La règle opérationnelle est désormais : `./ci.sh` + tests ciblés + Greptile
## 🟢 Conclusion & Qualification
La campagne d'exécution atteste d'une qualification à **100% PASS** des 21 outils MCP GUI ainsi que du packaging standard Python (`gui-agent`), de la construction des artefacts de distribution, de l'isolation via `uv tool install`, du script d'installation Linux `install.sh`, du script PowerShell Windows `install.ps1`, du skill d'installation Windows `skills/gui-agent-windows-install/SKILL.md`, ainsi que du correctif de sécurité et de conformité du chemin de sortie pour `gui_take_screenshot` (PR #7).

---

## 🦾 Phase 1 : Médiation d'Accessibilité Programmatique via AT-SPI / D-Bus (Issue #130) (2026-09-12)

| Cible / Scénario | Commande de Test | Résultat Attendu | Résultat Constaté | Statut |
|---|---|---|---|---|
| **Détection du moteur Rust** | `pytest tests/test_accessibility.py -k test_find_atspi_mediator_binary` | Résolution prioritaire variable d'env puis binaire local/upstream | Priorité respectée, détection `/bin/sh` et binaire Rust standard | **PASS** |
| **Extraction d'arbre AT-SPI** | `pytest tests/test_accessibility.py -k 'test_get_app_state_nominal_or_error or test_get_app_state_with_screenshot'` | Format JSON textuel pur avec count et tree | Structure validée (`status in ('success', 'error')`, `layer: 'accessibility'`) | **PASS** |
| **Gestion des erreurs et timeouts** | `pytest tests/test_accessibility.py -k 'test_get_app_state_subprocess_error or test_get_app_state_subprocess_timeout or test_get_app_state_binary_missing'` | Pas de crash, dict d'erreur clair et borné | Retours d'erreur structurés avec capture propre | **PASS** |
| **Mocks d'état applicatif** | `pytest tests/test_accessibility.py -k test_get_app_state_mock` | Découplage complet sans bus graphique requis | Arbre synthétique injecté et inspecté fidèlement | **PASS** |
| **Déclenchement d'actions RAM** | `pytest tests/test_accessibility.py -k 'test_perform_action_mock or test_perform_action_mcp_mock_protocol or test_perform_action_binary_missing'` | Format MCP element_index/element_identifier | Protocole JSON-RPC validé, exécution d'actions sans curseur | **PASS** |
| **Écriture directe en mémoire** | `pytest tests/test_accessibility.py -k 'test_set_value_mock or test_set_value_mcp_mock_protocol or test_set_value_binary_missing'` | Mutation Value/EditableText directe | Valeurs assignées sans perte ni layout clavier | **PASS** |
| **Résolution par cache de nœuds** | `pytest tests/test_accessibility.py -k test_perform_action_and_set_value_with_node_cache` | Injection de element_identifier à partir du cache local | Résolution d'index numérique vérifiée et validée | **PASS** |
| **Intégration façade SDK** | `pytest tests/test_accessibility.py -k test_mcp_core_sdk_facade_integration` | Exposition cohérente dans `mcp_core` | `mcp_core.get_app_state`, `perform_action`, `set_value` opérationnels | **PASS** |
| **Régression Scaffolding** | `pytest tests/test_package.py -k test_modular_architecture_scaffolding` | Non-régression sur le découpage modulaire | Validation 100% de la structure core/layers/utils | **PASS** |
| **Validation stricte de l'arbre** | `pytest tests/test_accessibility.py -k test_get_app_state_invalid_tree_payload` | Rejet explicite des payloads non conformes | Erreur structurée retournée, purge déterministe du cache de nœuds | **PASS** |
| **Identité de snapshot & non-obsolescence** | `pytest tests/test_accessibility.py -k test_perform_action_and_set_value_with_snapshot_id_mismatch` | Rejet immédiat (return False) si snapshot_id mismatch | Évite toute action accidentelle sur un index périmé | **PASS** |
| **Rejet fail-closed d'index absent du cache** | `pytest tests/test_accessibility.py -k test_perform_action_and_set_value_with_missing_cache_index` | Rejet immédiat sans subprocess si index inconnu | Aucune action non coordonnée sur arbre sauvage | **PASS** |
| **Validation CodeRabbit locale** | `coderabbit review --agent -t uncommitted` | 0 finding bloquant / avertissement sur l'ensemble des fichiers modifiés | 0 finding, review completed avec succès | **PASS** |
| **Durcissement index bounds & hydratation D-Bus** | `cargo test --manifest-path crates/atspi_mediator/Cargo.toml` | Rejet immédiat sur index numérique hors limites + mutex d'hydratation réessayable | 8/8 tests passés, 0 warning clippy | **PASS** |
| **Rejet obligatoire d'index sans snapshot_id** | `pytest tests/test_accessibility.py -k test_numeric_index_without_snapshot_id_rejected` | Rejet fail-closed systématique sans Popen si snapshot_id manquant sur index numérique | Test unitaire validé | **PASS** |
| **Livraison native et fallbacks install.sh** | `./install.sh --dry-run` | Détection cibles workspace/crate target et fallback git cargo install | 0 erreur, code 0 | **PASS** |
| **Validation Globale CI** | `./ci.sh` | 100% des étapes CI vertes (compileall, workflows, ruff check/format, mypy, pytest) | 84/84 tests passés en 32.31s, 0 avertissement, 0 erreur | **PASS** |
| **Validation CodeRabbit 3 remarques mineures** | `coderabbit review --agent --uncommitted` | 0 finding bloquant / avertissement sur `windows/install.ps1`, `linux/core/repl.py`, `linux/tests/test_package.py` | `review_completed`, `findings: 0` | **PASS** |
| **Gardiens repl incrémental UTF-8 & install.ps1** | `pytest linux/tests/test_package.py -k "test_repl_safe_read_incremental_utf8 or test_repl_execute_script_multibyte_utf8 or test_windows_install_ps1_guards"` | Validation fragments multi-octets UTF-8, script repl émettant des emojis/accents et gardes PowerShell | 3/3 tests unitaires passés | **PASS** |
| **Validation Globale CI (Phase 1 finale)** | `./ci.sh` | 100% des étapes CI vertes (compileall, verify_workflows, ruff check, ruff format, mypy, pytest) | 105/105 tests passés en 36.20s, 0 avertissement, 0 erreur | **PASS** |
| **Compilation Rust native Workspace** | `cargo check` | Vérification du crate natif `atspi_mediator` | Compilé en 0.09s (code 0) | **PASS** |
| **Revue Greptile finale sur commit `45ca723`** | `greptile review --agent --branch main` | Vérification exhaustive de la branche contre main | `Confidence: 5/5`, 0 finding, `The PR appears safe to merge` | **PASS** |
| **Certification Greptile finale sur commit `f8c261c`** | `greptile review --agent --branch main --instructions "..."` | Certification des 3 ajustements finaux (Review ID `9369eadb-09f9-439d-94e5-ca3a78d6c94a`) | `Confidence: 5/5`, 0 comment, `The reviewed adjustments appear safe to merge` | **PASS** |
| **Certification CodeRabbit finale sur commit `f8c261c`** | `coderabbit review --agent --base-commit 6d6686c` | 0 finding sur l'ensemble des fichiers modifiés | `review_completed`, `findings: 0` | **PASS** |
| **Validation Globale CI (Phase 1 durcie)** | `./ci.sh` | 100% des étapes CI vertes (compileall, verify_workflows, ruff check, ruff format, mypy, pytest) | 112/112 tests passés en 54.98s, 0 avertissement, 0 erreur | **PASS** |
| **Rejet index u32 hors plage & tests MCP** | `cargo test --manifest-path linux/crates/atspi_mediator/Cargo.toml` | Rejet immédiat sur index numérique > u32::MAX + priorité identifiant explicite | 13/13 tests passés (9 lib, 4 main), 0 avertissement | **PASS** |

31 changes: 27 additions & 4 deletions .GCC/main.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
- [2026-08-27] Synchronisation Concurrente et Nettoyage Déterministe de l'Enregistrement Vidéo (PR #57, Confidence Score 5/5 Greptile)
- [2026-08-27] Bornage Déterministe et Deadline Globale pour le Listing X11 (PR #55, Confidence Score 5/5 Greptile)
- [2026-09-12] Modular Architecture Scaffolding, Execution Primitives Hardening & Dependencies Modernization (PR #136, Confidence Score 5/5 Greptile, 0 findings CodeRabbit, 65/65 tests)
- [2026-09-13] Médiation d'Accessibilité Programmatique AT-SPI & Durcissement Purge Uninstall (PR #137, Confidence Score 5/5 Greptile, 12/12 fils CodeRabbit résolus, 112/112 tests)

## 🎯 Objective
High-performance FastMCP server engineered with a decoupled modular architecture (core, layers, utils) for direct, low-latency Computer Use on Linux (X11/XWayland) and Windows desktop environments (<50 MB RAM, 21 tools, zero-leak process lifecycle).
Expand Down Expand Up @@ -43,13 +44,27 @@ High-performance FastMCP server engineered with a decoupled modular architecture
- **Règle d'échec sans boucle** : si une revue locale ou GitHub trouve un bug, ne pas relancer immédiatement l'agent. Lire 100 % du verdict, regrouper tous les constats, corriger localement, puis refaire toute la validation locale. Une nouvelle revue GitHub nécessite un changement réel, une validation locale complète et une autorisation explicite tenant compte du coût/quota.
- **Portée Greptile à ne jamais confondre** : `greptile review` local analyse le commit/working tree selon le prompt fourni ; Greptile GitHub analyse la PR complète après push. Un score local 5/5 ne prédit donc pas le score GitHub.
- Après chaque revue GitHub, lire le message principal de la PR, le résumé Greptile complet, le bilan T-Rex et 100 % des commentaires/threads ; ne jamais conclure à partir du seul score ou d'un check-run.
- **Temporisation d'attente Greptile** : Les revues automatiques Greptile GitHub prennent environ **8 minutes**. Ne jamais régler de timer d'attente court (ex: 30 secondes ou 5 minutes) qui entraîne des boucles de vérification prématurées ou inutiles ; configurer impérativement un délai d'attente de **8 minutes (480 secondes)** avant de relever le verdict Greptile.
- **Identité de publication de la PR** : La Pull Request doit être créée et finalisée avec le compte GitHub **personal agent**.
- CodeRabbit distant est déclenché explicitement par un commentaire `@coderabbitai review` uniquement après la validation locale et avec autorisation explicite ; ne pas le relancer si une revue est déjà en cours, rate-limitée ou non nécessaire.
- Les check-runs seuls ne valent pas validation ; le critère final reste Greptile **5/5**, zéro échec de sécurité, zéro commentaire actionnable et zéro bloquant Optibot/CodeRabbit. La priorité est de réduire le nombre total de reviews, pas de boucler jusqu'à un score parfait.
- **Analyse des vulnérabilités de rollback capture identifiées par Greptile (PR #7)** :
- *P1 - Réservations en lecture seule non nettoyées* : Si un fichier réservé devient read-only, l'ouverture `O_RDWR` échoue et l'erreur étouffée laisse le fichier sur disque, forçant les retentatives vers des suffixes inutiles `(1)`. Solution : ouvrir d'abord en `O_RDONLY` pour vérifier l'identité et ne tronquer que si accessible en écriture.
- *P1 - Course TOCTOU lors de la suppression par chemin* : La séquence `os.stat()` puis `os.unlink(filename, dir_fd)` permet à un attaquant de remplacer l'entrée entre les deux appels et d'entraîner la suppression de son fichier tiers. Solution : bannir la suppression destructive basée sur le nom dans un répertoire concurrent ; retenir le descripteur ouvert de la réservation à l'écriture, ou s'abstenir de tout `unlink` non lié de manière exclusive.

## 🧠 Decisions Made
- [2026-09-12] Bundle Unique Natif par Système d'Exploitation (Rust + REPL PyO3)
- **Context**: Besoin de livrer un artefact directement exécutable par OS (`gui-agent` sous Linux, `gui-agent.exe` sous Windows, `gui-agent` sous macOS), compilable directement sur la machine hôte via Cargo sans surcoût d'environnement virtuel Python ni fragmentation multi-processus.
- **Discarded Options**: Bundle Python auto-extractible via PyInstaller/Nuitka (>150 Mo, latence au démarrage, décompression) ; distribution multi-binaires fragmentée (FastMCP Python appelant des sous-processus séparés).
- **Rationale**: Un binaire autonome Rust garantit une latence quasi-nulle (<5 ms), une consommation mémoire minime (<15 Mo), une compilation locale unifiée (`cargo build --release`), une étanchéité par plateforme via des crates dédiés (`linux/crates/`, `windows/crates/`), et une intégration native du REPL CodeAct (`execute_script`) via PyO3.
- [2026-09-12] Durcissement de la Résolution d'Index, Livraison Native et Sélection Déterministe d'Actions (Phase 1 #130)
- **Context**: Retours de revue Greptile et CodeRabbit : repli arbitraire sur l'index 1 dans `select_action_index`, maintien de l'exécution sur index périmés sans snapshot actif ou sur cache absent, et omission de la compilation/installation de `gui-agent-atspi` dans le workflow `install.sh`.
- **Discarded Options**: Tolérer un repli permissif sur une action arbitraire ; ignorer l'invalidation de cache et relancer un snapshot non filtré en tâche de fond ; exiger l'installation manuelle d'outils tiers.
- **Rationale**: Rejet fail-closed strict (return False) de tout index numérique non résolu dans `_last_node_cache` ou sur snapshot mismatch ; sélection d'action déterministe (exacte, numérique, sous-chaîne unique, synonymes sémantiques ou rejet avec listing des actions disponibles) ; build et installation automatique de `gui-agent-atspi` dans `install.sh` ; création du workspace `Cargo.toml` racine activant la détection CI native.
- [2026-09-12] Médiation d'Accessibilité Programmatique via Moteur Natif Rust AT-SPI / D-Bus (Phase 1 #130)
- **Context**: L'accès à l'interface graphique Linux par perception visuelle seule (captures d'écran et OCR) souffre de cécité sémantique (menus contextuels éphémères, scaling HiDPI, dialogues modaux bloquants). L'accès direct à AT-SPI2 via D-Bus (`org.a11y.Bus`) est requis avec une latence d'extraction minimale (< 50 ms).
- **Discarded Options**: Bibliothèque Python `pyatspi` (obsolète, fuites mémoire et dépendances C non isolées) ; binding C pur / ctypes ; réécriture complète du serveur MCP en Rust (rupture de compatibilité avec l'écosystème FastMCP Python existant).
- **Rationale**: Moteur autonome bivalent écrit en Rust (`linux/crates/atspi_mediator` produisant le binaire release autonome `gui-agent-atspi` de 3,0M épuré) exploitant `atspi` et `zbus`, avec support CLI et mode serveur stdio JSON-RPC MCP (`initialize`, `tools/call`), interfacé depuis Python via `linux/layers/accessibility.py` avec mise en cache synchronisée par verrou (`_cache_lock`) des index vers `object_ref`, communication par flux process borné avec timeouts stricts et mocks complets pour CI headless.
- [2026-09-11] Architecture Modulaire Découplée (core, layers, utils #129)
- **Context**: Monolithe historique couplant REPL, gestion PTY, drivers bas niveau et helpers.
- **Discarded Options**: Monolithe persistant ; micro-paquets distribués séparément.
Expand Down Expand Up @@ -112,25 +127,33 @@ High-performance FastMCP server engineered with a decoupled modular architecture
- **Rationale**: Geler la structure jusqu'à la revue utilisateur afin de ne pas invalider les chemins de son audit, et reporter les corrections futures dans l'audit.

## 🌿 Active Branches / Plans
- `feat/accessibility-mediation-phase-1` : Médiation d'accessibilité programmatique via AT-SPI / D-Bus (Issue #130) [plan_accessibility_phase_1.md](.GCC/branches/plan_accessibility_phase_1.md) - Pull Request [#137](https://github.com/leandre755/gui_agent/pull/137) soumise par `personnal-agent`
- `main` : Production release with decoupled modular architecture (core, layers, utils), bilingual landing pages, 65/65 Zero-Slop test harness, hardened screenshot rollback lifecycle, bounded X11 timeouts and thread-safe video recording.

## 📈 Current Status
- ✅ Done:
- Suppression définitive des 8 issues obsolètes (#3, #4, #5, #9, #12, #28, #30, #48).
- Création des 7 issues d'architecture v1.0 (#129 à #135) couvrant l'arborescence, les phases 1-4 et la recherche d'équivalents Windows/macOS.
- Fusion de la PR #136 (`refactor/modular-architecture-issue-129`, Closes #129) avec Confidence Score 5/5 sur Greptile et 0 findings CodeRabbit (65/65 tests validés).
- Implémentation et durcissement complets de la Phase 1 (#130) : Médiation d'accessibilité programmatique via AT-SPI / D-Bus (moteur natif Rust `linux/crates/atspi_mediator` produisant `gui-agent-atspi`, couche Python `linux/layers/accessibility.py`, 112/112 tests CI validés au dernier `./ci.sh`).
- Fermeture de la PR obsolète #112 (traitement de la sécurité subprocess #44 transféré à l'Issue #132).
- Fusion des PRs précédentes (#7, #8, #16, #35, #50, #57, #55).
- Fermeture des issues résolues (#42, #56, #69, #106, #70, #68, #63, #59, #46, #45, #13, #107, #43).
- Nettoyage et suppression de l'ensemble des branches résiduelles distantes et locales.
- Validation CI 65/65 tests, quality gate PASS sur `main`.
- 🔄 In progress: Aucun (arbre propre sur `main`).
- Restructuration étanche par système d'exploitation (`linux/`, `windows/`, `macos/`), migration de `tests/` et `examples/` dans `linux/`, zéro code/test/cache à la racine.
- Durcissement exhaustif de `.gitignore` et purge des caches résiduels (1,5 Go de target crate et __pycache__).
- Alignement du workspace Cargo racine (`Cargo.toml`) sur `linux/crates/atspi_mediator` validé par `cargo check`.
- Décision d'architecture actée : Bundle Unique Natif par OS en Rust (avec REPL PyO3 embarqué) directement exécutable et compilable sur l'hôte.
- Validation CI 112/112 tests PASS, Mypy strict (36 fichiers), Bandit, Semgrep et quality gate pre-commit PASS sur la branche `feat/accessibility-mediation-phase-1`.
- Application intégrale et exhaustive des retours de revue Greptile et CodeRabbit : transmission directe d'identifiant résolu et priorité dans le médiateur MCP Rust, parsing universel de l'adresse de bus AT-SPI (formats bruts/cités busctl et dbus-send), prise en charge sécurisée des répertoires de captures personnalisés (`GUI_AGENT_SCREENSHOTS_DIR`) avec protection stricte des racines système/utilisateurs, vérification de propriété UID, restriction chirurgicale aux motifs applicatifs authentiques (timestamps numériques et UUID stricts), et préservation à 100% des fichiers médias tiers plausibles (`video_projet.mp4`, `recording_interview.mp4`, `screenshot_final.png`).
- Validation et certification officielle de la Pull Request [#137](https://github.com/leandre755/gui_agent/pull/137) : **Confidence Score: 5/5 sur Greptile**, **0 commentaire ajouté**, verdict *Safe to merge; there are no outstanding blocking issues*, et **12/12 fils CodeRabbit résolus** sur GitHub.
- Validation CI complète : 112/112 tests PASS, Mypy strict (36 fichiers), Bandit, Semgrep, Rust clippy/test/fmt et quality gate pre-commit PASS.
- 🔄 In progress: Approbation et fusion de la Pull Request #137 par le mainteneur.
- ⏳ Pending:
- 1. **Phase 1 (#130)** : Médiation d'accessibilité programmatique via AT-SPI / D-Bus (`layers/accessibility.py`).
- 2. **Phase 2 (#131)** : Moteur d'exécution local CodeAct et SDK unifié `mcp_core` (`core/repl.py`).
- 3. **Phase 3 (#132)** : Émulation d'entrées noyau (`uinput/evdev`), perception visuelle (`RapidOCR`) et gestion de fenêtrage (`process_run` sécurisé).
- 4. **Phase 4 (#133)** : Déclaration FastMCP des 13 outils chirurgicaux, suppression des redondances et mise à jour CI.
- 5. **Recherche OS tiers (#134, #135)** : Adaptation Windows (UI Automation) et macOS (NSAccessibility).

## 👉 Next Session Direction
Initier la Phase 1 sur une nouvelle branche dédiée : Implémentation de l'Issue #130 (Médiation d'accessibilité programmatique via AT-SPI / D-Bus).
Finaliser la Pull Request pour la Phase 1 (Issue #130 : Médiation d'accessibilité programmatique via AT-SPI / D-Bus) puis initier la Phase 2 (Issue #131).
Loading
Loading