Tâches
Décrivez un travail, et Spunto lui donne une machine, une branche et un agent — puis vous rend quelque chose à relire.
Une tâche est un travail que vous confiez : « le bouton Ship déborde de sa carte sur mobile — corrige-le. »
Vous écrivez le prompt. Spunto trouve une machine, crée une branche, y lance un agent, et vous montre ce qui se passe au moment où ça se passe. Quand l’agent s’arrête, la tâche vous attend.
Ouvrez un projet et cliquez sur New task — ou ouvrez Agents, où la partie droite est une nouvelle conversation tant qu’aucune n’est sélectionnée. Seul le prompt est obligatoire.

Donnez autant de détails qu’à un collègue — le fichier que vous soupçonnez, à quoi ressemble « terminé », ce qu’il ne faut pas casser — et appuyez sur Entrée pour déléguer (Maj+Entrée pour un retour à la ligne). Vous pouvez coller ou déposer une capture d’écran directement dans le prompt ; le fichier arrive dans la sandbox et l’agent est informé de son emplacement.
Dès que la tâche est déléguée, la zone de saisie reste où elle est et la conversation commence au-dessus — c’est la même zone qui vous servira à répondre à l’agent.
Il n’y a pas de titre à remplir : la tâche démarre sous la première ligne de votre prompt, puis prend le nom que l’agent donne à la conversation dans les premières secondes. Vous pouvez la renommer à tout moment depuis le haut de la conversation.
Les puces sous le prompt sont des échappatoires : le harnais — Claude Code ou Codex, parmi ceux que le projet autorise —, le modèle et ses réglages si ce travail précis mérite plus gros que le modèle par défaut du projet, la branche de base si vous ne partez pas de la branche par défaut du dépôt, et la taille de sa sandbox. Sans taille choisie, c’est le réglage de l’organisation qui s’applique (Settings → Agents & tasks).
La tâche apparaît en Queued et avance d’elle-même. Tant qu’il n’y a pas encore de machine, la page
vous montre le démarrage lui-même — la création de la sandbox, l’image, le clonage de chaque dépôt,
vos commandes de setup. Puis la session démarre et la page se remplit.

Tout ce qui est à gauche, c’est la session pendant qu’elle tourne : ce que l’agent a dit, ce qu’il pensait, le plan qu’il suit, chaque outil appelé et ce qui en est revenu. À droite, ce qu’il vous faut pour en juger : quelle branche, combien de contexte il a consommé, ce qu’il a coûté jusqu’ici, quelle machine il a obtenue.
Une longue session est repliée plutôt que déversée. Douze lectures, six modifications et un lancement de tests se résument en une seule ligne qui dit ce qu’ils représentent — et laisse tout échec visible.

Dépliez n’importe quelle ligne pour retrouver les appels un par un, ou ouvrez la pile d’outils (tool stack) depuis l’en-tête de la session pour parcourir tous les appels de la session d’un coup — entrée et sortie complètes, filtrées par outil ou par sujet, avec un interrupteur pour ne garder que ceux qui ont échoué.

Quand la session se termine, la tâche passe en In review et s’arrête. L’onglet Diff, à côté de Session, répond à la seule question qui décide d’un Accept : qu’est-ce qui a changé ?

Trois choses à savoir sur ce que vous regardez :
- Il est lu depuis l’endroit où votre branche a divergé, pas depuis la pointe de
main. Les douze commits que quelqu’un d’autre a poussés pendant que l’agent travaillait ne font pas partie du diff de cette tâche. - Il va jusqu’à l’arbre de travail. Un agent qui a modifié dix fichiers sans commiter a modifié
dix fichiers, et vous les voyez. Les fichiers nouveaux qu’il n’a jamais ajoutés apparaissent en
untracked. - Spunto interroge la machine qu’il a démarrée, avec
git— pas votre forge. Un projet dont le remote est un Gitea sur le portable de quelqu’un se relit exactement de la même façon, et aucune pull request n’est nécessaire pour lire une branche.
Si votre projet met la machine de côté pendant la relecture, le diff l’indique et le panneau Machine est juste là pour la redémarrer.
Le diff vous dit ce qui a changé. Il ne vous dit pas si la CI est verte ni si quelqu’un a déjà laissé un commentaire — ça, c’est sur votre forge. Si votre projet est relié à une forge qui l’expose, un panneau à côté du diff montre la pull request ouverte pour cette branche : son état, ses checks, sa revue, son nombre de commentaires.
Il est en lecture seule, volontairement. Une pull request mergée ne passe pas la tâche en
done, et une pull request fermée ne la fait pas échouer. Quelqu’un qui merge depuis son téléphone
ne doit pas mettre de côté un conteneur que vous êtes en train de lire.
Deux boutons, et ce sont les seuls à faire passer une tâche au-delà de la relecture.
- Accept clôt la tâche en
done, en lançant d’abord la commande d’acceptation du projet s’il en a une —gh pr merge, un déploiement, ce que « terminer » veut dire chez vous. - Drop tue la session, lance votre commande de nettoyage et passe la tâche en
failedavec la raison.
done ou failed n’est pas une impasse. Tant que la sandbox de la tâche existe encore, la zone
de réponse reste ouverte : écrivez-y et la tâche repasse en relecture, sur la même machine, et
l’agent reprend la même conversation. La timeline marque l’endroit où elle a été reprise. Quand la
sandbox n’existe plus, la zone dit pourquoi.
Une tâche qui a échoué avant même que son agent ait démarré — la sandbox ne s’est pas construite, la branche n’a pas pu être créée — n’a pas de conversation à reprendre. Elle a à la place un bouton Retry, qui la relance depuis le début : même prompt, même branche.
En bas d’une tâche se trouve une zone de réponse. Écrivez « en fait, fais plutôt X » et le message part à l’agent — même conversation, même branche, même sandbox, redémarrée d’abord si le mode de relecture l’avait mise de côté. Ses événements prolongent la même timeline.
Avec la configuration par défaut, la session reste vivante entre deux tours : vous pouvez donc le dire pendant qu’il travaille encore, et vous pouvez interrompre le tour en cours sans tuer la session — il finit ce qu’il est en train de dire et vous attend, et c’est ce qui le distingue de Drop. Avec un harnais qui ne sait pas garder un stdin ouvert, la zone ne s’active qu’une fois la tâche en relecture ; quand elle est désactivée, elle indique pour quelle raison.
Vous pouvez joindre des fichiers à une réponse comme au prompt — coller, déposer, ou le trombone. L’agent renvoie aussi des fichiers : une capture d’écran qu’il a prise, un rapport qu’il a généré, affichés directement dans la timeline.
En bref : votre prompt, plus deux lignes, et rien d’autre. Pas de prompt système caché, pas de règles de style maison que vous n’avez pas écrites — et aucun skill que votre organisation n’a pas mis dans son propre catalogue de skills.
<your prompt>
---
Spunto context: you are running in a disposable worker, on branch
`task/fix-the-ship-button-a1b2c3` (created from `main`), already checked out.
When the work is done: commit on this branch and push it.Ces deux lignes ne sont pas de la même nature, et une seule vous appartient :
- La première, ce sont des faits — quelle branche, d’où elle vient, qu’elle est déjà extraite. Un agent ne peut pas les deviner depuis l’intérieur de son conteneur, donc ils sont toujours envoyés.
- La seconde est une consigne — ce que « terminé » veut dire. C’est un parti pris, et c’est à votre organisation de l’écrire.
Si vous avez joint des fichiers, une ligne de plus donne leurs chemins dans la sandbox : n’importe quel agent capable d’ouvrir un fichier peut s’en servir, quel que soit le protocole qu’il parle.
C’est tout. En particulier, Spunto ne demande pas à l’agent d’ouvrir une pull request : il ne lit aucune forge, donc l’exiger serait faire une hypothèse sur un outil dont il ne sait rien. Vous voulez une PR ? Demandez-la — c’est exactement à ça que sert le réglage ci-dessous.
Settings → Agents & tasks → Agent instructions, une zone de texte, réservée aux owners et aux admins. Ce que vous y écrivez remplace la ligne par défaut sur toutes les tâches que cette organisation délègue.

Par exemple :
When you are done: run `npm test`, commit on this branch, push it,
and open a pull request with `gh pr create --fill`.Écrivez-la dans la langue de travail de votre équipe — l’agent la suivra, et répondra, dans cette
langue. Elle est limitée à 4 000 caractères, parce qu’elle se paie à chaque session ; au-delà, c’est
un document, pas une consigne, et sa place est dans un CLAUDE.md que l’agent lit dans le checkout.
La ligne de faits est envoyée quoi que vous écriviez. Elle n’est pas à vous de la supprimer — un agent qui ne sait pas nommer sa propre branche ne l’apprendra pas d’un réglage.
Certaines choses ne valent que pour un dépôt — quelle suite de tests lancer, quel dossier ne jamais toucher. Mettez-les dans le champ Edit → Agent instructions du projet (avec les autres réglages des tâches). Elle est ajoutée après la consigne de l’organisation, jamais à sa place : l’organisation dit toujours ce que « terminé » veut dire partout, le projet ajoute seulement ce que ça veut dire ici. Mêmes règles par ailleurs — jusqu’à 4 000 caractères, lue au démarrage d’une tâche, vide veut dire que rien n’est ajouté.
Before pushing, run `npm test --workspace apps/api`. Never edit files under `vendor/`.La consigne d’organisation ci-dessus est un bloc de texte, pas des fichiers. Les fichiers arrivent jusqu’à l’agent parce que Spunto lui donne une machine qui ressemble à la vôtre — tout ce que vous gardez déjà sous gestion de versions vient avec le clone —, plus les skills que votre organisation partage :
| Quoi | D’où ça vient |
|---|---|
CLAUDE.md, AGENTS.md | votre dépôt — cloné dans la sandbox comme n’importe quel autre fichier |
.claude/skills/, .claude/agents/, .claude/settings.json | votre dépôt, de la même façon |
| Skills partagés entre projets | les sources de skills de votre organisation — des dépôts git clonés dans chaque sandbox, chaque projet choisissant les skills qu’il utilise, rafraîchis avant chaque tâche |
Skills personnels, alias, configuration ~/.claude/ | votre dépôt de dotfiles (Account settings → Dotfiles), cloné et lié dans $HOME à la mise en place de la sandbox — et il l’emporte sur un skill d’organisation du même nom |
ANTHROPIC_API_KEY et compagnie | les secrets de votre projet ou de votre organisation |
Toujours pas injectés : les définitions de sous-agents et settings.json — ils viennent de votre
dépôt ou de vos dotfiles.
Il y a donc deux endroits où mettre des consignes permanentes, et ils répondent à des questions
différentes. Agent instructions, c’est à quoi ressemble un travail fini dans cette
organisation (plus, par projet, une ligne ou deux sur ce dépôt) — pour les tâches déléguées
seulement. Un CLAUDE.md commité, c’est comment fonctionne ce code — aussi long que vous voulez,
et il sert à quiconque travaille dans le dépôt, vous compris dans votre propre éditeur.
Toutes les tâches de l’organisation sont sur une seule page — Agents dans la barre latérale —, regroupées par état et, dans un groupe, de la plus récemment active à la plus ancienne. La dernière session à vous avoir rendu la main est la première ligne sous In review, quelle que soit l’ancienneté de la délégation.

La page d’un projet montre la même liste limitée à ce projet, et sur un téléphone l’ensemble devient une messagerie — conversations en plein écran, zone de réponse au-dessus du clavier, machine et prompt à un toucher.
Une tâche possède sa sandbox jusqu’à ce qu’elle soit done ou failed — y compris pendant que
vous la relisez. Confier la machine à quoi que ce soit d’autre écraserait les données de test, les
artefacts et l’arbre de travail que vous avez ouvert la relecture pour regarder.
Ce qu’elle devient pendant la relecture est un réglage du projet :
- Keep it running (par défaut) — reprise instantanée, au prix d’une machine allumée.
- Stop it — la sandbox s’arrête, son
/workspacereste, un clic la redémarre.
Une fois une tâche acceptée, sa sandbox est détruite ; celle d’une tâche en échec est arrêtée et conservée, et c’est pourquoi vous pouvez encore reprendre la tâche. Chaque tâche démarre depuis le build du projet, ou depuis un de vos snapshots — déjà prête, en quelques secondes.
Tout ce qui relève d’un parti pris dans une tâche est un réglage du projet, sous Edit → Agents → Delegated work. Sans y toucher, vous avez Claude Code, lu en direct pendant qu’il travaille.
| Réglage | Sans y toucher… | Valeurs possibles |
|---|---|---|
| Harnais | Claude Code | Claude Code, Codex, ou les deux — le premier est celui par défaut, chaque tâche peut en choisir un autre |
| Modèle par défaut | l’app choisit le sien | un modèle de chaque harnais, par ex. claude-opus-5-5 |
| Commande d’acceptation | Accept clôt simplement la tâche | gh pr merge, glab mr merge, un déploiement |
| Commande d’abandon | la session est simplement tuée | le nettoyage dont vous avez besoin |
| Machine pendant la relecture | laissée allumée | arrêtée |
Une nouvelle organisation arrive avec Claude Code installé ; Codex est à un clic dans Settings →
Integrations. Chacun lit sa propre clé dans vos secrets : ANTHROPIC_API_KEY pour Claude Code,
OPENAI_API_KEY pour Codex.
Choisir entre les agents, leurs modèles et leurs réglages, piloter les tâches par l’API, essayer tout le cycle sans forge ni identifiants — tout cela est dans Tâches avancées.
curl -X POST \
-H "Authorization: Bearer spk_..." \
-H "Content-Type: application/json" \
-d '{"prompt":"The invite email says “You has been invited”. Fix the verb form."}' \
https://spunto.net/api/orgs/{orgId}/projects/{projectId}/tasksL’appel répond tout de suite — allouer une machine et lancer un agent prend des minutes, et tourne
comme un job de fond durable. Interrogez GET .../tasks/{taskId}, ou regardez simplement la page.
Les clés d’API ont besoin des scopes tasks:read / tasks:write. tasks:write lance une session
d’agent dans une sandbox, donc donne un accès équivalent à un shell — c’est pour ça qu’il n’est
volontairement pas inclus dans projects:write.
- Pas de permissions interactives. C’est pourquoi les agents tournent sans elles — un « puis-je lancer ceci ? » n’a encore nulle part où recevoir de réponse.
- Pas de sortie token par token. Les événements arrivent tour par tour, pas mot par mot.
- Pas de notifications. C’est vous qui venez à la page ; la page ne vient pas à vous.