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

76 lines
3.1 KiB
Markdown

# 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 :
```sh
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 :
```sh
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.