# What does Provely change, and what does it only record?

> Two settings decide what Provely changes. defense is correct by default. guard_mode is observe by default. Invented values are refused only under enforce.

Canonical: https://provely.sh/docs/postures  
Last updated: 2026-10-18  

**Two settings decide it. `defense` controls the defence checks, and its default is `correct`. `guard_mode` controls the authority checks, and its default is `observe`. An operator sets both in the environment. The application code states neither.**

| Setting | Values | Default | Environment variable |
| --- | --- | --- | --- |
| `defense` | `correct` acts, `record` records | `correct` | `PROVELY_DEFENSE` |
| `guard_mode` | `observe` records, `enforce` acts | `observe` | `PROVELY_GUARD_MODE` |

## What does the default do?

Under the default, the defence checks act. A malformed call is repaired or goes back to the model. A duplicate call id is refused. The authority check `fm.argument_provenance` only records. An argument value with no source in the run therefore still reaches the tool, and the log states `record`.

## When do invented values get refused?

Only under `enforce`. Set this variable to refuse a write whose argument has no source in the run:

```shell
export PROVELY_GUARD_MODE=enforce
```

The grid case ZC-SEED-03 sends an amount with no source in the run. Under `enforce`, it passed on 14 of 15 paths. It did not pass on `ts/openai-responses`. Measured on 2026-10-17: TypeScript at `82acaae6`, Python at `9f9131ba`.

## How do I only record, with no change to a call?

```shell
export PROVELY_DEFENSE=record
```

Under `record`, the defence checks write their findings and change nothing. Use it to measure a new agent before Provely acts on it.

## Which other settings does an operator use?

| Variable | What it does |
| --- | --- |
| `PROVELY_READ_TOOLS` | Marks tools as reads. An identical repeat of a marked read is never refused, so a status poll works. |
| `PROVELY_TOOL_TIMEOUT_MS` (TypeScript), `PROVELY_TOOL_TIMEOUT_S` (Python) | The fallback time bound of a tool. A timeout that the code states wins. The default is 600 seconds. |
| `PROVELY_SYNC_TOOL_TIMEOUT_S` (Python) | The time bound of a synchronous Python tool. The default is off. |
| `PROVELY_DISABLED_CHECKS` | A JSON array of check ids to turn off. An unknown id stops the start. At engine `5a9c8298`, a fixed check stays on, with a `refused_fixed` warning and a log line. Under `PROVELY_STRICT=true`, a fixed id stops the start. |
| `PROVELY_STRICT` | A plugin failure or an unsupported version stops the start. |

```shell
export PROVELY_READ_TOOLS=get_charge,list_orders
```

TypeScript

```shell
export PROVELY_TOOL_TIMEOUT_MS=120000
```

Python

```shell
export PROVELY_TOOL_TIMEOUT_S=120
export PROVELY_SYNC_TOOL_TIMEOUT_S=120
```

```shell
export PROVELY_STRICT=true
```

> A synchronous Python tool has no default time bound. A bound runs the tool on a worker thread, and some objects, such as a per-thread database connection, belong to the thread of the caller. Set `PROVELY_SYNC_TOOL_TIMEOUT_S` only when your tool permits a worker thread.

## Read next

- [Rules (optional): audit, share and make exceptions](https://provely.sh/rules)
- [Troubleshooting](https://provely.sh/docs/troubleshooting)
