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.

SettingValuesDefaultEnvironment variable
defensecorrect acts, record recordscorrectPROVELY_DEFENSE
guard_modeobserve records, enforce actsobservePROVELY_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:

bash
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?

bash
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?

VariableWhat it does
PROVELY_READ_TOOLSMarks 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_CHECKSA 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_STRICTA plugin failure or an unsupported version stops the start.
bash
export PROVELY_READ_TOOLS=get_charge,list_orders
TypeScript
export PROVELY_TOOL_TIMEOUT_MS=120000
Python
export PROVELY_TOOL_TIMEOUT_S=120
export PROVELY_SYNC_TOOL_TIMEOUT_S=120
bash
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.