For the sandbox operator only. Turns an approved sandbox request into a running sandbox, and removes it at expiry. Application developers never run this skill. They file requests with ember-app-onboard and wait for the operator.
When to Use
- A
Sandbox request: <slug>issue is open inATL-Trip-Planner/ember-platform-skills. - A sandbox has reached its expiry date or is no longer needed.
- Your regular expiry review, every 30 to 60 days.
What to Say
- "Show open sandbox requests."
- "Validate and plan sandbox request #12."
- "Provision sandbox request #12."
- "Tear down the sandbox for my-app."
- "Which sandboxes are expiring?"
What Happens
- The agent lists open requests and asks which one to work on.
- It validates the request against the developer's
ember-project.yamlat the requested commit. It also reruns context lint and the secret scan on a fresh checkout. Failures go back to the developer through the issue. - It shows the plan: ten steps, each
READYorBLOCKED, with the exact commands and resource names. Commands not yet confirmed against the provider are markedUNVERIFIED. - You confirm the run. A confirmation covers one run only.
- It runs the
READYsteps in order and stops at the first failure. Every resource is recorded as soon as it exists, so a partial run can always be reversed. - Two steps need you:
- creating the Render Blueprint instance in the dashboard
- sending the invites, confirming each person's email with them directly
- When everything is done, it comments on the issue and closes it. The developer then moves their project to the
sandboxtier.
Teardown shows every live resource in reverse order. After you confirm, it removes them and marks the register torn-down.
What Is Blocked Today
Steps 3 to 10 report BLOCKED until these exist:
- the sandbox Supabase organization
- the Render workspace and the Vercel team identifiers
- the
atl.comCloudflare zone agreement and the Zero Trust plan - the
*.sandbox.tde.atl.comdomain - the sandbox Entra registration
Record each identifier in your operator config as it becomes available.
Setup
- Copy
config/sandbox.example.yamlto~/.ember/sandbox-operator.yamland fill in identifiers as they exist. Every value starts asMISSING. - Put tokens in environment variables, never in the file. The config names them:
RENDER_API_KEYandCLOUDFLARE_API_TOKENby default. - Sign in to
gh, and to the Supabase and Vercel CLIs, as yourself. - Keep a clone of the Ember repository at
~/gitroot/ember. The register is written there.
What It Never Does
- Touch a production account. Stop if an identifier looks like production.
- Run a step without your confirmation.
applyandteardownrefuse without--confirm. - Create anything outside the register, so teardown always knows what exists.
- Print, store, or pass tokens, passwords, connection strings, or emails. Secrets go straight into GitHub secrets over standard input.
- Grant more than least privilege: sandbox accounts only, Developer roles, and no Vercel team membership.
What It Changes
| Where | What |
|---|---|
| Supabase, Render, Vercel, Cloudflare | sbx-<slug> resources and the <slug>.sandbox.tde.atl.com hostname |
| The application repository | SBX_ GitHub secrets |
~/gitroot/ember/docs/operations/sandbox-register/<slug>.yaml | What was created, by whom, and when it expires. Names, IDs, and GitHub logins only |
| The request issue | A result comment, then closed |
Run It Without an Agent
node ~/gitroot/ember-platform-skills/skills/ember-sandbox-provision/scripts/provision.mjs requests
node ~/gitroot/ember-platform-skills/skills/ember-sandbox-provision/scripts/provision.mjs plan <issue>
node ~/gitroot/ember-platform-skills/skills/ember-sandbox-provision/scripts/provision.mjs apply <issue> --confirm
node ~/gitroot/ember-platform-skills/skills/ember-sandbox-provision/scripts/provision.mjs teardown <slug>
node ~/gitroot/ember-platform-skills/skills/ember-sandbox-provision/scripts/provision.mjs expiring --days 30Common Problems
| You see | Do this |
|---|---|
BLOCKED: ... MISSING | Record the identifier in ~/.ember/sandbox-operator.yaml once it exists. The plan names who owns it |
Refused: ... needs --confirm | Review the plan, then rerun with --confirm |
ACTION on step 4 | Create the Blueprint instance in the Render dashboard, then rerun apply |
ACTION on step 9 | Send the invites, then rerun with --invites-done |
| A run stopped partway | Fix the cause and rerun apply. Recorded resources are skipped, or tear down from the register |
| Validation fails | Comment on the issue with the failing fields. Do not fix the developer's repository yourself |