Skip to content

feat(platform-core): Vehicle HAL → Event Bus bridge runtime wiring (W4C)#70

Merged
selimmujdeci merged 2 commits into
mainfrom
feat/vehicle-hal-event-bus-bridge
Jul 12, 2026
Merged

feat(platform-core): Vehicle HAL → Event Bus bridge runtime wiring (W4C)#70
selimmujdeci merged 2 commits into
mainfrom
feat/vehicle-hal-event-bus-bridge

Conversation

@selimmujdeci

Copy link
Copy Markdown
Owner

Kurulan zincir

UnifiedVehicleStore → VehicleHalProviderAdapter → vehicleHal
  → VehicleHalEventBridge → appEventBus     (ABONE YOK — consumer migration ayrı PR)

Bridge foundation'ı (PR #54) ilk kez üretimde: gerçek vehicleHal singleton'ına ve W3'ün tek aktif appEventBus örneğine bağlandı. Bu PR yalnız wiringdir.

Sahiplik ve cleanup

  • Bridge bu wiring modülünündür → cleanup yalnız bridge'i dispose eder.
  • HAL ve Bus DISPOSE EDİLMEZ (bridge kaynakların sahibi değil — vehicleHalEventBridge.ts:272-278).
  • Tek instance: aktif bridge varken ikinci start yeni HAL aboneliği açmaz; bayat (disposed) kayıt otomatik serbest bırakılır; eski cleanup yeni aktif bridge'i düşüremez → boot→shutdown→boot güvenli.
  • Bus yoksa (W3 wiring çalışmadıysa) sessizce no-op cleanup → boot sürer (fail-soft).

SystemBoot sırası

Wave 2'de HAL wiring'den SONRA, SystemOrchestrator'dan ÖNCE, _reg ile (_regNamed değil).

Başlatma : [W1] Event Bus → … → [W2] VDL → HAL wiring → BRIDGE → SystemOrchestrator → W3/W4
Kapanış  : … → SystemOrchestrator → BRIDGE → HAL wiring → VDL → … → Event Bus (EN SON)

⇒ Bridge kapanırken HAL ve Bus hâlâ ayakta. Wave 1–4 sırası değişmedi.

Event davranışı

Topic Davranış
vehicle.signal.changed transient; supported sinyal değişiminde. W4A sayesinde tek HAL snapshot → değişen sinyal başına 1 event. Aynı değer → duplicate event yok (bridge imza-dedupe). TPMS payload bounded (≤8).
vehicle.connection.changed retained. W4B unsupported geçişiyle tüm destek kalkınca false; kısmi kayıpta üretilmez; reconnect'te true.
vehicle.identity.changed retained; ham VIN yok (yalnız mevcut fingerprint mekanizması).
vehicle.ignition.changed ÜRETİLMEZ — gerçek ignition kaynağı yok, supported=false korunuyor. Guessed değer gönderilmiyor.

Diagnostic (PR #68 yüzeyi)

platform.halBridge bölümü eklendi: present · started · disposed · publishedCount · droppedCount · lastPublishAt. "Bridge yok" (present:false, sayaçlar null) ile "0 event" karıştırılmaz. Event payload'ı, signal id/değer listesi, topic detayı, VIN/fingerprint, koordinat, CAN/ham hex, correlation/causation, history içeriği, secret gönderilmez. Yeni endpoint/timer/otomatik gönderim yok.

Throttle'sız — bilinçli karar

Bridge'te throttle/debounce/coalescing/async-queue YOK → publish hızı = gerçek sinyal değişim hızı. W4D kararı bu PR'ın cihaz/araç ölçümünden sonra verilecek (magic number yasağı).

Senkron bus riski: PlatformEventBus.publish() senkron dispatch eder (platformEventBus.ts:425-426) → ileride eklenecek consumer'lar HAL/store hot-path stack'inde çalışır. Bu PR'da abone yok → yalnız publish maliyeti ödenir. Consumer migration PR'ında "listener'da ağır iş yasak" invaryantı zorunlu olacak.

Bilinen sınırlama (açık blokaj, ayrı iş)

ECU sessizce frame kesip store değerlerini null'a çekmezse disconnect tespit edilemez (native canStatus hiçbir store'a yazılmıyor — CanAdapter.ts:57-59) → o senaryoda connection.changed=false üretilemez. Çözüm: native canStatus wiring veya worker source-health expose (bu PR'da yapılmadı).

Tip notu (foundation'a dokunulmadı)

Bridge'in publish sözleşmesi domain/source'u geniş (string) alır; PlatformEventBus dar birlik tipleri bekler → bus doğrudan hedef olarak geçemiyordu (property-syntax → kontravaryans; foundation hiç wire edilmediği için daha önce yakalanmamış). Foundation'a dokunmadan wiring katmanında daraltıcı bir publish hedefi kullanıldı; doğrulama zayıflamaz (Bus zaten domain/source beyaz listesi uygular).

Test / lint / build / guard

  • Yeni: platformCoreVehicleHalBridgeWiring.test.ts35 test (tek instance, doğru bus, event mapping, connection true/false/reconnect, ignition yok, TPMS bounded, HAL/Bus dispose edilmiyor, ikinci bus'a sızma yok, dropped/throw fail-soft, diagnostic, SystemBoot sırası, kapsam kilitleri)
  • platformRuntimeDiagnostics.test.ts: W4E'nin "bridge bölümü yok" kilidi yeni doğru davranışa güncellendi (silinmedi)
  • npm run test: 3499 test / 198 dosya yeşil · lint: 0 hata · build: başarılı
  • npm run guard: 112/113 — düşen tek test (_hasAnyField, 5 sn timeout) main'de de aynen düşüyorpre-existing baseline, W4C ile ilgisiz.

Cihaz / araç doğrulaması

Ledger #54 🔴. Araç/OBD yok → gerçek speed/rpm/CAN publish/sn doğrulanamaz; park/GPS kaynaklı event sayısı yalnız kısmi kanıt. Low-tier (K24/T507) doğrulaması da eksik.

Rollback

Tek atomik commit → git revert. Wiring dosyası silinir, SystemBoot'taki tek _reg satırı ve diagnostic bölümü düşer; foundation davranışı zaten değişmediği için risksiz.

Kapsam dışı: consumer migration · W4D throttle · Capability/Deep Scan/Kernel · native canStatus · stale sweeper.

🤖 Generated with Claude Code

https://claude.ai/code/session_012M8LbxyAqd22EU1rqtTjft

Zincir tamamlandı: UnifiedVehicleStore → VehicleHalProviderAdapter → vehicleHal
→ VehicleHalEventBridge → appEventBus. Bu PR yalnız wiring'dir.

- platformCoreVehicleHalBridgeWiring: tek-instance guard (ikinci start yeni HAL
  aboneliği açmaz), idempotent cleanup, bounded status, fail-soft (bus yoksa no-op).
- Sahiplik: bridge wiring'in → cleanup YALNIZ bridge'i dispose eder; HAL ve Bus
  DISPOSE EDİLMEZ.
- SystemBoot Wave 2: HAL wiring'den SONRA, SystemOrchestrator'dan ÖNCE (_reg) →
  LIFO'da bridge, HAL ve Bus'tan ÖNCE kapanır.
- Event: vehicle.signal.changed (transient) · connection.changed (retained; W4B
  unsupported geçişiyle tüm destek kalkınca false, kısmi kayıpta üretilmez) ·
  identity.changed (ham VIN yok). ignition ÜRETİLMEZ. TPMS bounded. Duplicate yok.
- Teşhis: support_snapshot'a bounded halBridge sayaçları (bridge-yok ile 0-event ayrı).
- Throttle/coalescing/async-queue YOK (W4D, cihaz ölçümünden sonra); consumer YOK.
  Bus dispatch senkron → gelecekteki consumer'lar hot-path'e girer (bu PR'da abone yok).
- Tip: bridge publish sözleşmesi geniş domain/source alır, Bus dar birlik bekler →
  foundation'a dokunmadan wiring'de daraltıcı publish hedefi (doğrulama zayıflamaz).
- Ledger #54 🔴.

Kapsam dışı: consumer migration, Capability/Deep Scan/Kernel, native canStatus,
stale sweeper, W4D throttle.

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 1:26pm
carospro Ready Ready Preview, Comment Jul 12, 2026 1:26pm

…ç yok)

Bridge canlı: halBridge present/started, dropped=0. Publish/sn = 0.37 (park,
GPS-only; 440 sn'de 33→197). Bus delivered=0/listener=0 (abone yok), tek HAL
aboneliği, transient event'ler history'yi şişirmiyor. Boot/CPU/RSS regresyonu yok.

Satır 🔴 KALIYOR: sürüşteki publish/sn, connection=false/reconnect ve low-tier
doğrulaması gerçek araç/OBD gerektiriyor (W4D throttle kararının girdisi).

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