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 |
|---|---------|--------|------------------------------------------|---------|
| 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 |
| 51 | **🔴 Device Validation Pending — Vehicle HAL Provider Adapter Batch Ingest (W4A, perf)** — Adapter tek `refresh()` içinde değişen TÜM sinyalleri artık **tek `hal.ingest(batch)`** ile veriyor. **KÖK PROBLEM:** eskiden sinyal başına `hal.ingestSignal()` çağrılıyordu; `VehicleHal.ingestSignal` her değişimde revision artırıp **15 sinyallik tam snapshot** üretiyor (kopya + sort + freeze) ve abonelere emit ediyordu → tek store tick'inde **N değişim = N emit + N snapshot**; CAN yolu tek `updateCanExtras` çağrısında 10'a kadar HAL sinyalini birlikte değiştirebiliyor (worker yoluyla toplam 14). **YENİ:** N değişim = **1 ingest = 1 emit**. **KORUNAN:** 14 eşleme ve SIGNAL_MAP sırası · ignition eşlenmez · TPMS yalnız gerçek 4-tuple · source/quality/confidence · refresh başına ORTAK timestamp · değer normalizasyonu · duplicate ingest yok · start/stop/dispose idempotency · abonelik sayısı · cleanup · fail-soft · bounded `_last` · timer/polling YOK · HAL sahipliği adapter'a GEÇMEZ. **DEDUPE ATOMİKLİĞİ:** `_last` YALNIZ başarılı `ingest()` sonrası güncellenir — `VehicleHal.ingest()` sinyal-bazlı catch İÇERMEZ (tümden throw edebilir), bu yüzden batch düşerse sinyaller "aktarılmış" sayılmaz ve sonraki refresh yeniden dener (HAL idempotent: aynı değer → değişim yok → emit yok). **BİLİNÇLİ DAVRANIŞ FARKLARI:** (1) HAL `revision` sinyal başına değil **batch başına 1** artar; (2) HAL aboneleri **ara/kısmi snapshot görmez**, yalnız nihai tutarlı snapshot'ı görür; (3) yayınlanan nihai sinyal kümesi + değerler + metadata DEĞİŞMEZ; (4) üretimde HAL snapshot/revision tüketicisi olmadığı için **kullanıcı-gözlemlenebilir davranış değişmez**. **KAPSAM DIŞI:** Event Bus bridge wiring (W4C) · stale/ disconnect semantiği (W4B) · throttle/coalescing (W4D) · kalıcı teşhis yüzeyi (W4E). Bu PR bridge'i BAĞLAMAZ — W4C'nin performans ÖN KOŞULUDUR. | `platform/vehicleHal/vehicleHalProviderAdapter.ts` (refresh + `VehicleHalIngestTarget` sözleşmesi `ingest`'e geçti), `__tests__/vehicleHalBatchIngest.test.ts` (yeni, 24 test), `__tests__/vehicleHalProviderAdapter.test.ts` · `platformCoreVehicleHalWiring.test.ts` · `unifiedVehicleStoreProvider.test.ts` (fake HAL'ler yeni sözleşmeye güncellendi) | Gerçek cihazda: (1) tek refresh içindeki N değişiklik **yalnız 1 HAL emit** üretir (deterministik sayaçla; testte kilitli, cihazda gerçek CAN tick'i ile doğrulanmalı); (2) nihai HAL snapshot sinyal kümesi ve değerleri değişmedi; (3) source/quality/confidence/timestamp korunuyor; (4) duplicate ingest davranışı korunuyor; (5) **gerçek araçta emit amplifikasyonunun azaldığı sayaçla ölçülür** (çok-sinyalli CAN tick'i araç/OBD olmadan üretilemez); (6) Xiaomi 23090RA98I'de CPU/RAM/FPS regresyonu YOK; (7) **en az bir low-tier cihazda (tercihen K24/Mali-400) CPU/RAM/FPS regresyonu YOK**; (8) boot süresi regresyonu YOK; (9) Event Bus bridge hâlâ BAĞLI DEĞİL. Test edilmeden 🟢 yapma. ⚠️ **KISMİ CİHAZ KANITI (2026-07-12, Xiaomi 23090RA98I — ARAÇ/OBD YOK; geçici, commit-EDİLMEYEN bounded sayaç + CDP-over-adb, ölçüm sonrası kaldırıldı ve temiz ağaçtan yeniden build/kurulum yapıldı):** 🟢 boot crash/ANR YOK (3 cold start + background/foreground); cold start WaitTime baseline (main, W4A yok) 1218/1060/1041 ms → W4A 1082/1035/1138 ms (**boot regresyonu YOK**); idle CPU baseline 109/62/58% → W4A 23/30/26% ve RSS 572-622 MB → 559-570 MB (⚠️ **her iki ölçüm de gürültülü; W4A lehine kesin iyileşme İDDİA EDİLMİYOR**, yalnız regresyon yok). 🟢 Adapter/HAL sayaçları (30 sn, park, yalnız GPS akışı): `subs=1 · refreshCount≈56 (~1.9 store update/sn) · emits=23 (~0.77 HAL emit/sn) · ingestedSignals=5 · maxBatchDelta=5` → **emit sayısı refresh sayısından KÜÇÜK** (değişiklik yoksa ingest/emit yok) ve tek abonelik korunuyor. **HÂLÂ DOĞRULANMADI (bu yüzden 🔴):** park hâlinde tick başına genelde TEK sinyal değiştiği için **N→1 emit azalması cihazda GÖSTERİLEMEDİ** — çok-sinyalli gerçek CAN tick'i **araç/OBD gerektirir**; ayrıca **low-tier cihaz (K24/Mali-400 veya T507) ölçümü YAPILMADI** ve uzun-süreli CPU/termal ölçülmedi. | 2026-07-12 |
Expand Down
Loading
Loading