|
| 1 | +# BlueEye MVP Goal Prompt |
| 2 | + |
| 3 | +## Master Goal |
| 4 | + |
| 5 | +Doprowadz projekt BlueEye Tracker do pierwszej wersji terenowej MVP, ktora ma realna wartosc uzytkowa: |
| 6 | + |
| 7 | +- niezawodnie pokazuje, czy telefon faktycznie zbiera sygnaly BLE/Classic w czasie sesji, |
| 8 | +- uczciwie rozroznia ograniczenia Androida, broad scan, filtered/watchlist scan i aktywne zbieranie, |
| 9 | +- ma spojny system alertow: watchlist, follow-me i public-safety-like signals, |
| 10 | +- pozwala uruchomic pierwsze sesje terenowe z eksportem danych i kalibracja progow, |
| 11 | +- nie obiecuje wykrycia osoby, intencji ani kazdego urzadzenia sledzacego. |
| 12 | + |
| 13 | +Pracuj bez branchy, bez XML layoutow, bez Fragments, bez LiveData, bez RxJava. Uzywaj Kotlin, Jetpack Compose, Hilt, Flow/StateFlow, Result<T>, Navigation Compose i istniejacej architektury feature-first. Wszystkie zmiany rob na `main`. |
| 14 | + |
| 15 | +## Execution Rules |
| 16 | + |
| 17 | +Po kazdym podgolu: |
| 18 | + |
| 19 | +1. Uruchom minimalne testy dla dotknietych modulow. |
| 20 | +2. Jesli podgol dotyka build/runtime, uruchom tez `./gradlew :app:assembleDebug`. |
| 21 | +3. Zaktualizuj checklisty w tym pliku: zmien `[ ]` na `[x]` tylko dla faktycznie wykonanych punktow. |
| 22 | +4. Zrob commit z konkretnym komunikatem. |
| 23 | +5. Wypchnij `main`. |
| 24 | +6. Nie przechodz do nastepnego podgolu, jesli obecny nie ma zielonej weryfikacji albo jawnie opisanego blokera. |
| 25 | + |
| 26 | +Minimalna weryfikacja lokalna: |
| 27 | + |
| 28 | +```bash |
| 29 | +export JAVA_HOME=/opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home |
| 30 | +./gradlew qualityCheck |
| 31 | +./gradlew :app:assembleDebug |
| 32 | +git diff --check |
| 33 | +``` |
| 34 | + |
| 35 | +Jezeli JDK 17 nie istnieje lokalnie, pierwszy podgol polega na naprawie toolchainu albo udokumentowaniu dokladnej blokady. Nie zgaduj wynikow testow. |
| 36 | + |
| 37 | +## Non-Negotiable Product Line |
| 38 | + |
| 39 | +Aplikacja nie ma byc "magiczny wykrywacz sledzenia". MVP ma byc narzedziem dowodowym: |
| 40 | + |
| 41 | +- "co telefon zaobserwowal", |
| 42 | +- "kiedy to zaobserwowal", |
| 43 | +- "dlaczego tak sklasyfikowal", |
| 44 | +- "jak pewna jest klasyfikacja", |
| 45 | +- "czy alert byl technicznie mozliwy i faktycznie wyslany". |
| 46 | + |
| 47 | +Jesli Android ogranicza skanowanie po zablokowaniu ekranu, UI i eksport maja to pokazac zamiast ukrywac. |
| 48 | + |
| 49 | +## Subgoal 0: Toolchain And Quality Gate |
| 50 | + |
| 51 | +Cel: projekt musi dac sie budowac i testowac lokalnie przed zmianami produktowymi. |
| 52 | + |
| 53 | +- [ ] Zweryfikuj JDK 17 i ustaw `JAVA_HOME` zgodnie z `docs/QUALITY_GATE.md`. |
| 54 | +- [ ] Uruchom `./gradlew qualityCheck`. |
| 55 | +- [ ] Uruchom `./gradlew :app:assembleDebug`. |
| 56 | +- [ ] Jesli quality gate pada przez istniejace problemy, zapisz dokladna liste awarii i napraw tylko blokery potrzebne do dalszej pracy. |
| 57 | +- [ ] Nie zmieniaj logiki BLE/alertow w tym podgolu. |
| 58 | + |
| 59 | +Acceptance: |
| 60 | + |
| 61 | +- `qualityCheck` i `assembleDebug` przechodza albo blocker jest jednoznacznie opisany w commit message i w tym pliku. |
| 62 | + |
| 63 | +Suggested commit: |
| 64 | + |
| 65 | +```text |
| 66 | +Stabilize local quality gate |
| 67 | +``` |
| 68 | + |
| 69 | +## Subgoal 1: Scanner Runtime Diagnostics For Field Sessions |
| 70 | + |
| 71 | +Cel: przed poprawianiem detekcji aplikacja ma mierzyc, czy skaner w ogole dziala w realnych warunkach. |
| 72 | + |
| 73 | +- [ ] Dodaj domenowy model diagnostyki skanera, np. runtime state, last BLE result time, last Classic result time, BLE results/min, Classic results/min, dropped queue events, scan start time, screen/lock related state if available. |
| 74 | +- [ ] Przekazuj diagnostyke z `BleScanner`, `BleScanSource`, `ClassicScanSource` i `ScannerService` do domenowego API przez Flow/StateFlow. |
| 75 | +- [ ] Pokaz diagnostyke w Settings albo Radar jako sekcje developersko-terenowa, bez marketingowego tekstu. |
| 76 | +- [ ] Dodaj eksport diagnostyki do sesji JSON, z timestampami i licznikami. |
| 77 | +- [ ] Dodaj testy jednostkowe dla formatowania/mapperow diagnostyki. |
| 78 | + |
| 79 | +Acceptance: |
| 80 | + |
| 81 | +- Uzytkownik widzi, czy po zablokowaniu telefonu dalej pojawiaja sie wyniki. |
| 82 | +- Eksport sesji pozwala porownac: ekran wlaczony, ekran zablokowany, 5/15/30 minut. |
| 83 | +- Brak claimow, ze background broad scan jest niezawodny. |
| 84 | + |
| 85 | +Suggested commit: |
| 86 | + |
| 87 | +```text |
| 88 | +Add scanner runtime diagnostics for field sessions |
| 89 | +``` |
| 90 | + |
| 91 | +## Subgoal 2: Background Scanning Strategy |
| 92 | + |
| 93 | +Cel: naprawic problem "powiadomienia nie dzialaja po zablokowaniu" u zrodla, czyli rozroznic brak alertu od braku danych. |
| 94 | + |
| 95 | +- [ ] Sprawdz oficjalne ograniczenia Androida dla BLE background scanning i zapisz w komentarzu/README tylko praktyczna konsekwencje, bez dlugiej dokumentacji. |
| 96 | +- [ ] Nie udawaj, ze unfiltered `startScan(..., ScanCallback)` bedzie niezawodny po screen-off. |
| 97 | +- [ ] Dla broad discovery zostaw tryb foreground/live scan i opomiaruj jego skutecznosc. |
| 98 | +- [ ] Dla watchlist/background alerts dodaj filtered scan path dla znanych fingerprintow/MAC/service/manufacturer clues tam, gdzie da sie stworzyc sensowny `ScanFilter`. |
| 99 | +- [ ] Jesli uzywasz `PendingIntent` scan path, dodaj osobny odbiornik i testowalna warstwe mappera intent -> scan event. |
| 100 | +- [ ] Jesli nie da sie stworzyc filtra dla danego watchlist entry, pokaz w UI/export "background reliability limited". |
| 101 | +- [ ] Nie dodawaj agresywnego wake-lock/probing obejscia jako glownego rozwiazania. |
| 102 | + |
| 103 | +Acceptance: |
| 104 | + |
| 105 | +- Watchlist ma najlepsza dostepna sciezke dla lock screen. |
| 106 | +- Unknown broad detection pozostaje opisana jako ograniczona przez Androida. |
| 107 | +- Diagnostyka pokazuje, czy problemem byl brak scan result, decyzja alert policy, permission, czy notification channel. |
| 108 | + |
| 109 | +Suggested commit: |
| 110 | + |
| 111 | +```text |
| 112 | +Separate live and background watchlist scanning paths |
| 113 | +``` |
| 114 | + |
| 115 | +## Subgoal 3: Unified Alert Settings And Dispatcher |
| 116 | + |
| 117 | +Cel: przelaczniki wibracji, dzwieku i popupow maja dzialac przewidywalnie dla wszystkich typow alertow. |
| 118 | + |
| 119 | +- [ ] Zaprojektuj jeden domenowy model ustawien alertow dla kategorii: watchlist return, follow-me, public-safety-like. |
| 120 | +- [ ] Kazda kategoria ma jawne ustawienia: enabled, notification/tray, heads-up, sound, vibration. |
| 121 | +- [ ] Zastap rozproszone uzycie `WatchlistPreferences` w alert path jednym `AlertSettingsRepository` albo rownowaznym kontraktem domenowym. |
| 122 | +- [ ] Zastap rozproszone wywolania notyfikacji/wibracji jednym `AlertDispatcher`. |
| 123 | +- [ ] Usun stare wewnetrzne galezie/fallbacki po migracji aktualnych callerow. Nie zostawiaj redundantnej kompatybilnosci API. |
| 124 | +- [ ] Dodaj testy dla kazdej kombinacji: master off, category off, vibration off, heads-up off, notification permission missing. |
| 125 | +- [ ] Dodaj w Settings proste sterowanie wszystkimi kategoriami. |
| 126 | + |
| 127 | +Acceptance: |
| 128 | + |
| 129 | +- Wylaczenie wibracji znaczy: zadna kategoria, ktora korzysta z tego ustawienia, nie wibruje. |
| 130 | +- Wylaczenie heads-up nie kasuje przypadkiem calej historii ani nie wplywa na dzwiek/wibracje, chyba ze UI jawnie tak mowi. |
| 131 | +- Watchlist return nie omija globalnej polityki alertow. |
| 132 | + |
| 133 | +Suggested commit: |
| 134 | + |
| 135 | +```text |
| 136 | +Unify alert settings and dispatch policy |
| 137 | +``` |
| 138 | + |
| 139 | +## Subgoal 4: Notification Reliability Diagnostics And Test Alert |
| 140 | + |
| 141 | +Cel: uzytkownik ma wiedziec, czy alert moze pojawic sie na zablokowanym telefonie. |
| 142 | + |
| 143 | +- [ ] Dodaj "Test alert" w Settings dla kazdej kategorii lub jeden test z wyborem kategorii. |
| 144 | +- [ ] Pokaz status: `POST_NOTIFICATIONS`, notification channel importance, heads-up enabled, sound enabled, vibration enabled. |
| 145 | +- [ ] Jesli permission/channel blokuje alert, pokaz konkretny stan w UI. |
| 146 | +- [ ] Dodaj lock-screen-safe notification ustawienia tam, gdzie to ma sens: priority/importance, visibility, category. |
| 147 | +- [ ] Nie uzywaj fake popupow jako substytutu notyfikacji systemowej. |
| 148 | +- [ ] Dodaj testy dla `AlertContentFormatter`, `AlertDispatcher` i diagnostyki kanalow. |
| 149 | + |
| 150 | +Acceptance: |
| 151 | + |
| 152 | +- Da sie recznie wyslac test alert i zobaczyc, czy system go blokuje. |
| 153 | +- Eksport albo diagnostyka odroznia "alert policy blocked" od "Android notification blocked". |
| 154 | + |
| 155 | +Suggested commit: |
| 156 | + |
| 157 | +```text |
| 158 | +Add alert delivery diagnostics and test alert |
| 159 | +``` |
| 160 | + |
| 161 | +## Subgoal 5: Field Session Export Contract |
| 162 | + |
| 163 | +Cel: pierwsze sesje terenowe maja produkowac dane, z ktorych da sie podjac decyzje o progach i detekcji. |
| 164 | + |
| 165 | +- [ ] Upewnij sie, ze eksport zawiera: scanner diagnostics, alert decisions, notification delivery result, scan counts, evidence, RSSI samples, movement/baseline state, active probe state. |
| 166 | +- [ ] Dodaj `sessionScenario` albo notatke sesji: home baseline, walk without tracker, walk with known device, city, car/transit. |
| 167 | +- [ ] Dodaj czytelny "session readiness" status: czy sesja ma wystarczajaco danych do kalibracji. |
| 168 | +- [ ] Dodaj testy JSON mapperow dla nowych pol. |
| 169 | +- [ ] Zachowaj schemat eksportu jako jawnie wersjonowany. |
| 170 | + |
| 171 | +Acceptance: |
| 172 | + |
| 173 | +- Po jednej sesji terenowej da sie odpowiedziec: ile danych zebrano, czy screen-off przerwal skan, czy alert mial szanse dojsc, dlaczego score wzrosl. |
| 174 | + |
| 175 | +Suggested commit: |
| 176 | + |
| 177 | +```text |
| 178 | +Extend session export for field calibration |
| 179 | +``` |
| 180 | + |
| 181 | +## Subgoal 6: Sony Headphones Recognition Smoke Path |
| 182 | + |
| 183 | +Cel: nie traktowac sluchawek Sony jako trackerow, ale uzyc ich jako realnego testu rozpoznawania i widocznosci Bluetooth. |
| 184 | + |
| 185 | +- [ ] Dodaj reczny scenariusz testowy w aplikacji/eksportach: Sony headphones nearby/pairing/connected/off. |
| 186 | +- [ ] Zweryfikuj BLE Fast Pair, Classic discovery, SDP UUID i name-based classification path. |
| 187 | +- [ ] Jesli sluchawki nie sa widoczne, UI/export ma pokazac "not observed", a nie bledna klasyfikacje. |
| 188 | +- [ ] Dodaj testy dla istniejacego Sony/Fast Pair/classic evidence mapping, tylko tam gdzie brakuje pokrycia. |
| 189 | +- [ ] Nie podbijaj follow-me score dla zwyklych sluchawek bez niezaleznego patternu ruchu. |
| 190 | + |
| 191 | +Acceptance: |
| 192 | + |
| 193 | +- Aplikacja potrafi wyjasnic jedno z trzech: wykryto jako Sony/audio, wykryto tylko generic audio, albo telefon nie zaobserwowal urzadzenia. |
| 194 | + |
| 195 | +Suggested commit: |
| 196 | + |
| 197 | +```text |
| 198 | +Harden Sony audio recognition evidence |
| 199 | +``` |
| 200 | + |
| 201 | +## Subgoal 7: First Field Session Checklist |
| 202 | + |
| 203 | +Cel: przygotowac projekt do pierwszych realnych sesji, bez dalszego kodowania parserow. |
| 204 | + |
| 205 | +- [ ] Zbuduj debug APK. |
| 206 | +- [ ] Zainstaluj na telefonie. |
| 207 | +- [ ] Wykonaj test alertu na odblokowanym i zablokowanym ekranie. |
| 208 | +- [ ] Wykonaj 10-min home baseline. |
| 209 | +- [ ] Wykonaj 10-min spacer bez znanego trackera. |
| 210 | +- [ ] Wykonaj 10-min spacer z wlasnym znanym urzadzeniem/watchlist item. |
| 211 | +- [ ] Wyeksportuj kazda sesje. |
| 212 | +- [ ] Oznacz false positives i known safe. |
| 213 | +- [ ] Nie zmieniaj progow scoringu przed przejrzeniem eksportow. |
| 214 | + |
| 215 | +Acceptance: |
| 216 | + |
| 217 | +- Sa minimum trzy eksporty z realnego telefonu. |
| 218 | +- Jest lista konkretnych false positives/false negatives. |
| 219 | +- Nastepny etap to kalibracja progow na danych, nie zgadywanie. |
| 220 | + |
| 221 | +Suggested commit: |
| 222 | + |
| 223 | +```text |
| 224 | +Document first field session checklist |
| 225 | +``` |
| 226 | + |
| 227 | +## Stop Conditions |
| 228 | + |
| 229 | +Przerwij i napisz blocker, jesli: |
| 230 | + |
| 231 | +- build/test nie startuje przez toolchain, |
| 232 | +- Android permission/channel blokuje alert i nie da sie tego naprawic kodem, |
| 233 | +- broad scan nie daje wynikow po screen-off mimo foreground service, |
| 234 | +- zmiana wymaga odejscia od Compose/Clean Architecture/Hilt/Flow, |
| 235 | +- dane terenowe pokazuja, ze Follow-Me score nie odroznia baseline od ruchu. |
| 236 | + |
| 237 | +## Commercial Decision Gate |
| 238 | + |
| 239 | +Po wykonaniu Subgoal 7 podejmij decyzje: |
| 240 | + |
| 241 | +- GO: watchlist alerts sa niezawodne, eksport jest uzyteczny, diagnostyka wyjasnia ograniczenia. |
| 242 | +- PIVOT: broad unknown tracker detection jest za slabe, ale app ma wartosc jako BLE evidence/session tool. |
| 243 | +- STOP: alerty/watchlist nie dzialaja na realnym telefonie po lock screen i nie ma platformowej sciezki obejscia. |
| 244 | + |
0 commit comments