Modèle d'Architecture, de Sécurité & de Revue Multi-Agents
EPURE a été conçu dès l'origine autour de trois principes d'ingénierie : Défense en Profondeur, Moindre Privilège et État Déterministe Hors-Branches. Chaque frontière d'automatisation est garantie à la fois par les GitHub Repository Rulesets et par l'isolation d'exécution locale.
Schéma Interactif du Pipeline Événementiel & Custom Actions : Consultez le diagramme
epure-ci-actions-flowdans la Référence des Commandes pour visualiser l'enchaînement complet des événements GitHub (issue_comment,check_suite,workflow_run,pull_request,workflow_dispatch), du contrôle sans secretauthorize-command, du job isoléorchestrate-command(environment: <llm-env>) et de la promotionrelease.
1. Architecture de Sécurité & Frontières de Confiance
Chargement de l'épure interactive Archify…
Invariants Architecturaux Clés
- Séparation à Deux GitHub Apps & Secrets Cloisonnés par Environnement (
<owner>-epure-agentvs<owner>-epure-release, Q82 & Q91) :- L'Agent App émet des jetons d'installation RS256 éphémères dédiés à l'orchestration quotidienne (
plan/*,task/*,feature/*). Ses identifiants (EPURE_AGENT_APP_ID,EPURE_AGENT_APP_PRIVATE_KEY) etLLM_API_KEYsont isolés dans l'environnement GitHub d'agent (<llm-env>) et ne sont jamais exposés àauthorize-commandni aux workflows publics de Pull Request. Elle n'est Bypass Actor que sur le rulesetepure-feature-governance(refs/heads/feature/*), ce qui lui permet de fusionner en autonomie les tâches atomiques validées tout en lui interdisant matériellement de fusionner du code applicatif dansdevou de pousser surmain. - La Release App est invoquée exclusivement par
release-promote.yml/release.ymlsur déclenchement humain (workflow_dispatch) au sein de l'environnement GitHub protégérelease(EPURE_RELEASE_APP_ID,EPURE_RELEASE_APP_PRIVATE_KEY). C'est le seul Bypass Actor autorisé surepure-release-immutability(refs/heads/mainetrefs/tags/v*).
- L'Agent App émet des jetons d'installation RS256 éphémères dédiés à l'orchestration quotidienne (
- Exécution en Sandbox Sans Secret (Q74) :
- Lorsqu'EPURE exécute
npm test,npm run buildoupytestsur une branchetask/*, l'environnement des sous-processus est intégralement purgé deLLM_API_KEY,EPURE_AGENT_APP_PRIVATE_KEYetEPURE_RELEASE_APP_PRIVATE_KEY. - Un test ou une dépendance compromise ne peut exfiltrer aucun secret. Si l'isolation de la sandbox ne peut être garantie, EPURE s'arrête immédiatement en mode fail-closed.
- Lorsqu'EPURE exécute
- État Atomique Hors-Branches (
refs/epure/state/<issue>, Q76) :- Les transitions d'état (
last_processed_comment_id,spec_shasigné, compteurs de tentatives, table des tickets et sous-phases de continuation CI) sont stockées sous forme d'objets Git dansrefs/epure/state/<issue-number>mis à jour par Compare-And-Swap (git update-ref). - Les branches
devetmainrestent 100 % exemptes de commits techniques d'état machine.
- Les transitions d'état (
2. Pipeline de Revue Multi-Agents, Porte Impeccable & Squash Sémantique IA
Chargement de l'épure interactive Archify…
Fonctionnement du Pipeline de Revue (Q92–Q96)
- Chargement du Roster depuis
dev& Défense Prompt-Injection (OWASP LLM01) :- Les définitions des reviewers (
<reviewers_dir>/*.md, par défaut.agents/reviewers/*.md) sont toujours lues depuis la branche de confiancedev(avec repli sur les templates canoniques embarqués d'EPURE), jamais depuis la branche non fiabletask/*inspectée. - Tous les diffs de PR, messages de commit et commentaires sont encapsulés dans des balises XML
<untrusted_pr_diff>ordonnant explicitement au modèle d'ignorer toute instruction cachée dans le diff.
- Les définitions des reviewers (
- Sélection Dynamique (Jusqu'à 4 Spécialistes +
spec-parity-reviewer) :- Selon les fichiers modifiés par la PR, EPURE sélectionne jusqu'à 4 reviewers pertinents (
domain-backend-reviewer,frontend-reviewer,infra-reviewer,architecture-reviewer,security-reviewer,standards-reviewer,accessibility-reviewer,design-reviewer,user-advocate) en plus du reviewer obligatoirespec-parity-reviewer.
- Selon les fichiers modifiés par la PR, EPURE sélectionne jusqu'à 4 reviewers pertinents (
- Outils d'Inspection du Code en Lecture Seule :
- Les reviewers ne sont pas limités au seul diff unifié : ils disposent de 4 outils en lecture seule (
list_files,read_file,read_line_range,search_code) pour vérifier les appelants, les types et les invariants du domaine dans tout le dépôt.
- Les reviewers ne sont pas limités au seul diff unifié : ils disposent de 4 outils en lecture seule (
- Auto-Remédiation Ciblée (
max_code_fix_attempts = 3) :- Si un reviewer émet un constat bloquant (
must_fix), EPURE applique un correctif ciblé dans la sandbox sans secret puis ne relance que les reviewers ayant échoué au tour précédent +spec-parity-reviewer. - Sur la PR finale de synthèse
feature/* -> dev, tout correctif passe par une sous-PRtask/review-fix-*afin de respecter les rulesets.
- Si un reviewer émet un constat bloquant (
- Synthèse de Squash Sémantique par IA (Q94) :
- Juste avant le squash-merge d'une PR validée, un appel à température nulle synthétise un titre Conventional Commit (
type(scope): summary (#PR)) et un corps structuré (Refs #<ticket>surfeature/*,Closes #<issue>/Closes #<ticket>surdev).
- Juste avant le squash-merge d'une PR validée, un appel à température nulle synthétise un titre Conventional Commit (
- Moteurs de Qualité & d'Audit Amont Intégrés :
- Matt Pocock Agent Skills (
mattpocock/skills) — Skills de cadrage et d'exécution (grill-with-docs,to-spec,to-tickets,tdd,code-review) épinglés dansskills-lock.json. - Impeccable (
pbakaus/impeccable) — Système de design (DESIGN.md) et porte de qualité UI / WCAG 2.1 AA (actions/impeccable). - iFixAi (
ifixai-ai/iFixAi) — Audit déterministe des trajectoires d'autorisation (actions/ifixai). - Archify (
tt-a1i/archify) — Schémas d'architecture interactifs validés en qualité showcase (scripts/archify/). - zizmor (
woodruffw/zizmor) — Analyse statique de sécurité des workflows GitHub Actions (actions/zizmor-audit). - Renovate (
renovatebot/renovate) — Mise à jour automatisée des workflows épinglés par SHA et des dépendances (auto_migrate).
- Matt Pocock Agent Skills (
3. Routeur LLMClient Multi-Fournisseurs, Sorties Structurées & Orchestrateur Modulaire (ADR-0029)
- Routeur HTTP Multi-Fournisseurs (
src/llm/) :- Client TypeScript
LLMClientsans dépendance externe routant les identifiants<fournisseur>/<modèle>vers Google Gemini (google/,gemini/), OpenAI (openai/), Azure OpenAI (azure/), Azure AI Foundry (azure_ai/) et Anthropic (anthropic/), avec résolution différéeos.environ/VAR_NAMEdepuis.github/agents.yml. - Respect strict de l'ADR-0012 : les erreurs HTTP
401/403(AuthenticationError) et402(QuotaExhaustedError) interrompent immédiatement l'exécution sans bascule silencieuse, tandis que les erreurs transitoires (408,429,5xx) appliquent un backoff exponentiel borné.
- Client TypeScript
- Sorties Structurées par Schéma (
ResponseSchemaSpec<T>) & Boucle d'Outils Gemini en 2 Phases :- Les appels LLM structurés du système (
GrillRoundEvaluation,GeneratedPlanningBundle,GeneratedTicketImplementation, constats des reviewers,user-advocateet synthèse de squash) transmettent un JSON Schema natif (responseSchema,response_format.json_schemaavec fermeture récursiveadditionalProperties: false, ououtput_config.format) couplé aux validateurs TypeScript desrc/orchestrator/prompts/schemas.ts. - Sur Google Gemini, lorsqu'un appel combine les outils d'exploration (
list_repo_files,search_in_repo_file,read_repo_file) et un schéma JSON, la Phase 1 exécute les tours d'outils avecfunctionDeclarations(en préservant lesthoughtSignatureGemini 3), puis la Phase 2 verrouillefunctionCallingConfig.mode = "NONE"avecresponseMimeType: "application/json"etresponseSchema.
- Les appels LLM structurés du système (
- Architecture Modulaire
src/orchestrator/& Garde-fous Branchés :src/orchestrator/issue-orchestrator.tsorchestre les sous-modules spécialisésgithub/rest-client.ts,workspace/repo-tools.ts,prompts/schemas.ts,formatting/comments.tsainsi que les 3 phasesphases/grill-and-plan.ts,phases/ticket-execution.tsetphases/feature-integration.ts.- Branche directement la détection de cycles du DAG (
validatePlanningArtifactsAndGraph), le déblocage sur dépendance prouvée (reconcileProvenTicketDependencies, escaladant enneeds-humansi un ticket bloquant est fermé ennot_planned), la détection d'annulation/epure cancelinter-tickets (processPendingIssueCommentsBatch) et la garde anti-boucle de revue par SHA (evaluateReviewFeedbackTrigger).
4. Pipeline de Vérification en 3 Étapes, Sandbox Noyau Ubuntu 26.04 & Continuation CI Événementielle (ADR-0028, ADR-0030, ADR-0031)
- Stage 1 — Sandbox Noyau Linux en 2 Phases, Condensation
rtkSans État & Isolation Goldfish par Ticket :- S'exécute sur
ubuntu-26.04(noyau Linux 7.0) dans un clone Git local persistant avant toute publication surtask/*:- Phase A (
install,networkPolicy: "https_only") : exécute l'installation des dépendances souslandrun(Landlock ABI v8) en restreignant le trafic TCP sortant au seul port443et les écritures àworkDir,/tmpet aux caches de paquets. - Phase B (
codegen,typecheck,lint,test,build,networkPolicy: "offline") : exécute les vérifications totalement hors-ligne sousbubblewrap(bwrap --unshare-net --unshare-pid --unshare-ipc --tmpfs /tmp --die-with-parent, avec repli automatique surlandrunhors-ligne).
- Phase A (
- Condensation sans état
rtk(formatAndCondenseStage1CommandOutput) : filtre les séquences ANSI, barres de progression et journaux verbeux en mode 100 % sans état (RTK_TELEMETRY_DISABLED=1,RTK_RECALL=0,RTK_TEE=0, aucune base SQLite) tout en conservant les 4 000 derniers caractères bruts de la pile d'erreur dès queexit_code !== 0. - Synchronisation Git 3-way (
/epure sync) & Isolation Goldfish : maintientdev -> feature/* -> task/*synchronisés avec résolution 3-way assistée par LLM et validée par le Stage 1, et exécute chaque ticket dans une session Goldfish isolée sans mémoire des tickets précédents (runGoldfishSpecAuditlors de/epure to-spec).
- S'exécute sur
- Stage 2 — Continuation Événementielle de la CI Externe (
waiting_ticket_ci/waiting_feature_ci) :- Dès que le Stage 1 réussit et que la Pull Request
task/* -> feature/*oufeature/* -> devest ouverte avec son checkai-review, EPURE persistesubphase: "waiting_ticket_ci"(ou"waiting_feature_ci"),active_pr_numberetactive_head_shadansrefs/epure/state/<issue>, puis termine immédiatement le job avec le code0(async_ci_continuation: true). - Aucun runner GitHub Actions ne reste bloqué en attente passive. Lorsque GitHub émet
check_suite.completedouworkflow_run.completed(ou qu'un mainteneur poste/epure continue), EPURE reprend exactement à l'état persisté.
- Dès que le Stage 1 réussit et que la Pull Request
- Stage 3 — Roster de Revue Multi-Agents depuis
dev& Squash Sémantique IA :- Corrèle le résultat des workflows CI externes avec le panel de reviewers spécialisés chargé depuis
dev. En cas d'échec CI ou de constatmust_fix, EPURE extrait les journaux d'erreur assainis (~12 Ko) et exécute jusqu'àmax_code_fix_attempts = 3rondes de remédiation unifiées avant de fusionnertask/* -> feature/*par squash sémantique IA.
- Corrèle le résultat des workflows CI externes avec le panel de reviewers spécialisés chargé depuis
5. Outils de Mutation Incrémentale, Garde d'Intégrité Inter-Tickets & Convergence Multi-Phases (ADR-0032, ADR-0033)
- Mutation Incrémentale Transactionnelle (
StagedTicketImplementationBuffer) :- Pendant l'implémentation et la remédiation d'un ticket, le modèle modifie les fichiers de manière incrémentale via
write_repo_file,patch_repo_fileetdelete_repo_filedans un tampon transactionnel en mémoire (StagedTicketImplementationBuffer), isolé defeature/*tant quevalidateWorkspaceFileOperations,validateTicketIntegrityGuardet le Sandbox Stage 1 n'ont pas validé l'ensemble. - Repli Segmenté Fichier par Fichier (
ChunkedTicketImplementationFallback) : si un ticket multi-fichiers rencontre une troncatureMAX_TOKENS, EPURE décompose automatiquement les entréesfilesToTouchrestantes en sous-appels fichier par fichier (en conservant les mutations déjà validées dans le tampon et en annulant tout le tampon sans commit partiel si un sous-appel échoue). - Catalogue Compact de Contexte (
CompactWorkspaceFilesContext) : injecte le contenu complet (sans aucune troncature au milieu d'un fichier) uniquement pour les fichiers modifiés par le ticket ou listés dansfilesToTouch, et expose le reste du dépôt sous forme d'un indexchemin (N lignes)consultable à la demande viaread_repo_fileetsearch_in_repo_file.
- Pendant l'implémentation et la remédiation d'un ticket, le modèle modifie les fichiers de manière incrémentale via
- Graphe Relationnel GitHub Natif, Garde d'Intégrité Inter-Tickets & Réconciliation Sémantique des ADRs :
/epure to-ticketscâble nativement les lienssub_issuesetdependencies/blocked_bydans GitHub en complément de la Tasklist Markdown de l'issue de pilotage.validateTicketIntegrityGuardinterdit à tout ticket de supprimer ou vider des fichiers de test existants, de tronquer plus de 30 % des lignes/symboles d'un fichier hors périmètre, ou de dégrader les scriptsbuild/test/lint/typecheckdes manifestes en commandes factices.renumberCollidingAdrsetreconcileAdrsWithLlmdédupliquent les ADRs par slug entre branches concurrentes, renumérotent de façon monotone les fichiersdocs/adr/NNNN-*.mden collision et alignent les références croisées dans les spécifications etGLOSSARY.md.
- Audit de Convergence Zéro-Contexte (
EpicConvergenceAudit) & Remédiation Multi-Phases (max_epic_phases) :- Avant d'ouvrir la PR finale
feature/* -> dev, une session isolée zéro-contexte (runEpicConvergenceAudit) vérifie la branche de fonctionnalité face à l'EpicGoalContractde la spécification (required_entrypoints, absence deforbidden_stubsetend_to_end_verification_criteria). - Si des points d'entrée non câblés ou des simulacres sont détectés (
verdict: "INCOMPLETE") et queepic_phase < max_epic_phases(2par défaut), EPURE génère, chaîne et exécute automatiquement des tickets de convergence de Phase 2 ([Phase 2 - Ticket N]) avant d'ouvrir la PR finale ; au-delà du plafond, il escalade enepic_convergence_exhausted(needs-human).
- Avant d'ouvrir la PR finale

