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

# Decisions

> Every field on a Decision, what it is for, and the two that only mean something on the lower rungs.

```python theme={"system"}
Decision(
    outcome="allow",
    allowed=True,
    reason="within grant",
    grant_id="grt_01KZXYD62VG0",
    ledger_id="led_01KZZWKNEPCJ",
    remaining_amount_minor=2475000,
    remaining_count=39,
    findings=[],
    policy_outcome="allow",
    enforcement_mode="enforce",
)
```

| Field                    | Meaning                                               |
| ------------------------ | ----------------------------------------------------- |
| `outcome`                | One of the [six outcomes](/concepts/outcomes).        |
| `allowed`                | Whether to proceed. Not a substitute for `outcome`.   |
| `reason`                 | Human-readable, and written to be read in a console.  |
| `grant_id`               | The authority this drew on.                           |
| `ledger_id`              | The handle for this decision in the record.           |
| `remaining_amount_minor` | Spend left under the ceiling.                         |
| `remaining_count`        | Calls left.                                           |
| `findings`               | Notes attached by the gates.                          |
| `policy_outcome`         | What the policy decided, **before** enforcement mode. |
| `enforcement_mode`       | The mode on the grant at this moment.                 |

## Properties

* `decision.needs_review`: the outcome is one of the two review states
* `decision.enforcing`: the mode actually refuses
* `decision.suppressed`: a refusal was **recorded but not applied**

## The pair that matters on the lower rungs

`policy_outcome` and `enforcement_mode` diverge in `observe` and `shadow`, and
that divergence is the whole value of running them. `policy_outcome="deny"` with
`allowed=True` and `suppressed=True` means: the control would have stopped this,
and did not, because you have not asked it to yet.

Counting those is how you measure a rung before you climb it. See
[Move up the ladder](/guides/move-up-the-ladder).

<Note>
  Both may be `None` against an older server. Treat their absence as "unknown"
  rather than as a value.
</Note>

## Per-action credentials

Where the grant names an `audience`, the decision carries a short-lived
credential for that specific action, meant for the downstream system rather than
for Rotascale. See [Authentication](/authentication).
