Environment.members), never on the clone — one source of truth, so
the two can’t drift.
Shape
Two ways to create one
Declaratively, from a version-controlled spec. List as many clones as you want —env spin brings them up in declared order:
env command reference for the full surface.
How env spin behaves
The spin is sequential and continue-all: each clone is created and joined to
the environment before the next is started, and one member’s failure doesn’t
abort the rest.
- Every
create()self-persists, so a crash mid-spin still leaves a real environment holding the members spun so far. - A failed member is rolled back (never recorded), and the environment is stamped
partial; the command exits non-zero.
The schema is strict
Theenvironment.yaml schema rejects anything it can’t actually honor,
loudly, rather than parsing it and silently doing nothing:
Declared-but-unbuilt features fail loudly on purpose. For an eval product, a
silently-ignored
identity: block would make results quietly wrong. A clear error
is the honest behavior until the feature is real.On the roadmap
A shared cross-clone identity graph (one set of users/org spanning every member) and bring-your-own Postgres data are reserved in the schema but not yet enforced. The data model and theenvironment.yaml schema already make room
for them, so nothing about today’s shape has to change when they ship.
The registry
Environments and clones are both persisted to~/.asymmetric/registry.json
(schema-versioned, migrated on read). See
Clones, environments, and the registry.