feat(sandbox): scoped agents provisioned by the checkpoint cycle #82

Merged
arcodange merged 1 commits from arcodange/prod-apply into main 2026-08-09 19:42:06 +02:00
Owner

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.ai/code/session_01VRShc4QhLLU73FLHx9vskh

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
arcodange added 1 commit 2026-08-09 19:41:54 +02:00
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
arcodange merged commit e2e913b82c into main 2026-08-09 19:42:06 +02:00
arcodange deleted branch arcodange/prod-apply 2026-08-09 19:42:06 +02:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: arcodange-org/erp#82