Rooster Agents · The Arsenal · The Till
The Arsenal · Money & Measurement

THE TILL

The nightly close for a business with no CFO — and the only one that will tell you it doesn’t know.

Every dashboard you have ever been shown filled its gaps with a zero. A feed times out, a connection expires, a tag stops firing — and the chart still draws a confident line, because a blank looks broken and a zero looks like a slow week. The Till pulls the money in and the money out into one hash-chained ledger where every row still knows which system it came from, and when it cannot read a feed it writes UNKNOWN and refuses to print the ratio underneath it.

The three rules it is built on

A close, not a report

The close is a confirmationNot a PDF that arrives eleven days after the month it describes. It runs every night, so by the time anyone asks how the month went, the answer is already sitting there and the only work left is agreeing with it.
Every entry knows where it came fromEach row carries its source system, the real transaction id in that system, and when it was pulled. The ledger is a hash chain: change one number after the fact and every hash after it stops matching. You can prove the close, not just believe it.
Unknown beats zero, alwaysA dark feed is not a quiet day. If the payment processor did not answer, revenue is UNKNOWN, the close is marked PARTIAL, and every number that leaned on it — profit, MER, cost per sale — refuses to print rather than mislead you by a factor of whatever.
Live · runs entirely in your browser, nothing uploaded

Break a feed and watch the numbers admit it

This is the real engine, not a picture of one — the same reconciliation, the same watchers, the same rule compiler, ported from production and checked against it. Switch a source to DARK, or tamper with the ledger, and see exactly what a close is supposed to do about it.

The Till · nightly close

What the watchers found

Ledger — first rows, each with its source id and hash

DateKindAmountSourceSource idHash

Tell it what to watch for, in English

Both engines were run against the same 10 scenarios on 2026-08-27 and produced identical totals, identical findings, identical rule verdicts and identical ledger hashes — 0 differences. The demo above is the tool, not a picture of it.

Receipts · real accounts, real numbers, failures left in

What it found the first time we pointed it at ourselves

The Till nightly close card for The Bridge Health Recovery Center: $7,112.33 of ad spend, net revenue UNKNOWN, MER UNKNOWN, profit UNKNOWN, and a finding that nothing connected can see revenue.
Last night’s close for a real client account, exactly as the engine printed it — one number it can prove, three it refuses to invent, and the one connection that would fix that.

Two closes, run on live connections on 2026-08-27. Neither one is flattering, which is the point — a close that only prints when the news is good is a brochure.

EntityWindowAd spendNet revenueMERStatusWhat the close said
Rooster Agents LLC2026-07-29 → 2026-08-27$0.00UNKNOWNUNKNOWNPARTIALStripe answered and PayPal did not, so the money side is incomplete and the close says so rather than reporting the half it could read as the whole.
The Bridge (client)2026-07-29 → 2026-08-27$7,112.33UNKNOWNUNKNOWNPARTIALEvery dollar of spend is visible and there is no revenue feed connected at all, so the close refuses to state a return and raises it as the finding.

Rooster Agents: the payments feed that went dark mid-run (RuntimeError: Failed to fetch transactions: 401 Unauthorized) is a real outage, not a demo — it read perfectly an hour earlier. The close rode out a 37-second retry window, then reported the gap instead of dropping the source silently. The ledger it did build is 2 entries, chain verified. The $0.00 of ad spend is a measured zero, not an assumed one: the only ad feed wired to this entity is a Meta account that answered and returned no rows for the window — a close can only ever speak for the feeds connected to it, and it says which those are. The Bridge: $7,112.33 of real Google Ads spend across 30 days, 29 daily entries, chain verified at 9ea8a2f24587fbee. No payment or booking feed is wired into the close yet — so the honest answer to “what did that spend return” is that nothing on this account can currently tell you, and that is exactly what it prints.

The catch that paid for the build

The first pass at the payments feed read every PayPal row and treated anything positive as money in. It produced a clean, confident, completely wrong $3,393.10 of gross revenue for the month. Roughly $2,900 of that was event code T0700 — the card-funding leg that appears every time you send a payment. The money never came in; it went out, and the card refilled the balance on the way past. A pairing of subscriptions Andrew pays for read as a good sales month.

The fix is the doctrine, not a patch: the engine now carries a map of transaction types it has actually verified, and any row whose type is not in that map is excluded from every total and reported as unclassified — the close drops to PARTIAL and tells you how much money it declined to guess about. Funding legs and bank transfers are never revenue. Pending and denied rows are counted, never summed.

How we know the demo is the tool

Both engines, same numbers, same hashes

The engine in your browser and the production engine were run against the same 10 scenarios on 2026-08-27 — a clean month, a dead processor, a dead ad platform, a spend-only account with no money feed, a revenue cliff, a refund spike, unclassifiable rows, and everything dark at once.

CheckedResult
Scenarios run through both engines10
Ledger entries hashed on both sides1,444
Metrics compared (value and known/unknown)110
Findings compared (id, severity, wording)9
Rule compilations and evaluations compared80
Chain head hashes that matched10 of 10
Differences found0

The production engine also ships a self-test with the negative controls that matter: a dark feed must never become a zero, a tampered ledger must be caught, a rule that leans on an UNKNOWN metric must be held rather than passed, and a sentence it does not understand must be refused rather than guessed. Last run on 2026-08-27: 27 checks, 0 failures.

What happens after the close

The watchers propose. A human approves.

Nothing moves on its ownEvery finding carries a proposal and stops there. An agent that can quietly pause a campaign because a feed hiccuped is a liability, not an employee.
A held rule is not a passed ruleIf a rule needs a number the close could not see, it is held and reported as held. Silence is the failure mode that costs money; a rule that quietly evaluates against a phantom zero is worse than no rule.
You get one line, not a dashboardLast night’s close, what changed, what needs a decision. If there is nothing to decide, it says so in a sentence and leaves you alone.
Questions people actually ask

The honest answers

Why would a business with no CFO need a close?

Because the question “did last month make money” is normally answered in the middle of the month after, by someone reading a bank balance. A close is just the discipline of answering it every night while the answer can still change what you do. The owner-sized version does not need journals and accruals — it needs money in, money out, what the ads cost, and what is left.

What makes this different from the dashboard my agency already sends?

A dashboard draws a line through a gap. If the pixel stopped firing on the 12th, the chart shows a quiet week, and quiet weeks get explained away. The Till separates “this was zero” from “I could not see this”, and when it cannot see something it refuses to print the ratios that depend on it. You lose a number and gain the truth about the number.

Is UNKNOWN not just an excuse for missing data?

It is the opposite — it is the only honest thing to do with missing data, and it is louder than a zero. An UNKNOWN drops the whole close to PARTIAL, names the feed that went dark and the exact error it returned, and raises a finding that says fix this connection. A zero raises nothing, which is why every reporting tool prefers it.

What does “hash-chained” actually get me?

Each entry is hashed together with the hash before it, so the ledger has one head hash that stands for the whole month. Change a settled row after the fact — even by a cent — and every hash after it stops matching and the close refuses itself. It means the numbers you were shown in the morning are provably the numbers that were there, which matters the day someone disputes them.

Can it pause my ads or move budget on its own?

No, and that is deliberate. Every watcher produces a finding with a proposal attached and stops. An agent that can pause a campaign because an API timed out is a liability. The one thing it does automatically is tell you — and when a rule you wrote depends on a number the close could not see, the rule is held and reported as held rather than quietly evaluated against a phantom zero.

How do I tell it what to watch for?

In a sentence. “If ad spend is over 200 in a day and bookings are zero, text me.” It compiles that into a rule and shows you the rule it built, in English, before it runs. If it cannot understand your sentence it refuses and tells you which half it did not follow — it never guesses at what you meant and quietly watches the wrong thing.

What do you need connected, and how long does it take?

Read-only access to wherever the money lands — the payment processor, the booking system — and to the ad accounts. Nothing that can move money, nothing that can spend. The first close can run the same day, and if half the picture is missing it will say so on the first run instead of six weeks in.

Want your own close?

Read-only connections to what you already use. First close inside a day, and it will tell you plainly which part of your money it cannot see yet.

Text Rudy the word TILL
← Back to the Arsenal