Skip to content

feat(sensors): Orientation Sensor Subscription Gate foundation (PR 1/3)#56

Merged
selimmujdeci merged 1 commit into
mainfrom
feat/orientation-sensor-gate
Jul 11, 2026
Merged

feat(sensors): Orientation Sensor Subscription Gate foundation (PR 1/3)#56
selimmujdeci merged 1 commit into
mainfrom
feat/orientation-sensor-gate

Conversation

@selimmujdeci

Copy link
Copy Markdown
Owner

Amaç

Gerçek cihaz profillemesinde kanıtlanan uygulama-geneli 60 Hz cihaz yön/hareket sensörü yükünü azaltmaya yönelik 3-PR'lık sıranın 1. adımı (foundation). Bu PR yalnız merkezi abonelik kapısını (gate) kurar — hiçbir tüketici bağlanmaz.

Kök neden (kanıt)

deviceorientationabsolute / deviceorientation / devicemotion event'lerine ≥6 servis AYRI addEventListener ile abone:

Tüketici Event Always-on?
gpsService compass orientation ×2 🔴 EVET (kök layout)
smartDrivingEngine devicemotion 🔴 EVET (kök layout)
arAlignment / dashcam / blackBox / deviceApi motion/×3 on-demand

İki always-on tüketici her ekranda (Ayarlar dahil) sensörü açık tutuyor → QA: dumpsys sensorservice samplingPeriod 16.67ms=60Hz, SensorsHandlerThread ~%24 + CrRendererMain ~%21.

Bu PR ne yapar

platform/sensors/orientationSensorGate.ts — 3 ham event'in tek sahibi:

  • Event türü başına TEK fiziksel window listener (dedup)
  • Callback Set ile ref-count (ilk consumer→bağla, son→sök)
  • Visibility gate: visibilityState!=='visible'→fiziksel listener sökülür; görünür+aktif consumer→yeniden bağlanır
  • Deterministik fan-out (insertion order); event başına yeni array/object allocation YOK
  • Callback exception izole (fail-soft); public API throw etmez
  • Bounded (kanal başı 64, aşım fail-soft); dispose zero-leak + sonrası no-op; reset yeniden kullanılabilir
  • HİÇ import YOK (bağımsız, import yan etkisiz); timer/rAF/polling YOK; Generic Sensor API YOK; JS throttle YOK; permission tüketicide kalır

⚠️ Kapsam ve dürüst sınırlama

  • 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çülür.
  • Legacy event API aktifken native sampling 60 Hz olabilir — frekans parametresi yok (kanıt: gpsService zaten JS'te 10Hz throttle'lı ama dumpsys 60Hz).
  • Mali-400 cihaz doğrulaması bekliyor (Ledger docs(validation): Renault Trafic saha doğrulama planı (P2-1→P2-5 + PR #11) #40 🔴).

PR 3 predikatları (şimdiden kilitlendi, bu PR'da uygulanmadı)

  • COMPASS: yalnız harita/navigation heading/compass/heading-up gerçekten aktifken acquire; Ayarlar/profil/medya'da acquire etmez; hidden'da kapatır; foreground'da yalnız aktif tüketici varsa açar.
  • SMART DRIVING ACCELEROMETER: sürekli acquire etmez; yalnız Smart Driving aktifken değerlendirilir; Vehicle HAL hız/hareket güvenilir+supported+taze+yeterli confidence ise açılmaz; HAL yok/stale ise güvenilir GPS'e bakılır; o da yok/stale ise accelerometer yardımcı fallback; kaynak dönünce abonelik kaldırılır; accelerometer tek başına safety-critical/sürüş güvenliği kararı üretmez; hysteresis/debounce PR 3'te mevcut proje desenlerinden.

Doğrulama

  • tsc -b --noEmit: temiz
  • ESLint: temiz
  • Hedef test: 30/30 yeşil
  • Tam suite: 3141/3141 yeşil (regresyon yok)
  • Production build: OK

Dosyalar

Platform Kernel PR #55'e dokunulmadı. Merge YAPILMADI.

🤖 Generated with Claude Code

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 AYRI addEventListener
ile abone; ikisi kök layout'ta app-ömrü bağlı → Ayarlar dahil her ekranda
sensör aktif (QA: samplingPeriod 60Hz, SensorsHandlerThread ~%24 +
CrRendererMain ~%21).

Gate:
- 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 (background pause temeli)
- Deterministik fan-out (insertion order, kararlı dizi); event başına YENİ
  array/object allocation YOK
- Callback exception İZOLE (fail-soft); 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
- HİÇ import YOK (bağımsız, import yan etkisiz); 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/samplingPeriod DÜŞÜRMEZ; gerçek kazanım PR 2
(on-demand tüketiciler) ve PR 3 (always-on talep-güdümlü + background
pause) wiring'inden SONRA ölçülür. Legacy event API aktifken native
sampling 60 Hz olabilir (frekans parametresi yok).

Yeni: platform/sensors/orientationSensorGate.ts, platform/sensors/index.ts
Test: 30 birim testi + regression guard (zero-leak + bağımsızlık kilidi)
Ledger: #40 🔴 (Mali-400 cihaz doğrulaması bekliyor)

tsc -b temiz · ESLint temiz · tam suite 3141 yeşil · prod build OK

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KKAPmfBwMTjsd5ft26GmXf
@vercel

vercel Bot commented Jul 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
car-launcher-pro Ready Ready Preview, Comment Jul 11, 2026 12:14pm
carospro Ready Ready Preview, Comment Jul 11, 2026 12:14pm

@selimmujdeci selimmujdeci merged commit 7d8dce5 into main Jul 11, 2026
8 checks passed
selimmujdeci pushed a commit that referenced this pull request Jul 12, 2026
sourceHealth teşhis raporunda görünüyor (can:false/obd:false/gps:true — araçsız
doğru). Sahte disconnect yok (ingestedSignalCount=3 sabit), tek abonelik korunuyor
(activeSubscriptionCount=1), bridge dropped=0, boot/CPU/RAM regresyonu yok.

Background 45 sn testi: dönüşte gps:true kaldı ve HAL'e düşüş yansımadı; ancak
lastChangeAt taşındı → arka planda geçici gps:false DIŞLANAMADI (risk sürüyor).

Satır 🔴 KALIYOR: gerçek araç (can=false/reconnect/connection) ve low-tier eksik.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012M8LbxyAqd22EU1rqtTjft
selimmujdeci pushed a commit that referenced this pull request Jul 12, 2026
…TH görünürlük gating

PR #72 (source health → HAL fail-closed) arka planda YANLIŞ-POZİTİF üretebiliyordu:
watchdog canlılığı monotonik saat farkıyla ölçer (_alive, VehicleCompute.worker.ts:409-411);
bu saat arka planda ilerler ama WebView timer'ı kısılır ve adaptör frame'leri durur →
foreground dönüşündeki ilk tikte now-lastSeen >> timeout → kaynak SAĞLAMKEN can=false.
Araç bağlıyken bu, CAN-özel sinyalleri gereksiz unsupported yapar ve bridge'ten sahte
connection.changed=false/true çifti üretirdi.

ÇÖZÜM (minimum, yeni timer YOK):
- sourceHealthGate.ts (yeni, SAF: timer/DOM/store yok, zaman enjekte edilir)
    hidden    → sağlık GEÇİŞİ dondurulur (lastSeen BOZULMAZ)
    foreground→ timeout SAATİ yeniden tabanlanır (arka plan süresi timeout'a YAZILMAZ)
    taze frame→ true · görünür zamanda gerçek timeout → false (gerçek kayıp MASKELENMEZ)
    ikisi de değilse → KARAR YOK (son bilinen değer korunur; yoksa unknown)
- worker: bounded VISIBILITY {visible:boolean} kontrol mesajı; kapı YALNIZ SOURCE_HEALTH
  kararını etkiler — fusion/reverse/SAB ham _alive() kullanmaya devam eder.
- resolver: TEK visibilitychange dinleyicisi (mevcut proje deseni), stop()'ta sökülür,
  duplicate durum POSTLANMAZ.

Kapsam dışı bırakıldı: Event Bus/bridge/HAL/Kernel/Capability/DeepScan foundation, UI,
SQL, throttle/coalescing, timer sayısı (worker setInterval 4 → 4).

Testler: +27 (sourceHealthVisibilityGating) — visible alive→dead, hidden'da false yok,
arka plan süresi timeout'a yazılmıyor, dönüşte anında false yok, taze frame → true,
görünür timeout → false, CAN/OBD/GPS bağımsız, duplicate visibility pencereyi uzatmıyor,
background→foreground event fırtınası yok, zero-leak cleanup.
Suite 3571 yeşil · lint 0 hata · build OK · guard 113/113.

Ledger #56 🔴 (gerçek araç + low-tier hâlâ eksik).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012M8LbxyAqd22EU1rqtTjft
selimmujdeci pushed a commit that referenced this pull request Jul 12, 2026
…Xiaomi)

Gerçek "Tanı Gönder" rapor gövdesinden (enstrümantasyonsuz):
- Premise teyit: arka planda WebView `document.visibilityState === 'hidden'` döndürüyor.
- SAHTE DEAD YOK: ~20 dk arka plan sonrası `sourceHealth.lastChangeAt` boot değerinde
  KALDI (1026.6) → arka planda SIFIR sağlık geçişi. (Düzeltme öncesi 45 sn arka plan
  aynı cihazda 3171 → 699171 taşımıştı.)
- activeSubscriptionCount=1, halBridge.droppedCount=0, sahte connection.changed YOK.
- 🟡 Foreground dönüşünde gps false→true çifti: arka plan saatinden DEĞİL, görünür
  zamandaki 5 sn GPS sessizliğinden (OS akışı geç başlıyor); ölçümsüz eşik eklenmedi.

Ledger #56 🔴 KALIR — gerçek araç + low-tier hâlâ eksik.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012M8LbxyAqd22EU1rqtTjft
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant