WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-489 · Задача · Инфраструктура · web

Дев-стенд на A2 (dev.wool2.online): каждая сборка сначала поднимается на A2 для проверки owner-ом/приёмками, потом сажается на прод A1 — сейчас отдельного дев-сайта нет (малинка :3010 ведёт на A1)

Закрыт P2 ведёт: —
Суть
## Суть одной фразой
Дев-стенд на A2 (dev.wool2.online): каждая сборка сначала поднимается на A2 для проверки, потом сажается на прод A1.

## Где мы сейчас (13.09.2026)
Стенд живой и здоровый: https://dev.wool2.online отвечает 401 (Basic Auth на месте), юниты nc-dev, nc-dev-pg, nc-dev-redis активны. Круг 6 (e49ad4f0) принят (ACCDEVSTANDA2R6 = GO), но на живой A2 НЕ установлен. Блокер «точная команда в отчёте на недоступном M4» снят: отчёт ACCDEVSTANDA2R6-REPORT.md с командой живого обновления лежит локально на M4 (/Users/milamarty/waves/). База стенда (установщик + юниты, infra/devstand/) в линии отсутствует, но полный набор восстановлен: коммит-цепочка 3d8f7ed4→423bb730→50c94164→305f222b→87d40bc4→e49ad4f0 и ветки agent/devstanda2r6-fix-20260903, keep/wt-1505-devstanda2r5, keep/wt-1542-devstanda2r6 в репо /Users/milamarty/nc; деплой-копии — на A2 (/home/ubuntu/dev/shared, /etc/systemd/system/nc-dev*.service, /etc/nc-dev, /etc/polkit-1/rules.d/50-nc-dev-ubuntu.rules). Слой волны 3674 (предстартовая проверка) в линии есть.

## Хронология
Owner GO 02.09 → волна 1362 (3d8f7ed4) → круги 1403/1447/1484 → GO 1492 (305f222b) → поднят на A2 03.09 (8 ручных отклонений) → шаг 8 (DNS+TLS+Basic Auth) выполнен → круг 5 (87d40bc4) → круг 6 (e49ad4f0) GO → слой в линию волной 3674 (13.09) → источник базы и команда обновления локализованы волной 3700 (13.09).

## Карта документов и кода
infra/devstand/ (install.sh, systemd/{nc-dev,nc-dev-pg,nc-dev-redis}.service, drop-ins, polkit/50-nc-dev-ubuntu.rules, dev-deploy.sh, nc-dev-refresh.sh, nginx, tests) — ветки agent/devstanda2r6-fix-20260903 и keep/wt-*; land/devstand/{systemd/nc-dev-pg.service.d/20-exec-path.conf,preflight.sh,FILE-MANIFEST.md}; отчёт /Users/milamarty/waves/ACCDEVSTANDA2R6-REPORT.md; waves/3700-wave-leftovers-janitor-out/DEVSTAND-GAPS.md.

## Остаток
- Установить круг 6 (e49ad4f0) на живой A2 командой из ACCDEVSTANDA2R6-REPORT.md (нужен owner-файл /home/ubuntu/devstand.env; ожидаемый простой 0 с) — координатор (⛔ SSH).
- Перенести infra/devstand/ (база) в линию из ветки agent/devstanda2r6-fix-20260903 — волна.

## Критерий закрытия
Круг 6 установлен на живой A2 (простой < 1 мин) + infra/devstand/ вмёржен в линию (база и слой 3674 в одном дереве).
---
_история_ — прежний текст тела (до 13.09.2026) координатор сохраняет ниже этой строки без изменений (append-only по WEB-449).

---

## история (тело до 13.09.2026)

## Суть одной фразой
Дев-стенд на A2 (dev.wool2.online): каждая сборка сначала поднимается на A2 для проверки, потом сажается на прод A1.

## Где мы сейчас (13.09.2026)
Стенд живой и здоровый: https://dev.wool2.online отвечает 401 (Basic Auth на месте), юниты nc-dev, nc-dev-pg, nc-dev-redis активны. Круг 6 (e49ad4f0) принят (ACCDEVSTANDA2R6 = GO на M4), но на живой A2 НЕ установлен — точная команда живого обновления лежит в отчёте приёмки на недоступном M4. Код infra/devstand в линии l115g отсутствует (только на невмёрженных ветках).

## Хронология
Owner GO 02.09 → волна 1362 (3d8f7ed4) → круги 1403/1447/1484 → GO 1492 (305f222b) → поднят на A2 03.09 (8 ручных отклонений) → шаг 8 (DNS+TLS+Basic Auth) выполнен → круг 5 (87d40bc4) → круг 6 (e49ad4f0) GO на M4, но не установлен → мойки 12.09 (3566), 13.09 (3622).

## Карта документов и кода
land/devstand/{systemd/nc-dev-pg.service.d/20-exec-path.conf,preflight.sh,FILE-MANIFEST.md}; tests/test-devstand-preflight.sh; отчёт ACCDEVSTANDA2R6-REPORT.md (на M4).

## Остаток
- Установить круг 6 (e49ad4f0) на живой A2 по отчёту приёмки (нужен M4) — координатор (⛔ SSH).
- Перенести код infra/devstand в линию — волна.

## Критерий закрытия
Круг 6 установлен на живой A2 (бюджет простоя < 1 мин) + код infra/devstand вмёржен в линию.
---
_история_ — прежний текст тела (до 13.09.2026) координатор сохраняет ниже этой строки без изменений (append-only по WEB-449).

---

## история (тело до 13.09.2026)

Owner 02.09 18:38 (voice): «дев — где чиним и собираем шишки, прод — финальный и вылизанный; я по старинке хожу на дев смотреть баги». Факт: веб-приложение на малинке больше не крутится, её порт 3010 = A1 (live-sha 9bee5955); с 31.08 все посадки только на A1; owner фактически проверял баги на проде (что совпадает с прежним принципом test-on-prod, пользователей нет). Предложение (сообщено owner-у 18:50): дев-стенд = A2 (там уже сборки, dry-run юнит на :3011, PG-реплика read-only): после каждой сборки l9x автоматически подниматься на A2 как dev.wool2.online (DNS A-запись → A2 129.x/публичный IP A2, nginx+TLS, отдельная БД-копия из реплики или песочница restore из Hetzner — решить: реплика read-only не подходит для записи; вариант — ежедневный restore-снимок в песочницу как в репетиции 1c, RTO ≈5 мин), с QA-аккаунтами; прод — после приёмок. Ограничения: A2 = 4 vCPU/23 GB, сборка + дев одновременно — следить за нагрузкой; secrets — только дев-ключи/каппы (память dev-test-default-yes-spend-flags). План: волна дизайна+реализации (unit nc-a2-dev, nginx, DNS через owner/API, скрипт land-dev.sh из артефакта, БД-песочница) → приёмка → включение. Ждёт реакции owner-а на предложение (18:50).
Лента
2026-09-02T21:13:31.966Z · Fable
[A1 21:15 Фабл] OWNER GO 02.09 21:11 (Telegram): «держать версию dev на A2 — да, можно делать dev». План (волна 1362-devstanda2, A1, Luna xhigh, от прода 02d032e4): nc-dev.service на A2 (порт 3030) + собственный PG-кластер nc-dev-pg (55433, первичное наполнение из тёплой копии hetzbk, refresh по требованию) + Redis 6390; доступ через nginx A1 dev.wool2.online → A2:3030 (TLS на A1); dev-deploy.sh <artifact> с prisma migrate deploy на dev-БД, boot-contract, flip/rollback; хук в l9xchain.sh после PACK_OK → кандидат автоматически поднимается на dev до посадки на прод; изоляция портов/каталогов/квот от реплики, репетиций, сборки; в .env.dev нет боевых провайдеров/ботов/вебхуков. От owner-а: DNS A-запись dev.wool2.online → 129.213.25.105 и решение по basic-auth на dev. Установку делаю после GO приёмки.
2026-09-02T21:57:56.895Z · Fable
[A1 22:35 Фабл] Волна 1362-devstanda2 сдана: коммит 3d8f7ed4ba (infra/devstand: nc-dev/nc-dev-pg/Redis юниты, dev-deploy.sh с prisma migrate deploy + boot-contract + flip/rollback, nc-dev-refresh.sh из тёплой копии, хук DEV_AUTODEPLOY в l9xchain.sh, nginx vhost A1, тесты на шимах). Отчёт: A1 /home/ubuntu/waves/DEVSTANDA2-REPORT.md. Дальше: приёмка 1381-accdevstanda2 (A1, Sol high, в очереди) → установка на A2/A1 координатором → DNS от owner-а → первый кандидат l94 на dev.
2026-09-02T22:48:15.162Z · Fable
[A1 01:40 Фабл] Приёмка 1381-accdevstanda2 = NO-GO (отчёт A1 /home/ubuntu/waves/ACCDEVSTANDA2-REPORT.md), 7 блокеров: B1 rollback не откатывает NC_RELEASE_DIR в .env.dev (юнит стартует не из current); B2 ошибка dev-autodeploy рвёт build-chain после PACK_OK (exec в хуке); B3 порт dev-PG 55433 уже занят репликой на A2, override не доходит до deploy; B4 финальный nginx-vhost невалиден на nginx 1.24 (http2 on); B5 install.sh делает каталоги root:root и не копирует sibling-скрипты; B6 shellcheck rc=1; B7 «dev не пишет на Storage Box» не fail-closed (HETZBK_* ключи принимаются). Работает: изоляция юнитов, sha-проверка, миграции на dev-БД, генерация env. Круг 2 = волна 1403-devstanda2r2 (A1, Luna xhigh, от 3d8f7ed4).
2026-09-03T00:12:55.373Z · Fable
[A1 06:55 Фабл] Волна 1403-devstanda2r2 сдана: коммит 423bb7301b (rollback env, hook не рвёт chain, порт dev-PG, nginx 1.24, ownership/sibling-скрипты, shellcheck, fail-closed HETZBK). Отчёт: A1 /home/ubuntu/waves/DEVSTANDA2R2-REPORT.md. Приёмка 1428 (A1, Sol high, в очереди) → установка на A2/A1 → DNS от owner-а.
2026-09-03T02:11:55.923Z · Fable
[A1 Фабл] Приёмка 1428-accdevstanda2r2 = NO-GO (коммит 423bb730): N1 nc-dev.service IPAddressDeny=any + Allow только loopback → ingress с A1 (10.0.0.131 → A2 10.1.1.219:3030) режется; N2 /var/lib/nc-dev postgres:postgres 0750 → redis (uid 115) не проходит к StateDirectory; N3 README фиксирует l93 SHA 02d032e4 как «l94». Круг 3 = волна 1447 (A1, Luna high): параметризованный ingress-CIDR + fail-closed egress, раздельные data-roots с uid/gid-тестом, identity кандидата из /etc/nc-dev/candidate.env.
2026-09-03T04:32:47.835Z · Fable
[A1 Фабл] Волна 1447-devstanda2r3 сдана: коммит 50c94164 (N1 ingress-CIDR параметром + fail-closed egress, N2 раздельные data-roots, N3 candidate.env; B1–B7 PASS по отчёту автора). Приёмка 1473 (A1, Sol high) в очереди.
2026-09-03T05:08:44.987Z · Fable
[A1 Фабл] Приёмка 1473-accdevstanda2r3 = NO-GO (50c94164): N1/N2/B1–B7 PASS; N3 не полностью — dev-deploy.sh обходит candidate.env через positional artifact + DEV_ATTESTATION_PATH; README содержит полный SHA l94. Круг 4 = волна 1484 (A1, Luna medium).
2026-09-03T05:38:05.527Z · Fable
[A1 Фабл] Волна 1484-devstanda2r4 сдана: коммит 305f222b. Приёмка 1492 (A1, Sol high) в очереди.
2026-09-03T06:00:07.537Z · Fable
[A1 Фабл] Приёмка 1492-accdevstanda2r4 = GO (Sol high): N1–N3, B1–B7. Коммит 305f222b (круг 4). Ставлю на A2 (шаги 2–7: install, dev PG 55450 из тёплой копии, dev redis, receipt candidate.env=l95, dev-deploy → :3030). Шаг 8 (nginx на A1 + сертификат) ждёт owner-inputs: DNS A dev.wool2.online → 129.213.25.105 и Basic Auth / allowlist.
2026-09-03T06:32:03.200Z · Fable
[A2 Фабл] Дев-стенд ПОДНЯТ на A2: nc-dev :3030 на l95 (health 200, ready true, paid dormant), nc-dev-pg 55450 из тёплой копии (timeline 2, миграции применены), nc-dev-redis 6390; ingress только с A1 (публичный 129.213.25.105) + loopback. Потребовалось 8 ручных отклонений (chown/recovery в refresh, exec-path, права /etc/nc-dev, LINE-формат, symlink-policy артефакта, polkit для рестарта, origin-lock для health) → круг 5 = волна 1505 (Luna high). Шаг 8 ждёт owner: DNS A dev.wool2.online → 129.213.25.105 + Basic Auth/allowlist; upstream nginx = 129.80.41.210:3030 (10.x между A1/A2 нет).
2026-09-03T06:43:11.505Z · Fable
[A1 Фабл] ШАГ 8 ВЫПОЛНЕН: https://dev.wool2.online живой — DNS в BIND на Pi, vhost /etc/nginx/sites-available/dev.wool2.online.conf, cert Let's Encrypt (webroot, до 02.12), Basic Auth (/etc/nginx/.htpasswd-nc-dev, creds в /home/ubuntu/ops-backups/devstand/basic-auth.txt 600). Upstream: A1→A2:3030 напрямую закрыт OCI security list → reverse ssh-туннель a1-tunnel-dev.service на A2 (127.0.0.1:3031 на A1). Для круга 5 (1505 на M4): либо OCI ingress 129.213.25.105→A2:3030, либо туннель-unit в линии; шаблоны с 10.1.1.219 не применимы.
2026-09-03T06:55:15.051Z · Fable
[M4 Фабл] Волна 1505-devstanda2r5 сдана: коммит 87d40bc4 (8 отклонений живой установки). Приёмка 1508 (M4, Sol high) в очереди.
2026-09-03T07:56:45.246Z · coordinator
Dev-стенд круг 6 (волна 1542, M4) СДАН: коммит e49ad4f0 (база 87d40bc4). Закрывает NO-GO 1508: полный preflight существования source-файлов до первого изменения destination + исправленный путь systemd/nc-dev-pg.service.d/20-exec-path.conf (из-за него install.sh падал всегда и polkit rule не ставилась), плюс чинит собственные дефекты harness (литеральные \" в строках 537–541, systemctl-shim source EnvironmentFile → rc=52 вместо 53). Приёмка = волна 1546 на M4 (контейнерная установка поверх фикстуры круга 4, идемпотентность, чистый B1–B7 без обходов). Живой dev.wool2.online приёмка не трогает.
2026-09-03T16:16:10.096Z · coordinator
03.09 21:45 IST. Живую установку круга 6 на A2 выполнить НЕ удалось и импровизировать я не стал. Круг 6 принят на M4 (ACCDEVSTANDA2R6 = GO, коммит e49ad4f01c7f0d862ee368b97e96d67a03cc907b), но точная команда живого обновления с бэкапами, откатом и бюджетом простоя менее минуты лежит в отчёте приёмки на M4, а M4 сейчас недоступен по сети (ping 100% потерь, ssh таймаут). Проверено: ни коммита e49ad4f0, ни отчёта ACCDEVSTANDA2R6-REPORT.md нет ни на A1 (/home/ubuntu/nc, /home/ubuntu/waves, /home/ubuntu/mirrors), ни на A2 (/home/ubuntu/nc-waves, /home/ubuntu/waves). Ставить установку по памяти на живой стенд опасно — прошлый круг именно на установке и провалился. Текущее состояние стенда здоровое: https://dev.wool2.online отвечает 401 (Basic Auth на месте), юниты nc-dev, nc-dev-pg, nc-dev-redis активны. Тикет остаётся в review до возвращения M4.
2026-09-10T18:55:03.765Z · coordinator
BOARD-WASH-20260910:WAVE-3339
По поручению владельца 18:43Z назначена исполнительская волна 3339 (infra), Codex gpt-5.6-luna xhigh, A1. Полная история карточки и база l115c 1ad52e16b доставлены, brief-guard и проверка Git-базы пройдены. Задача: проверить существующую сдачу, устранить остатки, передать бандл и доказательства. Финальная приёмка и посадка остаются за координатором. Запуск группы подтверждён в журнале диспетчера.
КАРТА ДОКУМЕНТОВ: ноут /Users/annakorin/nc-ops-scripts/board-wash-20260910/3339-wash-infra-brief.md; A1 /home/wave/waves/inputs/board-wash-20260910/infra-tickets.json; ожидаемый отчёт /home/wave/waves/3339WASHINFRA-REPORT.md. Правила обогащения: WEB-449.
2026-09-12T22:17:55.091Z · coordinator
[12.09 22:17Z координатор] МОЙКА 12.09 (3566-wash-g1-infra): дев-стенд на A2 живой (dev.wool2.online, 401 Basic Auth, юниты активны), но круг 6 (e49ad4f0) на живой A2 не установлен — отчёт приёмки был на M4. Код infra/devstand в линии l115g отсутствует. Остаток: установить круг 6 на A2. Статус не меняю.
Остаток: Установить круг 6 (e49ad4f0) на живой A2 по отчёту приёмки (нужен M4).; Перенести код infra/devstand в линию l115g (сейчас только на невмёрженных ветках).
Отчёт: /Users/milamarty/waves/3566WASH*-REPORT.md (M4), копия nc-ops-scripts/shift-20260912-resume/wash-20260912/collected/. Проверка по исходнику прода l115g (9c8a9762).
2026-09-13T07:37:30.943Z · coordinator
[13.09 07:37Z координатор] РАЗБОР 13.09 (волна 3622, DeepSeek): Дев-стенд — это место, где мы сначала смотрим новые версии сайта и ловим ошибки, и только потом везём их на настоящий сайт. Стенд на A2 уже живой и здоровый: dev.wool2.online открывается и спрашивает пароль. Остался последний шаг «круг 6» — починка установщика, чтобы он больше не падал. Но точную инструкцию, как обновить живой стенд, увезли на компьютер M4, который сейчас не отвечает. Я написал готовые файлы для этой починки и чек-лист. Ставить на живой стенд без той инструкции опасно — поэтому ждём M4, а потом координатор поставит всё за минуту.
Остаток: Установить круг 6 (e49ad4f01c7f0d862ee368b97e96d67a03cc907b) на живой A2 по отчёту приёмки ACCDEVSTANDA2R6-REPORT.md (отчёт на недоступном M4).; Перенести код infra/devstand в линию l115g (сейчас только на невмёрженных ветках; wash: infra/devstand found=false).; Точные имена веток в карточке не названы (только номера волн 1362/1403/1447/1484/1505/1542 и коммиты 3d8f7ed4ba/423bb7301b/50c94164/305f222b/87d40bc4/e49ad4f0).
Предложение: Реконструирован только круг-6-слой (точно описан в истории): systemd/nc-dev-pg.service.d/20-exec-path.conf (исправленный путь) и preflight.sh (проверка всех source-файлов до изменения destination), плюс инвентарь FILE-MANIFEST.md и вставка в install.sh (source preflight.sh; preflight || exit 1; верный путь к 20-exec-path.conf). База кругов 1–5 берётся с невмёрженной ветки целиком (не фабрикую). Жи
Ссылки: land/devstand/systemd/nc-dev-pg.service.d/20-exec-path.conf; land/devstand/preflight.sh; land/devstand/FILE-MANIFEST.md; tests/test-devstand-preflight.sh
Материалы волны: shift-20260912-resume/colM|colP/ (RESULT.md + спецификации). Статус не меняю — применяю по мере прогона.
2026-09-13T10:45:17.058Z · coordinator
[13.09 10:45Z координатор] Мойка доски, волна 3653. RETURN: дев-стенд на A2 живой и здоровый (dev.wool2.online отвечает 401 Basic Auth, юниты nc-dev/nc-dev-pg/nc-dev-redis активны), но круг 6 (e49ad4f0) на живой A2 НЕ установлен (отчёт приёмки на недоступном M4), код infra/devstand не в линии l115g. Остаток: установка после возврата M4 + вмёржить код (⛔ мойке). Статус не меняю.
2026-09-13T11:16:20.328Z · coordinator
[13.09 11:16Z координатор] Из волны 3674: собственный слой дев-стенда (предстартовая проверка, настройка пути запуска, опись файлов, тест) внесён в линию. База стенда — установщик и юниты — отсутствует и в дереве линии, и во входах; волна не стала её реконструировать, и это правильно. Пока базы нет, предстартовая проверка лежит сиротой.
Остаток: восстановить базу стенда из рабочей машины A2 и посадить отдельно.
2026-09-13T12:36:48.512Z · coordinator
[13.09 12:36Z координатор] Волна 3700. RETURN: дев-стенд на A2 живой и здоровый (dev.wool2.online 401 Basic Auth, юниты nc-dev/nc-dev-pg/nc-dev-redis активны). Круг 6 (e49ad4f0) принят (ACCDEVSTANDA2R6=GO), но на живой A2 не установлен. Блокер «отчёт приёмки на недоступном M4» СНЯТ: ACCDEVSTANDA2R6-REPORT.md с точной командой найден локально на M4. База стенда infra/devstand/ найдена в репо /Users/milamarty/nc (ветка agent/devstanda2r6-fix-20260903, цепочка 3d8f7ed4→…→e49ad4f0). Остаток: установить круг 6 на A2 (координатор, ⛔ SSH) + вмёржить infra/devstand/ в линию (волна). Статус не меняю.
2026-09-14T15:16:35.584Z · coordinator
[14.09 15:16Z координатор] # WEB-489 - блок для вставки

Источники, проверенные отсюда: тело тикета из live API; все 20 комментариев из локального `web-board.sqlite`, последний комментарий `id=4776` от 2026-09-13T12:36:48.512Z. Статус на live API при финальной сверке: `in_progress`. A2/dev.wool2.online live отсюда не проверялись.

## Что болит словами пользователя

Владелец должен смотреть новые версии на dev-стенде, а не на проде. Старый Pi `:3010` больше не был отдельным dev, поэтому ошибки попадали в проверку прямо на production path.

## Что уже сделано и чем доказано

По телу и комментариям: dev-stand на A2 поднят и отвечает `401 Basic Auth`; юниты `nc-dev`, `nc-dev-pg`, `nc-dev-redis` активны; round 4 был установлен; round 6 `e49ad4f0` принят (`ACCDEVSTANDA2R6=GO`). Комментарий `id=4776` снимает старый blocker: отчёт с точной командой найден на M4; база `infra/devstand/` найдена в `/Users/milamarty/nc` на ветке `agent/devstanda2r6-fix-20260903` и keep-worktrees.

## Что осталось

Установить round 6 на живой A2 по найденному report и вмержить base `infra/devstand/` в линию. Комментарий `id=4833` по post-QA l115k говорит, что WEB-489 не проверяется HTTP-пробой прода: нужны host prep scripts и root-доступ.

## Противоречия между комментариями

Ранние `id=4363`, `id=4543`, `id=4666` говорят “ждём M4, команда недоступна”. Поздний `id=4776` отменяет это: команда найдена, база локализована. Старый заголовок “отдельного dev-сайта нет” тоже устарел: dev.wool2.online заявлен живым, проблема теперь в round 6 и линии.

## С ЧЕГО НАЧАТЬ НУЛЕВОМУ АГЕНТУ

Смотреть: `/Users/milamarty/waves/ACCDEVSTANDA2R6-REPORT.md`, repo `/Users/milamarty/nc`, branch `agent/devstanda2r6-fix-20260903`, keep trees `keep/wt-1505-devstanda2r5`, `keep/wt-1542-devstanda2r6`, A2 paths `/home/ubuntu/dev/shared`, systemd `nc-dev*`.

Первый шаг: восстановить `infra/devstand/` base into candidate line without reconstruction by memory; separately plan A2 live update from the exact report command.

Готово: round 6 installed on A2 with receipt; `infra/devstand/` base and wave 3674 layer live in one repository tree; dev.wool2.online remains 401 and units are healthy.

Нельзя: ставить на prod A1, фабриковать base from the orphan layer, выполнять root/SSH host changes from M1, считать prod post-QA proof достаточным для devstand.

Размер: смена. Большим это делает работа на A2/root plus merge of recovered infra base; старый M4 blocker уже снят.

## Закрытие и связи

Не закрыто. Дублей внутри набора не доказано.
2026-09-14T16:54:32.156Z · coordinator
[14.09 16:54Z координатор] VERDICT=GO

# 3893-web489-devstand — WEB-489: дев-стенд на A2 — что реально стоит и чего не хватает

Волна 3893 (диспетчер deepseek-v4-pro, база `refs/waves/l115n`, HEAD `d85bb2dad`).
Только дерево и тикет. Стенд на A2 не трогали, SSH не было, sudo не было, секретов не было.

## 0. Резюме (30 секунд)

Тикет WEB-489 висит **не потому, что «ждём M4»**. Всё, что было «на недоступном M4»,
фактически **лежит на этой машине (milamarty)**:

- **База стенда (круги 1–6) — в `~/nc`**, на ветках `agent/devstanda2r6-fix-20260903`,
  `keep/1546-accdevstanda2r6`, `keep/wt-1542-devstanda2r6` (проверено: коммиты
  `3d8f7ed4b → 423bb7301 → 50c94164 → 305f222b → 87d40bc4 → e49ad4f0` все есть).
- **Отчёт приёмки круга 6** `ACCDEVSTANDA2R6-REPORT.md` и **точная команда живого
  обновления A2** — в `~/waves/` (проверено, прочитан).
- **Круг 6 НЕ установлен на живой A2** — стенд крутится на установке **круга 4** (`305f222b`),
  кандидат `l95` (по комментариям; с этой машины на A2 не видно — проверить командой ниже).
- **База НЕ в линии** — в `refs/waves/l115n` лежат только 4 реконструированных файла
  «слоя круга 6», и они **не совпадают с настоящей базой** (проверено: файл
  `20-exec-path.conf` в линии ≠ файлу в `e49ad4f0`).

Граница: **что осталось сделать — это работа координатора/owner-а (SSH на A2 + root +
owner-approved `devstand.env` + решение о мёрже в линию), а не волны.** Волна свела концы
и передаёт базу бандлом `3893WEB489.bundle`.

---

## 1. Фактическое состояние (каждый факт — с номером комментария)

Источник карточки: `web489-full.json` (19 комментариев, свежайший локальный экспорт —
`inputs/3700-wave-leftovers-janitor/tickets.json`, комментарии до `id=4726` от 13.09 11:16Z).

**Что уже стоит и как поднималось (по комментариям):**

| Факт | Источник (id) |
|---|---|
| Owner дал GO 02.09 21:11 «держать версию dev на A2 — можно делать dev» | `780` |
| Круг 1 = волна 1362, коммит `3d8f7ed4ba`: юниты nc-dev(:3030)/nc-dev-pg/Redis, `dev-deploy.sh` (prisma migrate deploy + boot-contract + flip/rollback), `nc-dev-refresh.sh`, хук `DEV_AUTODEPLOY` в l9xchain.sh после PACK_OK, nginx vhost | `802` |
| Приёмка круга 1 = NO-GO, 7 блокеров B1–B7 (rollback env, hook рвёт chain, порт PG 55433 занят репликой, nginx http2, root:root каталоги, shellcheck, HETZBK не fail-closed) | `823` |
| Круг 2 = волна 1403, коммит `423bb7301b` | `854` |
| Приёмка круга 2 = NO-GO, N1–N3 (ingress режется, redis не проходит к StateDirectory, README sha) | `889` |
| Круг 3 = волна 1447, коммит `50c94164` | `926` |
| Приёмка круга 3 = NO-GO (N3 не полностью) | `938` |
| Круг 4 = волна 1484, коммит `305f222b` | `954` |
| **Приёмка круга 4 = GO** (N1–N3, B1–B7) | `964` |
| **Дев-стенд ПОДНЯТ на A2**: nc-dev :3030 на **l95**, nc-dev-pg 55450 из тёплой копии, nc-dev-redis 6390, ingress только с A1+loopback. 8 ручных отклонений → круг 5 | `977` |
| Шаг 8 выполнен: `https://dev.wool2.online` живой, TLS (до 02.12), Basic Auth, upstream через reverse ssh-туннель `a1-tunnel-dev.service` (127.0.0.1:3031 на A1) — прямой A1→A2:3030 закрыт OCI security list | `980` |
| Круг 5 = волна 1505, коммит `87d40bc4` (8 отклонений живой установки) | `982` |
| Круг 6 = волна 1542, коммит `e49ad4f0` (база `87d40bc4`): preflight source-файлов + путь `20-exec-path.conf` | `1013` |
| **Круг 6 принят GO на M4** (ACCDEVSTANDA2R6), но **живую установку круга 6 на A2 выполнить НЕ удалось**; коммит и отчёт «не найдены на A1/A2, на недоступном M4» | `1044` |
| Мойка 12.09: стенд живой (401 Basic Auth, юниты активны), **круг 6 (e49ad4f0) на живой A2 не установлен**, код infra/devstand в линии l115g отсутствует | `4363` |
| Разбор 13.09 (волна 3622): **ждём M4**; «написал готовые файлы и чек-лист» | `4543` |
| Мойка 13.09 (3653): круг 6 не установлен, код не в линии l115g | `4666` |
| Из волны 3674: **собственный слой** (preflight + 20-exec-path.conf + FILE-MANIFEST + тест) **внесён в линию**; «база стенда отсутствует и в дереве линии, и во входах» | `4726` |

**Что доказано на этой машине (мои проверки):**

- Круги 1–4 в `~/nc-mirror` на `remotes/origin/devstand4-1484` (+ `keep/*`). Круги 5–6
  **отсутствуют** в `~/nc-mirror` (`cat-file -t` → «not a valid object name»).
- Круги 1–6 **есть** в `~/nc` (полное дерево `infra/devstand` из 25 файлов на `e49ad4f0`):
  `install.sh`, `dev-deploy.sh`, `nc-dev-refresh.sh`, `nc-dev-start.sh`, `nc-dev-pg-start.sh`,
  `systemd/nc-dev*.service`, `systemd/nc-dev-pg.service.d/20-exec-path.conf`,
  `systemd/nc-dev.service.d/10-devstand-ingress.conf.in`, `polkit/50-nc-dev-ubuntu.rules`,
  `nginx/dev.wool2.online*.conf`, `tests/test_devstand.sh` и др.
- `ACCDEVSTANDA2R6-REPORT.md` (приёмка круга 6 = GO) и `DEVSTANDA2R6-REPORT.md` (сдача круга 6)
  лежат в `~/waves/` и прочитаны. В приёмке — **каноническая исправленная команда живого
  обновления A2** (см. §4).
- В линии `refs/waves/l115n` — **только 4 файла** `infra/devstand/`:
  `preflight.sh`, `FILE-MANIFEST.md`, `systemd/nc-dev-pg.service.d/20-exec-path.conf`,
  `tests/test-devstand-preflight.sh`. Ни `install.sh`, ни юнитов, ни `dev-deploy.sh` — нет.

---

## 2. Противоречия между комментариями (какой новее и потому главнее)

Одно противоречие уже найдено обогащением (волна 3869): `id=4776` отменяет «ждём M4».
**Этот комментарий `id=4776` в локальных экспортах доски я НЕ нашёл** (самый свежий
локальный комментарий WEB-489 — `id=4726`; `id=4776` встречается только как комментарий
IOS-001 в `ios-full.json`). Поэтому факт «id=4776 отменяет ждём M4» я фиксирую как
**ЗАЯВЛЕНО (в брифе от обогащения 3869), НЕ проверено отсюда**.

Остальные противоречия, которые я нашёл и проверил сам:

1. **«Коммит e49ad4f0 и отчёт ACCDEVSTANDA2R6 — на недоступном M4»** (`1044`, `4363`, `4543`,
   `4666`, `4726`) **против факта: и коммит, и оба отчёта лежат на этой машине.**
   Новее `4726` (13.09 11:16), но и он повторяет «база отсутствует … во входах». Главнее —
   **факт, проверенный мной**: база есть в `~/nc`, отчёт в `~/waves/`. «Ждём M4» — устаревший вывод.
2. **«Код infra/devstand в линии l115g отсутствует»** (`4363`, `4543`, `4666`) **против
   «собственный слой внесён в линию»** (`4726`). Новее `4726` — он прав: слой в линии есть,
   но это **реконструкция, не настоящая база**.
3. **Реконструкция слоя ≠ настоящий круг 6.** Файл `systemd/nc-dev-pg.service.d/20-exec-path.conf`
   в линии задаёт `Environment=PATH=/usr/lib/postgresql/16/bin:…`, а настоящий (в `e49ad4f0`) —
   `ExecStart=/usr/local/libexec/nc-dev-pg-start.sh`. Реконструкция выдумала отдельный
   `preflight.sh` и polkit `50-nc-dev.pkla`; в настоящей базе preflight встроен в `install.sh`,
   а polkit — `50-nc-dev-ubuntu.rules`. (Проверено чтением обоих файлов.) Новее — настоящая
   база `e49ad4f0`.
4. **Ingress: «nginx A1 → A2:3030 напрямую (TLS на A1)»** (`780`) **против** «upstream
   129.80.41.210:3030» (`977`) **против** «обратный ssh-туннель a1-tunnel-dev.service →
   127.0.0.1:3031» (`980`). Новее `980` — фактический рабочий путь это туннель.
5. **Порт dev-PG: 55433** (`780`) **против 55450** (`964`, `977`). Новее `964/977` — 55450
   (55433 был занят репликой, B3 в `823`).
6. **Кандидат: «первый l94»** (`802`) **против «l95»** (`964`, `977`). Новее — l95.
7. **«Круг 6 принят GO»** (`1044`) **против «круг 6 не установлен на живой A2»** (`1044`, `4363`,
   `4543`, `4666`). Это не ошибка, а суть разрыва: принято на M4, но не установлено живьём.

---

## 3. Что конкретно значит «круг 6 не установлен» и «база не в линии»

**«Круг 6 не установлен»** = живой A2 стенд работает на раскладке **круга 4** (`305f222b`),
поднят 03.09 (комментарии `964`, `977`) на кандидате `l95`, плюс 8 ручных отклонений,
задокументированных как круг 5 (`87d40bc4`, `982`). Коммит круга 6 `e49ad4f0` (чинит
`install.sh`, чтобы он не падал до установки `20-exec-path.conf` и polkit-правила — см.
`1013`, `ACCDEVSTANDA2R6-REPORT.md`) **на A2 не прогнан**. То есть на стенде могут отсутствовать:
правильный drop-in `20-exec-path.conf` и polkit-правило `/etc/polkit-1/rules.d/50-nc-dev-ubuntu.rules`.

**Какой коммит где:**
- На стенде (A2, живой): **круг 4 `305f222b`** (кандидат `l95`) + ручные отклонения круга 5.
  Точный live-SHA с этой машины **не проверяем** (нет SSH на A2) — см. команду проверки ниже.
- В линии (`refs/waves/l115n`, `d85bb2dad` от 14.09 11:35): **базы нет**, только 4
  реконструированных файла слоя круга 6.
- Полная база (круги 1–6): **в `~/nc`** на ветках `agent/devstanda2r6-fix-20260903`,
  `keep/1546-accdevstanda2r6`, `keep/wt-1542-devstanda2r6`; круги 1–4 также в `~/nc-mirror`
  на `remotes/origin/devstand4-1484`.

**На сколько разошлись:** линия отстаёт от полной базы на **весь базовый код** (25 файлов
`infra/devstand/` на `e49ad4f0` против 4 в линии; пересечение — только один файл с **разным**
содержимым). Стенд стоит на круге 4 — на 2 круга позади принятой базы (круг 6).

**Команда проверки на A2** (для координатора, у которого есть доступ; отсюда не выполняется):

```bash
# identity кандидата на стенде
cat /etc/nc-dev/candidate.env
# здоровье юнитов
systemctl is-active nc-dev.service nc-dev-pg.service nc-dev-redis.service
# установлен ли drop-in круга 6 и polkit
test -f /etc/systemd/system/nc-dev-pg.service.d/20-exec-path.conf && cat /etc/systemd/system/nc-dev-pg.service.d/20-exec-path.conf
test -f /etc/polkit-1/rules.d/50-nc-dev-ubuntu.rules && echo POLKIT_OK
# локальный health (на A2)
curl --fail -s -H 'Host: dev.wool2.online' http://127.0.0.1:3030/api/health
# извне (с любой машины с доступом к интернету)
curl -s -o /dev/null -w '%{http_code}\n' https://dev.wool2.online   # ожидается 401
```

---

## 4. Чек-лист для координатора (к состоянию «каждая сборка сначала сюда»)

0. **Принять факт:** M4 не нужен — база и отчёт на машине milamarty. Проверка:
   `git -C ~/nc show e49ad4f0` и `cat ~/waves/ACCDEVSTANDA2R6-REPORT.md`. Считается сделанным,
   когда команда из §4 видна и `git rev-parse e49ad4f0` возвращает SHA.

1. **Получить базу бандлом** (уже готов): `3893WEB489.bundle` (+`.sha256`). Проверка:
   `git bundle verify ~/waves/3893WEB489.bundle` → «OK». Считается сделанным, когда в бандле
   виден `e49ad4f01c7f0d862ee368b97e96d67a03cc907b`.

2. **Сверить реконструкцию в линии с настоящей базой** и решить, что делать с расхождением
   `20-exec-path.conf` (реконструкция задаёт PATH, настоящая — ExecStart). Решение владельца.
   Проверка: `diff <(git -C ~/waves/wt-3893-web489 show HEAD:infra/devstand/systemd/nc-dev-pg.service.d/20-exec-path.conf) <(git -C ~/nc show e49ad4f0:infra/devstand/systemd/nc-dev-pg.service.d/20-exec-path.conf)`.
   Считается сделанным, когда зафиксировано: вмёрживать настоящую базу или держать реконструкцию.

3. **Вмёржить `infra/devstand` (круги 1–6) в линию** (не волна — изменение общего дерева).
   Строка из приёмки: cherry-pick диапазона `87d40bc48..e49ad4f0` поверх текущей линии
   (в приёмке на `3f55a889` были modify/delete конфликты на `install.sh`/`test_devstand.sh` —
   потому что l96-candidate удалил эти пути; решать осознанно). Проверка:
   `git ls-tree -r HEAD infra/devstand` показывает `install.sh`, `dev-deploy.sh`, юниты,
   `polkit/50-nc-dev-ubuntu.rules`. Считается сделанным, когда настоящая база в линии.

4. **Установить круг 6 на живой A2** — только с доступом к A2 + root + owner-approved
   `/home/ubuntu/devstand.env`. Использовать **каноническую команду из
   `ACCDEVSTANDA2R6-REPORT.md`** (раздел «Точная команда живого обновления A2»), а НЕ
   авторскую из `DEVSTANDA2R6-REPORT.md` (у авторской `backup="${stamp}"` — относительный
   каталог, и лишний рестарт PG; в приёмке это исправлено). Проверка после:
   `systemctl is-active nc-dev nc-dev-pg nc-dev-redis`, drop-in и polkit на месте,
   `curl …/api/health` → 200, `https://dev.wool2.online` → 401. Считается сделанным, когда
   стенд на круге 6 и простой был 0 сек.

5. **Убедиться, что авто-подъём включён:** хук `DEV_AUTODEPLOY` в `l9xchain.sh` после
   `PACK_OK` есть и активен (круг 1, `802`). Проверка: следующий кандидат (l96+) после
   сборки сам поднимается на dev до посадки на прод. Считается сделанным, когда «каждая
   сборка сначала сюда» выполнена end-to-end на реальном кандидате.

6. **Закрыть WEB-489** (owner/координатор): статус из `in_progress` в closed, когда п.5
   пройден на живом кандидате.

---

## 5. Чего волна сделать НЕ может (вынести отдельно, это НЕ работа волны)

- **Установить круг 6 на живой A2** — нужен SSH на A2 + sudo/root (⛔ запрещено волне;
  ⛔ стенд на A2 не трогать — там идут замеры ёмкости).
- **Вмёржить `infra/devstand` в линию** — изменение общего дерева, решение координатора/owner-а.
- **Запустить команду живого обновления** — нужен owner-approved `/home/ubuntu/devstand.env`
  (секреты) и root на A2.
- **Проверить текущее реальное состояние стенда** — нет сетевого доступа к A2 с этой машины
  (пинг/ssh недоступны; не проверял и не утверждаю).
- **DNS / Basic Auth / nginx на A1 или Pi** — уже сделано (`980`); любые правки требуют
  доступа к A1/Pi и решения owner-а.
- **Решить судьбу реконструкции vs настоящей базы** (расхождение `20-exec-path.conf`) — решение владельца.

Всё, что выше — задачи координатора/owner-а, а не волны. Волна сделала то, что можно без
доступа к A2: собрала состояние, нашла базу и команду, передала их бандлом.

---

## 6. ДЛЯ ТИКЕТА (детским языком — след для нулевого агента)

**Что это вообще.** Есть сайт. Раньше новые версии сразу ставили на «настоящий» сайт (прод A1)
и там же ловили ошибки. Хотели, чтобы сначала новые версии ставили на «тренировочный» сайт
(дев-стенд на A2, адрес `dev.wool2.online`), а на настоящий — только после проверки.

**Что есть.** Тренировочный сайт **уже живёт и работает**: открывается по адресу
`dev.wool2.online`, спрашивает пароль (401), юниты `nc-dev`, `nc-dev-pg`, `nc-dev-redis`
активны. Это сделали ещё 03.09 (волны 1362→1484, «круг 4», кандидат `l95`).

**Чего не хватает.** Последняя починка «круг 6» (коммит `e49ad4f0`) — она чинит установщик,
чтобы он не падал на полпути. Её **приняли как правильную, но на тренировочный сайт так и не
поставили**. А сам код стенда **не лежит в общей линии** — в линии есть только 4 файла-«заготовки»,
которые один агент нарисовал по памяти, и они **не совпадают** с настоящим кодом.

**ГДЕ ГРАНИЦА.** Главное открытие этой волны: **ничего не потеряно и не «на недоступном
компьютере M4»**. Настоящий код стенда (все 6 кругов) лежит на этой машине в папке `~/nc`
(ветки `agent/devstanda2r6-fix-20260903`, `keep/1546-accdevstanda2r6`), а точная инструкция,
как обновить тренировочный сайт, — в файле `~/waves/ACCDEVSTANDA2R6-REPORT.md`. Я собрал это
в бандл `3893WEB489.bundle`, чтобы передать дальше без M4.

**Что осталось открытым.** Два шага, которые может сделать только координатор (у него есть
доступ к серверу A2 и к общему дереву): (1) вмёржить настоящий код стенда в линию, (2) по
инструкции поставить круг 6 на A2 и проверить. После этого проверить, что следующая сборка
сама сначала приезжает на тренировочный сайт.

**Troubleshooter (если что-то не сходится):**
- «M4 недоступен, отчёт потерян» → неверно: `~/waves/ACCDEVSTANDA2R6-REPORT.md` и
  `~/waves/DEVSTANDA2R6-REPORT.md` на месте.
- «Базы нет нигде» → неверно: `git -C ~/nc log --oneline 02d032e4d..e49ad4f0` показывает 6 коммитов.
- «В линии уже есть infra/devstand» → да, но это реконструкция: сравнить
  `20-exec-path.conf` в линии и в `e49ad4f0` (разные).
- Стенд отдаёт не 401 → Basic Auth слетел, смотреть nginx A1 (`980`) — это не A2.
- После установки не встаёт PG → проверить drop-in `20-exec-path.conf` и polkit (это и чинит круг 6).
- Простой при обновлении > 1 мин → использована авторская команда из `DEVSTANDA2R6`, а не
  каноническая из `ACCDEVSTANDA2R6`.

## KNOWN ISSUES

- **Комментарий `id=4776`** (которым обогащение 3869 «отменило ждём M4») в локальных экспортах
  доски отсутствует; его текст в этой волне не читался — факт фиксируется как «заявлено в брифе»,
  не «доказано».
- **Реконструкция в линии не совпадает с настоящей базой** (расхождения `20-exec-path.conf`,
  выдуманный `preflight.sh`, polkit `.pkla` vs `.rules`). Кто будет мёржить — должен это учесть.
- **Точный live-SHA стенда на A2 не проверен** (нет доступа); всё о состоянии A2 — из комментариев.
- **Круги 5–6 отсутствуют в `~/nc-mirror`** (есть только в `~/nc`); если координатор работает
  только с `nc-mirror`, ему нужен этот бандл.
- Дата/статус кандидата `l96` (куда вмёрживать) на момент волны в карточке не зафиксированы;
  в приёмке упомянут пробный cherry-pick на `3f55a889` — проверять текущую линию.

## Сдача (deliverables)

- Отчёт: `~/waves/3893WEB489-REPORT.md` (этот файл).
- Бандл: `~/waves/3893WEB489.bundle` + `.sha256` (база кругов 1–6, `--not refs/waves/l115n`).
- Evidence: `~/waves/3893WEB489-evidence/` + `SHA256SUMS`.
- Маркер: `~/waves/3893WEB489_DONE`.
2026-09-22T18:21:41.349Z · triage-neo
РЕШЕНИЕ=in_progress
ОСНОВАНИЕ=2026-09-14, волна 3893 VERDICT=GO для дерева/пакета на l115n d85bb2dad, но в остатке карточки: круг 6 e49ad4f0 не установлен на живой A2 и база infra/devstand не в линии.
ЧТО НУЖНО=Координатору по точному отчёту установить круг 6 на A2 с receipt и вмержить полную infra/devstand в линию; затем повторная проверка.
triage-neo 4611
2026-09-23T12:11:33.427Z · triage-neo
РЕШЕНИЕ=parked
ОСНОВАНИЕ=2026-09-14, волна 3893 GO на l115n, d85bb2dad; круг 6 e49ad4f0 не установлен на A2 и полная infra/devstand не в линии.
ЧТО НУЖНО=владелец: установить круг 6 на A2 с receipt и подтвердить owner-approved доступ; затем вмержить полную infra/devstand
triage-neo 4704
2026-09-26T13:54:42.075Z · coordinator
[26.09 13:54Z координатор] Быстрые дорожки для правок (5063, GO). Владелец 26.09 13:25–13:52: сборка идёт часами, нужен быстрый цикл для GUI и багов.
Факт на A2: nc-dev (:3030, свои pg/redis, туннель на A1:3031, nginx dev.wool2.online и dev.sixbyy.com, 401 за логином) сейчас крутит standalone от 03.09, а не dev-режим.
Л1 живые правки: отдельная служба nc-fastdev :3032, next dev --webpack с HMR, лимиты CPUQuota 100% и 6G, только тестовая БД, ключи AI и оплат отключены. Оценка: правка видна за 2–15 с, первый compile тяжёлой страницы 10–60 с, холодный старт 1–4 мин.
Л2 быстрая сборка: кэш .next/cache и pnpm, атомарная замена с откатом, цель 10–15 мин. Не годится как доказательство для релиза.
Л3 строгая сборка без изменений, только она идёт на прод.
Для включения нужны: туннель 3030→3032, nginx Upgrade/Connection и длинные таймауты, allowedDevOrigins. Diff-ы готовы, не применены.
Пакет: M1 ~/waves/5063FASTLANES.bundle, копия ноутбук nc-ops-scripts/fastlanes-5063/.
Порядок (владелец 13:34): на A2 включать после ступеней 300/400/500 и ролей. Сейчас 5065 меряет Л1 и Л2 на Neo и добавляет выключатель на время замеров.
2026-09-26T14:25:05.804Z · coordinator
[26.09 14:25Z координатор] 5064 (r4) NO-GO: все нативные модули пропущены, compile дошёл до сбора данных страниц и упал: хук загрузчика Next 16.2.11 пытается переназначить замороженный Module.prototype.require (наш paid-loader-hook). Артефакта нет. Следующая волна 5066: сначала полный список всех перехватов загрузчика в worker-ах Next, узкий допуск только для точного пакета next, тесты границы оплат, затем сборка.
2026-09-26T14:54:26.768Z · coordinator
[26.09 14:54Z координатор] 5065 (проба быстрых дорожек на Neo, macOS arm64) — NO-GO по Л1, Л2 тёплая проходит.
- Л2 (быстрая сборка с кэшем): тёплая 7.5 мин (цель ≤15, ОК), холодная 25.5 мин.
- Л1 (next dev с горячей правкой): холодный старт 25.6 с; первая компиляция /login 15.6 с, /notes 6.5 с; главная под входом не скомпилировалась за 5 мин, память дошла до 3.3 ГБ; наблюдение HMR не получено (запрос после правки 9.8 с). Realtime 401, 500 нет.
- Добавлены выключатель pause/resume со стоп-меткой, режим замера без systemd; тесты зелёные. Пакет обновлён: ~/waves/5065FASTLANESTRIAL.bundle на Neo.
- Оговорка: Neo не A2 (macOS, без systemd/ограничений CPUQuota 100% и MemoryMax 6G). Для A2 под лимитом 6G Л1 в текущем виде рискован: главная требует >3.3 ГБ на одну компиляцию.
Вывод: включаем Л2 (тёплая пересборка ~7.5 мин) как основной быстрый путь; Л1 только после разбора, почему главная под входом не компилируется (вероятно тяжёлый граф импортов) — отдельная задача после ступеней и ролей.
2026-09-26T15:02:09.992Z · coordinator
[26.09 15:02Z координатор] 5066 (r5) NO-GO: require-hook Next допущен узко (точный путь+SHA-256, одноразово), все тесты прошли (негативные 5/5, совместимость 9/9, WEB439 17+6+10, WEB685, lifecycle). Сборка дошла до page-data и упала на следующем замороженном глобале: next/dist/server/patch-error-inspect.js присваивает Error.prepareStackTrace. 16.7 мин, артефакта нет.
Третий провал подряд одной природы (заморозка paid-loader-hook против глобалов Next). 5068 (r6): сначала полный список всего, что замораживает хук, и всех мест в next@16.2.11, которые это меняют (grep + трассировочный прогон с логированием записей), таблица решений, все допуски разом, затем сборка.
2026-09-26T15:30:15.653Z · coordinator
[26.09 15:30Z координатор] 5067 (Neo) GO — живая правка (Л1) работает.
- Причина: корневой layout статически тянул InitialLanguageBootstrap → монолитный store/useStore.ts (434 КБ) → в граф главной попадали app/actions.ts (508 КБ), EditorModal.tsx (929 КБ), OpenAI/Prisma. 2068 модулей, 39.5 МБ исходников; webpack исчерпывал кучу 4 ГБ.
- Решение: next dev --turbopack --disable-source-maps (только dev-скрипт; строгая сборка не менялась; webpack остаётся запасным через NEXT_DEV_BUNDLER).
- Замеры Neo: главная под входом 10.3 с (было: OOM за 115 с), пик памяти 1.17 ГБ (было 3.3+), HMR 6.3 с (правка → обновление), realtime без 500.
- Патч: ~/waves/5067LIVEEDITMAINROUTE-evidence/5067-dev.patch на Neo.
- Отдельная находка для производительности боя: корневой layout грузит весь store — это же раздувает клиентский бандл главной. Кандидат на отдельный тикет.
Следующий шаг: включить Л1 на A2 (nc-fastdev :3032) после окончания сборки 5068, smoke под лимитом 6 ГБ.
2026-09-26T17:22:51.820Z · coordinator
[26.09 17:22Z координатор] 26.09 17:3xZ: сборка 5069 (r7) GO — 0e96058c, артефакт e48e4a8d…, все Linux-тесты зелёные, сборка 30 мин с первой попытки. Раздано на A2 последовательно: 5070 деплой пакета на стенд (миграций нет), затем 5071 — Л1 (next dev --turbopack) на dev-домене вместо nc-dev с откатом и паузой, тест «Война и мир / Безухов» на Л1 и Л2.
2026-09-26T22:09:19.470Z · coordinator
[26.09 22:09Z координатор] Волна 5075 (Sol), 26.09 22:00Z, VERDICT=GO, манифест 26/26 OK.
Л1 (nc-fastdev :3032): холодная главная медиана 10.3 с (цель ≤90; прогрев в ExecStartPost), подсветка «Безухов» 3.7 с, realtime 401/200 (dev custom server с Socket.IO), fastdev-up self-copy исправлен (RC 0). Л1 оставлена активной.
Подсветки не было и на стенде 4400-r2 → продуктовый дефект: DocumentSessionProductSurface (CM6) не получал hybridFindHighlights. Патч 5075-work/0001-fix-fastdev-realtime-and-product-search-highlights.patch → в ближайшую сборку вместе с патчами 5077.
2026-09-27T15:30:14.625Z · coordinator
[27.09 15:30Z координатор] Закрыт по слову владельца 27.09 15:28Z (разбор парковки). Дев-стенд A2 сдан: волна 5075 GO 26.09 (Л1 nc-fastdev активна, холодная главная 10.3 с, realtime 401/200). Продуктовый дефект подсветки CM6 из 5075 ушёл в сборку отдельным патчем.
Воркер
не проверен 3339-wash-infra A1 движение в панели: неизвестно
Подключиться и смотреть/перехватить руками. Колесо мыши листает; клавишами — Ctrl-b затем [, выход из прокрутки q. Отсоединиться — Ctrl-b затем d:
Прочитать историю панели без подключения — листается и ищется (/ поиск, q выход), воркеру не помешает:
Обновлён
2026-09-27T15:30:14.931Z