Skip to content

writ plan

Use writ plan before you start or issue a writ.

Select exactly one agent or target:

Terminal window
writ plan <file> --agent <agent>
writ plan <file> --target <target>

An agent is claude, codex, cursor, or opencode. A target is managed, gate, mcp-local, or mcp-remote.

The output contains one row for each authored clause. A full tool-authority target also contains a /grants row. This row checks the default-deny rule across the complete agent tool surface.

An adapter can satisfy this row by observing every tool source. It can also use an independent control that disables every source it cannot observe. No current Codex, Cursor, or OpenCode adapter has that control.

An enforced row means that the target supplies the required events and evidence. An unsupported row names each missing capability. It can also give a reason when the policy path itself cannot support the clause.

enforced /grants
enforced /grants/0/read
unsupported /bounds/cost missing: cost.coverage.complete

A source-specific grant can pass while the complete grants policy fails. For example, Codex exposes MCP calls but does not expose every built-in and hosted tool call:

unsupported /grants missing: tool.pre.coverage.complete
enforced /grants/0/mcp

Do not attach this plan. An unobserved tool source could bypass the default denial. A scoped MCP proxy does not claim full agent authority, so its plan checks only the MCP boundary.

The command exits with code 2 when one or more entries are unsupported. writ start and writ issue repeat the plan check before they begin.

Do not remove or weaken a clause only to make a plan pass. Select a target that supplies the required capability.

The gate target observes model traffic only. A writ must contain a grant, and the gate cannot enforce grants. writ gate therefore needs --allow-partial after you review the unsupported paths.

An omitted bound is authored-unbounded. It does not appear as an authored clause in the plan. The managed writ issue target adds operational defaults of 25 iterations, $1.00, and 15 minutes. These defaults do not become authored clauses.

The planner still checks these operational defaults when it plans a global on_bound_breach remedy. A revert remedy is unsupported because an iteration, cost, or wall-clock breach can occur without a reversible tool result receipt.

The planner applies the same rule to invariant checkpoints and assent refusal. It prints the path that can breach without a receipt. Select halt, inform, pause, or escalate, or narrow the invariant to a receipt-backed checkpoint.

unsupported /remedies/on_invariant_breach reason: Revert cannot handle /invariants/0/clause. This checkpoint has no completed tool result with a reversible receipt.

Use --set name=value when the file has a placeholder. Repeat the flag for more values.

Terminal window
writ plan task.yaml --agent claude --set package=src/sync

Do not put a secret in a placeholder value. Attached activation state stores the bound document.