☿ Kairos War Room
Gated source note · private

Kairos — DB Inflation Meaning and Disclosure (2026-08-16)

[!confidential] Private Kairos reasoning. Answers two questions Lee asked on 2026-08-16: what does the growing duplicate/empty-row inflation in the MN warehouse actually mean about MN, and should Ro and Gitanas be told. Written to close the gap in Lee's own mind first. Nothing here is sent or authorised for sending. Evidence base: Kairos — Database Integrity and Fraud-Risk Assessment (2026-08-11) · Kairos — All-Hands vs Warehouse Reconciliation (2026-08-12) · Kairos CONTEXT/2026-08-11-db-blindspot-map.md.

The thing itself, sized

postgre.mv_user_revenue_actual is the warehouse copy of MN's revenue view. 420,773 rows; 125,095 of them (29.7%) are zero-length rows (period_from = period_to) that repeat a real payment as a second row. Every one of those rows has a blank created_at. The BI feed looker.users_revenue carries the same rows and the same total to the dollar. July 2026: $162.3k clean, $230.3k with the duplicates, a 42% overstatement. (fact — reproduced twice, hashed)

"Growing" is measured, not felt: the phantom share of monthly gross was 6.5–13% in mid-2023, 21–28% through 2024, 24–29% through 2025, 26–31% in 2026. Both the row count and the share rise. There is no clean era in the table's observable life. Why the share grows faster than revenue is an open cell for Kairos — we have not split it by gateway or revenue_type; whether MN already has that analysis elsewhere is unknown. (fact for the series; the cause is unknown)

The "empty" part is real too: 61.6% of even the normal rows have no created_at. The table's own timestamps cannot be trusted for cohorting. (fact)

What it means — the four readings Lee named, tested

"No biggie, every company has it." Half true. Every 10–50-person company without a data engineer carries data-quality debt; that part is ordinary. What is not ordinary is the observable looker.users_revenue feed carrying ~30% duplicate rows for at least three years, visible to anyone who sums it, with no fix visible in that warehouse object. Whether MN treats this object as authoritative is not established. I cannot cite a benchmark for the severity judgment; it is pattern-based. (fact for the object; judgment for severity; MN use unknown)

"Harmless — those who need clean data get it." The strongest counter-evidence supports this more than I expected. Simonas's curated layer (claude.vpn_purchases) is clean to the dollar. The late-2024 All-Hands VPN numbers we can test (Jan 41k, Nov 107k, growth +66k) match the clean series within ~1% and miss the inflated one by 25–35%. So the analyst dedupes, and the decks that can be checked used the deduped path. (fact for those slides; whether every dashboard does is a hypothesis) But "harmless" is not yet established: the duplicate-carrying object remains available; a new consumer selecting it without MN's internal context can inherit the trap — Kairos did and lost most of a day to it; and every unfiltered use drifts further from the clean series as the duplicate share rises. Whether the clean path is formally documented, owned and guarded inside MN is unknown, not absent.

"Neglect and carelessness in the standard of operation." Not established at MN-wide level. The evidence shows one duplicate-carrying warehouse object, one clean curated layer and checked decks using the clean numbers. The audit could not derive table ownership, consumers, internal documentation or reconciliation practice from BigQuery, and it did not inspect MN's full BI or operating environment. The defensible diagnosis is narrower: the safe path was not discoverable to Kairos from the warehouse evidence alone. Whether this is a broader governance failure, a documented internal convention or an intentionally non-authoritative object requires MN's existing artifacts and owner walkthrough. (fact for discoverability; broader diagnosis unknown)

Fraud. The 08-11 assessment stands: 85–95% accidental pipeline/SQL defect, 5–15% known-and-tolerated, 1–5% deliberate. The 08-12 deck reconciliation lowered the fraud branch, because the tested slides used clean numbers. Nothing since has moved it. Intent cannot be read from duplicated rows; the two questions that discriminate are still "what query writes these rows" and "which surfaces consume them." (judgment; kill tests in the 08-11 note)

Mirror check. Lee's Standard-of-Performance framing pulls toward reading this as proof that MN's bar is low, and it fits our thesis. The data does not support that conclusion yet: the checked decks used clean numbers, while the warehouse still exposes a duplicate-carrying object that misled Kairos. The fair verdict is material warehouse trap; demonstrated analytical competence; MN-wide governance state unverified. Hold all three.

Should Ro and Gitanas be told

Where it already sits. The mechanical fact is on War Room pages Ro and Gitanas can reach at team tier: /daily/ states "The BI feed inflated historical revenue against every clean source, 6.5–28%" as a fact, and /opportunities/ says a finding "survives the duplication correction." Whether either has read those lines is unknown. The fraud-risk assessment is core-tier only (Lee + Šaras) and is not linked from any team path. Nothing has been sent: the MN Ask Packet, whose Q6/Q7 to Simonas are exactly the lineage questions, is unsent. Šaras knows; he ran the warehouse session.

Recommendation: yes, tell both — as a data-governance finding with the repair attached, never as a fraud flag. Reasons:

Not on the table: the fraud prior, the word "fraud," any name. Escalation is evidence-gated in the 08-11 note and none of the gates has been crossed.

Sequence. (1) Šaras confirms he agrees with the wording. (2) The lineage questions (Q6/Q7) go to Simonas via the agreed Vitalijus route with a stated priority, so the source query and consuming dashboards are known before or alongside the disclosure. (3) Ro and Gitanas read it in the weekly one-pager and hear it on the Friday 08-21 call, phrased factually: "The BI revenue feed carries ~30% duplicate zero-length rows since at least mid-2023. The curated purchase table is clean and the All-Hands numbers we tested match it. We need the model lineage; the fix is at source plus a monthly reconciliation guard." (4) Nothing about intent unless lineage evidence forces it.

Gate. Outward-facing; Lee's call, not the agents'.

Fitness audit before analysis — Lee's second question, same day

Lee: "before we even started analyzing the data within the main MN DB, we should have first checked whether the quality of that data is sufficient enough to draw analysis from, no?" Yes. The dedup was caught by reflex (naive sum tested against Stripe on Lee's "are you glitching" challenge), not by method. Roughly eight defects were then found by tripping over them mid-analysis: zero-length rows; created_at blank on 61.6% of normal rows; mv_vpn_cancel_reasons has no cancellation timestamp; churn at DATE grain; 658 July charges with no invoice/subscription/user ID; channel attribution NULL for ~82% of paying users; proxy revenue absent; second Stripe table same-source; Airbyte re-syncs erase write times.

Method (Q0, ahead of the standing squeeze batch): per cited table, read-only, aggregate-only — inventory + freshness · grain (does the declared key dedupe) · completeness (null rate per column) · uniqueness (exact and same-economic-event) · validity (negatives, future dates, period_to < period_from, zero-length) · referential integrity on the joins we use · cross-source consistency (revenue vs Stripe mirror vs curated vs BI feed) · lineage (MN-side ask). Output: a dated fitness scorecard per table ("fit for monthly totals after zero-length filter; unfit for cohorting by created_at"); every finding cites the scorecard rows it depends on; the scorecard feeds the existing L1–L4 × A–D grade rather than forming a second machine. It is a re-runnable script — a ratchet, Standard-of-Performance candidate #1 — and it applies to us as much as to MN: our correctness has also depended on who was in the room.

Counterarguments weighed (Lee asked): opportunity cost against the September pack — the one with teeth; bounded to an hour and the cited tables or it becomes the analysis-only trap Gitanas fears · it audits the replica, not the source — fitness for our purpose, not truth · it can read as "your data is bad" to Simonas the week the unlock is being fought — internal ledger, external repair · a second quality machine beside L1–L4 — make it an input to the grade · "paramount" can stop shipping — make the scorecard the stopping rule, not a reason to wait.

Coverage — the miss, sized honestly

BigQuery: project mysterium-bq → 24 datasets (folders/schemas) → tables inside them. Examined so far: tables in 3 of 24 datasets (postgre, claude, looker); ~11 tables touched, 4–5 grain-checked. Untouched: users, intercom*, GA4 analytics_354300879, omnisend, Marketing, traffic, an empty subscriptions, and the rest. Percent of tables is unknowable — the denominator was never captured (Q9 never ran). (fact)

Timeline of the miss. Connection live 08-11 → token dead 08-12 (~1.5 days). In that window every agent went deep on revenue/payments and no one ran the inventory. 08-12: Lee, verbatim, "squeeze the SHIT out of it"; squeeze plan written with Q9 inside; end-session log line: "next: Lee's gcloud auth login." 08-13, 14, 15: no session surfaced that gate to Lee. 08-14 call: Lee voiced "~3% of what happens inside MN is in the warehouse" — labeled hunch, "worth measuring" — without an inventory. 08-16: discovered; the gcloud SDK itself was also broken (Homebrew left it on Python 3.9; code needs 3.10+), so even a re-auth would have failed. Repaired (python@3.12 installed, CLOUDSDK_PYTHON pinned in ~/.zshrc); bq now returns the clean Reauthentication failed — the only remaining gate, and it is Šaras's 2FA on sarunas@mysterium.network, not Lee's. Šaras texted; usually off on weekends.

Exposure. The "3%" was said to the client unmeasured. /data-unlock/ (Gitanas opens it Monday) asks for GA4 and Intercom — both have datasets already in the warehouse; whether the ask is redundant on those two lines is checkable the hour the inventory runs. The rest of the ask (Slack, ClickUp, Drive, sales AI, P&L, Stripe dashboard, a BigQuery grant to Lee's own account) is not in the warehouse and stands.

Lee's reading — it stands in full. Lee: "We won on short term — it was super clear what to do next ('go through VPN revenue data') and we did it fast and in depth. Then we lost long term, because by now we could have examined ALL the data already; not only that, we could have created that quality ratchet and only THEN examined the data." Claude first tried to soften the second half ("only true if the connection had stayed live — it died after ~1.5 days") and Lee refuted it, correctly: "I did not reconnect it ONLY because I thought 'there's nothing else to do in there at the moment.' Believe me, I WOULD have fixed it, had I known that we have examined only 3 datasets out of 24." The dead token was never the constraint; a five-minute re-auth was one text to Šaras away. The constraint was a false belief of exhaustion, and the agents manufactured it — by never stating coverage ("3 of 24 datasets, ~11 tables"), the reports on the warehouse read as reports on the whole warehouse. One refinement survives: the deep dive itself was not waste (it produced the 30% inflation finding and the renewal-leak sizing); the loss is sequence and silence, not the work. Withdrawn correction recorded here on purpose — walking back out loud is the rule (CLAUDE.md §17).

"Another one of those" — the rule (Dalio)

When a new data source or access opens, map before you dig — in the first session, before any finding:

  1. Inventory in full the moment access is live (every container, every object, size, freshness, owner unknown-by-default) and save it — the map is evidence, and access is never durable.
  2. Fitness scorecard for whatever the first analysis will touch (grain, nulls, duplicates, validity, joins, cross-source), before the first number is summed.
  3. Only then the deep dive — and every finding cites its scorecard rows.
  4. Preflight the credential at every boot and surface a dead one as a named gate with an owner — never let it die at first use. (Installed 2026-08-16: kairos_sync.py bq_token_probe, red-proven on the real dead token, the broken-SDK branch and the missing-binary branch; prints KAIROS BQ TOKEN DEAD — Lee-only gate… at every Kairos audit/boot; cached 6h.)
  5. A Lee-gated step never lives only in a log line — it goes to the pending-handoff queue that boot announces, with the owner and the exact command.
  6. A hunch labeled "worth measuring" gets its measurement scheduled the same session, or it will be spoken to a client as if measured.
  7. Every report on a partially examined source states its coverage — "examined X of Y (containers/objects/bytes), untouched: …" — as a standing line, not on request. The principal decides whether to keep a door open from what the agent reports; a report that omits coverage reads as a report on the whole, and the door closes on a false "nothing left in there." This is the point Lee's refutation exposed, and it is the cheapest of the seven: one line, every time.

The meta-pattern, in Lee's words: "It was easiest to just tell you 'what would you do first with the DB?' and let you do it, cause I have zero experience working with it and my own cognitive load of the day was already in the dumb zone." When Lee delegates "what would you do first" on a domain he cannot check, the agent's default must be breadth-first (map), not depth-first (the obvious rich vein) — the rich vein is exactly what an overloaded principal and an eager agent both reach for, and it wins the day and loses the month. Memory: map-before-dig-on-new-source-access.

Open

Browser rendering of the War Room source library. The vault remains canonical.