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.