СИНГУЛЯР ·17 «ЗАЛ» — P2P двойной экранэкран зала + пульт · BroadcastChannel + localStorage · без сервера
офлайн · 0 запросов · 0 innerHTML

Открой два окна — зал увидит песню

Это окно — большой экран зала. В ·16 «СУФЛЁР» включи галочку «⌇ в зал» — слова, колбаски и счёт полетят сюда без единого сервера (BroadcastChannel, фолбэк — localStorage). Из этого окна можно рулить плеером СУФЛЁРА кнопками пульта. Телевизор с браузером = экран зала; ноутбук/телефон = сцена.

—канал
000000счёт
×0комбо
—голос
0пакетов
песня: —
…

Пульт команды летят в ·16 СУФЛЁР

Команды применяются в том окне СУФЛЁРА, где включена трансляция. Зал ничего не скачивает и не играет — он только показывает.

Демо проверка зала без СУФЛЁРА

Демо имитирует источник: поток STATE с нотами, счётом и словами. Так проверяют зал на одном устройстве — второе окно с «ЗАЛом» должно оживить в ту же секунду.

⤳ Телефон = микрофон и пульт air-gapped WebRTC · SQ1-SQ2 · по ТЗ KARAOKE_TREND

канал: —

Сигналинг (QR/код) передаётся один раз любым способом — дальше связь чистый P2P: RTCPeerConnection(iceServers: []), DataChannel singulyar_p2p_data (ordered: false, maxRetransmits: 0). Ни роутера-сервера, ни облака: голос и команды летят напрямую.

Как соединить: 1) открой этот файл/страницу во втором окне или на ТВ; 2) в ·16 СУФЛЁР включи «⌇ в зал»; 3) этот экран оживёт. На сайте (https) работает всегда; на file:// — Chrome обычно да, Firefox/Safari изолируют file-вкладки (тогда запускай локальный сервер: python -m http.server).

Протокол открытый, версионированный

Канал singulyar-hall, пакеты {ver:1, t:HELLO|STATE|CMD|BYE|CRDT|CRDTHI|CRDTSNAP, src, seq, ts, v:значение для seek, …}. Транспорт-двойник: BroadcastChannel + localStorage-события, дедуп по src:seq. Зал — только рендер и пульт; аудио всегда живёт в окне сцены (·16). CRDT-конверты несут свой src реплики — транспорт их не перезаписывает.

Синхрон CRDT · сходится во всех окнах

👏 0 ★ 0 ♪ — синхрон: …

Очередь событий + CRDT (GSet / ORSet / LWW-регистр): каждое окно — своя реплика, сходятся к одному значению без ведущего. ★ — тумблер: второе нажатие снимает метку (OR-set — снимаются наблюдённые теги, новая метка возвращает песню). ♪ — последнее слово побеждает детерминированно (лэмпорт + src). Опоздавшее окно догоняет снимком; офлайн-окно доотправляет журнал при встрече; повторная доставка не меняет результат. Журнал живёт в памяти окна — честно. Канон: ДОКУМЕНТЫ/ТРЕКИ/LADOM_SINGULAR/src/sync-crdt.js — тот же файл, что гоняют тесты трека (18/18). Существующий STATE/CMD не тронут.

Круг своих локальные профили · согласие · повторный контакт без QR

круг: …

Первый контакт — по-прежнему QR/код (физика air-gapped WebRTC: SDP свеж при каждой встрече); рукопожатие по открытому каналу записывает профиль в круг. Повторный контакт — по памяти круга, без повторного QR: зал держит рендеву krug-ключ — мост вкладок того же браузера (чистый офлайн) и комната Nostr-релеев между устройствами (как звонки ·23; релеям нужен интернет — честная пометка, сам контакт остаётся P2P). Через рендеву зал доставляет свежий оффер WebRTC — канал встаёт как при QR. Согласие живёт только на твоём устройстве: «разрешено» впускает без вопроса, «спрошено» спрашивает, «запрещено» — честный отказ, «забыть» удаляет профиль. Канон: ДОКУМЕНТЫ/ТРЕКИ/LADOM_SINGULAR/src/krug-profiles.js — тот же файл, что гоняют тесты трека (22/22).

ЭФИР ДОМА · mesh-wire/0.1 (М1, этап 2 — такт v11.29 «КОНТУР»)

Лестница: вещание (вкладки этого браузера, BroadcastChannel) → данные (мост КС5) → релей (КС8). При импорте — ноль подключений; эфир открывается только по твоей кнопке.

вещание: ждёт · данные: не собраны · релей: не собран

Смещение зала — латенс-ядро/0.1 (М4, такт v11.47 «ЗАКРЫТИЕ»)

Глобальный временной синхрон: смещение участников — медиана разностей меток рукопожатий; компенсация — сдвиг расписания. Метки приносят участники по ЭФИРУ/ПИР — сеть только по явному действию (И-01). Живой дрейф-замер на железе — Г2 (владелец).

Агрегат вечера — агрегат-ядро/0.1 (М5, такт v11.47 «ЗАКРЫТИЕ»)

Коллективный интеллект без слежки: считаем только на устройстве; наружу — агрегат без личности. Категории с числом событий меньше k честно скрываются («меньше k»), вырожденный агрегат — честная пометка.

Зеркало каталога — зеркало-каталога/0.1 (М1, такт v11.47 «ЗАКРЫТИЕ»)

Content-addressed протокол М1: каждый файл — честные SHA-256-иды чанков (64 КБ), корень — хэш канонизированного списка. 0 сети: транспорт (IPFS-релеи) — снаружи, по явному действию человека (И-01). Файлы выбираешь ты — дом их не читает без тебя.