docs(adr): ADR-0003 — sandbox state lifecycle (iso-prod seed, reset & prod-write isolation)
Records how erp-sandbox's DATA is seeded, reset, and kept structurally incapable of harming prod — the application-data-layer complement to ADR-0001 (which rejected an in-cluster sandbox for INFRA rehearsal) and the lifecycle for the erp-sandbox instance ADR-0002 stood up. Decision: (1) iso-prod golden via read-only pg_dump of prod erp, app-scoped to llx_*; (2) reset = DROP OWNED BY erp_sandbox_role CASCADE + pg_restore --no-owner --role=erp_sandbox_role into the EXISTING db (no DROP/CREATE DATABASE, no CREATEDB, no superuser; provisioner-owned infra objects like the pgbouncer user_lookup function are left untouched); (3) prod-write isolation as a structural invariant (superuser only in human-gated postgres.yaml CI; DROP DATABASE gated by ownership — erp_sandbox_role owns only erp-sandbox, never prod erp/erp_role; sandbox-scoped Dolibarr key; membership-only runtime creds; host-guard; resettability); plus a human-gated promote via the read-only dolibarr-data-snapshot diff under a separate prod-write credential. The reset mechanism + the integrity invariant were validated against the live erp-sandbox: DROP OWNED BY erp_sandbox_role + app-scoped pg_restore round-trips to the golden checkpoint using only erp_sandbox_role membership (superuser=false, createdb=false, not a member of erp_role), proving prod is structurally unreachable from the sandbox credential. Drafted via a clean-context agent; mechanism refined from a live prototype. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
# Architecture Decision Records
|
||||
|
||||
> **Status**: 🟢 Active
|
||||
> **Last Updated**: 2026-06-25
|
||||
> **Last Updated**: 2026-06-28
|
||||
> **Related**: [vibe/PRD](../PRD/README.md) · [vibe/Investigations](../investigations/README.md)
|
||||
> **Historical**: [doc/adr](../../doc/adr/README.md) (foundational infra) · [ansible/.../docs/adr](../../ansible/arcodange/factory/docs/adr/) (dated infra ADRs)
|
||||
|
||||
@@ -35,6 +35,7 @@ When a new decision *supersedes* one of the historical records, write the new AD
|
||||
| --- | --- | --- | --- |
|
||||
| [0001](0001-safe-prod-like-environment.md) | Safe, production-like environment | 🟢 Accepted | 2026-06-23 |
|
||||
| [0002](0002-per-application-environments.md) | Per-application environments | 🟢 Accepted | 2026-06-25 |
|
||||
| [0003](0003-sandbox-state-lifecycle.md) | Sandbox state lifecycle | 🟢 Accepted | 2026-06-28 |
|
||||
|
||||
## Rules to contribute
|
||||
|
||||
|
||||
Reference in New Issue
Block a user