Skip to main content
Four verbs control a clone after it’s been spun. All take a clone id and fail with CLONE_NOT_FOUND if it doesn’t exist.

reset

asymmetric reset <id>
Returns a clone to a clean, seeded state without a rebuild — the fastest way to start the next trial from identical input. It drops the database (terminating live connections), recreates it, re-runs all migrations, restarts the backend to rebind its connection pool, waits for health (90s), and re-applies the clone’s last seed if it had one.
  ✓ reset slack-a1b2 (dropped, re-migrated, re-seeded)
ErrorCause
CLONE_NOT_FOUNDNo clone with that id.
HEALTH_TIMEOUTThe backend didn’t come back healthy in 90s.
CLONE_START_FAILEDA drop/recreate/migrate/restart step failed.

start

asymmetric start <id>
Starts a previously stopped clone. Runs docker compose up -d with the clone’s saved ports and marks it running. Silent on success.
ErrorCause
CLONE_NOT_FOUNDNo clone with that id.
CLONE_START_FAILEDcompose up failed.

stop

asymmetric stop <id>
Stops a running clone without destroying its data. Runs docker compose stop (volumes preserved) and marks it stopped. Silent on success. Bring it back with start.
ErrorCause
CLONE_NOT_FOUNDNo clone with that id.
CLONE_START_FAILEDcompose stop failed.

destroy

asymmetric destroy <id>
Tears a clone down completely: docker compose down -v (containers + volumes), drops the database, frees its ports, and removes it from the registry.
  ✓ destroyed slack-a1b2
destroy is irreversible. The database and all seeded data are dropped. Use stop if you only want to pause a clone.
ErrorCause
CLONE_NOT_FOUNDNo clone with that id.

How they relate

  spin ──▶ [running] ──stop──▶ [stopped] ──start──▶ [running]
              │                                          │
              │◀───────────────── reset ─────────────────┤  (clean + re-seed)
              │                                          │
              └──────────────── destroy ────────────────┘  (gone)