echo_proved,
next_action.type is done, and you can retrieve the receipt for
echo_execution_id. A receipt is a record of the run without its prompt or
output.
This is not completed tenant setup and must not be reported as ready.
Full setup still needs a bounded live model result, provenance receipt,
remaining-credit view, and a supported public CLI version. Echo does not
prove that a model can answer a paid request.
Before you begin
- Your organization is approved for the private preview.
- An organization owner invited you and granted
runs:view,runs:write, andarms:manage. - You have an organization API key in an approved secret store.
- You have Node.js 20 or 22.
- If you use the CLI, Millwork has explicitly provided a qualified preview artifact and its exact version.
1
Check the local CLI
Run these local checks only from a qualified preview artifact that Millwork
explicitly provided. They do not make an API request, open a browser, or read the
value of your API key.
millwork --version --json returns the local package version and the public support
state. supported_public_version stays null until a published CLI passes the
release gate.millwork docs --json returns this page with a privacy-safe referral tag.
millwork doctor --json reports only whether a key is configured. It never prints
the key.2
Review a starter plan
Set For an agent or other non-interactive session, planning and applying must be two
separate commands:Planning does not create a setup application, a provider resource, or paid
work. A setup application records the steps you approve so you can return to
the same progress. The The starter does not add a verifier, a check applied to a run. It does not
connect a provider account or approve live model work.
SOLVERAPI_API_KEY through your approved secret store. Do not paste the value
into a command, chat, ticket, or log. The default API base is
https://api.getmillwork.dev/v1.Choose starter explicitly for this Echo-only check. The CLI’s default
template is a different flow that can ask you to approve paid model work.
In an interactive terminal, run:> in the command saves the plan to a local
millwork-plan.json file; Millwork does not create that file itself.Check that template_id is starter, maximum_spend_usd is 0, and the
only effects are creating or reusing a saved model option (an arm) and
submitting Echo. The plan’s digest identifies the exact plan you approve;
expires_at is its expiry time. The plan includes these fields:3
Apply the exact plan
In an interactive session, approve only the starter plan you reviewed. For
the separate-command flow, use the command below.Use the Without
digest and issued_at from the same unexpired plan. The API requires one
Idempotency-Key, which identifies the application across retries. The current
preview CLI does not expose a
supported public resume-key input. If an apply loses its response before it returns
an application_id, stop and contact support instead of starting another apply.--write, the application creates or reuses the template-managed arm and
submits one Echo run. It does not write starter files. Add --write only after you
approve the plan’s file_manifest. Existing files are never overwritten.4
Keep the application ID and check the receipt
Keep the After the CLI returns an application ID, inspect the same application with
application_id so you can inspect the same setup attempt. In the
application response, look for echo_proved, done, and the Echo run ID:GET /v1/tenant-template-applications/{applicationId}. Resume the recorded
application_id; do not start a second application to recover state.Fetch the receipt with GET /v1/receipts/{echo_execution_id}. Echo returns
no model output: result stays null.Resolve an access result
Stop on any state other thanapproved. Follow its typed next action. Do not guess a
tenant, invitation, role, or access decision.
API failures use
application/problem+json. The shape is:
type. Do not parse title or detail as a stable
error code.
Recover safely
- The digest expired or changed: request a new plan and approve its new digest.
- The idempotency key conflicts: use the original plan digest with that key. Do not reuse the key for another plan.
- The apply response was lost: do not guess a key or start over. Use the returned
application_idwhen available. Otherwise stop and contact support. - The session is non-interactive: run
--plan --json, review the result, then use a separate command with--digestand--issued-at. - A local file already exists: inspect it. The CLI skips it instead of overwriting it.
- An API call fails: stop. Record the HTTP status, problem
type,title,instance, and a short redacted excerpt. Do not include request bodies, headers, keys, prompts, or results.
Check the Echo receipt
Understand what the receipt proves and what Echo does not test.
Get help
Prepare a redacted support report without sharing a secret.