Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Finance / FinOps

Viewer at the org for reading, and — where the organisation lets finance set limits — admin at the org for budgets. Reads spend, never prompts: a viewer sees every request-log row of the org with the captured bodies withheld (#1820), which is exactly the separation a finance function wants.

Goal: “I know what we spent, on which models, for which business unit and customer; spend stops at the limits we agreed; and month-end is an export, not a project.”

Dogfood account: finops@rolter.local, viewer at org default. Steps that change a budget use orgadmin@rolter.local. See dogfood data.

The observer watches: which screen FinOps opens first, and how long it takes to answer “what did business unit X spend last month” — the answer should be one screen and one filter.

F1 — see the spend

#stepwhereexpectstatus
F1.1sign inlogin screenthe org’s Dashboard; every mutating control disabled with the role it needsverified
F1.2spend over time, by modelObservability → Dashboardtotals, a time series, per-model cost and latency — the org’s traffic onlyverified
F1.3read a request without reading its promptLLM Logs → a rowtokens, cost, status; the bodies say they are hidden for the viewer roleverified
F1.4spend by business unit and customerGovernance → Business Units, Customers · GET /api/v1/analytics/by-attributionone row per unit or customerverified
F1.5what business unit X spent last monthBusiness Units → window picker → Last month (#2107)the whole previous calendar month in the viewer’s time zone, dated under the total; kept in ?window= and carried to Customersworks

F2 — make the numbers trustworthy

#stepwhereexpectstatus
F2.1find traffic that counted as freeDashboard unpriced share, LLM Logs unpriced flagevery model with no price row namedverified
F2.2price itModels → Pricing Overridesrefused for an org admin: the price catalog is deployment-wide, a superadmin’sverified (by design); ask the platform team
F2.3decide what unpriced traffic does to a budgetthe budget’s unpriced policycount it as zero, or refuse itworks
F2.4keep a standing view of “spend by unit, this month”—a saved filter presetgap — #1825

F3 — set limits

#stepwhereexpectstatus
F3.1a monthly cap per business unit and per customerBudgets & Limits → Add budget (admin at the org) · POST /api/v1/budgetsHTTP 402 for the unit’s or customer’s keys once the cap is reachedverified
F3.2a cap per person—an allowance per engineer across their keysgap — #1830
F3.3change a capthe budget rowdelete and recreate: spend so far is kept, because counters are keyed by scopepartial

F4 — be told

#stepwhereexpectstatus
F4.1a warning at 80% of a budget—a notification before the 402gap — #337
F4.2an alert when spend velocity jumpsAlerting → Rules spend_velocityrefused below superadmin; deployment-wide onlygap — #1829

F5 — month-end

#stepwhereexpectstatus
F5.1export spend by unit and customer for the month—a CSV with the window, the currency and unpriced rows flaggedgap — #1838
F5.2the workaroundpage GET /api/v1/analytics/by-attribution with a session and convertthe same numbers, by scriptpartial