[đ ] AI Orchestration #5: Jâai repensĂ© la sĂ©paration coordinateurâworkers que jâavais abandonnĂ©e
⚠Résumé de GPT-5.6 Sol
Le rĂ©cit dâune division du travail abandonnĂ©e quand les messages ont fait perdre son contexte au coordinateur, puis repensĂ©e autour de rapports sur fichiers et de commits rĂ©servĂ©s au coordinateur aprĂšs le goulot dâĂ©tranglement dâune session unique.
Jâavais renoncĂ© Ă sĂ©parer le coordinateur et les workers
Le mois dernier, jâai rĂ©ellement reliĂ© un coordinateur Ă plusieurs workers. Un objectif Ă©tait divisĂ© en plusieurs tĂąches, puis le coordinateur examinait et intĂ©grait ce que les workers avaient implĂ©mentĂ©.
La division du travail elle-mĂȘme Ă©tait rapide. Les fonctions indĂ©pendantes pouvaient ĂȘtre dĂ©veloppĂ©es simultanĂ©ment, tandis que le coordinateur ne sâoccupait que de la direction gĂ©nĂ©rale du produit et de lâintĂ©gration. Le problĂšme venait de la maniĂšre dont les workers transmettaient leurs rĂ©sultats.
Chaque fois quâils terminaient ou se retrouvaient bloquĂ©s, ils envoyaient un rapport dans la session du coordinateur. Cela me paraissait naturel au dĂ©but. Mais plus leur nombre augmentait, plus les rapports sâaccumulaient dans la conversation, et chaque nouveau message interrompait le travail en cours pour attirer lâattention vers une autre tĂąche.
Je lisais le rĂ©sultat de test dâun worker, passais au conflit de Git index dâun autre et recevais un troisiĂšme rapport juste au moment de revenir Ă lâimplĂ©mentation initiale. La conversation sâallongeait rapidement. Ă mesure que les compactages se rĂ©pĂ©taient, il fallait davantage de temps pour reconstruire lâobjectif, les interdictions de dĂ©ploiement et lâĂ©tat actuel du stage. Le coordinateur ressemblait finalement moins Ă un intĂ©grateur quâĂ un guichet chargĂ© de traiter les messages des workers.
Jâai fini par abandonner la sĂ©paration elle-mĂȘme. Jâai mĂȘme supprimĂ© impulsivement la Skill de coordination que jâavais créée. Je pensais quâen faisant tout dans une seule session principale, le contexte ne serait au moins plus tirĂ© dans plusieurs directions.
Revenir à une seule session a montré pourquoi la division était nécessaire
Pourtant, en poursuivant un grand travail produit dans une session unique, le goulot dâĂ©tranglement opposĂ© est apparu immĂ©diatement.
ImplĂ©mentation, tests, cohĂ©rence documentaire, vĂ©rification sur appareils physiques et prĂ©paration du Runtime devaient ĂȘtre traitĂ©s successivement par la mĂȘme session. Si une question de prioritĂ© ou une transmission provenant dâune autre session arrivait en chemin, il fallait dâabord reconstruire lâĂ©tat du travail en cours. Finir soigneusement une tĂąche allongeait lâensemble ; traiter lâurgence dâabord exigeait de dĂ©cider jusquâoĂč clore le travail existant.
Le problĂšme nâĂ©tait pas la division du travail. Garder mĂȘme des tĂąches indĂ©pendantes dans une seule session Ă©tait inefficace. SĂ©parer coordinateur et workers restait la solution la plus efficace, mais rĂ©tablir la structure oĂč les workers entraient directement dans la conversation actuelle du coordinateur ne ferait que rĂ©pĂ©ter lâĂ©chec.
Cette fois, au lieu dâabandonner la division, jâai dĂ©cidĂ© de supprimer la voie de transmission qui interrompait le contexte du coordinateur.
Une notification dâune ligne ouvrait la mĂȘme porte
Jâai dâabord pensĂ© quâun worker pouvait envoyer une ligne courte plutĂŽt quâun long rapport.
READY task-042: chemin du rapport
Mais la longueur nâĂ©tait pas le problĂšme. DĂšs quâun message entrait dans la conversation du coordinateur, Codex pouvait facilement le traiter comme un contexte plus rĂ©cent que le travail en cours. MĂȘme une seule ligne conservait la mĂȘme porte dâentrĂ©e vers un changement de tĂąche.
Les workers nâenvoient donc plus de message au coordinateur. Les Ă©tats de fin, de blocage et dâĂ©chec sont Ă©crits uniquement dans des fichiers de rapport. Le coordinateur ne consulte lâinbox quâaprĂšs avoir amenĂ© son propre travail jusquâĂ un checkpoint ou un commit sĂ»r.
LâarrivĂ©e dâun rapport nâest pas un Ă©vĂ©nement qui interrompt le travail actuel. Elle ajoute simplement un fichier Ă la prochaine file dâexamen.
Les Worktrees Ă©taient propres, mais sâĂ©loignaient de lâĂ©tat le plus rĂ©cent
Jâai ensuite envisagĂ© un Worktree et une Branch distincts pour chaque worker. Le Git index et les changements non commitĂ©s ne se mĂ©langeaient pas ; en apparence, câĂ©tait la solution la plus propre.
Mais un problĂšme plus important surgissait dans les vrais projets. Plusieurs fonctions modifiaient continuellement la mĂȘme API, le mĂȘme schema et le mĂȘme Ă©cran. Les amĂ©liorations terminĂ©es dans une session nâĂ©taient pas immĂ©diatement visibles dans les autres Worktrees. Chacun travaillait proprement, mais lâintĂ©gration rĂ©vĂ©lait une pile de modifications construites sur dâanciennes structures. Le volume de retouches devenait alors franchement pĂ©nible.
Jâai donc choisi la structure opposĂ©e.
Un seul main Working Tree
ââ Plusieurs workers voient ensemble les changements les plus rĂ©cents
ââ Les workers ne modifient que les fichiers et hunks attribuĂ©s
ââ Les workers ne font ni stage ni commit
ââ Seul le coordinateur examine, stage et commit
Un Working Tree partagĂ© sâemmĂȘle aussi immĂ©diatement sans limites. Par dĂ©faut, un fichier nâa quâun writer ; les modifications parallĂšles du mĂȘme fichier ne sont permises que si les hunks sont clairement sĂ©parĂ©s. Les schemas communs, le nettoyage des imports, les formatters et les changements qui dĂ©placent le code environnant sont sĂ©rialisĂ©s.
Les tests exĂ©cutĂ©s par un worker ne constituent pas non plus une preuve finale. Ils peuvent avoir Ă©tĂ© lancĂ©s en prĂ©sence des changements non commitĂ©s dâun autre worker. Chaque worker vĂ©rifie son pĂ©rimĂštre ; le coordinateur gĂšle lâensemble des changements puis exĂ©cute une fois la rĂ©gression complĂšte et le build.
Les rapports sont devenus des contrats de revue
Jâai reconstruit la Skill de coordination supprimĂ©e selon ces principes. La nouvelle Skill custom-coordinate-parallel-workers contient ce flux.
Le coordinateur attribue un task id, le rĂ©sultat attendu par lâutilisateur et les chemins accessibles en Ă©criture. Le worker termine lâimplĂ©mentation, la vĂ©rification ciblĂ©e et le nettoyage des processus temporaires, puis crĂ©e atomiquement un rapport et sâarrĂȘte. Ce rapport liste les fichiers rĂ©ellement modifiĂ©s, les rĂ©sultats des contrĂŽles, les chevauchements, le pĂ©rimĂštre inachevĂ© et un commit proposĂ©.
Le coordinateur ne relit pas toutes les conversations. Il consulte dâabord dans lâinbox le task id, lâĂ©tat, le titre et le rĂ©sumĂ© des contrĂŽles, puis choisit une tĂąche Ă intĂ©grer. Il confirme que le rapport correspond au diff rĂ©el avant de stage et commit uniquement les hunks exacts.
Lorsquâun candidat de release est choisi, un freeze bloque les nouvelles mutations des workers. Au lieu de rĂ©pĂ©ter les tests complets tandis que les changements continuent dâarriver, la documentation du current state, la rĂ©gression complĂšte, le build et la vĂ©rification du dĂ©ploiement commencent lorsque lâensemble de release ne bouge plus.
Le rapport nâest plus un simple journal de travail. Il est devenu le contrat de revue qui permet au coordinateur de faire confiance au changement et de le faire passer Ă lâĂ©tat suivant.
Il faut maintenant le faire fonctionner sur un vrai travail
Jâai testĂ© les outils de gestion dâĂ©tat de la Skill dans un environnement temporaire isolĂ©. La fin normale, les conflits de chemins accessibles en Ă©criture, la reprise aprĂšs une demande de modification, le refus dâun freeze pendant lâexĂ©cution et le report au batch suivant ont tous fonctionnĂ©.
Je nâai toutefois pas encore exploitĂ© plusieurs vraies sessions Codex de cette maniĂšre. La prochaine tĂąche parallĂšle devra montrer si les rapports uniquement sur fichiers perturbent moins le contexte du coordinateur et si la propriĂ©tĂ© des chemins dans le Working Tree partagĂ© est respectĂ©e comme prĂ©vu.
La conclusion ressemble Ă mon point de dĂ©part, mais la raison est dĂ©sormais plus claire. Il faut sĂ©parer le coordinateur des workers. Ce nâest pas la division du travail qui a Ă©chouĂ©, mais lâenvoi en temps rĂ©el de chaque rapport dans la conversation actuelle du coordinateur.
Le changement attendu nâest pas simplement de lancer davantage de workers. Il consiste Ă laisser le coordinateur prĂ©server son contexte jusquâĂ la fin de son propre travail. La vitesse du travail parallĂšle dĂ©pendait moins du nombre de workers que du nombre de fois oĂč la personne chargĂ©e dâintĂ©grer leurs rĂ©sultats Ă©tait dĂ©tournĂ©e.
Laisser un commentaire