> ## Documentation Index
> Fetch the complete documentation index at: https://docs.substrate.42.pe/llms.txt
> Use this file to discover all available pages before exploring further.

# substrate approve — Set a Human-Only Approval Field

> substrate approve sets a human_only field on a task — the only write channel agents cannot use, stamped with your OS username in the event log.

Run `substrate approve` to set a `human_only` field on a task and unblock an agent waiting at a transition gate. An agent's MCP write tools refuse these fields entirely, so this CLI — run by a person at a terminal — is the only way the value gets set. That asymmetry is what turns a `transition_guard` requiring the field into a real human approval rather than a checkbox the agent ticks on its way past.

## Usage

```shell theme={null}
substrate approve <task_id> <field> [value]
```

## Arguments

<ParamField path="task_id" type="string" required>
  The task id. The short 8-character form printed by `substrate pending-approval` is accepted.
</ParamField>

<ParamField path="field" type="string" required>
  The field name. It must be declared `human_only` on the board's `field_schema`.
</ParamField>

<ParamField path="value" type="string">
  Parsed as JSON when possible — `true`, `false`, `42`, `"note"` — otherwise taken as a string. Defaults to `true`, the approval case.
</ParamField>

## What It Does

`approve` resolves the task's board, checks that the field is truly `human_only`, merges the value into `custom_data`, and writes it under optimistic concurrency. The event is stamped with a `human:<os-user>` actor, so the task history distinguishes your sign-off from any agent write.

`approve` sets the field. It does **not** move the task — the agent retries the blocked move once the gate condition passes.

<Warning>
  The web UI is read-only. There is no click-to-approve, deliberately — an approval should be something you typed.
</Warning>

## See Also

* [`substrate unapprove`](/cli/unapprove) to revoke a mistaken approval.
* [`substrate pending-approval`](/cli/pending-approval) to find what is waiting.
