Complète le modèle de rôles côté sandbox, et referme la troisième panne des sessions 2026-07/08 : un rafraîchissement effaçait les droits accordés à la main, sans que rien ne les enregistre — la sandbox perdait donc silencieusement des capacités que personne n'avait écrites.
Ce qui lande
ai_agent_sandbox_read (36 droits) et ai_agent_sandbox_sandbox_write (44 droits) provisionnés depuis test/scopes.ts. Vérifiés fonctionnellement sur la sandbox vivante : le lecteur lit et prend 403 sur une création de facture ; le writer crée un brouillon et prend 403 sur DELETE.
checkpoint-provision.sh recrée les deux agents scopés après chaque refresh — leurs droits viennent du code, plus de la mémoire de quelqu'un. L'échec d'un scope avertit sans faire échouer tout le checkpoint.
checkpoint-relink-env.sh pointe le skill d'écriture sur la clé scopée, avec repli sur la clé mono-utilisateur historique pour qu'un ancien checkout continue de fonctionner. Le skill opère désormais comme ai_agent_sandbox_sandbox_write (id 6).
Vérifié après la bascule de credentials : le pipeline de promote répète sur la sandbox sous le writer scopé, et apply refuse toujours sans gate humain enregistré.
Deux points assumés
Le login redondant ai_agent_prod_prod_write est documenté comme délibéré : renommer un credential de production déjà provisionné imposerait de créer un second utilisateur privilégié et de repointer le promote — de la churn pour du cosmétique.
Laissé dans la sandbox : la facture brouillon id=19, sonde de vérification du scope. Elle ne peut pas être supprimée (aucun scope n'accorde DELETE — c'est le principe) et le prochain refresh la récupère.
Complète le modèle de rôles côté sandbox, et referme la **troisième panne** des sessions 2026-07/08 : un rafraîchissement effaçait les droits accordés à la main, sans que rien ne les enregistre — la sandbox perdait donc silencieusement des capacités que personne n'avait écrites.
**Ce qui lande**
- **`ai_agent_sandbox_read`** (36 droits) et **`ai_agent_sandbox_sandbox_write`** (44 droits) provisionnés depuis `test/scopes.ts`. Vérifiés fonctionnellement sur la sandbox vivante : le lecteur lit et prend **403** sur une création de facture ; le writer crée un brouillon et prend **403** sur `DELETE`.
- **`checkpoint-provision.sh`** recrée les deux agents scopés après chaque refresh — leurs droits viennent du code, plus de la mémoire de quelqu'un. L'échec d'un scope avertit sans faire échouer tout le checkpoint.
- **`checkpoint-relink-env.sh`** pointe le skill d'écriture sur la clé scopée, avec repli sur la clé mono-utilisateur historique pour qu'un ancien checkout continue de fonctionner. Le skill opère désormais comme `ai_agent_sandbox_sandbox_write` (id 6).
**Vérifié après la bascule de credentials** : le pipeline de promote répète sur la sandbox sous le writer scopé, et `apply` refuse toujours sans gate humain enregistré.
**Deux points assumés**
Le login redondant `ai_agent_prod_prod_write` est documenté comme délibéré : renommer un credential de production déjà provisionné imposerait de créer un second utilisateur privilégié et de repointer le promote — de la churn pour du cosmétique.
Laissé dans la sandbox : la facture brouillon `id=19`, sonde de vérification du scope. Elle ne peut pas être supprimée (aucun scope n'accorde `DELETE` — c'est le principe) et le prochain refresh la récupère.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01VRShc4QhLLU73FLHx9vskh
Completes the role model on the sandbox side, and closes the third failure of
the 2026-07/08 sessions: a refresh wiped hand-granted rights and nothing
recorded them, so the sandbox silently lost capabilities nobody had written down.
- Provisioned `ai_agent_sandbox_read` (36 rights) and
`ai_agent_sandbox_sandbox_write` (44 rights) from test/scopes.ts.
Verified functionally on the live sandbox: the reader reads and gets
403 on invoice creation; the writer creates a draft and gets 403 on DELETE.
- checkpoint-provision.sh now re-creates both scoped agents after every
refresh, so their rights come from code rather than from someone's memory.
Failure to provision a scope warns instead of aborting the whole checkpoint.
- checkpoint-relink-env.sh points the write skill at the scoped writer key,
falling back to the legacy single-user key so an older checkout still works.
The write skill now operates as ai_agent_sandbox_sandbox_write (id 6).
Smoke-tested end to end after the credential swap: the promote pipeline
rehearses on the sandbox under the scoped writer, and `apply` still refuses
without a recorded human gate.
The redundant `ai_agent_prod_prod_write` login is documented as deliberate:
renaming a provisioned production credential means creating a second privileged
user and repointing the promote flow — churn for cosmetics.
Left behind in the sandbox: draft invoice id=19, a scope probe. It cannot be
deleted (no scope grants DELETE, which is the point) and the next refresh
reclaims it.
Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01VRShc4QhLLU73FLHx9vskh
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Complète le modèle de rôles côté sandbox, et referme la troisième panne des sessions 2026-07/08 : un rafraîchissement effaçait les droits accordés à la main, sans que rien ne les enregistre — la sandbox perdait donc silencieusement des capacités que personne n'avait écrites.
Ce qui lande
ai_agent_sandbox_read(36 droits) etai_agent_sandbox_sandbox_write(44 droits) provisionnés depuistest/scopes.ts. Vérifiés fonctionnellement sur la sandbox vivante : le lecteur lit et prend 403 sur une création de facture ; le writer crée un brouillon et prend 403 surDELETE.checkpoint-provision.shrecrée les deux agents scopés après chaque refresh — leurs droits viennent du code, plus de la mémoire de quelqu'un. L'échec d'un scope avertit sans faire échouer tout le checkpoint.checkpoint-relink-env.shpointe le skill d'écriture sur la clé scopée, avec repli sur la clé mono-utilisateur historique pour qu'un ancien checkout continue de fonctionner. Le skill opère désormais commeai_agent_sandbox_sandbox_write(id 6).Vérifié après la bascule de credentials : le pipeline de promote répète sur la sandbox sous le writer scopé, et
applyrefuse toujours sans gate humain enregistré.Deux points assumés
Le login redondant
ai_agent_prod_prod_writeest documenté comme délibéré : renommer un credential de production déjà provisionné imposerait de créer un second utilisateur privilégié et de repointer le promote — de la churn pour du cosmétique.Laissé dans la sandbox : la facture brouillon
id=19, sonde de vérification du scope. Elle ne peut pas être supprimée (aucun scope n'accordeDELETE— c'est le principe) et le prochain refresh la récupère.🤖 Generated with Claude Code
https://claude.ai/code/session_01VRShc4QhLLU73FLHx9vskh