lardon3d/docs/development/opencode_long_run.md
2026-08-09 00:34:51 +02:00

3.1 KiB

OpenCode long run

ocaway lance OpenCode 1.18.15 pour un ticket autonome tout en conservant les interdictions destructives du projet. Le mode normal opencode reste inchangé.

Lancement

Le wrapper suivi par le dépôt est .opencode/bin/opencode-away. Il doit être installé sous ~/.local/bin/opencode-away, puis l'alias contenu dans .opencode/zshrc.snippet doit être ajouté à ~/.zshrc. Ces deux destinations sont des symlinks vers les dotfiles utilisateur sur cette machine.

Depuis la racine d'un dépôt Git :

ocaway

Les arguments sont transmis tels quels à OpenCode. Le wrapper exporte LARDON_OPENCODE_LONG_RUN=1, suspend uniquement les processus swayidle qui étaient actifs, puis lance :

systemd-inhibit \
  --what=sleep:idle:handle-lid-switch \
  --who="OpenCode Long Run" \
  --why="Autonomous Lardon3D development ticket" \
  --mode=block \
  opencode --auto

systemd 261 supporte les trois inhibitions demandées. La configuration locale utilise HandleLidSwitch=suspend et laisse LidSwitchIgnoreInhibited à sa valeur par défaut yes, compatible avec l'inhibiteur block. Aucun fichier systemd ou logind n'est modifié.

Le wrapper enregistre les PID swayidle qui n'étaient pas déjà stoppés, leur envoie SIGSTOP, puis restaure exactement ces PID avec SIGCONT à la sortie, sur INT, TERM ou HUP. Le code retour du processus OpenCode est conservé.

opencode-away --check vérifie les préconditions sans lancer OpenCode ni suspendre swayidle. OPENCODE_AWAY_COMMAND est un seam de test réservé aux validations du wrapper ; en usage normal il est absent.

Permissions et sécurité

La configuration est une allowlist : les outils et commandes inconnus sont refusés, et --auto ne peut pas contourner un refus. Restent interdits : privilèges root, gestion de paquets, Git destructif ou publiant, suppression, arrêt de processus ou machine, écriture externe, .git/ et scan3d/. Les écritures normales restent dans le worktree courant.

Les sous-agents approuvés sont autorisés explicitement par leur identifiant. Chaque agent possède ses propres règles ; il n'hérite pas implicitement d'une permission plus large du parent.

Mémoire et handoff

Le ticket courant est résumé dans .opencode/work/current_ticket.md après chaque phase. Avant une session fraîche, .opencode/work/handoff.md contient l'architecture pertinente, les décisions, fichiers, tests, échecs, travail restant et la prochaine action exacte.

Les sorties d'outils sont plafonnées et compactées. Les validations lourdes sont séquentielles : ciblé, normal, ASan/UBSan, TSan, stress, revue et docs.

Limites

Une inhibition empêche sleep, idle et la réaction logind au capot tant que le wrapper et sa session utilisateur vivent. Elle ne garantit pas la survie du processus si le terminal ou toute la session graphique est détruite. Aucun tmux n'est créé automatiquement.

Si une dépendance externe manque, si un secret est requis ou si une opération explicitement interdite devient nécessaire, le ticket s'arrête avec un handoff au lieu de contourner la restriction.