🤖 Agents IA

agent-task-decomposer

Décomposition automatique de tâches complexes en sous-tâches pour distribution aux sous-agents.

⚡ Installation & lancement en 1 commande

Copiez-collez dans votre terminal : le skill s'installe dans ~/.claude/skills et Claude Code se lance directement dessus.

macOS / Linux
curl -fsSL https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.sh | sh -s -- agent-task-decomposer --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } agent-task-decomposer -Launch"

🚀 Déjà installé ?

claude "/agent-task-decomposer"

Ou tapez /agent-task-decomposer dans une session Claude Code, ou décrivez simplement votre besoin — le skill se déclenche automatiquement via le skill-router.

🔑 Déclencheurs automatiques

Le skill s'active automatiquement quand votre demande contient :

décomposer tâchetask decompositiondécouper en sous-tâchesdiviser le travailplan d'exécution agentagent plannerwork breakdown agent

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/skills/agent-task-decomposer ~/.claude/skills/

Payload du plugin : skills/agent-task-decomposer · source éditable : agent-skills/task-decomposer

📖 Manuel

Agent Task Decomposer

Quand l'utiliser

Utiliser ce skill quand une tâche est trop vaste ou hétérogène pour un seul agent : longue durée estimée, compétences multiples requises, ou parties indépendantes parallélisables. Indispensable avant tout dispatch vers des sous-agents.

Seuil pratique : si la tâche dépasse ~3 min d'exécution ou implique >2 domaines distincts (recherche + code + validation), décomposer.

Choisir la bonne stratégie

StratégieQuand l'utiliserExemple
sequentialChaque étape dépend de la précédentePipeline ETL : extract → transform → load
parallelToutes les parties sont indépendantesAnalyser 10 fichiers log simultanément
treeDécomposition récursive avec agrégation finaleRapport multi-sections avec résumé global
dagMix de parallèle et séquentiel, dépendances complexesBuild CI : tests parallèles → package → deploy

Critère de décision rapide :

toutes indépendantes → parallel
chaîne stricte → sequential
branches qui se rejoignent → tree ou dag

Workflow

1. Analyser la tâche principale

Avant de couper quoi que ce soit, répondre à ces questions :

Si l'objectif est ambigu, clarifier d'abord. Une mauvaise décomposition coûte plus cher qu'une question posée.

2. Identifier et nommer les sous-tâches

Règles d'atomicité :

Modèle de données minimal :

class SubTask(BaseModel):
    id: str                        # ex: "T1", "T2"
    name: str                      # verbe + complément
    description: str
    depends_on: list[str]          # IDs des sous-tâches dont le résultat est requis
    expected_output: str           # format précis du livrable
    capability: str                # "search" | "code" | "write" | "validate" | "transform"
    complexity: Literal["low", "medium", "high"]

3. Modéliser les dépendances (DAG)

Construire le graphe et vérifier l'absence de cycles avant toute exécution :

import networkx as nx

def build_and_validate_dag(subtasks: list[SubTask]) -> nx.DiGraph:
    G = nx.DiGraph()
    for t in subtasks:
        G.add_node(t.id, label=t.name)
        for dep in t.depends_on:
            G.add_edge(dep, t.id)
    if not nx.is_directed_acyclic_graph(G):
        cycles = list(nx.simple_cycles(G))
        raise ValueError(f"Cycles détectés : {cycles}")
    return G

def execution_batches(G: nx.DiGraph) -> list[list[str]]:
    """Retourne des groupes de tâches exécutables en parallèle."""
    return [list(gen) for gen in nx.topological_generations(G)]

def critical_path(G: nx.DiGraph) -> list[str]:
    return nx.dag_longest_path(G)

Exemple de plan Mermaid généré automatiquement :

def to_mermaid(subtasks: list[SubTask]) -> str:
    lines = ["graph TD"]
    for t in subtasks:
        lines.append(f'  {t.id}["{t.name}"]')
        for dep in t.depends_on:
            lines.append(f"  {dep} --> {t.id}")
    return "\n".join(lines)

Résultat :

graph TD
  T1["extraire_entités"]
  T2["analyser_sentiments"]
  T3["générer_rapport"]
  T1 --> T3
  T2 --> T3

4. Estimer complexité et allouer les ressources

ComplexitéModèle recommandéTokens estimésTimeout
lowclaude-haiku / gpt-4o-mini~50015 s
mediumclaude-sonnet / gpt-4o~2 00060 s
highclaude-opus / o3~8 000180 s

Calculer le coût total estimé sur le chemin critique uniquement — les branches parallèles ne s'additionnent pas.

5. Assigner aux sous-agents

Mapper capability → agent spécialisé. Load-balancing si plusieurs agents ont la même capacité :

def assign_tasks(subtasks: list[SubTask], agents: dict[str, list]) -> dict[str, str]:
    """agents = {"search": [AgentA, AgentB], "code": [AgentC]}"""
    workload: dict = {}
    assignments: dict = {}
    for t in subtasks:
        candidates = agents.get(t.capability, [])
        if not candidates:
            raise ValueError(f"Aucun agent disponible pour '{t.capability}'")
        agent = min(candidates, key=lambda a: workload.get(a.id, 0))
        assignments[t.id] = agent.id
        workload[agent.id] = workload.get(agent.id, 0) + 1
    return assignments

6. Exécuter avec checkpoints inter-batches

Ne jamais lancer le batch N+1 sans valider le batch N :

async def execute_plan(batches: list[list[str]], run_task, validate):
    results = {}
    for batch in batches:
        batch_results = await asyncio.gather(
            *[run_task(task_id, results) for task_id in batch],
            return_exceptions=True
        )
        for task_id, result in zip(batch, batch_results):
            if isinstance(result, Exception) or not validate(task_id, result):
                raise RuntimeError(f"Échec sur {task_id} : {result}")
            results[task_id] = result
    return results

7. Re-planning dynamique en cas d'échec

Si une sous-tâche échoue sur le chemin critique :

  1. Retry avec paramètres différents (modèle plus puissant, prompt reformulé)
  2. Sous-décomposition : découper cette sous-tâche en parties plus petites
  3. Fallback : résultat dégradé acceptable pour continuer
  4. Arrêt contrôlé : remonter l'erreur avec contexte complet (ne pas échouer silencieusement)
async def handle_task_failure(task: SubTask, plan, results):
    # Tentative 1 : retry avec modèle supérieur
    if task.complexity != "high":
        return await retry_with_upgrade(task, results)
    # Tentative 2 : sous-décomposition
    finer = decompose_further(task)
    return await execute_plan(build_and_validate_dag(finer), ...)

Anti-patterns et garde-fous

Anti-patternSymptômeCorrection
Sous-tâches trop coupléesÉtat partagé mutable entre tâchesChaque sous-tâche reçoit ses inputs en paramètre, retourne ses outputs sans side-effect
Décomposition trop fineDizaines de micro-tâches de <2 sFusionner : granularité cible ≥ 10 s d'exécution par sous-tâche
Dépendances ignoréesExécution "tout parallèle" qui produit des résultats incohérentsToujours modéliser le DAG, même pour 3 tâches
Plan rigideÉchec total au premier imprévuPrévoir retry + fallback sur chaque nœud du chemin critique
Livrable non vérifiableÉchec silencieux non détectéexpected_output doit être testable (schéma JSON, assertion, checksum)
Re-planning infiniBoucle de sous-décompositions récursivesLimiter à 2 niveaux de re-planning ; au-delà, escalader à l'humain

Bonnes pratiques 2026