---
name: winkod-verify
description: >-
  Быстрая E2E-проверка приложения Винкод (Winkod, бывш. CebersRun) после ЛЮБОЙ
  доработки: что все бутыли реально запускаются и держат окно (не только
  «открывается»), что нет фатальных сбоев в логе, и что проброс виртуального
  COM/serial-устройства работает сквозь wine (wine пишет в COMx → байты выходят
  на внешний конец). Брать когда: «проверь Винкод», «прогони проверку/смоук»,
  «всё ли работает после доработки», «проверь что программы запускаются»,
  «проверь проброс usb/com/устройств», «протестируй бутыли», после пересборки
  .app / правок BottleLauncher / RuntimeManager / WineRuntime / ComPortBridge /
  make-app.sh / миграции данных. Дополняет скилл `winkod-wine-fix` (тот — ЧИНИТ
  падения; этот — ПРОВЕРЯЕТ, что всё живо). НЕ для: правки прошивок (.bin →
  ecu-firmware), диагностики конкретного падения (→ winkod-wine-fix).
metadata:
  type: reference
---

# winkod-verify — E2E-смоук Винкод (запуск + проброс устройств)

Прогоняет реальные проверки приложения [[winkod-overview]] и печатает зелёный/красный
итог. Не «должно работать» — реальный запуск каждой бутыли и реальный байт-раунд-трип
через виртуальный COM.

## Запуск
```bash
~/.claude/skills/winkod-verify/tools/winkod_verify.sh        # всё
~/.claude/skills/winkod-verify/tools/winkod_verify.sh launch # только запуск бутылей
~/.claude/skills/winkod-verify/tools/winkod_verify.sh serial # только serial-проброс
```
Exit 0 = всё зелёное; ≠0 = есть провалы (печатает какие + пути логов `/tmp/winkod_verify_*`).

## Что проверяет

**[1] launch-smoke** — для каждой бутыли из `~/Library/Application Support/Winkod/
bottles/manifest.json`: запуск `primaryExecutable` через bundled wine, ждёт 14с,
проверяет что процесс **жив** (окно открылось) и в логе **нет фатальных** паттернов
(`unhandled exception`, `0xc0000135` module-not-found, `0xc0000005`, `import_dll … not
found`). Безобидный шум wine (`cxcompatdb CX_ROOT not set`, `winebth`, `setupapi
style`) фатальным не считается — это норма.

**[2] serial pass-through** — создаёт throwaway-prefix в `/tmp`, поднимает socat
PTY-пару, монтирует один конец как `dosdevices/com3`, заставляет wine записать маркер
(`cmd /c "echo … > COM3"`) и проверяет, что байты вышли на внешний конец PTY. Это
полный путь Винкод-проброса: wine-программа → COMx → dosdevices-симлинк → PTY → socat
→ устройство. Самоочищается.

## Границы (важно — не пытаться сверх этого)
- **Виртуальный USB-HID воткнуть нельзя** на Apple Silicon без подписанного DriverKit
  (SIP). Реальный программно-инжектируемый класс — serial/COM (его и проверяем); это
  ровно то, что Винкод пробрасывает (ELM327 и т.п.). HID-устройства wine видит через
  IOHIDManager; vendor-class донглы (Guardant Code) — нет (см. [[winkod-overview]] D7).
- **Функциональность GUI** WinOLS/PCMflash за лицензией/донглом — смоук проверяет
  запуск, не полную работу с прошивкой/прошивальщиком. Рендер/клики — глазами в UI.
- **Авто-ремонт** (детект сбоев → one-click фикс) проверяется отдельно swift-тестом
  `AutoRepairDemoTests` в репо: `swift test --filter AutoRepairDemoTests`
  (реальные логи сбоев → правильный verb: vcrun2019/dotnet48/d3dcompiler/mf).

## Когда расширять
Добавил новую бутыль / новый класс устройства / новый рантайм — добавь проверку в
`tools/winkod_verify.sh` (новый раздел по образцу [2]) и прогони. Скрипт авто-открывает
все бутыли из manifest, отдельная правка под новую бутыль не нужна.
