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 |
|---|---------|--------|------------------------------------------|---------|
| 40 | **🔴 Device Validation Pending — Orientation Sensor Subscription Gate Foundation (PR 1/3)** — Cihaz yön/hareket Web event'leri (`deviceorientationabsolute`/`deviceorientation`/`devicemotion`) için MERKEZİ, ref-count'lu abonelik kapısı (multiplexer). Bugün bu event'lere ≥6 servis (gpsService compass, smartDrivingEngine, arAlignmentService, dashcamService, blackBoxService, deviceApi) AYRI `addEventListener` ile abone; ikisi (compass + accelerometer) kök layout'ta app-ömrü bağlı → Ayarlar dahil her ekranda sensör aktif (QA: `dumpsys sensorservice` samplingPeriod 16.67ms=60Hz, SensorsHandlerThread ~%24 + CrRendererMain ~%21). Kapı: **event türü başına TEK fiziksel window listener** (dedup); callback Set ile ref-count (ilk consumer→bağla, son→sök); `visibilityState!=='visible'`→fiziksel listener sökülür, görünür+aktif consumer→yeniden bağlanır; deterministik fan-out (insertion order, kararlı dizi snapshot'ı); **event başına YENİ array/object allocation YOK** (index'li döngü); callback exception İZOLE (fail-soft, diğerleri sürer); public API throw ETMEZ; bounded (kanal başı 64, aşım fail-soft no-op+droppedCount); dispose zero-leak + sonrası güvenli no-op; reset yeniden kullanılabilir. API: subscribeOrientationAbsolute/subscribeOrientation/subscribeMotion (idempotent release), getSubscriberCounts, getStatus, reset, dispose. **YALIN:** HİÇ import YOK (tam bağımsız→import yan etkisiz); modül seviyesinde listener kurulmaz (ilk abonelikte `visibilitychange` bağlanır); timer/rAF/polling YOK; Generic Sensor API YOK; JS throttle YOK; permission tüketicide kalır. ⚠️ **KAPSAM: foundation — HİÇBİR tüketici bu kapıya bağlanmadı (wiring YOK).** ⚠️ **Bu PR tek başına CPU veya samplingPeriod DÜŞÜRMEZ.** Gerçek kazanım PR 2 (on-demand tüketiciler) ve özellikle PR 3 (always-on compass + smartDriving talep-güdümlü acquire + background pause) wiring'inden SONRA ölçülebilir. **Legacy event API aktifken native sampling 60 Hz OLABİLİR** (frekans parametresi yok — kanıt: gpsService zaten JS'te 10Hz throttle'lı ama dumpsys 60Hz). | `platform/sensors/orientationSensorGate.ts` (yeni), `platform/sensors/index.ts` (yeni), `__tests__/orientationSensorGate.test.ts` (yeni, 30 test), `__tests__/regression.guards.test.ts` (gate zero-leak + bağımsızlık kilidi) | Gerçek cihazda (tüketici wiring PR 2/3 bağlandıktan SONRA): (1) Ayarlar ekranında `dumpsys sensorservice` altında CockpitOS için orientation/motion 60 Hz kaydı kalmaması; (2) background'da (visibility hidden) sensör kaydı kalmaması; (3) harita/navigation açılınca sensörün yeniden çalışması; (4) heading/pusula davranışının korunması; (5) duplicate listener ve cleanup sızıntısı olmaması; (6) idle CPU'nun (SensorsHandlerThread + CrRendererMain) Ayarlar ve background senaryolarında belirgin düşmesi; (7) BASIC_JS/Mali-400'de regresyon olmaması. ⚠️ **PR 1 tek başına ölçülebilir kazanç VERMEZ — foundation. Mali-400 cihaz doğrulaması bekliyor.** Test edilmeden 🟢 yapma. | 2026-07-11 |
| 39 | **🔴 Device Validation Pending — Platform Core Event Bridge Foundation** — Vehicle HAL ve Capability Registry'deki GERÇEK değişiklikleri tip-güvenli, bounded, SALT-OKUNUR biçimde Platform Event Bus'a aktaran İKİ köprü. **Vehicle:** `createVehicleHalEventBridge({hal,bus})` — HAL `subscribe` TAM snapshot verir (per-signal delta yok); köprü snapshot'ı kendi son-değer haritasıyla DIFF'leyip yalnız değişen supported sinyalleri yayınlar. `vehicle.signal.changed` **TRANSIENT** (history dışı, küçük payload: signalId/value özeti/quality/confidence/source/stale/supported/timestamp; **full HAL snapshot/raw CAN TAŞINMAZ**; O(1) dedup, hot-path allocation yok). `vehicle.ignition.changed` (retained) yalnız ignition supported+boolean değişince — **foundation'da ignition kaynağı YOK→supported=false→ASLA yayınlanmaz**. `vehicle.connection.changed` (retained) "en az bir supported sinyal" geçişinde (HAL'e dayalı gerçek olgu; veri yoksa false→SESSİZ). `vehicle.identity.changed` (retained) yalnız identity.supported (fingerprint) değişince (ham fingerprint yalnız metadata, payloadta DEĞİL). `vehicle.health.changed` YAYINLANMAZ (HAL'de health kaynağı yok→uydurulmaz). **Capability:** `createCapabilityEventBridge({registry,bus})` — Registry change event yalnız `{type,id,revision,at}` verir; köprü record'u `getCapability(id)` ile çeker. `capability.record.registered/changed/removed` (changed imza-dedup: aynıysa event yok); `capability.snapshot.changed` **RETAINED, küçük payload** {revision, counts, changedIds(bounded)} — **full registry TAŞINMAZ**; sayımlar start'ta BİR KEZ `createSnapshot()` ile tohumlanır, sonra INCREMENTAL O(1) (**değişiklik başına snapshot allocation YOK**); record payload whitelist (id/domain/status/available/quality/confidence/source/stale/reason/limitations bounded, Registry'ce zaten sanitize). **Ortak:** start/stop/dispose İDEMPOTENT; tek abonelik; **kaynakların SAHİBİ DEĞİL→dispose HAL/Registry/Bus'ı dispose ETMEZ**; dispose sonrası callback no-op; publishedCount/droppedCount (Bus reddi/publish hatası→droppedCount, kaynak servis etkilenmez); fail-soft (HAL/Registry subscribe hatası, tek bozuk signal/record izole, public API throw etmez); privacy (VIN/MAC/koordinat/ham CAN/anahtar event'e girmez); immutable payload; katalog event isimleri; HAL/Registry/Bus'ı DOĞRUDAN import ETMEZ (yalnız TYPE→import yan etkisiz); **timer/polling YOK, yeni bağımlılık YOK, global singleton YOK**. Güvenlik KARARI üretmez (yalnız taşır); Event Bus recursion/priority/bounded kuralları DEĞİŞMEZ. **SystemBoot wiring · provider adapter auto-start · Platform Kernel wiring YOK — AYRI PR.** | `platform/eventBus/bridges/vehicleHalEventBridge.ts` (yeni), `platform/eventBus/bridges/capabilityEventBridge.ts` (yeni), `platform/eventBus/bridges/index.ts` (yeni), `platform/eventBus/index.ts` (export), `__tests__/vehicleHalEventBridge.test.ts` (yeni, ~24 test), `__tests__/capabilityEventBridge.test.ts` (yeni, ~24 test) | Gerçek cihazda (SystemBoot/Platform Kernel wiring PR'ı köprüleri gerçek HAL/Registry/Bus'a bağladıktan SONRA): (1) gerçek araç sinyal değişiklikleri Event Bus'a **duplicate olmadan** ulaşıyor; (2) 3 Hz sinyaller (vehicle.signal.changed transient) history/RAM ŞİŞİRMİYOR; (3) capability değişiklikleri doğru event'lerle (registered/changed/removed/snapshot) yayınlanıyor; (4) kaynağı olmayan ignition/connection event'i UYDURULMUYOR (foundation'da sessiz); (5) listener/publish hatası HAL veya Registry'yi ETKİLEMİYOR (droppedCount artar); (6) stop/dispose sonrası abonelik sızıntısı yok; (7) BASIC_JS/Mali-400'de CPU/FPS regresyonu yok (O(1) dedup, timer yok, full snapshot allocation yok, pasifken sıfır yük). ⚠️ **SystemBoot/Platform Kernel wiring AYRI PR.** Test edilmeden 🟢 yapma. | 2026-07-11 |
| 38 | **🔴 Device Validation Pending — Platform Core Real Providers Foundation** — Vehicle HAL Provider Adapter ve Capability Provider Adapter için İLK gerçek, SALT-OKUNUR provider implementasyonları. **Vehicle:** `createUnifiedVehicleStoreProvider({store})` mevcut `useUnifiedVehicleStore`'u (fused worker/CAN/OBD/GPS) adapter'ın `VehicleStoreSource`'ına (getSnapshot/subscribe) uyarlar — store SALT-OKUNUR, her snapshot YENİ dondurulmuş alt-küme (speed/rpm/fuel/odometer/reverse + CAN extras), `rpm undefined→null`, **TPMS yalnız gerçek 4-elemanlı numerik veri varsa**, **ignition EXPOSE EDİLMEZ** (kaynak yok), metadata UYDURULMAZ; store DOĞRUDAN import EDİLMEZ (yapısal DI→import yan etkisiz); provider oluşturulmadan abone OLMAZ; subscribe idempotent unsub + dispose zero-leak. **Capability:** `createRuntimeCapabilityProviders({env,probes})` yalnız KANITLANABİLİR provider üretir. **Kanıt sınıfı:** browser-API presence (geolocation/mediaDevices/bluetooth) → `degraded`/düşük conf (donanım KESİNLEŞMEZ), API yok→unknown; `navigator.connection.type` kesin wifi/cellular→available, aksi unknown; mikrofon izin granted olmadıkça available DEĞİL (denied→restricted); native secure storage authoritative→available/yüksek conf; modül runtime (deep_scan/vehicle_learning/assistant_context/ota/safety_kernel/offline_commands/offline_conversation/push/cloud_commands): **modül var ama runtime bağlı değil→degraded/experimental**, runtime hazır→available, yok→unknown; AI BYOK (gemini/groq/claude/cloud): configured+usable→available, configured→degraded, değil→unavailable; offline map/routing gerçek paket/graf yoksa→unavailable. **KAYNAK YOK:** `ai.grok`(xAI entegrasyonu yok→provider HİÇ ÜRETİLMEZ), `ai.local_model`(gerçek yerel LLM yok→yalnız high-tier+probe, low/mid'de OLUŞTURULMAZ). **Runtime readiness ≠ module existence** (dosya/export var tek başına available DEĞİL). Fabrikalar DI; **global singleton YOK**; probe/navigator yalnız `read()`'te (fabrika yan etkisiz); ağır modül IMPORT YOK (yalnız TYPE); timer/polling YOK; her read try/catch (throw etmez); sonuçlar dondurulmuş; privacy (VIN/MAC/anahtar probe payload'ından sızmaz). **SystemBoot wiring · Event Bus publish · Registry auto-start · UI · Assistant Context değişikliği YOK — hepsi AYRI PR.** | `platform/vehicleHal/providers/unifiedVehicleStoreProvider.ts` (yeni), `platform/vehicleHal/providers/index.ts` (yeni), `platform/vehicleHal/index.ts` (export), `platform/capability/providers/runtimeCapabilityProviders.ts` (yeni), `platform/capability/providers/index.ts` (yeni), `platform/capability/index.ts` (export), `__tests__/unifiedVehicleStoreProvider.test.ts` (yeni, ~16 test), `__tests__/runtimeCapabilityProviders.test.ts` (yeni, ~38 test) | Gerçek cihazda (SystemBoot/Registry/HAL wiring PR'ı bağlandıktan SONRA): (1) gerçek araç state'i (hız/RPM/soğutma/yakıt/voltaj) Vehicle HAL Provider Adapter'a doğru aktarılıyor; (2) GPS/Bluetooth/Wi-Fi/cellular capability sonuçları gerçek cihaz API'leriyle uyumlu; (3) izni olmayan özellik (mikrofon) available GÖRÜNMÜYOR; (4) secure storage yalnız gerçek native kanıtla available; (5) Grok/local model/offline map olmayan cihazda available GÖRÜNMÜYOR (grok provider bile yok); (6) provider stop/dispose sonrası subscription sızıntısı yok; (7) BASIC_JS/Mali-400'de CPU/RAM regresyonu yok (fabrika yan etkisiz, timer yok, pasifken sıfır yük). ⚠️ **SystemBoot/Event Bus wiring AYRI PR.** Test edilmeden 🟢 yapma. | 2026-07-11 |
| 37 | **🔴 Device Validation Pending — Capability Provider Adapter Foundation** — Gerçek runtime/cihaz/platform kanıtlarını SALT-OKUNUR biçimde Capability Registry kayıtlarına aktaran provider adapter köprüsü (gerçek kanıt → adapter → Registry). ⚠️ **KOD GERÇEĞİ (salt-okunur analiz):** doğrulanabilir kaynaklar sınırlı — `deviceCapabilities`(WebGL/CSS/SAB/cores browser probe→device/platform) · `vehicleHal.getCapability/hasSignal`(araç sinyali, foundation'da hepsi false) · browser API(gps/mic/bluetooth/storage → yalnız "API var", donanım erişimini KESİNLEŞTİRMEZ) · config/lisans(oem.*/ai-provider BYOK anahtarı). **Runtime kaynağı HİÇ YOK:** `vehicle.ignition`(kontak kaynağı yok)·`ai.grok`(xAI yok)·`navigation.offline_map`(tile paketi yoksa) → unknown/unavailable KALIR. UI/dosya/modül varlığı kanıt DEĞİL. **Adapter:** donanımı DOĞRUDAN taramaz — yalnız DI `providers`'ı okur (foundation'da YERLEŞİK gerçek provider YOK; gerçek prob'lar ayrı wiring PR'ı). **Provider sözleşmesi:** `{id, domain, source, authoritative?, refreshPolicy?, read()}` (read sync/async, kaynak yoksa null). Provider sonucu→Registry evidence'ına normalize→`resolveCapability(id, evidence, domain)` (status'ü REGISTRY çözer — karar kuralları DEĞİŞMEZ). **YALNIZ değişeni günceller** (imza-tabanlı dedup→duplicate Registry update yok, O(1)). **API:** start/refresh/refreshProvider/stop/getStatus/getLastRefreshAt/getProviderResults/reset/dispose. **Refresh:** start'ta ilk refresh + açık çağrı; **steady-state timer/polling YOK**; provider'lar PARALEL (`Promise.allSettled` → biri diğerini bloke etmez); opt-in DI timeout (settle'da temizlenir→leak yok), timeout/hata/null→güvenli **unknown**. **DeviceTier:** varlık uydurmaz — Registry tier engelini uygular (low'da ai.local_model restricted); high tier kanıtsız açmaz. **Fail-soft:** provider throw/Registry update hatası izole, public API throw etmez, dispose sonrası no-op. **Gizlilik:** provider/details/reason sanitize (VIN/MAC/koordinat/secret/API-key sızmaz). **Immutable:** getProviderResults dondurulmuş kopya (nested dahil), girdi mutate edilmez. **YALIN:** Registry'yi DOĞRUDAN import ETMEZ (yapısal DI + type-only import→import yan etkisiz); Event Bus'a yayınlamaz; SystemBoot'a bağlanmaz; persistence/cloud yok; native tarama/OBD-CAN sorgusu yok; yeni bağımlılık yok; provider bounded 128. Registry'nin SAHİBİ DEĞİL→dispose Registry'yi dispose etmez. | `platform/capability/capabilityProviderAdapter.ts` (yeni), `platform/capability/index.ts` (export), `__tests__/capabilityProviderAdapter.test.ts` (yeni, 41 test) | Gerçek cihazda (gerçek provider wiring PR'ı bağlandıktan SONRA): (1) GPS/Bluetooth/Wi-Fi/kamera capability'leri doğru doğrulanıyor (native kanıtla available); (2) donanımı olmayan özellik available GÖRÜNMÜYOR; (3) gerçek kontak kaynağı olmayan cihazda `vehicle.ignition` unknown kalıyor; (4) TPMS kaynağı olmayan araçta available görünmüyor; (5) provider hatası Registry'yi/diğer provider'ları çökertmiyor; (6) aynı kanıt tekrarında duplicate capability update yok; (7) BASIC_JS/Mali-400'de CPU/RAM regresyonu yok (O(1) dedup, timer yok, paralel bounded read). ⚠️ **Gerçek provider implementasyonları · Event Bus · SystemBoot wiring · persistence AYRI PR'lar.** Test edilmeden 🟢 yapma. | 2026-07-11 |
Expand Down
Loading
Loading