Shipping & rent
Non-payment stops operations; rent is fixed and non-negotiable. Funded first from cash above the floor.
Five bills. Three currencies. 72 hours. Cash for 60% of it. Treasury Controller funds, converts, defers and escalates (each for a stated reason), adapts when the evidence changes, and never plans through your reserve floor.
Runs on a mock sandbox with demo money. No sign-up needed.
Needs ≈ USD 47,784. Cash above the floor ≈ USD 28,043. The agent can't pay everything, so it ranks by consequence and writes every call down with the rule that made it.
Non-payment stops operations; rent is fixed and non-negotiable. Funded first from cash above the floor.
Buys only the minimum: 12,000 + 12.85 SWIFT fee − 500 already held = EUR 11,512.85. Not a cent more.
The plan is USD 691.45 short. A zero-penalty bill is the cheapest one to push. Re-funded the moment cash arrives.
Breaches the USD 15,000 single-payment threshold, so it goes to a human. The agent will never split a payment to sneak under a limit.
Planning never draws below it. Execution re-checks it against the actual FX quote, net of every other commitment.
Plans go stale the moment the world moves. Treasury Controller re-reads the evidence and tightens or loosens its own autonomy, recalculating only the decisions that cash or confidence was actually blocking.
The model reads messy human input and explains exceptions to approvers. It never touches an amount, a limit or a credential. A test asserts no threshold appears in any prompt.
Text in, text out. No tools, no banking credentials, no authority.
Pure-function rules, a state machine and a hardened ledger.
Every control below is enforced in code and covered by the test suite.
Append-only, HMAC-SHA256 hash-chained with a key held outside the database. Triggers refuse UPDATE and DELETE. Rewrite one settled amount and verification breaks.
A SHA-256 digest of the action, amount, counterparty, destination, sell ceiling, evidence and expiry. Single use, 24h expiry, superseded when evidence changes.
Treasury approver, finance controller and compliance roles. The requester can never approve, nobody enrols themselves, and five failed passcodes lock the account.
A UUID request_id is persisted before every write. Timeouts are treated as ambiguous and looked up, never blindly retried.
Bank details are pinned by keyed fingerprint. Every payee is screened at triage, before conversion and before payout.
Credentials go to a known Airwallex host only. Production is refused by default. No full IBAN ever touches disk.
Watch the walkthrough, then drive it yourself. All four acts end to end: triage, the confidence drop, the deposit, and a human-signed FX conversion and transfer.
The full dashboard runs on the same agent as the CLI: obligations, cash against the floor, forecast confidence, approval cards and the event log.
fx-approve-42release-funds-7screen-names-11The runtime is the Python standard library. An offline mock of the Airwallex sandbox ships in the repo, so the whole four-act scenario runs on your laptop in seconds.
Offline: the demo runs against a local mock that enforces the sandbox's documented fees, single-use quotes and error codes.
Sandbox: drop your Airwallex client ID and API key into .env, generate an audit key, and run --live.
Model optional: add an Anthropic or OpenAI-compatible key for richer email reading. The decisions don't change.
# clone and run the four-act demo offline git clone https://github.com/coldrazer/treasury-controller cd treasury-controller python3 demo.py --yes # run the test suite python3 -m venv .venv && .venv/bin/pip install -r requirements-dev.txt .venv/bin/python -m pytest # against the real Airwallex sandbox cp .env.example .env && chmod 600 .env python3 manage.py gen-key python3 smoke_live.py python3 demo.py --live
Read the rules, run the demo, try to break the chain. Every decision has a reason, and every reason is in the log.