# ОТЧЁТ «СВЯЗЬ»: ревизия ·14 ↔ СИНГУЛЯР·15 ОРКЕСТРАТОР

Дата: 2026-10-02 · ·15 v1.1 · ОС v1.7 · тесты: модуль **53/53**, ОС **44/44**

## 1. Источник ревизии (проверено, не пересказ)

| Поле | Значение |
|---|---|
| Файл | Google Drive, id `1U4oaN4jiessBIqo1k6frqxClH2Bp-jPk` |
| Загружен | 2026-10-01, HTTP 200, 61 289 Б |
| MD5 | `0a88dcc56ff72682c25e4c52b73170bc` |
| Объём | 1 656 строк UTF-8 (CRLF) |
| Состав | **Часть 1** (стр. 1–641): построчная техревизия ·14 · **Часть 2** (стр. 642–1506): 23 потребности + топ-20 + схема ·15 · **Часть 3** (стр. 1507–1655): 6 современных практик с приоритетами |

Каждый пункт ниже проверен по **реальному коду** собранного HTML (grep + DOM-тесты), а не по прошлым заявлениям.

## 2. Часть 1 — дефекты ·14: закрытие

| # | Дефект из ревизии | Стр. ревизии | Реализация в ·15 | Тест |
|---|---|---|---|---|
| D1 | комментарий «по 12» ≠ код (`vids.forEach` все 61) | 204–230 | `probeMinusAll()` — `queue.slice(idx, idx+12)` + пауза 900 мс (стр. 790/797) | сборка + прогон проба |
| D2 | «×157» зашито в UI | 340–364 | вычисляется: `Object.keys(pack.flag.yt).length` (стр. 1487) | «журнал содержит флагман 157» |
| D3 | `/61` магическое число | 533–551 | `allSongs().length`, счётчики `computeCounts()` (стр. 617): 62×13, 24 759 пар, 158 языков | «РЕЕСТР: 62 строки», «HUD: песен 61 вычислено» |
| D4 | `PACK14={}` — тихий пустой UI | 329–338, 501–522 | пак вшит; сбой распаковки → `banner('РЕЕСТР НЕ ЗАГРУЖЕН…')` + boot СТОП; типовые коды `S15_PACK_CORRUPT/JSON/GZIP/STREAM` (стр. 383–394, 1455) | «статус жив» |
| D5 | `innerHTML` → DOM-XSS | 1131–1163 | **ноль** `.innerHTML` в коде; всё через `el()`/`textContent`; assert сборки + DOM-тест | «нет innerHTML в модуле» |
| D6 | локальность не доказана | 553–568 | assert сборки: нет `XMLHttpRequest/fetch(http)/sendBeacon/WebSocket`; внешних запросов 0 | «нет ошибок консоли» |

## 3. Часть 2 — топ-20 потребностей: состояние

| # | Потребность (стр. 1473–1496) | Статус | Доказательство (строки ·15) |
|---|---|---|---|
| 1 | модель данных song/track/line/word | ✓ | `buildTimeline()` 426; реестр source/status/version |
| 2 | Timeline Engine | ✓ | строки→слова, interp помечен |
| 3 | word-level timing | ✓ | подсветка `.w.act`, прогресс `--p` |
| 4 | Audio Engine | ✓ | шина: `<audio>`-часы + `BufferSource(loop)`+Gain (848, 206–213) |
| 5 | синхронизация audio↔lyrics | ✓ | мастер-часы `audio.currentTime` → rAF |
| 6 | WebVTT + LRC | ✓ | `exportLrc` 489, `exportVtt` karaoke-теги 498, `exportJson` 514 |
| 7 | provenance/source/evidence | ✓ | РЕЕСТР: verified/machine-draft/user-import |
| 8 | versioning | ✓ | импорт поднимает версию, журнал |
| 9 | валидатор таймлайна | ✓ | `validateLines` 455: NaN/отриц./монотонность/дубли/провалы>20с/выход за длит. |
| 10 | local library / IndexedDB | ✓ | `idbPut` 1635, «⬤ в память» |
| 11 | import/export | ✓ | LRC/SRT/VTT/TXT строго ДО сортировки |
| 12 | offline-first | ✓ | автономный HTML, пак вшит; + PWA-слой (см. п. 15 отчёта) |
| 13 | accessibility-first | ✓+ | aria/клавиатура/focus-visible; **+новое**: крупный текст, `prefers-contrast` |
| 14 | RTL | ✓ | `data-rtl` 1166 (ar/he/fa/ur), тест на арабском флагмана |
| 15 | Media Session | ✓ | 1075–1085: play/pause/seekback/seekforward |
| 16 | autoplay state machine | ✓ | `NotAllowedError` → `S15_AUTOPLAY_BLOCKED` 977–980 |
| 17 | XSS-safe DOM | ✓ | ноль innerHTML (см. D5) |
| 18 | performance/Workers | ◐ | рендер лёгкий (DOM-only), virtualized list не нужен на 62×13; Workers — при росте каталога |
| 19 | автоматический аудит | ✓ | АУДИТ: сводка + 62 карточки, всё вычислено |
| 20 | полная test matrix | ◐ | 53/53 + 44/44 (DOM/e2e); RTL/автоплей/импорт-мусор покрыты; браузерная матрица — по мере хостинга |

## 4. Часть 3 — практики 2026: интеграция v1.1 (СЕГОДНЯ)

| # | Практика (стр. 1567–1654) | Приоритет ревизии | Статус v1.1 | Доказательство |
|---|---|---|---|---|
| M1 | PWA + офлайн-кэш | **№1** | ✓ сделано честно | `pwaSetup15()` 1673: при хостинге — manifest(data-URL) + регистрация `./sw15.js`; на file:// — ничего не притворяется, офлайн и так полный (пак вшит). `sw15.js`: cache-first, минусовки сеть→кэш |
| M2 | микрофон + эффекты | №2 | ✓ было в v1.0 | монитор + реверб (Convolver 1112); скоринг — НЕТ и честно: эталона в минусовке нет |
| M3 | AI-стемы (Demucs) | №3 | △ следующая генерация | заменит репетицию там, где нет минуса |
| M4 | WhisperX forced alignment, LRCv2 | — | △ | сейчас interp помечен; тайминги флагмана ru — реальные из ASR |
| M5 | питч/темп | №5 | ✓ **сделано сейчас** | темп `gRate` ×0.50–1.50: `au.playbackRate` + `preservesPitch` (897) + синхронный луп (848); тональность `gKey` ±6 пт через `detune` — **только синтез-режим**, для файлов честно: нужен AudioWorklet |
| M6 | SVC-синтез голоса | — | △ дорожная карта | — |

Дополнительно из Части 2 (детали, не входившие в топ-20): `prefers-reduced-motion` (было), `prefers-contrast: more` + «крупный текст» `aria-pressed` (новое) — интегрированы.

## 5. Честный остаток (не спрятано)

1. **Стемы** (Demucs/Open-Unmix WASM) — не встроены; репетиция остаётся честным фолбэком.
2. **Forced alignment** — пословные тайминги интерполированы и помечены `interp`.
3. **AudioWorklet-питч** для файловых источников (сейчас detune только в синтезе).
4. **LRCv2, Background Fetch, MSE-форматная стратегия, virtualized list, switch access** — за горизонтом v1.2+.
5. **Скоринг пения** — принципиально нет без эталонной мелодии; включится после стемов.
6. **Конвейер переводов LLM** — 236/793+228 в паке; демон продолжает восточные языки.

## 6. Поставка и проверка

- `СИНГУЛЯР_15_ОРКЕСТРАТОР.html` — 728 171 Б (0.69 МБ), пак 638 588 Б b64: 61 песня + флагман (157 YT-переводов, реальные ASR-тайминги ru) + 228 LLM-переводов, 24 759 пар
- `СИНГУЛЯР_ОС_v17_13_МОДУЛЕЙ.html` — 41 933 732 Б (40.0 МБ), модуль ·15 v1.1 внутри
- `sw15.js` — сервис-воркер для хостинга (PWA)
- Тесты: `test_s15.py` **53/53** (включая 13 новых: темп/тональность/крупный текст/PWA-честность/CSS a11y) · `test_os.py` **44/44** · скриншоты s15_01…08 + os_10

## 7. Цепочка «кто на кого ссылается»

```
Ревизия на Диске (md5 0a88dcc5…)
   ├─ Часть 1 (дефекты D1–D6) ──→ §2 матрицы ──→ assert сборки + тесты ·15
   ├─ Часть 2 (топ-20)        ──→ §3 матрицы ──→ функции ·15 (строки 426–1487)
   └─ Часть 3 (практики M1–M6) ──→ §4 матрицы ──→ v1.1: темп/тональность/PWA/a11y
                                     ↓
                     СИНГУЛЯР·15 v1.1 ←→ ОС v1.7 (модуль m15)
                                     ↓
                zip RUVSON_ОРКЕСТРАТОР_v17_17.zip → filebin.net/ruvson-orkestrator
```
