Mindbridge ยท track status

LLM-COST

What providers invoice us is not reconciled against what we think we spent โ€” the comparison needs two data inputs (provider actuals, tenant pricing) that are empty or stale, and the alerts that would flag a mismatch have no delivery channel.

Re-measured 2026-08-16 from the live issue list. Verify before starting โ€” the alert, actuals and pricing figures below are point-in-time measurements from 2026-08-07 and decay as spend moves. This page has never been published.

Next โ†’ #3131 Cost alerts fire into the void โ€” a 2.48ร— spend spike and an unpriced model are notifying nobody. Code: add the rate_card row so the spend stops vanishing. Decision: whether alerts need a delivery channel at all.
3 open gaps ยท one firing now (alerts into the void) ยท two empty-or-stale inputs (provider actuals, tenant pricing)
3open gaps on this track
5provider_billing_daily rows โ€” all hand-entered
0tenant_pricing rows
35unpriced openai/gpt-5.4 events in 7d
Alerts Actuals Pricing Why this order Rulings
Alerts โ€” firing now
p2 #3131 Cost alerts fire into the void โ€” cost_alert_status() has no delivery channel, and two are firing right now two alerts firing, nobody notified Dev only

cost_alert_status() is read-on-view โ€” nothing polls, emails, or pages it, so an alert is indistinguishable from no alert until a human opens the platform cost console. Two are firing (measured 2026-08-07 11:10 UTC): a daily_spend_spike of $27.44 against a trailing-7d average of $11.07 (a 2.48ร— multiplier), and an unpriced_model alert for openrouter openai/gpt-5.4 (35 events in 7d).

The unpriced model has no rate_card row, so its spend prices to nothing โ€” 763,976 prompt + 11,501 completion tokens, first seen 2026-08-02, last 2026-08-03. The two layers disagree about how they hide it: the SQL layer prices to NULL and excludes the row, while the console's priceUsageRow returns a literal 0 and discloses it via a badge โ€” the dollars are absent either way, but only one says so in the number. rate_card has 12 rows against 8 distinct (provider, model) pairs seen in the last 7 days, so this is a specific gap, not a starved card.

Two separable steps: (1) price the model โ€” add the rate_card row, cheap and fixes the immediate under-count; (2) decide whether alerts need a channel at all โ€” the enrichment_health_sweep pattern (pg_cron โ†’ internal-key endpoint โ†’ Sentry) already exists and runs 144/144 clean daily. A 2.48ร— day is exactly the thing you'd want to hear about without opening a tab.

Provider actuals โ€” reconciliation input
p2 #3132 Provider invoice reconciliation was never automated โ€” 5 hand-entered rows, none since 2026-07-12 estimate is unfalsifiable without actuals Dev only

The cost console compares our token-derived estimate against what providers actually invoice us โ€” the only honest answer to "are these numbers right". Measured 2026-08-07 11:09 UTC: provider_billing_daily holds 5 rows, all hand-entered (source='manual'), 0 importer rows, last entered 2026-07-13, latest billing date covered 2026-07-12. So the panel compares live estimates against actuals ~4 weeks stale, and nothing in the UI says so.

The ElevenLabs importer exists and is deployed with ELEVENLABS_API_KEY set on the running mawja-api process, but its only caller is a dev_tools CLI subcommand โ€” no schedule, endpoint, or cron โ€” so it has produced zero rows. Precise framing: "reconciliation has stopped" overstates it โ€” five manual entries is a process that was never started, not a cadence that lapsed.

What it costs: without actuals the estimate is unfalsifiable. The June reconciliation is the proof it matters โ€” it validated the rate card as exact per-SKU against the Google invoice and attributed the gap to token under-capture in media extraction (~โ…“ of billed tokens recorded), a finding only reachable with an invoice to compare. Options: automate the importers (the pg_cron pattern is proven โ€” enrichment_health_sweep runs 144/144); keep it manual but make staleness visible ("actuals last cover 2026-07-12"); or decide it's not worth it pre-launch โ€” but then the console shouldn't render a silently-degrading capture percentage.

Tenant pricing โ€” revenue input
p3 #3133 tenant_pricing is empty, so revenue and gross margin in the cost console have never had an input margin half never had an input Latent

The platform cost console renders revenue and gross margin per tenant, both computed from tenant_pricing โ€” which holds 0 rows (measured 2026-08-07 11:09 UTC). The margin half of the unit-economics view has never had an input since it shipped; whatever it displays is derived from nothing.

This is a data gap, not a code gap โ€” the code paths are deployed and correct, the table was simply never seeded, which is why it's filed as a decision rather than a bug. And it is not urgent for the reason it looks urgent: Mizo is not live and has no customers (every tenant is friends/family), so there is no revenue to represent โ€” the question is "what should this surface do while there is no revenue".

Options: seed it when pricing is real and render the tiles as explicitly unavailable until then; hide the revenue/margin half and leave the cost side (real and well-populated) standing on its own; or leave it โ€” but then "margin is zero" is indistinguishable from "margin is unknown". Options 1 or 2 both beat a number with no provenance sitting next to numbers that have plenty. Related to #3132: together they are the two data inputs the cost console's derived figures depend on, both empty or stale.

Why is it in this order?

The criterion, top to bottom: a live money-affecting defect firing right now (#3131) outranks the reconciliation input (actuals, #3132), which outranks the gap with nothing yet to represent (#3133).

What it deliberately ignores: priority labels (#3131 and #3132 are both p2, but labels don't capture live firing evidence vs a process that was never started); filing order and age (all three filed within 44 seconds on 2026-08-07); how cheap the fix looks (the cheapest fix โ€” the rate_card row โ€” sits inside the most urgent issue); and code-gap vs data-gap (#3133 ranks last because there is no revenue to represent, not because there is no bug).

Standing rulings

None recorded. track-order.json carries no decided rulings for this track. All three open issues are themselves owner decisions rather than code bugs โ€” none is a defect with a determined fix โ€” so picking one up is deciding something undecided, not relitigating a ruling.

Provenance & forensics

All three issues were filed 2026-08-07, found while cataloguing LLM cost of goods sold for #2937 (the consolidation of overlapping roadmap/inventory docs into two sources of truth), now closed. No PRs or post-mortems yet โ€” every issue is still open. This status page has never been published.