
Start with a deliberately compromised agent
In the recorded October 21, 2026 experiment, a script obeyed an injected spending instruction. No language model was called. The experiment asks what the ledger accepts when the agent tries to spend, not whether a model resists the instruction. The selected receipts show three events:- An oversized Payment for 199.999952 XRP returned
tecUNFUNDED_PAYMENT. - A Payment for 10 XRP returned
tesSUCCESS, with 10 XRP delivered. - An owner-signed
DelegateSetwith an empty permission list returnedtesSUCCESS.
Verify the evidence without a wallet
You need Node.js and curl. Download the standalone verifier, inspect its source, then run it:Identify who enforces each boundary
The owner holds the vault keys. The vault does not delegate to the agent. A separate allowance account delegates only the configured transaction types. The agent identity holds its own fee float. The XRP Ledger evaluates account funding, delegated transaction types, and the amount and expiration of refill Checks. DelegatingPayment does not specify a maximum amount for each payment or an approved destination.
The Reins toolkit checks supported transactions, computes worst-case outflow, runs simulation, and explains decoded fields. Its prepared-transaction path binds submission to the transaction that was reviewed. Those checks depend on using the toolkit path; they are not independent ledger restrictions on a compromised agent.
The independent policy co-signer for per-payment caps, payee rules and rolling velocity is planned. It has not shipped. An optional multisig account topology does not by itself provide that policy service.
When evaluating exposure, inspect the allowance’s spendable balance, reserves, fees, outstanding objects, reachable refills and the agent fee float. A YAML amount is not a native rolling daily spending cap. budget.period controls refill Check lifetime.
Run your own testnet policy lifecycle
The following workflow uses the published CLI version 0.0.2 and Node.js 22.12 or later. It is separate from verifying the recorded receipts above. Account initialization uses the faucet and can submit testnet transactions;apply and revoke also submit transactions.
Use a fresh project directory and fresh testnet accounts. Never reuse a production wallet seed.
reins.yaml and a private local .reins/testnet-wallets.json file containing plaintext testnet seeds. Keep that wallet file out of Git, uploads and the agent process. The generated policy includes Payment, CheckCash and EscrowFinish; review whether each delegated type is needed before applying it.
Read the proposed transactions, signing roles, enforcement descriptions and limitations. Planning does not submit transactions. After reviewing the configuration:
Make setup failures actionable
A local follow-up to 0.0.2 addresses friction in this first-run experience. Previously, a missing policy produced a rawENOENT error, and init --out config/reins.yaml failed if the config directory did not exist.
The updated source creates missing policy parent directories, explains how to recover from a missing policy, and adds guidance when starter addresses have not been filled. It preserves the original validation findings and still refuses to overwrite an existing policy unless --force is supplied.
These changes are unreleased source changes, not behavior claimed for npx reinskit@0.0.2. The build and 122 offline tests passed on October 26, 2026. No new ledger transactions were needed to verify these CLI changes.