Skip to content

feat(qa): OEM Validation Lab — Host Foundation (PR-1, cihazsız çekirdek)#59

Open
selimmujdeci wants to merge 2 commits into
mainfrom
feat/oem-validation-lab-foundation
Open

feat(qa): OEM Validation Lab — Host Foundation (PR-1, cihazsız çekirdek)#59
selimmujdeci wants to merge 2 commits into
mainfrom
feat/oem-validation-lab-foundation

Conversation

@selimmujdeci

Copy link
Copy Markdown
Owner

Amaç

OEM Validation Lab'in cihaz gerektirmeyen ilk çekirdeği. Bir OEM "çalışıyor" demez, kanıt ister — Lab'in tek işi bir yapının nereye kadar kanıtlandığını abartmadan söylemek.

Uygulama runtime'ına DOKUNULMADI: SystemBoot wiring yok, src/ altındaki uygulama import edilmiyor, native OBD/CAN ve polling frekansları değişmedi, SQL/Supabase'e dokunulmadı. Yeni bağımlılık yok (yalnız Node built-in).

Yapısal kilitler — "kanıt yoksa iddia yok"

Bunlar yorum değil, kodda zorlanan invaryantlar:

Kilit Nerede
Cihaz coverage 0 → verdict tavanı HOST_VERIFIED (skor 100 olsa bile) qa/core/verdict.mjs KAPI 2
host lane profili OEM_READY tavanı isteyemez qa/profiles/_schema.mjs
detectHostCapabilities() device.* üretemez (üretirse throw) qa/core/context.mjs
Host lane'de adb/fastboot çağrısı reddedilir qa/core/context.mjsexec()
Safety-critical FAIL/INCOMPLETE veya blocker bulgu → REJECTED qa/core/verdict.mjs KAPI 1
Atlanan test skoru şişirmez — coverage'ı düşürür qa/core/scoring.mjs
Boş küme "tam kapsandı" sayılmaz (planned=0 → ratio=0) qa/core/scoring.mjs

"Koşamadı" ≠ "geçti" ≠ "düştü": araç yok → SKIPPED_NA, ortam çöktü → INCOMPLETE, gerçek kusur → FAIL.

Faz 1 — Build Validation

Mevcut araçları yeniden kullanır (yeni script yazmaz): scripts/verify-webview-compat.mjs, android/build.gradle buildDir override, version.properties, aapt2, apksigner.

Kontroller: dist varlığı · eski-WebView ES2015 boot kapısı · APK varlığı · SHA-256 (stream) · paket adı · sürüm hizası (stale-APK tuzağı) · izin yüzeyi · release-debuggable sızıntısı · imza doğrulaması.

İlk koşunun gerçek bulgusu

Sevk edilen APK, kaynak AndroidManifest.xml'de olmayan 2 izin taşıyor — Gradle manifest-merge ile kütüphanelerden geliyor:

  • com.google.android.c2dm.permission.RECEIVE (Capacitor push/FCM)
  • com.cockpitos.pro.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION (AndroidX)

Yani kaynak manifest ≠ sevk edilen izin yüzeyi. Sözleşmeye mergedPermissions olarak belgelendi; kontrol zayıflatılmadı.

Host koşusu (gerçek sonuç)

🟡 VERDICT: HOST_VERIFIED · Skor: 100/100
   • Cihaz coverage = 0 → tavan HOST_VERIFIED (gerçek cihaz kanıtı yok).

9/9 kontrol PASS, skor 100 — ama verdict yine HOST_VERIFIED. Tasarımın kalbi bu.

Raporlar & gizlilik

docs-local/qa-runs/<ts>/report.json (tek gerçek kaynak) + QA_REPORT.md / OEM_REPORT.md / BUILD_REPORT.md (yalnız JSON'dan render, saf fonksiyon) + artifacts/ + raw/.

Git'e girmez (.gitignore). Rapora giden her metin redaksiyondan geçer: API key/JWT/MAC/VIN/koordinat → <REDACTED_*>; kişisel yol → <HOME>; repo yolu → repo:/…; makine yolu (gradle buildDir override) → <ABS>/…. Doğrulandı: report.json'da ham mutlak yol yok.

Komutlar

npm run qa:oem:validate-profile   # profil şeması (+ bilinmeyen faz kontrolü)
npm run qa:oem:host               # host lane koşusu — REJECTED ise exit 1
npm run qa:oem:report             # markdown'ları report.json'dan yeniden üret

Doğrulama

Kapı Sonuç
npx tsc -b --noEmit ✅ temiz
npm run lint ✅ 0 hata (yeni dosyada 0 uyarı)
npm run test (tam paket) 3262 test / 189 dosya yeşil (62'si yeni)
npm run build
npm run qa:oem:host ✅ HOST_VERIFIED, 9/9 kontrol PASS

Windows uyumu: apksigner.batcmd.exe /c köprüsü (Node .bat spawn edemez), JAVA_HOME tespiti (Android Studio jbr), shell string birleştirme yok (argüman dizisi), child-process timeout'ları bounded, timer'lar daima temizlenir.

Bilinen eksikler (dürüst sınırlar)

  • Cihaz katmanı YOK (adb transport, install/boot, performans, sensör, OBD) → sonraki PR'lar. Device coverage yapısal olarak 0.
  • CI'a bağlanmadıqa:oem:host elle koşuluyor (mevcut main.yml kırılmasın diye ayrı PR).
  • Gradle build tetiklenmiyor — Lab mevcut APK'yı doğrular, üretmez.
  • Mali-400 / gerçek cihaz doğrulaması yapılmadı — Ledger feat(assistant): Unified Assistant Context Store (OfflineAssistantContext) #43 bu yüzden 🔴 bekliyor.

Doküman & Ledger

  • docs/OEM_VALIDATION_LAB_ARCHITECTURE.md (22 bölüm: anayasa → coverage modeli → plugin sözleşmesi → Scenario Engine, burn-in, OTA regresyon, plugin certification, AI validation, enerji profilleri → atomik PR yol haritası)
  • docs/qa/OEM_VALIDATION_LAB_RUNBOOK.md
  • docs/DEVICE_VALIDATION_LEDGER.mdfeat(assistant): Unified Assistant Context Store (OfflineAssistantContext) #43: 🟡 host'ta doğrulandı / 🔴 cihaz katmanı uygulanmadı

🤖 Generated with Claude Code

https://claude.ai/code/session_013JFgCEkmi1AVowXvZC57HY

Cihaz gerektirmeyen ilk QA çekirdeği. Uygulama runtime'ına DOKUNMAZ
(SystemBoot wiring yok, src/ import edilmez); yalnız Node built-in kullanır.

ÇEKİRDEK
- registry + definePhase sözleşmesi (duplicate id red, deterministik sıra)
- değişmez context (immutable) + host yetenek tespiti (device.* ÜRETEMEZ)
- fail-soft orchestrator: faz çökerse Lab çökmez, kalan fazlar koşar
- coverage-aware scoring: atlanan test SKORU ŞİŞİRMEZ, coverage'ı düşürür
- verdict: min(skor kapısı, coverage tavanı, profil tavanı) — yalnız AŞAĞI iner
- bounded + redakte artefakt deposu; shell'siz, zaman-sınırlı exec

YAPISAL KİLİTLER (kanıt olmadan iddia yok)
- cihaz coverage 0 → verdict tavanı HOST_VERIFIED (skor 100 olsa bile)
- host lane profili OEM_READY tavanı isteyemez (şema reddeder)
- host lane'de adb/fastboot çağrısı context.exec tarafından REDDEDİLİR
- safety-critical FAIL/INCOMPLETE veya blocker bulgu → REJECTED

FAZ 1 — BUILD VALIDATION
APK varlığı, SHA-256 (stream), paket adı, sürüm (version.properties hizası),
izin yüzeyi, release-debuggable sızıntısı, apksigner imzası + mevcut
scripts/verify-webview-compat.mjs yeniden kullanımı. Araç yoksa (aapt2/Java/APK)
ilgili kontrol SKIPPED_NA — "koşamadı" ASLA "geçti" sayılmaz.

İLK KOŞUNUN GERÇEK BULGUSU
Sevk edilen APK, kaynak AndroidManifest.xml'de OLMAYAN 2 izin taşıyor
(c2dm.permission.RECEIVE, DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION — Gradle
manifest-merge ile kütüphanelerden). Sözleşmeye mergedPermissions olarak
BELGELENDİ; kontrol zayıflatılmadı.

RAPORLAR
docs-local/qa-runs/<ts>/: report.json (TEK gerçek kaynak) + QA/OEM/BUILD
markdown (yalnız JSON'dan render) + artifacts/ + raw/. Git'e girmez (.gitignore).
Sır + kişisel/makine yolu redaksiyonu (report.json'da ham mutlak yol YOK).

KOMUTLAR: qa:oem:host · qa:oem:report · qa:oem:validate-profile
TESTLER: 62 sözleşme testi (tam paket 3262 yeşil)
DOKÜMAN: docs/OEM_VALIDATION_LAB_ARCHITECTURE.md + docs/qa/RUNBOOK
LEDGER: #43 🟡 host'ta doğrulandı / 🔴 cihaz katmanı UYGULANMADI

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013JFgCEkmi1AVowXvZC57HY
@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 3:08pm
carospro Ready Ready Preview, Comment Jul 11, 2026 3:08pm

Comment thread qa/core/exec.mjs
Comment on lines +75 to +80
child = spawn(file, argv, {
cwd: opts.cwd,
env: opts.env ?? process.env,
shell: false, // ASLA shell — argüman dizisi tek yol
windowsHide: true,
});
CI (Ubuntu) yakaladı: basename('C:\sdk\platform-tools\adb.exe') POSIX'te
tüm dizeyi döndürür (ters bölü ayraç DEĞİLDİR) → host lane'in adb yasağı
Windows tarzı yolu tanımıyor, komut spawn edilmeye çalışılıyordu.

Fix: ayraçlar basename'den ÖNCE normalleştirilir (platformdan bağımsız).
Kilit genişletildi: ters-bölülü, POSIX-mutlak ve çıplak adb/fastboot yolları.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013JFgCEkmi1AVowXvZC57HY
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.

2 participants