setup
Wire a repository to an environment. Once.
/veris:setup
/veris:setup stripe asanaIn Codex that is $veris:setup.
Run it from the repository you want to test. Setup works out which vendors your code calls, creates an environment holding a twin of each, and wires your test suite to reach them. Service names are optional: they are a starting list, and setup reads the code either way and shows you the final list before it creates anything.
The two tiers
How your tests reach those twins depends on what your code does with a vendor’s address, and setup settles that before it builds anything. There are two tiers, and this page is where the rest of the documentation sends you for them.
| Tier | Chosen when | What it wires |
|---|---|---|
| Container | Any vendor hostname is baked into your code or an SDK it calls. The usual path | A test image, with veris run putting the proxy beside the container |
| Direct | Every vendor call on the tested path builds its URL from a variable production already sets | The sandbox’s address, in those same variables. No image and no proxy |
Your application is not edited on either of them, and the addresses Veris sets are ones your code already reads. The container tier reroutes outbound traffic from outside the process, so a call to a vendor hostname the control plane serves keeps that hostname. A twin the plane serves no hostname for — a database or another data plane, and any vendor twin whose hostnames the plane does not carry — is reached the other way on either tier: its URL is handed to your code in the environment variable production already sets for it. On the container tier the run names that twin and the variable its value went to; on the direct tier that handoff is the whole wiring.
The container tier needs Docker running. Everything else setup checks itself —
that the veris CLI is installed and signed in with veris login, that the
environment exists, and, where a container is involved, that there is a usable
test image — and it reports what is missing in one pass rather than one failure
at a time. It asks before it installs anything or creates an environment.
Setup is not finished until something shows your own code’s call arriving at the
twin. On the container tier that is the run’s receipt, naming your service with a
count above zero. Setup records that service as require_service, so a green test
whose receipt does not name it exits 3 instead of passing.
The direct tier has no proxy in front of the command and so no receipt. There
the twin’s trace carries it: after the smallest real call your code can make,
the trace has to show that call. An empty trace under a green test means the
traffic went to the real vendor.
Every check it makes, and the order it makes them in, is in the
setup skill.
What it leaves behind
| File | Commit it? |
|---|---|
.veris/twin.yaml | Yes |
.veris/setup.json | Yes |
.veris/NOTES.md | Yes |
Dockerfile.veris | Yes, if it exists |
.veris/twin.local.yaml | No, gitignored for you |
.veris/bin/, .veris/tasks/ | No, gitignored for you |
.veris/twin.yaml holds this project’s environments and, under each, the
settings a run inherits: the test image, the service a run has to reach, the
recorded test command. veris run fills in from there whatever its command line
leaves out. .veris/twin.local.yaml is per-machine and remembers the sandbox this
folder is using. Dockerfile.veris appears only if getting a working test image
took real work.
.veris/NOTES.md is worth reading. It records what the twin cannot represent,
how identity and matching work for this vendor, which errors your code should
expect, and where your existing tests do not actually reach the vendor. Each item
is marked as measured or not measured, so you can tell what was checked from what
was assumed.
Running what it wired
The container tier’s loop is three commands:
veris up
veris run
veris downveris run takes the test command, the image and the service the run has to
reach from .veris/twin.yaml, so the daily line carries none of them as flags.
veris run --fresh does the three in one process, for CI. Both are covered in
Running tests.
The direct tier has no proxy to put in front of the command, so the sandbox’s addresses go into the environment your application already reads and your tests run the way they always ran:
veris up
eval "$(veris sandbox exports)"
pytest -qveris sandbox exports prints one export NAME='url' line per twin, valued at
this sandbox, and nothing else on stdout; --format dotenv prints KEY=value
lines for an env file, and a twin with no variable to publish is named on stderr
rather than skipped silently. Set them wherever your application’s environment
actually comes from — a shell, an env file, a platform’s secrets pane.
The names are the plane’s, one per twin, and veris services lists them beside
the twin they belong to. They have to be the names your application already
reads. This tier is the one where a mismatch is silent: nothing is intercepted,
so a variable your code ignores leaves that call going to the real vendor under a
green test. Check the names against your own configuration before the first run,
and let the trace below settle it rather than the test’s exit code.
There is no receipt on this tier, so the twin’s own trace is the evidence. Trace ids are each twin’s own sequence, so read that twin’s newest id before the run and read back above it after:
veris sandbox trace --service stripe --limit 1 --json
veris sandbox trace --service stripe --since <id>An empty trace under a green test means the call went to the real vendor. A
sandbox wired this way is bound to a running application, so it lives until you
rotate it: veris up again, export again, restart the application. Give it a
TTL that outlasts the session you need it for, with veris up --ttl <minutes>.
What it does not change
Setup adds files under .veris/ and, if needed, a Dockerfile. It does not edit
your application, your tests, or your dependency configuration. If it cannot wire
the repository without changing your code, it stops and tells you why.
Re-running
Safe. It checks each precondition and skips what is already done, so re-running after adding a service or changing your test image does the minimum.