asymmetric env operates on environments: named
compositions of clones. An environment’s membership is the source of truth, so
these commands work at the environment level instead of clone by clone.
env spin
environment.yaml, spin every clone it declares (in order), and
record the environment with those clones as members. The spec’s path is stored on
the environment as its source.
partial, and the command exits 1.
The spec is strict — anything not yet supported is a clear error, not a silent
no-op:
| In the spec | Result |
|---|---|
Unknown key (e.g. clone:) | Unknown key(s): 'clone' (did you mean 'clones'?) |
Empty clones (zero entries) | Hard error — a spec must declare at least one clone. |
identity: / data: blocks | Hard error — shared identity / BYOD data not supported yet. |
| Malformed or empty YAML | A clear ENV_SPEC_INVALID error. |
env status
env destroy
1 if any member failed. Removing the last
member drops the environment.
env reset
reset <id>,
applied across the whole environment). Continue-all: every member is attempted,
failures print to stderr, and the command exits 1 if any member failed. The
environment is stamped running when all members reset, partial if any failed.
Ad-hoc environments
You don’t need a spec file. Tag clones into an environment as you spin them — each joins the named environment:acme (with spec: null), and the
env status / env destroy commands operate on them as a unit.
Errors you might see
| Error | Cause |
|---|---|
ENV_SPEC_INVALID | The environment.yaml is unreadable, malformed, has an unknown key, or uses a not-yet-supported section. The message says exactly what to fix. |
DOCKER_UNAVAILABLE | Docker isn’t running. |
TEMPLATE_NOT_FOUND | A clones[].template isn’t in the catalog. |
Not yet
Two declared-but-not-yet-enforced spec sections fail loudly rather than silently no-op: sharedidentity: across clones, and bring-your-own data:
(an external Postgres). Both are on the roadmap — see
Environments. Multi-clone env spin and
env reset already work today.