Owner:
tma-doc-steward· Ratified by Aga 9 Jul 2026 for the £/$25K sprint (Sprint 1 ends 22 Jul · $15K break-even by 1 Nov). This is THE list. If a document isn't here, it is not part of the ongoing sprint and no decision should be made from it. The CEO seat (tma-ceo//c-suite) reads this registry first in every cycle.
| # | Document | Audience | Cadence | Updated by | Live URL / path |
|---|---|---|---|---|---|
| 1 | Growth Cockpit — THE daily dashboard | Aga + Nic (shared, daily) | Auto-daily 05:25 + event-driven (retimed 6 Aug 2026 — the whole morning chain now lands 05:00–05:55, before Aga's 06:00 start) | refresh_cockpit_daily.py (numbers) · steward (facts/statuses) · cockpit_watchdog.py (06:30 + 09:00 verify/heal/alert) |
https://tma-growth-cockpit-2026.netlify.app (PERMANENT link, TMA Netlify account) · source docs/company/ANALYTICS/GROWTH-COCKPIT/index.html |
| 2 | Founder operations file 🔒 | AGA ONLY — never deploy, never share, never list (local edits by steward MANDATORY — see Sharing boundary) | Daily numbers strip auto · prose: steward patches locally on EVERY propagation pass | daily job (strip) · steward (prose + facts) | local file on Aga's Mac — not listed on any shared surface (Aga, 10 Jul 2026) |
| 3 | Growth Plan — the sprint's plan of record | Aga + Nic | SYNC markers (daily) · narrative event-driven | estate_sync.py · steward |
https://tma-growth-plan-2026.netlify.app · source docs/company/ANALYTICS/GROWTH-PLAN-SITE/index.html (recovered from Netlify 20 Jul — was external/unsyncable) |
| 4 | Growth Decision Matrix — approved decisions + Sprint Contract §0.5 | Aga + Nic | Event-driven | steward | docs/company/ANALYTICS/TMA-GROWTH-DECISION-MATRIX-JUL2026.html |
| 5 | Strategy Source of Truth — wins on any contradiction | Aga (+CEO fleet) | Amend FIRST, then propagate | Aga approves → steward propagates | docs/company/ANALYTICS/TMA-STRATEGY-SOURCE-OF-TRUTH-JUL2026.html |
| 6 | Sprint brief for Nic | Nic | Event-driven | steward | docs/company/ANALYTICS/TMA-GROWTH-SPRINT-FOR-NIC-JUL2026.html |
| 7 | RC→Amplitude Event Taxonomy (LOCKED) | Nic + all analytics work | Frozen (migration plan required to change) | tma-analytics-lead |
docs/company/ANALYTICS/RC_AMPLITUDE_EVENT_TAXONOMY.md |
| 8 | Scoreboard Operating Model — how the numbers flow | Aga + Nic | Event-driven | steward | docs/company/ANALYTICS/GROWTH-SCOREBOARD/SCOREBOARD_OPERATING_MODEL.md |
| 9 | Paid Experiment Roadmap — growth-fleet wave 2 plan | Aga + Nic | Event-driven | steward | docs/company/ANALYTICS/TMA-PAID-EXPERIMENT-ROADMAP-JUL2026.md |
| 10 | Analytics Master Brief (v2) — THE analytics doc for Nic + dev team | Nic + dev team | Event-driven | steward + tma-analytics-lead |
https://tma-analytics-brief-2026.netlify.app · source docs/company/ANALYTICS/ANALYTICS-BRIEF-SITE/index.html |
| 11 | $15K Cash Operating Doc — the master survival/target doc | Aga + Nic | Live-snapshot via SYNC markers (daily) · closed-month actuals frozen w/ data-asof | estate_sync.py (markers) · steward (prose) |
https://tma-15k-cash-doc.netlify.app · source docs/company/ANALYTICS/TMA-15K-CASH-OPERATING-DOC-2026-07-16.html |
| 12 | Retention Plan — keep/revive members (4,434 exit surveys) | Aga + Nic | SYNC markers (daily) · narrative event-driven | estate_sync.py · steward |
https://tma-retention-plan-2026.netlify.app · source docs/company/ANALYTICS/TMA-RETENTION-PLAN-JUL2026.html |
| 13 | Native Event Catalog — the event build spec (meter/Task 3) | Nic + RN team | Event-driven | steward + tma-analytics-lead |
docs/company/ANALYTICS/TMA-NATIVE-EVENT-CATALOG.html (hub-hosted) |
| 14 | Nic Google-retargeting brief | Nic | Frozen (9 Jul brief) — historical figures data-asof'd | steward | docs/company/ANALYTICS/MESSAGE-TO-NIC-GOOGLE-RETARGETING-2026-07-09.md (hub-hosted) |
| 15 | Canonical truth files 🔒 — machine layer | all agents + jobs | facts = auto-daily 05:25 (machine-owned; retimed 6 Aug 2026) · strategy = decision-driven (HUMAN-owned, no job ever rewrites it) | facts: refresh_cockpit_daily.py · strategy: Aga via /estate-sync |
docs/company/ANALYTICS/GROWTH-SCOREBOARD/canonical_facts.json + docs/company/ANALYTICS/GROWTH-SCOREBOARD/canonical_strategy.json |
| 17 | Findings & Actions (5 Aug) — evidence companion to the Revenue master. 🔴 AGA RULED 5 Aug (eve): TMA-REVENUE-STORY-AND-PLAN-2026-07.html IS the main master doc — the 5-Aug findings, corrected June diagnosis (her framing) and the verified live to-do are FOLDED INTO it (top of 📖 What happened + §12). This doc holds the proof detail behind those claims — the five-change June diagnosis (Aga's paywall framing), paid-ads truth, email section, doc-trap audit, ranked actions AND the live to-do snapshot (§7b). Finance excluded by the sharing boundary — that stays in doc #2 (War Room) + the cut list. Carries its own §0 register. |
Aga + Nic | Event-driven (re-verify before re-quoting; figures are 5 Aug) | steward | https://claude.ai/code/artifact/9c1b8bd1-6c6a-47d2-afb7-d3260fa32c20 · source docs/company/ANALYTICS/TMA_TURNAROUND_FINDINGS_AND_ACTIONS_2026-08-05.html |
| 18 | Cost cut list — dependency-checked, tiered, AGA-103. The cost side had NO owner and NO queue row before 5 Aug. |
Aga | Event-driven (confirm each cut on the next statement) | steward + tma-cfo-controller |
docs/company/FINANCE/COST_CUT_LIST_2026-08-05.md |
| 19 | Quiz Funnel Versions (7 Aug) — the three live quiz funnels compared end-to-end: traffic by source, funnel per version, AOV, buyer retention, lead quality, and the Google-Ads "conversion drop" explained. Carries Nic's 7 Aug three-version documentation recorded verbatim against a live wire-check. Rides the cockpit's mode:"dir" deploy — no new Netlify site. |
Aga + Nic | Event-driven (re-run the §12 commands before re-quoting; figures are 7 Aug and v1 is 8 days old) | steward + tma-analytics-lead |
https://tma-growth-cockpit-2026.netlify.app/quiz-funnel-versions/ · source docs/company/ANALYTICS/GROWTH-COCKPIT/quiz-funnel-versions/index.html |
| 20 | Remarketing Playbook (10 Aug) — the Google + Meta remarketing play Nic builds from: the four abandoner tiers with live sizes (129 checkout abandoners / 9 days ≈ 14/day), the two-rung Google ladder on audiences that already exist, and the Meta finding that three PAUSED retargeting campaigns produced 10 of 12 purchases on 4% of spend (£2.41 vs £280.44 per purchase). 🔴 Carries the measurement prerequisite: 7 biddable conversion goals mean 72 of 76 "conversions" are lead-forms, and five stale Lifetime $297 Promo actions still fire. STANDALONE site — a contractor-facing page never shares a domain with the revenue plan (Aga, 6 Aug). |
Nic + Aga | Event-driven — re-run tools/analytics/remarketing_playbook_pull.py before re-quoting any figure; windows are 1–9 Aug (Google/GA4) and 11 Jul–9 Aug (Meta) |
steward + tma-growth-cmo |
https://tma-remarketing-playbook.netlify.app · source marketing/campaigns/paid-ads/REMARKETING_PLAYBOOK_2026-08-10.html · data tools/analytics/data_remarketing_playbook.json |
| 16 | R1 Cancel-Save System State — retention machine cold-start (Wave A SENT 20 Jul, 24/24; variants via exit-survey cross-ref; watcher + reply-assistant pending; AC winback 976 PAUSED) | all growth/retention agents + Aga | Event-driven (every send/build/score updates it) | Claude (machine) · steward (registry row) | tools/retention/R1_SYSTEM_STATE.md (runbook: tools/retention/AGA_RUNBOOK.md) |
tools/ops/render_settled.py from
canonical_strategy.json settled[], patched between <!--SETTLED:START/END-->. Don't
duplicate these rulings anywhere else, and never hand-edit inside the markers — edit the
JSON. The Matrix itself is SUPERSEDED (4 Aug) and kept as the 8 Jul reasoning archive; its
<!--CANONMRR--> block stays live (the 06:00 job patches it via sub_or_die, so removing it
fails the daily run). ⚠️ settled[] is HUMAN-OWNED like the rest of canonical_strategy.json
— the renderer only ever reads it, and status is verified against live sources, never
inherited from the source doc.Shared with Nic: funnel, efficiency, company P&L (revenue/spend), MRR, churn. Founder-only (doc #2): bank cash, runway, burn, payroll by name, personal spend, valuation/exit. Never in the Cockpit, never deployed. The boundary forbids deploy/share/quote/list — NOT edit (clarified 24 Jul 2026). Every propagation pass MUST patch doc #2 locally like any other registry doc (dated ⚠️ UPDATE annotations on superseded claims). "Flagged for Aga to update herself" is a protocol violation — that pattern left doc #2 stale from 7 to 24 Jul. Its path lives in the steward agent file (local-only), never on a deployed surface.
refresh_cockpit_daily.py (06:00) refreshes the
Cockpit + the founder file's daily strip + the CANONMRR headline blocks in the SoT
and Decision Matrix. Nobody hand-edits numbers. cockpit_watchdog.py (06:30estate_drift_check.py fails the watchdog on any
doc contradicting canonical_facts.json (retired facts, undated MRR claims,
dead navigation).estate_sync.py runs inside the 06:00 job — it patches
every <!--SYNC:path-->…<!--/SYNC--> marker in every registry doc from
canonical_facts.json (numbers) + canonical_strategy.json (strategy facts),
so the WHOLE estate self-heals daily, not just the cockpit. Free prose is never
auto-rewritten — only marker interiors. Historical/closed figures carry
data-asof="YYYY-MM-DD" instead of a SYNC marker./estate-sync — edit canonical_strategy.jsondecisions[]. Retired facts go into bans[] (the drift gate enforces them
estate-wide — never hardcode a ban in Python).docs/… path — that is what the drift gate + estate sync discover),
then create it.data-asof-stamped (historical), or explicitly labeled
MODELLED / UNVERIFIED. A bare current fact is a drift-gate hard failure.2026-08-04 · Doc #4 (Growth Decision Matrix) FOLDED INTO THE COCKPIT + SUPERSEDED (Aga: "is this all folded into our cockpit?" — it wasn't). Verified against the LIVE cockpit: the Matrix was a single link-out row in the 📚 Docs tab pointing at the sprint-docs hub — the pattern Aga banned on 31 Jul ("when I say cockpit that's the doc I mean… render the content into the tab"). Its durable content — §7's nine standing bans + §1's four settled decisions — is now a generated ⛔ SETTLED — don't re-propose block at the top of the 📚 Docs tab. NEW: canonical_strategy.json settled[] (12 rulings, each with unlock = the evidence that would legitimately reopen it) + tools/ops/render_settled.py (read-only on the JSON; marker-guarded; index-splice; idempotent, verified over 3 runs) + a soft-fail run_step in refresh_cockpit_daily.py at 0c-ter (before the L364 in-memory read, or it would be clobbered) + the <!--SETTLED:START/END--> marker pair in the docs pane. 🔴 STATUS WAS RE-VERIFIED, NOT INHERITED — 4 of 12 rulings had moved since 8 Jul: no-blind-paid-scale → superseded by the Paid Roadmap V3 gate ladder + $750 CPP circuit-breakers (the geo-holdout is no longer the named gate) · no-lifetime-to-cold → superseded by a stricter rule, facts.never_lifetime (never sell lifetime at all) · analytics-split-hybrid → superseded by the 10 Jul ownership law (Nic owns web/backend; RN team = store releases only) · no-ten-day-promise → expired. Two more moved partially and are annotated rather than closed: no-cio-before-rc-events — the RC half CLEARED (8 rc_* events live per canonical_facts, as_of 4 Aug) but deliverability is not (991 at 6.9% hard-bounce, NIC-38 open) · no-begin-checkout-as-conversion — quiz-checkout cleared (NIC-41 shipped 3 Aug, maybePrefetch removed) but checkouts-v3 still affected (startCheckout() mints on load). 🔴 CORRECTION TO AN EARLIER CLAIM: these rulings are NOT machine-enforceable as bans[] — that array is line-scoped regex and only works on retired FIGURES; 8 of 9 are conceptual. Hence a separate settled[] array with its own surface, and SETTLED added to the existing ban's allow_context so the rendered register can never hard-fail the drift gate on its own text. Doc #4 carries a dated SUPERSEDED banner (MRR frame replaced by repeatable net cash on 27 Jul; §0.5 dated targets passed; §4 backlog superseded by the Console queue + fleet charters) and stays live as the 8 Jul reasoning archive — its <!--CANONMRR--> block at L83 was left intact (the 06:00 job patches it via sub_or_die; removing it would fail the daily run). Touched: canonical_strategy.json · tools/ops/render_settled.py (new) · GROWTH-COCKPIT/index.html · refresh_cockpit_daily.py · TMA-GROWTH-DECISION-MATRIX-JUL2026.html · this registry. NOT touched: the SoT (also link-out-only — Aga scoped this pass to the Matrix alone) · the SEO/quiz/checkout domain ledgers (their own SCREENED-OUT registers stay in their domain). FLAGGED, NOT FIXED: tools/finance/verify_live_status.py:30 still hardcodes CAP_USD_PER_DAY = 40.0 — the cap retired 9 Jul — as a Python literal, invisible to bans[] because the gate only scans docs. Not firing today (Meta yesterday $26.81) but it will as soon as Meta hits the roadmap's $50/day August test. Awaiting Aga's call.
2026-07-31 · Doc #10 (Analytics Master Brief) restructured into TABS (Aga: "a tab with all the updates… and a separate tab with a to-do list… make sure you cross across whatever has been done"). One 159KB scroll → four tabs at the same URL (https://tma-analytics-brief-2026.netlify.app): 📋 To-Do (22 open) = MRR-30 filter + ⭐Lead→Paid "read first" + hard stops + a one-line-per-task at-a-glance table + cards grouped P0/P1/P2/🔴release · ✅ Done & updates (11) = the dated shipped log newest-first (29 Jul checkouts-v3 · 24 Jul live status · 21 Jul conversion tracking · 13 Jul unlocks) + every banked task struck through · 📊 Systems (§1 status board + §2 release answer) · 📖 Reference (§7–§10 + the per-area working notes). CHANGES OF SUBSTANCE: the master table's Blocks column was lifted out of the table into each task card as a "WHERE IT STANDS" note (rows were a screenful each; nothing lost), the version history collapsed behind a disclosure, and §5/§6 headings dropped (they were nothing but task cards, which moved into the tabs). VERIFIED: element-level coverage 510 blocks → only 3 intentional losses (2 divider rows + the renamed §0 heading); 33 task cards, zero duplicate ids (the 7 RN cards had duplicated across To-Do + Reference on an interim build — fixed); all 4 SYNC markers intact and estate_sync --check = 0 stale; drift gate 0 hard failures; rendered + behaviour-tested at 1280 and 390 (no JS errors, no h-overflow, table # links open their card, cold #task-N deep links switch tab and open). Backup: docs/company/ANALYTICS/ANALYTICS-BRIEF-index.PRE-TABS-2026-07-31.html.bak. AGA RULED 31 Jul — the two Nic briefs stay SEPARATE: the 30 Jul checkouts-v3 audit findings (phantom subs · blur-stamp persistence · /lead 404 · http RETURN_URL · forgeable success page) remain in tma-nic-attribution-brief and are deliberately NOT folded into the master brief. Do not merge them uninvited.
2026-07-31 (pm) · Nic's working board added to doc #10 (Aga: "add ability for Nic to update this like a tick or comments"). Every task card now carries ◐ Doing / ✅ Done / 🚧 Blocked plus a Notes thread; a summary strip on the To-Do tab shows counts + who updated last. Two-way and shared (verified across two independent browser sessions), refreshing every 60s and on tab focus. State lives outside the document in Netlify Blobs keyed by task id, behind a function at /api/state (docs/company/ANALYTICS/ANALYTICS-BRIEF-FUNCTIONS/state.mjs) — deliberately, so the 06:00 estate_sync rebuild can never wipe Nic's input and his ticks never fight the doc's own Status column. Durability PROVEN: a tick + note written, full redeploy run, both read back intact. 🔴 DEPLOY RULE — this site must deploy with --functions or the page ships fine and every tick silently 404s; estate_sync.py's analytics-brief entry now carries a "functions" key and deploy() passes it — never remove it (verify /api/state = 200 after any deploy; functions propagate a few seconds slower than assets). Re-apply the UI after any steward rewrite with tools/finance/patch_analytics_brief_board.py (idempotent). ALSO FIXED while in there: the interim tabbed build had dragged the original page footer's </body></html> into the middle of the Reference tab (invalid HTML, browser-corrected, now clean and guarded in the builder); the at-a-glance table was overflowing the page on mobile (now scrolls in its own box) and long <code> paths now wrap. Access is unauthenticated by design — Aga ruled 31 Jul: no passphrase needed, matching the rest of the internal estate (noindex, unlisted URL).
2026-07-24 (pm) · Doc #2 full staleness sweep + protocol fix (Aga: "what do we need to do to make it the most updated version"). The founder file's body had rotted 7→24 Jul because every pass read "founder-only" as "never edit" and left flags "for Aga". SWEEP: 10 dated ⚠️ UPDATE annotations applied — To-do tab → live list is the Cockpit To-Do; Daily-dashboard tab → superseded by the Cockpit (froze at 6-Jul pull); Cash-forecast tab → live doc is the $15K Cash Doc, July actuals noted; §4 measurement-dark verdict → largely CLOSED (conversion tracking shipped 21 Jul: Google Ads Lead+Purchase, Stripe→GA4 + Meta CAPI; GA4/GTM cross-domain closed 23 Jul; YT mis-attribution fixed 23 Jul; remaining dark = ASA cost feed + app user_id); §4 failed-payment row → 23 Jul adjudication (6.6% by value, personal rail lever); §5 paid-ads → historical-snapshot pill + Meta 7d now ≈$124 + Google Ads API LIVE 21 Jul; §7 July-4 cart → CLOSED 12 Jul pill + $19,997 one-time MTD; §10 Google Ads row NO ACCESS → LIVE (daily cockpit feed; open: gclid→Stripe ROI); §10 quiz-schema row → PARTIALLY CLOSED 21–23 Jul; §8 leak row 8 → largely CLOSED annotation. (Earlier same day: header restamp + leak rows 1/5.) Left as dated history: Turnaround-8-Jul + C-Suite tabs, §6 email snapshot, June P&L/payroll sections. PROTOCOL FIX (the permanent answer): Sharing boundary + row 2 amended — boundary forbids deploy/share/quote/list, NOT edit; steward MUST patch doc #2 locally on every pass; tma-doc-steward.md rule 2 rewritten with the path (agent file is local-only) + the explicit anti-"flag for Aga" rule. Numbers strip stays auto (daily job).
2026-07-24 · Freshness audit of the three top docs (Aga's ask: cockpit · $15K doc · War Room) + War Room reconciliation + 2 dead launchd jobs revived. VERIFIED CURRENT: Cockpit deployed = local byte-for-byte (diff 0), auto-refreshed 24 Jul 06:00, trust receipt all ✅ API-LIVE; $15K Cash Doc deployed = local byte-for-byte, auto-synced 24 Jul via estate_sync (36 markers, 6 sites deployed 06:02). War Room (founder-only, never deployed): daily WARSTRIP auto-refreshes 06:02 but the body carried the two items earlier passes flagged "for Aga to update herself" — now reconciled AT AGA'S REQUEST (she named the file in the ask): header stamp 7 Jul → 24 Jul · leak-map row 1 "AC tier" removed from SaaS creep (billing LOCKED till Apr 2027, downgrade costs more) · leak-map row 5 "recovery stuck at 46% / DKIM+dunning" → the 23 Jul adjudication (June cohort 6.6% by value, Stripe config already optimal, lever = the Jesse-voiced personal rail, ~$160–320/mo modelled, first sends 24 Jul). Line 425 (§ AC saving) was already SUPERSEDED-stamped; line 1266 already deliverability-only. JOBS FIXED (both were silently dead — AUTOMATION_JOB_REGISTER §6 class): com.tma.socialdash exit 126 every run (/bin/bash has no FDA on /Volumes/T9) → ported runner to tools/social-pipeline/refresh_social_dashboard.py under the finance venv python, plist rewritten + reloaded, verified live (board deployed); com.tma.seodailysync exit 78, never spawned (StandardOut/ErrorPath pointed at T9 paths launchd can't create) → logs moved to /tmp/tma_seo_sync.*, reloaded. NEW LAW recorded in the register: launchd logs go to /tmp, never onto T9. Drift gates GREEN (0 hard fails; 1 known WARN: Strategy-SoT '763 subs' stale-token vs steward retirement — cosmetic, marker-fed).
2026-07-23 (link-rule) · NEW STANDING LINK RULE propagated across the content/agent estate (Aga, 23 Jul). ONE rule seeded estate-wide: every UTM/CTA/tracking link in CONTENT (website + BWA pages, blog, emails, social captions, YouTube descriptions/pinned comments, ads) uses the quiz ROOT https://quiz.themovementathlete.com/ as its base — append UTMs to the root. The root is EVERGREEN (redirects to the live variant), so it SUPERSEDES hardcoding /2026-v2-3/ (or any dated quiz-variant path). UTM params unchanged. EXEMPT: checkouts/offer carts (Nic) + explicit offer CTAs (/start-training, /30trial, /50promo) keep their offer URL — folding offers into the quiz root is an OPEN item awaiting Aga. Canonical memory: feedback_utm_links_use_quiz_domain_2026-07-23. ADDED the dated rule (additive, no live rewrite) to 15 operative instruction/knowledge/agent files: EXPERT_PROMPTS/BLOG_CRO/BLOG_CONVERSION_UX_EXPERT_PROMPT.md (§6 UTM law) · EXPERT_PROMPTS/SEO/SEO_EXPERT_PROMPT.md · EXPERT_PROMPTS/ANALYTICS/ANALYTICS_MASTER_EXPERT_PROMPT.md (UTM Parameter Architecture) · .claude/agents/tma-blog-conversion-designer.md · .claude/agents/tma-page-conversion-lead.md · .claude/agents/tma-youtube-copywriter.md · .claude/agents/tma-youtube-seo-strategist.md · .claude/agents/caption-conversion-scientist.md · tools/youtube-pipeline/agents/12-DESCRIPTION-WRITER.md · tools/youtube-pipeline/agents/01-YOUTUBE-CMO.md · marketing/YELLOW DUDE/agents/knowledge-bases/FORGE_FUNNEL_DOCTRINE.md (re-confirmed root) · tools/forge-social-pipeline/FORGE_TMA_SELLING_PLAYBOOK.md · marketing/TMA_EMAIL_DESIGN_GUIDE.html · marketing/!EMAIL…/pre-built/agents/knowledge-bases/UTM_TRACKING_STANDARD.md + OFFER_LADDER.md. NOT rewritten (per additive/conservative law) → MANIFEST for Aga/Claude: ~40 hardcoded quiz.themovementathlete.com/2026-v2-3/ occurrences in LIVE email templates + generators (marketing/email-sequences/967-lead-magnet-quiz-arc-jul2026/*, 967-lead-magnet-welcome-rebuild-jul2026/*, 967-leads-welcome-indoctrination-jul2026/_ac_backup_988*/* + build_967_welcome_arc.py, july4-lifetime-2026/WELCOME-lifetime-no-account*, marketing/seasonal-campaigns/nurture-6week-2026/*, winback-sequence-2026/WB2* + build_967_quiz_arc.py). Left correctly-scoped (NOT content CTAs — variant identifiers/analytics/backend contracts): the /2026-v2-3/ refs in tma-quiz-cro-lead.md/quiz-fleet.md (the live quiz page they optimise), CIO_EVENT_CONTRACT.md (quiz_version field example), TMA-QUIZ-DAILY-WORKFLOW.json VARIANT_MAP, TMA-QUIZ-ANALYTICS-AGENT-PROMPT.md / QUIZ_CRO_AGENT/01_DATA_ANALYST.md (A/B variant analysis), data_quiz_screens.json (puller output), MAR/APR-2026 report HTMLs + deploy mirrors (historical), DEV_HANDOFF.html (webhook source URL). Ambiguous — flagged, not touched: TMA YouTube writers name themovementathlete.com/calisthenics-assessment/ (a WP landing page, not the quiz root) as the destination — whether YT points at the quiz root or keeps the WP page is a destination decision for Aga; rule added, destination unchanged. NOT touched (boundary): War Room / founder ops file · CLAUDE.md · memory dir · checkout/cart + Stripe/Netlify templates (Nic's). Cockpit SEO tab verified already-conforming (uses the quiz root). Drift gate not affected (no marker facts changed).
2026-07-23 (eve) · AC "archive-to-save-on-billing / get-under-50K-before-6-Aug" savings thesis CLOSED estate-wide (closes the flag the dunning pass left "for a separate pass"). ONE truth propagated: the AC account is "Commit Annually – Pay Monthly", LOCKED 9 Apr 2026 → 9 Apr 2027 (any downgrade auto-schedules to term end); contacts used mid-term don't change the price (52K on a 100K plan = same bill); downgrading COSTS MORE — dropping to 50K collapses the migration discount to 35% → $840.45/mo vs the current $761.14 (~$80/mo worse). So archiving/sunset saves $0 — justified by DELIVERABILITY / sender reputation ONLY, never billing. KEPT as a true fact (NOT deleted): the 62%→56% discount step-down on 6 Aug happens anyway during the term — unavoidable, needs no action (only the "so archive to save" action framing was killed). Revisit tier economics at the Apr 2027 renewal. Source: AC support ("Beatriz"), 22 Jul, verified via account admin (memory reference_ac_billing_locked_archive_saves_nothing). Touched (savings-action → deliverability): TMA-15K-CASH-OPERATING-DOC-2026-07-16.html ×4 ("If you do one thing" line · the 3-screenshots checklist "→ get under 50K" · §⑲ "archived off the AC bill" · §⑳ row 4 "Shrink to a healthy list") — deployed tma-15k-cash-doc.netlify.app · TMA-EMAIL-EXECUTION-PLAN-2026-07-20.html ×6 (task #14 body + fix, task #15 body + fix step, §7 outcome, "billing-archive"→"suppression-archive") — banner/§1b/line-422/miss-note were already correct; this pass reconciled the task bodies the miss-note had flagged-but-not-rewritten — deployed email-plan site · AC_LIST_REACTIVATION_AND_HYGIENE_PLAN_2026-07-16.md ×3 (locked-decision #2 annotated, Track-D delete step, Cost line — source doc, no Netlify site) · MORNING_BRIEF_2026-07-22.md ×2 (the two contradictory table rows #8/#7 that still listed the dead play as a live "net-cash saving" task → marked DEAD/deliverability; the brief's narrative §3 + "only you can do #2" were already DEAD-verdict). VERIFIED ALREADY-CORRECT (left as-is): Cockpit Growth-Fleet tab rows 1692 + 1695 (already "sunset for deliverability · saves $0 on the bill · AC locked till Apr 2027") · Email-Plan LIVE-STATE banner + §1b BILLING NUANCE + line-422 struck task + task-#14/#15 miss-note · THURSDAY_23JUL_EXECUTION_BRIEF + the MORNING_BRIEF narrative sections. Drift gates GREEN (estate_sync --check 36/36 · estate_drift_check 0 hard fails). Re-grep clean: zero surviving "off the bill / drops a tier / net-cash saving / get-under-50K"-as-action statements. NOT touched: the founder-only Turnaround War Room (TMA-TURNAROUND-WAR-ROOM-JUL2026.html lines 1028/1264 carry the now-stale "AC tier downgrade after sunset" cost line) — hard sharing boundary, never open/edit/deploy; flagged for Aga to update herself. Kept SEPARATE (untouched): dunning ($160–320/mo rail) + cart-abandonment ($200–350/mo) — different topics, already reconciled. No canonical_strategy.json bans[] entry added — the thesis was never a marker fact, and a blunt "50K/tier" phrase-ban would false-positive on the corrected DEAD-framed text (which necessarily cites the 50K/discount math).
2026-07-23 (pm) · Dunning / payment-recovery reconciled → propagated (the separate topic the cart-abandonment pass flagged as "left untouched"). ONE current truth estate-wide: (a) Stripe/web failed-payment CONFIG is already OPTIMAL (Smart Retries 4×/1mo = max, all recovery emails ON, Card Updater on, Retain off) — no config toggle; (b) the old "$580–1,160/mo" dunning figure REMOVED as a recovery opportunity everywhere (it assumed nothing was running); (c) "already optimal / no lever" REFUTED for renewal $$ by the clean matured June cohort (22 invoices, $1,666 at risk → recovered only 6.6% by value / 18.2% by count; $1,132/68% uncollectible; ~$644–1,288/mo written off); (d) THE LEVER = the Jesse-voiced payment-recovery PERSONAL rail (tools/retention/payment_recovery_lane.py, R1-style, drafts to hello@, Aga manually reviews+sends 0–2/morning, armed --draft daily 05:50; 18 first drafts; first sends Thu 24 Jul; ~$160–320/mo MODELLED) = lever #2; R1/voluntary churn (~$2,130/mo) = lever #1; (e) the "build an AC ladder off list 157 ([TMA] Leads – Failed Transactions Recovery)" idea is RETIRED — list 157 = audit log only. Touched: Cockpit Growth-Fleet tab (Task 1 + BEST/MIN/"do one thing" + Today-tab Judgment line — all free prose, no markers) · GROWTH-FLEET-FINDINGS-2026-07-20.html (Tier-1 row 1 + BEST + MINIMUM + retention lever card + a dated SUPERSEDED note) · TMA-EMAIL-EXECUTION-PLAN-2026-07-20.html Task 21 body + LIVE-STATE banner + Aga to-do (the Task 21 summary header was already current — aligned the stale body to it) · TMA-15K-CASH-OPERATING-DOC-2026-07-16.html §⑱ ① + §⑳ Lane-1 row 1 + BEST/MIN + "if you do one thing" · Analytics Master Brief (ANALYTICS-BRIEF-SITE) Task 21 card + summary table row + §7 line. VERIFIED ALREADY-CORRECT (left): the Email-Plan Task 21 SUMMARY header (ADJUDICATED 23 Jul) · cart-abandonment $200–350/mo content (different topic). NOT touched: War Room / founder ops file (doc #2, founder-only — never quoted) · Strategy SoT / Decision Matrix / Nic Sprint Brief (zero dunning references — verified) · dated advisor snapshots PATH-TO-15K / CONVERSION-FIRST-TODO v1–v3 / POST-JULY4-GROWTH-PLAN / TMA_STRIPE_PAYMENT_ANALYSIS_JUN2026 (predate the 21–23 Jul diagnosis, not in the operative registry, carry no $580-1,160/no-lever/list-157 framing). Flagged out-of-scope (not dunning): the $15K doc's "AC under 50K before 6 Aug" clause is stale per the 22 Jul AC-billing lock — left for a separate pass.
2026-07-23 · Cart-abandonment recovery reconciled → propagated (22–23 Jul work). ONE fact-set made consistent estate-wide: (a) 756/757 "Part 1 & Part 2 – Abandoned Cart Reminder" are BUILT — wired as split tests off the Subscription Cart Abandoned tag (excludes current + lifetime customers, buy-and-exit goals, Part 1→Part 2); 3 recovery emails E1/E2/E3 written + PASS email_lint ×3; CTAs use %ABANDONED_CHECKOUT_URL%; AC field "Abandoned Checkout URL" (field id 56) created. (b) ONE blocker = a single Nic backend task — checkouts run on Stripe PaymentIntents/Payment Element (NOT hosted Checkout Sessions → checkout.session.expired is dead); the fix = write buyer_email/offer/plan onto PI metadata on email-blur + an hourly reconcile that tags PIs stuck >2h unpaid + stamps field 56 (no n8n, no webhook change). Nic brief LIVE: tma-cart-abandon-brief.netlify.app. (c) Sizing corrected to ≈$200–350/mo (the automations were ACTIVE-but-dead — 0 entered ever — so precision, not net-new). (d) Quiz→AC write-back "stall" was a FALSE ALARM — lists "Started the Quiz" (202)/"Finished the Quiz" (200)/tag 242 are DISCONTINUED, not broken; live write-back HEALTHY (Stage 1/2 + .TMA LEAD [APP+QUIZ] + 750), proven by a live contact 23 Jul; removed/annotated as an open bug everywhere. Touched: Email Execution Plan Task #20 (TMA-EMAIL-EXECUTION-PLAN-2026-07-20.html) · Cockpit Email-Plan tab via the SoT tools/email-plan/email_status.json → re-rendered EMAILSYNC block with email_cockpit_sync.py (NO hand-edit of the rendered block) · $15K Cash Doc §⑲ Phase 3 free-prose · TRACKING-SYSTEM cart-abandon brief .md internal note. NOTE: the estate-wide "$580–1,160/mo" figure is the DUNNING (charge.failed) estimate (GROWTH-FLEET-FINDINGS, cockpit To-Do Task 1, Email-Plan Task 21) — a SEPARATE topic, already reconciled to its own $200–350/mo dunning correction — so it was left untouched (never was a cart-abandonment figure). NOT touched: War Room (doc #2, founder-only) · Strategy SoT / Decision Matrix / Nic Sprint Brief (zero references to this topic — verified) · CMO-Advisory / older Nic growth brief / analytics-complete-guide (the "abandoned-cart mirage" = the page-load-PI instrumentation topic, consistent with these facts, not the recovery-email work).
2026-07-20 (pm) · Nic's thread reply propagated (the first real event through the new system). Nic flagged: ① the Lead→Paid meter was invisible on the Analytics Brief (his ⌘F "Lead→Paid" = 0/0 — the correction existed but only 2× as "Lead → Paid" with spaces, and the hero still taught "ad→lead→trial→paying subscriber") ② status: purchase conversions now REGISTER in Google Ads; his next goal = conversion VALUE capture → ROAS (GTM + success-page rewiring, likely bundled with the checkout-pages testing sprint); he's bundling the GA4→Ads import with the meter as one job. Propagated: Brief v2.8 (hero → Lead→Paid both written forms · green box + task-anchor NB "Task 3 in the 16-Jul message = Task 8 here" · Task 8 status+scope incl. value/ROAS · Task 9 bundling note · Task 15 Ads-API ✅ GRANTED 20 Jul) · Cockpit (funnel-box Task-3 disambiguated to brief-Task-8 · To-Do rows 8 + 15 statuses). LESSON → the numbering bridge ("Task 3" vs Task 8) is now stated on both surfaces; searchability counts — write facts in the form people ⌘F for.
2026-07-20 · ESTATE SELF-SYNC SYSTEM built (Aga's mandate: "everything a source of truth, nothing ever un-updated"). New: canonical_strategy.json (HUMAN-owned strategy mirror of the SoT — facts/bans/decisions; the SoT-wins rule now runs through it) · estate_sync.py (patches every SYNC marker in every registry doc from both canonicals, daily via the 06:00 job + on-demand via /estate-sync; --check = freshness invariant) · drift gate upgraded (reads bans[] from strategy JSON, hard-fails stale markers + bare current facts). Registry fixes: SoT row 5 path bug fixed (was invisible to the drift gate since 9 Jul); rows 11–15 added (15K doc, Retention Plan, Native Event Catalog, Nic Google-retargeting, canonical truth files); archived EXTERNAL-TEAM-BRIEF un-backticked. Contradictions resolved this pass: Decision Matrix funnel definition → Lead→Paid; SoT governance line → cap-retired wording; POST-PROMO-PAID-STRATEGY superseded-bannered; cockpit $40/day JS label fixed. Break-even $15K-vs-$12K → Aga decision item (logged in decisions[]; $15K stands per SoT-wins).
2026-07-10 (pm) · THE MRR-30 FILTER locked (Aga) — "Does it touch MRR within 30 days? If not, it WAITS." Three payers: 1 · trial launch (Task 20 ✅ → Task 19 = the only blocker) · 2 · purchase signal (9→5→2/3, +1/7/8) · 3 · non-converter emails (R1 send · Intercom pushes · Task 11 · AC sequence). Everything else (redesigns/fleets/charters/net-new builds) WAITS. Propagated: SoT §3 (law block + locked-decisions row) · cockpit 📋 To-Do (filter banner + 3-payer lanes + lane map + stale Task-20 hard-stop corrected) · Analytics Master Brief (banner + §9 order re-cut into payer lanes + WAITS). Steward rule: every new task in any list gets a payer lane or WAITS.
2026-07-10 (pm) · Growth system SHARED with Nic — private repo calisthenicsacademy/tma-growth-system (cockpit + scoreboard data + sprint docs + engine scripts + growth-fleet agents; 111 files). Both Aga and Nic edit; pushes auto-deploy via the 15-min sync job on Aga's Mac (com.tma.growthsync, growth_repo_sync.py --pull-deploy); the 06:00 refresh pulls Nic's edits before patching and pushes after. Excluded by design: founder file, money-briefs, CFO/CEO seats, all secrets (git-dir info/exclude + .gitignore guards). Watchdog gained a 9th check (repo-sync). Docs-tab/hub listings of the founder file removed everywhere (Aga: "never list").
2026-07-10 · Pipeline hardened after the silent-failure morning (deploy crash 06:46 + 7am email blocked, both invisible). Root causes fixed: launchd cwd (deploy), system-python TCC (email → venv python). Refresh moved to 06:00 daily (Aga). New: cockpit_watchdog.py (06:30+09:00 — verify every pull → self-heal → 🔴 email Aga → HEALTH chip on the cockpit) · estate_drift_check.py (doc-estate consistency gate) · canonical_facts.json (daily machine-readable truth) · every HTML patch now hard-fails on pattern drift (the DATA_MAX chart had been silently frozen at 8 Jul) · hub build removes orphans (retired checklist + superseded 6-Jul dev brief no longer served).
RC_AMPLITUDE_EVENT_TAXONOMY.md; cockpit v18 (iOS/Play daily LIVE via RC Charts API, FX bug fixed, two-goal headline); founder-file daily strip wired into the 06:45 job.build_docs_hub.py). Cockpit gained a 📚 Docs tab + direct "Growth Plan ↗" link in the tab bar. founder file never copied to the hub.rc_* in the project our API key reads → cockpit flags RED→AMBER with the one question for Nic (which Amplitude project?); auto-check wired into the 06:45 job (flips the flag text when events land). Touched: cockpit (Today + Wiring), taxonomy doc §Verification, Nic sprint brief callout, hub rebuilt, memory.docs/company/ANALYTICS/TMA-PAID-EXPERIMENT-ROADMAP-JUL2026.md (growth-fleet wave 2: ASA-first MVE, Meta app-installs killed, Google UAC last-after-wiring, free experiments = the lowest-hanging fruit). Registry row: audience Aga+Nic, event-driven updates via steward. Roster fix: tma-funnel-cro-lead added to /growth-fleet.rc_initial_purchase + rc_cancellation in Amplitude (95→97 events), canonical names. PARTIAL: 13/15 lifecycle events absent (enable RC event toggles; rc_renewal ~6/day is the important one). Touched: cockpit Today flag + Wiring card + daily-job auto-check, RC_AMPLITUDE_EVENT_TAXONOMY.md, Nic sprint brief, paid-analytics checklist row 10, memory.PAID-ANALYTICS-REQUIREMENTS-CHECKLIST.md (hub-hosted).docs/company/ANALYTICS/ANALYTICS-BRIEF-SITE/index.html). Folds the 6 Jul dev brief + the paid-strategy requirements + T2-landed status into ONE document: system status board (RevenueCat/Amplitude/AppsFlyer/Meta/Google/GA4/ASA/web) · 20 click-to-expand tasks with step-by-step instructions, "where it's done", owner, and a 🟢 no-release / 🔴 needs-release pill on each · explicit dev-team split (only T4 identity + T7 events need a store release) · suggested order · the 3 open questions. Supersedes TMA-ANALYTICS-EXTERNAL-TEAM-BRIEF.html (kept as archive).refresh_cockpit_daily.py now pins NETLIFY_AUTH_TOKEN for the account that owns the tma-* sites.f4957459-6026-4693-8b63-d12e4fa065b7 under account themovementathlete (old site aafd8b18 under guthealingmama deleted; name reclaimed). Netlify has no in-place transfer API — the procedure is: create under target account → deploy → verify → delete old (frees name) → PATCH name.$appsflyerId present on all recently-active RC profiles → Task 5 needs NO release (was the open question); $amplitudeUserId absent on all → RC events won't stitch to Amplitude ids until T4, added to Task 1; Task 9 NOT verified done — 3–9 Jul GA4 fired 94 purchase events vs 62 Stripe charges (1.52× duplication) from 50 users (81% capture).Intercom.sendTokenToIntercom()), the 5-minute decisive check (Contacts filter: Enabled push messaging is true + Email is unknown + First seen < 60 days), how to send (Outbound → Push, deep-link to workout screen, one send only), and two cautions (Intercom bills on contacts; push only reaches permission-granters). Zero contacts on that filter = anonymous installs never reach Intercom → loginUnidentifiedUser() on first launch = external RN team + store release.marketing/campaigns/checkouts-v3-mobile/NIC_BRIEF.md: #19 Checkouts-v3 Stripe wiring (8 pages, SetupIntent/trial + first-cycle-discount branches, server-side consent log), #20 AC Day-5 trial reminder = HARD STOP (promised on-page, must send before any trial runs), #21 production serving from checkout.themovementathlete.com (Aga's call). Same table + click-to-expand steps live on the Master Brief. Intercom Task 12 clarified (live push already sending → SDK+creds+token likely done; only open Q = are anonymous never-signed-up installs registered)..env.local) → live audit: anon never-signed-up installs NOT in Intercom (need RN loginUnidentifiedUser() = store release) BUT ~40.9K signed-up app users push-reachable NOW → retargeting ladder can go by Intercom push today. Tool tools/finance/intercom_push_audit.py. Counts now 18 of 20 tasks no-release.tma-intercom-expert (.claude/agents/) added to /growth-fleet roster + governance charter (retention org, serves growth). Intercom folded into the CANONICAL cross-project EXPERT_PROMPTS/GROWTH/DATA_ACCESS_REGISTER.md (now the "what do we have access to / where did this number come from" source of truth for ALL agents) — plus refreshed the stale Google Ads (creds now present, 2 paths) + Apple Search Ads (key added) entries and added an at-a-glance access table. Tool tools/finance/intercom_push_audit.py.PAID-ANALYTICS-REQUIREMENTS-CHECKLIST.md → redirect pointer at the Master Brief (it had drifted to different numbers); removed its stale hub card. The Master Brief (tma-analytics-brief-2026) is now the single canonical analytics/wiring doc to send Nic + external RN team. Cockpit To-Do also gained a Revenue & decisions group (R1 send · July-4 close · paid-strategy approval · Intercom retargeting-now · ASA brand defence) so non-wiring actions aren't lost.id="task-N" anchors; cockpit 📋 To-Do and 📊 Analytics each gained a big "📄 Master Brief — the full step-by-step for Nic" banner, and every wiring-queue row # deep-links to its task in the brief (…/#task-N). The legacy Wiring tab (older instrumentation tracker, duplicated the new Analytics tab) was RETIRED — its unique data-quality facts (begin_checkout inflation, the 32 app events) folded into 📊 Analytics. Now one home for "what's wired" (Analytics), one for "what to do" (To-Do), one full spec (Master Brief).canonical_strategy.facts.kpi); the surfaces simply never reflected it. New cockpit tab 🎯 $15K (now the default tab; nothing removed — every existing tab kept). Two new engines, both wired into the 06:00 job: tools/finance/flow_metrics_pull.py (per-day customers won / trials started·converted·died / cancellations requested+ended / plan mix / MRR moved — both rails: Stripe ×2 + RevenueCat Charts → data_flow_daily.json) and tools/finance/kpi_15k_sync.py (repeatable-cash pace vs $15K, the sales ladder, the two dials, spend-cap state, both funnels, and a computed "what's binding today" call → kpi_15k.json, patches <!--KPI15K-->). Slack post + 7am email rebuilt on the same JSON — everything they already carried is kept, the $15K blocks sit on top; email subject now leads with pace/gap/net instead of MRR. Ad-spend cap breach ($3,000/mo all-platforms) now alerts on all three surfaces with a month-end projection.
Five defects found and fixed while building — each was shipping daily:
(1) var WINDOWS in the cockpit (the "New paying subs / Cancellations" card + scoreboard tiles) was hand-typed and frozen at 9 Jul with no script writing it — 16 days stale; now script-owned, with June's pre-event-horizon figures preserved as a documented constant.
(2) daily_cockpit_email.py counted new subs, cancellations and MRR from Stripe key 1 only, silently excluding the second account.
(3) The email quoted the RETIRED "$30–40/day" ad cap (superseded 9 Jul by $3,000/mo all-platforms) in every send.
(4) The ledger trap: the MRR/sub headline counts status=active only, so live trials are invisible — net ≠ won − lost. The tab now states this and carries measured book movement from data_northstar_history.json as the arbiter.
(5) A category error in the first cut of the ladder (mine): it added subscriber-count churn into a cash requirement, implying ~$19K/mo of sales to close a ~$7K/mo gap. Corrected to the $15K doc's own model — gap ÷ cash-per-sale, churn reported alongside.
The finding that came out of it: only 15% of this month's 34 web sales were annual, so the average sale banks $53 instead of $157. Annual-led needs 47 sales/mo (1.5/day); at today's mix it takes 139/mo. Lead volume is not the binding constraint (need ~15/day, we get ~22) — the mix is, worth ~3× the cash on the same traffic. Directly supports the standing SELL-ANNUAL doctrine.
Basis discipline: app net revenue is carried at the last closed month's official store proceeds (data_app_proceeds.json), never RevenueCat gross — verified 25 Jul that RC's revenue_type=proceeds param is silently ignored and its gross↔official-net ratios (2.45 / 1.59 / 0.93 / 1.02 across Mar–Jun) make mid-month app net underivable. Every figure carries a LIVE / CONFIRMED / LAGGED / MODELLED tag.won silently summed four different things. Fixes shipped to all three surfaces (cockpit tab · Slack · 7am email): WON is now a visible sum — ① bought at a discount (no trial) + ② trial converted + ③ app new + ④ app resubscribed — with the line "this is why '4 won / 0 trials started' is normal" printed under it, and a code-level assert won == sum(components); paying churn, cancel-requests vs cancel-ended, and NET all carry their definitions inline; a definitions block ends every surface. Taxonomy locked: a LEAD gave contact details or made a free account and is NOT a customer; a customer arrives by exactly two paths (carded trial-start, counted at CONVERSION · direct discounted purchase, no trial). "Web" retired as a label → "Funnel 1 · Quiz / assessment"; iOS and Android are now Funnels 2 and 3, never merged (per-store paying subs, trials, revenue and net movement all live from RevenueCat by store). App free sign-ups are counted as LEADS, not customers (Aga's rule). NEW tools/finance/lead_sources_pull.py → data_lead_sources.json, wired into the 06:00 job before kpi_15k_sync: every lead source is printed daily with a LIVE / PARTIAL / NOT WIRED status and a reason — themovementathlete.com (12 contacts ever) and BWA (~1.9M impressions/28d, captures nothing into AC) now appear every day as visible holes rather than absences. 3 of 5 lead sources are dark.
Six more defects found and fixed in this pass:
(1) funnels() read fm["web"]["7d"] but the real shape is fm["windows"]["7d"]["web"]["steps"] — every funnel step was silently empty, and iOS/Play were already split in the source file but were being collapsed into one "app".
(2) The quiz lead-rate divided quiz leads by all-site sessions (8,841) instead of quiz visitors (390) — a meaningless "1.11%". True in-quiz rate is 23.8%.
(3) daily_cockpit_email.py still hardcoded CAP = 40.0 — the retired $30–40/day cap — so it fired a red "SPEND ALERT" on any day over $60 even when spend was below both the real budget and its own average. Now keyed to the $3,000/mo cap's daily implication (~$97) and requires an upward move.
(4) The email's "New subs / Cancellations" tiles ran their own Stripe pull and disagreed with the $15K block in the same email (−1 vs 2). Now read the same JSON — one fact, one source.
(5) The email's "Paid spend MTD" ($5,460, own Google pull) disagreed with its own cap banner ($4,881, canonical). Unified.
(6) lead_sources_pull counted "yesterday" unbounded, silently including today — 17 vs the existing block's 13 for the same day. Bounded at today.
App revenue basis changed (Aga's ruling): from carrying last closed month's proceeds → LIVE RevenueCat gross × a calibration ratio from the last MATURE closed month (Jun: iOS 1.020×, Play 0.755×), tagged MODELLED with the ratio and its source month shown; recalibrates automatically as data_app_proceeds.json gains closed months. Hard guard: pre-May-2026 RC data is excluded from calibration — official iOS net exceeds RC gross in Mar/Apr (3,123 vs 1,276), which is impossible, so RC's own history is incomplete before then (this is what made the earlier ratios look random). Verified 26 Jul that RevenueCat exposes no proceeds endpoint (metrics/overview = gross revenue only; the Charts API accepts any parameter and silently ignores it, so revenue_type=proceeds is a no-op) and that there are no App Store Connect / Play Console credentials — only Apple Ads.
⚠️ Open reconciliation, flagged not blocked (Aga's ruling): an iOS ratio of 1.02× contradicts Apple's 15–30% commission, so either RC's revenue is already net or the figure entered as "Total Estimated Proceeds" is gross — the app portion could be ~15% high (~$350–500/mo). Visible as a ⚠️ on the $15K tab and in the email, and logged as Task 28 in the Analytics Master Brief (5-minute App Store Connect check; adding ASC API keys would close it permanently).