An environment file becomes a plan, an approval, and a state record Top: the captured sbxenv.yaml with its agent, workspace, args, kits, env, lifecycle, and ports keys. An arrow for sbx env plan leads to the plan it printed, eight rows with a plus sign in the margin for each addition, the workspace row that needs approval, the totals line, and the warning that host commands run outside the sandbox. Below, two branches. Left: approval on sbx env create writes the state record under the sbx state directory, and a later plan prints only the rows that moved. Right: the same plan with the env-arg greeting set to servus still prints every row as an addition because nothing was applied. THE FILE (SBXENV.YAML) sbxenv.yaml schemaVersion 1, name m101-env, agent shell, workspace ., args greeting (default hello), kits ../kits/hello-mixin, env GREETING: ${{ env.args.greeting }}, lifecycle initialize echo init, ports sandbox 8080 host 18083 sbx env plan ./fixtures/env ENVIRONMENT PLAN m101-env (14-env-plan.txt) + kits: source $CAPTURE/fixtures/kits/hello-mixin workspace: $CAPTURE/fixtures/env (not recorded as applied, needs your approval) + env: GREETING: hello + sandbox: name m101-env, agent shell + ports: sandbox 8080, protocol tcp4, host 18083 + lifecycle: initialize: command echo init, workdir $CAPTURE/fixtures/env Plan: + 5 to add, ~ 0 to change, - 0 to destroy. runs commands on this machine, outside the sandbox, with your own privileges margin symbols: + add, ~ change, - destroy, > run, ! forget (help-sbx sbx env) AFTER APPROVAL (NOT CAPTURED) ONE ARGUMENT CHANGED (CAPTURED) you answer y on sbx env create host commands are asked on every invocation state record, per environment in the sbx state directory, not by the file a later plan shows what moved ~ GREETING: hello -> servus, nothing else sbx env create records the plan sbx env plan --env-arg greeting=servus the arg replaces the default hello + env: GREETING: servus still + 5 to add: nothing was applied one argument