# СИНГУЛЯР·15 «ОРКЕСТРАТОР» — ответ на ревизию ·14

Дата: 2026-10-01 · v1.0 · тесты: модуль 40/40, ОС 44/44, консоль чистая

## Что это

·15 — не «ещё одна фича», а четыре ядра, которые ревизия назвала недостающими,
в одном автономном офлайн-HTML (0.7 МБ, пак данных вшит). Вошёл в СИНГУЛЯР·ОС
v1.6 как 13-й модуль (горячая клавиша **O**).

Ядра: **CONTENT** (модель + реестр происхождения) · **TIMELINE** (нормализованный
таймлайн + валидатор + слово-уровень) · **AUDIO** (WebAudio-шина + мастер-часы +
state machine + Media Session) · **ACCESSIBILITY** (RTL, aria-live, клавиатура,
«не смотреть»).

## Таблица: пункт ревизии → что сделано

| # | Пункт ревизии | Статус в ·15 |
|---|---|---|
| 1 | Модель данных song/track/line/word | ✓ сделана; каждая дорожка — source/status/version |
| 2 | Timeline Engine (start/end/word) | ✓ buildTimeline: строки → слова |
| 3 | Word-level timing | ✓ подсветка слова + прогресс; интерполяция честно помечена `interp=true` |
| 4 | Audio Engine (граф) | ✓ минус-файл / свой файл / IndexedDB / синтез-луп / репетиция; громкости раздельно |
| 5 | Синхронизация audio↔lyrics | ✓ мастер-часы = audio.currentTime → rAF (не setInterval) |
| 6 | WebVTT + LRC | ✓ экспорт LRC / WebVTT (с karaoke-тегами `<c>`) / JSON |
| 7 | Provenance / source / evidence | ✓ РЕЕСТР: verified / machine-draft / user-import на каждой ячейке |
| 8 | Versioning | ✓ импорт поднимает версию (v2, v3…), журнал фиксирует |
| 9 | Валидатор таймлайна | ✓ NaN/Inf, отрицательные, монотонность, пустые, дубли, провалы >20с, выход за длительность |
| 10 | Local library / IndexedDB | ✓ минусовки хранятся в IndexedDB («⬤ в память») |
| 11 | Import / Export | ✓ импорт LRC/SRT/VTT/TXT со строгой валидацией ДО сортировки |
| 12 | Offline-first | ✓ модуль автономен; пакет вшит; 0 внешних запросов (проверено в сборке) |
| 13 | Accessibility-first | ✓ aria-label/aria-live/роль табов/клавиатура/focus-visible |
| 14 | RTL (арабский) | ✓ dir=rtl для ar/he/fa/ur (тест на реальном арабском флагмана) |
| 15 | Media Session | ✓ метаданные + play/pause/seek с гарнитуры и экрана блокировки |
| 16 | Autoplay state machine | ✓ play()→Promise→NotAllowedError → `S15_AUTOPLAY_BLOCKED` + кнопка |
| 17 | XSS-safe DOM | ✓ ноль innerHTML в модуле (проверено assert сборки и тестом) |
| 18 | Error model (типизированный) | ✓ S15_AUDIO_NOT_FOUND / S15_AUTOPLAY_BLOCKED / S15_PERMISSION_DENIED / S15_IMPORT_STRICT… |
| 19 | Автоматический аудит | ✓ АУДИТ: сводка здоровья каталога + 62 карточки, всё вычислено |
| 20 | «по 12» ≠ код | ✓ проб минусовок реально батчами по 12 с паузами (probeMinusAll) |

## Честные числа (CLAIM → EVIDENCE)

- **×157** — больше не зашито: `Object.keys(flag.yt).length` = 157 переводов
  YouTube вшиты в пак, число вычисляется и показывается; флагман — отдельная
  звёздная строка реестра (в листе 61 песни канала его нет — он OutShadow feat RUVSON).
- **61 × 13** — матрица 62 строки × 13 колонок строится из данных; пустая ячейка
  честно «·»; кнопки только у существующих дорожек (301 шт — вычислено).
- **дорожек 447 · языков 158 · строк 24 620** — считаются при загрузке (computeCounts).
- Скоринга голоса НЕТ — и это честно: в минусовке нет эталонной мелодии,
  оценивать нечестно. Есть монитор тональности/уровня + реверб.

## Чего в ·15 нет (следующие генерации)

- разделение на стемы (Demucs в браузере) — когда придут настоящие минусовки
- forced alignment для точных пословных таймингов (сейчас interp)
- полноценный offline-PWA (модуль автономен, но установочный manifest — для хостинга)
- конвейер переводов LLM добивает восточные языки (236/793 сейчас, демон жив)

## Состав поставки

- `СИНГУЛЯР_15_ОРКЕСТРАТОР.html` — автономный модуль (0.7 МБ)
- `СИНГУЛЯР_ОС_v16_13_МОДУЛЕЙ.html` — ОС с 13-м модулем (40 МБ)
- скриншоты s15_*.png (7) + os_10_orkestrator.png
