EN DIRECT
Une étude mesure comment les agents de code choisissent leurs outils tiers03/09/26|GPT-6 Astra d'OpenAI établit un nouveau record sur ARC-AGI-303/09/26 · OpenAI|ESPO : une méthode d'optimisation de prompts plus courte et plus stable que GEPA03/09/26|« Last Translation Benchmark » : un effort collectif pour un référentiel définitif de traduction automatique03/09/26|NVIDIA mise sur l'IA locale à l'IFA 2026 avec les PC RTX Spark et un routeur d'inférence personnel03/09/26 · NVIDIA|Google DeepMind lance WeatherNext 3, son modèle météo IA le plus précis03/09/26 · Google DeepMind|OpenAI lance Daybreak, un programme d'un milliard de dollars pour la cybersécurité des services essentiels03/09/26 · OpenAI|Hcompany lance NeoMME, un encodeur multimodal natif compact pour la recherche documentaire03/09/26 · Hcompany|Playco réduit de 50 % ses corrections manuelles grâce à GPT-6 Astra03/09/26 · OpenAI|Legora analyse 41 documents financiers en quelques minutes avec GPT-6 Astra03/09/26 · OpenAI|Hugging Face reproduit en open source une IA qui peint des aquarelles en code03/09/26 · Hugging Face|Un modèle de 350M de paramètres amélioré en 100 étapes de GRPO pour mieux structurer ses sorties03/09/26|Une étude mesure comment les agents de code choisissent leurs outils tiers03/09/26|GPT-6 Astra d'OpenAI établit un nouveau record sur ARC-AGI-303/09/26 · OpenAI|ESPO : une méthode d'optimisation de prompts plus courte et plus stable que GEPA03/09/26|« Last Translation Benchmark » : un effort collectif pour un référentiel définitif de traduction automatique03/09/26|NVIDIA mise sur l'IA locale à l'IFA 2026 avec les PC RTX Spark et un routeur d'inférence personnel03/09/26 · NVIDIA|Google DeepMind lance WeatherNext 3, son modèle météo IA le plus précis03/09/26 · Google DeepMind|OpenAI lance Daybreak, un programme d'un milliard de dollars pour la cybersécurité des services essentiels03/09/26 · OpenAI|Hcompany lance NeoMME, un encodeur multimodal natif compact pour la recherche documentaire03/09/26 · Hcompany|Playco réduit de 50 % ses corrections manuelles grâce à GPT-6 Astra03/09/26 · OpenAI|Legora analyse 41 documents financiers en quelques minutes avec GPT-6 Astra03/09/26 · OpenAI|Hugging Face reproduit en open source une IA qui peint des aquarelles en code03/09/26 · Hugging Face|Un modèle de 350M de paramètres amélioré en 100 étapes de GRPO pour mieux structurer ses sorties03/09/26|
AvancéNouveau🧠

CCA-F Domaine 5 — Context Management & Reliability (15 %) : la leçon complète

Le domaine de la fiabilité : ce qui consomme la fenêtre de contexte et comment la budgéter, compactage et résumés structurés, mémoire persistante entre sessions, dégradation gracieuse (timeouts, fallbacks, résultats partiels), propagation d'erreurs entre agents, attribution des sources et normalisation des formats hétérogènes. Schémas, pièges, checklist de la veille, questions-scénario corrigées.

30 min de lecturePublié le 4 septembre 2026 · aujourd'hui

Le domaine 5 pèse 15 % — environ 9 questions sur 60. C'est le plus petit, et le plus transversal : ses questions reprennent des situations des quatre autres domaines (sous-agents, outils, sessions, extraction) sous un angle unique — que se passe-t-il quand ça ne tient pas, quand ça tombe, quand ça se contredit ? Un candidat qui a bien travaillé les domaines 1 à 4 a déjà 70 % de ce domaine ; le reste, c'est un petit nombre de réflexes de fiabilité que l'examen attend nommément : résumé structuré plutôt que troncature, résultat partiel avec trous explicites plutôt que rien, erreur enrichie plutôt qu'avalée ou brute, source rattachée à chaque affirmation, normalisation à l'ingestion.

Cette leçon suit les 6 task statements du guide officiel v1.0 (juillet 2026). Les scénarios d'examen qui tirent sur ce domaine sont le Multi-Agent Research System (scénario 3), le Document Processing Pipeline (scénario 6) et Developer Productivity (scénario 4).

Où se situe cette leçon. Cinquième et dernière des leçons domaine par domaine de notre guide complet de la CCA-F, après le Domaine 4 — Prompt Engineering & Structured Output. Vérifié le 4 septembre 2026 sur le guide d'examen officiel v1.0. Prérequis : sous-agents et sessions (domaine 1), erreurs structurées (domaine 2), schémas nullable (domaine 4).

La carte du domaine

Trois questions structurent le domaine : combien ça tient (5.1 budget, 5.2 compactage), ce qui survit (5.3 mémoire), et ce qui se passe quand ça casse (5.4 dégradation, 5.5 propagation, 5.6 attribution et formats).

Les 6 task statements du domaine 5
COMBIEN ÇA TIENT 5.1 · Budget de contexte ce qui consomme, ce qui reste résultats verbeux → sous-agent ou résumé avant injection 5.2 · Compactage résumé structuré, pas troncature décisions · faits · trous · suite repartir de zéro quand périmé CE QUI SURVIT 5.3 · Mémoire persistante conventions → CLAUDE.md état en cours → fichier mémoire volume / recherche → base externe décisions et faits : oui résultats d'outils bruts : non résumé structuré comme format d'échange QUAND ÇA CASSE 5.4 · Dégradation gracieuse partiel + trous · timeout · fallback 5.5 · Propagation d'erreurs enrichir · remonter · coordinateur décide 5.6 · Attribution & formats source par affirmation · normaliser
Le domaine 5 se lit comme une checklist de production : la fenêtre a une taille, les sessions se terminent, les outils tombent, les agents échouent, les sources se contredisent. Pour chaque cas, l'examen attend un mécanisme nommé.

5.1 — Le budget de contexte

La fenêtre de contexte n'est pas « grande » ou « petite » : c'est un budget que quatre postes se partagent. L'examen teste si tu sais ce qui le consomme et ce qui doit y rester.

Ce qui consomme la fenêtre, et où se perd la qualité
system outils (défs) historique résultats d'outils (fichiers lus, pages, logs) libre fixe, payé à chaque tour croît à chaque tour — le poste qui explose qualité dégradée bien avant la limite Trois façons de tenir le budget Déporter Sous-agent (Explore, Task) lit 200 fichiers dans SON contexte, renvoie un résumé de 2 000 tokens contexte principal préservé Résumer avant d'injecter Résultat d'outil de 40 pages → extraction des faits utiles (PostToolUse ou pré-traitement) le modèle ne lit que l'essentiel Restreindre 4-5 définitions d'outils par rôle (pas 18), règles à glob chargées seulement sur les fichiers concernés le poste fixe reste petit
Le system prompt et les définitions d'outils sont payés à chaque tour. L'historique et les résultats d'outils croissent. Bien avant la limite dure, la qualité se dégrade : dilution de l'attention, instructions du début oubliées. Le réflexe est de garder la fenêtre principale pour les décisions et de déporter le verbeux.

Ce qu'il faut savoir

Quatre postes. Le system prompt et les définitions d'outils (fixes, payés à chaque tour), l'historique de conversation (croît), les résultats d'outils (le poste qui explose : fichiers lus, pages récupérées, logs). Un agent qui lit 30 fichiers en entier a consommé sa fenêtre avant d'avoir commencé à raisonner.

La qualité se dégrade avant la limite. Ce n'est pas un mur : c'est une pente. Dilution de l'attention (domaine 1, 1.6), instructions du début moins respectées, résultats contradictoires selon la position dans le contexte. Un « modèle avec plus de contexte » repousse le mur, pas la pente.

Déporter le verbeux. Un sous-agent (Explore en Claude Code, Task dans le SDK) fait la lecture dans son propre contexte isolé et ne renvoie qu'un résumé (domaine 3, 3.4). C'est la réponse attendue dès que l'énoncé parle de « lire des dizaines de fichiers », « parcourir le codebase », « dépouiller des documents ».

Résumer avant d'injecter. Un résultat d'outil volumineux est réduit à ses faits utiles avant d'entrer dans la fenêtre : hook PostToolUse (domaine 1, 1.5) ou pré-traitement côté outil.

Restreindre le fixe. Outils par rôle (domaine 2, 2.3), règles à glob chargées conditionnellement (domaine 3, 3.3) : chaque token fixe non pertinent est payé à chaque tour.

Le piège 5.1. « Passer à un modèle avec une fenêtre plus grande » est presque toujours un distracteur : le problème est la gestion, pas la taille. Autre piège : « demander à l'agent de lire tous les fichiers au début pour avoir une vue complète » — c'est l'inverse de l'exploration incrémentale (domaine 2, 2.5), et ça sature avant la première décision.

5.2 — Compactage : le résumé structuré

Quand la fenêtre approche de la limite en cours de tâche, il faut faire de la place. La question est comment : ce qu'on garde, ce qu'on résume, ce qu'on jette.

Troncature, fenêtre glissante, résumé structuré
✗ Troncature coupé gardé Perd l'objectif initial, les contraintes, les décisions → l'agent « oublie » ce qu'on lui a demandé ~ Fenêtre glissante N derniers tours Coût borné, mais même perte du début ; ok pour du chat court → pas pour une tâche multi-phases ✓ Résumé structuré résumé récent, brut Garde décisions, faits, trous, prochaines étapes ; jette le brut → la tâche continue sans dérive Le contenu d'un bon résumé de compactage Objectif et contraintes d'origine (reformulés, pas paraphrasés vaguement) Décisions prises et leur justification · Faits vérifiés avec leur source Trous et incertitudes restantes · Ce qui a été tenté et a échoué Prochaines étapes · Fichiers / entités touchés — jamais les sorties d'outils brutes
La troncature et la fenêtre glissante perdent le début de la conversation — là où sont l'objectif, les contraintes et les décisions initiales. Le résumé structuré conserve ce qui a de la valeur (décisions, faits vérifiés, trous, prochaines étapes) et jette le verbeux (résultats d'outils bruts, allers-retours).

Ce qu'il faut savoir

Le résumé structuré. Quand on compacte, on remplace l'historique par un résumé qui conserve : l'objectif et les contraintes d'origine, les décisions prises et pourquoi, les faits vérifiés (avec leur source), les trous et incertitudes, ce qui a été tenté et a échoué, les prochaines étapes. On jette les résultats d'outils bruts et les allers-retours de raisonnement.

Pourquoi pas la troncature. Couper le début supprime l'objectif et les contraintes : l'agent continue à travailler, mais sur une tâche dont il ne connaît plus les règles. La fenêtre glissante (garder les N derniers tours) a le même défaut, avec un coût borné ; acceptable pour une conversation courte sans état, pas pour une tâche multi-phases.

Quand repartir de zéro. Si le compactage laisse un contexte dont la majorité est périmée (le code a changé, les résultats ne reflètent plus l'état réel), on démarre une session neuve avec le résumé structuré en contexte initial (domaine 1, 1.7). Le résumé est le format d'échange entre sessions.

Résumer par phase. Sur une tâche longue, on compacte à chaque changement de phase (fin de l'exploration → résumé → implémentation), pas uniquement quand la limite approche. Le compactage devient un rythme, pas une urgence.

COMPACTION_SCHEMA = {
    "name": "compact_context",
    "description": "Produit le résumé structuré qui remplace l'historique. Ne conserve AUCUNE sortie d'outil brute.",
    "input_schema": {"type": "object", "properties": {
        "goal": {"type": "string", "description": "Objectif d'origine, contraintes incluses"},
        "decisions": {"type": "array", "items": {"type": "object",
            "properties": {"what": {"type": "string"}, "why": {"type": "string"}}, "required": ["what", "why"]}},
        "verified_facts": {"type": "array", "items": {"type": "object",
            "properties": {"fact": {"type": "string"}, "source": {"type": "string"}}, "required": ["fact", "source"]}},
        "open_gaps": {"type": "array", "items": {"type": "string"}},
        "failed_attempts": {"type": "array", "items": {"type": "string"}},
        "next_steps": {"type": "array", "items": {"type": "string"}},
        "touched_files": {"type": "array", "items": {"type": "string"}},
    }, "required": ["goal", "decisions", "verified_facts", "open_gaps", "next_steps"]},
}

def compact(messages):
    resp = client.messages.create(model=M, max_tokens=2048, tools=[COMPACTION_SCHEMA],
                                  tool_choice={"type": "tool", "name": "compact_context"},
                                  messages=messages + [{"role": "user", "content": "Compacte l'historique."}])
    summary = next(b for b in resp.content if b.type == "tool_use").input
    # Nouveau contexte : system + résumé structuré + les 2 derniers tours bruts
    return [{"role": "user", "content": f"<context_summary>{json.dumps(summary, ensure_ascii=False)}</context_summary>"}] + messages[-4:]
Le piège 5.2. « Tronquer les messages les plus anciens » ou « ne garder que les 10 derniers tours » sont les distracteurs par défaut ; la réponse est le résumé structuré. Et le piège inverse : « résumer en prose libre » — sans structure, le résumé oublie les trous et les échecs, qui sont précisément ce qui évite de refaire le même travail.
🗜️
Le réflexe 5.2
Limite proche → résumé structuré (objectif, décisions, faits sourcés, trous, échecs, suite), jamais troncature. Contexte périmé → session neuve + résumé. Tâche longue → compacter à chaque phase.

5.3 — Mémoire persistante entre sessions

Une session se termine. Ce qui doit survivre dépend de sa nature — et l'examen teste précisément ce choix d'emplacement.

Quel mécanisme de mémoire pour quelle information ?

 InformationEmplacement attendu
Conventions, standards, architecture stable« Toujours vrai », partagé par l'équipeCLAUDE.md projet (versionné) — domaine 3
État d'un travail en coursDécisions, trous, prochaines étapes d'une tâche multi-joursFichier de mémoire / résumé structuré injecté au démarrage
Historique volumineux, rechercheMilliers de tickets, décisions passées, documentsBase externe (SQL, vecteurs) interrogée par un outil
Préférences personnellesStyle, langue, outils favoris d'un développeur~/.claude/CLAUDE.md (jamais partagé)
Résultats d'outils bruts, logsFichiers lus, pages récupérées, sorties de testsNe PAS persister — se régénèrent, se périment
Sessions d'investigation nomméesReprendre une analyse encore valide--resume <nom> (+ signaler les fichiers modifiés)

Ce qu'il faut savoir

Choisir par nature, pas par commodité. Une convention va dans CLAUDE.md parce qu'elle est stable et partagée. L'état d'un travail en cours va dans un fichier de mémoire ou un résumé structuré parce qu'il est temporaire et propre à une tâche. Un historique volumineux va dans une base externe parce qu'il ne tient pas dans un fichier et qu'on le cherche plutôt qu'on ne le lit.

Ce qu'on ne persiste pas. Les résultats d'outils bruts : ils se régénèrent en un appel et se périment vite. Persister un fichier lu hier, c'est raisonner demain sur une version fausse. On persiste les conclusions tirées, avec leur source, pas la matière première.

Le résumé structuré comme format d'échange. Le même schéma qu'en 5.2 sert de mémoire entre sessions : écrit en fin de session, injecté au démarrage de la suivante. Il est daté et liste les fichiers touchés, ce qui permet de savoir ce qui a pu changer.

Mémoire ≠ contexte. Une base externe ne charge pas tout dans la fenêtre : un outil l'interroge et ne renvoie que les entrées pertinentes. C'est ce qui permet d'avoir une mémoire de plusieurs mois sans exploser le budget de 5.1.

Le piège 5.3. « Tout mettre dans CLAUDE.md » : ce fichier est chargé à chaque session, il grossit, et l'état temporaire d'une tâche pollue les conventions permanentes. « Persister l'historique complet de la conversation » : verbeux, périmé, et il faut le relire en entier. « Une base vectorielle pour les conventions d'équipe » : sur-dimensionné pour vingt lignes stables qui doivent être lues à chaque fois, pas cherchées.

5.4 — Dégradation gracieuse

Un outil ne répond pas, une source est indisponible, un traitement dépasse son délai. L'examen a une position claire : un résultat partiel honnête vaut mieux que rien, et infiniment mieux qu'un succès menteur.

Face à un échec partiel : les quatre réflexes
Appel d'outil recherche web, API interne 1 · Timeout borné jamais d'attente infinie 2 · Fallback source alternative, cache, retry 3 · Partiel + trous explicites ✗ Les deux échecs silencieux Tout ou rien une source sur cinq tombe → aucun rapport (80 % du travail jeté) Succès menteur la source tombe → le rapport sort complet sans mentionner le trou (pire cas) ✓ Le partiel honnête status: "partial" covered: ["académique", "presse", "données"] missing: [{"source": "brevets", "reason": "timeout 30s", "attempts": 2, "retryable": true}] confidence: "medium" Le lecteur sait ce qu'il tient — et ce qui manque
Borner par un timeout, prévoir un fallback, livrer le partiel avec les trous explicites, et ne jamais transformer un échec en succès. La sortie porte l'état de complétude : ce qui est là, ce qui manque, pourquoi.

Ce qu'il faut savoir

Timeouts bornés. Tout appel externe a un délai maximal. Sans lui, un outil qui ne répond pas bloque l'agent, puis le coordinateur, puis le pipeline.

Fallback. Quand l'appel principal échoue : source alternative (deuxième moteur de recherche, cache de la veille), retry avec backoff pour le transitoire (domaine 2, 2.2), ou dégradation de la fonctionnalité (rapport sans la section brevets plutôt que pas de rapport).

Le résultat partiel avec trous explicites. La sortie porte son état de complétude : ce qui est couvert, ce qui manque, pourquoi, si c'est réessayable. Un rapport sur quatre sources sur cinq, avec la cinquième signalée manquante, est un livrable. Un rapport « complet » qui cache l'absence de la cinquième est une erreur de données.

Jamais de succès menteur. Transformer un échec en résultat vide marqué succès est l'anti-pattern le plus grave du domaine (déjà croisé en 2.2 et 5.5). L'incertitude s'exprime : confidence, status, missing[].

Le piège 5.4. « Réessayer jusqu'à ce que ça marche » (pas de borne), « échouer tout le traitement pour garantir la cohérence » (tout ou rien), « renvoyer le rapport sans la section manquante pour ne pas inquiéter l'utilisateur » (succès menteur). La réponse attendue combine timeout + fallback + partiel explicite.

5.5 — Propagation d'erreurs entre agents

Question 8 du guide officiel. Le sous-agent de recherche web échoue sur timeout ; selon la version, le coordinateur reçoit une erreur brute qui tue le workflow, ou rien du tout et produit un rapport sans savoir qu'il lui manque une source. Que faire ?

Trois façons de remonter une erreur, une seule attendue
✗ Suppression silencieuse Sous-agent : timeout → renvoie [] « succès » le coordinateur ne sait rien rapport troué, présenté complet le pire des cas ✗ Propagation brute Sous-agent : timeout → exception non gérée remonte telle quelle tout le workflow s'arrête 4 sources sur 5 perdues ✓ Enrichir et remonter Sous-agent : timeout retry local ×2 (backoff), échec category: transient · attempts: 2 partial: 12 résultats (3 requêtes/5) alternatives: [cache, moteur B] le coordinateur DÉCIDE Ce que le coordinateur peut alors faire — et ne pouvait pas avant re-déléguer via l'alternative · continuer avec 4 sources et signaler le trou · relancer plus tard (transient) · escalader (permission) La décision appartient au niveau qui voit l'ensemble, pas au sous-agent qui ne voit que sa tâche
La suppression silencieuse cache le problème au coordinateur. La propagation brute lui fait porter un échec qu'il ne peut pas interpréter. L'enrichissement lui donne de quoi décider : catégorie, tentatives, résultats partiels, alternatives possibles.

Ce qu'il faut savoir

Récupération locale d'abord. Le sous-agent gère lui-même ce qu'il peut : retry avec backoff sur le transitoire, source alternative si elle est dans son périmètre. Il ne remonte que ce qu'il n'a pas pu résoudre.

Enrichir ce qui remonte. L'erreur transmise au coordinateur contient : la catégorie (transient / validation / business / permission), ce qui a été tenté (et combien de fois), les résultats partiels obtenus, les alternatives possibles. C'est ce qui permet au coordinateur de choisir : re-déléguer, continuer avec un trou signalé, relancer plus tard, escalader.

Le coordinateur décide. Pas le sous-agent : il ne voit que sa tâche, le coordinateur voit l'ensemble (les quatre autres sources, le délai, l'importance relative de la source manquante). C'est cohérent avec le hub-and-spoke du domaine 1.

Ni suppression, ni brut. Les deux distracteurs de la question 8 : « attraper l'erreur et renvoyer un résultat vide en succès » (le coordinateur produit un rapport troué sans le savoir) et « retry local puis statut d'échec générique » (le retry est bon, le générique empêche la décision).

# Sous-agent : récupération locale, puis erreur ENRICHIE vers le coordinateur
def web_search_subagent(queries: list[str]) -> dict:
    results, failed = [], []
    for q in queries:
        try:
            results += search_with_retry(q, attempts=2, backoff=1.5, timeout=30)   # récupération locale
        except TransientError as e:
            failed.append({"query": q, "category": "transient", "attempts": 2, "last_error": str(e)})
    if not failed:
        return {"status": "ok", "results": results}
    return {                                                                        # ni [] silencieux, ni raise brut
        "status": "partial" if results else "failed",
        "results": results,                                                          # partiels conservés
        "failed": failed,
        "retryable": True,
        "alternatives": ["cache_yesterday", "engine_b"],
        "coverage": f"{len(queries) - len(failed)}/{len(queries)} requêtes",
    }

# Coordinateur : il DÉCIDE avec l'information reçue
out = web_search_subagent(queries)
if out["status"] == "partial":
    alt = delegate("web_search", failed_queries(out), source="engine_b")           # re-déléguer via l'alternative
    report = synthesize(out["results"] + alt["results"], gaps=still_failed(alt))    # trou signalé si persiste
Le piège 5.5. Une option qui fait « gérer l'erreur au niveau du sous-agent pour ne pas surcharger le coordinateur » en la masquant : la simplicité apparente cache le trou. Une option qui « laisse l'exception remonter pour ne rien perdre » : on perd tout le reste. Repère les mots attempted, partial, alternatives, coordinator decides : ils désignent la bonne réponse.
📡
Le réflexe 5.5
Sous-agent : retry local, puis erreur enrichie (catégorie, tentatives, partiels, alternatives). Coordinateur : décide. Jamais [] en succès, jamais raise brut.

5.6 — Attribution des sources et formats hétérogènes

Deux sujets liés par la même idée : la fiabilité de ce qui sort dépend de la discipline à l'entrée. Ancrés sur les scénarios 3 (recherche) et 6 (documents).

De la source à l'affirmation : ne jamais casser la chaîne
Sources brutes PDF · HTML · CSV · API dates 3 formats, k€ vs M$, encodages, statuts codés Ingestion : normaliser ISO 8601 · unités uniques · UTF-8 contenu | métadonnées séparés source_id: "S3" attribué Synthèse : chaque affirmation cite {claim, source_ids: ["S3","S7"], confidence} schéma : source_ids ∈ enum des sources fournies → citation inventée = impossible ✗ Ce qui casse la chaîne • Passer les trouvailles en prose entre agents : la source se perd à la première synthèse • Demander « cite tes sources » sans contrainte : le modèle produit des références plausibles • Fusionner deux chiffres contradictoires en une moyenne : information détruite ✓ Ce qui la préserve • Format structuré entre agents : contenu, source_id, url, date, page — jamais du texte libre • Schéma de synthèse avec source_ids contraint à l'enum des sources réellement collectées • Contradiction → champ conflicts[] : les deux valeurs, leurs sources, leur date
À l'ingestion, on normalise les formats et on sépare contenu et métadonnées. Pendant la synthèse, chaque affirmation porte l'identifiant de sa source, et le schéma n'accepte que des identifiants issus de l'ensemble fourni — ce qui empêche les citations inventées. Les sources qui se contredisent sont signalées, pas fusionnées.

Ce qu'il faut savoir

Contenu et métadonnées séparés, dès l'ingestion. Le texte d'une trouvaille d'un côté ; l'URL, le document, la page, la date, l'identifiant de source de l'autre. En prose, l'attribution se perd à la première synthèse (domaine 1, 1.3).

La source suit l'affirmation de bout en bout. Chaque agent qui transforme les données conserve les source_ids. Le rapport final peut remonter de n'importe quelle phrase à sa source.

Contraindre par le schéma. « Cite tes sources » dans le prompt produit des références plausibles mais inventées. Le schéma de synthèse a un champ source_ids dont les valeurs sont restreintes à l'enum des sources réellement fournies : une citation hors ensemble est rejetée à la validation (domaine 4, 4.2).

Normaliser à l'ingestion. Dates (Unix, ISO, « 12/03/2026 »), unités (k€, M$), encodages, statuts codés : on convertit une fois, à l'entrée (hook PostToolUse, pré-traitement), et tous les agents aval voient un seul format (domaine 1, 1.5). Demander au modèle de jongler avec les formats est une source d'erreurs à chaque étape.

Contradictions signalées, pas fusionnées. Deux sources donnent deux chiffres pour la même grandeur : on ne prend pas la moyenne, on ne choisit pas au hasard. Un champ conflicts[] porte les deux valeurs, leurs sources et leurs dates ; le lecteur (ou une règle explicite : « la source la plus récente prime ») tranche.

# Trouvaille structurée entre agents : contenu | métadonnées, jamais de prose
finding = {"id": "F42", "claim": "Le marché a atteint 4,2 Md€ en 2025",
           "source_id": "S3", "url": "https://…", "doc": "rapport-2026.pdf", "page": 14,
           "published": "2026-02-11", "value": {"amount": 4.2e9, "currency": "EUR", "year": 2025}}

# Schéma de synthèse : source_ids contraint aux sources fournies
def synthesis_tool(source_ids: list[str]) -> dict:
    return {"name": "write_synthesis",
            "input_schema": {"type": "object", "properties": {
                "claims": {"type": "array", "items": {"type": "object", "properties": {
                    "text": {"type": "string"},
                    "source_ids": {"type": "array", "minItems": 1,
                                   "items": {"type": "string", "enum": source_ids}},      # ← pas d'invention possible
                    "confidence": {"type": "string", "enum": ["high", "medium", "low"]}},
                    "required": ["text", "source_ids", "confidence"]}},
                "conflicts": {"type": "array", "items": {"type": "object", "properties": {
                    "topic": {"type": "string"},
                    "values": {"type": "array", "items": {"type": "object", "properties": {
                        "value": {"type": "string"}, "source_id": {"type": "string", "enum": source_ids},
                        "published": {"type": "string"}}, "required": ["value", "source_id"]}}},
                    "required": ["topic", "values"]}},                                   # ← contradiction exposée
                "gaps": {"type": "array", "items": {"type": "string"}}},
                "required": ["claims", "conflicts", "gaps"]}}
Le piège 5.6. « Ajouter au prompt de synthèse l'instruction de toujours citer » (probabiliste, citations plausibles), « laisser le modèle harmoniser les formats de date à la lecture » (erreurs à chaque étape ; on normalise à l'ingestion), « prendre la valeur de la source la plus fiable » sans le dire (la contradiction doit être visible). Le mot-clé de l'énoncé est attribution / provenance / traceable : la réponse est un format structuré avec source_id porté de bout en bout et contraint par le schéma.

Les pièges transversaux du domaine 5

Grille de lecture d'une question du domaine 5
Si le scénario parle de… …la réponse est …et le distracteur est lecture massive de fichiers, contraintes oubliées Déporter (Explore) + résumé structuré par phase « modèle plus grand », « tout lire au début » fenêtre proche de la limite Résumé structuré décisions · faits · trous · suite « tronquer », « N derniers tours » état à retrouver à la prochaine session Par nature : CLAUDE.md / fichier mémoire / base externe « tout dans CLAUDE.md », « historique complet » une source tombe, « quelque chose de livrable » Timeout + fallback + partiel avec trous explicites « tout ou rien », « sans mentionner » sous-agent en échec, que remonter Erreur enrichie, le coordinateur décide « [] en succès », « exception brute » citations inventées, dates en 3 formats source_ids contraint ; normaliser à l'ingestion « cite tes sources », « tableau des formats » Règle d'or : ce qui traverse une frontière (tour, session, agent) voyage en structure, jamais en prose
Le domaine 5 pose toujours la même question sous six formes : quand ça ne tient pas ou que ça casse, qu'est-ce qui préserve l'information ? La réponse est une structure nommée ; le distracteur lisse, coupe ou masque.
  1. L'honnêteté du résultat prime. Partiel avec trous, contradiction exposée, incertitude déclarée : toute option qui « lisse » pour faire propre est un distracteur.
  2. La structure préserve, la prose perd. Résumé structuré, trouvaille structurée, erreur structurée : dès que l'information traverse une frontière (tour, session, agent), elle voyage en structure.
  3. On traite à l'entrée, pas à chaque étape. Normalisation, séparation contenu/métadonnées, résumé du verbeux : une fois, à l'ingestion.
  4. Le niveau qui voit l'ensemble décide. Le coordinateur, pas le sous-agent ; le schéma, pas le modèle ; la règle explicite, pas le hasard.

Checklist de la veille

À relire la veille de l'examen — domaine 5
- Fenêtre = budget : system + définitions d'outils (fixes) + historique + résultats d'outils (le poste qui explose). - Qualité dégradée bien avant la limite ; « plus de contexte » repousse le mur, pas la pente. - Verbeux → sous-agent (Explore / Task) ou résumé avant injection ; fixe → outils par rôle, règles à glob. - Limite proche → résumé structuré (objectif, décisions + pourquoi, faits sourcés, trous, échecs, suite, fichiers touchés), jamais troncature ni fenêtre glissante sur une tâche multi-phases. - Contexte périmé → session neuve + résumé ; tâche longue → compacter à chaque phase. - Mémoire par nature : conventions → CLAUDE.md ; état en cours → fichier mémoire / résumé daté ; volume → base externe interrogée par outil ; perso → ~/.claude/CLAUDE.md. - Ne jamais persister les résultats d'outils bruts. - Échec partiel → timeout borné + fallback + partiel avec trous explicites (status, missing[], confidence). - Jamais de succès menteur, jamais de tout-ou-rien. - Entre agents : retry local, puis erreur enrichie (catégorie, tentatives, partiels, alternatives) ; le coordinateur décide. - Ni [] en succès, ni exception brute. - Contenu | métadonnées séparés à l'ingestion ; source_id porté de bout en bout. - source_ids contraint par le schéma à l'enum des sources fournies → citation inventée impossible. - Formats hétérogènes normalisés une fois à l'entrée (PostToolUse / pré-traitement). - Contradictions → conflicts[] avec valeurs, sources, dates ; jamais fusionnées en silence.

Cinq questions-scénario originales, corrigées

Questions écrites par nAIvigate dans l'esprit de l'examen, sans reproduction d'items réels.

Question 1 — Scénario productivité. Un agent de migration lit 60 fichiers en entier au début de la tâche, puis perd les contraintes données dans le premier message et produit des changements incohérents. Correction ?

A. Modèle avec une fenêtre plus grande. B. Déléguer la cartographie à un sous-agent Explore qui renvoie un résumé structuré, et compacter à la fin de la phase d'exploration avant l'implémentation. C. Répéter les contraintes à chaque message. D. Tronquer les résultats de lecture aux 200 premières lignes par fichier.

📚Correction Q1

B. Déporter le verbeux + résumé structuré par phase. A repousse le mur sans traiter la dilution. C est un palliatif coûteux. D perd de l'information de façon arbitraire.

Question 2 — Scénario recherche. Sur cinq sources, celle des brevets tombe en timeout. Le pipeline actuel abandonne tout le rapport. Le PO veut « quelque chose de livrable ». Approche ?

A. Augmenter le timeout à 10 minutes. B. Livrer le rapport sur quatre sources avec status: "partial", missing: [{source: "brevets", reason: "timeout", retryable: true}], et proposer une relance. C. Livrer le rapport sur quatre sources sans mentionner la cinquième. D. Réessayer en boucle jusqu'à succès.

📚Correction Q2

B. Partiel honnête avec trou explicite et réessayable. A ne règle pas l'indisponibilité. C est un succès menteur. D n'a pas de borne.

Question 3 — Scénario recherche. Le rapport final cite des URLs qui n'existent pas. Le prompt de synthèse dit « cite toujours tes sources avec l'URL ». Correction ?

A. Renforcer l'instruction. B. Passer les trouvailles en format structuré avec source_id, et contraindre source_ids du schéma de synthèse à l'enum des identifiants réellement collectés. C. Vérifier chaque URL après coup et supprimer les invalides. D. Demander au modèle un score de confiance par citation.

📚Correction Q3

B. Le schéma rend l'invention impossible ; l'instruction (A) reste probabiliste. C supprime des citations mais laisse des affirmations orphelines et ne traite pas la cause. D ne contraint rien.

Question 4 — Scénario documentaire. Trois serveurs MCP renvoient des dates en Unix, ISO et « JJ/MM/AAAA ». L'agent de synthèse se trompe régulièrement de chronologie. Correction ?

A. Ajouter au prompt de synthèse un tableau des formats. B. Normaliser en ISO 8601 à l'ingestion via un hook PostToolUse, pour que tous les agents aval voient un seul format. C. Demander à chaque serveur MCP de changer son format. D. Faire trier les dates par un sous-agent dédié.

📚Correction Q4

B. Normalisation une fois à l'entrée. A fait porter la conversion au modèle à chaque étape. C dépend de tiers. D ajoute un agent pour un problème de données.

Question 5 — Scénario recherche. Deux sources fiables donnent 3,8 Md€ et 4,2 Md€ pour le même marché la même année. Le rapport actuel affiche « environ 4 Md€ ». Que faire ?

A. Garder la moyenne, c'est raisonnable. B. Exposer les deux valeurs dans un champ conflicts[] avec leurs sources et dates, et appliquer une règle explicite si une doit primer (ex. la plus récente). C. Prendre la source la plus connue sans le dire. D. Supprimer le chiffre du rapport.

📚Correction Q5

B. La contradiction est une information ; on la signale avec sa provenance. A détruit l'information. C masque un choix. D perd un fait utile.

Quiz de validation

🧠 Quiz
Question 1 sur 8

Quel poste de la fenêtre de contexte croît le plus vite dans un agent qui lit des fichiers ?

📚Lexique du domaine 5 (déroulez)

Budget de contexte — Répartition de la fenêtre entre system prompt, définitions d'outils, historique et résultats d'outils ; planifiée, pas subie.

Dilution de l'attention — Dégradation de la qualité quand trop de contenu est traité en une fois, bien avant la limite dure.

Déport (offloading) — Faire lire le verbeux par un sous-agent (Explore, Task) qui ne renvoie qu'un résumé.

Compactage — Remplacement de l'historique par un résumé structuré quand la fenêtre approche de sa limite.

Résumé structuré — Objectif, décisions et justification, faits sourcés, trous, échecs, prochaines étapes, fichiers touchés ; format d'échange entre tours, phases et sessions.

Troncature — Anti-pattern : couper les messages anciens, perdant objectif et contraintes.

Fenêtre glissante — Garder les N derniers tours ; coût borné, même perte du début ; réservé aux échanges courts sans état.

Mémoire persistante — Ce qui survit à la session : choisi par nature (conventions, état en cours, volume, préférences).

Fichier de mémoire — Résumé structuré daté écrit en fin de session et injecté au démarrage de la suivante.

Base externe — SQL ou vecteurs, interrogée par un outil ; pour le volume et la recherche, sans charger la fenêtre.

Dégradation gracieuse — Livrer un résultat partiel utile plutôt que rien, avec les manques explicites.

Timeout borné — Délai maximal sur tout appel externe ; jamais d'attente infinie.

Fallback — Source alternative, cache, retry avec backoff, ou fonctionnalité dégradée quand l'appel principal échoue.

Résultat partiel explicite — Sortie portant status, covered, missing[] (raison, tentatives, réessayable), confidence.

Succès menteur — Anti-pattern : échec transformé en résultat vide ou incomplet présenté comme complet.

Tout-ou-rien — Anti-pattern : abandonner l'ensemble du traitement pour un échec partiel.

Récupération locale — Gestion par le sous-agent de ce qu'il peut résoudre (retry transitoire, alternative dans son périmètre).

Erreur enrichie — Catégorie, tentatives, résultats partiels, alternatives ; ce qui remonte au coordinateur.

Suppression silencieuse / propagation brute — Les deux anti-patterns de la question 8 : masquer l'erreur, ou la laisser tuer le workflow.

Attribution (provenance) — Rattachement de chaque affirmation à sa source, conservé de bout en bout.

Contenu | métadonnées — Séparation, dès l'ingestion, du texte d'une trouvaille et de son identifiant de source, URL, document, page, date.

source_ids contraint — Champ du schéma de synthèse restreint à l'enum des sources fournies ; empêche les citations inventées.

Normalisation à l'ingestion — Conversion unique des formats hétérogènes (dates, unités, encodages, statuts) à l'entrée, via PostToolUse ou pré-traitement.

conflicts[] — Champ exposant des valeurs contradictoires avec leurs sources et dates, au lieu de les fusionner.

Pour aller plus loin

C'était la dernière leçon de la série. Le guide complet de la CCA-F rassemble les cinq domaines, le format d'examen et le plan de révision ; pour voir la mémoire et la dérive traitées en production, notre article sur la mémoire persistante et la personnalisation et celui sur la dérive des agents IA prolongent ce domaine.

Si tu veux certifier une équipe entière — ou fiabiliser un système multi-agents existant (budget de contexte, compactage, propagation d'erreurs, attribution des sources) avant qu'il ne tombe en production — c'est ce que nAIvigate Studio fait en Sprint.

Tags
certificationclaudeccacca-fcontextmemoirefiabilitemulti-agentsagentsformationpython
⚡ FICHE #005Skills & MCP : la fiche qui référence tout le parcours2 MIN

À lire ensuite