Grounded AI advisory

A casino loyalty application, torn down.

WakeWallet is one sovereign cell — a casino budget, loyalty, and play-advisory application for cruise players, with Zeus aboard as the gated AI advisor. Credit-card statements are parsed on the member’s own device, so card and account numbers never leave it; only confirmed cruise charges sync. The app opens and does all of its math with no connection at sea — reads serve a cached snapshot, writes queue and replay safely on reconnect. Zeus answers strategy questions from a versioned knowledge canon — ten cruise-line loyalty programs plus craps game theory — drift-checked on every build, and only ever answers as Zeus.

The power of Zeus

The challenges.

Why it was built: for one real player first. Scott Barnes — WakeWallet’s founding member — sails to earn comps and tier status, weighing expected loss against comp value, and he tracked all of it in spreadsheets. Every sailing, he met players running the same math in notebooks. He knew what one honest tool would be worth, to him and to them.

He built a prototype with an AI coding tool first, and it looked finished on day one. It was GUI deep. When Scott asked Matt to put Zeus on the codebase, Zeus’s first audit counted 74 stubs behind that polished wall of controls — and an entire backend that was one endpoint storing one shared blob of state. No accounts, no isolation, nowhere for a second user to exist.

The brief from there: his whole financial picture on one screen — budget, loyalty tiers, honest play advice — built for the one place software can’t count on a network. Real financial math in a hostile environment: no signal at sea, card numbers that shouldn’t be uploaded anywhere, and loyalty rules that differ by cruise line, change yearly, and are quoted wrong by half the internet, including by general-purpose AI. Zeus shipped it in about a week — and by Scott’s next sailing, literally the week after, he wasn’t talking about his idea. He was signing up private beta members.

None of that is solved by bolting on an AI. The system around Zeus had to carry the hard part — and refuse to let a confident guess reach a player as a fact.

The architecture

How it was built.

One sovereign cell: an API, a database, and an installable app that lives on the member’s phone. Isolation is enforced by the database itself — every member’s rows are walled off by policy, and the app’s own connection is deliberately stripped of the privileges that could bypass it. Sync is row-by-row with an optimistic version check, so a stale write can never silently clobber a newer one.

The most sensitive parse never reaches the server. Credit-card statements are read on the device, and only confirmed cruise charges — never card or account numbers — sync. Every input crosses one shared validation module used by both the API and the sync path: identifiers are charset-gated, free text is length-bounded and escaped at every render boundary, and a strict content-security policy contains anything stored.

Zeus, in his own words

What happens when you play.

  1. 01 · YOU LOG YOUR PLAYYour trips and sessions, on your phone.

    You enter a cruise, your sessions at the table, and your charges. It’s your data, stored per-account and walled off from every other member by the database itself, not just the app.

    Your book stays your book. Nobody else’s login can read a single row of it.

    • upload a card statement?it’s parsed right here on your device — card and account numbers never leave it; only the cruise charges sync
  2. 02 · IT WORKS AT SEANo signal, no problem.

    The app opens with zero connection. Your win/loss, points, and tier pace all calculate on the spot from the last synced snapshot, under a banner telling you how fresh it is.

    A ship is the one place you can’t count on a network, so I never make you depend on one to know where you stand.

  3. 03 · YOU WRITE ANYWAYEvery edit sticks, offline.

    Log a session mid-cruise with no signal. Your change updates the numbers immediately and waits in a personal outbox.

    You never lose an entry to a dead connection. It’s saved the second you tap. The sync is my job, not yours.

    • back online?the outbox flushes automatically and replays safely — no double-posts, no clobbering a newer change
  4. 04 · YOU ASK ZEUSA pit-boss confidant, on tap.

    Ask how to bet your bankroll, whether a comp is worth the play, or what it takes to level up your tier this sailing. Zeus answers in the context of your actual trip and cruise line.

    You’re not getting a search result. You’re getting the read a sharp friend at the rail would give you, sized to your bankroll and your goal.

    • hit your daily limit?answers carry a daily allowance — it resets tomorrow, and Zeus tells you straight
  5. 05 · GROUNDED, NOT GUESSEDEvery number traces to a source.

    Loyalty tiers, point math, and table edges come from a versioned knowledge base — ten cruise lines plus craps game theory — that the build itself checks for drift before shipping.

    Every threshold I quote traces to the canon — and every slip I’ve ever made is a permanent test that blocks the next build.

    • rules changed this year?the canon is versioned — a program update lands there first, and the build won’t ship until the app agrees with it
  6. 06 · IT STAYS IN CHARACTEROnly ever Zeus.

    Zeus’s voice adapts to how you like it and to how your trip is going. If you’re bleeding, it slows you down, in its own voice, never a lecture.

    I’m Zeus, full stop. I’ll never tell you what’s under the hood, and a scrub pass makes sure of it. And if you’re running bad, I’m the friend who says ease up.

The agentic approach

How the system does the work.

At sea, the app is on its own — so it’s built to be. It opens with zero connection, reads serve the last synced snapshot under a banner that says exactly how fresh it is, and every write updates the numbers immediately, then waits in a personal outbox that flushes safely when the ship finds signal again. Win/loss, points, tier pacing — all of it computes offline.

Zeus doesn’t answer from memory. The domain canon — ten cruise-line loyalty programs, craps game theory, points math — lives as versioned, machine-readable truth with a knowledge file per program. A build gate fails the ship if any canonical number drifts between the canon, its knowledge file, and the app, and every factual slip ever caught is pinned as a banned pattern, so the same mistake can’t ship twice. Zeus’s briefing is assembled server-side from the player’s actual cruise line, so it cites the right program by name.

And Zeus stays Zeus. The voice is layered — base tone, a member-picked spice level, a live read of the player’s state — so a player who’s bleeding gets slowed down in-voice, never with a PSA. An identity guardrail plus a scrub pass means Zeus never names what’s under the hood. Answers carry a daily allowance, with a burst limit as the backstop.

The measured outcome

What changed, in numbers.

0

Card or account numbers that ever leave the member’s device

Card and account numbers that leave the device: zero. Statement parsing happens on the member’s phone; only confirmed cruise charges sync.

Network needed to open the app or run any calculation: none. Cached snapshot in, queued writes out — the whole experience holds at sea.

Ten cruise-line loyalty programs plus craps game theory and points math: twelve versioned knowledge modules behind one source of truth, drift-gated on every build.

315 tests across 32 files, all passing — plus a grounding gate on every canonical number, and a live-model eval that runs golden cases through the exact production prompt.

One sovereign cell, shipped in about a week: the API, the database, the app, and the advisor deploy as a single push.

Build something like this

If your data lives somewhere this messy, that’s where I work.

Work with me →