v2.2.27-beta2 — post-ASR filters + CPU cascade inversion + sliding AGC

Substantial iteration over beta1. Headline changes:

Audio & ASR
  * Sliding BS.1770-style AGC replaces one-shot gain — quiet speakers
    on multi-speaker conferences no longer get dropped by Whisper VAD
    (Пк тест 2026-08-05: 13:30 of 149-min meeting was lost by
    default Silero threshold).
  * Silero VAD threshold 0.5 → 0.35, min_silence 300/500 → 800/1000 ms.
  * CPU cascade inversion: GigaAM primary on CPU + RU/auto (5-30×
    faster than Whisper for the same RU quality). Whisper stays lazy
    fallback for empty results / EN. Configurable via
    cascade_primary=auto|whisper|gigaam.
  * Whisper CPU threads cap 16 → 4 (int8 GEMM saturates early).
    DiariZen / WeSpeaker capped at 8 (16 fights parallel workers).

Diarization
  * DiariZen int8 segmentation model default (282 MB → 98 MB, +10%
    CPU speed, posterior cosine 1.0000).
  * NME-SC clustering (Park & Han 2019) replaces silhouette default —
    fixes both over-split (Мистраль 7→8-9) and under-split
    (Пк тест 10→2) failures on WeSpeaker embeddings.
  * Overlap-aware word→turn assignment kills 148 empty 'Анна?' turns
    on Пк тест 2026-08-06.
  * Honest speaker labels — 'Спикер N (Ж)' instead of 'Виктор?'
    pseudo-real-name pool (mymeet.ai convention).
  * Trust ANY resolved speaker_name — dropped string-based pool
    filter that wiped 11 hard-tier voiceprint matches on Мистраль.

Post-ASR quality (all opt-in, disabled by default)
  * spellfix: pymorphy3 + SymSpell repairs Whisper transliteration
    errors (подскажки → подсказки, лицензыи → лицензии).
  * llm_cleanup: local Ollama post-pass (gemma3:12b) restores
    punctuation, ё, capitalization. ~17 min on 149-min file.
  * summarizer: Sumy TextRank/LexRank/LSA extractive TL;DR, fully
    offline. Rendered as fenced ## TL;DR block in MD export.
  * wav2vec2 CTC forced alignment: refines Whisper word timings
    ±200 ms → ±20-40 ms. Critical for overlap-heavy conferences.

Meeting UX
  * Loopback level meter (🔊) below mic meter — immediate feedback
    when loopback endpoint goes silent (Bluetooth headphones,
    routing changes).
  * Tray tooltip progress «загрузка/диаризация/распознавание NN%»
    for file-mode CPU users instead of static spinner.
  * Removed noisy meeting start/stop/rerun toasts.
  * Меню 'Скопировать путь к транскрипту' в подменю записей.
  * Hotkey rebind fix — old check silently ignored new combos.
  * Model-warmup tray guard preserves PROCESSING state when a file
    was queued during boot.

Startup
  * Stage O CUDA warmup runs one dummy inference at load — kills the
    12 s freeze on first finalize (Pavel 2026-08-20).
  * torch stub install probes with real import — catches half-
    uninstalled torch that segfaults downstream ORT DLL preload.

Distribution
  * MossFormer2 lazy download from mirror on first meeting use —
    CPU-minimal bundle can ship without the 220 MB blob.
  * Config schema v16 with codeswitch model name migration.

Mac port scaffolding
  * Cocoa (NSEvent) hotkey adapter as pynput replacement on macOS.

Testing
  * 10 new tests: crash scrub, diarization invariants, ed25519 sign/
    verify, dual-track finalize, full updater e2e.