Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/DEVICE_VALIDATION_LEDGER.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

| # | Özellik | Nerede | Kabul ölçütü (cihazda ne gözlemlenmeli) | Eklendi |
|---|---------|--------|------------------------------------------|---------|
| 55 | **🔴 Device Validation Pending — Worker Source Health Transport (PR-1)** — Worker'ın 1 Hz watchdog'unda **ZATEN hesapladığı** per-kaynak canlılık (`_alive(_canLastSeen, SRC_TIMEOUT_CAN_MS=3s)` · OBD 5s · GPS 5s — `VehicleCompute.worker.ts:92-96, 1010-1013`) ana thread'e taşınır: yeni `SOURCE_HEALTH` mesajı → `VehicleSignalResolver` → `halStatusStore.sourceHealth`. **NEDEN:** sessiz ECU frame kaybında native `canStatus` yalnız TRANSPORT durumunu bildiriyor (`CarLauncherPlugin.java:3748-3756` — port açıkken `connected:true`), dolayısıyla frame kaybını **yalnız worker** görüyor; bu bilgi bugüne dek ana thread'e HİÇ ulaşmıyordu. **DAVRANIŞ:** can/obd/gps **AYRI** tutulur (tek global `halConnected` yetersiz — CAN ölüp GPS yaşarken toptan kapatma yapılamaz); `null` = **BİLİNMİYOR** ve `false` (ölü) ile KARIŞTIRILMAZ; mesaj **YALNIZ DEĞİŞİMDE** postlanır (kenar-tetikli, duplicate durum mesaj üretmez; store de idempotent → gereksiz abone uyanışı yok); payload **yalnız 3 boolean + monotonik ts** (araç verisi/hız/RPM/CAN frame/VIN/PII YOK); pre-allocated envelope (hot-path allocation yok). **YENİ TIMER YOK** (worker'daki `setInterval` sayısı 4'te sabit: speed/fuel/coolant/watchdog — testle kilitli). **BU PR YALNIZ BİLGİ TAŞIR:** hiçbir sinyali unsupported YAPMAZ; HAL · adapter · Event Bus · bridge davranışı DEĞİŞMEZ (adapter hâlâ `halStatusStore` okumaz — kilitli). Fail-closed tüketim **AYRI PR (PR-2)**. ⚠️ **Background/visibility politikası EKLENMEDİ** (risk: uygulama arka plandayken worker timer'ı kısılır veya plugin event teslimi gecikirse yanlış-pozitif "CAN öldü" üretebilir → PR-2'de tüketimden önce ölçülmeli). | `platform/vehicleDataLayer/VehicleCompute.worker.ts` (WorkerOutMessage + kenar-tetikli post), `platform/vehicleDataLayer/VehicleSignalResolver.ts` (SOURCE_HEALTH kanalı), `platform/vehicleDataLayer/halStatusStore.ts` (bounded `sourceHealth` + setter), `__tests__/workerSourceHealthTransport.test.ts` (yeni, 20 test) | Gerçek cihazda/araçta: (1) **geçiş başına TEK mesaj** ve mesaj SPAM'i yok (store yazımı yalnız değişimde); (2) yeni timer/polling YOK; (3) **sahte disconnect YOK** — sinyaller hâlâ supported (Tanı raporu: `halWiring.ingestedSignalCount` düşmüyor, `halBridge.droppedCount=0`); (4) **gerçek araçta CAN frame kesilince `canAlive=false`** (≤3 sn) ve (5) **reconnect'te `canAlive=true`**; (6) OBD/GPS bağımsız kalıyor; (7) Xiaomi 23090RA98I'de boot/CPU/RAM regresyonu YOK; (8) **en az bir low-tier cihazda (K24/Mali-400 veya T507)** doğrulama; (9) background/foreground geçişinde yanlış-pozitif ölçülür. Araç ve low-tier doğrulanmadan 🟢 YAPMA. ⚠️ **KISMİ CİHAZ KANITI (2026-07-12, Xiaomi 23090RA98I — ARAÇ/OBD YOK):** 🟢 **Sahte disconnect YOK:** gerçek "Tanı Gönder" raporunda `halWiring{ingestedSignalCount:3 (değişmedi), activeSubscriptionCount:1, lastErrorCode:null}` ve `halBridge{present:true, started:true, droppedCount:0}` → PR-1 bilgi taşıması hiçbir sinyali düşürmedi, HAL/bridge davranışı DEĞİŞMEDİ. 🟢 Boot crash/ANR YOK (3 cold start: 1287/1027/1058 ms), idle CPU 13-60% / RSS 558-580 MB → önceki build'lerle aynı bantta (regresyon gözlenmedi). **HÂLÂ DOĞRULANMADI (bu yüzden 🔴):** (a) **`canAlive=false` / reconnect `true` — gerçek araç/OBD gerektirir** (CAN frame kesintisi üretilemiyor); (b) **low-tier cihaz (K24/T507) doğrulaması yok**; (c) background/foreground yanlış-pozitif ölçümü yapılmadı. ⚠️ **AÇIK BLOKAJ:** `sourceHealth` alanları TEŞHİS RAPORUNA henüz eklenmedi (diagnosticSections bu PR'ın izinli kapsamında değildi) → `canAlive`'ı cihazda ADB'siz okumak için PR-2'de (veya küçük bir teşhis PR'ında) bounded alan eklenmeli. | 2026-07-12 |
| 54 | **🔴 Device Validation Pending — Vehicle HAL → Event Bus Bridge Runtime Wiring (W4C)** — Zincir TAMAMLANDI: `UnifiedVehicleStore → VehicleHalProviderAdapter → vehicleHal → VehicleHalEventBridge → appEventBus`. Bridge foundation'ı (PR #54) gerçek `vehicleHal` singleton'ına ve W3'ün TEK aktif bus'ına bağlandı. **SAHİPLİK:** bridge bu wiring'in → cleanup YALNIZ bridge'i dispose eder; **HAL ve Bus DISPOSE EDİLMEZ**. **TEK INSTANCE:** aktif bridge varken ikinci start YENİ HAL aboneliği AÇMAZ; bayat kayıt serbest; eski cleanup yeni bridge'i düşüremez. **SystemBoot:** Wave 2'de HAL wiring'den SONRA, SystemOrchestrator'dan ÖNCE `_reg` ile → LIFO shutdown: bridge → HAL wiring → VDL → … → Event Bus (en son) ⇒ bridge kapanırken HAL ve Bus HÂLÂ AYAKTA. Bus yoksa wiring sessizce no-op (fail-soft, boot sürer). **EVENT:** `vehicle.signal.changed` (transient, supported sinyal değişimi; W4A sayesinde tek HAL snapshot → değişen sinyal başına 1 event), `vehicle.connection.changed` (retained; W4B unsupported geçişi TÜM destek kalkınca false üretir, kısmi kayıpta üretmez, reconnect'te true), `vehicle.identity.changed` (retained, ham VIN YOK — yalnız fingerprint). **`vehicle.ignition.changed` ÜRETİLMEZ** (kaynak yok → supported=false). TPMS payload bounded (≤8). Duplicate değer → duplicate event YOK (bridge imza-dedupe). **TEŞHİS:** support_snapshot'a bounded `halBridge{present,started,disposed,publishedCount,droppedCount,lastPublishAt}` eklendi — "bridge yok" (present:false, null) ile "0 event" AYRI. **BİLİNÇLİ KARARLAR:** throttle/debounce/coalescing/async-queue **YOK** → publish hızı = gerçek sinyal değişim hızı; **W4D kararı bu PR'ın CİHAZ ÖLÇÜMÜNDEN sonra** verilecek. **RİSK:** `PlatformEventBus.publish()` SENKRON dispatch eder → ileride eklenecek consumer'lar HAL/store hot-path stack'inde çalışır (bu PR'da ABONE YOK → yalnız publish maliyeti). **TİP NOTU:** bridge'in publish sözleşmesi geniş (`string`) domain/source alır, Bus dar birlik tipleri bekler → foundation'a dokunmadan wiring'de daraltıcı publish hedefi kullanıldı (doğrulama zayıflamaz; Bus zaten beyaz liste uygular). **KAPSAM DIŞI:** consumer/abone · Capability bridge/Registry · Deep Scan · Kernel servis kaydı · yeni catalog girdisi · HAL stale sweeper · **native `canStatus` wiring / worker source-health** · throttle (W4D). | `platform/system/platformCoreVehicleHalBridgeWiring.ts` (yeni), `platform/system/SystemBoot.ts` (additive Wave 2), `platform/diagnosticSections.ts` (halBridge bölümü), `__tests__/platformCoreVehicleHalBridgeWiring.test.ts` (yeni, 35 test), `__tests__/platformRuntimeDiagnostics.test.ts` (kilit güncellendi) | Gerçek cihazda/araçta: (1) TEK aktif bridge ve DOĞRU app Event Bus (Tanı raporu: `halBridge.present=true`, `started=true`); (2) HAL sinyal değişimleri doğru topic'lere publish (araçta speed/rpm/coolant/gear/reverse); (3) **publish/sn ölçülür** (park + sürüş); (4) duplicate sinyal duplicate event ÜRETMİYOR; (5) cleanup sonrası publish YOK; (6) bridge HAL/Bus'ı dispose ETMİYOR (restart sonrası bus sayaçları sıfırlanmıyor/çift bus yok); (7) `vehicle.ignition.changed` HİÇ yok; (8) TPMS payload bounded; (9) raporda VIN/ham CAN/koordinat/secret YOK; (10) `droppedCount=0` (veya gerekçeli); (11) CAN/OBD disconnect sonrası mümkün olan sinyaller unsupported + `connection.changed=false` YALNIZ tüm destek kalkınca; (12) reconnect sonrası `connection.changed=true`; (13) Xiaomi'de boot/idle CPU/RSS/FPS regresyonu YOK; (14) **en az bir low-tier cihazda (K24/Mali-400 veya T507)** sayaçlar raporda görünüyor, ANR/donma yok, publish yükü CPU/FPS bütçesini bozmuyor. ⚠️ **AÇIK BLOKAJ (ayrı iş):** ECU sessizce frame kesip store değerlerini null'a çekmezse disconnect TESPİT EDİLEMEZ (native `canStatus` hiçbir store'a yazılmıyor) → `connection.changed=false` o senaryoda üretilemez. ⚠️ **throttle/coalescing W4D'ye bırakıldı** (ölçüm sonrası). Masaüstü/araçsız Xiaomi testleriyle 🟢 YAPMA. ⚠️ **KISMİ CİHAZ KANITI (2026-07-12, Xiaomi 23090RA98I — ARAÇ/OBD YOK; ölçüm PR #68 teşhis yüzeyinden, uygulama koduna HİÇ enstrümantasyon eklenmeden):** 🟢 Bridge CANLI: gerçek "Tanı Gönder" raporunda `halBridge{present:true, started:true, droppedCount:0}`. 🟢 **PUBLISH/SN ÖLÇÜLDÜ (park, yalnız GPS):** iki rapor arası 440 sn — bridge `publishedCount` 33→197 (Δ=164) ⇒ **≈0,37 publish/sn**; bus `publishedCount` 34→198 (aynı Δ ⇒ yalnız bridge yayınlıyor), `droppedCount=0`, **`deliveredCount=0` ve `activeListenerCount=0`** (tasarım gereği abone YOK). 🟢 `halWiring.refreshCount` 56→487 (≈1 store update/sn) ve **`activeSubscriptionCount=1`** (tek HAL aboneliği). 🟢 `historyCount` 6'da SABİT → `vehicle.signal.changed` transient olduğu için history/RAM ŞİŞMİYOR; `retainedEventCount=2` (runtime.started + connection.changed). 🟢 Teşhis bölümü 612-615 bayt, **sızıntı izi YOK**. 🟢 Boot crash/ANR YOK (3 cold start: 1474/1112/1077 ms), idle CPU 17-27% / RSS 545-576 MB (önceki build'lerle aynı bantta → regresyon gözlenmedi). **HÂLÂ DOĞRULANMADI (bu yüzden 🔴): gerçek araç/OBD** — speed/rpm/coolant/gear/reverse event'leri, **sürüşteki publish/sn** (CAN frame hızı kodda yok → W4D throttle kararının girdisi), CAN/OBD disconnect sonrası `connection.changed=false`, reconnect, CPU/FPS bütçesi; ve **low-tier cihaz (K24/Mali-400 veya T507) doğrulaması YAPILMADI.** | 2026-07-12 |
| 53 | **🔴 Device Validation Pending — Vehicle HAL Source Disconnect / Fail-Closed (W4B)** — Kaynak kopunca HAL'in eski değerleri sonsuza kadar `supported=true`+`stale=false` tutması KAPATILDI. **KOD GERÇEĞİ:** `VehicleHal.refresh()` (tek stale süpürücü) üretimde HİÇ çağrılmıyor; `canStatus` native olayı hiçbir store'a yazılmıyor (yalnız `console.info` — CanAdapter.ts:57-59); `canPhase` yalnız İLK-FRAME timeout'unu temsil ediyor. **Gerçek kopma kanıtı:** worker kaynak-timeout'unda `null` yayar (SRC_TIMEOUT_CAN/OBD/GPS) ve `resetCanData()` CAN alanlarını null'lar. **SEÇİLEN MODEL (A-refined, timersız, yeni abonelik/DI YOK):** adapter, DAHA ÖNCE aktarılmış bir sinyalin değeri kaybolunca `source:'none'` ingest eder → HAL `supported=false` + `value=null` (eski değer taşınmaz; quality `unknown`, confidence 0 — uydurma YOK; timestamp = GEÇİŞ anı). **unknown ≠ disconnected:** hiç aktarılmamış sinyal için SAHTE disconnect üretilmez. **Toptan kapatma YOK:** yalnız kaynağı kaybolan sinyal düşer; füzyon `speed` GPS/OBD ile canlıysa supported KALIR. **CAN-özel boolean'lar** (door_state/parking_brake) artık CAN canlılığına bağlı → `resetCanData()`'nın `false` artığı "gerçek veri" sayılmaz (reverse füzyon olduğu için genel canlılıkta kalır). **Batch korunur (W4A):** bir geçişte düşen tüm sinyaller TEK batch → TEK HAL emit; aynı disconnected durum TEKRAR ingest edilmez (duplicate emit yok); kaynak dönünce değer normal yoldan yeniden ingest edilir (supported=true + gerçek source). **ignition:** kaynak yok → hâlâ ASLA üretilmez. **KAPSAM DIŞI:** zaman-tabanlı stale sweeper / yeni timer · Event Bus/bridge (W4C) · throttle (W4D) · native CAN state machine refactor. | `platform/vehicleHal/vehicleHalProviderAdapter.ts`, `__tests__/vehicleHalSourceDisconnect.test.ts` (yeni, 25 test) | Gerçek araçta: (1) CAN/OBD bağlıyken ilgili sinyaller supported; (2) adaptör/CAN kesilince **yalnız o kaynağın sinyalleri** `source=none`/`supported=false` oluyor; (3) diğer canlı kaynakların sinyalleri (GPS füzyon hızı) supported KALIYOR; (4) bir kopma geçişi TEK batch/TEK HAL emit üretiyor; (5) aynı disconnected durum duplicate emit ÜRETMİYOR; (6) yeniden bağlanınca supported/source/değer doğru geri dönüyor; (7) `vehicle.ignition` unsupported KALIYOR; (8) yeni timer/polling YOK ve tek subscription korunuyor (Tanı raporu: `halWiring.activeSubscriptionCount=1`, kopma/geri gelme sırasında `ingestedSignalCount` düşüp yükseliyor); (9) Xiaomi'de CPU/RAM/boot regresyonu YOK; (10) **en az bir low-tier cihazda (K24/Mali-400 veya T507)** doğrulama. ⚠️ **BİLİNEN SINIRLAMA (kapsam dışı):** CAN kablosu takılıyken ECU sessizce frame göndermeyi keserse store'daki CAN değerleri null'a DÖNMEZ (native `canStatus` hiçbir store'a yazılmıyor) → bu senaryoda kopma HÂLÂ tespit edilemez; ayrı iş (native canStatus wiring veya worker CAN-sağlık expose). Test edilmeden 🟢 yapma. ⚠️ **KISMİ CİHAZ KANITI (2026-07-12, Xiaomi 23090RA98I — ARAÇ/OBD YOK; ölçüm W4E teşhis yüzeyiyle, uygulama koduna HİÇ enstrümantasyon eklenmeden):** 🟢 Cihazın gerçek "Tanı Gönder" raporunda `halWiring{started:true, **activeSubscriptionCount:1**, refreshCount:169, ingestedSignalCount:3, lastErrorCode:null}` → tek abonelik korunuyor, hata yok. 🟢 **CAN-boolean kapısı cihazda GÖZLEMLENDİ:** aynı cihazda W4B ÖNCESİ build `ingestedSignalCount=5` veriyordu, W4B ile **3** → CAN yokken `door_state`+`parking_brake` artık HAL'e aktarılmıyor (resetCanData'nın `false` artığı "gerçek veri" sayılmıyor). 🟢 Boot/CPU/RAM regresyonu YOK (aynı cihaz durumunda A/B): baseline (main eşdeğeri) cold start 3026/3014/3014 ms · CPU 0-26% · RSS 360-365 MB → W4B 3017/3012/3010 ms · CPU 3-28% · RSS ~332 MB. 🟢 Crash/ANR yok (3 cold start + background/foreground + rapor gönderimi). **HÂLÂ DOĞRULANMADI (bu yüzden 🔴): gerçek CAN/OBD kopar-bağla senaryosu** (supported→unsupported geçişi, fallback, reconnect, tek-emit) — **araç/OBD gerektirir**; ve **low-tier cihaz (K24/Mali-400 veya T507) doğrulaması yapılmadı.** | 2026-07-12 |
| 52 | **🔴 Device Validation Pending — Platform Runtime Diagnostics (W4E, kalıcı bounded teşhis yüzeyi)** — Event Bus + Vehicle HAL wiring'in BOUNDED durum sayaçları mevcut kullanıcı-tetikli teşhis raporuna (`triggerSupportSnapshot` → `reportSupportSnapshot` → `_buildSupportSnapshotPayload` → `_deepSanitize` → `pushVehicleEvent('support_snapshot')` → /admin/tani) **kalıcı** olarak eklendi. **AMAÇ:** "tek instance / tek abonelik / event sayacı" invaryantları cihazda **ADB, CDP veya geçici debug expose OLMADAN** okunabilsin (T507 gibi PC-adb'siz cihazların TEK ölçüm kanalı). **KULLANILAN API'ler (yalnız mevcut, salt-okunur):** `getEventBusStatus()` ve `getVehicleHalWiringStatus()`. **WHITELIST — Event Bus:** present · disposed · publishedCount · deliveredCount · droppedCount · listenerErrorCount · duplicateSubscriptionCount · recursionDropCount · activeListenerCount · retainedEventCount · historyCount · lastEventAt · runtimeStartedPublished · runtimeStoppedPublished. **HAL wiring:** started · lastRefreshAt · refreshCount · ingestedSignalCount · activeSubscriptionCount · lastErrorCode (SABİT kod: init_failed/cleanup_failed; serbest metin/stack REDDEDİLİR). **`disposed` HAL wiring status'ünde YOK → uydurulmadı.** **Bridge bölümü ÜRETİLMEZ** (üretimde bağlı değil, status accessor'ı yok → sahte present/started yerine W4C'ye bırakıldı). **PRIVACY:** runtime status nesnesi ASLA spread edilmez (alan-alan whitelist); event payload · history içeriği · topic detayı · correlation/causation · araç sinyal DEĞERLERİ (hız/RPM) · VIN · fingerprint · koordinat · MAC · CAN frame · ham hex · secret · stack trace **GİRMEZ**; çıktı yalnız sayı/bool/null. **"0" ≠ "ölçülemiyor":** wiring yoksa sayaçlar **null** (0 değil). **FAIL-SOFT:** accessor throw ederse bölüm boş döner ve raporun DİĞER bölümleri üretilmeye devam eder (`_safeSection`); NaN/Infinity → null. **YALIN:** yeni timer/polling YOK · yeni publisher/subscriber/bridge/wiring YOK · runtime instance YARATMAZ (teşhis okuma bus/adapter oluşturmaz) · yeni otomatik/yüksek frekanslı gönderim YOK (kullanıcı tetikli akış korunur) · yeni bağımlılık YOK. | `platform/diagnosticSections.ts` (+`buildPlatformRuntimeSnapshot`), `platform/remoteLogService.ts` (payload'a `platform: _safeSection(...)`), `__tests__/platformRuntimeDiagnostics.test.ts` (yeni, 17 test) | Gerçek cihazda: (1) "Tanı Gönder" raporunda **bounded Event Bus sayaçları** görünüyor; (2) raporda **bounded Vehicle HAL wiring sayaçları** görünüyor (`activeSubscriptionCount=1` → tek abonelik ADB'siz doğrulanabiliyor); (3) raporda **hiçbir event payload'ı veya araç sinyal değeri YOK**; (4) VIN/koordinat/CAN/ham hex/secret YOK; (5) wiring yokken rapor fail-soft (sayaçlar null, rapor yine gönderiliyor); (6) teşhis üretimi yeni runtime instance YARATMIYOR; (7) yeni timer/polling YOK; (8) rapor boyutunda anlamlı şişme YOK (önce/sonra ölçülür); (9) Xiaomi 23090RA98I'de ADB/global expose olmadan sayaçlar okunabiliyor; (10) **T507 veya K24/Mali-400'de mevcut teşhis kanalıyla sayaçlar okunabiliyor** ve rapor gönderimi başarılı, UI donması/ANR yok; (11) CPU/RAM/boot regresyonu YOK. Masaüstü testleriyle 🟢 YAPMA; low-tier cihazda gerçek rapor doğrulanmadan 🔴 kalır. ⚠️ **CİHAZ KANITI (2026-07-12, Xiaomi 23090RA98I — UYGULAMA KODUNA HİÇ ENSTRÜMANTASYON EKLENMEDEN):** 🟢 Cihazda **gerçek "Tanı Gönder" butonu** ile rapor tetiklendi; giden `push_vehicle_event` (support_snapshot) isteğinin GÖVDESİ (CDP Network ile, yalnız gözlem) `platform` bölümünü İÇERİYOR: `eventBus{present:true, publishedCount:1, deliveredCount:0, droppedCount:0, listenerErrorCount:0, duplicateSubscriptionCount:0, recursionDropCount:0, activeListenerCount:0, retainedEventCount:1, historyCount:1, runtimeStartedPublished:true, runtimeStoppedPublished:false}` + `halWiring{started:true, **activeSubscriptionCount:1**, refreshCount:289, ingestedSignalCount:5, lastErrorCode:null}` → **tek bus + tek HAL aboneliği + runtime.started bir kez, ADB/global expose OLMADAN raporda okunabiliyor.** 🟢 Gizlilik: platform bölümünde VIN/koordinat/sinyal değeri/correlation/payload/history izi **YOK** (otomatik tarama: sızıntı izi yok). 🟢 Boyut: platform bölümü **484 bayt**, toplam rapor ~14,2 KB (≈%3,4 → anlamlı şişme yok). 🟢 Kararlılık: 3 cold start (1059/1085/1325 ms) + background/foreground + rapor gönderimi sırasında **crash/ANR YOK**, UI donmadı; idle CPU 25-39% / RSS 577-600 MB (önceki build ile aynı bantta → regresyon yok). **HÂLÂ DOĞRULANMADI (bu yüzden 🔴): low-tier cihaz (T507 veya K24/Mali-400) üzerinde rapor gönderimi ve /admin/tani'de platform sayaçlarının görünmesi DOĞRULANMADI** (T507'de PC-adb yok — bu PR'ın asıl hedef senaryosu); ayrıca alınan raporun admin panelinde görüntülenmesi kullanıcı tarafından teyit edilmeli. | 2026-07-12 |
Expand Down
Loading
Loading