Flutter Work Assignment
AstroMatrix · Flutter UI/UX worklist · 2026-10-16 · provisional

Who fixes what: Track 1, Track 2, and the rows that need no code

Every open row in the 20 UI/UX groups (232 rows) was checked against the current code at new-ui 5ea6ac03, and against release state, before anything was assigned. A row counts as still broken only with evidence: a file and line, a metric, or a dated customer report with its app version. Nothing was implemented, pushed or released during this triage. Each row also carries this triage as a dated note in the register.

5Track 1 rows (our dev), now 4 tasks done locally
62Track 2 rows (other developers): payments, Node, native, engine, async
91Verify only: fix already in code, needs evidence
45Blocked on a product or UI decision
23Not a defect: discoverability, feature request, or working as designed
6No work: legacy-only, and legacy is deprecated

Where the provisional split changed after checking the code

Track 1: our dev, in order (all four done locally)

Five rows, four tasks (ISSUE-43 shares ISSUE-733's fix). Approved and implemented 2026-10-17, reusing existing widgets, with focused tests. Committed locally and not pushed. No chart calculation was changed.

1

ISSUE-43 Support chat bubbles are plain Text (message_detail_screen.dart:550) so Android support text can't be selected; web text-select reported broken.

Evidence it still exists
lib/views/message_detail_screen.dart:550-557 (Text, no SelectionArea; 0 SelectionArea in lib/views/message*.dart vs 12 elsewhere); report 2026-10-13 [customer]
Where
lib/views/message_detail_screen.dart:550 (or wrap message list at :440)
Reuse
SelectionArea as used in lib/widgets/component_summary.dart:1183
Test
Widget test: long-press support bubble shows selection; Android device check
Done
d69e9c99, local, not pushed. Emulator: long-press on a support reply shows Copy / Share / Select all.
Risk · difficulty
low · easy
Customers
9 linked customer(s); latest 2026-10-13 on 11.1.6
Note
Bundle with ISSUE-733 item 2: same fix (SelectionArea on support chat bubbles, message_detail_screen.dart:550). Web text-select report is separate (Flutter web).
1

ISSUE-733 Compose box grows without limit and has no Return key, and message bubbles can't be selected or copied. Items 3-4 (missing replies/history) are unreproduced.

Evidence it still exists
lib/views/message_detail_screen.dart:479-480 maxLines:null + TextInputAction.send; :550 bubble is plain Text; customer reports 2026-10-13/14 v11.1.6
Where
lib/views/message_detail_screen.dart:467-482 (minLines 1, maxLines ~5, newline action), :550 (SelectableText/SelectionArea)
Reuse
SelectableText as used in lib/views/report_screen.dart; send IconButton :490 stays
Test
Widget test: long text stays bounded and scrolls; Return inserts newline; bubble text selectable. Android+iOS keyboard check
Done
d69e9c99, local, not pushed. Tests: support_chat_compose_and_options_test. Emulator: 8 lines typed with Enter stay in a 5-line scrolling box, Return key shown, nothing sent.
Risk · difficulty
low · easy
Customers
row-level 0; detail: 15 customers, latest 2026-10-14 v11.1.6
Note
Only items 1-2 are SELF; split 3-4 into a repro task.
2

ISSUE-331 Support option chips send on every tap with no in-flight, sent or disabled state. Repeat-tap bursts continue (5 per 7d).

Evidence it still exists
lib/views/message_detail_screen.dart:285-288 _handleOptionTap sends unguarded; :561-573 ActionChip always enabled; _verify 2026-10-15: 5 repeated pairs/7d
Where
lib/views/message_detail_screen.dart:251-288, 561-573
Reuse
setState in _MessageDetailScreenState; disable chips once one option of that message is sent; Node collapseRepeatedMenuTaps already merges repeats
Test
Widget test: tapping a chip twice sends once and chips disable; then _verify --only=331 on new build
Done
269a0704, local, not pushed. Tests: support_chat_compose_and_options_test. Not exercised live: tapping a chip would post a real message to the production support inbox.
Risk · difficulty
low · easy
Customers
no row-level reports; group G15 record: 58 customers
Note
No Flutter commit has ever touched this; the nextAction's 'builds with the fix' don't exist.
3

ISSUE-662 Lunar/Solar Return fall to default panel titles 'Birth Planets'/'Transit Planets', mislabelling the return chart as birth.

Evidence it still exists
lib/services/chart_service.dart:836-837 and :881-882 default case; [customer] 2026-10-11 11.1.5 (LR Asc shown under 'Birth')
Where
lib/services/chart_service.dart:814-890 (getChartTitles / getChartTitlesWithUsers)
Reuse
existing per-ChartType switch in getChartTitles
Test
Unit test getChartTitles(lunarReturn/solarReturn); device check Lunar Return screen
Done
7faf3530, local, not pushed. Tests: return_chart_titles_test (all chart types pinned). Emulator: Lunar Return panel reads Lunar Return Planets, same planets (Sun 5°57 Libra).
Risk · difficulty
low · easy
Customers
3 linked customers, latest 2026-10-11 on 11.1.5
Note
Ascendant value likely correct for the return chart; only the label is wrong.
4

ISSUE-725 The tarot card widget has no Semantics, so VoiceOver reads only the image and never the card name, position or meaning.

Evidence it still exists
flip_tarot_card_widget.dart:84 is a bare GestureDetector + images; grep of lib/widgets/tarot found 0 Semantics (10 Semantics in lib, proving the grep); support 2026-10-15
Where
lib/widgets/tarot/flip_tarot_card_widget.dart:84 (wrap in Semantics button + label with name/position/theme, or face-down hint)
Reuse
Semantics usage in lib/widgets/premium_upgrade_button.dart
Test
Widget test with find.bySemanticsLabel; VoiceOver on an iOS device
Done
87a229cd, local, not pushed. Tests: tarot_card_semantics_test (face down, revealed, locked). Not on device: opening a spread saves a reading; needs a VoiceOver pass on iOS.
Risk · difficulty
low · easy
Customers
1 linked customer; latest 2026-10-15 support (version unknown)
Note
The 'voice can't be changed' part is a feature request: the app has no TTS (just_audio playback only).

Track 2: other developers, by specialism

RowActual remaining problemDifficultyEvidence it still existsDependencies · testingCustomers · notes
payments · 4
ISSUE-201
G05
Write-path guard exists, but a new Apple lifetime is again stored expired with no dispute/refund (reopened 2026-10-13).
An Apple NON-CONSUMABLE lifetime purchase is stored with status=expired — a lifetime entitlement that by defin
medium
payments
nodejs _verify.js 2026-10-14 FAIL: 1 Apple lifetime expired with no dispute/refund; guards at origin/master routes/payments.js:2010,2761,2907Payments owner; identify which path wrote the new row
payments.entitlement tests + read the offending row's history
45 linked customer(s); latest 2026-09-24 on 11.1.3
45 linked customers is meaning-matched entitlement complaints, not all this defect.
ISSUE-552
G05
A customer's Apple quarterly purchases never reached payments; root cause (missing ASSN/webhook) never established.
[uid] ([customer]) paid Apple for a quarterly subscription 2-3 times, nothing ever synced to our payments
medium
payments
db.payments zero rows for [uid] (2026-10-04); linked reports to 2026-10-06 on 11.1.5Apple transaction id / App Store Server API
Store lookup + read payments back
9 linked customer(s); latest 2026-10-06 on 11.1.5
794331b7/e9fb9785 only fixed the false support claim.
ISSUE-697
G05
40/47 recorded under a different uid; 7 accounts still unexplained, and the 47 should be re-measured now purchasedAt is written.
47 buy-tappers' apps confirmed a purchase but no payments row appeared within 48h -- possible unrecorded payme
medium
payments
nodejs a832e5f5 (purchasedAt on record) deployed 2026-10-13; 7 of 47 unreconciled; linked reports to 2026-10-13 on 11.1.5Store-side lookup per account; 26b62c73 unpushed for client half
Re-run the 47-account reconciliation keyed on purchaseTime
7 linked customer(s); latest 2026-10-13 on 11.1.5
Possible unrecorded payments.
ISSUE-700
G05
Payers still report premium lost after update; client protections exist, so server returning verified not-paid is the likely cause — not diagnosed.
Possible premium/saved-profile reversion after an app update -- one Play review, no support-channel corroborat
hard
payments
Play review 2026-10-14 on 11.1.6; client protection at lib/services/content_gating_service.dart:190 (aa18a464, LIVE)Server entitlement answers for post-update reporters
Pull entitlement responses for reporters; device test paid account across update
18 linked customer(s); latest 2026-10-14 on 11.1.6
Do not change content_gating_service (owner rule, per 2026-10-16 correction).
node · 26
ISSUE-497
G01
Negation fix deployed (node c1d37270 on master). The guard still scans the whole thread with no recency window, so old data-loss threads keep tripping it.
Pure UI/UX preference feedback ('older design was better') gets misread as a coded request to switch interface
easy
node
astromatrix-nodejs/services/supportGuards.js:1488-1494 (userMsgs from entire thread, no time filter)Node owner; node master auto-deploys
node unit test on guard with old+new messages; read autosupport replies back
3 customers; latest 2026-10-12 v11.1.5 (linked by meaning, astrocartography report finding)
Not Flutter. The broken-promise replacement text has already been reworded.
ISSUE-498
G01
Autosupport drops a vague UI complaint when it is bundled with concrete billing questions in one message.
Vague new-UI/UX complaint tacked onto a multi-topic message gets silently dropped, even though the product_fee
medium
node
astromatrix-nodejs/routes/auto/autosupport-core.js:401 product_feedback category (single-category output, :915)Node owner; prompt change; 3-occurrence bar before coding a rule
replay the [customer] message through autosupport; read reply back
21 customers (linked by meaning, mostly low/med confidence); latest 2026-10-14 v11.1.6
Not Flutter. The 21 linked customers measure general UX complaints, not this specific drop.
ISSUE-544
G01
Autosupport has no correct astrocartography navigation fact, so it improvises. The _verify check passes vacuously. Flutter: Home tile + search exist.
Autosupport fabricated a 'Chart Type' menu containing Astrocartography that does not exist anywhere in the Flu
easy
node
2026-10-15 v11.1.7 'I cant find where I can see my Astrocartography'; grep astrocartography in autosupport-core.js = 0Node owner
ask autosupport 'where is astrocartography'; read reply back
2 customers; latest 2026-10-15 v11.1.7
Give autosupport the real path: Home tile, or search 'map'.
ISSUE-114
G04
Autosupport still sends the same canned reply 3+ times to 2 recipients in 30d; customer data was intact.
Paying lifetime customer reporting missing data for 2.5 months has received the identical canned "known sync i
medium
node
nodejs _verify.js 2026-10-14 FAIL: 2 recipients got SAME reply 3+ times in 30dAutosupport duplicate guard (Node)
Re-run _verify ISSUE-114 check after fix; inspect the 2 threads
1 linked customer(s); latest 2026-08-07 on 10.9.7
Support-process defect, not Flutter UI.
ISSUE-247
G04
5 promised profiles still on the anonymous install id; the announced transfer was never fully executed.
A recovery transfer was announced to a paying customer and never executed — her 12 profiles are still on the a
easy
node
nodejs _verify.js 2026-10-14 FAIL: 5 profiles still on [uid]; customer report 2026-10-17 on 11.1.6Approved DB write by Node owner; backup first
Read back both uids after transfer; customer confirmation
6 linked customer(s); latest 2026-10-17 on 11.1.6
Data repair for one paying customer, not Flutter.
ISSUE-467
G04
Restore no longer undoes erasures, but /erase can record a ledger entry without writing the deletion ([customer] case); delete complaints continue.
Profile deletion doesn't stick after a restore -- and autosupport claimed this is a 'known issue being worked
medium
node
nodejs scripts/_erasures.js leaks (13 on 2026-09-27); linked reports to 2026-10-15 on 11.1.6Node owner; Flutter delete queue in lib/services/user_service.dart:984-1110 only if server is ruled out
_erasures.js leaks must reach 0; device delete-after-restore test
16 linked customer(s); latest 2026-10-15 on 11.1.6
4c633e2/de9a426 deployed fix the restore half only.
ISSUE-538
G04
Unconfirmed: duplicates allegedly left by a manual repair for [customer]; no account or ticket identified.
A chart-recovery repair left duplicate charts behind for a support-escalated user ([customer])
medium
node
none in data yet: secondhand Discord summary only; linked reports to 2026-09-22 on 10.9.7Reporter identity/ticket from Discord
Run exact-duplicate query on her uid once known
3 linked customer(s); latest 2026-09-22 on 10.9.7
Blocked on reporter specifics.
ISSUE-678
G04
Refund done; the 'I see someone else's name, not mine' identity complaint on her account is unanswered.
A refund/identity-confusion thread needs real support attention once the ISSUE-618 loop-fix is live
medium
node
nodejs messages thread (2026-10-11); linked report 2026-10-11 on 11.1.6Support/identity owner
Thread reaches resolved state with an identity answer
2 linked customer(s); latest 2026-10-11 on 11.1.6
Support matter; possibly ISSUE-454 class.
ISSUE-355
G07
2,088 same-person duplicate pairs at different UTC offsets remain; main copy can be the wrong one.
2,198 duplicate chart pairs across 2,064 accounts hold the same person with different UTC offsets, 1 to 20 hou
hard
node
_verify.js FAIL 2026-10-14: 2,088 pairsNode owner; temp_june11 backup; repair campaign
_verify.js check returns PASS
no linked reports
Data repair, not Flutter.
ISSUE-384
G07
Client cross-profile cache fixed; 215 repaired profiles still show pre-repair stored charts, 88 in wrong Ascendant sign.
The client has TWO INCOMPATIBLE RULES for an absent server Big Three - one path clears the device cache, the o
medium
node
_verify.js FAIL 2026-10-14 (215/88); customer 2026-10-05 11.1.5Node owner; Flutter fix 86d5228d/359a5665 LIVE
_verify.js PASS; device check of a repaired profile
5 linked customers, latest 2026-10-05 on 11.1.5
user_service.dart:1773 no longer substitutes another profile Big Three.
ISSUE-523
G07
Stale cached Big Three on flag-less migrated accounts has no sweep to find it.
Stale cached Big Three exists outside ISSUE-424's repair-flag cohort -- isMigrated legacy accounts can carry a
medium
node
verifyRoute: no sweep exists outside ISSUE-424 flag-scoped oneNode owner
Sampled engine-vs-cache sweep
no linked reports
Individual case corrected; scale unknown.
ISSUE-438
G09
Deleted tarot journal still served 1-2 min by /journals/tarot/history and /cards after Mongo hard delete; mechanism unknown (not CF, not node-cache).
A hard-deleted journal kept being served for 1-2 minutes by /tarot/history and /tarot/cards while absent from
medium
node
one observation 2026-09-23 (ISSUE-391 cutover test); no re-test recordedNode/Mongo read path (read preference, secondary, other cache layer)
Scripted add->delete->poll probe against prod-like env
no linked reports
Server-only. Flutter tarot tab still reads legacy (ISSUE-391), so users mostly don't see this yet.
FEATURE-37
G12
AI reports localised (Node 12b9965 deployed + Flutter e6c07df5 live). Sabian still English: GetDegreeInfo hardcodes Language:'en'; Flutter Sabian calls send no language.
Multi-language AI report content — 3 requests (2026-08-22 → 2026-09-11), 1 confirmed paying
medium
node
nodejs routes/component.js:2415 findOne Language:'en'; lib/services/sabian_service.dart:96,331-334 no lang paramNode GetDegreeInfo language support first
Probe GetDegreeInfo with lang=es; device check Sabian in Spanish
2 linked customers, latest 2026-09-11, version 11.0.0
Sabian is meant to be translated like everything else. The Flutter part is trivial once Node accepts a language.
ISSUE-541
G12
GetLanguageTable for real languages still slow (mn times out at 20s); caching attempt reverted.
GetLanguageTable is slow for real languages — needs a different fix than caching
hard
node
measured 2026-10-03 after revert: mn 20s timeout, es 117k rowsISSUE-549
Timed probes per language
no linked reports
Server-side. Flutter consumer at language_service.dart:316 loads the whole table.
ISSUE-549
G12
Tag table ships 86k-117k rows per request; leak source closed (27deefac) but payload unchanged.
the language tag table ships 86k-117k rows per request — reduce the payload, not the delivery
hard
node
row counts 2026-10-03; Flutter fetches full table lib/core/language_service.dart:316Node + Flutter contract change
Payload size/time per language before/after
no linked reports
Needs a contract change across both repos. Purge of leaked rows is a separate step.
ISSUE-729
G12
Non-English users get an empty journal Prompts tab: server matches language exactly, no 'en' fallback; client sends language in live 11.1.7.
Non-English users get an empty journal Prompts tab: client now sends their language, server has no English fal
easy
node
nodejs routes/journals.js:444-448 find by exact language, no fallback (HEAD); probe lang=es -> [] (2026-10-16)Approved by Mark 2026-10-16; Node-only release
Probe lang=en and lang=es (fallback fires, real translations not overridden)
no linked reports (live regression for all non-English users)
High priority and Node-only, so it doesn't wait for the 11.1.8 release.
ISSUE-318
G13
Some caller requests sign placements (e.g. 'Ascendant in Scorpio') under 'Planets in Houses'; caller unidentified; junk keys ('Null', 'South') too.
Caller requests sign placements under the wrong category (asks 'Planets in Houses' for 'Ascendant in Scorpio')
medium
node
lookup_misses classification 2026-09-23 (36% wrong-category); not re-measured since 11.1.7, which drops angle rows from in-Houses (ISSUE-509, live)Re-measure lookup_misses split by app version
Re-run verifyRoute classification post-11.1.7
1 linked customer, latest 2026-07-10
ISSUE-509 (live) may already have removed part of the wrong-category traffic. Measure before assigning a Flutter fix.
ISSUE-565
G13
Three read-path fallbacks are deployed and recover 55% of misses. The 116,366 'other' misses are still unclassified and unfixed.
lookup_misses was never classified: 55% of 264,875 misses were routing faults, not missing content
medium
node
Row's own classification: 116,366 'other' misses NOT FIXED; fallbacks e72a8f34/41fb0528 in nodejs findComponentNode; content gaps overlap ISSUE-614
Re-sample lookup_misses after deploy; classify the next tranche
no linked reports (group G13: 7 customers)
No Flutter commit; areas=node by ownership audit.
FEATURE-65
G14
5-slot cap is live. The per-account burst limit and monthly replenishment are unbuilt, and tarot/moon/home/component paths still share the category+relocation count.
Report free-tier limits — cost is trivial (nano model), abuse≠monetization, and the real conversion boundary s
medium
node
Feature audit 2026-10-16 R1 PARTIAL, R3/R4 NOT_IMPLEMENTED; client half 70a08d0a LIVENode; product sign-off on monthly window
Server unit tests for rate/monthly window; metric on 6-10 bucket conversion
4 customers (2 distinct), latest 2026-10-11 v10.9.7
Customer reports are ad complaints on an old build; probably the entitlement symptom.
ISSUE-292
G14
Funnel is instrumented. Autosupport still appends REVIEW_NUDGE to 'reply if still broken' messages, and the prompt timing rule is unsigned.
Rating VOLUME is the organic gap: ~1,700 ratings on 1M+ installs (0.17%) while the score is a healthy 4.55 — a
easy
node
nodejs routes/auto/autosupport-core.js:4938,5113,5307,5377 append REVIEW_NUDGE to unresolved-outcome repliesTiming decision shared with ISSUE-214
Autosupport unit test; review volume/recent mean via scripts/_reviews.js
no linked reports
Flutter side is done. The rest is the node nudge gate plus Mark's timing sign-off.
ISSUE-629
G18
The legacy ForgotPassword fallback still returns success:true with the response body, even when legacy returns a 404 page; there is no apiResponse.ok check.
POST /ForgotPassword's legacy fallback returns success:true with a 404 error page as the 'message' when the le
easy
node
origin/master routes/user.js:3419-3444 has no status check; customer reports up to 2026-10-12 on 11.1.5Node owner; LEGACY-SUNSET 2026-11-27
Node unit test with a mocked 404; verify a live reset for an unknown address
9 linked customers; latest 2026-10-12 support 11.1.5
Node notes say the branch is empty in practice (profiles is a superset), so impact may be small.
FEATURE-14
G19
The Prompts tab is live, but non-English users see it empty: the corpus is English-only and neither client nor server falls back to English.
Journal prompts as a Journal tab — fill the empty tab
easy
node
curl 2026-10-16 /journals/prompts lang=es -> [] vs lang=en -> rows; journal_prompt_service.dart:49-55,261 sends user lang (b807bc22 LIVE)Real translations are ISSUE-379 (Node); free/premium gate (R6) is a separate product decision
Extend journal_prompt_language_test: es empty -> en served, es rows preferred when present; emulator in Spanish
no linked reports
Covered by ISSUE-729: Mark approved a SERVER-side English fallback (2026-10-16), so no client fallback - a second fallback would duplicate it. Verify the Prompts tab after 729 deploys.
ISSUE-108
G19
About 70.5k profiles are still tarotMigrated:false and the number has stopped falling. The legacy SQL sunset makes leftover history unrecoverable.
2,868,171 old-format tarot rows (Journal table, Type='tarot') across 453,820 distinct uids were never converte
medium
node
_verify.js 2026-10-15: 70,532 false / 184,042 migrated (up from 69,873 on 10-13); Node 0082187d unpushed (local only)Legacy SQL access; Mark to push 0082187d
Re-run _verify.js; sample 'false' profiles for real legacy rows
no linked reports
Not Flutter.
ISSUE-275
G19
Stranded journals are still accruing on anonymous app- uids (about 2% of the last 30 days). Proactive outreach and transfer are not finished.
Sweep for stranded journals we can return without being asked — 23,208 recoverable on shared-profileId alone,
medium
node
_verify.js 2026-10-15: 327 of 20,000 recent journals on app- uidsSupport outreach; ISSUE-520 identity fixes
Re-run _verify.js; count confirmed transfers
1 linked customer; latest 2026-08-30 support 10.9.8
Find out whether new app- journals come from users who are already registered (a client write path).
ISSUE-574
G19
Tarot readings still go only to legacy (journal_service.dart:542). The Node catch-up runs only from read endpoints nobody calls, so Mongo stays frozen.
Tarot readings are written to legacy .NET and only reach Mongo via a once-per-account migration, so Node holds
medium
node
tarot_reading_page.dart:434 -> addReadingJournal -> API/Utility/AddTarotJournal; Node addTarotJournal (journal_service.dart:1195) has no callers; no Mongo inserts since 2026-09-14ISSUE-391 store cut-over decision; legacy sunset
Node verifier; count Mongo tarot inserts after the change
1 linked customer; latest 2026-08-20 support (low confidence)
Decide which side writes before ISSUE-391.
ISSUE-730
G19
Spread rotation has never run: nothing schedules /auto/spreads/rotate. Approved with idempotent/logged/non-concurrent conditions.
Tarot spread rotation has never run in production: endpoint deployed, nothing schedules it (run log empty)
easy
node
GET /auto/spreads/runs -> runs:[] (2026-10-16)Node owner; Mark approved 10-16
Run log shows entries; featured spread changes
no linked reports
Not Flutter.
native-android · 2
ISSUE-228
G08
Play slow warm/cold start rates still to be re-measured; loader change 6f610bba is pushed-not-live, held with 11.1.8.
App start times breach Google Play's quality gate — 64.26% of warm starts and 44.56% of cold starts are over t
hard
native-android
6f610bba PUSHED (build 99 limited); others LIVE; Play slowStartRateMetricSet11.1.8 Android release decision (reviewer: hold pending rollout assessment)
Play vitals slow-start rates on build 98 vs 99
4 linked customers, latest 2026-10-02 on 10.9.7
Measurement plus native startup work; not a UI fix.
ISSUE-691
G08
Single Android 16 yearly subscriber: app fails to load, intermittent solid purple screen; unreproduced.
Android app repeatedly shows user as logged out and fails to open charts, for months, on an active yearly subs
hard
native-android
[customer] 2026-10-12/14 supportHer session/auth events and device logs
Android 16 emulator reproduction; auth event read
1 linked customers, latest 2026-10-12 on unknown version
Possibly entitlement/session; needs logs before code.
native-ios · 4
ISSUE-279
G09
Share half fixed live (b23fba9d iPad sharePositionOrigin, c86f4ab9). Save half ('reports won't save', iOS new UI) still unexplained; 'failed to launch' string exists in neither repo.
Save and Share both report 'failed to launch' — from a FIVE-star review, so it never appeared in any low-ratin
medium
native-ios
2026-09-17 iOS paying customer 'reports won't save' (pre-11.1.7); no 'failed to launch' string in lib (grep proven on 'Could not launch' url_launcher_helper.dart:64); PdfPreviewScreen._downloadPdf (pdf_preview_screen.dart:31-40) has no error handlingReal iOS device (iPhone + iPad) to reproduce Save and capture platform error
iOS device repro of report Save/Download on 11.1.7; log the platform exception
3 linked customers, latest 2026-09-15, version 11.0.0
String is probably platform-originated (iOS print/share), so it needs an iOS device to reproduce.
ISSUE-385
G17
Android 11.1.7 widget still disagrees (10-15 review). Widget location is mirrored only when the location changes, never on restore. The iOS fix is unpushed.
Planetary-hours widget and app show different hours on the same device at the same moment — exactly two steps
easy
native-ios
Play review 2026-10-15 on 11.1.7: 'app displays the correct planet, widget shows the wrong one'; horoscope_service.dart:340-358 _restoreCurrentLocation sets _currentLocation with no _mirrorLocationForWidgets call (only :467, from setCurrentLocation)Mark must push iOS commits 96f4d84d/1bfd6b68/b8ef6a9a/e40b04e3 (local-unpushed) and cut a build
Unit test: restore writes flutter.lat/lng/offset; emulator: app vs Android widget hour at same instant, plus a hand-calculated hour; iOS sim XCTest WidgetTimeOffsetTests
2 linked customers; latest 2026-10-15 Play 11.1.7
Lead for the specialist (code-confirmed, NOT reproduced): Android widget location copy is mirrored only on change, never on restore (horoscope_service.dart:340-358) - fits the 2026-10-15 11.1.7 review. iOS widget commits are local-only, need push + device verification.
ISSUE-460
G17
The iOS Sabian widget reads degree.sabian from legacy GetExtendedMoonInfo, which returns all-null 'degree' today, so no interpretation shows. Android already moved to Node.
Sabian Symbol widget shows header but interpretation text never loads, both iPhone and iPad
easy
native-ios
curl 2026-10-16 GetExtendedMoonInfo -> degree:{sabian:null,sign:null,...}; ios/SabianWidget/SabianWidget.swift:287,327; Node component/GetDegreeInfo returns real text (curl 2026-10-16)None server-side (Node endpoint live); iOS release needed
iOS simulator widget gallery + device on iOS 26; compare text with in-app Sabian section
1 linked customer; 2026-09-26 support 11.1.4
Swift-only. The sabianSign header also reads the null degree.sign (SabianWidget.swift:350).
ISSUE-728
G17
iOS widgets get a stored scalar hour offset with no DST rule. After a DST change both widget and app stay an hour out until the location is re-mirrored.
iOS widgets build their day from a stored hour offset with no DST rule, so widget and app can be wrong togethe
medium
native-ios
ios/PlanetaryHours/WidgetTimeOffset.swift:40-55 reads scalar flutter.offset (local-unpushed); Location model has no IANA zone field (grep of lib/models found none)Needs a timezone id source for Location (geocoder/Node); depends on the ISSUE-385 commits being pushed
XCTest across a DST boundary in the simulator; device check near the 2026-11-01 US transition
no linked reports
Re-mirroring on launch (ISSUE-385 fix) shortens the stale window but does not fix it.
engine/chart-math · 7
ISSUE-488
G06
Bidirectional Moon off-by-one-sign is unreproduced; the only Flutter defect found (negative-longitude sign) is fixed and was not the cause.
Moon sign off by a sign in either direction -- reported by a professional astrologer, from Discord
medium
engine/chart-math
none in code: chart_rendering_service.dart:201-216 normalises (6ca29ce8 LIVE); no birth data from the Discord reporterReporter birth data; check timeSystem=V (sidereal) and stored UTC offset (ISSUE-355/61) first
Engine probe via curl with a control chart, compare to independent ephemeris
no linked reports
Memory rule: 'one sign back means sidereal' -- rule that out before chart-math work.
ISSUE-506
G06
Engine assigns a body exactly on a cusp to the house below, so MC/IC (and on-cusp planets) read one house low.
MC and IC are labeled with the wrong house number on the chart-placements list -- MC shows house 9 instead of
medium
engine/chart-math
lib/utils/astro_parser.dart:1370-1373 states 49d28241 is a mitigation only and does not fix ISSUE-506Engine owner; legacy engine change vs Nov engine cutover
Engine probe of a Placidus chart with MC on 10th cusp; placements list check on device
no linked reports
Register stage says pushed but commits are only a Matrix mitigation; cause untouched.
ISSUE-704
G06
Unreproduced synastry aspect claims; partner's nodes/angles have no grid column (10-column truncation), plausibly the missing Pluto/North Node.
Synastry aspect grid shows a false Part-of-Fortune/Sun aspect and omits a real Pluto/North-Node aspect, plus l
medium
engine/chart-math
lib/services/chart_service.dart:575-590 (_computeAspectGrid10 takes 10 columns); [customer] 2026-10-14 iPhone SE 11.1.6Reporter's synastry payload; product decision if columns must widen; engine check for PoF aspect
Engine payload for her pair + unit test of grid placement; iPhone SE overflow check
10 linked customers, latest 2026-10-14 on 11.1.6
Overflow/alignment part overlaps ISSUE-734 text scale; PoF conjunct Sun is likely a real point aspect.
ISSUE-111
G07
Reporter says asteroid transit/natal roles still swapped on 11.1.6, though the asteroid grid code looks correct.
Transit aspect grid on iOS has the transiting/natal axes transposed, and shows a natal-only aspect as if it we
medium
engine/chart-math
[customer] 2026-10-14 on 11.1.6 (da652e24 is in 11.1.6); placement chart_service.dart:740-760, naming chart_widgets.dart:1960-1964Her chart and chart type (birth chart with transit ring vs Transit chart); Transit Aspects content wording
Unit test with her payload for both ChartType.birth and transit; device check on 11.1.7
3 linked customers, latest 2026-10-13 on 11.1.5
Suspect birth-chart-with-transits path naming via _formatAspectComponentName, or content text.
ISSUE-359
G08
Legacy engine throws on type:'self' and returns 200 [null] on missing typename.
Legacy chart engine: type:"self" throws NullReferenceException, and a missing typename returns HTTP 200 with a
medium
engine/chart-math
node scripts/_chart_verify.js self (verifyRoute); 4 customers to 2026-09-22Legacy engine owner or Node validation
_chart_verify.js self
4 linked customers, latest 2026-09-22 on 11.1.2
Engine call migration deferred to ~Nov.
ISSUE-36
G08
CalculateHoroscopes NullReferenceException still fails reports (null transit town/lat/lng); customer on 11.1.7 2026-10-15.
CalculateHoroscopes recurring NullReferenceException on legacy .NET backend
medium
engine/chart-math
support 2026-10-15 11.1.7 solar return report not populatingMerge with ISSUE-267; Node owner
Report generation with null-location transit payload
5 linked customers, latest 2026-10-15 on 11.1.7
Not Flutter.
ISSUE-442
G08
Moon phase/VoC/OOB go app->legacy with no fallback; deferred by Mark to the engine cutover (~Nov).
Moon phase, void-of-course and OOB have no Node path — the device cache is the only thing between us and legac
medium
engine/chart-math
lib/services/voc_service.dart:87, oob_service.dart:114 still hit legacy BASE_URLastromatrix-engine cutover (~Nov); do not migrate now
Calendar fetch metrics (8500ab7e LIVE)
1 linked customers, latest 2026-09-22 on unknown version
Mark 2026-10-07: Flutter stays on legacy until ~November.
async/state · 8
ISSUE-633
G01
Header bar shows no (+). Separately, the (+) in the name-tap 'Select User' sheet always adds the new person as partner (secondUser, relationship), then also sets them as user1.
New UI: no visible add-another-chart affordance near the user bar -- (+) button on "pick user" page not mirror
medium
async/state
lib/views/chart_screen.dart:3841-3866 (mode secondUser regardless of pickFirstUser); lib/views/add_user.dart:248-263; user_header.dart:463-471Mark: visible (+) near user bar (affordance). The defect needs nav-stack tracing (goAndReplace vs navigator.pop).
widget test of add from Select User sheet asserting user1/user2; emulator run
7 customers; latest 2026-08-03 (version unknown)
The defect is confirmed in code but not yet run on a device (RB-5).
ISSUE-441
G07
Moon sign disagreement between notification detail and transit chart unreproduced; forecast/tarot failures tie to the legacy outage.
Moon sign disagreed between the transit notification detail page and the transit chart at the same moment, sur
hard
async/state
[customer] report; no Flutter commit addresses the notification-vs-chart path (ef94f006/b8ef6a9a are widget fixes)Notification payload timing vs chart timestamp; ISSUE-439 outage for part 2
Reproduce an ingress notification vs transit chart at same instant; device
2 linked customers, latest 2026-10-05 on unknown version
Possibly a pre-ingress notification read as current; establish before coding.
ISSUE-584
G08
One-off ad-SDK slowdown; startup still awaits AdsService.initialize (12s cap) before runApp, so ad SDK stalls can delay launch.
2h incident 2026-10-05 19:00-21:10 UTC: 3 customers hit app-wide lag/loading failures, root cause looks like a
medium
async/state
lib/main.dart:555-560 awaits AdsService().initialize before runApp; incident 2026-10-05Ties to ISSUE-228 startup work; ads/entitlement owner
Startup trace with throttled ad SDK on emulator
2 linked customers, latest 2026-10-05 on 11.1.5
Incident itself self-resolved; areas=node is likely wrong.
ISSUE-735
G08
Report/tarot content sometimes replaced by premium promo + video ad. Not traced: gating view-limit flow vs content-fetch failure during the Oct 5-11 ad/facets incidents.
Report and tarot explanations show only a premium promo or a video ad instead of the content - 4 customers in
medium
async/state
customer reports 2026-10-03..10-08 on Android 11.1.5 + 2 Apple reviews (one later said text came back); gate code lib/widgets/gated_content_widget.dart:1155-1258 (blur overlay + showPremiumUpgradeDialog + rewarded ad)May be a failure state of ISSUE-584 (ad SDK) / ISSUE-654 (facets outage); needs error/gating logs for the window
Device repro on 11.1.7 with throttled network and exhausted view count; widget test for gated + fetch-failure state
no linked reports in audit; 4 customers cited in row detail (2026-10-03..10-08, 11.1.5)
Might be view-limit gating working as designed, seen as 'no free reports'. Find out before treating it as a bug.
ISSUE-657
G09
About 1 in 3 matrix_full_native saves is a byte-identical duplicate ~2s apart; source unproven. The matrix button is already guarded while loading.
A third of full native reports are byte-identical double-saves — 281 redundant rows in 48h, median 2 seconds a
medium
async/state
measured 281 dup rows/48h (2026-10-11); customer 2026-09-19 on 11.0.0 saw same report 4x; button disabled while loading (component_action_button.dart:49, matrix.dart:1397), so not a simple double-tapNode change for a structural uniqueness guard; Flutter callers matrix.dart:3268, report_service.dart:491
Re-measure dup rate per app version; unit test outbox replay after server-accepted timeout
1 linked customer, latest 2026-09-19, version 11.0.0
Candidate cause: outbox replays a POST the server already accepted. A server-side unique key would make the duplicate impossible.
ISSUE-73
G09
House system reverts. Persistence fixes (2926485d/7c4ba0ee) are live since 10.9.8, but a 2026-09-22 report on 11.1.3 says it reverted to Placidus on its own.
Placidus house-system setting not sticking — Sun/Jupiter in 8th, should be 7th
medium
async/state
support 2026-09-22 on 11.1.3 (post-fix build) 'changed me back to placidus on its own'; candidate: report_deep_link_handler.dart:228-233 writes houseSystem with syncToServer:false, but _upsertPreferences (preferences_service.dart:150-170) still marks dirty and updates UserService settings cacheNone external
Unit test: deep-link override then app kill before _restorePrefs; device test cross-device sync
2 linked customers (3 in audit note), latest 2026-09-22, version 11.1.3
Shared-link temporary override path is an unproven lead. Needs a repro before any fix.
UX-5
G11
Swap halves fixed live (ISSUE-40/237). Blank synastry partner picker still reported 2026-10-14; picker swallows fetch errors as 'No other profiles found'.
Synastry confusing / mislabeled in the new UI
medium
async/state
support 2026-10-14 'pull down menu is blank' (version unknown); lib/views/chart_screen.dart:3726-3733 catch drops error; account-only query (excludeProfileIds:true, :3703) can return 1/1 (user_service.dart:686-692)Needs the affected account to reproduce; server pagination behaviour
Repro with reporter's account; widget test error vs empty state
4 linked customers, latest 2026-10-14, version 10.9.7
Fix the swallowed error after the cause is found, not as a guess.
ISSUE-421
G15
Fix 5c291fed covers only the old-UI WebViewScreen. Reporter was on the new UI, and later said sounds continue after the app closes; unexplained.
One support reply raises endless notification sounds while the in-app support chat is open, stopping only when
medium
async/state
5c291fed changed only lib/views/web_view_screen.dart; new-UI path notification_service_mobile.dart:424,489 (guarded once by _nativeInitStarted :406); follow-up 2026-09-23 v11.1.3 'continuing after app closed'Node push logs for duplicate sends
Android device repro (Samsung): open support chat, background/foreground, receive one reply; count sounds
1 customer, latest 2026-09-23 v11.1.3
Post-close repeats point at server pushes or tray behaviour, not the listener leak.
flutter-investigation · 1
ISSUE-611
G19
Cards invisible or untappable after a draw: not reproduced, recording never viewed. 'Same cards' is likely the seed (question+spread+date+user), not a client RNG.
Tarot: cards not visible/clickable after a draw, and the same cards keep coming up repeatedly
medium
flutter-investigation (repro first; screen recording never viewed)
support 2026-10-10 11.1.5 (3 customers); tarot_service.dart:638-670 is a deterministic Node draw (routes/tarot.js:307); no client Random in lib/The customer's screen recording (feedback@ 2026-10-08)
Device repro from the recording; widget test of flip and tap
3 linked customers; latest 2026-10-10 support 11.1.5
The row's client-RNG premise is wrong; check whether the repeats come from the same question on the same day.
content · 8
ISSUE-160
G10
1,704+ component Phrase/Concept rows violate an unenforced spec and are shown as reader-facing card copy; no content fix commit exists.
Component Phrase/Concept were never held to one spec — and §8g (?context=1, commit 34e8bd5) promoted them to r
medium
content
node scripts/content/audit-quality.js --copy-only (closure check); no ISSUE-160 content-fix commit in nodejs historyContent authoring/AI regeneration
Re-run audit-quality.js to zero or accepted list
no linked reports
Server content only. No Flutter change.
FEATURE-45
G12
Zero non-English journal prompts (17,257 en); localiser script never run with --write.
Journal prompts in other languages — all 17,257 rows are language:'en', so the prompts feature is queued to sh
medium
content
audit 2026-10-16: 17,257 rows language:'en'; eb746a1 localiser plan-onlyISSUE-729 English fallback must land first
Count rows by language after run; probe lang=es returns es rows
no linked reports
Content generation. Same work as ISSUE-379.
FEATURE-50
G12
Planets in Houses prompts fixed; client sends user language (b807bc22 live). Remaining: corpus translation (FEATURE-45/ISSUE-379) and English fallback (ISSUE-729).
Journal prompts: fill the Planets in Houses content gap (0% match on 1 in 6 lookups) and make prompt text tran
medium
content
lib/services/journal_prompt_service.dart:261 sends _lang (live); corpus 100% enISSUE-729, FEATURE-45
As ISSUE-729/FEATURE-45
no linked reports
Flutter part is done. What's left duplicates FEATURE-45.
ISSUE-369
G12
Guard deployed (df52b34); 3 half-English translated component pairs remain in DB and need repair.
19 people in three days reported the app showing several languages AND alphabets on the same screen - 14 on 20
easy
content
_verify.js 2026-10-14: 3 of 43,560 pairs half-English (es, pt, it)Node/content owner data repair
Re-run _verify 369 check to 0
9 linked customers, latest 2026-10-07, version 11.0.0
Server data repair only. The guard is live, so the repair will stick.
ISSUE-379
G12
Journal prompt corpus is English-only (17,257 en).
Journal prompts are English-only — all 17,257 rows are language:en, and 12 of 346 writers answered in another
medium
content
17,257 rows language:'en' (audit 2026-10-16)ISSUE-729 fallback
Row counts by language; lang probes
no linked reports
Same work as FEATURE-45.
ISSUE-485
G13
532 aspect/placement combos with no AI interpretation in 30 days; users see placeholder 'check back in a few days'.
ai_create logs a real, measurable content gap -- 532 aspect/placement combos never got an AI interpretation in
medium
content
errors uid:'ai_create' rows ongoing (2026-10-10 watchdog); customer 2026-10-14 on 11.1.6 'zero content... check back in a few days'Node/content generation
Count ai_create error rows over 7d after batch
5 linked customers, latest 2026-10-14, version 11.1.6
Content gap. Same approach as ISSUE-689.
ISSUE-527
G13
Writer fix (stripCodeFence) is deployed, but the ~249 already-fenced component Descriptions are not confirmed cleaned; Flutter does not strip fences on read.
Markdown code fences stored inside Description on 249 English component rows, and the count grew (193 -> 249)
easy
content
nodejs services/stripCodeFence.js (a1edee85, on origin/master = deployed); Flutter lib has no fence strip for component Description (only language_service.dart:1311 for JSON)Node deploy; content owner
Re-run verifyRoute countDocuments({Description:/```/})=0 and regenerate one Draconic category
1 customer, latest 2026-07-07 (no version)
No Flutter work; backlog cleanup plus measurement.
ISSUE-614
G13
Full-native reports still show 'no information' apologies. The combined Planet-in-Sign-in-House rows are missing for ~99% of placements, and Flutter has no GetComponent fallback.
37% of full native reports ship a customer-visible 'no information' apology: South Node house content does not
hard
content
grep 'no information' / ISSUE-614 in Flutter lib = 0 hits (pattern proven on payload_service.dart:251); 44.1% of matrix_full_native under bar 2026-10-11Legacy ISSUE-665; content shape decision; Node
--verify-new gate (a0ce7b09) over reports generated after the change
no linked reports (group G13: 7 customers)
Cross-store; pass the recorded category, never default it (Draconic).
infra · 2
ISSUE-439
G08
Legacy API saturation monitor probe goes silent for hours; verifier reopened.
LIVE: the legacy .NET API is saturated - static pages serve in 0.45s while every API endpoint hangs, so no cha
medium
infra
_verify.js FAIL 2026-10-14: probe last ran 402 min agoInfra/Node owner
_verify.js PASS on probe freshness
7 linked customers, latest 2026-10-05 on 11.1.5
40f0acaa cache fix LIVE; remainder is monitoring.
ISSUE-337
G15
App Store 'App Support' URL lands on NXDOMAIN or 404 (support.astromatrix.org, /support, /contact, /help).
The App Store App Support link does not reach us: support.astromatrix.org is NXDOMAIN and /support /contact /h
easy
infra
_verify 2026-10-14: support.astromatrix.org NXDOMAIN, astromatrix.org/support 404Store account access; website owner
curl the listing's support URL after change
no row-level reports (5-star lifetime member review 2026-09-16)
Not Flutter.
Verification queue: fix already in code (91)
RowActual remaining problemDifficultyEvidence it still existsDependencies · testingCustomers · notes
FEATURE-2
G01
Nothing. /report route is LIVE (e4898c13, main.dart:663). Notifying users about or promoting a report is new feature work.
Give reports a route
easynone: route live since 11.1.x; latest 'where are reports' reports are on 11.1.5, before /find search ('reports','pdf' synonyms at wayfinding_index.dart:158)none
metric: report reach/search hits for 'report' on >=11.1.7; any new report-finding complaints on 11.1.7
3 customers; latest 2026-10-11 v11.1.5
Do not rebuild. Promote/notify part is a separate feature.
FEATURE-40
G01
Fix LIVE since 11.1.1 (Transits tile 73076a83) and search since 11.1.7. Users still asked 'where is weekly horoscope' on 11.1.6.
Weekly / monthly forecasts "missing" — 2 requests
easy2026-10-15 support v11.1.6 'where is weekly horoscope' (after tile shipped); no >=11.1.7 report yetnone
support complaints for weekly/monthly on >=11.1.7; /find 'weekly' query metric
12 customers; latest 2026-10-15 v11.1.6
If complaints continue on 11.1.7, the next step is FEATURE-12 chips (a decision), not another label.
ISSUE-175
G01
None for this row. Three routes are reachable (26e07b64 etc. LIVE). /chartupcoming and /profile-settings are orphaned on purpose by owner decision.
Five user-facing routes are registered in main.dart and have ZERO inbound links — they cannot be reached by an
easynone: weekly_report.dart:24-34 (Mark 2026-10-12 'do not link'); profile_screen.dart:675 (ISSUE-238)none
orphan-route check in _verify.js / navmap run on HEAD
no linked reports
Close as done. Register lags (stage=committed, all 6 commits LIVE).
FEATURE-71
G02
Done for component-screen prompts (LIVE). Journal-tab prompts default to 'potential' because they have no facet, by design. UX-14 path is new.
Facet-aware tarot spreads — stop hardcoding every prompt-to-tarot link to the generic "Your Potential" spread;
easynone: component_summary.dart:378-382,1097 passes facet layout; journal_prompt_card.dart:116-121 documents defaultnone
Prometheus journal_prompt_tarot_total by spread_layout on 11.1.7
no linked reports
Close this row. Move the 'who is this about' idea to UX-14.
ISSUE-110
G02
Fixed by design decision: current location is app-wide and the help text now says so (9b7dd49e, LIVE).
Setting one profile's "current location" overwrites the current location on every saved profile — reported wit
easynone: current_location.dart:300 states it applies to all profilesnone
device: open location picker in header and read help text
no linked reports
Per-person transit location would be a feature (relocation exists).
ISSUE-132
G02
Fixed: auto-pair uses persist:false and guards fixed (548df4f0, LIVE).
Relationship Matrix user-selection: two-profile accounts get silently paired and the pairing is persisted app-
easynone: lib/views/matrix.dart:553 setUser2(..., persist:false); :527,:539,:580 mounted guardsnone
2-profile account: open Relationship Matrix, then check synastry elsewhere keeps the prior user2
no linked reports
Register lag: stage=pushed, commit is in 11.1.7.
ISSUE-196
G02
Fixed: caller-supplied deeplink/tab now win (788e90cd, LIVE). The tarot analysis passes '/tarot', not the specific reading.
generateDataReport builds a journal deeplink only for matrix_category — every other AI report saves a dead end
easynone for this row: report_service.dart:482-500; tarot deeplink generic at :671none
journal entry from tarot analysis opens /tarot
no linked reports
A reading-specific deeplink is an ISSUE-194 follow-up.
ISSUE-420
G02
Main-tab back is fixed (514a15df, LIVE). Case E fix 4ec90fc9 is UNPUSHED. Not yet checked on Samsung One UI.
The back button does nothing on EVERY screen on Android, so there is no way out of any drilled-in view - a cha
easynone for main path; case E only on local new-ui (4ec90fc9 unpushed)Mark: push 4ec90fc9 (RB-1), then build
10 nav tests pass; device check on Samsung/One UI
1 customer; 2026-09-23 v11.1.3
Reviewer approved 4ec90fc9.
ISSUE-48
G02
Fixed and LIVE: login/forgot show the tab bar when profiles exist, otherwise a back chevron to /intro.
Login screen has no way out — auth dead-end, disabled password-reset return
easynone: lib/views/login.dart:677-688; forgot_password.dart:136none
device on 11.1.7: logout and delete-account flows, then leave login
no linked reports
Logout/delete still goAndReplace('/login') (account_screen.dart:321,511), but the login screen now has its own way out.
ISSUE-491
G02
Not reproducible: every 'Account' label opens AccountScreen. Likely confusion: the Users ⋮ sheet is titled 'Account' (pick_user.dart:876).
Tapping 'Account' opens the Users/profile list instead of the Account screen
easynone: profile_screen.dart:800,843 route to Account; pick_user.dart:876 sheet titled 'Account'reporter's exact tap path
ask reporter; device repro
1 customer; 2026-09-27 (version unknown)
No code is in the way. Any change to the sheet's title is a wording call for Mark.
ISSUE-631
G02
Report generates and saves. Since 11.1.6 the saved toast has 'View Now' to the Journal Reports tab (e111ab8e, LIVE). The reporter was on 11.1.5.
Astrocartography relocation map "report" tap never shows the report -- repeatable on every city/line
easynone: astrocartography_screen.dart:1186-1191 -> report_flow.dart:70-96 View Now; acg_city_report_total error=0 (2026-10-10)none
Android 11.1.7 device: ACG city report, then View Now; acg_city_report_total outcomes
no linked reports (Discord tester 2026-10-09 v11.1.5)
Auto-opening the report would override Mark's all-report-types toast decision.
ISSUE-45
G03
Nothing in code; web popup-blocked toggle now warns. Only proof on the deployed web build is missing.
"Revert to old UI" toggle silently no-ops on web (popup blocker)
easynone: fix at lib/main.dart:1352-1372 + lib/utils/web_utils_web.dart:39-45, commit 9d2ac77f LIVE (ancestor of 3423e5a2)Confirm deployed web build includes 9d2ac77f
Web: block popups, toggle old UI, confirm warning snackbar
no linked reports
No linked reports. Close once deployed web build confirmed.
ISSUE-553
G03
Node fix deployed; only confirmation that old-UI profile-cap loop reporters now get correct /user-count is missing.
ISSUE-461's flawed deletedAt predicate survived at two more sites for a week - /user-count returned 51 for a c
easy
node
none: origin/master routes/user.js:1983 (/user-count live filters) and :4745 (/connectedUsers uses profileVisibility.liveListQuery), commit 7f531ad1 pushed=deployedNone
Read /user-count for the 3 measured accounts (51->120 etc.); legacy web add-profile with >5 live profiles
2 linked customer(s); latest 2026-09-25 on 11.1.4
Linked reports (2026-09-25) predate 2026-10-03 fix. A >5-profile free user hitting legacy cap is correct behaviour.
UX-2
G03
Mobile toggle fix exists (awaited write); retraction was wrong. Unproven: both directions on 11.1.7 device, and legacy web calling switchToNewUI.
"How do I go back to the old UI?"
easynone: lib/views/profile_screen.dart:699-723 and lib/views/settings.dart:314-336 await the useOldUI write before restart — added in aa18a464 (diff confirmed), LIVE; old->new bridge lib/services/webview_service_mobile.dart:545-550Legacy web must expose a control calling switchToNewUI (legacy-web owner)
Device test 11.1.7 iOS+Android: new->old->new, kill app, confirm mode persists; check app_ui_mode_by_platform counter
10 linked customer(s); latest 2026-10-15 on 11.1.4
Register retraction of aa18a464 is incorrect for this file; correct the row. Demand side (users wanting old UI) is separate.
ISSUE-373
G04
Node fix deployed (empty name -> 'Anonymous'); needs proof that /adduser 500s on empty name have stopped.
/adduser returns HTTP 500 when the profile name arrives empty — 12 in a 37-minute window, and the customer get
easy
node
none: origin/master routes/user.js:30 resolveProfileName (services/profileName.js, ceda5b6c 2026-09-22, deployed)None
Count /adduser 500s with empty name in errors over 14d (filter on msg)
no linked reports
No linked reports.
ISSUE-409
G04
Writer fix and dedupe done; remains to show no new duplicate groups and handle the stale-survivor side effect (ISSUE-424) separately.
43,880 redundant duplicate charts across 26,901 accounts — a failing save wrote a row on every retry, worst ca
easy
node
none: a0145a4/6bf979f on origin/master (deployed); 2026-10-02 duplicate groups 30,718->0Payments residue must NOT be collapsed (see row notes)
Read duplicate-group count with newest row in last 7d
no linked reports
No linked reports.
ISSUE-410
G04
Repair done to 2 accounts; only those 2 remain plus a read-back.
4% of accounts hold charts with no profiles row — invisible to friend search, handles and /GetAllUsers, and th
easy
node
none: 011e614/155397c deployed; 28,060 -> 2 accounts without profiles row (2026-09-23)None
Re-count accounts with charts but no profiles row
no linked reports
No linked reports.
ISSUE-437
G04
Mixed-schema fix deployed; needs proof the 'Cast to string failed' errors have stopped.
addOrUpdateProfile throws 'Cast to string failed' on profiles.profile — 11 a day, predates every deploy, and i
easy
node
none: b28c950 on origin/master (deployed 2026-09-28)None
Count 'Cast to string failed' in errors since 2026-09-28
6 linked customer(s); latest 2026-10-14 on 10.9.7
Linked reports go to 10.9.7; likely meaning-matched profile-loss complaints.
ISSUE-692
G04
Fix exists (edits now hold, 1823371b); needs device proof an edited birth place survives restart.
Play Store 1-star: edited birth place on a saved profile will not persist, even after cache clear/force-close/
easynone: 1823371b LIVE per 3423e5a2 (lib/services/user_form_controller.dart, user_service.dart); NOT in d89c1fc1, so iOS 11.1.7 may lack itConfirm which commit the iOS 11.1.7 build was cut from
Android 11.1.7: edit birth place, force-close, reopen; repeat iOS on next build
8 linked customer(s); latest 2026-10-13 on 11.1.6
Latest report 11.1.6 predates fix. Possible server-side ISSUE-454 cause if it recurs.
ISSUE-508
G05
Server skip for permanently-gone Google subscriptions deployed; needs proof Sync Payments Failure volume fell.
/syncPayments re-queries subscriptions Google has permanently deleted, on every launch — the loudest error sou
easy
node
none: e12241ba (twin of 668d7fc) + d130370 + 5618194 on origin/master (deployed); client only logs at lib/services/integration_service_mobile.dart:619-635None
Count Google 410 log lines and 'Sync Payments Failure' distinct users/day vs 529/day baseline
no linked reports
Cited Flutter commit 15a9cad5 is unrelated stats tagging.
ISSUE-56
G05
Dedup guard now user-scoped and soft; needs evidence no genuine purchase is dropped as duplicate.
Client-side purchase-dedup guard blocked a legitimate first-time Apple purchase
easy
payments
none: lib/services/purchase_service_mobile.dart:170-180, 566-600; 6525fbe9 LIVENone
Metric: 'Duplicate Purchase Detected' events not followed by a payments row in 48h
5 linked customer(s); latest 2026-10-06 on 11.1.5
Latest linked report (2026-10-06, 11.1.5) is a login confusion, not clearly this bug.
ISSUE-563
G05
Split 5/5 caps live; needs behavioural confirmation. Server-side cap enforcement is absent (separate, unfiled).
Free-tier save cap split: 5 charts and 5 reports as independent counters (was one shared pool of 10)
easynone: lib/services/content_gating_service.dart:139 freeTierChartLimit=5; 1b65a6cf + 70a08d0a LIVE (70a08d0a not in d89c1fc1)Server cap (Node) is a separate row to file
Free account: save 5 charts then 6th blocked; 5 reports independently
1 linked customer(s); latest 2026-10-03 (version unknown)
gated_content_widget.dart:911 interpolates the report limit in a getLang key, against Mark's literal-key rule.
ISSUE-572
G05
Fix pushed but not live; needs a real purchase while at the profile cap in one session (iOS release gate).
Paid users re-shown the add-profile paywall repeatedly in one session — UserService's profile-limit cache neve
easy
payments
none: lib/services/user_service.dart:71 cachedLimitNeedsRecheck used at :3786; 67cce05c pushed-not-live (build 99); 6 unit testsBuild 99/11.1.8 release; sandbox store account
Sandbox purchase at cap, tap Add Profile without restart (iOS+Android)
1 linked customer(s); latest 2026-10-10 on 11.1.5
Mark: do not mark verified until purchase test runs.
ISSUE-696
G05
Android checkout fix exists only on local new-ui (unpushed); Android completion still 39% vs iOS 60% in the field.
Android checkout loses buyers to billing errors: 39% of Android buy-taps complete vs 60% iOS (null offer token
medium
payments
none: 26b62c73 local-unpushed (single-flight, pre-launch refresh, BillingClient reconnect in purchase_service_mobile.dart)Mark to push 26b62c73; Android 11.1.8 release hold (ISSUE-228)
Play sandbox purchases incl. double-tap; post-release buy-tap completion metric
3 linked customer(s); latest 2026-09-24 (version unknown)
Needs push approval, then Android build.
FEATURE-51
G06
Descriptive line titles live; the four meaning strings were never seeded into the language table.
Astrocartography line labels should say what the line MEANS, through getLang — Mark, 2026-09-22
easy
content
none: lib/services/astrocartography_service.dart:51-77 (label stable, meaning via getLang); 200e0e77 LIVEContent owner to seed 4 translations
Non-English device: Cities heading shows translated meaning
no linked reports
No linked reports.
ISSUE-183
G06
South Node drawing fix is live; only on-device confirmation missing.
South Node is computed end-to-end but never shown as a chart body
easynone: 54aadf07 + 95de78bc LIVE (glyph index fix, Patterns crash fix)None
Open natal wheel + Patterns view on 11.1.7; South Node opposite True Node
no linked reports
No linked reports.
ISSUE-231
G06
'True Node' label is live; only on-device confirmation missing.
App displays TRUE Node as "North Node", hiding the convention difference that makes our node sign disagree wit
easynone: lib/utils/astro_helper.dart:1450 names index 10 'True Node'; d1060f1c LIVENone
Natal chart on 11.1.7 shows 'True Node'
no linked reports
No linked reports.
ISSUE-264
G06
House-cell min-width fix live; needs the tester brief on iOS at default and 1.5x text (ISSUE-734).
Houses are no longer readable in the new-UI chart — 6 iOS reviews in 2026, mean 1.67 stars, and the register h
easynone: lib/widgets/chart/chart_widgets.dart:624-664 minWidth; 3469348f + tests 0bb6ba8f/57fc4d62 LIVEISSUE-734 text-scale may still truncate
iOS 11.1.7 device at 1.0x/1.5x text: houses 10-12 readable
5 linked customer(s); latest 2026-09-22 on 11.0.0
Latest linked report 2026-09-22 on 11.0.0 predates fix.
ISSUE-274
G06
House tap target enlarged and live; needs iOS device proof a house tap opens its detail.
Tapping a house reportedly does nothing on iOS — split from ISSUE-264 because the tap path is wired and a layo
easynone: lib/widgets/chart/chart_widgets.dart:644-664; 7ae83884 + c81c66b3 LIVESame tester brief as ISSUE-264
iOS 11.1.7: tap house 10/11/12 cells, popup opens
1 linked customer(s); latest 2026-09-09 (version unknown)
Single 2026-09-09 review predates fix.
ISSUE-411
G06
Truncating formatter (never 60') exists in app; the 2026-09-23 report probably came from an old build or legacy UI renderer.
A planet at 29 deg 59.7 min is displayed as "30 deg 00 min" of the sign it is still in - degrees and minutes a
easynone: lib/utils/degree_format.dart:36-43 + JS twin :76-105, every path uses splitDegreeMinutes (17 refs); test/utils/degree_format_test.dart; in aa18a464 LIVEFind reporter's surface/version (he also uses old UI)
Unit test exists; device check body at 29°59.7'
4 linked customer(s); latest 2026-09-23 (version unknown)
Register has no commit cited; cite aa18a464. Legacy web formatter not checked.
ISSUE-479
G06
Wheel labels AC/IC/DC/MC only where the angle sits on the cusp; needs a whole-sign device check against the reporter chart.
Chart wheel's quadrant-cross lines may not represent real AC/DC/MC/IC degrees, or are unlabelled if they do
easynone: da907f19 LIVE (11.1.7); app_assets/Shapes.1.8.js:85 angleSitsOnCusp, used :522-532; test/wheel_angle_labels_test.dartReporter chart ([customer], whole sign) on 11.1.7
Run test/wheel_angle_labels_test.dart; device check of a whole-sign chart on 11.1.7
3 linked customers, latest 2026-09-27 on 11.1.4
Last linked report 2026-09-27 on 11.1.4, predates the fix build.
ISSUE-103
G07
Enum-index and natal-axis fixes are live; no post-fix confirmation that aspects are no longer dropped.
New-UI aspect grid silently drops real aspects (outer-planet-to-personal hit hardest, no fixed pattern) — arra
easynone: f7146db1 and da652e24 LIVE; chart_service.dart:510-548Reporter chart ([customer]) or corpus test
Existing unit tests + device check of an outer-to-personal aspect on 11.1.7
3 linked customers, latest 2026-09-16 on 11.0.0
Last linked report 2026-09-16 on 11.0.0, before fixes.
ISSUE-404
G07
Single AspectClass classifier is live; graph page vs wheel agreement on the reporter chart not yet checked.
Graph-page aspects disagree with the wheel on the same chart (new UI, Android) - reported three times in three
easynone: c476fba5 and 87c381a8 LIVE; lib/core/chart_constraints.dart AspectClassReporter chart ([customer])
Device check graph vs wheel on 11.1.7; close with 60/58
3 linked customers, latest 2026-10-10 on 11.1.3
Latest 2026-10-10 'cannot click empty boxes' is expected behaviour.
ISSUE-468
G07
Natal grid rows now include Ascendant and mirror on birth charts, so ASC-Uranus/Neptune should show; unconfirmed.
Ascendant-Uranus and Ascendant-Neptune conjunctions missing from aspect chart despite a 10-degree orb setting
easynone: 1de9a354 and da652e24 LIVE; astro_helper.dart:1488-1491 rows include Ascendant(11)Reporter chart
Device check of reporter chart on 11.1.7
1 linked customers, latest 2026-09-25 on 11.1.4
Report 2026-09-25 on 11.1.4 predates da652e24.
ISSUE-499
G07
Transits to natal North Node now render (natal on rows); NN/SN orb mismatch from second reporter is an engine question.
North Node transits missing from the gridded transit chart, while South Node transits do show -- asymmetric, n
easynone for row symptom: da652e24 LIVE, astro_helper.dart:1490 rows include NN(10)/SN(27)Reporter check; [customer] orb mismatch to engine owner
Device check transit grid on 11.1.7
1 linked customers, latest 2026-09-29 on unknown version
Transit-side nodes are still not columns (by design, chart_service.dart:536-539).
ISSUE-58
G07
Mirror and single-classifier fixes live; transit-planet x natal-asteroid aspects still have no cell by design.
Transit aspect orbs sporadically missing from the natal aspect grid
easynone for row: 1de9a354, c476fba5 LIVE; chart_service.dart:719-726 notes the asteroid gap needs a product decisionReporter check; separate decision for natal-asteroid rows
Device check on 11.1.7
1 linked customers, latest 2026-09-22 on 11.1.3
[customer] 2026-09-22 complaint is the known natal-asteroid gap, not this fix.
ISSUE-60
G07
Classifier unified and live; Mercury-IC/DC mismatch likely natal vs daily-transit views of different data.
Aspect graph and daily chart disagree on the same aspect (Mercury-IC/DC)
easynone: c476fba5 LIVEReporter ([customer]) reply
Compare aspect graph vs daily chart on one profile on 11.1.7
no linked reports
No linked reports; verification=verified already.
ISSUE-94
G07
A/S fix released and engine-backed test passes; row just needs closing.
Applying/separating (A/S) transit-aspect labels reportedly swapped — the actual substantive report behind ISSU
easynone: bc8a39ec LIVE since 11.1.5; test/aspect_applying_sign_test.dartNone
Run test/aspect_applying_sign_test.dart
3 linked customers, latest 2026-09-10 on 11.0.0
Stage released, verification verified; status lag only.
ISSUE-374
G08
All four astrocartography silent-failure paths fixed and live; needs outcome metric read on 11.1.7.
Astrocartography presents a wrong or empty map as a successful one: four silent-degradation paths, no error sh
easynone: 2b6badf9, 7abac129 LIVE; astrocartography_service.dart:623 nullable GAST, astrocartography_screen.dart:191-399acg outcome metrics
Read outcome=no_result share on 11.1.7
no linked reports
No linked reports.
ISSUE-490
G08
Blank pattern graphic is likely the Patterns crash fixed by 95de78bc (live); needs reproduction check on 11.1.7.
Chart-pattern graphic renders blank (Android, since a recent update) -- signs list but the pattern/house image
easynone: 95de78bc LIVE (ISSUE-638); report 2026-09-28 on 11.1.4Reporter ([customer]) check
test/pattern_chart_data_test.dart; Android device Patterns view
1 linked customers, latest 2026-09-28 on 11.1.4
Close as duplicate of 638 if not reproducing.
ISSUE-503
G08
Renderer init failures fell 3.51%->1.14% of weekly actives; needs re-measure on 11.1.7 only.
Chart renderer fails to initialise within 10s for ~2,200 users a month, 99.3% Android -- they are shown a red
easynone in code: fixes LIVE; metric 1.14% (2026-10-12)errors collection by build 300100098
Share of weekly actives with init timeout on 11.1.7
2 linked customers, latest 2026-09-25 on 11.1.4
If residual persists, trace Android WebView init (native).
ISSUE-513
G08
drawChart readiness-probe fix live; needs 'drawChart function not found' count on build 300100098.
Chart-rendering JS has a syntax error in today's build (300100096), killing drawChart and crashing the headles
easynone: ba89a152 LIVEerrors collection by build
Count drawChart-not-found users on 11.1.7
no linked reports
No linked reports.
ISSUE-638
G08
Patterns crash fix live; awaiting on-device confirmation from reporters.
Chart patterns (houses) not showing since last update -- two independent reporters
easynone: 95de78bc LIVE; test/pattern_chart_data_test.dartReporter confirmation
Run pattern test; device Patterns view on 11.1.7
2 linked customers, latest 2026-09-27 on 11.1.4
Independently re-verified in tree 2026-10-12.
ISSUE-7
G08
Splash-hang fixes (dee23cd3, 23d2be43, startup timeouts main.dart:344/468) are live. The _verify reopen counts headless chart WebView 'Initialization timeout', a different subsystem.
App crashes — split into 3: splash-hang timeout (fix real, but "outage-only" framing challenged 2026-09-10), b
mediumnone for splash: the reopen metric is emitted at lib/utils/chart/chart_renderer_mobile.dart:309 (chart WebView 10s ready poll), not the splash path; 252 events/72h are ISSUE-286 territoryCorrect _verify.js check 7 (nodejs scripts/_verify.js:1783) to a splash signal, or re-point it at ISSUE-286
Split 'Initialization timeout' rows by app version; ANR/startup vitals on 11.1.7 (Play Console) for splash
19 linked customers, latest 2026-10-14, version 10.9.7 (pre-fix build)
Fixes are live (11.1.7). The check behind the reopen measures chart-renderer init, so it can't confirm or reopen the splash fix.
UX-6
G08
Umbrella row. Settings spinner fixed (per-preference catchError, profile_screen.dart:244-289, 967017e3 live). Birth-time how-to is discoverability, tracked in ISSUE-731.
Basic how-to / dead controls
easynone: lib/views/profile_screen.dart:244-289 per-field fallback in live build (967017e3); no dead handlers found (2026-08-30 check)ISSUE-731 for Edit Profile discoverability
Device-check settings panel loads on 11.1.7 with flaky network
no linked reports
Close the umbrella once settings load is checked on a device; the how-to part belongs to ISSUE-731.
ISSUE-602
G09
None in code: journal edit PUT now targets NODE_URL (journal_service.dart:644, c5d77090) in live 11.1.7.
Editing a saved tarot reading has never saved: journal_service.dart PUTs a Node route path to the legacy host
easynone: fix c5d77090 is an ancestor of 3423e5a2 (live); lib/services/journal_service.dart:644Remaining false-saved half is ISSUE-392
Rename a tarot reading on 11.1.7, reload, confirm persisted in Reports tab
no linked reports
Live fix. Only device evidence is needed.
ISSUE-509
G10
None in code: angle rows dropped from all 'in Houses' Matrix categories (astro_parser.dart:958-972,1374) in live 11.1.7.
Matrix lists the four angles as placements in houses -- drop them: the angles ARE cusps, so the row is tautolo
easynone: 49d28241 + d89c1fc1 are ancestors of 3423e5a2 (live)none
Open Matrix Planets/Transit in Houses on 11.1.7, confirm no Ascendant/MC/DC/IC rows
no linked reports
Register stage lags. The fix is live.
ISSUE-559
G10
135 corrupt Planet Aspects keys left deliberately with broken images; main-category broken images 533->1 after 922-row repair (live in DB 2026-10-05).
135 corrupt keys in Planet Aspects render broken images and serve content under misspelled, mistranslated and
easynone for repairable rows: data rewritten in prod DB 2026-10-05; corrupt keys remain by design pending key cleanupNode content owner for the junk-key cleanup
Run fix-component-images.js --all --report and read result
no linked reports
Server data. Read back with the existing report script before closing.
ISSUE-661
G10
Root cause (facets null, ISSUE-654) fixed server-side 2026-10-12. Flutter empty-state fix 865eabc2 is pushed but not live; 11.1.7 still throws the raw exception (matrix.dart:3190 in 3423e5a2).
Full Report / Matrix comparison throws 'No items found for the current tab and filter combination' -- cluster
easygit grep at 3423e5a2: lib/views/matrix.dart:3190 still throws 'No items found...'; HEAD matrix.dart:3189 has the fixRelease of build 99 / 11.1.8 (ISSUE-228 hold)
Device: empty tab/filter combo shows info, not error, on 11.1.8
3 linked customers, latest 2026-10-11, version 11.1.5
Pushed but not live (b99). Raw error text stays in the live build until 11.1.8.
ISSUE-681
G10
Duplicate of ISSUE-661; root cause was the 2026-10-11 facets outage, restored server-side (ISSUE-654, 0/115 -> 107/115).
LIVE: Matrix Summary / synastry / radar charts show 0 or fail for many accounts, onset correlates with 2026-10
easynone: server restore confirmed 2026-10-12; 15 customers told; no reports after 2026-10-12 linkedISSUE-654 floor check
Run verifyRoute probe (Matrix Summary nonzero for a named account)
19 linked customers, latest 2026-10-12, version 11.1.6
Close as duplicate of ISSUE-661 once the probe passes.
ISSUE-686
G10
Legacy .NET still guesses image filenames; client-side correction c72fa47b (via Node ResolveImages, deployed as 41adab11) is pushed but not live.
Legacy .NET CalculateHoroscopes guesses Image filenames and ignores curated Mongo data: 36% of Transit/Synastr
easyc72fa47b not ancestor of 3423e5a2; Node twin 41adab11 on origin/master (deployed); lib/core/astro_api_service.dart:88, horoscope_service.dart:1698Release of build 99 / 11.1.8
Re-run full-matrix image probe on 11.1.8 client; count 404 images
1 linked customer (Apple review 2026-10-03)
Pushed but not live. Legacy-side patch is deliberately not shipped.
ISSUE-688
G10
Fixed locally: filterItems now checks matrixType (matrix_service.dart:680-684), dd78087a, unpushed.
Every Moon transit is dropped from the synastry and transit matrices by a rule whose own comment says it is fo
easynone in HEAD: lib/services/matrix_service.dart:683; dd78087a only on local new-uiMark to push with RB-1, then build
test/services/matrix_filter_transits_test.dart (flipped); device: relationship matrix lists Moon transits
no linked reports
Unpushed. Needs push + build, no code.
ISSUE-689
G10
Missing combos seeded (202 + 786 rows live in prod DB); 216 flagged NeedsCleanup; seeding scripts commit 3e981b6f is local-only.
Content corpus genuinely missing 273 (body,aspect) combos - South Node/Vertex/Part Of Fortune/DC-IC/minor bodi
easynone for coverage: rows written to prod DB 2026-10-12; quality of 27.5% NeedsCleanup rows unreviewedNode owner to push script commit 3e981b6f; content review of NeedsCleanup rows
Re-run full-matrix 404/missing probe
1 linked customer, latest 2026-06-26
Server data. Read back coverage before closing.
ISSUE-237
G11
None in code: synastry reports send body ownership (report_service.dart:550-830, c6c85d8c/8e549c5d) in live 11.1.7; Node reads it.
Synastry INTERPRETATION attributes each placement to the wrong person — reported after ISSUE-40 shipped, and t
easynone: c6c85d8c, 8e549c5d ancestors of 3423e5a2; latest report 2026-09-14 on 11.0.0 predates fixnone
Generate synastry report on 11.1.7; confirm 'Who:' attribution correct; ownershipUnknown count ~0
4 linked customers, latest 2026-09-14, version 11.0.0
Live. Needs a post-release report check.
ISSUE-40
G11
None in code: synastryNamesSwapped (astro_parser.dart:1018) plus ownership fixes live. One report on 11.1.4 (2026-09-29) predates c6c85d8c.
Synastry name/placement swap — was fixed but never got a tracked entry
easynone on 11.1.7: latest report 2026-09-29 on 11.1.4, before c6c85d8c (2026-10-06, live)none
Device synastry check on 11.1.7; watch support for post-11.1.7 swap reports
11 linked customers, latest 2026-09-29, version 11.1.4
Live. Close on clean post-11.1.7 evidence.
ISSUE-484
G11
None in code: _loadChart now records mid-load reload requests and clears the flag in finally (chart_screen.dart:710-865, 26c9ed66) in live 11.1.7.
Synastry secondary chart gets 'sticky' when switching between multiple people quickly
easynone: 26c9ed66 ancestor of 3423e5a2; register's 'needs investigation' predates reading this commitnone
Device: switch synastry partner rapidly A->B->C on 11.1.7; [ISSUE-484] logs
no linked reports (Discord [customer] 2026-09-27, pre-fix)
Audit said 'no fix exists'. That's wrong: the fix is live.
ISSUE-673
G11
Duplicate of ISSUE-484; same fix (26c9ed66) live in 11.1.7.
Synastry secondary chart gets "sticky" (stale) when switching between multiple people quickly -- reviewed in D
easynone: same mechanism fixed at lib/views/chart_screen.dart:710-865ISSUE-484
As ISSUE-484
1 linked customer (Discord 2026-09-27)
Close as duplicate of ISSUE-484.
ISSUE-39
G12
Persistence and AI-language fixes (11 Flutter commits) are live in 11.1.7; needs evidence that language persists and reports follow.
Language support after the update — 3rd reporter 2026-09-11 materially reframes this: the gap is AI-generated
easynone: all 11 cited commits ancestors of 3423e5a2; latest report 2026-10-07 on 11.1.3none
Device: set es, restart, confirm persists and AI report in es on 11.1.7
17 linked customers, latest 2026-10-07, version 11.1.3
Live. Device verification only.
ISSUE-406
G12
None in code: prompt request sends user language (journal_prompt_service.dart:261, b807bc22) in live 11.1.7 (Android too).
Journal prompts always request lang=en — the Flutter call site hardcodes it, so translated prompts would be un
easynone: b807bc22 ancestor of 3423e5a2; side-effect regression is ISSUE-729ISSUE-729
none beyond ISSUE-729 probe
no linked reports
Close. Live on Android as well, so ISSUE-729's empty tab also hits Android.
ISSUE-528
G13
Node fix aae9791c is on origin/master (deployed), so the register's 'unpushed, still live' wording is stale. Still to do: confirm no new relocation docs end in ', structuredReport: {'.
structuredReport leak into relocation report text -- fixed in commit aae9791, but unpushed and still live in p
easynone: aae9791c is an ancestor of nodejs origin/master (auto-deploys); Flutter save-path twin 7e5c0ac5 is LIVE in 11.1.7ISSUE-566 Flutter fix reaching clients
Query relocation journals created after deploy for the structuredReport marker (expect 0)
no linked reports
Title is stale; update the register stage to deployed.
ISSUE-566
G13
Fixed: the relocation tile now saves genResult.report, not Map.toString(). Only proof from 11.1.7 clients is left.
Relocation city reports stored a Dart map dump as the journal content, not the report
easynone: 7e5c0ac5 is LIVE (ancestor of 3423e5a2); astrocartography_screen.dart:1154 uses genResult.report ?? asStringnone
Query relocation journals from 11.1.7 clients for content starting '{reportName:' (expect 0)
no linked reports (group G13 record: 7 customers)
Register says 'local only'. Stale: it is in the live build.
ISSUE-567
G13
Fixed 2026-10-10 by boot-time pm2 reconciliation, and deploy verification reports OK since. Only open question: is a standing _verify check still wanted?
Every deploy silently skips the components app: pm2 reloads 8 of 10 and reports OK, so /component has run stal
easynone: 1f54a20d/e28a9946 deployed; history 2026-10-11 'DEPLOY VERIFICATION OK' on consecutive deploysMark: standing check yes/no
Read _regression_watch.js deploy for the last N deploys (components id 3 restarted)
no linked reports
Infra, not Flutter; can close once the check decision is made.
ISSUE-213
G14
Fixed: numeric useRewardAds and the flat reward tiers now parse. The reopen uses the wrong instrument: Ad Load Error counts are AdMob fill/network noise.
AdsConfig: useRewardAds and the reward tiers are silently ignored — the DB says reward ads are ON, the client
easynone: aefc22c5 LIVE; ads_service.dart:817-838 coerces number/string, :856-872 reads flat tiersnone
Confirm rewarded ads_shown_total > 0 on 11.1.x; replace the _verify check (Ad Load Error) with a reward-ad shown metric
2 customers, latest 2026-09-22
verifyRoute measures something the fix never touched; fix the check, not the code.
ISSUE-335
G14
Flutter AdMob fallback is live, so blank slots are gone. The in-house inventory is still empty: the one active row is tagged ItemContent.
The in-house half of the Native ad slot serves nothing: 1 active ad row, tagged ItemContent, while the client
easynone for the blank render: dd77df4b LIVE (InHouseAdsService.hasInventory); _verify still sees in-house endpoints EMPTY (data, not code)Content owner to create AdContent rows if in-house is wanted
Read ad_slot_decision_total{admob_fallback} from 11.1.7 clients
no linked reports
The empty in-house table is a content/business choice, not a defect.
ISSUE-415
G15
Node echo guard is deployed. Likely client cause (support quick-reply templates visible to every user, incl. 'Review' text) fixed live in ce093219.
Inbound messages recorded as the customer's words are verbatim our own support text - client replay, not email
easynone: ce093219 LIVE (toolkit gated on holder uid); quickReplies 'Review' text = the echoed template (message_service.dart:54); node 6a57fca4 deployednone
Check verifyRoute: no new verbatim-echo inbound from 11.1.7 clients; support_inbound_echo counting
2 customers, latest 2026-06-23
Cause attribution to ce093219 is inference from the template match, not proven.
ISSUE-429
G15
Fixed: 'Recover Lost Users' now pre-fills the message instead of auto-sending it. Needs inbound-share evidence from new builds.
The 'Recover Lost Users' button auto-sends 'Lost User Recovery' without the customer typing anything - it is 5
easynone: message_detail_screen.dart:183-190 pre-fill only, landed in ab8e036a (LIVE); latest complaint predates it (11.1.4)none
Share of inbound 'Lost User Recovery' with no other text, split by app version >=11.1.7
13 customers, latest 2026-09-24 v11.1.4
Register says node/pushed; the fix is Flutter and live.
ISSUE-637
G15
collapseMixedTapBurst is deployed in 4a0baee3. Only verification is left.
A burst of DIFFERENT menu taps read as several requests, so autosupport answered the wrong one
easynone: nodejs 4a0baee3 'a tap burst is one event (ISSUE-637)' is on origin/masternone
Replay [customer] 2026-10-09 thread through autosupport; check single-intent answer
no linked reports
Server-side; client half is ISSUE-331.
FEATURE-15
G16
Built and live: first Home shows one insight card. Not yet measured in production.
One thing, not everything — the first session delivers a single fact
easynone: 686bd518/b987c7ea/797d1c9f LIVE in 11.1.7; audit 5/5 requirementsFirebase first_insight_* access
Read first_insight impression/action events for new 11.1.7 accounts
no linked reports
Register stage stale (says not released).
FEATURE-26
G16
Built locally: Important Birth Aspects panel reuses the Moon-ruler selection (430a0809, c1f10733, 90539a5c), but none of it is pushed. 51e6be0d is live.
Lead newcomers with identity, not sky-data
easynone: lib/views/home_screen.dart has 'Important Birth Aspects'; 430a0809/c1f10733 unpushed (local new-ui only)Mark approval to push; 11.1.8+ build
Widget test of panel; device check on Daily
no linked reports
Unpushed; register still references withdrawn 988f98ad ranking.
ISSUE-371
G16
Flutter fixes are all live in 11.1.7. Node e3e7b9e6 (transit refusal of a corrected noon default) is approved but unpushed. Needs a 0,0-rate measurement.
LIVE REGRESSION: 12.24% of new charts are saved at lat=0 lng=0 with no time and no town, up from 1.4% - 10,174
easynone: 12 Flutter commits LIVE (e.g. payload_service.dart:251); nodejs e3e7b9e6 not on origin/masterPush of nodejs e3e7b9e6 (approved)
Rate of new charts at lat=0/lng=0 from 11.1.7 clients vs 12.24%
no linked reports (group G16)
Measure by app version, not total.
ISSUE-518
G16
Fixed live: the client no longer mints a Location at 0,0 when lookup fails, and falls through hosts.
A device-side city/timezone lookup failure saves a chart computed for 0,0 — the client turns null into 0 and N
easynone: 571b8d2b LIVE; location_service.dart:458, astro_api_service.dart:145,201none
0,0 saves per day from 11.1.7 clients
no linked reports
Shares measurement with ISSUE-371.
ISSUE-29
G17
None of the 3 original signatures remain; the only widget fault left is the APPWIDGET_UPDATE broadcast ANR, which ISSUE-394/398 track.
MoonWidget crash cluster (3 signatures)
easynone: bae2ee66 (LIVE) guards startForeground at MoonService.java:274-292; setAlarm dead (AlarmReceiver.java:62 commented); okhttp aligned build.gradle:146 (531db01d LIVE); 09-28 Play read showed 0 on 094/095Play errors API read on 300100098
Play errors API by versionCode 300100098 for the 3 signatures
no linked reports
Close on a 98 read; the widget ANR belongs to ISSUE-394.
ISSUE-82
G17
The in-app Sabian section now uses the live Node GetDegreeInfo, which returns real text. It still needs evidence that the section appears in 11.1.7.
In-app Sabian-symbol widget/section non-functional — one reviewer reports it's been broken 8+ months with no f
easynone: ae5a8c44 LIVE (sabian_service.dart:37-38 -> NODE_URL component/GetDegreeInfo); Node 54c18daf on origin/master; curl 2026-10-16 returns sabian text; Android widget fixed 42321b63 LIVEnone
Open a component summary on an 11.1.7 device; confirm _showSabianSection (component_summary.dart:522) is true
1 linked customer; latest 2026-08-25 support 10.9.7 (pre-fix)
The linked reporter was about the widget; the iOS widget part is ISSUE-460.
ISSUE-216
G18
Fixes (b) and (c) and the login_failed logging are live in 11.1.7. Claim (a), dropped sessions, is unproven. Reports continue from 11.1.5 users.
Forced sign-out / login no longer recognised after the update — 4+ reviewers, never logged, and it strands peo
mediumsupport 2026-10-13 11.1.5 'updated and it kicked me out'; login_service.dart:418 login_failed (f3c21ecc LIVE); account_screen.dart:399 showForgotPassword:true; 2a7c8dee/2eb84141 LIVE11.1.7 adoption
Read errors msg='login_failed' reason distribution on 11.1.7 (filter on msg, not info.subsystem)
48 linked customers; latest 2026-10-13 support 11.1.5
If reasons cluster, open a new row per reason; the group's reset faults are on Node rows.
ISSUE-507
G18
Recovery no longer lists names: Node asks for them and checks the sender's own account first. Deployed; needs evidence on new threads.
Account recovery cannot identify an account: options all named Anonymous, the same account listed three times,
easynone: Node 32e91d1b/acc7ad6b/717234ae on origin/master (auto-deployed); services/recoveryIdentity.js:45 treats 'anonymous' as WEAKnone
Review the next 30 days of Lost User Recovery threads for listed-name options or repeats
6 linked customers; latest 2026-08-07 support 10.9.7 (pre-fix)
Server-side only.
ISSUE-520
G18
Node fixes carry name and handle forward on registration (pushed 10-02/10-10). Needs a measurement that new registrations no longer create Anonymous parallel rows.
Registering from an existing anonymous profile creates a blank parallel profile instead of migrating name/hand
easynone: Node 9182fe4b, 8709df8a, b3d6a149 on origin/masternone
DB query: registrations since 10-10 where the profileId is shared with an app- row and name='Anonymous'
7 linked customers; latest 2026-09-20 support 11.1.3 (pre-fix)
Node area.
ISSUE-174
G19
The client build is done and live. What is left is content (Planets in Houses rows, translation), tracked in FEATURE-50 and ISSUE-377/379.
Journal prompts UI — the Flutter client build for the journalprompts feature (FEATURE-LIST §8g); shared compon
easynone: 5c04e1c2 LIVE; Prompts tab first in journal.dart:22 (2f6a186a LIVE); endpoint answers 200FEATURE-50 / ISSUE-379
Confirm prompt entries keep accruing on 11.1.7
no linked reports
Close as client-complete.
ISSUE-194
G19
Tarot AI synthesis is shipped (feature audit COMPLETE, 5/5). The register is behind.
Post-reading tarot analysis: no AI synthesis surface exists in the app — add the service call and the Analysis
easynone: 92039341 + 4d9bcae9 LIVEnone
Device: finish a reading, tap Analysis, confirm the sheet and the journal save
no linked reports
Close.
ISSUE-267
G19
enginePayload() fixes the null town/lat/lng payload. It is deployed; needs a metric read.
AI monthly reports fail with a .NET NullReferenceException — one user retried 7 times and got nothing; transit
easynone: origin/master routes/ai/reports.js:23,78 uses enginePayload (services/horoscopeRequest.js:56)none
horoscope_calc_failed{errorType} must show no NullReferenceException from the monthly path
no linked reports
Node; the engine path is legacy and must not be migrated yet.
ISSUE-377
G19
The houseless fallback is deployed and Planets in Houses now matches (99 hits). It still misses 219; Progressed Aspects still misses.
Planets in Houses prompts unreachable: house is in both halves of the lookup key, 76 requests matched 0
easy/events/metrics 2026-10-16: Planets in Houses matched=1 99, matched=0 219; Progressed Aspects matched=0 2; origin/master routes/journals.js:458ISSUE-379 (non-en lookups count as misses)
Split the misses by lang; if English misses remain, file them as content gaps
no linked reports
The fix works; the remaining misses may be language, not keys.
ISSUE-561
G19
The whitelist of promptable bodies and the AspectClass.isMajor filter are live; nothing is left in code.
Journal Prompts tab could ask about asteroids, minor points AND minor aspects -- 'Pallas Inconjunct Natal Nort
easynone: journal_prompt_service.dart:614-694 promptableBodies/excludedBodyNames/isMajor (449b755a LIVE)none
Spot-check prompts served on 11.1.7 for asteroids or minor aspects
no linked reports
Close.
ISSUE-619
G19
The sentinel fix is live and was proven live on 10-10. The 1,134 lost rows cannot be recovered. A standing _verify.js check has not been written.
DATA LOSS I CAUSED: a 'null' sentinel chart id made one erasure delete 1,149 journals for an account owning 15
easynone: Node fix on origin/master (14102d4f/b84f8912, 1ac4eaae live proof)none
Write and run a _verify.js check: sentinel rejection fires and no sentinel-keyed journals exist
no linked reports
Node; closing requires the standing check.
ISSUE-171
G20
Token re-registration after login is live. Accounts with notifications on and no token are down from 48,511 to 32.
48,511 accounts have notifications switched ON but hold no FCM token — the core push/retention loop reaches a
easy_verify.js 2026-10-15: 32 of 41,180 lack a token; login_service.dart:274 (fe163bf1 LIVE)none
Sample the 32 remaining accounts; recheck after 11.1.7 adoption
no linked reports
Effectively resolved.
ISSUE-282
G20
The plugin patch (3423e5a2) is live in 11.1.7. be0ccb87 is a clean-checkout build fix, pushed but not live. Needs a crash read on 300100098.
DartMessenger$Reply IllegalStateException still crashing the newest build — 94 reports / 89 users (7.84% of cr
easynone: 3423e5a2 LIVE; be0ccb87 pushed-not-live (build 99)Next Android release must contain be0ccb87 (build only)
Play errors API: DartMessenger$Reply clusters on 300100098
no linked reports (group: generic crash reports 2026-09-27..10-02)
Pushed-not-live part is build hygiene only.
ISSUE-283
G20
The FCM background-executor patch is live in 11.1.7. Needs a per-build crash read.
Firebase background-message NPE still live on the newest build — 35 reports / 25 users, and every occurrence i
easynone: 3423e5a2 + 29722424 LIVEnone
Play errors API: FlutterFirebaseMessagingBackgroundExecutor NPE on 300100098
no linked reports
Close on a zero for 98.
ISSUE-284
G20
Symbols are uploading and the aborts are attributed (WebView GL). The headless WebView fix is live.
5.2% of crash-affected users hit an unattributed libc abort/SIGABRT — native debug symbols appear not to be up
easynone: build.gradle ndk debugSymbolLevel FULL (29722424 LIVE); 350fdd25 LIVEnone
Play: libc abort clusters per user on 300100098 vs 095
no linked reports
Premise resolved.
ISSUE-285
G20
The OOM stopped at 088. A regression guard test that pins the raster dpi is live.
Platform-channel OutOfMemoryError (StandardMessageCodec.writeValue) stopped dead at version code 300100088 — f
easynone: 7d0ab133 LIVE pins the dpi; no reports after 300100088none
Confirm the guard test runs in CI; Play read on 98
no linked reports
Close.
ISSUE-286
G20
The renderer-death handler is live. The separate 'Initialization timeout' (~150 users/day) has no row of its own.
Crash tail: LoadedApk.getAssets NPE (split-APK load), WebView SIGTRAP, and a barcode-scanner plugin NPE in an
easynone: 2001a1e1 LIVE; errors 10-03: 450 users Initialization timeoutnone
Per-build read of renderer-gone on 98; file Initialization timeout separately
no linked reports
Split the timeout into its own row.
ISSUE-394
G20
Broadcast ANR clusters went to 0 on 096 (WorkManager 2.8.1). The ANR rate is 0.12%, under the 0.47% gate. The remaining ANRs are 'root cause unknown'.
The ANR breach is the slow-start breach: 169 of 292 affected users ANR in a broadcast receiver that COLD-START
easynone: 03980098 LIVE; Play 09-29..10-11 TIME_SET/BOOT 0 users on 096none
Play ANR per-cluster read on 300100098
no linked reports
The headless guard 60d22c7f gets no credit; it is defence-in-depth.
ISSUE-395
G20
Warm start was 29.77% on 096, still over the 25% gate. The launch-path batch (097/098) has not been measured.
Slow start by BUILD: warm has come down 76.4% to 58.5% across six builds and is still 2.3x over Google's gate
mediumPlay vitals 2026-10-13: warm 29.77% on 300100096; bcfd3adf/ce4c8db9 LIVEnone
Play slow-warm-start by versionCode 300100098
no linked reports
Escalate to a perf specialist only if 98 is still over 25%.
ISSUE-398
G20
Clock-change broadcast clusters cleared on 096 by the WorkManager bump. The guard ships as defence-in-depth.
A clock-change broadcast cold-starts the whole app: ~25 sequential awaits run to service a headless receiver w
easynone: Play TIME_SET/BOOT_COMPLETED/TIMEZONE_CHANGED 0 users on 096; ce4c8db9/60d22c7f LIVEMark: close as 'cleared by a different change'
Play cluster read on 300100098
no linked reports
Duplicate of the ISSUE-394 evidence.
Blocked on a decision (45)
RowActual remaining problemDifficultyEvidence it still existsDependencies · testingCustomers · notes
FEATURE-12
G01
Matrix filters remain dropdown-only (matrix.dart:1248 category row); no what-moved-where map; search lacks task words. Search icon + Transits tile are LIVE.
Wayfinding — surface what we already built
mediumlib/views/matrix.dart:1248; lib/utils/wayfinding_index.dart:110-188 (no 'delete profile'/'birth time'/'ephemeris' terms)Mark: chip presentation of Matrix filters, and which task words go into the search index (RB-4)
test/wayfinding_index_test.dart + widget test of chips; emulator
1 customer; Apple review 2026-09-08, version unknown
Search (/find) and Transits tile shipped in 11.1.7. Everything left is placement or wording.
FEATURE-17
G01
Bottom tabs unchanged (Chart/Matrix/Daily/Journal/Profile); Tarot has no tab. The overflow menu was removed and its rows now sit behind the search icon (0117f360, LIVE).
Navigation slots — re-allocate the five tabs, and fix the overflow menu
easylib/styles/navigation.dart:167-200Mark: which 5 destinations own tabs (e.g. Tarot vs Journal)
widget test of nav items; reach metric before/after
no linked reports
Code is trivial once chosen; the change moves reach for every feature, hence medium risk.
FEATURE-25
G01
No in-app, onboarding or listing mention of the shipped widgets (iOS Moon/Sabian/PlanetaryHours; 3 Android providers).
Promote the widgets we already ship
easyios/MoonWidget, ios/SabianWidget, ios/PlanetaryHours exist; grep getLang 'widget' mentions in lib = 0Mark: where and what copy mentions widgets; store listing text is outside Flutter
widget test of the copy; listing change is manual
no linked reports
Built and shipping; only copy/placement missing.
FEATURE-3
G01
No persistent chrome store entry (crown removed by decision 2026-09-13). The profile-cap dialog discards its computed Register/Subscribe action (pick_user.dart:2334-2352).
Link the store
mediumlib/views/pick_user.dart:2334-2352 (confirmText/onConfirm computed, never passed to showPremiumUpgradeDialog)Mark: whether a persistent store entry returns and where. The cap-dialog fix touches the paywall, so it needs a payments specialist.
widget test of cap dialog per register/paid state; paywall_shown/exit events; device purchase test
1 customer; 2026-08-04 v10.9.7
Several contextual store doors already live in 11.1.7. Unregistered users at the cap are told to register but get no Register button.
FEATURE-31
G01
Harmonizer reachable only via the Home tile labelled 'Reflections' and search; no entry from chart view or relationship facets.
Harmonizer placement
easylib/widgets/home_buttons.dart:192-196 (label 'Reflections'); wayfinding_index.dart:153Mark: tile label, and whether/where to add chart and relationship entry points
widget test of new link; reach metric for /harmonizer
no linked reports
Working feature; placement call only.
FEATURE-33
G01
Big Three rarity has no consumer and no client code. Sky events, broadcast push and astrocartography already reach users (LIVE).
The four built-but-disconnected assets
mediumgrep -i rarity lib = 0 (positive control: bigThree matches astro_helper.dart:992); no node rarity endpoint foundMark: whether Big Three rarity ships, and its data source (no node endpoint found)
n/a until scoped
no linked reports
3 of 4 assets are done. Rarity is effectively a new feature.
FEATURE-58
G01
'Print' appears nowhere. PDF is offered only for the Reports journal category (journal_widgets.dart:467); charts and aspect grids can't be exported.
Printable/PDF output for CHARTS and aspect grids, not just report text - and 'Generate PDF' is not discoverabl
mediumlib/widgets/journal_widgets.dart:467 supportsPdf only 'reports'; grep getLang('Print' = 0 (control: getLang('PDF') at component_bottom_bar.dart:135)Mark: rename to include 'Print', and whether chart/aspect export is in scope (new rendering = specialist)
widget test of label; device print/PDF on iOS+Android
4 customers; latest 2026-10-14 v11.1.7
Copy action is LIVE (bbb9b895). A paying user missed the existing PDF button because she was looking for 'print'.
ISSUE-178
G01
GlossaryService.searchItems still has zero callers; /find searches only screens and filters. The surface was deliberately never built and waits on a decision.
Content search is fully built and has ZERO callers — GlossaryService.searchItems() is dead code, and the UX do
mediumgrep searchItems lib+test = definition only (glossary_service.dart:156); 2026-10-16 v11.1.7 'search for description of each house'Mark: whether /find shows content results, and what a result tap opens. The endpoint is legacy API/Astrology (do not migrate).
widget test with stubbed searchItems (HttpOverrides.global=null for live probe); device
2 customers; latest 2026-10-16 v11.1.7
The register's detail body is mis-attached (it describes the RESTORE DIAGNOSTIC). Trust the title and history.
ISSUE-478
G01
No in-app path to the Discord community.
Add an in-app banner/notice pointing to the new AstroMatrix Discord
easygrep -i discord lib = only Eris/matrix strings (grep proven on astro_helper.dart:1290)Mark: whether to add a Discord link and where (parked as new feature)
widget test of link; device tap-out
no linked reports
Small once placement is chosen.
ISSUE-685
G01
Friends reachable only as the 2nd tab under a panel labelled 'Users', plus search. No onboarding nudge.
Friends feature has no discoverability path -- buried under a "Users" panel label, no onboarding nudge, no fea
easylib/views/profile_screen.dart:594,629 ('Users'/'Manage Users'); wayfinding_index.dart Friends entryMark: panel label and whether to add a nudge
widget test of label/route; friends adoption metric
no linked reports (Discord 2026-10-12 evidence on row)
Working feature.
ISSUE-731
G01
Edit/Set Main/Delete live only behind a 20px more_vert in Manage Users; absent in picker mode (chevron) and the name-tap selector.
Profile actions (Edit, Set Main User, Delete) are reachable only through a 20px three-dot icon, and not at all
mediumlib/views/pick_user.dart:867-905 (_showUserMenu), :2201 chevron vs :2215 more_vertMark: visible form of the per-row entry in the name-tap selector
widget tests for each list mode; emulator delete/set-main
no linked (row cites 36 customers 2026-06..08, v10.9.7)
Reuse plan already written in the row.
UX-1
G01
Umbrella 'can't find things'. Structure is unchanged: 5 tabs for ~20 features, with former menu rows behind search.
New UI is hard to navigate / "can't find things"
mediumlib/styles/navigation.dart:167-200; Apple review 2026-08-09FEATURE-17 tab-allocation decision
reach metrics per route after change
2 customers; latest 2026-08-09
No own fix. Follows FEATURE-17/FEATURE-12.
UX-12
G01
Group record for navigation slots. Blocked on the tab-allocation decision.
NAVIGATION ARCHITECTURE
mediumlib/styles/navigation.dart:167-200Mark: navigation-slot decision (FEATURE-17)
reach metrics
no linked reports (group: 183 support customers)
Group hub. No work of its own.
UX-16
G01
Chart wheel interpretations are tap-only with no hint. The only tap hint in the app is on astrocartography.
The Chart screen's interpretations are tap-only and nothing says so — two users, one a 158-chart paying subscr
easygrep tap-hint in chart_screen = 0; positive control astrocartography_screen.dart:706 'Tap a line to see cities'Mark: hint wording and placement (Mark wants UI calls left to him)
widget test of hint; device
3 customers; latest 2026-09-05 v10.9.8
Return interpretations were truly absent until 2026-09-05 (ISSUE-70).
UX-4
G01
Theme toggle works, but sits in the Profile Appearance panel and again in Settings, with no quick toggle. Search has no 'dark'/'theme' term.
Theme switching (dark ↔ light) confusing/stuck
easylib/views/profile_screen.dart:688-696; settings.dart:300-304; wayfinding_index.dart:177 lacks theme/dark termsMark: quick-toggle placement, and whether to add theme words to search
widget test; device theme switch
4 customers; latest 2026-09-22 v10.9.7
Not a bug. No report since search shipped.
FEATURE-13
G02
2 of 4 entrances keep their intent (LIVE). /intro ignores its query (main.dart:647), so the website's ?tool= is dropped. Shared links restore the tab, not an answer.
Preserve entry intent
mediumlib/main.dart:647 UserWizardScreen() ignores query; grep 'tool' in lib = 0Mark: where each ?tool= value should land after onboarding
unit test of query to destination; emulator deep link
1 customer; 2026-07-09
Overlaps FEATURE-68.
FEATURE-68
G02
Website still sends ?tool= and /intro drops it. No app-side attribution of web arrivals.
Website → app handoff — the only audience that already exists
mediumlib/main.dart:647 (query unused); astromatrix-public tools-static.ts emits ?tool= linksMark: tool-to-destination mapping; analytics owner for attribution (GA4/infra)
deep-link test; GA4 read-back
1 customer; 2026-10-14 v11.1.6
Attribution part is infra/analytics.
ISSUE-165
G02
Affiliate/ad users still land on /store after onboarding. This was widened deliberately on 2026-10-06 to cover paid_campaign codes.
Affiliate-acquired users are sent to the price list before they ever see a chart
easylib/views/user_wizard_screen.dart:358-378 (goAndReplace '/store')Mark: should code-bearing users land on Daily (offer surfaced later) or on /store? Payments/attribution owner to confirm.
unit test of routing; affiliate conversion metric
no linked reports
Node /a web path also lands on StoreScreen by design.
ISSUE-428
G04
3 account pairs hold charts of two different people; 79k multi-account device uuids have no winner rule. Needs Mark's decision before any move.
THREE customers' charts were merged into one account: 133 of one customer's and 19 of another's sat under a third account.
hard
node
nodejs _verify.js 2026-10-14 FAIL: 3 two-person pairs unresolved; latest linked report 2026-10-15 on 11.1.7Decision: per-pair resolution for the 3 pairs (and 8 ambiguous pairs), and the winner rule for shared device uuids
Read pairs after each decided move
188 linked customer(s); latest 2026-10-15 on 11.1.7
188 linked customers is a broad meaning-match; only named pairs are confirmed.
ISSUE-152
G05
Stripe dedupe and revenue bucketing are done; both full_purchase and full_purchase2025 are still live in Play and App Store, and the reprice hasn't happened.
Repricing the lifetime SKU breaks two things that look fine — /payments/get will serve two lifetime prices at
easy
payments
nodejs _verify.js 2026-10-14 FAIL: Android+Apple each have two full-price lifetime SKUs; origin/master routes/payments.js:2213 dedupe presentDecision: retire legacy full_purchase in store consoles (or accept both), and timing of the $79.99 reprice
Store console check; _verify ISSUE-152
no linked reports
Code side done; remaining is store-console/product action.
ISSUE-163
G05
Copy now quotes the real limits; open question is positioning — the binding 2-person cap is passed by registering, not paying.
The paywall advertises the gate that never binds; the one that binds is free to pass
easylib/widgets/gated_content_widget.dart:900-911 (correct per-registration copy, 94848a3d + 1b65a6cf LIVE)Decision: whether paywall should lead with the people cap and whether the unregistered 2-person cap stays a register-wall
n/a
no linked reports
Row itself says not a defect; no linked reports.
ISSUE-226
G05
Web checkout dedupe done (2ffd6bae); native stores still offer several SKUs per term (Android monthly x5, yearly x3, Apple monthly x4).
Web checkout offers legacy and 2025 SKUs side by side — yearly at $14.95 next to $39.99, lifetime at $29.95 ne
easy
payments
nodejs _verify.js 2026-10-14 FAIL: 4 platform/term pairs offer more than one SKU; origin/master routes/payments.js:2243Decision: which legacy store SKUs to retire/hide (grandfathered renewals?)
_verify ISSUE-226; store console
1 linked customer(s); latest 2026-09-23 (version unknown)
Overlaps ISSUE-152.
ISSUE-260
G05
Store _buildWhyBlock still lists 'Every chart type…' and 'Written in your language…' (store.dart:961-962), which are free features; spec still carries them.
The two paywall bullets ISSUE-147 removed are back on the store screen, because the positioning SPEC still con
easy
content
lib/views/store.dart:961-962Decision: keep as competitive positioning or remove (and update spec)
Widget check of store screen
no linked reports
Row status is already 'decision'.
ISSUE-203
G06
Component copy fixed and live; reports are copyable for paid readers (bbb9b895), which conflicts with Mark's 2026-09-23 'reports not copyable' ruling.
Copy/select text reported broken by 4 users — SelectionArea is present, so this is release reach, not code
easylib/views/report_screen.dart:615-640 (paid-only SelectionArea, bbb9b895 LIVE); components at lib/widgets/component_summary.dart:1183,3069,3154Decision: keep premium-gated report copy (bbb9b895) or remove it per 2026-09-23 ruling
Long-press component (copy) and report (free/paid)
8 linked customer(s); latest 2026-08-24 on 10.9.7
All linked reports predate the fix (latest 2026-08-24, 10.9.7).
ISSUE-463
G06
Aspect names were never renamed; an added one-word 'Action' gloss box (Trine->Flows, Square->Challenges) reads to practitioners as a rename.
Aspect names were renamed and a multi-year practitioner rejects the new wording — establish what changed, and
easylib/widgets/component_summary.dart:2415-2425 renders 'Action' box from AstroHelper.getAspectAction (lib/utils/astro_helper.dart:1305-1322); [customer] 2026-07-03Mark: keep, relabel, or hide the 'Action' gloss box on aspect detail views
widget test that the Action box is absent/relabelled; visual check on one aspect component
1 linked customers, latest 2026-07-03 on unknown version
Archaeology done 2026-09-26: no rename in Node, content or Flutter; only the additive gloss (ab3d13ce/77d6132e).
ISSUE-564
G06
No-time charts still present a noon-cast Ascendant/houses as fact; new saves store a real 12:00 so the unknown-time marker is lost.
no birth time means no Ascendant and an uncertain Moon — the app shows both as fact
mediumlib/services/user_form_controller.dart:159-165 (f2b08c56 LIVE) stores 12:00 with noTime=false; 94,591 live no-time charts (2026-10-04)Mark: is the 2026-10-07 noon-default the final treatment, or suppress/flag Ascendant+houses at calc level (Node/engine) for no-time charts?
If suppression chosen: engine/Node contract test + chart/matrix/report device checks
no linked reports
Mark ruled out downstream per-surface gating (2026-10-04); any change is calc-level, so Node dependency.
ISSUE-734
G06
Large OS text scale truncates bottom-bar labels, Matrix sub-tabs, Profection glyph and Daily meta line; reviewer rejected a global cap.
Device text size passes through unclamped when the in-app text slider is at its default, so the new UI renders
mediumlib/main.dart:1752 returns before clamp at slider default; emulator API 34 at 1.3x/2.0x (2026-10-16)Mark: choose how each truncating spot gives (wrap, shrink, icon-only) per the list on the row
Golden/widget tests at textScaler 1.3 and 2.0; emulator adb font_scale
no linked reports
8 customers per filing; decision is per-spot layout, not a cap.
FEATURE-561
G07
R4 context label unmet: Mark reverted b34b7c97 (53a0c225), so panels read 'Active Aspects'; R1-R3,R5 live.
Point Current Planets and Solar/Lunar Return at the new Active content class — they read sky-to-natal and nata
easygit 53a0c225 LIVE revert; FEATURE AUDIT 2026-10-16 PARTIAL 4/5Mark: confirm the revert retired the context label (close R4) or want a label
If label wanted: widget test of panel heading per chart type
no linked reports
Register never recorded the revert; likely closable on Mark confirmation.
ISSUE-639
G07
Wheel deliberately skips every aspect line to Ascendant and MC; grid side fixed by da652e24.
Aspect lines to Ascendant/MC missing on Natal Chart
easyapp_assets/Shapes.1.8.js:736-742 skips NatalPlanetInt/TransitPlanetInt 11 and 12 (since 2025-12 9.8.0)Mark: draw aspect lines to ASC/MC on the wheel (always / via angle toggle) or keep excluded
test/wheel_angle_labels_test.dart-style JS extraction test; device wheel check
2 linked customers, latest 2026-09-21 on 11.1.3
Prior note conflated the grid fix with this wheel exclusion.
ISSUE-511
G08
Daily tarot tile by design shows a static tarot icon plus number and name; reporter expects the drawn card art and text.
Daily tarot card shows the same image for every card and no interpretation text, only the card number -- new U
easylib/widgets/daily_tile/tarot_card_tile.dart:21-31 (trailingIconKey 'tarot', mainValue tarotNumber, subtitle only if tarot non-null); unchanged since 8ccaccbdMark: should the Daily tarot tile show the card's artwork, or stay a summary tile? (also check Tarot field null on her account)
Widget test of tile with/without tarot name; Android device
1 linked customers, latest 2026-10-01 on 11.1.5
Missing name subtitle would mean server LifePath.Tarot is null.
ISSUE-392
G09
Refused direct edits now show failure (ea6c1c1f, unpushed). A queued edit later refused by the server still renders as saved forever (JournalOutbox.merge applies rejected ops).
Renaming a tarot reading or saving a note never reaches the server -- the call goes to the legacy host on a No
mediumtest/rejected_edit_still_rendered_test.dart (5ea6ac03, unpushed) proves it; lib/services/journal_outbox.dart:367-404 merge applies every queued editMark must push ea6c1c1f/5ea6ac03 (RB-1)
Flip rejected_edit_still_rendered_test once decided; device check refused edit after reload
no linked reports
Decision: show a queued edit the server later refuses as saved, revert it, or mark it not saved? (Offline banner was removed deliberately.)
ISSUE-136
G11
Report button still hidden for relationship Summary + 'all aspects' (matrix.dart:1369-1371); size logging (310124cc) live to settle whether gate is needed.
Relationship "Summary + All Aspects" report is gated as an oversized payload, but no limit on that code path m
easylib/views/matrix.dart:1369-1371 gate present in HEAD and liveRead the size measurements logged since 11.1.7
Widget test for button visibility; generate relationship all-aspects report on device
no linked reports
Decision: remove the gate and show Full Report, or keep it hidden and explain why? Size logs say whether the payload risk is real.
FEATURE-683
G12
No German: 'de' absent from supported languages; server would translate on demand.
German localization of the app and generated interpretation text
mediumaudit 2026-10-16: de not in kSupportedLanguages; 4 linked German requests (latest 2026-09-22)UI string table for de; ISSUE-541/549 table load cost
Device: select German, UI + report content in German
4 linked customers, latest 2026-09-22, version 10.9.8
Decision: add German as an app language? The row's 'second reporter' condition is already met by 4 linked requests.
ISSUE-582
G13
6,216 component rows point at image folders that do not exist on the host. No repair is possible without new artwork or clearing the field.
6,224 component rows point at image folders that do not exist on the host, and no repair can fix them -- they
easyRow measurement: 6,226 of 86,021 images 404; Flutter component_summary.dart:1160 already hides failed images (errorWidget -> SizedBox.shrink)Content owner
Re-run 404 census after action
1 customer, latest 2026-09-30 ('pictures show as ?'; the ? is a webview/legacy broken-image glyph, not Flutter)
Decision: commission artwork for the missing folders, or clear Image on those rows.
FEATURE-49
G14
App Open on foreground-resume is live. The cold-start trigger (deferred behind ISSUE-228) and three 'cheaper placements' are unbuilt.
App Open ads — the only ad slot that cannot interrupt reading — Mark, 2026-09-16
mediumFeature audit 2026-10-16: R1/R3 live (ads_shown_total{ad_type=app_open} 11.1.5-11.1.7); R2/R4 NOT_IMPLEMENTEDISSUE-228 startup work
Metric ads_shown_total by ad_type; device cold start
1 customer, latest 2026-06-14
Decision: whether to add cold-start App Open and the interstitial placements (they trade against the 'interrupts reading' complaint).
ISSUE-214
G14
Old-UI exclusion fixed live. Prompt still fires at account session 3 after 1 minute, with no support-thread suppression; that timing rule is unsigned.
The review prompt only counts sessions for NEW-UI users, and fires at session 3 — we ask exactly the cohort th
easylib/services/app_review_service.dart:61 _sessionsBeforePrompt=3, :72 _delayBeforePrompt=1min; main.dart:456 increments unconditionally (fact 1 fixed, 53cdb78d/aea790f3 LIVE)Same decision as ISSUE-292
Unit test on shouldShowReviewPrompt; review_dialog_shown_total / rate_now funnel
1 customer, latest 2026-10-05 v11.1.5
Decision: when to ask (session threshold, after a positive moment, and suppress with an open support thread?).
ISSUE-732
G15
Support chat has no image or file attachment. The compose row is TextField plus Send only, and no picker package is installed.
Support chat cannot attach a screenshot or image - 27 customers tried to send receipts or bug screenshots and
mediumlib/views/message_detail_screen.dart:463-498; pubspec.yaml has no image_picker/file_pickerNode upload endpoint; native picker permissions
n/a until decided
row-level 0; detail: 27 customers 2026-06-22..10-11, latest 11.1.6
Decision: add attachments (picker + Node upload) or keep routing screenshots to email. Reviewer deferred it.
FEATURE-21
G16
17a and 17b are built and live. Only 17c's explicit two-option first-open prompt is missing; FEATURE-15's single insight covers most of it.
Dropout fixes — three specified, none built
easyFeature audit: R1/R2 COMPLETE live, R3 PARTIAL; 0e828096 LIVEnone
n/a
no linked reports
Decision: is FEATURE-15's card enough for 17c, or add the 'Yes, show me / explore' prompt? Title is stale.
FEATURE-56
G16
Not built: unregistered purchasers (14,546 device-anchored entitled accounts) are never prompted to register on app open.
Unregistered PURCHASERS are never asked to register — 14,546 entitled accounts (37.18%) are device-anchored wi
mediumnone: feature not built; audit 0/3Node/entitlement read for 'entitled AND no email'; Mark's cadence call
n/a until spec signed
1 customer, latest 2026-09-23 v11.1.3
Decision: prompt cadence beyond first opens and copy; then Track 2 (payments/node) build.
ISSUE-10
G16
24,294 profiles sit at 0,0, up from 18,985. The guarded repair (_fix_zero_coords --write for 423) and outreach await approval.
Silent birth-location 0,0 bug — 18,985 live profiles (1.57%) compute charts from coordinates in the Atlantic
medium_verify 2026-10-15: 24,294 profiles at lat 0 lng 0ISSUE-371/518 Flutter fixes reaching clients (growth source)
Re-run _verify after repair; new-row rate from 11.1.7 clients
no linked reports
Decision: approve the 423-row write and outreach sequencing (Mark's call per nextAction).
ISSUE-167
G16
Premise is stale: the facet step is hidden. Question left: add a knowledge-level step that branches beginners to /matrix?
Onboarding asks what you want to see, not what you already know
mediumnone: user_wizard_screen.dart:98 _kShowFacetStep=false; intro lands on /chartdailyProduct decision; behavioural tiers memo (no session-count gating)
n/a
no linked reports
Decision: self-reported level step vs behavioural classification.
ISSUE-555
G16
Timezone picker labels mislead (no Portugal cue; +2 labelled EET/CEST; -180 and -240 both 'BRZ2 / ADT'). Classic-UI freeze is unconfirmed.
The manual timezone-offset picker has no Portugal entry and mislabels the correct +2 offset as 'EET' -- a cust
easylib/constants/astrology_constants.dart:170,173,175,184 labels; confirm_user_dialog.dart:209 uses themFreeze half needs async repro (confirm_user_dialog.dart:87-96)
Widget test of dropdown labels; device repro of freeze
1 customer, latest 2026-08-20 v10.9.7
Decision: offset-only labels vs country/era entries. -240 duplicate label is a plain typo.
ISSUE-596
G18
Node now accepts a password or an erasure record when no charts exist. The Flutter delete flow never sends a password and fails locally when the main chart is gone.
Self-service account deletion 404s forever once a user has already deleted all their own charts -- GDPR erasur
mediumuser_service.dart:1180 getUserById(fid) returns 'Failed to retrieve user profile' if the chart is deleted; :4225-4237 payload has no password; Node user.js:1772 returns 403 'Send the account password' (8fc50891 origin)Decision: approve adding a password field to the delete-account confirm dialog, used when no chart exists or on that 403
Widget test: no-chart path sends password; emulator: delete an account after deleting all charts
6 linked customers; latest 2026-09-08 support 10.9.9
Mark should specify the dialog wording. Anonymous app- accounts have no password; the support erasure ledger covers them.
ISSUE-650
G19
856 quarantined journals have no owner, method or date for re-attaching them.
856 journal entries will be quarantined by the collision repair and nothing owns re-attaching them — invisible
medium
node
Node services/journalAmbiguity.js quarantine; measured 856 rows (10-10)Decision: who owns re-attachment, and whether to use legacy Fid attribution for 189 and keep the rest quarantined
Node script dry run + count
no linked reports
Nothing is broken; this is an open loop by design.
ISSUE-281
G20
Native GPU/Impeller SIGSEGVs remain. The only lever, EnableImpeller=false, works but is deprecated and only buys time.
Native GPU/Impeller SIGSEGV is the app's largest crash family — 332 reports / 263 users (23.17% of crash-affec
hard
native-android
AndroidManifest.xml:187 EnableImpeller=true; device test 2026-10-06; 350fdd25 (LIVE) moved the headless WebView off the GPUDecision: ship the Impeller opt-out as a holding action (staged rollout) or wait for an upstream fix; real Adreno/PowerVR devices needed
Play crash clusters per build after a staged rollout; emulator cannot reproduce
no linked reports
Measure on 300100098 first, since 350fdd25 may have cut part of this.
No work: legacy deprecated (6)
RowActual remaining problemDifficultyEvidence it still existsDependencies · testingCustomers · notes
ISSUE-12
G03
Original anomaly (completes > starts on dev.astromatrix.org) unexplained; caller code lives in the legacy web bundle, not either repo.
Legacy webview signup funnel broken
medium
legacy-web
nodejs scripts/_verify.js:4116 FAIL 0/1 and 0/3 (2026-10-14) — but check is done>0, not the inversion; inversion not seen since 2026-09 (5/12, 13/19 PASS)Legacy web bundle source access; signup_metric_trace collection
Read signup_metric_trace by referer over 30d; fix verifier to test the inversion
1 linked customer(s); latest 2026-10-12 on 11.1.6
Legacy is deprecated (Mark 2026-10-17): no legacy-side work. Today's FAIL is n=1-3 drop-off, not the filed symptom; verifier condition mis-specified.
ISSUE-211
G03
Retro web LifePathCtrl.js:42 calls GetLifePathDaily with undefined birth/transit date; :50 dereferences Tarot unguarded.
Retro web daily life-path / daily tarot card fails for 134 users — GetLifePathDaily called with a bad or missi
easy
legacy-web
errors collection: 159 failures/134 users 2026-08-14..09-13 (last measured 2026-09-13; not re-measured)Retro web bundle source + deploy
Re-count errors msg for GetLifePathDaily over last 14d; retro web manual test
no linked reports
Legacy is deprecated (Mark 2026-10-17): no legacy-side work. Not Flutter. Retro bundle not present under ~/src; owner of legacy web needed.
ISSUE-334
G08
[BOOTSTRAP FAILED] WebView startup failure ~12 users/day; emitter not in Flutter or Node source.
[BOOTSTRAP FAILED] hits ~12 users a day, 365 all time, across iOS 16-18 and Android 10-16 — invisible to every
medium
legacy-web
grep '[BOOTSTRAP FAILED]' in lib/web/ios/android = 0 (grep proven on 'drawChart function not found' in chart_renderer_mobile.dart); only Node _verify/_watchdog read itLocate emitter in legacy web bundle loaded by WebView
_verify.js ISSUE-334 count
2 linked customers, latest 2026-09-24 on unknown version
Legacy is deprecated (Mark 2026-10-17): no legacy-side work. UA in message fragments signature; aggregation fix is Node-side.
ISSUE-431
G08
Doubled query params reach legacy OOB/VoC endpoints, but Flutter builders emit them once and in a different order.
Every query parameter after the first is sent twice to the legacy calc API, breaking the Moon out-of-bounds an
medium
legacy-web
lib/services/oob_service.dart:81-114 appends planet LAST, logged URLs have planet FIRST; voc_service.dart:74-87 cleanIdentify the classic/legacy web caller emitting these URLs
Error-log URL shape by source after fix
no linked reports
Legacy is deprecated (Mark 2026-10-17): no legacy-side work. Flutter likely not the source; logged URL order contradicts Flutter builders.
ISSUE-665
G13
The legacy GetComponentItem does an exact match with no sign+house fallback, so combined placements apologise. This is root cause for ISSUE-614.
Legacy: the description lookup is an exact match with no sign+house fallback, so every combined placement apol
medium
legacy-web
astromatrix legacy AstroUtilities.cs:6676 exact-match lookup (per row; read-only repo)Legacy owner; legacy being sunset
Regenerate a full-native report; count apologies
no linked reports
Legacy is deprecated (Mark 2026-10-17): no legacy-side work. Not Flutter. Fix in sunset code, or bypass it via the ISSUE-614 Flutter fallback.
ISSUE-573
G16
1,707 main charts carry 1 Feb 1980 12:00. The default is in the legacy web form, not Flutter.
1,707 accounts have the form's default birth date (1 Feb 1980, 12:00 PM) as their main chart
easy
legacy-web
astromatrix/Website/Scripts/controllers.js:1023-1027 (day '1', month '1' 0-indexed=Feb, 1980, '12:00PM') and :214; Flutter lib 0 hits for 1980 (grep proven on birth_details_section.dart:58 DateTime(2000))Legacy web owner; empty-default approved in principle
Create chart on legacy/retro form without touching date; must refuse
no linked reports
Legacy is deprecated (Mark 2026-10-17): no legacy-side work. Located the likely form owner; Flutter wizard defaults to 2000-01-01, not 1980.
Not a defect (23)
RowActual remaining problemDifficultyEvidence it still existsDependencies · testingCustomers · notes
FEATURE-38
G01
No guided Learn path exists; Guide is an unordered reference grid. This is a feature request, not a defect.
A guided "Learn" path, split from the daily "Apply" path — 1 request, unusually complete (2026-09-11)
hardnone: feature never built; Guide at home_buttons.dart:90product scoping by Mark (parked: no new features during audit)
n/a
2 customers; latest 2026-10-15 v11.1.6 ('I'm overwhelmed')
Duplicate of UX-9. If it is scoped, reuse the existing Guide content.
FEATURE-70
G01
Tri-wheel, Davison, Arabic Lots and celebrity lookup don't exist. Ephemeris exists (Calendars tab) but search can't find it by name.
Two Discord feature-ideas, 2026-09-27 — predate the bot's auto-logging going live
hardlib/utils/wayfinding_index.dart:164 Calendars synonyms lack 'ephemeris'; calendars.dart:53 tab existsfeature scoping (chart math = engine) by Mark
wayfinding_index_test for ephemeris
1 customer; 2026-09-22 v11.1.3 ('can't find the ephemeris')
Split it: the ephemeris search entry is SELF-sized once Mark approves task words. The rest are feature requests. Lunar spread rotation stall is server-side.
FEATURE-89
G01
No search or filter over active transit-to-natal aspects. Listing them already works (Matrix All Transits; Transit chart grid).
Search/view ongoing transit-to-natal aspects, not just ones about to end -- plus a UI complaint that the trans
mediumnone: All Transits list exists (matrix_service.dart:62,91); search is a new featureproduct scoping by Mark
n/a
no linked reports
Feature request from Discord.
UX-11
G01
Diagnosis record: features that turned from destinations into states. All cited features exist and are reachable.
WHY people report live features as "gone"
easynone: Weekly/Monthly/Solar/Lunar in Explore (home_buttons.dart:46-90); search liveactions live in FEATURE-12/17, UX-16
n/a
7 customers (mostly low confidence); latest 2026-10-16 v11.1.6
Analysis row. Keep it as the rationale record, not as work.
UX-3
G01
Umbrella of 'moved, not removed' cases. Every item exists. Solar-return text is still being missed on 11.1.7.
Features that moved or disappeared
easy2026-10-16 v11.1.7 'Why I can't see Solar Return Report?'; Explore tile home_buttons.dart:78-82actionable remainder is UX-16 (tap hint)
n/a
4 customers; latest 2026-10-16 v11.1.7
Route the solar-return remainder to UX-16.
UX-9
G01
No Learn/Apply path. This is a feature request and duplicates FEATURE-38.
Structural: "designed by people who understand astrology, for people who already understand astrology"
hardnone: feature never builtproduct scoping
n/a
1 customer; 2026-09-11 v11.0.0
Merge into FEATURE-38.
ISSUE-121
G05
Product: paying users see no list of premium benefits (store.dart:1025-1040 shows only status); little premium-only content exists.
Paying subscriber cannot identify any benefit of premium beyond ad removal — "what benefits does the subscript
mediumlib/views/store.dart:1024-1061 — _buildWhyBlock only rendered when !_isPaidUserFeature-register prioritisation (FEATURE-6)
n/a
3 linked customer(s); latest 2026-09-10 on 11.0.0
Feature request (moved to feature register 2026-09-21).
ISSUE-168
G05
Nothing: web quarterly median is now $19.99, matching in-app. The verifier fails because it requires >= $20.
Stripe web checkout underprices the quarterly by 25%
easy
node
none: _verify.js 2026-10-14 reports median $19.99 over 41 rows; check at nodejs scripts/_verify.js:3690 is pass: med >= 20Node owner to fix verifier threshold
Re-run verifier after threshold change
no linked reports
Close the row; stage already 'moot'.
ISSUE-632
G06
Tablet synastry/composite stacks charts vertically; side-by-side layout is a feature request, generation works.
Synastry/composite chart UI stacks the two charts vertically on tablet, forcing repeated scrolling -- side-by-
mediumlib/views/chart_screen.dart:1187-1200 (2-column layout only for Signs/Aspects at >=600dp)Mark go-ahead for a tablet layout change
Widget test at tablet width; Lenovo Tab M10 emulator
no linked reports
Single Discord QA tester, LOW priority; design change, not a defect.
UX-13
G06
Layout decided 2026-09-13 to stay; named page nav bar and zoom-lock fix already exist; nothing left but onboarding.
"THE SCROLL"
easynone: lib/views/chart_screen.dart:1335-1343 named nav bar (d08fed17 LIVE); ISSUE-182 zoom lock :1205 (63d500ee LIVE)None
None
2 linked customers, latest 2026-09-22 on 11.1.3
Linked reports 2026-09-22 on 11.1.3 describe a swipe glitch predating 63d500ee.
FEATURE-82
G10
Feature not built: no 'why this facet' explanation, no API exposure of reports.js facet data, no tap on radar.
Facet explanation layer — surface the attribution and correspondences we already store
hardnone: feature request; audit 2026-10-16 PARTIAL 0/4 requirementsNode API exposure first, then Flutter UI
n/a
2 linked customers, latest 2026-10-10, version 11.1.5
Feature work needing Node and UI design. Not a defect.
FEATURE-1
G11
Not built: no button on relationship surface opening tarot with both names as question.
Contextual reading button on the relationship surface
easynone: feature request (audit 2026-10-16 NOT_IMPLEMENTED)Product go-ahead
n/a
no linked reports
Feature request.
FEATURE-9
G11
Relationship transits/verdict/types not built; transits-to-composite needs engine work.
The relationship layer — timed, legible, and not only romantic
hardnone: feature (audit PARTIAL 1/5)Engine technique choice (STRATEGY.md 6.5)
n/a
1 linked customer, latest 2026-09-15, version 11.0.0 (can't find a past screen)
Feature. The linked report is a discoverability question.
ISSUE-501
G14
Built: iOS 11.1.1+ obeys bannerAdsIOS=false. Residual impressions come from older builds, and _revenue.js lacks a named baseline.
iOS Banner ads turned off permanently for UX — ~$73/mo revenue, not a regression if it drops to zero
easynone: 438a1499 in iOS 11.1.7; GA4 iOS banner 115,027 -> 13,727/week from pre-11.1.1 installsnone
GA4 iOS Banner impressions trend
no linked reports
Decision record; only follow-up is an analytics baseline entry (node).
UX-10
G14
Research corpus of Play reviews, not a defect. Its themes are tracked on other rows.
The Play Store review corpus
easynone: analysis artefact (docs/worst-reviews.txt tally)none
n/a
no linked reports
Close or convert to a reference doc; the 'STILL NOT FIXED' sweep note misreads it.
ISSUE-608
G15
Not a bug: the test expected a combined badge, but chat and support badges were split. 65590c69 updated it, and the test passes at HEAD.
Unread-badge count is 11 where the test asserts 9 — the malformed-row test fails, and the aggregation may have
easynone: flutter test test/message_badge_clears_test.dart passes at HEAD (run 2026-10-16); 65590c69 LIVE asserts chat 9 / support 2none
Already run; passes
no linked reports
Cited commits (1dad4fec etc.) are cities tests, mis-attributed. Close.
UX-1b
G15
Support exists and works, but it is hard to find: it sits under a 'Users' panel. Autosupport also gives stale '⋮ menu > Support' directions.
The in-app Support entry point isn't findable
easynodejs routes/auto/reviews-common.js:39,40,56 say '⋮ menu > Support' (menu removed in 0117f360); profile_screen.dart:663-670 has Recover Lost Users + Contact SupportNode copy fix; any relabel needs Mark's UI call
Read autosupport output after copy change
3 customers, latest 2026-10-17
Discoverability. The one real defect is stale autosupport copy (node).
FEATURE-16
G16
Feature not built: no add-a-partner ask inside the first reading.
Ask for the second chart inside the first reading
mediumnone: feature request; audit 0/3Timing rule + Self-Explorer test cohort (product)
n/a
no linked reports
Feature request; needs a spec of placement and timing before build.
FEATURE-47
G16
Feature not built: no register prompt after a guest makes a friend, message, saved chart or journal entry.
Prompt to register when a connection is made, not before — Mark, 2026-09-14
mediumnone: feature request; audit 0/3 (only chart-limit register gate exists)Product copy/cadence; overlaps FEATURE-56
n/a
no linked reports
Feature request.
FEATURE-55
G16
Feature not built: no manual lat/long or timezone override. The server always re-derives the timezone, so an override flag is needed.
Manual latitude, longitude and timezone override on a birth chart — [customer], 2026-09-23
hardnone: feature request; audit 0/3; server resolveTimezone overwritesNode override flag honoured by resolveTimezone and repair scripts
n/a
4 customers (5 distinct), latest 2026-09-23 v11.1.3
Feature request with Node dependency; overlaps ISSUE-555.
FEATURE-88
G19
The decan reference (R1) is live in 11.1.7. Logging per-decan insights (R2) was not built on purpose and waits on the ISSUE-391 tarot-journal cut-over.
Decan Walk Tarot card: let user pick/reference the card per decan instead of random, log insights to tarot jou
mediumnone: f1ce8f80/78ebce90 LIVE; feature audit 36/36 decans correctISSUE-391
Android device check of the 'All 36 Decans' link
no linked reports
Feature request; R2 is blocked by a dependency, not a defect.
ISSUE-505
G19
An ambient tarot pattern panel: the Node endpoint is deployed, but no client surface exists. Product direction, not a defect.
Ambient pattern/context surfaces on journal tabs (tarot, reports) instead of a 'do AI' button — ties into FEAT
hardnone: feature audit BACKEND_ONLY; GET /journals/tarot/patterns live, no Flutter callerMark's UI spec; FEATURE-63; ISSUE-391
n/a until specified
no linked reports
Feature request; needs Mark to spell out the UI (AI UI calls have been poor).
ISSUE-396
G20
Nothing open. A one-time crash pull whose two follow-ups (ISSUE-399 okhttp, ISSUE-281 renderer) are fixed or tracked elsewhere.
Play crash clusters pulled for the first time: the register was already right, GPU driver SIGSEGV is the large
easynone: 531db01d LIVE (build.gradle:146 okhttp 4.9.1); ISSUE-281 owns the GPU familynone
n/a
no linked reports
Measurement record; close.

Release state these assignments depend on