CPN Org — Flux parallèles
Fan-out parallèle sur workspaces jj isolés + PR indépendantes (gh pr). Base
cpn-dev-workflow.
When to Use
- Modif décomposable en units indépendants.
- Agents parallèles (
delegate_task) sans copie partagée. - Dépendances : B←A → depth (stack) ; C←A+B → join (multi-parents).
Modèle : DAG, jj exécuteur
- Fan-out : enfants d'un commit trunk = units indépendants.
- Depth : enfant d'un enfant = unit dépendante ; chaîne racine→feuille = CHAÎNE, 1 PR par lien (land en ordre de dépendance).
- Join : enfant de plusieurs parents (
jj new <a> <b>) = dépend de plusieurs flux ; land après. - Isolation : chaque flux dans son PROPRE workspace jj (copie + commit séparés, même dépôt/graphe) ; conflit évité par construction.
- Test d'indépendance : indépendant ssi fichiers disjoints des siblings ET n'importe aucun de leur NOUVEAU code ; sinon depth ou join (merge).
Procedure
Arbre avant le travail : décompose contre le ledger de l'issue ; écris l'arbre (trunk, units, arêtes) dans plan/
todoavec les gates par feuille AVANT tout fan-out.Fan-out : TOUJOURS nouveau workspace jj nommé
<repo-name>.<unit>:jj workspace add ../<repo-name>.<unit> --name <repo-name>.<unit>Commit de copie = enfant du
@courant ; depth > 1 →jj new <parent>.Travaille chaque flux dans son workspace ; commit via
cpn-commit(conventionnel, signé SSH). TrailerCo-authored-by: Automata <automata@shikanime.studio>si applicable.Land — push
origin, PRs draft avec--head cloud-pi-native:<branch>; voircpn-dev-workflow/cpn-pr) : exécuter d'abord la vérification doublon / pile decpn-pr(étape 1b) — PR existante couvrant l'unité = pousser dessus ou empiler, jamais une seconde PR pour le même changement.Unit indépendant → bookmark propre + PR standalone (ou stack mono-membre).
Chaîne dépendante → un bookmark par lien, puis :
jj bookmark set <next> -r <next> gh pr create --repo cloud-pi-native/console --base main \ --head "cloud-pi-native:<next>"Liaison PR↔issue via
cpn-pr:Refs #Npar défaut.
Vérifie bottom-up : chaque feuille lance ses checks DANS son workspace ; le dispatcher re-vérifie via
terminal(un sous-agent qui dit « done » n'est pas une preuve). Fin :jj workspace forget <name>; à la traîne :jj workspace update-stale.
Fan-out via delegate_task
Chaque enfant reçoit : chemin du workspace, gates de l'unit, forme du commit
(conventionnel + trailer Automata). Le parent re-vérifie chaque gate via
terminal dans chaque workspace avant de déclarer terminé. Un task par feuille
; le goal porte le contrat. NE VER fusionner deux feuilles dans un seul
goal. Exemple : references/delegate_task.md.
Pitfalls
- Units pseudo-indépendants (fichiers qui se chevauchent) → conflits au join ; corrige la décomposition, pas le conflit.
- Workspaces partagent le dépôt — bookmarks/graphe GLOBAUX : 1 bookmark par unit, jamais 2 flux sur 1 bookmark.
- Fan-out avant les contrats — enfants sans gates reproduit la défaillance d'enforcement que les gates empêchent.
Verification
jj workspace list && jj log -r 'all()' --limit 20
gh pr list --state open # une PR par feuille
DAG = arbre planifié ; chaque feuille a une PR liée ; chaque gate a une preuve in-workspace.
See also
cpn-dev-workflow— parent ; gate de validation d'hypothèses AVANT le fan-out.cpn-commit/cpn-pr— forme du commit (trailer Automata) et liaison PR.sks-async— jumeau shikanime (plain-English).