Déléguer les gros problèmes à un agent dédié
« L'isolation de processus offre l'isolation de contexte gratuitement. » Le sous-agent fait le sale boulot, le parent ne reçoit qu'un résumé propre.
Le problème de l'agent parent
Imaginez que vous demandez à Claude Code de « comprendre comment ce dépôt Rust de 100 000 lignes gère la concurrence ». Approche naïve : il fait lui-même ls, cat, grep dans le contexte principal.
Problème : cette exploration va empiler 30 tool_results dans messages[], chacun représentant quelques milliers de tokens. Au moment où il commence à rédiger la réponse, le contexte est déjà saturé par l'exploration — quelques étapes de plus et la limite est atteinte, la réponse se retrouve désorganisée.
La solution de s04 : confier la tâche d'exploration à un nouvel agent. Le nouvel agent démarre avec messages=[], explore de son côté, et ne renvoie au parent que le résumé final. Le contexte du parent ne grandit que d'un seul message : « j'ai appelé l'outil task, il a retourné XXX ». Propre et efficace.
def run_subagent(prompt: str) -> str: sub_messages = [{"role":"user", "content": prompt}] # contexte tout neuf for _ in range(30): # plafond de sécurité response = client.messages.create(..., messages=sub_messages, tools=CHILD_TOOLS, ...) ... # on ne retourne que le texte final, tout le raisonnement intermédiaire est écarté return "".join(b.text for b in response.content if hasattr(b, "text"))
Comparaison des contextes parent et enfant
Ce widget simule une tâche concrète : « Lister tous les endroits dans ce dépôt qui appellent une API dépréciée. » Vous pouvez la lancer avec deux stratégies : (A) l'agent parent fait lui-même le travail ; (B) un subagent est spawné. Comparez ensuite la taille finale des deux contextes.
CHILD_TOOLS : quels outils le sous-agent reçoit-il ?
Dans l'implémentation de s04, un détail facile à rater : le sous-agent n'a pas accès à l'outil task.
# le sous-agent n'a accès qu'aux outils de base, pas de spawn récursif CHILD_TOOLS = [bash, read_file, write_file, edit_file] # l'agent parent dispose d'un outil task en plus PARENT_TOOLS = CHILD_TOOLS + [task]
Pourquoi ? Pour éviter que le dispatch récursif ne dégénère en arbre d'explosion. Un subagent qui spawne 4 sous-sous-agents, lesquels en spawnent eux-mêmes… en quelques itérations on obtient des dizaines d'appels concurrents que ni les tokens ni les rate limits de l'API ne peuvent absorber. La convention de s04 : le spawn est plat, parent → enfant, sur un seul niveau. Le vrai code de Claude Code fonctionne de la même façon — l'outil Task ne peut pas être appelé depuis l'intérieur d'un Task.
Ce qui est visible et ce qui ne l'est pas
Clarification des responsabilités : pour chacune des affirmations suivantes, est-elle vraie ou fausse ?