← AstroMatrix Reports — all pages 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 ISSUE-484/673 (the synastry race) are already fixed in the live build by 26c9ed66. Verify only; no specialist needed. ISSUE-7/503, ISSUE-371/518, ISSUE-404/499/468: the fixes are live. What remains is measurement on 11.1.7 or a device check. Each goes to Track 2 only if the evidence shows a problem remaining. ISSUE-491 is not reproducible: every "Account" label opens the Account screen. The likely confusion is the Users ⋮ sheet, which is titled "Account". ISSUE-731 and ISSUE-734 wait on a UI decision (the form of the selector entry; how each truncating spot should give way). After that they're mechanical Track 1 work. ISSUE-688, ISSUE-420, ISSUE-392 and ISSUE-696 are already done in code (unpushed commits). They sit in the verification queue. ISSUE-392 also carries the open decision on rejected queued edits. FEATURE-14 isn't client work: Mark approved a server-side English fallback on ISSUE-729. Legacy is deprecated (Mark, 2026-10-17). ISSUE-573 (the 1980 date default lives in the legacy web form), ISSUE-12, ISSUE-211, ISSUE-334, ISSUE-431 and ISSUE-665 get no work and leave Track 2. ISSUE-359 and ISSUE-36 keep only their Node-side guard. ISSUE-108 stays: it moves data off legacy before the SQL sunset. Prioritised above UI work (reviewer): payment entitlement integrity as one coordinated investigation (ISSUE-201, 552, 697, 700), and the ISSUE-108 tarot migration, with about 70,532 profiles not yet migrated. ISSUE-385 stays Track 2, with a lead found in the code: Android widget location isn't mirrored on restore. 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 existslib/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]Wherelib/views/message_detail_screen.dart:550 (or wrap message list at :440)ReuseSelectionArea as used in lib/widgets/component_summary.dart:1183TestWidget test: long-press support bubble shows selection; Android device checkDoned69e9c99, local, not pushed. Emulator: long-press on a support reply shows Copy / Share / Select all.Risk · difficultylow · easyCustomers9 linked customer(s); latest 2026-10-13 on 11.1.6NoteBundle 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 existslib/views/message_detail_screen.dart:479-480 maxLines:null + TextInputAction.send; :550 bubble is plain Text; customer reports 2026-10-13/14 v11.1.6Wherelib/views/message_detail_screen.dart:467-482 (minLines 1, maxLines ~5, newline action), :550 (SelectableText/SelectionArea)ReuseSelectableText as used in lib/views/report_screen.dart; send IconButton :490 staysTestWidget test: long text stays bounded and scrolls; Return inserts newline; bubble text selectable. Android+iOS keyboard checkDoned69e9c99, 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 · difficultylow · easyCustomersrow-level 0; detail: 15 customers, latest 2026-10-14 v11.1.6NoteOnly 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 existslib/views/message_detail_screen.dart:285-288 _handleOptionTap sends unguarded; :561-573 ActionChip always enabled; _verify 2026-10-15: 5 repeated pairs/7dWherelib/views/message_detail_screen.dart:251-288, 561-573ReusesetState in _MessageDetailScreenState; disable chips once one option of that message is sent; Node collapseRepeatedMenuTaps already merges repeatsTestWidget test: tapping a chip twice sends once and chips disable; then _verify --only=331 on new buildDone269a0704, 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 · difficultylow · easyCustomersno row-level reports; group G15 record: 58 customersNoteNo 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 existslib/services/chart_service.dart:836-837 and :881-882 default case; [customer] 2026-10-11 11.1.5 (LR Asc shown under 'Birth')Wherelib/services/chart_service.dart:814-890 (getChartTitles / getChartTitlesWithUsers)Reuseexisting per-ChartType switch in getChartTitlesTestUnit test getChartTitles(lunarReturn/solarReturn); device check Lunar Return screenDone7faf3530, 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 · difficultylow · easyCustomers3 linked customers, latest 2026-10-11 on 11.1.5NoteAscendant 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 existsflip_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-15Wherelib/widgets/tarot/flip_tarot_card_widget.dart:84 (wrap in Semantics button + label with name/position/theme, or face-down hint)ReuseSemantics usage in lib/widgets/premium_upgrade_button.dartTestWidget test with find.bySemanticsLabel; VoiceOver on an iOS deviceDone87a229cd, 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 · difficultylow · easyCustomers1 linked customer; latest 2026-10-15 support (version unknown)NoteThe '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 | Row | Actual remaining problem | Difficulty | Evidence it still exists | Dependencies · testing | Customers · 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,2907 | Payments 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.5 | Apple 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.5 | Store-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 = 0 | Node 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 30d | Autosupport 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.6 | Approved 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.6 | Node 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.7 | Reporter 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.6 | Support/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 pairs | Node 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.5 | Node 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 one | Node 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 recorded | Node/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 param | Node 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 rows | ISSUE-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:316 | Node + 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 findComponent | Node; 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 LIVE | Node; 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 replies | Timing 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.5 | Node 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- uids | Support 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-14 | ISSUE-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 slowStartRateMetricSet | 11.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 support | Her 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 handling | Real 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 reporter | Reporter 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-506 | Engine 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.6 | Reporter'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-1964 | Her 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-22 | Legacy 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 populating | Merge 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_URL | astromatrix-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-471 | Mark: 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-05 | Ties 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-tap | Node 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 cache | None 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 history | Content 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-only | ISSUE-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% en | ISSUE-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-11 | Legacy 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 ago | Infra/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 404 | Store 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) | Row | Actual remaining problem | Difficulty | Evidence it still exists | Dependencies · testing | Customers · 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 | easy | none: 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 | easy | 2026-10-15 support v11.1.6 'where is weekly horoscope' (after tile shipped); no >=11.1.7 report yet | none 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 | easy | none: 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; | easy | none: component_summary.dart:378-382,1097 passes facet layout; journal_prompt_card.dart:116-121 documents default | none 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 | easy | none: current_location.dart:300 states it applies to all profiles | none 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- | easy | none: lib/views/matrix.dart:553 setUser2(..., persist:false); :527,:539,:580 mounted guards | none 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 | easy | none for this row: report_service.dart:482-500; tarot deeplink generic at :671 | none 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 | easy | none 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 | easy | none: lib/views/login.dart:677-688; forgot_password.dart:136 | none 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 | easy | none: 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 | easy | none: 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) | easy | none: 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=deployed | None 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?" | easy | none: 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-550 | Legacy 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->0 | Payments 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/ | easy | none: 1823371b LIVE per 3423e5a2 (lib/services/user_form_controller.dart, user_service.dart); NOT in d89c1fc1, so iOS 11.1.7 may lack it | Confirm 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-635 | None 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 LIVE | None 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) | easy | none: 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 tests | Build 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 LIVE | Content 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 | easy | none: 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 | easy | none: lib/utils/astro_helper.dart:1450 names index 10 'True Node'; d1060f1c LIVE | None 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 | easy | none: lib/widgets/chart/chart_widgets.dart:624-664 minWidth; 3469348f + tests 0bb6ba8f/57fc4d62 LIVE | ISSUE-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 | easy | none: lib/widgets/chart/chart_widgets.dart:644-664; 7ae83884 + c81c66b3 LIVE | Same 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 | easy | none: 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 LIVE | Find 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 | easy | none: da907f19 LIVE (11.1.7); app_assets/Shapes.1.8.js:85 angleSitsOnCusp, used :522-532; test/wheel_angle_labels_test.dart | Reporter 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 | easy | none: f7146db1 and da652e24 LIVE; chart_service.dart:510-548 | Reporter 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 | easy | none: c476fba5 and 87c381a8 LIVE; lib/core/chart_constraints.dart AspectClass | Reporter 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 | easy | none: 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 | easy | none 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 | easy | none for row: 1de9a354, c476fba5 LIVE; chart_service.dart:719-726 notes the asteroid gap needs a product decision | Reporter 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) | easy | none: c476fba5 LIVE | Reporter ([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 | easy | none: bc8a39ec LIVE since 11.1.5; test/aspect_applying_sign_test.dart | None 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 | easy | none: 2b6badf9, 7abac129 LIVE; astrocartography_service.dart:623 nullable GAST, astrocartography_screen.dart:191-399 | acg 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 | easy | none: 95de78bc LIVE (ISSUE-638); report 2026-09-28 on 11.1.4 | Reporter ([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 | easy | none 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 | easy | none: ba89a152 LIVE | errors 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 | easy | none: 95de78bc LIVE; test/pattern_chart_data_test.dart | Reporter 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 | medium | none 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 territory | Correct _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 | easy | none: 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 | easy | none: fix c5d77090 is an ancestor of 3423e5a2 (live); lib/services/journal_service.dart:644 | Remaining 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 | easy | none: 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 | easy | none for repairable rows: data rewritten in prod DB 2026-10-05; corrupt keys remain by design pending key cleanup | Node 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 | easy | git grep at 3423e5a2: lib/views/matrix.dart:3190 still throws 'No items found...'; HEAD matrix.dart:3189 has the fix | Release 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 | easy | none: server restore confirmed 2026-10-12; 15 customers told; no reports after 2026-10-12 linked | ISSUE-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 | easy | c72fa47b not ancestor of 3423e5a2; Node twin 41adab11 on origin/master (deployed); lib/core/astro_api_service.dart:88, horoscope_service.dart:1698 | Release 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 | easy | none in HEAD: lib/services/matrix_service.dart:683; dd78087a only on local new-ui | Mark 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 | easy | none for coverage: rows written to prod DB 2026-10-12; quality of 27.5% NeedsCleanup rows unreviewed | Node 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 | easy | none: c6c85d8c, 8e549c5d ancestors of 3423e5a2; latest report 2026-09-14 on 11.0.0 predates fix | none 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 | easy | none 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 | easy | none: 26c9ed66 ancestor of 3423e5a2; register's 'needs investigation' predates reading this commit | none 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 | easy | none: same mechanism fixed at lib/views/chart_screen.dart:710-865 | ISSUE-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 | easy | none: all 11 cited commits ancestors of 3423e5a2; latest report 2026-10-07 on 11.1.3 | none 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 | easy | none: b807bc22 ancestor of 3423e5a2; side-effect regression is ISSUE-729 | ISSUE-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 | easy | none: aae9791c is an ancestor of nodejs origin/master (auto-deploys); Flutter save-path twin 7e5c0ac5 is LIVE in 11.1.7 | ISSUE-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 | easy | none: 7e5c0ac5 is LIVE (ancestor of 3423e5a2); astrocartography_screen.dart:1154 uses genResult.report ?? asString | none 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 | easy | none: 1f54a20d/e28a9946 deployed; history 2026-10-11 'DEPLOY VERIFICATION OK' on consecutive deploys | Mark: 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 | easy | none: aefc22c5 LIVE; ads_service.dart:817-838 coerces number/string, :856-872 reads flat tiers | none 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 | easy | none 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 | easy | none: ce093219 LIVE (toolkit gated on holder uid); quickReplies 'Review' text = the echoed template (message_service.dart:54); node 6a57fca4 deployed | none 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 | easy | none: 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 | easy | none: nodejs 4a0baee3 'a tap burst is one event (ISSUE-637)' is on origin/master | none 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 | easy | none: 686bd518/b987c7ea/797d1c9f LIVE in 11.1.7; audit 5/5 requirements | Firebase 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 | easy | none: 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 | easy | none: 12 Flutter commits LIVE (e.g. payload_service.dart:251); nodejs e3e7b9e6 not on origin/master | Push 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 | easy | none: 571b8d2b LIVE; location_service.dart:458, astro_api_service.dart:145,201 | none 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) | easy | none: 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/095 | Play 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 | easy | none: 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 LIVE | none 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 | medium | support 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 LIVE | 11.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, | easy | none: Node 32e91d1b/acc7ad6b/717234ae on origin/master (auto-deployed); services/recoveryIdentity.js:45 treats 'anonymous' as WEAK | none 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 | easy | none: Node 9182fe4b, 8709df8a, b3d6a149 on origin/master | none 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 | easy | none: 5c04e1c2 LIVE; Prompts tab first in journal.dart:22 (2f6a186a LIVE); endpoint answers 200 | FEATURE-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 | easy | none: 92039341 + 4d9bcae9 LIVE | none 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 | easy | none: 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:458 | ISSUE-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 | easy | none: 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 | easy | none: 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 | easy | none: 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 | easy | none: 3423e5a2 + 29722424 LIVE | none 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 | easy | none: build.gradle ndk debugSymbolLevel FULL (29722424 LIVE); 350fdd25 LIVE | none 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 | easy | none: 7d0ab133 LIVE pins the dpi; no reports after 300100088 | none 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 | easy | none: 2001a1e1 LIVE; errors 10-03: 450 users Initialization timeout | none 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 | easy | none: 03980098 LIVE; Play 09-29..10-11 TIME_SET/BOOT 0 users on 096 | none 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 | medium | Play vitals 2026-10-13: warm 29.77% on 300100096; bcfd3adf/ce4c8db9 LIVE | none 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 | easy | none: Play TIME_SET/BOOT_COMPLETED/TIMEZONE_CHANGED 0 users on 096; ce4c8db9/60d22c7f LIVE | Mark: 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) | Row | Actual remaining problem | Difficulty | Evidence it still exists | Dependencies · testing | Customers · 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 | medium | lib/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 | easy | lib/styles/navigation.dart:167-200 | Mark: 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 | easy | ios/MoonWidget, ios/SabianWidget, ios/PlanetaryHours exist; grep getLang 'widget' mentions in lib = 0 | Mark: 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 | medium | lib/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 | easy | lib/widgets/home_buttons.dart:192-196 (label 'Reflections'); wayfinding_index.dart:153 | Mark: 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 | medium | grep -i rarity lib = 0 (positive control: bigThree matches astro_helper.dart:992); no node rarity endpoint found | Mark: 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 | medium | lib/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 | medium | grep 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 | easy | grep -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 | easy | lib/views/profile_screen.dart:594,629 ('Users'/'Manage Users'); wayfinding_index.dart Friends entry | Mark: 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 | medium | lib/views/pick_user.dart:867-905 (_showUserMenu), :2201 chevron vs :2215 more_vert | Mark: 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" | medium | lib/styles/navigation.dart:167-200; Apple review 2026-08-09 | FEATURE-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 | medium | lib/styles/navigation.dart:167-200 | Mark: 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 | easy | grep 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 | easy | lib/views/profile_screen.dart:688-696; settings.dart:300-304; wayfinding_index.dart:177 lacks theme/dark terms | Mark: 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 | medium | lib/main.dart:647 UserWizardScreen() ignores query; grep 'tool' in lib = 0 | Mark: 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 | medium | lib/main.dart:647 (query unused); astromatrix-public tools-static.ts emits ?tool= links | Mark: 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 | easy | lib/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.7 | Decision: 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 present | Decision: 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 | easy | lib/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:2243 | Decision: 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-962 | Decision: 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 | easy | lib/views/report_screen.dart:615-640 (paid-only SelectionArea, bbb9b895 LIVE); components at lib/widgets/component_summary.dart:1183,3069,3154 | Decision: 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 | easy | lib/widgets/component_summary.dart:2415-2425 renders 'Action' box from AstroHelper.getAspectAction (lib/utils/astro_helper.dart:1305-1322); [customer] 2026-07-03 | Mark: 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 | medium | lib/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 | medium | lib/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 | easy | git 53a0c225 LIVE revert; FEATURE AUDIT 2026-10-16 PARTIAL 4/5 | Mark: 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 | easy | app_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 | easy | lib/widgets/daily_tile/tarot_card_tile.dart:21-31 (trailingIconKey 'tarot', mainValue tarotNumber, subtitle only if tarot non-null); unchanged since 8ccaccbd | Mark: 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 | medium | test/rejected_edit_still_rendered_test.dart (5ea6ac03, unpushed) proves it; lib/services/journal_outbox.dart:367-404 merge applies every queued edit | Mark 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 | easy | lib/views/matrix.dart:1369-1371 gate present in HEAD and live | Read 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 | medium | audit 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 | easy | Row 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 | medium | Feature audit 2026-10-16: R1/R3 live (ads_shown_total{ad_type=app_open} 11.1.5-11.1.7); R2/R4 NOT_IMPLEMENTED | ISSUE-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 | easy | lib/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 | medium | lib/views/message_detail_screen.dart:463-498; pubspec.yaml has no image_picker/file_picker | Node 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 | easy | Feature audit: R1/R2 COMPLETE live, R3 PARTIAL; 0e828096 LIVE | none 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 | medium | none: feature not built; audit 0/3 | Node/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 0 | ISSUE-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 | medium | none: user_wizard_screen.dart:98 _kShowFacetStep=false; intro lands on /chartdaily | Product 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 | easy | lib/constants/astrology_constants.dart:170,173,175,184 labels; confirm_user_dialog.dart:209 uses them | Freeze 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 | medium | user_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 GPU | Decision: 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) | Row | Actual remaining problem | Difficulty | Evidence it still exists | Dependencies · testing | Customers · 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 it | Locate 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 clean | Identify 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) | Row | Actual remaining problem | Difficulty | Evidence it still exists | Dependencies · testing | Customers · 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) | hard | none: feature never built; Guide at home_buttons.dart:90 | product 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 | hard | lib/utils/wayfinding_index.dart:164 Calendars synonyms lack 'ephemeris'; calendars.dart:53 tab exists | feature 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 | medium | none: All Transits list exists (matrix_service.dart:62,91); search is a new feature | product 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" | easy | none: Weekly/Monthly/Solar/Lunar in Explore (home_buttons.dart:46-90); search live | actions 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 | easy | 2026-10-16 v11.1.7 'Why I can't see Solar Return Report?'; Explore tile home_buttons.dart:78-82 | actionable 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" | hard | none: feature never built | product 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 | medium | lib/views/store.dart:1024-1061 — _buildWhyBlock only rendered when !_isPaidUser | Feature-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 >= 20 | Node 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- | medium | lib/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" | easy | none: 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 | hard | none: feature request; audit 2026-10-16 PARTIAL 0/4 requirements | Node 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 | easy | none: 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 | hard | none: 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 | easy | none: 438a1499 in iOS 11.1.7; GA4 iOS banner 115,027 -> 13,727/week from pre-11.1.1 installs | none 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 | easy | none: 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 | easy | none: flutter test test/message_badge_clears_test.dart passes at HEAD (run 2026-10-16); 65590c69 LIVE asserts chat 9 / support 2 | none 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 | easy | nodejs 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 Support | Node 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 | medium | none: feature request; audit 0/3 | Timing 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 | medium | none: 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 | hard | none: feature request; audit 0/3; server resolveTimezone overwrites | Node 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 | medium | none: f1ce8f80/78ebce90 LIVE; feature audit 36/36 decans correct | ISSUE-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 | hard | none: feature audit BACKEND_ONLY; GET /journals/tarot/patterns live, no Flutter caller | Mark'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 | easy | none: 531db01d LIVE (build.gradle:146 okhttp 4.9.1); ISSUE-281 owns the GPU family | none n/a | no linked reports Measurement record; close. Release state these assignments depend on Unpushed on local new-ui: 26b62c73 (checkout), ea6c1c1f (journal), dd78087a (Moon filter), 4ec90fc9 (back navigation), 5ea6ac03 (rejected-edit test), the Track 1 commits d69e9c99, 269a0704, 7faf3530 and 87a229cd, the four iOS widget commits, and three FEATURE-11/26 Daily commits from another session. Isolated candidate: local branch hotfix/11.1.7-rb1-candidate. It is the live commit 3423e5a2 plus only the approved commits, plus be0ccb87, which the live commit needs in order to compile from a clean checkout (the vendored IAP plugin's generated file). It now also carries the four Track 1 commits: 23 commits on top of the live build. It analyzes clean, its full test suite passes (3,895 of 3,895), and its Android profile build succeeds. Test suite at HEAD: three consecutive full runs passed (3,947), and again after the Track 1 commits (3,957 of 3,957). The earlier single failure didn't recur. Its first log wasn't kept, so it couldn't be named. A clean checkout needs dart run build_runner build before it compiles, because *.g.dart is gitignored.