Skip to content

Issa · Action gateway · Rust

The model decides what to call. Something else decides if it runs.

Putting your limits in the system prompt is asking a probabilistic model to enforce its own constraints. Issa sits between the agent and the tool: policy is evaluated before execution, anything irreversible stops for a human, and every decision is recorded.

Fail-closed default · MCP-compatible · SQLite WAL durability

The decision

Every call leaves on one of three lanes

There is no fourth option, and there is no default-allow. A call that matches no rule is denied — because the failure mode of getting that backwards is an agent doing something you cannot undo.

Allowed

Matches policy, within limits. Executes and is recorded.

Held

Matches policy but crosses a value or blast-radius threshold. Waits for a human.

Denied

Matches no rule, or matches a deny rule. Never reaches the tool.

Guarantees

What a call passes through, in order

01

Authorise precisely

Fail-closed by default

Every tool call is evaluated against policy before it runs. A call that matches no rule is denied, not allowed — the default has to be the safe one, because the failure mode of getting this backwards is an agent doing something irreversible.

02

Approve safely

Key-sorted canonical SHA-256

What a human approves is hashed canonically, with object keys sorted, so the arguments cannot be reordered or mutated between approval and execution. Approving "refund 40.00" cannot become "refund 4000.00" in flight.

03

Execute idempotently

Atomic reservations, WAL durability

Each call reserves an execution slot atomically before it runs, persisted in SQLite WAL. A retry after a timeout resumes the original outcome instead of performing the action twice.

04

Prove what happened

PII-redacted sequential evidence ledger

Every decision is appended to a sequential ledger with the arguments redacted. When an auditor asks why an agent did something in March, there is a record, not a log level.

Evidence

When an auditor asks why, there is a record — not a log level

Sequence number, action, verdict, and the canonical hash of the arguments. Arguments themselves are redacted before writing, so the ledger proves what was decided without storing the payload.

Note entry 415: the same hash as 412, now allowed, because a named human approved that exact payload. A different payload would have a different hash and would not have executed.

SeqActionVerdictArg hash
000412erp.postJournalEntryHELD9f2a…c418above AED 25,000
000413erp.getTrialBalanceALLOW3b71…08deread-only
000414bank.initiateTransferDENYc0d5…7a19no matching rule
000415erp.postJournalEntryALLOW9f2a…c418approved by T. Mughal
Append-only evidence ledger. Illustrative entries; structure is the shipped schema.

Together

Vantura reasons. Issa decides what that reasoning is allowed to do.

They are separate on purpose. The framework that plans a task should not be the thing that authorises it — that is the same mistake as letting the prompt hold the limits.

Questions

Issa, answered straight

  • Because the model decides which tool to call, and that decision is probabilistic. The gateway is where the non-negotiable rules live: what may run, what needs a person, what never runs. Putting those rules in the prompt means asking the model to enforce its own limits, which is not a control.

Next

Before you let an agent near production, decide what it may do.

We run enterprise audits of agent estates: what tools are exposed, what the blast radius of each one is, and where a human gate belongs.