🎯 OBJECTIF
Comprendre comment :
🧠 MODÈLE MENTAL
Un appel à un LLM est une fonction pure : contexte → texte. Le modèle n'a aucune mémoire entre deux requêtes — à chaque appel il repart d'une page blanche. Tout ce qu'il « sait » d'une situation a dû être placé dans sa fenêtre de contexte à ce moment précis.
Une fois ce point intégré, tout le reste devient évident : chaque levier (prompt, skill, fichier d'instructions, graphe de code, spec, subagent) n'est qu'une stratégie différente pour remettre le bon contexte, au bon moment, sans exploser le budget de tokens. La bonne question n'est jamais « quel outil est le meilleur ? » mais « qu'est-ce que j'externalise, et avec quelle permanence ? ». Les outils nommés ici sont interchangeables : ce sont des exemples d'une catégorie, pas la catégorie elle-même.
Chaque levier se définit par ce qu'il externalise. Les outils ne sont que des illustrations d'une catégorie.
| Besoin (ce qu'on externalise) | Levier | Exemples d'outils |
|---|---|---|
| L'intention immédiate | Prompt | n'importe quel chat |
| Une procédure réutilisable | Skill | skills, commandes custom |
| Les règles du projet | Fichier d'instructions | AGENTS.md, CLAUDE.md, copilot-instructions.md |
| Une garantie d'exécution | Hook | hooks d'agent, git hooks |
| La structure du code | Graphe de code | Graphify |
| L'intention d'une feature | Spec versionnée | OpenSpec (spec-driven dev) |
| Un rôle isolé | Agent / subagent | subagents |
flowchart TD
P["LLM sans mémoire<br/>contexte → texte"] --> Q["Comment remettre<br/>le bon contexte ?"]
Q --> M1["Prompt<br/>intention immédiate"]
Q --> M2["Skill<br/>procédure réutilisable"]
Q --> M3["Fichier d'instructions<br/>règles du projet"]
Q --> M4["Hook<br/>garantie d'exécution"]
Q --> M5["Graphe de code<br/>structure"]
Q --> M6["Spec versionnée<br/>intention d'une feature"]
Q --> M7["Subagent<br/>rôle isolé"]
T["Tokens : budget transversal"] -.contraint.-> Qmermaid🔑 Conclusion clé
Raisonner par catégorie de levier (qu'est-ce que j'externalise, et avec quelle permanence : toujours en contexte vs à la demande), pas par outil. Les outils changent ; les catégories restent.
Ce qu'on injecte à la main, pour une requête donnée. Le levier de base, et l'essentiel du gain quand on débute. Bien prompter = être explicite sur l'objectif, le format attendu, les contraintes, et donner des exemples.
Tu es un relecteur de code.
Liste UNIQUEMENT les problèmes de correction (pas de style).
Pour chacun : ligne, problème, correctif. Format : tableau Markdown.
[code]Limite : rien n'est mémorisé d'une requête à l'autre. Pour réutiliser, on passe à un skill ou un fichier d'instructions.
Une procédure réutilisable, chargée à la demande quand sa description correspond à la tâche. Au lieu de re-prompter le même template à chaque fois, on le capitalise une fois. En pratique : un fichier (type SKILL.md) avec une description (qui décide du déclenchement) + le corps (la procédure).
---
name: bug-ticket
description: Déclenche pour rédiger un ticket de bug. Mots-clés : "ticket", "bug".
---
# Format de ticket
Impact → Comportement attendu → Étapes de repro → Données
Tout se joue sur la description : trop vague, il ne se déclenche pas ; trop large, il se déclenche à tort.
Un fichier Markdown, versionné dans Git, qui dit à un agent de code comment travailler sur le projet : un « README pour agents » (setup, tests, conventions), distinct du README destiné aux humains. Il résout le problème de la page blanche au niveau projet : l'agent sait coder en général, mais ignore les conventions locales.
⚠️ À ne pas confondre avec « les agents ». Ce fichier ne crée aucun agent ; il dit à un agent comment se comporter.
Le contenu est identique (du Markdown) ; seul le nom change selon l'outil. Exemples :
| Outil | Fichier lu |
|---|---|
| Standard ouvert (Codex, Cursor, Jules, Zed, Aider…) | AGENTS.md |
| Claude Code | CLAUDE.md |
| GitHub Copilot | .github/copilot-instructions.md (lit aussi AGENTS.md) |
Quand un outil lit plusieurs fichiers (cas de Copilot avec AGENTS.md + copilot-instructions.md), ils sont fusionnés, le plus spécifique l'emportant en cas de conflit. En environnement multi-outils, maintenir une seule source et la partager par symlink :
ln -s AGENTS.md CLAUDE.md
mkdir -p .github && ln -s ../AGENTS.md .github/copilot-instructions.mdbash# Mon service — instructions agent
## Stack
- Node.js / TypeScript, Express ; PostgreSQL ; build via pnpm
## Commandes
- Tests : `pnpm test` // ✓ à lancer avant toute PR
- Lint : `pnpm lint`
## Conventions
- Le client HTTP ne lève jamais d'exception : il renvoie un Result. // ✓ concept stable
- Ne jamais modifier le dossier `vendor/`.
## Détails
- Conventions de test : voir docs/TESTING.md
Les deux sont du Markdown qui « donne des instructions au modèle » — d'où la confusion permanente. Mais ils répondent à deux questions différentes :
| Critère | Fichier d'instructions | Skill |
|---|---|---|
| Répond à | « comment travailler sur ce projet ? » | « comment faire cette tâche ? » |
| Chargement | toujours dans le contexte | à la demande, si la description correspond |
| Portée | un projet (ou un dossier) | une compétence, réutilisable partout |
| Déclenchement | automatique et permanent | matching tâche ↔ description |
| Coût en tokens | permanent (à chaque appel) | ponctuel (seulement quand utilisé) |
| Combien | un par projet / dossier | autant que de tâches récurrentes |
| Analogie | le règlement affiché au mur | une fiche-recette sortie du tiroir |
flowchart TD
Q["Nouvelle requête"]
subgraph ALWAYS["Toujours dans le contexte"]
A["Fichier d'instructions<br/>règles du projet"]
end
subgraph LIB["Bibliothèque de skills (au repos, hors contexte)"]
S1["skill : ticket"]
S2["skill : doc PDF"]
S3["skill : ..."]
end
Q --> A
Q --> T{"La description<br/>d'un skill<br/>correspond ?"}
T -- oui --> LOAD["Skill chargé<br/>le temps de la tâche"]
T -- non --> SKIP["Aucun skill chargé"]
S1 -.à la demande.-> LOADmermaidRègle simple
Une convention permanente du projet → fichier d'instructions. Une procédure ponctuelle réutilisable → skill. Et ils se complètent : un fichier d'instructions léger peut pointer vers des skills (progressive disclosure).
De l'automatisation déterministe autour d'une action (avant / après). Ce n'est pas du LLM : c'est du code qui s'exécute à coup sûr — lancer les tests après une modif, bloquer un commit si le lint échoue, journaliser une action. Exemples : hooks d'agent de code, git hooks.
Différence avec un skill : un skill peut se déclencher (le modèle décide), un hook s'exécute toujours. Dès qu'on veut une garantie, c'est un hook.
Suppose un agent avec accès au dépôt ; indisponible en simple client de chat.
Quand le savoir à donner est trop gros pour tenir dans le contexte, on l'externalise dans un artefact interrogeable plutôt que de le réinjecter à chaque fois.
Principe : transformer la codebase en graphe interrogeable (chaque fonction/fichier devient un nœud). L'IA interroge une représentation compacte au lieu de relire tout le code, et ne régénère que ce qui a changé — ce qui réduit le « token tax » et rend explicites les dépendances entre modules.
Exemple d'outil : Graphify — /graphify produit un graphe navigable, polyglotte, en local.
Piège d'installation (Graphify)
Le package PyPI s'appelle graphifyy — avec un double y. Le package à un seul y est un outil différent et sans rapport. Presque tout le monde se trompe la première fois.
Principe (spec-driven development) : écrire la spécification avant le code et en faire la source de vérité versionnée. On s'accorde sur quoi construire avant qu'une ligne soit produite. Bénéfice : sans spec écrite, impossible de comparer ce que l'IA produit à une attente — la spec devient l'artefact de revue.
Exemple d'outil : OpenSpec — déroule un cycle en trois temps :
flowchart LR
A["propose<br/>specs + plan de tâches"] --> B["apply<br/>implémente, coche la checklist"]
B --> C["archive<br/>rejoint les specs vivantes"]mermaidCes deux leviers donnent leur plein effet avec un agent qui a accès au dépôt.
Un agent autonome est un processus avec un rôle et un prompt propres, qui enchaîne des actions vers un objectif. Un subagent est un agent spécialisé, invoqué par l'agent principal, avec son propre contexte isolé. Intérêt principal : isoler le contexte. Un subagent « revue de code » ou « rédaction de tests » fait son travail dans sa fenêtre et ne renvoie que sa conclusion, sans polluer le contexte principal — c'est autant un outil d'organisation que de gestion des tokens.
Exemple : un subagent défini par un fichier (rôle + outils autorisés + prompt système).
---
name: code-reviewer
description: Relit un diff et signale les problèmes de correction.
tools: [read, grep]
---
Tu relis du code. Pour chaque problème : fichier, ligne, raison, correctif.
Ne signale que des problèmes de correction, pas de style.
À introduire une fois le socle en place (fichier d'instructions + bons prompts), pas avant.
| Besoin | Levier | Exemples | Accès au dépôt requis |
|---|---|---|---|
| Une réponse ponctuelle | Prompt | tout chat | non |
| Répéter une procédure normalisée | Skill | skills | non |
| Donner les règles du projet | Fichier d'instructions | AGENTS.md, CLAUDE.md, copilot-instructions.md | partiel |
| Garantir une exécution (tests, lint) | Hook | hooks d'agent, git hooks | oui |
| Comprendre la structure du code | Graphe de code | Graphify | oui (plein bénéfice) |
| Cadrer + reviewer une feature | Spec versionnée | OpenSpec | oui |
| Isoler un rôle spécialisé | Subagent | subagents | oui |
⚡ TL;DR — chaque levier en une ligne
Prompt — injecter l'intention immédiate ✓ Le levier de base ; l'essentiel du gain au début. ⚠ Rien n'est mémorisé d'une requête à l'autre.
Skill — capitaliser une procédure ✓ Une procédure réutilisable chargée à la demande quand la description correspond. ⚠ Tout dépend de la description : mal réglée, il ne se déclenche pas (ou trop).
Fichier d'instructions — les règles du projet ✓ Toujours présent dans le contexte ; un nom par outil (AGENTS.md, CLAUDE.md…). ⚠ Ne crée aucun agent ; coûte des tokens à chaque appel.
Hook — garantir une exécution ✓ Du code déterministe qui s'exécute à coup sûr. ⚠ Suppose un agent avec accès au dépôt ; indisponible en simple chat.
Graphe de code — externaliser la structure ✓ Codebase en graphe interrogeable pour réduire le « token tax » (ex. Graphify). ⚠ Outil à part entière à installer et maintenir ; plein bénéfice via un agent de code.
Spec versionnée — externaliser l'intention d'une feature ✓ La spec avant le code, comme artefact de revue (ex. OpenSpec). ⚠ Le flow complet suppose un agent avec accès filesystem.
Subagent — déléguer un rôle isolé ✓ Un rôle avec son propre contexte ; protège le contexte principal. ⚠ À introduire après le socle, pas avant.
🎓 À retenir
.github/copilot-instructions.mdgraphifyy)