Orientation · 11 September 2026
One bet, three document lanes, one roadmap. Everything scattered across those sessions is one of those three lanes describing the same company from a different angle — here they are reconciled against what the code actually says today.
Reconciled from · astromatrix-flutter docs/ (5 strategy docs) · astromatrix-nodejs docs/ (fire register, 129 numbered issues) · docs/product/ (13 design docs) · git log + working tree on new-ui
The short version
The roadmap is competitive-position-2026-09.md §7 — Horizon 0 / 1 / 2. Nothing else is a roadmap. Everything else is either evidence feeding into it, or a defect register tracking what breaks underneath it.
Relationships as structural distribution. Committed for the quarter. Can AstroMatrix generate users from users?
Nothing can be graded. Per-user events don't exist, so no shipped fix in the register can be proven to have worked.
24 commits are unreleased. Two days of fixes sit in the repo with no version bump, in nobody's hands.
State of the code
Checked against the working tree, not against a prior summary.
master is unused.products_config.json at 1.2.0.The aspect-grid fixes, the Matrix auto-pairing fix, the purchase-queue drain, four telemetry repairs, the AI report language fix and the app_version metric tagging are all committed and in nobody's hands. They were written on 09-10 and 09-11; the last release was cut on 09-08. Cutting a build converts two days of finished work into shipped work, and it is the prerequisite for measuring any of it.
The quarter's bet
The diagnosis behind it: Android active installs fell 137,256 → 88,659 over four years — steady, structural, not a bad release. In that same period product work was real and effective, but no feature ever had "create a new user" as its primary job. This quarter tries the one mechanism that has never been tried.
| Element | Decided |
|---|---|
| Question | Can AstroMatrix generate users from users? |
| Loop | Add a partner → generate a live relationship reading (strongest connection now, current tension, what's changing, next window) → send it → recipient opens with no install required → recipient is the subject, not a bystander → they create an account to unlock their side. |
| Audience | State 2 — accounts holding 2+ charts who have never opened the relationship screen (72.2% of them), and Self-Explorers. Explicitly not Newcomers, who already carry too much setup burden. |
| Hard constraint | Do not gate the first reading behind the partner installing. If the loop fails it must be because the mechanism doesn't work, not because users resented a gate. |
| The test | Does attributable acquisition from this loop exceed enough of the existing loss rate to change the net curve? Not engagement, not shares — new users who appeared because existing users brought them. |
| Ships alongside | The funnel instrumentation. Named as a prerequisite, not a follow-on. |
Not because they lack value — because running them in parallel makes the one question unanswerable: more chart types · more generic interpretations · broad Ask-AstroMatrix development · journalling expansion · meditation/harmoniser expansion · a generic social feed · a large UI redesign · extensive ASO iteration · growth-content campaigns · the offline/local-calculation feature.
The roadmap, unified
The items are from competitive-position-2026-09.md §7. The status column is this session's check against the repo and the fire register.
Entirely additive or price-side. Carries no grandfathering exposure. There is no case for scoping a new paywall limit until 0.1–0.4 have shipped and been measured — until then nobody knows what the product converts at when its entrance is findable and its paywall describes the real product.
| # | Action | Status | Where it stands |
|---|---|---|---|
| 0.1 | Replace the store's plan copy | Unreleased | Committed a16c5d50. The "50GB storage / 24-7 support / API access" copy was also found to be dead code that never rendered — belt and braces. |
| 0.2 | Fix the lifetime SKU | Your call | Untouched. 41% of purchases and the single largest structural cap on LTV. Reprice to 3–4× annual or retire it; stop stacking −30% on it. No existing user loses anything. |
| 0.3 | Delete the false upgrade bullets | In working tree | Two removed earlier; ISSUE-147 removed two more ("Every chart type", "Reports in your language") after tracing every gate and finding neither is gated anywhere. Paid plans now show three bullets. |
| 0.4 | Link the store and reports | Open | The highest-value unstarted item in Horizon 0. The /premium dead-end behind all 12 gates was fixed 09-07, but the store still has one inbound link in the whole app (0.2% reach) and reports have no route at all — modal-only inside 6 screens, 7.8% reach, plateaued after launch. ISSUE-76. |
| 0.5 | Decide the language gate | Decided in code | Effectively settled by default: ISSUE-147 pulled language off the paywall and e6c07df5 now sends the user's language with AI report requests. Worth confirming on paper — and note ISSUE-146, where the Matrix AI report is still English-only for everyone. |
1.1–1.3 are the core bet — make the relationship layer timed, legible and not only romantic. Everything else in this horizon distributes it.
| # | Action | Status | Why it's on the list |
|---|---|---|---|
| 1.1 | Relationship transits — "what's happening between you two this week" | Not started | The angle nobody else can match. The engine already treats composite as natal and the 3-slot orb system already covers transit-to-composite — this is not an engine build. Turns a one-shot verdict into a daily reason to return. |
| 1.2 | A one-word verdict on every pair | Not started | We compute more and conclude less. A dashboard can't be retold; a single word gets screenshotted. |
| 1.3 | Relationship types — friend, family, colleague, partner | Not started | 9 of the 12 facets are already relationship-neutral. The astrology is non-romantic already; only the packaging is romantic. |
| 1.4 | Invite-from-chart flow | Not started | 155,361 accounts already hold another person's chart. The highest-ROI person-to-person moment in the product, and our largest dormant asset. |
| 1.5 | Shareable pair card — "Us", not "me" | Not started | The competitors' actual unit of growth. We share only self-charts today. |
| 1.6 | Fix the cold-arrival landing | Not started | 93.2% of share-link visitors to relationshipfacets bounce in under 10 seconds. Do this before 1.5 sends more traffic at it. |
| 1.7 | Public-figures database | Not started | The famous fields exist with zero rows and the isFamous param is read but unused. Cheapest viral surface in the category — a content job, not engineering. |
| 1.8 | Promote the synastry wheel | Not started | It sits sixth in the chart dropdown, below Progressed. A practitioner chart outranks the one chart a normal person came for. |
| 1.9 | Surface comparisons to the 72.2% who never make one | Not started | 1 → 2 charts moves conversion 1.58% → 5.92%. Needs pre-filtering and a cap: O(n²), 79,800 pairs at 400 charts. |
| 1.10 | Resolve MessagesScreen — foundation or delete |
Not started | Don't build a second messaging surface beside an unreachable one. ISSUE-47. |
| 1.11 | Contextual reading button on the relationship surface | Not started | The cheapest link in the app. Pastes both names in as the tarot question — which is the question users already type by hand. |
| 1.12 | Refresh the video library | Not started | Owned channel, stale content. Production not engineering — and it cheaply tests whether presented content lands before committing to an audio hire. |
| 1.13 | Per-user event measurement | Half shipped | Blocks all pricing work. The cheap half shipped 09-11 (fcd34d34 — app_version on every metric at the single choke point). The expensive half is real design work: Prometheus is aggregate-only, so a uid label across 460,694 accounts is a cardinality explosion, not a one-liner. ISSUE-77 / ISSUE-142. |
| # | Action | Status | Note |
|---|---|---|---|
| 2.1 | The Coach / Oracle session layer | Specced | Full spec written across three docs, nothing built. The answer to the only real competitive weakness. Budget the LLM cost against the revenue shape — total AI spend today is $80.79/month, of which only 25% is the product. |
| 2.2 | The Oracle as a shareable weekly card | Specced | Turns the Coach into the social object the product currently lacks. |
| 2.3 | Practitioner marketplace | Concept | Power users take paid consultations, we take a cut. Built on 4,011 Astrologers at 54% conversion plus the P2P substrate. The largest revenue model in the category, and the only one competitors can't replicate. |
| 2.4 | Audio | Gated | The stack is already shipped; the content needs a hire. Do not schedule until 1.7 has told us whether presented content lands at all. |
Fix the revenue shape and ship additive value before subtracting anything. The product is already perceived as harder to use than a cheaper competitor, and the internal rating moved 3.78 → 3.44 on a change that added something. Adding limits to that product risks making the limit, rather than the packaging, the reason to leave.
Where to look
Every doc you've seen belongs to one of these. They are never the same document, and the derived copies are the ones that go stale.
nodejs/docs/FINDINGS-2026-09-11.md is the reconciled baseline — the verified fleet numbers, and the list of figures that were wrong and are still being quoted elsewhere. It opens with its own errors before its findings. If two docs disagree about a number, this one settles it.
Evidence
One variable explains most of the business, and it isn't a behavioural segment. It's how many birth charts an account holds — a 34× spread, perfectly monotonic. Visit frequency spans only ~2.5×, and behavioural segment membership collapses to no effect at all once charts held is controlled for.
| Segment | Charts held | Accounts | Ever paid |
|---|---|---|---|
| Solo | 1 | 300,710 | 1.58% |
| Curious | 2–3 | 102,069 | 5.92% |
| Enthusiast | 4–7 | 37,709 | 13.94% |
| Collector | 8–15 | 11,440 | 34.29% |
| Astrologer | 16+ | 8,766 | 54.24% |
| Fleet | — | 460,694 | 5.37% |
Two consequences fall straight out of that table. ~11,500 accounts hold 8+ charts and have never paid — demonstrated demand, unconverted, a conversion play rather than a pricing one. And the 1 → 2 chart step is the largest behavioural lever over the largest population, which is exactly what the quarter's bet is built on.
The usage-stats sample covers 16.6% of accounts, skews engaged, undercounts volume 14–44× and inflates conversion ~2.8×. Anything dated before 2026-09-07 carries that error.
| Still quoted somewhere | Verified against production |
|---|---|
| 15.02% ever paid | 5.37% |
| 448,892 accounts | 460,694 |
| Solo: 35,430 at 4.69% | 300,710 at 1.58% |
| Synastry ≈23% of chart views | 6.5% |
| Practitioners near-saturated — an ARPU play | ~11,500 unconverted — a conversion play |
| "316 documents carry user text" | 4,544,139 stored tarot questions |
Re-derive anything fleet-wide with node scripts/_analytics.js verify — about 2.5 minutes against live production, no cached stats.
Already paid for
Repeatedly, strategy passes proposed things that turned out to already exist. These are code-verified as present and unreachable — the common shape is that the computation exists and the distribution doesn't.
| Asset | Verified state | Missing piece |
|---|---|---|
| Universal sky-event engine | Void-of-Course, Out-of-Bounds and moon phase are computed with no chart, no location and no user — and a batch generator already writes 4 years of them to JSON. The live API returns post-ready sentences today. | Any publishing or broadcast layer. Nothing reads the generated files. |
| Event-triggered broadcast push | The client receiver is fully wired on a MoonPhases topic channel. |
The sender. Absent from all three repos. |
| Big Three rarity | ~165k charts with stored Sun/Moon/Ascendant including house. | Any feature that uses it. |
| Astrocartography | 894 lines, substantially complete — and advertised on the website as shipped. | One timezone bug misplacing lines 100+ km, plus un-gating the flag. |
| The onboarding answer | Step 2 asks "what do you need answers about?", requires an answer to advance, and discards it in the same frame — never persisted, not even as an analytics label, since it shipped in Dec 2025. | One field. Roughly a day's work, on a self-declared life priority collected from 100% of new users at peak intent. |
| A behavioural store | users.stats accumulates per-screen visit counts and dwell times for every user, syncs to Mongo, and survives reinstall. |
Nothing has ever read it. No surface, no report, no AI prompt. |
| Three native home-screen widgets | Moon Phase, Sabian Symbol and Planetary Hours — built twice, once for each platform. | Unknown whether they're promoted anywhere. Their Android refresh was also broken for months by the install-referrer bug. |
Blocked on you
Each of these has the analysis finished and is waiting on a call, not on engineering.
Two days of finished fixes, including the instrumentation that makes every later question answerable, are sitting unreleased behind an unchanged version number.
41% of purchases and the largest structural cap on lifetime value. The recommendation is 3–4× annual or retirement, and stopping the −30% stacking. No existing user loses anything either way.
Birth locations silently mismatched from their town labels. The id-based fix is live and stops new profiles hitting it, but the rollout — auto-correct 39,839 high-confidence records, ask the other 8,737 to re-enter — was designed and never started. This is the largest data-integrity exposure on the register by account count, and it stays frozen until someone says go.
Removing the two ungated claims leaves the paid plans showing three bullets instead of five. Nothing was invented to fill the gap. Whether a fourth gets added is a copy decision, owned by positioning-and-paywall-copy.md.
The Summary + All Aspects report is gated as an oversized payload, but the gated path allows 50MB against an estimated ~1MB report. The 100kb limit that is real belongs to a route that button never calls. Needs the original dev to say whether it was ever measured — otherwise it should be re-justified as a render-memory gate and moved to the PDF path.
It has already been made in code — language came off the paywall and now ships with AI report requests. That forecloses charging for localisation, which is a real strategic choice worth making deliberately rather than inheriting.
Housekeeping
Part of why this feels scattered is that the doc meant to prevent scattering is out of date. Verified against both files today:
master deploys straight to production ungated, and the suite is currently red with 82 failures. ISSUE-142: release attribution, whose absence is why no fix in the register can be proven to have worked.The fix is a regeneration from the master register, not another patch. Until that happens, check the master's index before concluding any Flutter issue isn't tracked.
How this page was built. Every status claim was checked against the current file or the repo rather than carried over from a prior summary: commit counts and the version from git log and pubspec.yaml; issue numbers and states from the master fire register's index table; fleet figures from the reconciled findings doc. Where a doc and the code disagreed, the code is what's reported above. This is a snapshot of 11 September 2026 and will drift — the underlying documents stay authoritative.