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 |
|---|---------|--------|------------------------------------------|---------|
| 63 | **🔴 Device Validation Pending — Tanı Raporu Sanitize Sertleştirme (Diagnostics PR-2)** — PR-1'in (#80) açtığı denetimde ortaya çıkan ÜÇ sanitize boşluğu kapatıldı. **(1) `selfTest` bölümü sanitize'ı TAMAMEN atlıyordu:** `reportSelfTestSnapshot` raporu ham spread ediyordu (`{...base, selfTest}`) → deny-list, VIN/MAC/koordinat/api_key maskeleri ve derinlik tavanı bu bölüme UYGULANMIYORDU. Prob `detail` alanları SERBEST METİN taşır: ham `Error.message` (`selfTestEngine` runProbe catch), ham fetch hata metni (probeBackend) ve stack karesi/dosya yolu (probeIdleRenderLoop) → **maskesiz kanal**. Artık inspector ile AYNI kapıdan geçer: yeni `_sanitizeSection()` (tek kapı — yeni bölüm eklenince sanitize'ı atlamak imkânsız). Teşhis değeri KAYBOLMAZ: stack karesi (`FullMapView.tsx:814`) okunur kalır, yalnız VIN/MAC/koordinat/anahtar maskelenir. **(2) `DENY_KEYS` camelCase'e KÖRDÜ:** eşleşme `key.toLowerCase()` idi, set'te `'api_key'` vardı → `apiKey`.toLowerCase() = `'apikey'` ≠ `'api_key'` → **SIZIYORDU**. Anahtar artık NORMALİZE edilir (küçült + alfanümerik olmayanı at) ve **TAM EŞLEŞME** yapılır. Liste genişledi: `apikey · accesstoken · refreshtoken · authorization · bearer · secret · password · jwt · token · email` (+ mevcut konum/VIN/MAC/telefon). **⚠️ TAM eşleşme ZORUNLU — substring/prefix YASAK:** `lat` substring olsaydı `platform` (W4E runtime teşhis bölümünün TAMAMI) ve `detectedPlatform` düşerdi; `vin` prefix olsaydı `vinMasked` (VIN sızıntısını ÖNLEMEK için üretilen maskeli türev) silinirdi → koruma raporu boşaltırdı. False-positive taraması: 14 üretici dosyada 326 benzersiz anahtar tarandı, **meşru alan düşmüyor**. **(3) Cycle guard YOKTU:** özyinelemeyi sınırlayan tek şey MAX_DEPTH'ti. Eklenen guard **ANCESTOR-PATH** desenidir (girerken ekle, `finally` ile çıkarken sil) — naif "görülen nesneler" seti PAYLAŞILAN REFERANSI (aynı nesne iki KARDEŞ dalda = DAG) cycle sanıp ikinci dalı sessizce boşaltırdı (DTC `[null,null]` ile aynı sınıf sessiz kayıp). Cycle → `[CYCLE]` işareti (sessiz kayıp DEĞİL, görünür); dizi elemanıysa ELENMEZ (uzunluk korunur). **Public API artık THROW ETMEZ:** getter/Proxy patlarsa yalnız o DÜĞÜM `[UNREADABLE]` olur, kardeş alanlar akar (`_safeSection`'ın düğüm-bazlı karşılığı) → tek zehirli alan TÜM tanı raporunu öldüremez. **DEĞİŞMEYEN (bilinçli):** MAX_DEPTH=6 · MAX_ARRAY_LEN=20 · MAX_STR_LEN=2048 · mevcut MASKS (VIN/MAC/COORD/api_key=/token=) · UI · RPC · DB/migration · rıza · teslimat modeli (`'sent'` yalanı AYRI PR). **HOST-DOĞRULANDI:** 17 yeni davranış kilidi + 4 kaynak-metin kilidi (regresyon kasası; PR-1'in dizi kilidi kaldırılmadı, yeni doğru davranışa GÜNCELLENDİ), tam suite **3711 yeşil (206 dosya)**, tsc temiz, lint 0 error, build OK. **BYTE ÖLÇÜMÜ (en zengin fixture, aynı test, önce/sonra):** `self_test` **5157 B → 5119 B (−38 B)** — sanitize maskeleme sonrası hafif KÜÇÜLDÜ, şişme YOK; `dev_inspector` **5479 B → 5479 B (0)** — inspector zaten aynı kapıdan geçiyordu. | `platform/remoteLogService.ts` (`_normalizeKey` + genişletilmiş DENY_KEYS + ancestor-path cycle guard + düğüm-bazlı fail-soft + `_sanitizeSection` tek kapı; `reportSelfTestSnapshot` + `reportDiagnosticSnapshot` onu kullanır), `__tests__/diagnosticSanitizeHardening.test.ts` (yeni, 17 test), `__tests__/regression.guards.test.ts` (4 kilit; dizi kilidi güncellendi) | Gerçek cihazda: (1) **"Tanı Robotu" (self-test) raporu gönderiliyor** ve gövdesinde `selfTest.results[].detail` alanları MEVCUT (bölüm kaybolmadı, sanitize onu boşaltmadı); (2) `selfTest.summary`/`worst`/`env` dolu ve `results.length` = summary toplamı (MAX_ARRAY_LEN=20 kırpması YOK — bugün 14 prob, 6 pay var); (3) gerçek self-test raporunda **ham `Error.message`/fetch hata metni içinde VIN/MAC/koordinat/anahtar İZİ YOK**, maskeler (`[VIN]`/`[MAC]`/`[COORD]`/`api_key=[MASKED]`) görünüyorsa doğru çalışıyor; (4) `platform` (Event Bus/HAL sayaçları) ve `vidMirror.vehicle.vinMasked` bölümleri raporda **HÂLÂ VAR** (yeni deny listesi meşru alanları düşürmedi — TAM eşleşme kanıtı); (5) `triage` mevcut ve `ruleErrors=0`; (6) DTC varken `obdDeep.dtc.codes[0].code` dolu (PR-1 kazanımı bozulmadı); (7) raporda `[CYCLE]`/`[UNREADABLE]` işareti **görünmüyor** (üretimde dairesel/zehirli düğüm yok — görünürse üretici tarafta bug var demektir, teşhis edilir); (8) rapor gövdesinde `truncated` alanı YOK ve `octet_length` < 45 KB; (9) low-tier cihazda (K24/Mali-400 veya T507) self-test raporu gönderimi başarılı, ANR/donma yok; (10) Xiaomi'de CPU/RAM/boot regresyonu yok. **Gerçek cihazda self-test raporu görülmeden 🟢 YAPMA** — host testleri kodu kanıtlar, sahadaki gerçek `detail` metinlerini kanıtlamaz. | 2026-07-13 |
| 62 | **🔴 Device Validation Pending — Tanı Raporu DTC Derinliği + Triyaj Null-Guard (Diagnostics PR-1)** — Denetimin (2026-07-12) KANITLI iki P0'ı kapatıldı. **(1) DTC kodları kabloda `null` gidiyordu:** `remoteLogService._deepSanitize` derinlik ≥ `MAX_DEPTH` olan KABI düşürür; gövde `depth=0` ile çağrıldığı için zincir `root(0)→obdDeep(1)→dtc(2)→codes[](3)→kod nesnesi(4)` **derinlik 4'te ölüyordu** → `codes:[null,null]`. Aynı derinlikteki `obdDeep.extended.samples[]` (katalog-dışı PID keşfi), `uiActivity.recent[].reasons[]`, `inspector.timeline[].signals/env` ve `inspector.runtime.workers[]` de düşüyordu. **`MAX_DEPTH` 4 → 6 (ÖLÇÜLMÜŞ, keyfi değil):** payload gövdesinin tüm bölümleri tarandı, en derin **kap** derinlik 4'te → 5 = minimum yeterli; 6 seçildi çünkü `sanitizeForRemote` ve inspector girişleri `depth=1`'den başlıyor (bir seviye pay) ve ölçülen payload'da derinlik ≥5'te KAP OLMADIĞI için **bugün 0 ek bayt** akıtır. Sanitize dizi dalı artık düşen elemanı **ELER** (`.map` ile yerinde bırakılan `undefined` JSON'da `null` oluyordu — sessiz "kod var ama boş" yalanı). **(2) DTC varken TRİYAJ TAMAMEN kayboluyordu:** `ruleObdDtc` null-guard'sız `c.code` okuyordu → TypeError → `buildTriageSnapshot` döngüsü kırılıyor → `_attachTriage`'ın yutucu catch'i `payload.triage`'ı HİÇ yazmıyor → admin **arızanın olduğu tam anda** "kritik bulgu yok" görüyordu (13 kuralın HEPSİ birden susuyordu: termal/bellek/güç/GPS/self-test dahil). Kural null-guard'landı (`dtc.count` "arıza var" kanıtıdır; kod METNİ yalnız zenginleştirme → liste boş/bozuk olsa da bulgu ÜRETİLİR) **+ motor seviyesinde KURAL İZOLASYONU** (bir kural patlarsa yalnız o kural düşer, diğerleri çalışır) **+ `ruleErrors` sayacı** (izolasyon sessiz olmasın — triyaj eksik çalıştıysa raporda görünür). **DEĞİŞMEYEN (bilinçli):** redaction/allowlist/deny-list/maskeler · `MAX_ARRAY_LEN`/`MAX_STR_LEN` · UI · RPC · DB/migration · rıza/önizleme · teslimat modeli (`'sent'` yalanı **PR-2'ye** bırakıldı). **HOST-DOĞRULANDI:** 13 yeni kilit yeşil (9 davranış + 4 kaynak-metin regresyon kasası), tam suite **3690 yeşil (205 dosya)**, tsc temiz, lint 0 error, build OK. **BYTE ÖLÇÜMÜ (en zengin fixture, aynı test, önce/sonra):** `support_snapshot` **3163 B → 4045 B (+882 B, +%27,9)** · `dev_inspector` **3747 B → 5480 B (+1733 B, +%46,3)** → ikisi de canlı sunucu tavanının (**64 KB**, migration 027) çok altında. | `platform/remoteLogService.ts` (MAX_DEPTH 4→6 + dizi dalı undefined filtresi), `platform/diagnosticTriage.ts` (ruleObdDtc null-guard + kural izolasyonu + `ruleErrors`), `__tests__/diagnosticDtcDepthTriage.test.ts` (yeni, 9 test), `__tests__/regression.guards.test.ts` (4 kaynak-metin kilidi) | **Gerçek araçta, DTC VARKEN** (arıza lambası yanan / kasıtlı DTC üretilmiş araç) gönderilen `support_snapshot` gövdesinde: (1) `obdDeep.dtc.codes[0].code` **dolu string** (`null` DEĞİL) ve `severity`/`system` dolu; (2) `codes` dizisinde **hiç `null` eleman yok**; (3) `payload.triage` **MEVCUT** ve `findings` içinde **`OBD_DTC_PRESENT`** bulgusu var (kritik DTC varsa `severity:'critical'`); (4) `triage.ruleErrors = 0`; (5) DTC varken diğer triyaj bulguları (termal/güç/GPS) **da** üretilmeye devam ediyor; (6) `obdDeep.extended.samples[0].pid` dolu (katalog-dışı PID keşfi artık sunucuya ulaşıyor); (7) Dev Inspector raporunda `inspector.timeline[0].signals.spd/rpm` **dolu**; (8) raporda VIN/MAC/koordinat/secret **YOK** (maskeler delinmedi); (9) gerçek rapor gövdesi **`truncated` alanı taşımıyor** ve `octet_length` < 45 KB (64 KB tavanı aşılırsa sunucu gövdeyi `{truncated:true}` kabuğuyla DEĞİŞTİRİR = %100 sessiz kayıp, üstelik UI yine "gönderildi" der — PR-2 konusu); (10) low-tier cihazda (K24/Mali-400 veya T507) rapor gönderimi başarılı, ANR/donma yok. **Araç + DTC olmadan 🟢 YAPMA** — host testleri kodu kanıtlar, gerçek DTC akışını kanıtlamaz. | 2026-07-13 |
| 60 | **🔴 Device Validation Pending — Deep Scan Runtime Ownership Wiring (W5-1)** — Deep Scan foundation singleton'ları (runtime/persistence/ignition, PASİF idi) İLK kez üretim yaşam döngüsüne bağlandı: yeni `platformCoreDeepScanWiring` bir `DeepScanOrchestrator`'ı DI fabrikasıyla (`createDeepScanOrchestrator`, HANDLER YOK) OLUŞTURUR ve SAHİPLENİR; paylaşılan runtime/persistence/ignition singleton'larını yalnız REFERANS alır. SystemBoot Wave 2'de Capability bridge'den SONRA, SystemOrchestrator'dan ÖNCE additive `_reg` (LIFO: orchestrator önce dispose; paylaşılan singleton'lar DISPOSE EDİLMEZ). **YALNIZ OWNERSHIP:** `start()`/`run()`/`runNextPhase()` ÇAĞRILMAZ → tarama başlamaz, faz yürümez, aktif ECU/PID/DID sorgusu YOK. Event Bus publish/Capability güncelleme/Assistant/handler/native/OBD/CAN/SQL/UI — HİÇBİRİ. **FAIL-CLOSED:** ignition kaynağı yok → `ignitionConfirmed=null` (RPM/voltaj/OBD'den kontak ÇIKARSANMAZ); aktif fazlar ileride tarama başlatılırsa `waiting_for_ignition`'da bloke. Bounded immutable status (present/started/runtimeState/scanState/ignitionConfirmed/mode/currentPhase/progress/warningCount/hasHandlers=false/activeHandlerCount=0/lastErrorCode/lastTransitionAt — VIN/koordinat/ham CAN-OBD/secret YOK). Tek-instance guard; import yan etkisiz; timer/polling/run-loop YOK → pasif steady-state CPU≈0. **HOST-DOĞRULANDI:** 38 yeni test yeşil; deep scan foundation kilidi W5-1'e GÜNCELLENDİ (SystemBoot ownership bağlar ama tarama başlatmaz — CLAUDE.md regresyon-kasası: kaldırılmadı, güncellendi); tam suite 3677 yeşil (204 dosya), tsc temiz, lint 0 error, build OK. | `platform/system/platformCoreDeepScanWiring.ts` (yeni), `platform/system/SystemBoot.ts` (Wave 2 kayıt), `__tests__/platformCoreDeepScanWiring.test.ts` (yeni, 38 test), `__tests__/deepScanRuntimeService.test.ts` (foundation kilidi güncellendi) | Gerçek cihazda (Xiaomi 23090RA98I + en az bir low-tier K24/Mali-400/T507): (1) boot'ta TEK orchestrator instance (`getDeepScanWiringStatus().present=true`, duplicate boot çoğaltmıyor); (2) runtime/persistence/ignition doğru bağlanıyor; (3) **scan otomatik BAŞLAMIYOR** (`scanState=idle`, `runtimeState=idle`, progress=0); (4) **aktif araç sorgusu ÜRETİLMİYOR** (OBD/CAN trafiğinde deep-scan kaynaklı ECU/PID/DID isteği YOK); (5) `ignitionConfirmed=null` fail-closed kalıyor; (6) shutdown sonrası leak yok (orchestrator disposed, paylaşılan singleton'lar ayakta); (7) Xiaomi'de boot/CPU/RAM regresyonu yok (boot delta <20ms hedefi); (8) **Mali-400/K24'te steady-state ek yük ölçüm gürültüsü seviyesinde** (timer/polling yok → ≈0); (9) W5-2 Event Bus bridge, W5-3 offline run, W5-4 capability evidence, W5-5 aktif discovery AYRI PR olarak kalıyor. Cihaz kanıtı olmadan 🟢 YAPMA. ⚠️ Not: `getDeepScanWiringStatus` henüz teşhis raporuna EKLENMEDİ → ADB'siz okumak için küçük teşhis PR'ı gerekir. | 2026-07-12 |
| 59 | **🔴 Device Validation Pending — Capability → Event Bus Bridge Runtime Wiring (W4)** — Mevcut `CapabilityEventBridge` foundation'ı (PR #54) İLK kez gerçek `capabilityRegistry` singleton'ına ve W3'ün TEK aktif `appEventBus`'ına bağlandı (W4C'nin Vehicle HAL eşleniği). Zincir: `capabilityRegistry` → `CapabilityEventBridge` → `getAppEventBus()`. SystemBoot Wave 2'de Capability Registry wiring'inden SONRA additive `_reg` kaydı (LIFO: bridge önce, registry/bus sonra dispose; savunmacı try/catch fail-soft). **YAYINLANAN EVENT'LER:** `capability.record.registered/changed/removed` + `capability.snapshot.changed` (RETAINED, küçük payload {revision, sayımlar, changedIds bounded} — full registry TAŞINMAZ). İmza-dedup (aynı record → event yok); domain=`capability`, source=`capability_registry`. İKİNCİ bus YARATILMAZ (getAppEventBus tüketilir). Deep Scan/Driver DNA/Prediction/Assistant Context/Kernel/tüketici migrasyonu YOK; bus'a ABONE YOK; yeni timer/polling YOK; throttle YOK (capability değişimleri NADİR → hot-path yok, Mali-400 riski YOK); import yan etkisiz; tek-instance guard; Registry+Bus PAYLAŞILAN → cleanup dispose ETMEZ. **HOST-DOĞRULANDI:** 36 yeni test yeşil, tam suite 3639 yeşil (203 dosya), tsc temiz, lint 0 error, build OK. | `platform/system/platformCoreCapabilityBridgeWiring.ts` (yeni), `platform/system/SystemBoot.ts` (Wave 2 kayıt), `__tests__/platformCoreCapabilityBridgeWiring.test.ts` (yeni, 36 test) | Gerçek cihazda (Xiaomi 23090RA98I + en az bir low-tier K24/Mali-400/T507): (1) boot'ta TEK Event Bus instance (`getEventBusStatus().present=true`, duplicate yok); (2) HAL + Capability bridge'leri TEK kez başlıyor (`getCapabilityBridgeStatus().started=true`, `getVehicleHalBridgeStatus().started=true`); (3) capability değişimleri doğru event'lerle ulaşıyor (`capability.snapshot.changed` retained); (4) kaynak olmayan capability için sahte available/event YOK; (5) 3 Hz HAL sinyalleri history/RAM şişirmiyor (`vehicle.signal.changed` transient — W4C davranışı korunur); (6) background/foreground sonrası bridge subscription çoğalmıyor; (7) Xiaomi'de CPU/RAM regresyonu yok; (8) **Mali-400/K24 event CPU bütçesi <%2**; (9) Deep Scan/Driver DNA/Prediction/Assistant Context ayrı PR olarak kalıyor. Cihaz kanıtı olmadan 🟢 YAPMA. ⚠️ Not: bridge sayaçları (`getCapabilityBridgeStatus`) henüz teşhis raporuna EKLENMEDİ → ADB'siz okumak için küçük teşhis PR'ı gerekir. | 2026-07-12 |
Expand Down
Loading
Loading