## Inspiration

AI agents are good at doing work and bad at being accountable for it. We wanted one we'd actually trust in a finance seat — an agent that can't touch what it shouldn't, can't erase what it did, and knows when to stop and ask a human. A football club's transfer finance is a nasty test case: multi-currency deals, staged installments, add-on clauses, fraud attempts, and compliance limits with real penalties.

## What it does

Pran FC is an autonomous finance agent that runs a club's transfer and squad-cost accounting. It turns real events — wires, add-ons, agent fees, wages — into correct double-entry journal entries, holds and escalates the genuine judgment calls to the right human, and keeps an append-only record of why for every one. The model proposes and explains; a hard-check gate in code decides. Result: the books tie to the cent and the agent is 100% precise on everything it completes on its own.

## How we built it

Python + FastAPI, with the agent running under least-privilege database roles behind a single gateway that writes each change and its audit diff in one transaction.

TigerData is the system of record and the time machine. The whole golden dataset lives on Tiger Cloud (Postgres 18 + TimescaleDB + toolkit). The time-series tables — bank transactions, installments, match events, FX rates, and the append-only audit log — are hypertables, auto-partitioned by time on Hypercore, TimescaleDB's storage engine. Because every event is time-partitioned, we get the feature the whole product depends on almost for free: time-travel. Each decision is an as-of read — we can replay the books, and the agent's knowledge, exactly as they stood on any date in the 24-month history, so a closed-period correction reverses-and-reposts against the state that actually existed instead of guessing.

Moss is the agent's long-term memory. Past decisions, precedents, approved policies, and contract clauses are indexed in Moss for semantic recall. The rule is Moss finds, Tiger is truth: Moss returns candidate IDs, and the agent always refetches the real row from TigerData before it acts or speaks, so nothing is decided on a stale or fuzzy match. Recall respects the same as-of boundary, and salaries are never indexed — privacy is enforced at the DB, not in the prompt. In practice recall lands the right memory roughly 90% top-1 and 93% top-3.

## Challenges we ran into

  • Keeping as-of reads consistent across two systems — the TigerData ledger and the Moss index — so a historical replay never mixes "now" facts into a "then" decision.
  • Making approximate memory safe: tuning similarity thresholds and forcing a refetch-before-act so Moss never silently over-merges two different deals.
  • Sealing individual salaries at the database while still letting the agent book aggregate wages for the squad-cost ratio.

## Accomplishments that we're proud of

  • Trial balance ties to the cent across EUR, GBP, and USD — produced by the agent, not hand-keyed.
  • 21/21 on a planted-issue eval with zero "must-not-automate" violations.
  • An append-only audit that blocks UPDATE/DELETE even for a superuser.
  • Same agent, swappable surfaces: a 3D stadium web app and a Bloomberg-style terminal, both just thin clients over the same API.

## What we learned

TimescaleDB is "just Postgres" until you need time — then hypertables plus as-of queries turn "show me the books as they were on that date" from a feature you'd dread into one you get for free. And the cleanest division of labor for an agent is to let the vector layer find and let the system of record be truth — never collapse the two.

## What's next for Pran FC

Continuous aggregates and Hypercore columnar compression over the full event history for instant multi-year rollups; more finance seats (sponsorship, matchday); real on-chain micropayments for the bank-verification step; and wider contract-clause coverage.

Built With

  • 3js
  • cartesia
  • livekit
  • moss
  • python
  • tiger-data
  • tigerdata
Share this project:

Updates

Submission history