
Restaurant groups run on a stack of tools that don't talk to each other. A POS that only counts sales, inventory kept in spreadsheets, and an accountant reconstructing the month three weeks after it ended. That leaves the expensive questions unanswerable while they still matter: which dish is quietly losing money now that chicken is up 14%, why the kitchen goes through more cheese than the recipes call for, what needs ordering before Thursday. None of that is hard maths. It's that nothing connects the sale to the recipe to the ledger, so there's no single record to ask.
We built the connection first and the intelligence second. Closing an order on the POS publishes one event, and everything downstream follows from it: inventory depletes the recipe bill of materials in FEFO order, finance posts a balanced double-entry journal, loyalty accrues. Each step is idempotent and tenant-isolated, so a redelivered event is a no-op rather than a double-count. Correctness is enforced by the database rather than by discipline. Money is stored as integer paisa, never floating point. A deferred constraint trigger makes an unbalanced journal entry physically impossible to commit. Entries are immutable and corrections happen by reversal, so locked periods reject late postings outright. Only once that operating data was clean did an AI layer make sense on top of it. Forecasting, yield-variance attribution and menu repricing all read the same ledger the system wrote itself, and plain-English questions pass a seven-stage SQL validator (AST parse, table allowlist, PII deny-list, injected tenant and branch predicates, row cap) before executing read-only. The model writes the projection; it never writes the predicates that scope it.