Boucle équipe
Ce parcours sert à faire avancer une story, un épic ou un atelier d'évolutions par une boucle à trois rôles : un analyste, un développeur senior et un ingénieur QA se relaient sur le pipe OPALE. Vous y venez quand vous voulez que l'agent enchaîne le travail au lieu de le conduire pas à pas.
Le moteur n'exécute aucun agent lui-même : il rend le contrat de l'acte suivant, votre agent l'exécute (avec un sous-agent s'il en a), puis rapporte le résultat.
Ce que vous demandez à l'agent
« Lance la boucle équipe sur l'épic courant. »
« Fais tourner l'équipe sur cette story seulement, avec pnpm test et pnpm lint comme barre. »
effortless_crew_initgoal=cette storybar={"test":"pnpm test","lint":"pnpm lint"}
« Où en est la boucle ? Qui doit agir maintenant ? »
effortless_crew_status« Montre-moi la trace complète de ce qui s'est passé dans la boucle. »
« Classe la tâche TSK-03 en complexe, palier profond, effort élevé, et dis-moi quel modèle ça donne. »
effortless_task_classifytask_id=TSK-03complexity=complexcapability_tier=deepeffort_level=high
« Génère un profil de fournisseurs à partir du preset claude, pour ce projet seulement. »
« Montre-moi les presets de fournisseurs disponibles et mon profil actuel. »
effortless_provider_presets_list« Lance la boucle autonome sur les tâches simples du backlog. »
Ce que fait l'agent
Démarrer la boucle équipe
effortless_crew_initreçoitgoal(l'objectif, repris dans chaque consigne de rôle) etscope:story,epic(défaut),allouworkshop.max_rounds(100 par défaut) etmax_epics(3 par défaut) plafonnent la boucle ;0veut dire illimité.bardéclare la barre mécanique : un objet qui associe un nom (test,lint,typecheck,build) à une commande, ou à un objet aveccommandet éventuellementcwdoustack. Il faut au moins une commande, et elle doit pouvoir s'exécuter : une commande non mesurée ne serait jamais verte et le QA ne pourrait jamais rendrego.force: trueécrase une boucle déjà initialisée.- En périmètre
all, quand il n'y a plus d'épic à livrer, la boucle entre dans l'atelier d'évolutions et gradue un axe en épic suivant, jusqu'àmax_epics.
Faire un tour de boucle
effortless_crew_steprend le contrat de l'acte courant : le rôle qui doit agir, le modèle et l'effort recommandés, la sortie attendue, etprompt_path, le chemin d'un fichier qui contient la consigne (une cléprompt). L'agent lit ce fichier avant de lancer le sous-agent. Appelé deux fois,effortless_crew_steprend deux fois la même chose : il n'avance rien.documentvise un document de cadrage précis.- Le rôle exécute l'acte.
effortless_crew_reportrapporte le résultat :role(analyst,developerouqa, celui que l'étape attend),verdict(donepour l'analyste et le développeur,goouno-gopour le QA),summary, etpayload(la sortie structurée du rôle). Pour une charge trop volumineuse,payload_pathdésigne un fichier JSON à la place, jamais les deux.effortless_crew_reportmesure la barre mécanique avant de rendre la main ; l'appel peut être long. Il rend directement l'acte suivant.- À la livraison, le moteur commite lui-même le travail de la tâche, puis la clôture. Il répète le tour jusqu'à ce que le périmètre soit couvert ou qu'un plafond soit atteint. Trois
no-gode suite arrêtent la boucle.
Suivre la boucle
effortless_crew_statuslit l'état sans rien changer : étape, rôle attendu, pointeur épic / story / tâche, compteurs, plafonds, raison de fin (scope_covered,epics_exhaustedourounds_exhausted,nulltant que la boucle tourne) et ledger daté des actes. Par défaut, seuls les derniers actes sont rendus ;full: truerend la trace complète.
Router une tâche vers un palier de modèle
effortless_task_classifyclasse une tâche de la story active sur un ou plusieurs axes :complexity(simpleoucomplex),capability_tier(deep,standardoulight),effort_level(low,mediumouhigh). Il en faut au moins un ; un axe absent reste inchangé.effortless_task_route_showrend la recommandation résolue : palier et effort, traduits en modèle concret et en effort natif par votre profil de fournisseurs (profil du projet d'abord, puis profil global). Sans classement, le défaut eststandard/medium. C'est une suggestion, jamais une obligation.
Régler les fournisseurs
effortless_provider_presets_listliste les presets embarqués et personnalisés.effortless_provider_profile_showlit votre profil actif.effortless_provider_profile_init(re)génère le profil, une matrice palier × effort, depuis une famille de preset :claude,codex,gemini,mistralou un nom libre.scopevautglobal(défaut) ouproject. Un profil existant n'est écrasé qu'avecforce: true.
La boucle autonome
C'est une boucle plus simple, qui prend les tâches du backlog une à une.
effortless_loop_initla démarre avec ungoal.effortless_loop_stepla fait avancer : Plan, Implémentation, Recette, Livraison. À la recette, elle jouetest_command(par défaut, le cycle de test du modèle de la première stack). Une tâche non classée doit d'abord l'être, une tâche complexe se décompose en tâches simples. Quand les tests passent, la boucle tente de commiter la tâche. Après trop d'échecs de recette, elle s'arrête.
Ce que vous obtenez
- Le travail avance tâche après tâche, avec un commit de livraison par tâche et une clôture quand l'épic est fini.
- Un état de boucle et un ledger horodaté, relisibles à tout moment par
effortless_crew_status. - Dans l'app, vous suivez la progression dans Tâches, Backlog et Tableau de bord.
- Un profil de fournisseurs dans votre dossier personnel (profil global) ou dans le projet (profil projet).
Quand l'agent est refusé
| Situation | Ce que dit le refus | Ce qu'il faut faire |
|---|---|---|
| Le projet est en mode semi-auto | Message « outil d'exécution désactivé », marqué gated, pour crew_init, crew_step, crew_report, loop_init, loop_step | Passer le projet en mode full. |
| Périmètre inconnu | crew:scopeInvalid | Passer scope parmi story, epic, all, workshop. |
| Aucun épic actif | crew:noActiveEpic | Activer un épic avec effortless_epic_activate, ou relancer avec scope: "workshop". |
| Une boucle existe déjà | crew:alreadyInitialized | Passer force: true pour l'écraser. |
| Aucune commande de barre | crew:barMissing | Passer bar, par exemple {"test": "…", "lint": "…"}. |
| La barre ne peut pas s'exécuter | crew:barUnrunnable, qui nomme l'exécutable fautif | Corriger les commandes nommées dans bar, puis relancer. |
cwd de la barre absolu ou hors du projet | crew:barCwdInvalid | Relancer effortless_crew_init avec un bar.cwd relatif à la racine du projet. |
| Chemin d'une stack introuvable | crew:stackPathMissing | Créer l'arborescence nommée, ou corriger le path de la stack avec effortless_stack_add. |
| Aucune boucle initialisée | crew:notInitialized | Lancer effortless_crew_init. |
| Rôle ou verdict inconnu | crew:roleUnknown ou crew:verdictUnknown | Passer role parmi analyst, developer, qa ; verdict parmi go, no-go, done. |
| Le rôle rapporté n'est pas celui attendu | crew:roleMismatch | Rapporter avec le rôle attendu ; effortless_crew_step le nomme. |
| Rapport sur une étape sans acteur | crew:stageHasNoActor | Appeler effortless_crew_step pour connaître l'acte réellement attendu. |
payload et payload_path ensemble | crew:payloadPathEtPayload | N'en fournir qu'un des deux. |
payload_path introuvable, hors du projet, trop gros ou mal formé | crew:payloadPathIntrouvable, crew:payloadPathHorsPerimetre, crew:payloadPathTropGros, crew:payloadPathJsonInvalide, crew:payloadPathRacineNonObjet | Pointer un fichier JSON du projet dont la racine est un objet (4 Mio au plus). |
| Code déclaré absent de la branche | crew:filesNotIntegrated | Lancer effortless_worktree_reintegrate depuis le worktree qui porte le travail, puis relancer le rapport. |
| Le commit de livraison est refusé | crew:commitRefused | Lever la cause que git nomme dans le refus, puis relancer le rapport. |
| Livraison interrompue, rapport d'un autre rôle | crew:deliveryResumeRequiresQaGo | Reprendre par le rapport qa / go qui a pu l'amorcer. |
| Profil de fournisseurs déjà présent | create:providerExists | Passer force: true pour l'écraser. |
| Portée de profil invalide | common:scopeInvalid | Passer scope à global ou project. |
| Profil de projet sans projet | common:projectNotInitialized | Initialiser le projet, ou viser la portée global. |