Ce qui se passe
Mitchell Hashimoto, créateur de Ghostty, publie la spécification d'une nouvelle séquence d'échappement : OSC 7501, le Program Status Protocol. Elle permet à n'importe quel programme de dire à son terminal ce qu'il fait — au repos, en cours, terminé, en échec ou bloqué — et pourquoi.
Le problème
Builds, déploiements, mises à jour de paquets et, de plus en plus, agents de code alternent travail autonome, attente de l'utilisateur et fin de tâche, pendant que l'utilisateur fait autre chose. Une nouvelle famille d'outils, que l'auteur appelle « boîtes de réception d'agents » (Herdr, cmux, Agent Deck…), affiche l'état de tous les agents en cours. Sans protocole, ces outils n'ont que deux options :
- deviner, en lisant l'écran ou le titre de la fenêtre. Herdr documente ses règles : seize pour Claude Code seul, dont la première repère un caractère de spinner en tête du titre. Le fichier a changé dix fois en trois mois, au rythme des icônes de Claude Code ;
- passer par une API hors du terminal, un socket local par exemple. C'est plus fiable, mais chaque programme doit s'intégrer à chaque outil, et un socket local ne traverse ni SSH ni un conteneur sans passerelle.
Le protocole
Le programme écrit la séquence sur son pty, comme du texte. Un terminal correct
ignore les OSC qu'il ne connaît pas : l'émettre ne casse rien. Le corps est une
liste de paires clé=valeur séparées par :, dont une seule obligatoire, state :
state |
Sens |
|---|---|
idle |
au repos, attend la prochaine instruction |
working |
en cours, avec éventuellement un progress en pourcentage |
done |
terminé, résultat pas encore consulté |
blocked |
attend l'utilisateur ; kind vaut permission, question ou auth |
error |
échec, arrêt |
Parmi les clés facultatives : app, un nom stable comme cargo ou claude-code,
et msg, une ligne lisible encodée en base64. Des identifiants hiérarchiques
permettent plusieurs états simultanés : un outil de déploiement working à la
racine, avec us-east à 40 % et eu-west bloqué en attente d'approbation. L'état
clear efface un enregistrement.
Comment s'y prendre
L'auteur donne une fonction shell POSIX qui enveloppe rsync :
status() {
printf '\e]7501;state=%s:msg=%s\e\\' "$1" "$(printf '%s' "$2" | base64 | tr -d '\n')"
}
status working "Syncing photos"
rsync -a ~/Photos backup:/photos && status done "Photos synced" || status error "rsync failed"Ni SDK, ni socket, ni variable d'environnement, ni JSON. La spécification, courte, couvre aussi la durée de vie des enregistrements, la détection de prise en charge, terminfo, les limites de taille et la sécurité.
Les limites
C'est une proposition, pas un standard. Deux implémentations existent, dans libghostty et dans Rex, l'outil de Superlogical. Les intégrations à Terraform, Claude Code, Codex et Homebrew sont des preuves de concept, par plugin ou par fork, d'une douzaine de lignes chacune selon l'auteur. Des mainteneurs de terminaux ont relu le texte ; leur adoption reste à venir.
Source : A Terminal Protocol for Program Status (OSC 7501), Mitchell Hashimoto, 6 octobre 2026, repéré via Lobste.rs.