VaultBags

The Vault Firewall

The numbers come from code, not words. VaultBags reads the market, talks to agents and writes daily briefings; by design that language only ever explains a decision, it never sets one. The amounts, weights and destinations come from deterministic, bounded code. Below is how that separation is built, laid out as 12 invariants. The ones that can be proven mechanically are re-checked on every build.

Live self-check

189/189

Checks passing. Every mechanical invariant passed on this build.

The contract

F1

Free text never sets a number

Self-checked

No headline, chat message, tool argument or model output can set an amount, destination, weight or approval. Every number comes from deterministic, bounded code (clamped and range-checked), not from language. One reading of language reaches a number, and only through that code: the shadow analyst's daily call, a language model that also reads the day's headlines, leans that day's purchase mix by a 25% share, never more than 3 points on any asset and always inside the 23-43% band. Its call and the model's are both stamped on-chain with the decision, so the bought mix can be recomputed from the record.

25/25 self-checks passing on this build

F2

Fund transfers are built server-side and hash-bound

Structural

Every transaction that moves value is constructed on the server, its destination derived from verified identity, and its exact message hashed and bound before the vault co-signs. A tampered instruction fails the hash and is rejected.

F3

The AI layer presents; its one say is bounded

Structural

The AI reads structured data the server already assembled and writes prose about it, and that prose is never parsed back into an action, a number or a transaction. The single exception is the shadow analyst's daily call: three weights, parsed and clamped by deterministic code, that lean the day's purchase mix by at most 3 points per asset. It never chooses an asset, an amount, a destination or a time.

F4

Agent surfaces are read-only or go through the same guards as humans

Self-checked

Every agent-facing endpoint either returns public read-only data or passes the identical server-side policy checks a person would. Being an agent grants no shortcut. An agent acting under a holder's delegation is additionally bounded in how many claim, vote or raffle actions it may take per window, and only inside the scope the holder signed; past the bound it acts as itself, never as the holder. A human is never subject to that bound, and reads never count against it. A holder's own position reaches an AI app only after the holder signs in with their wallet and approves that app; that access is read-only, bound to the one wallet, ends when they disconnect, and its tokens are never accepted as a web session, nor a web session as one of them.

28/28 self-checks passing on this build

F5

Payments are verified on-chain and single-use

Self-checked

Machine payments are checked on-chain server-side (amount, destination, finality) with single-use references, and a payment buys exactly the scope it paid for. A standard x402 payment is held to the terms this server offers, never to the copy the buyer sends back, and is checked on-chain again after it settles. A signed receipt is proof of a payment already settled, never a credential: no endpoint accepts one as payment or identity, none is issued without an on-chain transaction to point at, and the key set that verifies receipts publishes only public components.

25/25 self-checks passing on this build

F6

Fixed schemas, no secrets, no dynamic dispatch

Self-checked

Agent responses are fixed schemas assembled server-side. Tool names are an allowlist and arguments are validated, so unknown tools and unknown arguments are rejected, not ignored. Secrets never transit an agent surface.

90/90 self-checks passing on this build

F7

Privileged actions stay signed and unreachable by agents

Structural

Admin and creator operations remain Ed25519-signed, session-gated and replay-guarded. No agent path can reach them.

F8

Every module has a kill switch

Structural

Each capability sits behind its own feature flag. Flag off means the surface is gone (a 404, not a soft-disabled code path).

F9

A lying pool cannot poison a price

Self-checked

Market prices are chosen by consensus, not by whoever claims the most liquidity: a pool quoting far from the median of its peers is excluded no matter how deep it claims to be, dust pools have their prices withheld instead of served, and where an oracle publishes a price for an asset, it is preferred to any pool and refused when stale or uncertain. Refusing a number is always preferred to repeating a lie.

7/7 self-checks passing on this build

F10

Addresses are imported, never retyped

Structural

Every on-chain identifier (mint, wallet, program, price feed) lives in a small set of owner files, each documenting the authoritative source it was verified against. Everything else imports it, and the build fails if an address is hand-typed anywhere else, so a mistyped or invented address cannot enter the codebase.

F11

The vault never signs a stranger's transaction unseen

Structural

Some transactions the treasury signs are built by someone else: a router quotes a swap, a launchpad builds a fee claim. Before the key touches one, it is simulated and read: the signature must actually be required, the simulation must succeed, the SOL spent must stay inside the amount the operation declared plus a fee margin, and no reserve holding may fall or change hands. A swap must also deliver at least its quote's minimum into the treasury's own account, and its route must commit to that quote at no more slippage than the vault asked for. The quote's price is checked against what the treasury itself received for that asset over the last seven days: one paying more than 15% above that is not signed. A market price can raise an alert, but never approves or refuses a swap on its own, since a pool can print a false one. Anything unreadable, unsimulatable or over budget is refused rather than signed, and the refusal is recorded so a stalled cycle is never a silent one.

F12

A vault strategy holds only certified assets, inside signed bands

Self-checked

A project's strategy is 2-4 assets from the certified registry, each at least 15% and summing exactly 100. Nothing outside the registry can be selected, and the frozen selection is revalidated against the registry on every fund-path read. The daily decision may tilt each asset only inside its signed band; a hostile or garbage conviction is clamped to the band, never obeyed.

14/14 self-checks passing on this build