Releases: chris-dev-at/BetterTrackMobile
Release list
BetterTrack App 0.56
-
Idempotency keys ON (re-verified live post-#441) + money-prefill truncation + shared-screen inset fix
Flip SyncFeatureFlags.IDEMPOTENCY_KEYS_ENABLED after the platform fixed the
missing idempotency_keys table (PR #441): device E2E green — header on the
wire, tx-create 201, exactly-once under reconnect flap and app-kill mid-POST
(same key, no duplicates). Kill-switch retained.Owner directive: market-data money prefills (date->price autofill) truncate
to cents, string-safe — 231.499320001 fills as 231.49, never rounded up;
sub-cent prices keep 6 significant decimals; stored-value edit prefills and
user input stay exact; quantities keep 8-decimal precision. Hardened
formatDecimalForInput against float artifacts (shortest-decimal form).Owner bug: shared portfolio/watchlist/conglomerate views clipped their first
item under the app bar (content lambdas dropped the Scaffold padding) —
SharedScaffold now applies it centrally.343 unit tests green.
-
Web autofill-truncation LIVE (PR #443, prod fdd2c5d): as-shipped site map for mirroring; sub-cent autofill nuance pending owner decision
-
Owner clarification: the real target is market-data money AUTOFILL truncated to cents (231.499320001 -> 231.49), stored-value edit prefills stay exact, quantities never cut; web fix in flight
-
Web formatting sweep LIVE (PR #442, prod 08099f9): as-shipped rules verbatim (half-away-from-zero, symbol-last, em-dash null, DE %-space, 6 sig-dec unit prices) for 1:1 app matching
-
Owner directive both apps: unified number-display rules (2-dec money half-up locale-aware, 2-dec percents, 8-dec trimmed quantities, 6 sig-dec tiny unit prices) — display-only, API precision unchanged; web sweep in flight
-
Idempotency-500 FIXED + LIVE (PR #441, prod 230d510): root cause = migration 0034 skipped by future-dated journal stamp, table missing on prod; semantics unchanged — flip the flag, re-verify, post results; platform pausing per owner
-
Idempotency-500 P1 ack: fix in progress (real-postgres param-typing suspect, CI real-engine gap closing with it); semantics unchanged, hold kill-switch until tick
BetterTrack App 0.55
-
Idempotency-key adoption (#432) gated off — header 500s tx-create on prod (P1 filed) + search-bar inset fix
Full client adoption of Idempotency-Key on the offline queue's mutation
endpoints, reusing the persisted per-op clientId UUID (no schema change):
header attached on tx-create + cash ops + value points, 409 IN_PROGRESS
retried, 409 MISMATCH permanent, 400 KEY_INVALID regenerated once. Shipped
behind SyncFeatureFlags.IDEMPOTENCY_KEYS_ENABLED=false: an on-device A/B
proved the header itself turns POST /portfolios/{id}/transactions into a
500 on prod (same body without it: 201) — evidence + timestamps in
PLATFORM_ASKS.md #15; flip the flag when the platform fix ticks.Owner ask: asset-search bar no longer draws under the status bar
(statusBarsPadding on the hand-rolled topBar Row).337 unit tests green (15 new, incl. MockWebServer wire-level header
coverage).
BetterTrack App 0.54
-
Notification archive/delete live (#437/PR #440) + friend-alerts ungate + first-class activity rows
Owner directive: inbox Active|Archived|All filter, per-row archive/unarchive/
delete with undo snackbar, bulk archive-all-read / delete-all-archived /
delete-all behind destructive confirms, bell badge = server unread-active.
Wired to the as-shipped #440 semantics (view param, archivedAt, archive-
implies-read, 204 deletes, archive-all-read path) behind the
archiveDeleteEnabled kill-switch, ON — live-verified E2E on prod.Also: obsolete 'Coming soon' badge removed from friend activity-alerts
(pipeline is live; toggle round-trip re-verified), and friend.activity /
watchlist.shared / conglomerate.shared render first-class with deep-links.322 unit tests green; EN/DE parity 859=859.
-
Archive+delete LIVE (PR #440, prod fb09efd): exact wire semantics — view param (default active), archivedAt additive, unreadCount=active-unread, archive-implies-read, 204 deletes, scope-required bulk, 7d auto-archive; wire the app UX now
-
Owner nudge: notification archive/delete (#437) is in build platform-side NOW — start the app UX in parallel; as-shipped semantics + tick follow on merge
BetterTrack App 0.53
-
Step 19 pass 2 — Social tab German complete + closed-app push PROVEN live. Social i18n: ui/social fully externalized (103 new bt_social_ keys EN+DE incl. gender-correct per-kind audience strings; ViewModel toasts via locale-safe SocialToast type; SocialRepository detail->count refactor so My-shares subtitles localize; one DE stat label shortened to fit) — device-verified DE walk + EN round-trip, EN/DE parity 831=831, 293 tests green. Push retest after platform worker fix (#435/#436): born-breached alert -> real FCM status-bar push in ~49s with app backgrounded -> deep-link Workboard/Alerts -> Triggered row -> inbox row; fan-out P1 closed both sides in PLATFORM_ASKS (update #11) — alerts, chat REST+WS, notifications v2 now ALL live end-to-end. Step 19 ticked complete in TODO.
-
Owner directive: notification archive+delete (platform #437) — bell = unread+recent only, All-notifications sub-menu, per-item + bulk delete; planned API shape for stub-first build
-
Push retest is GO: #436 adopted (worker fresh on aabe802, dispatch consumer + FCM channel confirmed in boot log, backlog drained) — re-arm a fresh born-breached alert, expect <=60s trigger + inbox row + closed-app push
BetterTrack App 0.52
-
Step 19 (polish/i18n/release prep), pass 1: uncovered sell wired end-to-end per platform PR #429 (allowUncovered+uncoveredEntryPrice through offline queue, create AND edit replays; amber warning card with required 'Sell anyway' ack gating submit + optional native-currency buy-in price; EN+DE) — currency-aware price/fee/total labels (asset-native symbol via shared currencySymbol/formatMoney; cash-after stays EUR) — chat screens externalized (~24 strings EN+DE, was hardcoded) — a11y: password reveal toggle now TalkBack-labelled — R8 release build: minify+shrink with minimal keep rules (serialization DTOs/routes, SyncWorker), 82.8MB -> 7.19MB, device-verified clean across login/portfolio/tx/inbox in EN+DE — signing scaffold reads ~/.bettertrack via props, debug fallback, nothing committed — docs/PLAY_LISTING.md (owner checklist + EN/DE listing drafts + Data-safety draft). 293 tests green (+18), assembleDebug+assembleRelease clean. Known gap queued: Social screens still hardcoded EN (~85 strings, 4 files) — follow-up pass next.
-
Fan-out P1 root-caused+fixed (PR #435): prod worker frozen by the deploy loop since go-live — all v2 notifications dark since 02:27Z, queued not lost; born-breach notifies by design, expected latency ~60s; HOLD retest until ops adopt (#436), then re-arm fresh alert
-
Idempotency keys LIVE (PR #432, prod de45335): Idempotency-Key UUID header on all portfolio mutations — exact replay/409/retention semantics for the offline queue
-
WS realtime mobile-verified LIVE (101 -> Engine.IO -> Socket.IO ack 427ms with bearer; chat P1 closed both halves; poll cadence widens when connected) + E2E closed-app push retest: server flips born-breached alert to triggered (~10min) but emits no notification row and no FCM send to the armed device — new P1 'alert.triggered fan-out' filed in PLATFORM_ASKS §OPEN with full evidence + retest offer; TODO entries for both. Verification-only, zero app code changes.
-
Uncovered sell shipped (PR #429: allowUncovered/uncoveredEntryPrice semantics) + ack notifications-v2 go-live report; heads-up: idempotency keys (#417) in build
BetterTrack App 0.51
-
Notifications v2 go-live: device-token register/deregister wired live (POST/DELETE /notifications/devices, bearer-gated — defers logged-out, fires on login/cold-start/rotation, best-effort DELETE before logout wipe), debug sample inbox removed with GET /notifications now authoritative, prefs matrix synced to the server's 4-channel cells incl. push (webpush echoed verbatim, chat.message server-modeled; per-type mute stays local), stubDeviceRegistration=false with tripwire. Live-verified on prod: registration 200 on login, 40-item real inbox incl. both BTC-EUR alert.triggered rows, mark-read persists server-side, push-toggle PATCH round-trip, deregister 200 on logout. Also: AuthRepository no longer logs username/email on login (PII-free logcat). 275 tests green (+16), assembleDebug clean. TODO + PLATFORM_ASKS updated (mobile->platform: v2 wired, only #421 key was pending).
-
WS is GO (edge adopted + publicly verified 101/Engine.IO; old 400s were an h2 probe artifact) + FCM ARMED on prod (#421 key landed) — retest direct WS + end-to-end push
-
Notifications v2 merged+deploying: device-token/inbox/prefs endpoints live, taxonomy matched, durable delivery; FCM sends gated on service-account key
BetterTrack App 0.50
-
Price alerts LIVE: flip ALERTS_SCOPES_ENABLED on (platform migration 0030 tick) — fresh consent accepts alerts:read/alerts:write with no authorize reject, GET /alerts 200 with the owner's real alerts (2x BTC-EUR triggered + BAYN.DE active, untouched), create->delete round trip persisted server-side; tripwire test now guards the flag ON (259 tests green); PLATFORM_ASKS: /alerts P1 closed both-sides-verified with a reconcile note (an earlier full CRUD run also passed pre-0030 — instance skew or #423's deploy applied a seed); TODO alerts entry marked fully live.
-
Confirmations: alerts scopes live (prod on 244b232), /version returns real build info; WS still pending
-
Tick: alerts scopes migration-carried (0030 merged) — flip ALERTS_SCOPES_ENABLED after ~23:20 UTC + re-login
-
Alerts scopes: root cause (prod updater seeds not run) + migration 0030 deploy-channel fix in flight; keep flag off until ticked
BetterTrack App — latest debug build
Rolling debug build produced by CI (run #56 · version 0.56).
Commit: cc06cde
Built: 2026-07-11 23:29 UTC
What's new in 0.56
-
Idempotency keys ON (re-verified live post-#441) + money-prefill truncation + shared-screen inset fix
Flip SyncFeatureFlags.IDEMPOTENCY_KEYS_ENABLED after the platform fixed the
missing idempotency_keys table (PR #441): device E2E green — header on the
wire, tx-create 201, exactly-once under reconnect flap and app-kill mid-POST
(same key, no duplicates). Kill-switch retained.Owner directive: market-data money prefills (date->price autofill) truncate
to cents, string-safe — 231.499320001 fills as 231.49, never rounded up;
sub-cent prices keep 6 significant decimals; stored-value edit prefills and
user input stay exact; quantities keep 8-decimal precision. Hardened
formatDecimalForInput against float artifacts (shortest-decimal form).Owner bug: shared portfolio/watchlist/conglomerate views clipped their first
item under the app bar (content lambdas dropped the Scaffold padding) —
SharedScaffold now applies it centrally.343 unit tests green.
-
Web autofill-truncation LIVE (PR #443, prod fdd2c5d): as-shipped site map for mirroring; sub-cent autofill nuance pending owner decision
-
Owner clarification: the real target is market-data money AUTOFILL truncated to cents (231.499320001 -> 231.49), stored-value edit prefills stay exact, quantities never cut; web fix in flight
-
Web formatting sweep LIVE (PR #442, prod 08099f9): as-shipped rules verbatim (half-away-from-zero, symbol-last, em-dash null, DE %-space, 6 sig-dec unit prices) for 1:1 app matching
-
Owner directive both apps: unified number-display rules (2-dec money half-up locale-aware, 2-dec percents, 8-dec trimmed quantities, 6 sig-dec tiny unit prices) — display-only, API precision unchanged; web sweep in flight
-
Idempotency-500 FIXED + LIVE (PR #441, prod 230d510): root cause = migration 0034 skipped by future-dated journal stamp, table missing on prod; semantics unchanged — flip the flag, re-verify, post results; platform pausing per owner
-
Idempotency-500 P1 ack: fix in progress (real-postgres param-typing suspect, CI real-engine gap closing with it); semantics unchanged, hold kill-switch until tick
Full per-version history: see the v0.* releases below. Debug build signed with a CI keystore — to install over a copy installed from Android Studio, uninstall that first. Points at production BetterTrack.
BetterTrack App 0.49
-
Smoothing-aware custom-asset detail chart + alerts scopes behind a safety flag — BtStepLineChart gains a Linear interpolation mode (identical grid/dots/fill/scale; Step path unchanged) and the asset-detail Value-over-time chart picks Linear when the asset's smoothing flag is on (design decision: smoothed = interpolated line, raw = step), device-verified both ways on prod; alerts:read/alerts:write are wired into OAuthConfig but held behind ALERTS_SCOPES_ENABLED=false because the platform's scope seed hasn't landed and requesting un-seeded scopes hard-rejects the whole authorize (device-confirmed twice — would have broken all logins); /alerts now 403s with a scope-missing message, proving the bearer-gate half of the platform fix IS deployed; flag-flip + full CRUD re-verify happens when the seed is confirmed. +5 tests (259 green: chart interpolation pick + 4 scope tripwires incl. shipped-flag-off guard).
-
Tick: /alerts bearer P1 fixed — PR #423 merged, re-login to pick up alerts scopes
BetterTrack App 0.48
-
Platform-integration batch (main-dev handoff 2026-07-10): portfolio hard-DELETE + archived grouping + chat composer focus + API build info — switcher gets a collapsible Archived section (collapsed by default, count badge; active list stays flat; wobble height-cap preserved and re-verified byte-identical at rest) with Delete in both active and archived row menus behind a type-the-name-to-confirm dialog that warns the full transaction/cash/dividend history is removed and historical/tax figures change (EN+DE); DELETE /portfolios/{id} wired per PR #412 semantics (LAST_ACTIVE_PORTFOLIO surfaced inline, derived default re-resolved after delete, local Room cache purged); chat composer autofocuses on conversation open and keeps focus after send (adjustResize inset behavior intact); About + dev menu show the live API build via public GET /api/v1/version (fail-soft row, hidden on error) — live server currently returns unknown placeholders, flagged platform-side in PLATFORM_ASKS. 12 new tests (254 green); device-verified on prod incl. throwaway-portfolio full delete with zero residue.
-
Platform ack: /alerts bearer P1 — fix in flight (alerts:read/alerts:write), write-implies-read live, Live Mode overhaul heads-up