aims/skills/dev-orchestrator/task-distribution/SKILL.md
Découper un ticket en tâches atomiques, assigner aux dev-workers selon leur spécialisation et charge actuelle, gérer les dépendances entre tâches. Ce skill est utilisé par dev-orchestrator pour transformer un ticket client (en provenance du clientele ou du backlog) en un ensemble de tâches parallélisables assignées aux dev-worker-1 et dev-worker-2. Utiliser ce skill chaque fois qu'un ticket arrive prêt à être développé, ou qu'il faut rééquilibrer les tâches en cas de blocage.
npx skillsauth add SomtechSolutionMAxime/somtech-pack task-distributionInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Le dev-orchestrator est responsable de fragmenter un ticket en tâches qui peuvent être travaillées en parallèle ou en séquence. Une mauvaise décomposition crée des goulots, des attentes inutiles, ou pire : des workers qui se marches dessus. Une bonne décomposition maximise le parallélisme et laisse chaque worker avancer de façon prévisible.
Une tâche atomique satisfait trois critères :
Une tâche trop petite (30 minutes) crée trop de context-switching. Une tâche trop grosse (8+ heures) bloque le parallélisme.
Recevoir le ticket de clientele ou consulter le backlog, extraire :
TICKET: [ID client + titre]
DESCRIPTION: [Qu'est-ce qu'il faut faire]
ACCEPTANCE_CRITERIA: [Comment on sait que c'est bon]
DÉPENDANCES EXTERNES: [Attend-on une réponse client, une data, une API tierce ?]
SPIKE ESTIMÉ: [Combien de temps pour explorer l'inconnu ?]
Chaque tâche tombe dans un domaine technique :
| Domaine | Description | Worker assigné par défaut | |---------|-------------|--------------------------| | Frontend | Composant React, form, navigation, UI/UX | worker-1 (expert frontend) | | Backend | API endpoint, business logic, SQL, validation | worker-2 (expert backend) | | Database | Migration SQL, RLS, index, schema | worker-2 (accès SQL direct) | | Testing | Tests e2e, tests unitaires, fixtures | Au spec du ticket | | Documentation | README, spec technique, changelog | Peut être fait par n'importe quel worker |
Pour chaque domaine identifié, créer une tâche avec un titre clair et un scope délimité.
Template de décomposition :
{
"ticket_id": "TK-145",
"title": "Ajouter système de promotions (codes promo)",
"tasks": [
{
"task_id": "TSK-145-1",
"sequence": 1,
"domain": "backend",
"title": "Créer table promos et API",
"description": "Table PostgreSQL promos avec colonnes: code, discount_percent, valid_from/to, max_uses. Endpoint POST /api/promos/validate pour vérifier qu'un code est valide.",
"acceptance_criteria": [
"Table créée avec RLS",
"Endpoint retourne 200 si code valide, 400 si expiré/utilisé",
"Tests e2e pour les 2 cas"
],
"depends_on": [],
"estimated_hours": 2,
"assigned_to": "dev-worker-2"
},
{
"task_id": "TSK-145-2",
"sequence": 2,
"domain": "frontend",
"title": "Formulaire de code promo en checkout",
"description": "Ajouter un champ texte + bouton 'Appliquer' dans le formulaire de checkout. Intégrer l'API /validate pour vérifier le code en temps réel. Afficher le discount calculé.",
"acceptance_criteria": [
"Champ visible et focusable",
"Validation en temps réel sans rechargement",
"Affiche le discount ou message d'erreur clair",
"Tests e2e du flux complet"
],
"depends_on": ["TSK-145-1"],
"estimated_hours": 2,
"assigned_to": "dev-worker-1"
},
{
"task_id": "TSK-145-3",
"sequence": 3,
"domain": "documentation",
"title": "Documenter le système de promos",
"description": "README expliquant comment créer une promo, limites, edge cases. Ajouter un exemple de payload API.",
"acceptance_criteria": [
"README sections: API, Edge cases, Limitations",
"Exemple de curl pour créer une promo",
"Exemple de réponse API"
],
"depends_on": ["TSK-145-1"],
"estimated_hours": 1,
"assigned_to": "dev-worker-2"
}
]
}
Chaque worker a une charge maximale et des spécialités. Avant d'assigner une tâche :
1. Consulter la charge ACTUELLE des deux workers (voir sprint-coordination)
2. Vérifier la spécialité du domaine
3. Appliquer les règles d'équilibre
| Domaine | Worker-1 (Frontend expert) | Worker-2 (Backend expert) | Préférence | |---------|---------------------------|--------------------------|-----------| | Frontend | ⭐⭐⭐ | ⭐ | Assign à worker-1 | | Backend | ⭐ | ⭐⭐⭐ | Assign à worker-2 | | Database | ⭐ | ⭐⭐⭐ | Assign à worker-2 (accès SQL) | | Testing | ⭐⭐ | ⭐⭐ | Flexible, considérer la charge | | Documentation | ⭐ | ⭐ | Flexible, lead worker si dispo |
Si un worker est surchargé et que la tâche pourrait être faite par l'autre :
Un worker ne doit JAMAIS recevoir plus de 12 heures de tâches simultanées (estimation = fiction, la vraie durée peut être 1.5x). Maximum 3-4 tâches par cycle.
Quand dev-orchestrator crée une tâche pour un worker, elle est insérée dans desk_tasks via task.assign :
{
"task_type": "task.assign",
"from_agent": "dev-orchestrator",
"to_agent": "dev-worker-1",
"priority": "high",
"silo": "client-acme",
"trace_id": "tr_145_abc",
"payload": {
"task_id": "TSK-145-2",
"ticket_id": "TK-145",
"branch": "feat/promotions-v1",
"title": "Formulaire de code promo en checkout",
"description": "Ajouter un champ texte + bouton 'Appliquer' dans le formulaire de checkout...",
"acceptance_criteria": [
"Champ visible et focusable",
"Validation en temps réel sans rechargement",
"Affiche le discount ou message d'erreur clair",
"Tests e2e du flux complet"
],
"depends_on": ["TSK-145-1"],
"depends_on_status": {
"TSK-145-1": "pending"
},
"estimated_hours": 2,
"context": {
"api_endpoint": "/api/promos/validate",
"response_sample": "{\"valid\": true, \"discount_percent\": 10}",
"ui_location": "components/checkout/PromoField.tsx",
"related_pr": null,
"blockers_known": []
}
}
}
| Champ | Type | Pourquoi |
|-------|------|---------|
| task_id | uuid | ID unique pour Desk et logs |
| ticket_id | string | Traçabilité au ticket original |
| branch | string | Le worker sait sur quelle branche travailler |
| acceptance_criteria | array | Pas d'ambiguïté sur "complète" |
| depends_on | array | Liste les tâches bloquantes |
| context | object | API endpoints, fichiers à modifier, exemples de réponse |
Hard : La tâche A doit attendre que la tâche B soit terminée ET mergée. Exemple : frontend attend que le backend expose un endpoint.
Soft : La tâche A peut commencer avant B mais elle progresse plus vite si B est prête. Exemple : tests peuvent être écrits avant que la feature soit complète.
Stratégie 1 : API stub
Si le frontend attend un endpoint, le worker-1 crée un mock endpoint (/api/promos/validate retourne toujours {valid: true}) pour pouvoir tester le formulaire. Le worker-2 remplace le stub par la vraie logique plus tard.
Payload pour notifier du stub :
{
"task_type": "task.update",
"from_agent": "dev-worker-1",
"to_agent": "dev-orchestrator",
"payload": {
"task_id": "TSK-145-2",
"status": "in_progress",
"blocker": "waiting_for_api",
"workaround": "Created mock endpoint at /api/promos/validate (stub)",
"can_proceed": true
}
}
Stratégie 2 : Paralléliser les indépendances
Si deux tâches n'ont pas de dépendance, les assigner immédiatement.
Stratégie 3 : Extraire un spike
Si le chemin de dépendance est incertain (ex: "on ne sait pas encore comment l'API va répondre"), créer une tâche de spike court (30 min) pour clarifier la contrat avant de coder.
Après décomposition, afficher le graphe pour vérifier la criticalité :
TSK-145-1 (backend, ~2h) ← CRITIQUE
↓
TSK-145-2 (frontend, ~2h) ← dépend de TSK-145-1
↓
TSK-145-3 (docs, ~1h) ← peut en parallèle de 145-2
CHEMIN CRITIQUE: TSK-145-1 → 145-2 (4h total)
CHEMIN PARALLÈLE: Rien (tous les chemins dépendent du backend)
Idéal = chemins parallèles. Pire = tous les chemins en série.
Rapporter ces métriques (voir silo-logging) après chaque décomposition :
{
"action": "task.decomposed",
"meta": {
"ticket_id": "TK-145",
"task_count": 3,
"avg_hours": 1.67,
"critical_path_hours": 4,
"dependencies": 2,
"workers_assigned": 2,
"parallel_potential": 0.67
}
}
Interpréter parallel_potential : 0 = tout en série (mauvais), 1 = complètement parallèle (idéal). Ici 0.67 = 67% des tâches peuvent se faire en parallèle.
tools
Documentation de référence SomCraft — DMS Markdown-native avec AI, MCP server, et Studio. À consulter pour toute question sur l'architecture, les APIs, les concepts, ou l'exploitation d'une instance SomCraft. TRIGGERS : somcraft, dms, document management, workspace somcraft, studio somcraft, mcp somcraft, api somcraft
tools
Déployer une instance SomCraft pour un client existant (migrations Supabase + Fly.io + skills). Orchestre 7 phases : pré-flight, plan, migrations, seed, déploiement, smoke tests, installation des skills. TRIGGERS : deploy-somcraft, déployer somcraft, installer somcraft, somcraft client, setup somcraft, upgrade somcraft, status somcraft
tools
Génère l'intégralité de la configuration d'un silo SomTech : docker-compose, services Fly.io, constitutions d'agents, et templates d'environnement. Valide les métadonnées d'application avant génération. À utiliser après validation initiale du client et avant déploiement.
development
Exécute le déploiement complet d'une silo après sa génération : conteneurs Docker, environnement de développement Fly.io, branche Git, et configuration Netlify. Transforme les configs générées en infrastructure active avec URLs stables et builds automatisés.