[Decision D10] Fixer les contrats du scanner déterministe et du LLM #11
Labels
No labels
Agent/Autonomous OK
Agent/Demeter
Agent/Hermes
Agent/Human
Agent/Needs Review
Area/API
Area/Auth
Area/CLI
Area/Data
Area/Docs
Area/Infra
Area/UI
CI/Failing
CI/Flaky
CI/Green
CI/Needs Runner
CI/Needs Workflow
Compat/Backward Compatible
Compat/Breaking
Compat/Migration
Deploy/Ansible
Deploy/Blocked
Deploy/Homelab
Deploy/Needs Config
Deploy/Needs Secret
Deploy/Ready
Deploy/Rollback
Kind/Bug
Kind/Chore
Kind/Design
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Refactor
Kind/Security
Kind/Spike
Kind/Testing
Ops/Backup
Ops/Incident
Ops/Maintenance
Ops/Monitoring
Ops/Upgrade
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Priority
Someday
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Risk
Critical
Risk
High
Risk
Low
Risk
Medium
Security/Auth
Security/Disclosure
Security/Hardening
Security/Secret
Size
L
Size
M
Size
S
Size
XL
Size
XS
Stack/Ansible
Stack/Docker
Stack/Forgejo
Stack/Hermes
Stack/Node
Stack/Postgres
Stack/Python
Stack/Systemd
Status
Abandoned
Status
Blocked
Status
In Progress
Status
In Review
Status
Need More Info
Status
Ready
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
2027a/auroscope#11
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
MODE: DECISION
Statut
Proposé. Ticket ouvert jusqu’au go explicite après ta décision.
Question
Comment séparer strictement faits déterministes, analyse LLM et décision humaine ?
Scanner proposé
Findings immuables et versionnés :
rule_id, version, sévérité, chemin, ligne/byte range, preuve et digest. L’agrégat de signal est séparé. Catalogue v1 : intégrité de collecte, download→shell, obfuscation, runtime network, checksums/signatures, privilèges/persistance, accès secrets, sémantiqueprovides/conflicts/replaces, caractères de contrôle.Limites de contexte proposées
256 KiB/fichier, 2 MiB texte total, 512 KiB diff, 200 fichiers — valeurs à benchmarker. Toute troncature/omission pertinente donne
partialet pause humaine, jamaisclearsilencieux.LLM proposé
Adaptateur HTTP d’inférence seulement, sans outils/shell/fs/browser/plugins. Données JSON explicitement hostiles, chemins hôte/secrets retirés. Réponse strictement bornée : niveau consultatif, résumé, explications, points d’attention, incertitudes. Aucun champ approve/allow/deny. Validation locale des chemins/lignes/enums/champs.
Échec
Timeout, transport, refus ou schéma invalide → statut LLM failed, signal unknown, pause humaine. L’humain peut approuver en connaissance de cause; le modèle ne supprime/modifie jamais un finding déterministe.
Options
Vie privée
Secrets par nom de variable seulement; prompts/réponses
0600, rétention configurable ou désactivée; hashes/métadonnées bornées.Réponse attendue
Accepte/amende les contrats, limites ou comportement d’échec. ADR/clôture seulement après ton go.
Documentation
Protocole automatique de décision
GO DECISIONn’autorise ni code de production ni plan d’implémentation; ce travail doit avoir son propre ticketMODE: EXECUTION.Ok pour l'essentiel, mais pour connecter à un llm, on essaie en priorité d'utiliser codex (cli) sur la machine avec le modèle 5.6-luna, si codex est installé mais pas connecté, on affiche une erreur (se connecter ou fallback API key), et si une clef d'Api, un point d'accès (openai, openrouter, URL OpenAI compatible pour ollama... pour commencer) et un modèle sont configurés, on les utilise en priorité
Ticket classé comme décision humaine. La discussion continue ici, mais aucune implémentation ni ADR accepté ne sera produit tant que Mathieu n’aura pas publié exactement
GO DECISIONdans un commentaire distinct.D’accord pour amender le contrat LLM dans ce sens. Il faut toutefois rendre la priorité non ambiguë et conserver l’isolation du scanner.
Je recommande l’ordre suivant :
provider/endpoint, clé API, modèle) : elle gagne, car c’est un choix volontaire de l’opérateur. Adaptateurs v1 : OpenAI, OpenRouter et endpoint OpenAI-compatible personnalisé (dont Ollama).5.6-luna.disabled/failed, signalunknown, puis pause humaine conformément au contrat initial.Le point important est que Codex devient un adaptateur d’inférence borné, pas un agent général : entrée JSON hostile sur stdin, sortie conforme au schéma strict, répertoire de travail stérile, environnement réduit aux credentials indispensables, aucun accès au dépôt, aux secrets ou aux chemins hôte. Si le mode Codex disponible ne permet pas de garantir l’absence d’outils/shell/fs/browser/plugins, l’adaptateur doit échouer fermé plutôt que relâcher cette séparation. Les findings déterministes restent immuables et le LLM ne reçoit toujours aucun champ d’approbation.
Comparaison : l’API HTTP reste la voie la plus simple à isoler et la plus portable; Codex CLI offre le défaut local souhaité et réutilise sa connexion, mais ajoute une dépendance d’exécutable, d’authentification et de sandbox qu’il faut diagnostiquer séparément.
Recommandation actuelle : adopter ce double adaptateur avec priorité à la configuration API explicite, puis Codex CLI
5.6-lunapar défaut en son absence, et des échecs visibles sans fallback implicite. Cela amende la proposition; ce commentaire ne vaut pas acceptation de la décision.Ok dans les grandes lignes, mais avec les nuances suivantes:
Oui, ces deux nuances rendent le contrat plus pragmatique.
Je propose de fixer la sélection ainsi :
codexpeut donc être choisi explicitement même si une configuration API existe.5.6-lunaest seulement la valeur par défaut si aucun modèle Codex n’est indiqué.unknownet pause humaine; aucun changement silencieux de backend ou de modèle.Pour les outils Codex, je retire l’exigence de garantie absolue « aucun outil/shell/fs ». Elle serait coûteuse et probablement artificielle pour un CLI agentique. Le contrat utile est plutôt une réduction raisonnable de l’exposition : lancer Codex hors du dépôt, dans un répertoire temporaire contenant uniquement l’entrée bornée et expurgée nécessaire, ne lui transmettre aucun secret métier ni chemin hôte inutile, et considérer toute sa sortie comme non fiable jusqu’à validation locale du schéma et des références. On ne bloque donc pas l’adaptateur si Codex conserve ses capacités normales, mais on ne lui donne volontairement rien dont il n’a pas besoin.
L’adaptateur HTTP reste naturellement plus étroit. Dans les deux cas, l’analyse demeure consultative : elle ne peut ni modifier/supprimer un finding déterministe, ni approuver, ni déclencher une action.
Recommandation actuelle : backend configurable avec modes explicites (
codex, API prise en charge,disabled) et mode automatique « API complète, sinon Codex »; modèle Codex configurable avec défaut5.6-luna; isolation en meilleur effort plutôt qu’en garantie stricte; sortie LLM non fiable, bornée et validée localement; échec visible et pause humaine sans fallback implicite. Cela reste une proposition de discussion, pas une acceptation de la décision.GO DECISION
Décision D10 consignée dans ADR-0011. Le commit signé
f971bb6469e09b4fc414b264db81e8a33e13d314met aussi la spécification, le mandat et le registre de design en cohérence. La branchedesign/technical-contractset la PR #1 pointent sur ce commit vérifié. Aucun code de production ni plan d’implémentation n’a été créé.