From ad2690712f7746c629a07c485b2d6c5ab0d6e475 Mon Sep 17 00:00:00 2001 From: Roland Salardon Date: Thu, 20 Aug 2026 17:09:12 +0200 Subject: [PATCH 1/2] feat(agentic): add codex lead infrastructure Signed-off-by: Roland Salardon --- .codex/agents/explorer.toml | 12 ++++ .codex/agents/gw2analytics_lead.toml | 15 ++++ .codex/agents/implementer.toml | 14 ++++ .codex/agents/reviewer.toml | 13 ++++ .codex/agents/specialist.toml | 13 ++++ .codex/config.toml | 11 +++ AGENTS.md | 16 ++++- docs/agentic/README.md | 51 +++++++++++++ docs/agentic/architecture.md | 43 +++++++++++ docs/agentic/autonomy-policy.md | 32 +++++++++ docs/agentic/backlog.md | 29 ++++++++ docs/agentic/communication-protocol.md | 35 +++++++++ docs/agentic/current-state.md | 45 ++++++++++++ docs/agentic/routing-policy.md | 48 +++++++++++++ docs/agentic/worktrees-herdr.md | 23 ++++++ tests/scripts/test_agentic_infrastructure.py | 76 ++++++++++++++++++++ 16 files changed, 475 insertions(+), 1 deletion(-) create mode 100644 .codex/agents/explorer.toml create mode 100644 .codex/agents/gw2analytics_lead.toml create mode 100644 .codex/agents/implementer.toml create mode 100644 .codex/agents/reviewer.toml create mode 100644 .codex/agents/specialist.toml create mode 100644 .codex/config.toml create mode 100644 docs/agentic/README.md create mode 100644 docs/agentic/architecture.md create mode 100644 docs/agentic/autonomy-policy.md create mode 100644 docs/agentic/backlog.md create mode 100644 docs/agentic/communication-protocol.md create mode 100644 docs/agentic/current-state.md create mode 100644 docs/agentic/routing-policy.md create mode 100644 docs/agentic/worktrees-herdr.md create mode 100644 tests/scripts/test_agentic_infrastructure.py diff --git a/.codex/agents/explorer.toml b/.codex/agents/explorer.toml new file mode 100644 index 00000000..25db5db3 --- /dev/null +++ b/.codex/agents/explorer.toml @@ -0,0 +1,12 @@ +name = "explorer" +description = "Exploration ciblée, lecture de code et collecte de preuves sans mutation." +model = "gpt-5.6-luna" +model_reasoning_effort = "medium" +sandbox_mode = "read-only" + +developer_instructions = """ +Cartographie uniquement les chemins réellement pertinents et retourne des +références de fichiers, symboles, preuves et incertitudes. Ne propose pas de +patch, ne modifie rien et ne lance pas d'opération externe. N'ouvre ni n'énumère +jamais `WvW/` ; évite les recherches globales susceptibles de le traverser. +""" diff --git a/.codex/agents/gw2analytics_lead.toml b/.codex/agents/gw2analytics_lead.toml new file mode 100644 index 00000000..9e8fec83 --- /dev/null +++ b/.codex/agents/gw2analytics_lead.toml @@ -0,0 +1,15 @@ +name = "gw2analytics_lead" +description = "Point d'entrée stable : comprend l'intention, vérifie l'autorisation et route le travail GW2Analytics." +model = "gpt-5.6-terra" +model_reasoning_effort = "medium" + +developer_instructions = """ +Tu incarnes le rôle GW2Analytics Lead, pas un modèle fixe. Commence par distinguer +question, idée, analyse, diagnostic, décision validée et demande d'implémentation. +Au Level 1, ne transforme jamais une discussion en écriture sans autorisation +explicite. Lis `AGENTS.md` puis les documents pertinents sous `docs/agentic/`. +Choisis une seule couche de parallélisme : Herdr, subagents Codex ou Ultra ; ne +les imbrique jamais sans justification explicite. Ne commite, pousse, crée de PR +ou ne merge sans autorisation explicite. `WvW/` est privé : ne jamais l'ouvrir, +l'énumérer, l'indexer, le modifier ou l'ajouter à Git. +""" diff --git a/.codex/agents/implementer.toml b/.codex/agents/implementer.toml new file mode 100644 index 00000000..70790f3a --- /dev/null +++ b/.codex/agents/implementer.toml @@ -0,0 +1,14 @@ +name = "implementer" +description = "Exécution locale bornée d'une tâche explicitement autorisée avec validations ciblées." +model = "gpt-5.6-terra" +model_reasoning_effort = "medium" +sandbox_mode = "workspace-write" + +developer_instructions = """ +N'écris que pour une tâche explicitement autorisée, dans les chemins et le +périmètre transmis par le Lead. Préserve l'architecture existante, fais le plus +petit changement défendable et exécute les validations définies. Signale les +ambiguïtés, les résultats non exécutés et les divergences avant de les élargir. +Ne commite, pousse, crée de PR ou ne merge sans autorisation explicite. `WvW/` +est interdit à la lecture, l'énumération, l'indexation, la modification et Git. +""" diff --git a/.codex/agents/reviewer.toml b/.codex/agents/reviewer.toml new file mode 100644 index 00000000..2975310f --- /dev/null +++ b/.codex/agents/reviewer.toml @@ -0,0 +1,13 @@ +name = "reviewer" +description = "Review indépendante read-only des risques fonctionnels, analytiques et de validation." +model = "gpt-5.6-terra" +model_reasoning_effort = "high" +sandbox_mode = "read-only" + +developer_instructions = """ +Reste indépendant de l'auteur et en lecture seule. Cherche d'abord les +régressions, les écarts de contrat, les problèmes de données et les validations +manquantes ; retourne des findings classés avec preuves. Ne corrige aucun fichier. +Pour EVTC, analytics, migrations ou persistance, distingue explicitement code +valide et résultat métier valide. N'ouvre ni n'énumère jamais `WvW/`. +""" diff --git a/.codex/agents/specialist.toml b/.codex/agents/specialist.toml new file mode 100644 index 00000000..c0a2e533 --- /dev/null +++ b/.codex/agents/specialist.toml @@ -0,0 +1,13 @@ +name = "specialist" +description = "Expert consultatif pour EVTC, analytics, persistance, migrations et architecture à haut risque." +model = "gpt-5.6-sol" +model_reasoning_effort = "high" +sandbox_mode = "read-only" + +developer_instructions = """ +Interviens seulement sur une question explicitement délimitée qui dépasse le +raisonnement courant : sémantique EVTC/EI, causalité analytique, migration, +modèle de données ou architecture. Fournis options, hypothèses, risques et +critères de validation ; ne prends pas la place du Lead et ne modifie rien. +N'accède jamais à `WvW/` ni à des données privées non explicitement fournies. +""" diff --git a/.codex/config.toml b/.codex/config.toml new file mode 100644 index 00000000..d19dc069 --- /dev/null +++ b/.codex/config.toml @@ -0,0 +1,11 @@ +# Réglages projet Codex. Ils ne prennent effet que lorsque le dépôt est marqué +# comme fiable par le client Codex ; fournisseurs et authentification restent +# volontairement hors du dépôt. +model = "gpt-5.6-terra" +model_reasoning_effort = "medium" + +[agents] +enabled = true +max_concurrent_threads_per_session = 2 +default_subagent_model = "gpt-5.6-luna" +default_subagent_reasoning_effort = "medium" diff --git a/AGENTS.md b/AGENTS.md index 6048f5d0..d1ec2813 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,7 +8,21 @@ - Supermemory est un outil personnel optionnel ; il ne constitue ni une dépendance, ni une source de vérité, ni une obligation de fin de session. - `WvW/` est un corpus privé local : ne jamais l'ouvrir, l'indexer, le modifier - ou l'ajouter à Git sans autorisation explicite du mainteneur. + ou l'ajouter à Git sans autorisation explicite du mainteneur. Ne jamais non + plus l'énumérer, y compris indirectement via un statut ou une recherche large. + +## GW2Analytics Lead + +- Le rôle d'entrée stable est **GW2Analytics Lead** ; son moteur initial est + Codex / `gpt-5.6-terra` / `medium`, mais le rôle n'est pas lié à ce profil. +- Distinguer intention et autorisation : une question, une idée, une analyse ou + un bug signalé autorisent la lecture et une proposition, jamais une écriture + implicite. Une demande explicite d'implémentation reste soumise au niveau + d'autonomie du domaine. +- Appliquer les politiques versionnées sous `docs/agentic/` pour le routing, + les rôles, les handoffs, les worktrees, l'autonomie et les checkpoints. +- Au Level 1 actuel, « Continue la roadmap » produit une proposition priorisée + et attend l'accord du mainteneur avant toute exécution. diff --git a/docs/agentic/README.md b/docs/agentic/README.md new file mode 100644 index 00000000..9818c2f3 --- /dev/null +++ b/docs/agentic/README.md @@ -0,0 +1,51 @@ +# GW2Analytics Lead + +## Point d'entrée quotidien + +Parlez au rôle **GW2Analytics Lead** depuis la racine du dépôt. Il est stable ; +le profil initial est Codex / `gpt-5.6-terra` / `medium`, mais peut évoluer sans +changer votre point d'entrée. + +Exemples naturels : + +- « J'ai une idée de feature. » +- « J'ai trouvé un bug. » +- « Pourquoi cette statistique fonctionne comme ça ? » +- « Implémente cette story validée. » +- « Continue la roadmap. » + +Vous ne choisissez normalement ni modèle, ni reasoning, ni worker, ni +worktree, ni Reviewer. Le Lead lit l'état canonique, classe l'intention et le +risque, puis propose ou exécute seulement ce qui est autorisé. + +## Discussion n'est pas exécution + +| Formulation | Réponse attendue au Level 1 | +| --- | --- | +| question, idée, analyse, bug signalé | investigation et proposition ; aucune écriture implicite | +| décision validée + demande d'implémentation | exécution bornée, validations et review selon le risque | +| « Continue la roadmap » | prochaine proposition priorisée ; attente de votre accord avant écriture | + +En cas de doute, le Lead continue l'analyse mais s'arrête avant toute mutation. + +## Sources de vérité + +1. code, tests et CI : comportement livré ; +2. SPEC acceptées sous `_bmad-output/specs/` : contrat à construire ; +3. `docs/adr/` : décisions d'architecture ; +4. ce dossier : politique agentique et checkpoints assainis ; +5. Git/GitHub : historique et état d'intégration. + +Supermemory n'est pas une source opérationnelle. `WvW/` est un corpus privé : +il est interdit de l'ouvrir, de l'énumérer, de l'indexer, de le modifier ou de +l'ajouter à Git sans autorisation explicite. + +## Documents opérationnels + +- [Architecture](architecture.md) — composants et frontières. +- [Routing](routing-policy.md) — modèle, reasoning, risque et parallélisme. +- [Communication](communication-protocol.md) — délégation et handoff. +- [Autonomie](autonomy-policy.md) — Level 1 à 3 et rétrogradation. +- [Worktrees et Herdr](worktrees-herdr.md) — flux macro indépendants. +- [Backlog agentique](backlog.md) — initiatives à traiter ultérieurement. +- [État courant](current-state.md) — reprise après interruption. diff --git a/docs/agentic/architecture.md b/docs/agentic/architecture.md new file mode 100644 index 00000000..bb23d7ef --- /dev/null +++ b/docs/agentic/architecture.md @@ -0,0 +1,43 @@ +# Architecture agentique minimale + +## Invariants + +Le **GW2Analytics Lead** est un rôle, non un modèle ni un processus permanent. +Il route le travail, garde le contexte décisionnel court et reçoit les synthèses. +Les profils Codex sont déclaratifs sous `.codex/agents/` : ils ne lancent aucun +agent tant qu'une tâche ne l'exige pas. + +| Capacité | Permission | Profil initial | Responsabilité | +| --- | --- | --- | --- | +| Lead | écriture seulement si autorisée | Terra / medium | intention, risque, autorisation, orchestration | +| Explorer | read-only | Luna / medium | cartographie et preuves ciblées | +| Implementer | workspace-write | Terra / medium | changement local explicitement autorisé | +| Reviewer | read-only | Terra / high | review indépendante et couverture de validation | +| Specialist | read-only | Sol / high | EVTC, analytics, migrations, données, architecture critique | + +Les valeurs sont des profils de départ. Le Lead peut demander un effort supérieur +ou un autre profil lorsque le risque le justifie ; le rôle reste inchangé. + +## Mémoire et reprise + +Les faits durables vivent dans le dépôt. Chaque fin de phase ou interruption +significative met à jour `current-state.md` avec l'objectif, le dernier état +validé, les validations, les risques, le prochain mouvement et le profil de +reprise recommandé. Les agents transmettent des références de fichiers et de +commits, pas des copies de logs ni du corpus privé. + +Le rapport d'audit local historique a seulement fourni cette synthèse assainie : +une configuration Codex minimale, un Lead explicite, quatre capacités réutilisables, +un routing par risque, un fallback non déclaré et une gouvernance Git/GitHub à +traiter séparément. Le rapport brut reste non suivi. + +## Fallback + +Aucun fallback n'est configuré en Phase 5. En cas de limite ou d'indisponibilité, +le Lead sauvegarde le checkpoint, réessaie ou ajuste le profil OpenAI si cela est +autorisé. Un fallback OSS ou multi-provider exige ultérieurement une installation +épinglée, une configuration à privilèges minimaux et des évaluations par rôle. + +Sans équivalent vérifié du Specialist, l'humain valide obligatoirement toute +architecture, migration, sémantique EVTC, modèle de données, analytique critique +ou opération irréversible. diff --git a/docs/agentic/autonomy-policy.md b/docs/agentic/autonomy-policy.md new file mode 100644 index 00000000..69a23dfa --- /dev/null +++ b/docs/agentic/autonomy-policy.md @@ -0,0 +1,32 @@ +# Politique d'autonomie + +## Niveau actuel + +Tous les domaines sont au **Level 1** : analyse → proposition → approbation +humaine → exécution. Cela inclut UI, tests, documentation, backend, analytics, +EVTC, migrations et architecture. + +| Niveau | Autorisation | +| --- | --- | +| 1 | aucune exécution après analyse sans accord explicite | +| 2 | exécution bornée dans les domaines promus ; approbation pour décisions importantes | +| 3 | poursuite de roadmap dans les limites de domaine ; interruption pour produit, risque ou irréversibilité | + +## Promotion + +Le Lead peut recommander une promotion, jamais l'appliquer. La recommandation +cite un échantillon de stories réussies, CI, reviews, corrections, conflits, +interventions humaines, qualité de priorisation et stabilité du profil +modèle/reasoning/harness. Une promotion est spécifique au domaine **et** au +profil évalué. + +## Rétrogradation + +Le système peut rétrograder automatiquement un domaine après régression, +échecs répétés, mauvais routing, conflits, review insuffisante ou baisse de +confiance. Il enregistre la preuve dans le checkpoint, explique la mesure au +mainteneur et revient au Level 1. Toute nouvelle promotion exige un accord +humain explicite. + +Un changement important de modèle, reasoning ou harness réduit temporairement +l'autonomie jusqu'à ce que de nouvelles preuves existent. diff --git a/docs/agentic/backlog.md b/docs/agentic/backlog.md new file mode 100644 index 00000000..d5de3779 --- /dev/null +++ b/docs/agentic/backlog.md @@ -0,0 +1,29 @@ +# Backlog agentique + +## Dettes de revue — Phase 5 + +**Statut : à traiter avant toute promotion au-delà du Level 1 et à réévaluer en +Phase 6.** Elles ne bloquent pas l'intégration de l'infrastructure minimale, +mais restent des prérequis à une autonomie élargie. + +1. Renforcer les tests sémantiques des garde-fous : indépendance du Reviewer, + confidentialité `WvW/`, fallback indisponible, handoff et reprise. +2. Définir des critères objectivables pour l'utilisation d'Ultra avant toute + utilisation réelle. +3. Compléter le protocole worktree avec une procédure explicite de conflit et + d'abandon. + +## Initiative prioritaire — Git/GitHub Governance & Delivery Architecture + +**Statut : proposée, non démarrée.** À traiter seulement après validation du +système agentique initial et avant toute modification structurelle GitHub. + +La future proposition devra couvrir : stratégie de branches, PR obligatoires, +protections de `main`, checks requis, DCO, Conventional Commits, séparation CI/CD, +Release Please ou alternative, versioning, tags, releases, Dependabot, sécurité, +builds Docker, politique de merge, nettoyage des branches, et droits des agents +pour commit, push, PR, merge et release aux Levels 1/2/3. + +Elle doit inventorier l'état réel, proposer les changements avant de les faire, +et aligner code, CI, documentation et règles GitHub sans les modifier pendant +la Phase 5. diff --git a/docs/agentic/communication-protocol.md b/docs/agentic/communication-protocol.md new file mode 100644 index 00000000..309f73fb --- /dev/null +++ b/docs/agentic/communication-protocol.md @@ -0,0 +1,35 @@ +# Protocole de communication et handoff + +## Enveloppe de délégation + +Chaque délégation est courte et structurée : + +```yaml +task_id: story-ou-bug/sous-tache +parent_id: optionnel +intent: question|diagnose|plan|implement|review +risk: low|medium|high|critical +objective: résultat observable +acceptance: critères de succès +context_refs: chemins, commit, SPEC ou ADR +allowed_paths: frontières d'écriture +forbidden: WvW, secrets, opérations interdites +validation: commandes et preuves attendues +output: résumé, fichiers, validations, risques et blocages +``` + +Le parent transmet uniquement le contexte nécessaire. Le worker retourne des +références et une synthèse, jamais un dump de dépôt, de logs ou de données privées. + +## États et escalade + +`queued → assigned → running → blocked → review → changes_requested → validated → integrated` + +Un état affiché par Herdr est une projection de terminal, jamais une preuve +d'intégration. `done`, `idle` ou `unknown` exigent toujours diff, validations et +review avant changement d'état canonique. + +Avant un handoff, enregistrer dans `current-state.md` : objectif, décisions, +fichiers, commit de base, validations PASS/FAIL/NOT RUN, risques, blocages, +profil recommandé et prochaine action. Une consultation Specialist retourne au +Lead ; elle ne transfère pas automatiquement la propriété de la tâche. diff --git a/docs/agentic/current-state.md b/docs/agentic/current-state.md new file mode 100644 index 00000000..3a29366a --- /dev/null +++ b/docs/agentic/current-state.md @@ -0,0 +1,45 @@ +# État courant agentique + +## Phase 5 — Infrastructure minimale + +- **Statut :** revue PASS conditionnel acceptée ; intégration Phase 5 en cours. + Phase 6 interdite sans accord. +- **Base :** `7a347f5dfe2c64cbcd0998e550477b64908448c9` sur `main`. +- **Objectif :** rôle Lead stable, profils Codex, politiques de routing, + communication, autonomie, worktrees/Herdr et reprise persistante. +- **Profil Lead initial :** Codex / `gpt-5.6-terra` / `medium`. +- **Autonomie :** Level 1 pour tous les domaines. +- **Fallback :** non configuré et non déclaré opérationnel. +- **Confidentialité :** `WvW/` interdit à toute lecture, énumération, + indexation, modification ou ajout Git sans autorisation explicite. + +## Dettes acceptées de la revue Phase 5 + +À traiter avant toute promotion au-delà du Level 1 et à réévaluer pendant la +Phase 6 : tests sémantiques des garde-fous (Reviewer, `WvW/`, fallback, +handoff et reprise), critères objectivables pour Ultra, et procédure worktree +de conflit ou d'abandon. + +## Validations + +- PASS — `uv run pytest tests/scripts/test_agentic_infrastructure.py + tests/scripts/test_bmad_framework.py` : 10 tests. +- PASS — Ruff ciblé sur les deux tests d'infrastructure. +- PASS — `codex --strict-config exec --help` : configuration sans clé inconnue. +- PASS — interfaces Codex/Herdr : CLI Codex 0.148.0 ; Herdr 0.8.0 expose les + commandes d'intégration et de worktrees documentées. +- PASS — résolveurs `resolve_config.py` et `resolve_customization.py` BMAD. +- PASS — `git diff --check`. +- NOT RUN — conversation Codex réelle, spawn et routing de bout en bout : la + couche `.codex/config.toml` est chargée seulement lorsqu'un client marque le + dépôt fiable ; aucun appel modèle payant ni modification de configuration + utilisateur hors dépôt n'a été effectué. +- BLOCKED — statut live Herdr et flux macro : le socket serveur est inaccessible + depuis ce sandbox ; aucun worktree ou pane n'a été créé. + +## Reprise + +Avant la validation fonctionnelle de Phase 6, ouvrir le dépôt dans un client +Codex fiable, vérifier qu'il charge `.codex/config.toml`, puis tester un seul +cas read-only du Lead. Ne pas activer Herdr, créer de worktree, modifier les +niveaux d'autonomie ou configurer un fallback sans accord explicite. diff --git a/docs/agentic/routing-policy.md b/docs/agentic/routing-policy.md new file mode 100644 index 00000000..c34e62f0 --- /dev/null +++ b/docs/agentic/routing-policy.md @@ -0,0 +1,48 @@ +# Politique de routing + +## Intention et autorisation + +| Intention | Action initiale | Écriture | +| --- | --- | --- | +| question / explication | lire, citer les sources et répondre | non | +| idée / brainstorming | challenger, options, bénéfices et risques | non | +| analyse produit ou technique | investiguer et recommander | non | +| bug « semble cassé » | diagnostiquer, reproduire si possible, rapporter | non, sans demande de fix | +| implémente / fixe / modifie | exécuter dans le périmètre explicite | selon autonomie et risque | +| continue la roadmap | proposer la prochaine action | Level 1 : non | + +Un doute d'autorisation bloque l'écriture, jamais l'analyse. + +## Modèle × reasoning + +| Tâche | Départ | Escalade | +| --- | --- | --- | +| documentation, test mécanique, renommage borné | Luna / low ou medium | Luna / high, puis Terra / medium | +| exploration ciblée | Luna / medium | Terra / medium si contexte croisé | +| UI simple | Luna / medium | Terra / medium si UX ou état complexe | +| feature ou backend courant | Terra / medium | Terra / high, puis xhigh | +| debug multi-fichiers ou review | Terra / high | Terra / xhigh, puis Sol / high | +| EVTC, analytics, persistance, migration, données | Sol / high ou consultation Specialist | Sol / xhigh ; max seulement avec critère mesurable | +| architecture ou causalité exceptionnelle | Sol / xhigh | Sol / max après comparaison utile | + +Augmenter l'effort lorsque le modèle comprend encore la sémantique ; changer de +modèle lorsque la profondeur de contexte ou le jugement ne suffisent plus. Ne pas +faire monter Luna artificiellement jusqu'à max si Terra medium est plus fiable. + +La configuration projet utilise les efforts portables `low`, `medium`, `high` +et `xhigh`. `max` et Ultra ne sont pas des valeurs par défaut de fichier : ils +requièrent une vérification du client disponible et une justification écrite. + +## Parallélisme + +Une seule couche possède le fan-out : + +1. tâche simple : Lead seul ; +2. exploration ou review réellement indépendantes : subagents Codex read-only ; +3. deux flux d'écriture réellement indépendants : Herdr et worktrees ; +4. Ultra exceptionnel : ni Herdr ni subagents Codex supplémentaires. + +Herdr, subagents Codex et Ultra ne sont jamais imbriqués sans justification +explicite, propriétaire unique, limite de concurrence et plan de récupération. +La limite Phase 5 est de deux subagents simultanés ; aucune écriture parallèle +sans worktree et frontières de fichiers/contrats indépendantes. diff --git a/docs/agentic/worktrees-herdr.md b/docs/agentic/worktrees-herdr.md new file mode 100644 index 00000000..9fa625f6 --- /dev/null +++ b/docs/agentic/worktrees-herdr.md @@ -0,0 +1,23 @@ +# Worktrees et Herdr + +Herdr 0.8.0 est disponible, mais n'est pas sur le chemin critique des tâches +simples. Le Lead l'emploie seulement lorsqu'au moins deux flux d'écriture sont +réellement indépendants, avec fichiers, contrats et critères d'acceptation non +recouvrants. + +## Protocole macro + +1. Le Lead fixe le commit de base, les frontières, validations et propriétaire + d'intégration. +2. Créer une branche `agent/-` et un worktree externe par flux. + Aucun worktree n'est créé pour une exploration read-only. +3. Lancer au plus deux workers d'écriture, sans subagents Codex ni Ultra dans + ces workers. +4. Chaque worker rend son diff, ses validations et son handoff ; Herdr ne décide + ni qu'un travail est intégré, ni qu'un worktree peut être supprimé. +5. Le Lead intègre, demande une review indépendante, vérifie les validations, + puis seulement nettoie branche et worktree après preuve d'intégration. + +Ne jamais partager une branche entre worktrees. Ne jamais laisser un worker +modifier le même fichier ou contrat qu'un autre. `WvW/` ne doit être copié, +listé ou rendu accessible à aucun worktree agentique. diff --git a/tests/scripts/test_agentic_infrastructure.py b/tests/scripts/test_agentic_infrastructure.py new file mode 100644 index 00000000..a2a70acd --- /dev/null +++ b/tests/scripts/test_agentic_infrastructure.py @@ -0,0 +1,76 @@ +import tomllib +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] +CODEX_DIR = ROOT / ".codex" +AGENTS_DIR = CODEX_DIR / "agents" +AGENTIC_DOCS = ROOT / "docs" / "agentic" + +EXPECTED_AGENTS = { + "gw2analytics_lead": ("gpt-5.6-terra", "medium"), + "explorer": ("gpt-5.6-luna", "medium"), + "implementer": ("gpt-5.6-terra", "medium"), + "reviewer": ("gpt-5.6-terra", "high"), + "specialist": ("gpt-5.6-sol", "high"), +} + + +def load_toml(path: Path) -> dict: + return tomllib.loads(path.read_text()) + + +def test_project_codex_defaults_are_cost_conscious_and_bounded() -> None: + config = load_toml(CODEX_DIR / "config.toml") + + assert config["model"] == "gpt-5.6-terra" + assert config["model_reasoning_effort"] == "medium" + assert config["agents"] == { + "enabled": True, + "max_concurrent_threads_per_session": 2, + "default_subagent_model": "gpt-5.6-luna", + "default_subagent_reasoning_effort": "medium", + } + + +def test_custom_agent_profiles_are_complete_and_constrained() -> None: + profiles = { + path.stem: load_toml(path) + for path in AGENTS_DIR.glob("*.toml") + } + + assert set(profiles) == set(EXPECTED_AGENTS) + for name, (model, effort) in EXPECTED_AGENTS.items(): + profile = profiles[name] + assert profile["name"] == name + assert profile["description"] + assert profile["developer_instructions"] + assert profile["model"] == model + assert profile["model_reasoning_effort"] == effort + + assert profiles["explorer"]["sandbox_mode"] == "read-only" + assert profiles["reviewer"]["sandbox_mode"] == "read-only" + assert profiles["specialist"]["sandbox_mode"] == "read-only" + assert profiles["implementer"]["sandbox_mode"] == "workspace-write" + + +def test_agentic_docs_define_level_one_recovery_and_governance() -> None: + required = { + "README.md", + "architecture.md", + "routing-policy.md", + "communication-protocol.md", + "autonomy-policy.md", + "worktrees-herdr.md", + "backlog.md", + "current-state.md", + } + assert required <= {path.name for path in AGENTIC_DOCS.iterdir()} + + assert "Level 1" in (AGENTIC_DOCS / "autonomy-policy.md").read_text() + assert "Git/GitHub Governance & Delivery Architecture" in ( + AGENTIC_DOCS / "backlog.md" + ).read_text() + assert "Herdr, subagents Codex et Ultra ne sont jamais imbriqués" in ( + AGENTIC_DOCS / "routing-policy.md" + ).read_text() + assert "énumérer" in (ROOT / "AGENTS.md").read_text() From 6ccca39a83b0c13b6b823118e1c36d89555e5608 Mon Sep 17 00:00:00 2001 From: Roland Salardon Date: Thu, 20 Aug 2026 17:23:07 +0200 Subject: [PATCH 2/2] style(agentic): format infrastructure test Signed-off-by: Roland Salardon --- tests/scripts/test_agentic_infrastructure.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/tests/scripts/test_agentic_infrastructure.py b/tests/scripts/test_agentic_infrastructure.py index a2a70acd..a188a37d 100644 --- a/tests/scripts/test_agentic_infrastructure.py +++ b/tests/scripts/test_agentic_infrastructure.py @@ -33,10 +33,7 @@ def test_project_codex_defaults_are_cost_conscious_and_bounded() -> None: def test_custom_agent_profiles_are_complete_and_constrained() -> None: - profiles = { - path.stem: load_toml(path) - for path in AGENTS_DIR.glob("*.toml") - } + profiles = {path.stem: load_toml(path) for path in AGENTS_DIR.glob("*.toml")} assert set(profiles) == set(EXPECTED_AGENTS) for name, (model, effort) in EXPECTED_AGENTS.items(): @@ -67,10 +64,11 @@ def test_agentic_docs_define_level_one_recovery_and_governance() -> None: assert required <= {path.name for path in AGENTIC_DOCS.iterdir()} assert "Level 1" in (AGENTIC_DOCS / "autonomy-policy.md").read_text() - assert "Git/GitHub Governance & Delivery Architecture" in ( - AGENTIC_DOCS / "backlog.md" - ).read_text() - assert "Herdr, subagents Codex et Ultra ne sont jamais imbriqués" in ( - AGENTIC_DOCS / "routing-policy.md" - ).read_text() + assert ( + "Git/GitHub Governance & Delivery Architecture" in (AGENTIC_DOCS / "backlog.md").read_text() + ) + assert ( + "Herdr, subagents Codex et Ultra ne sont jamais imbriqués" + in (AGENTIC_DOCS / "routing-policy.md").read_text() + ) assert "énumérer" in (ROOT / "AGENTS.md").read_text()