# РЕВИЗИЯ РУМ · v1.40.0 «РЕВИЗИЯ» · 2026-10-06

Приказ владельца: «Каждая рума доведена до идеала и ЗАКОНЧЕНА. Те, кто будут через неё
проходить, — вечны, и чтобы у них не было вопросов к нам. Просто брали то, что есть в
руме, и юзали по своему усмотрению. Брать по одной странице и вышкуривать её до бела —
и в коде, и в эстетике».

Это живая карта ревизии. Ревизия — не разовый заход, а порядок обхода: **одна рума за
такт, до бела**. Ниже — инвентаризация по состоянию на v1.39.0 (аудит-скрипт + ручная
сверка), план и то, что уже выкурено.

---

## Что выкурено в этом такте (v1.40.0)

### РУМА-1 · СИНГУЛЯР_01 «Когда теряем 157 голосов» — ЗАКОНЧЕНА до бела
- **Ноль живых innerHTML.** Было 28 присвоений; 18 — в живом коде, 10 — цитаты
  граббера внутри мастер-плана (данные документа, не тронуты). Все 18 живых
  выкорчеваны в DOM API: `replaceChildren()`, `createElement`, `textContent`
  (экранирует сам — лишние `esc()` вокруг карточек ушли). Сборка карточек
  `cardHTML(c)` (строка) → `mkCard(c)` (DOM руками).
- **Ремонт глифа избранного.** Баг: `textContent = on ? '' : ''` — обе ветки пустые.
  Кнопка плеера рождалась пустой, карточка ТЕРЯЛА глиф `◈` при первом клике.
  Стало честно: `◇` (не в избранном) ↔ `◈` (в избранном), согласовано с карточками
  каталога. Проверено живым браузером: клик меняет глиф туда-обратно.
- **Правка врущих комментариев.** «MODAL песни (каталог → заглушка)» — модал рабочий
  инструмент, комментарий исправлен.
- **Свой смоук-тест.** `ИНСТРУМЕНТЫ/test_s01_smoke.py` (Playwright, 7/7): открытие без
  pageerror, DOM-сборка карточек, глиф ◇/◈ в плеере и карточках, консоль чиста.
- **Синтакс-проверка** всего живого скрипта (node --check) — ОК.

### Сервер СИНГУЛЯРА — декларация стала рабочим инструментом
- **Ноль внешних зависимостей.** `server/server.mjs` больше не импортирует npm-пакет
  `ws` — WebSocket (RFC 6455: handshake, фрейминг, фрагментация, ping/pong, close,
  защита от не-маскированных клиентов и payload > 16 МБ) встроен своими руками
  (~130 строк, комментирован). Следствие: **склонировал дом → `node server.mjs` →
  живо.** `npm install` больше не нужен никому и никогда.
- **s19-серверные тесты оживлены** — падали у КАЖДОГО, кто клонировал репо (сервер
  не поднимался без node_modules; сам тест тоже требовал `ws` для клиента). Теперь
  тест юзает нативный WebSocket node (≥22) с fallback на `ws`. Прогон: **12/12**.
- **README сервера перестал врать:** удалён обязательный `npm install`; таблица
  контракта дополнена честным `/api/ws/ticket` + `/ws?ticket=` (путь `/ws?token=`
  закрыт навсегда с v1.25.1 — а README ещё продавал старый).
- **`server/.env.example` создан** — README на него ссылался, файла не существовало
  (декларация без тела). Теперь есть: все переменные окружения с комментами.
- `server/package.json` v1.1.0: `"dependencies": {}`, engines `>=22`.

### Согласование версий (провал test_core_integrity честен)
- `ГОТОВНОСТЬ.manifest.json`: 1.38.0 → **1.40.0** (прошлый такт обновил index, но
  забыл манифест — инструмент сигналит, такты должны слушаться инструментов).
- `index.html` sng-build → **v1.40.0 · РЕВИЗИЯ**, `sw15.js` кэш **v50** (шапка
  выправлена: v1.39.0 дописал свою строку, которую оставил склеенной с v1.38.0).

---

## Карта рум (инвентаризация v1.39.0 · аудит 2026-10-06)

Легенда: innerHTML — присвоений в живом коде; заглушки — совпадения по TODO/СКОРО/
заглушка (проверены вручную: большинство — слова песен и base64-шум, не обещания).

| # | Рума | КБ | innerHTML (живых) | Внешние href | Состояние на ревизию | Вердикт |
|---|------|-----|------|------|------|------|
| 1 | СИНГУЛЯР_01 Когда теряем 157 голосов | 14 577 | 18 | 5 (ссылки на источник YouTube — легитимны) | Тяжеловес-платформа: аудио 7.6 МБ, мастер-план 5.6 МБ, 157 языков — вшиты (офлайн-фича) | **ВЫКУРЕНА** (этот такт) |
| 2 | СИНГУЛЯР_02 РЕЗОНАНС | 13 289 | 36 | 0 | То же семейство: 28 innerHTML живых (предварительно), заглушки — шум | ОЧЕРЕДЬ №1 следующего такта |
| 3 | СИНГУЛЯР_02 ФАБРИКА | 7 573 | 12 | 0 | Архитектурная витрина; проверка живости | ОЧЕРЕДЬ |
| 4 | СИНГУЛЯР_15 ОРКЕСТРАТОР | 782 | 0 | 0 | Отчёт ревизии ·14–15 вшит; код чист | ВЫШКУРИВАТЬ ЭСТЕТИКУ |
| 5 | СИНГУЛЯР_16 СУФЛЁР | 91 | 0 | 0 | Уют по приказу владельца; 1 «заглушка» — слово в тексте | ВЫШКУРИВАТЬ |
| 6 | СИНГУЛЯР_17 ЗАЛ | 58 | 0 | 0 | Код/QR вход, реле-сигналинг | ВЫШКУРИВАТЬ |
| 7 | СИНГУЛЯР_18 СОБЫТИЕ | 115 | 0 | 0 | Пение вместе, фиксированный код зала | ВЫШКУРИВАТЬ |
| 8 | СИНГУЛЯР_19 ЧЕЛОВЕК | 57 | 0 | 0 | Личность ECDSA; тест 12/12 (сервер жив) | ВЫШКУРИВАТЬ |
| 9 | СИНГУЛЯР_20 ФОНЕТИКА | 32 | 0 | 0 | Чипы-слоги, мост ·16 | ВЫШКУРИВАТЬ |
| 10 | СИНГУЛЯР_21 ОБЩЕНИЕ | 60 | 0 | 0 | Диалог | ВЫШКУРИВАТЬ |
| 11 | СИНГУЛЯР_22 СВЯЗЬ | 164 | 0 | 0 | Крипта, устройства; 14 деталей «под капот» | ВЫШКУРИВАТЬ |
| 12 | СИНГУЛЯР_23 КРУГ | 101 | 0 | 0 | Круг людей | ВЫШКУРИВАТЬ |
| 13 | СИНГУЛЯР_24 ПОЧТА | 77 | 0 | 3 | Внешние — проверить легитимность | ВЫШКУРИВАТЬ |
| 14 | СИНГУЛЯР_25 КОШЕЛЁК | 81 | 0 | 3 | Внешние — проверить легитимность | ВЫШКУРИВАТЬ |
| 15 | СИНГУЛЯР_26 ЛИНИЯ | 64 | 0 | 0 | Линия жизни | ВЫШКУРИВАТЬ |
| 16 | СИНГУЛЯР_27 ФУНДАМЕНТ | 19 | 0 | 0 | Фундамент | ВЫШКУРИВАТЬ |
| 17 | СИНГУЛЯР_28 УЗЕЛ | 51 | 0 | 0 | Суверенный узел («МОЖЕТ быть неуязвимым и творческим») | ВЫШКУРИВАТЬ |
| 18 | СИНГУЛЯР_29 СВОБОДА | 53 | 0 | 0 | Свобода выбора из многообразия; WCAG 2.2 | ВЫШКУРИВАТЬ |
| — | index.html (главная) | 13 | 0 | 1 (GitHub) | Лицо дома, канон Spatial Glass | ДЕРЖАТЬ КАНОН |
| — | organism-living-prototype | 34 | ? | ? | Прототип-организм: вне нити, аудит отдельно | АУДИТ |

## Порядок обхода (по одной за такт, до бела)
1. ~~РУМА-1 (СИНГУЛЯР_01)~~ — этот такт.
2. РУМА-2 (СИНГУЛЯР_02 РЕЗОНАНС) — 36 innerHTML, тот же ремонт глифов/карточек,
   проверка аудио-данных. Следующий такт.
3. Далее по нумерации: 02 ФАБРИКА → 15 → … → 29. Каждая: ноль живых innerHTML,
   ноль врущих комментариев/заглушек-обещаний, hover-подсказки, «под капот»,
   канон Spatial Glass, свой смоук-тест, синтакс-проверка.

## Инструменты ревизии (сами — рабочие инструменты, не декларации)
- `ИНСТРУМЕНТЫ/audit_rooms.py` — инвентаризация всех рум одной командой (в репо с такта v1.41.0).
- `ИНСТРУМЕНТЫ/room1_classify.py` — сканер строковых литералов: отличает живой код от
  цитат в данных (главный урок этого такта: слепой поиск бьёт по документам).
- `ИНСТРУМЕНТЫ/test_s01_smoke.py` — браузерный смоук румы ·01 (Playwright, 7/7).
- `node --test ИНСТРУМЕНТЫ/test_s19_human.js` — 12/12 без единой установки.

## Полигон этого такта (итог прогона перед деплоем)
- Зелёные: s19 **12/12** (было 6 наследственных падений у каждого), modules 12/12,
  s29 9/9, s01 smoke **7/7** (новый), core_integrity **18/18** (манифест согласован),
  composition 12/12, crystal_logic 26/26, crypto_logic 33/33, crystal_bridges 30/30,
  crystal_browser 25/25, bridges_browser 13/13, fonetika_browser 28/28, s21 32/32,
  свод 13/13, adapter_os 19/19, live_mozg 13/13, live_wire 9/9, qr_vs_python 40/40.
- Наследственные провалы (есть и на чистом main — не от этого такта, в очередь
  ревизии): `test_llm_wire.py` 26/1 («пинг» не называет версию словаря — правило-слой
  отвечает, тест ждёт иное), `test_s18_browser.py` 29/3 (headless-аудио хоста/гостя
  и 404 ресурса в неполной песочнице). Оживить в своих тактах: ·18 → такт 7,
  LLM-слой → после рум.

«Ревизия — это не правка. Это приведение деклараций к инструментам.»
