Skip to content

feat(vehicle-data): worker source health transport (PR-1)#71

Merged
selimmujdeci merged 2 commits into
mainfrom
feat/worker-source-health-transport
Jul 12, 2026
Merged

feat(vehicle-data): worker source health transport (PR-1)#71
selimmujdeci merged 2 commits into
mainfrom
feat/worker-source-health-transport

Conversation

@selimmujdeci

Copy link
Copy Markdown
Owner

Neden

Sessiz ECU frame kaybında (kablo takılı, port açık, ECU susmuş):

  • Native canStatus yalnız transport durumunu bildiriyor — connected = (mode != NONE) (CarLauncherPlugin.java:3748-3756) → port açıkken connected:true. Frame kaybını görmez.
  • Frame canlılığını yalnız worker biliyor: _canLastSeen + SRC_TIMEOUT_CAN_MS=3000 (VehicleCompute.worker.ts:92-96), 1 Hz _watchdog() (:1010-1013).
  • Ama bu bilgi ana thread'e hiç ulaşmıyordu → store CAN extras donuyor → HAL supported=true kalıyor → vehicle.connection.changed=false asla üretilemiyor.

Ne yapıyor

VehicleCompute.worker (mevcut 1 Hz watchdog)
  → SOURCE_HEALTH { can, obd, gps, ts }        ← YALNIZ DEĞİŞİMDE (kenar-tetikli)
  → VehicleSignalResolver
  → halStatusStore.sourceHealth

Mesaj sözleşmesi

{ type: 'SOURCE_HEALTH'; can: boolean; obd: boolean; gps: boolean; ts: number }

  • can/obd/gps ayrı — tek global halConnected yetersiz (CAN ölüp GPS yaşarken toptan kapatma yapılamaz).
  • null = BİLİNMİYOR (worker hiç bildirmedi) — false (ölü) ile karıştırılmaz.
  • Yalnız geçişte postlanır (duplicate durum mesaj üretmez); store da idempotent (aynı durumda set() çağrılmaz → gereksiz abone uyanışı yok).
  • Payload yalnız 3 boolean + monotonik ts — araç verisi (hız/RPM/CAN frame), VIN, koordinat, PII yok.
  • Pre-allocated envelope (V8 hidden-class, hot-path allocation yok).
  • Yeni timer YOK — worker'daki setInterval sayısı 4'te sabit (speed/fuel/coolant/watchdog; testle kilitli).

Bu PR'ın YAPMADIKLARI

  • Hiçbir sinyali unsupported yapmaz (source:'none' üretmez).
  • HAL · adapter · Event Bus · bridge davranışı değişmez — adapter hâlâ halStatusStore okumaz (kilitli).
  • Yeni polling/timer, background/visibility politikası eklenmedi.

Fail-closed tüketim (CAN ölünce CAN sinyallerini source:'none' yapma) = PR-2.

⚠️ Risk (raporlanıyor, çözülmüyor)

Uygulama arka plandayken worker timer'ı kısılabilir veya plugin event teslimi gecikebilir → yanlış-pozitif "CAN öldü". Bu PR bilgi taşıdığı için zararsız; ancak PR-2 (tüketim) öncesinde ölçülmeli ve gerekirse görünürlük kapısı eklenmeli.

Test / lint / build / guard

  • Yeni: workerSourceHealthTransport.test.ts20 test (unknown başlangıç, alive→dead, dead→alive, CAN/OBD/GPS bağımsızlığı, yalnız-geçişte-mesaj, duplicate yok, bozuk mesaj fail-soft, bounded/PII'siz payload, yeni timer yok, resolver doğru store alanı, dispose sonrası yazım yok — listener terminate'ten önce kaldırılıyor, HAL/Bus/bridge değişmedi)
  • npm run test: 3519 test / 199 dosya yeşil · lint: 0 hata · build: başarılı
  • npm run guard: 113/113 yeşil (daha önce raporlanan _hasAnyField timeout'u bu koşuda tekrarlamadı — flaky/pre-existing, kodla ilgisiz)

Cihaz doğrulaması

Ledger #55 🔴. Kabul ölçütlerinin çekirdeği (CAN kesilince canAlive=false, reconnect'te true) gerçek araç/OBD gerektiriyor; low-tier (K24/T507) doğrulaması da eksik.

Rollback

Tek atomik commit → git revert. Worker mesajı, resolver case ve store alanı düşer; hiçbir tüketici olmadığı için davranış zaten değişmiyordu.

🤖 Generated with Claude Code

https://claude.ai/code/session_012M8LbxyAqd22EU1rqtTjft

Worker'ın 1 Hz watchdog'unda ZATEN hesapladığı per-kaynak canlılık (CAN 3s / OBD 5s
/ GPS 5s timeout) ana thread'e taşınır:
VehicleCompute.worker → SOURCE_HEALTH → VehicleSignalResolver → halStatusStore.

Gerekçe: sessiz ECU frame kaybında native canStatus yalnız TRANSPORT durumunu
bildiriyor (port açıkken connected:true), frame kaybını yalnız worker görüyor —
ama bu bilgi ana thread'e hiç ulaşmıyordu.

- can/obd/gps AYRI tutulur (tek global halConnected yetersiz: CAN ölüp GPS yaşarken
  toptan kapatma yapılamaz).
- null = BİLİNMİYOR; false (ölü) ile karıştırılmaz.
- Mesaj YALNIZ değişimde postlanır (kenar-tetikli); store da idempotent.
- Payload yalnız 3 boolean + monotonik ts (araç verisi/VIN/PII yok); pre-allocated
  envelope (hot-path allocation yok).
- YENİ TIMER YOK — worker setInterval sayısı 4'te sabit (testle kilitli).
- Bu PR YALNIZ BİLGİ TAŞIR: hiçbir sinyali unsupported yapmaz; HAL/adapter/Event Bus/
  bridge davranışı değişmez (adapter hâlâ halStatusStore okumaz — kilitli).
- Background/visibility politikası EKLENMEDİ (yanlış-pozitif riski raporlandı).
- Ledger #55 🔴.

Fail-closed tüketim (CAN ölünce sinyalleri source:'none' yapma) AYRI PR (PR-2).

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

vercel Bot commented Jul 12, 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 12, 2026 2:03pm
carospro Ready Ready Preview, Comment Jul 12, 2026 2:03pm

Sahte disconnect yok: ingestedSignalCount=3 (değişmedi), tek abonelik, bridge
dropped=0 → bilgi taşıması HAL/bridge davranışını değiştirmedi. Boot/CPU/RAM
regresyonu yok.

Satır 🔴 KALIYOR: canAlive=false/reconnect gerçek araç gerektiriyor; low-tier yok;
sourceHealth henüz teşhis raporunda değil (ADB'siz okunamıyor) → PR-2'de eklenmeli.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012M8LbxyAqd22EU1rqtTjft
@selimmujdeci selimmujdeci merged commit 448e09d into main Jul 12, 2026
8 checks passed
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