Skip to content

Configure the engagement

A writ declares the terms. The engagement configuration declares who does the work and what the work costs. The two files are separate, because the terms belong to the project and the engagement belongs to the machine.

Writ reads the configuration from ~/.writ/config.yaml.

  1. Run this command:

    Terminal window
    writ configure
  2. Answer each question. The command shows the current value in brackets. To keep the current value, press Return.

  3. Make sure that the command prints configured ~/.writ/config.yaml.

To set a value without a question, use a flag:

Terminal window
writ configure --holder-model claude-opus-5 --holder-key-env ANTHROPIC_API_KEY
holders:
default:
provider: anthropic
model: claude-opus-5
key_env: ANTHROPIC_API_KEY
pricing:
input: $3.00
output: $15.00
judges:
default:
provider: anthropic
model: claude-sonnet-5
key_env: ANTHROPIC_API_KEY
pricing:
input: $1.00
output: $5.00
budget_share: 10%
sandbox:
engine: docker
image: python:3.12
assent:
transport: [cli, web]

The holder is the model that holds the writ and does the work. The default holder applies to each writ that does not name a different holder.

Field Purpose
provider The wire protocol: anthropic or openai. The default is anthropic.
model The model name that the provider expects.
key_env The name of the environment variable that holds the API key.
base_url An alternative endpoint. Optional.
pricing.input The price of one million input tokens.
pricing.output The price of one million output tokens.

The provider field names a protocol, not a company. Any endpoint that speaks the protocol can do the work. To engage such an endpoint, set base_url.

Writ reads the API key from the environment variable that key_env names. Writ does not store the key.

The judge is a different model. The judge examines each clause at the judgment layer. The judge is never the holder model, because an agent must not grade its own work.

The budget_share field is the part of the cost bound of the writ that the judge can spend. The value must be a whole percentage between 1% and 99%.

Judges are optional. If you declare no judge, you can use only the letter layer and the assent layer.

The sandbox is the place where shell commands run.

Engine Result
docker Each shell command runs in a Docker container.
podman Each shell command runs in a Podman container.
none Each shell command runs on the host machine.

For docker and podman, you must set image. The image must contain the toolchain of the project, so there is no default value.

The transport list gives the ways that a person can answer a request for assent. The values are cli and web.