Modes
Every paid or external action runs in `smoke_test`, `dry_run`, or `live`.
| Mode | Validates inputs | Reads real data | Calls paid providers | Writes externally | Credits |
|---|---|---|---|---|---|
smoke_test | Yes | Yes | No | No | 0 |
dry_run | Yes | Yes | No | No | 0 |
live | Yes | Yes | Yes | Yes | Bounded by the approved cap |
smoke_test and dry_run have the same execution boundary; the distinct mode
label is retained in the run record. Both spend 0 credits, skip paid provider
calls, and prevent external writes. Oxygen internal reads still execute against
current workspace data. One explicit exception to “no external calls” is the
internal oxygen.http_json_request read tool, which may make a real outbound
GET to the configured URL. Only live may spend credits, call paid providers,
or write externally.
Workflow runs
--mode is required on workflows call and workflows events emit; all three values are accepted. A live call additionally requires both --approved and --max-credits — unconditionally, whether or not the graph spends anything. Omitting them fails with approval_required (409) or spend_cap_required (400) and enqueues nothing.
Every successful call returns a safety receipt beside the run. It states the
mode, maximum managed credits, provider/write posture, whether internal reads
execute, and that an inspectable Workflow run record is created.
oxygen workflows call <id> --input-json '{...}' --mode smoke_test --json
oxygen workflows call <id> --input-json '{...}' --mode dry_run --json
oxygen workflows call <id> --input-json '{...}' --mode live --approved --max-credits 50 --jsonProvider tool runs
tools run takes dry_run or live only — there is no smoke_test for a single tool call. The live gate applies to paid tools (anything with a side effect or a billing mode): those require --approved and --max-credits, and refuse with spend_cap_too_low when the ceiling is under the pre-call estimate. A free, no-bill tool runs live without either flag.
oxygen tools run <tool-id> --input-json '{...}' --mode dry_run --json
oxygen tools run <tool-id> --input-json '{...}' --mode live --approved --max-credits 20 --jsonMCP splits the two into separate tools: oxygen_tools_run_dry and oxygen_tools_run_live.
Column runs
columns run has no --mode. It takes a --dry-run flag — which returns the resolved model, the credit estimate, and the prompt rendered against one real row — and paid runs then need --approved with --max-credits.
Related
- Approvals — the gate before
live. - Spend caps — the per-run credit limit.
- Runs — the resulting record.