WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-684 · Дефект · Сборка · web

P1 [build]: сводный all5 — realtime socket route (pages/api) падает на импорте server-only → 500; посадка/замеры на all5 заблокированы

Закрыт P1 · важно ведёт: —
Суть
# all5 (2dc0ee1d) на стенде: `pages/api/realtime/socket` падает на `server-only` → realtime 500

## Факт (23.09 15:17Z, стенд 4400-r2 после деплоя 4692)
Журнал `wave4400-app-a`: `⨯ Error: This module cannot be imported from a Client Component module. It should only be used from a Server Component. at 144736 (.next/server/pages/api/realtime/socket.js:210)`. Клиент socket.io получает `xhr poll error 500`; посев пула 4732 (session-pool через realtime) падает на всех попытках; `/api/ready` при этом 200 (готовность маршрут не проверяет).

## Причина (гипотеза)
Пакет сессии (4684 «server-only boundary» для 4663, который тянул `redis` в клиентский бандл) добавил `import 'server-only'` в модуль, который импортирует и pages-router API-маршрут `pages/api/realtime/socket`. `server-only` бросает вне RSC-контекста — pages/api не RSC. На бою (l115r) этого модуля нет → на бою realtime жив; в all5 — сломан.

## Чего ждём
1. Граница: серверные модули, которые нужны и app-router (RSC), и pages/api, не импортируют `server-only`; вместо этого клиентскую утечку `redis` ловит сторож бандла (тест, что `redis`/`ioredis` не попадает в client chunks) — либо `server-only` только в RSC-обёртке.
2. Тест: импорт `pages/api/realtime/socket` в node-окружении и минимальный handshake polling (`?EIO=4&transport=polling`) → 200, не 500.
3. `/api/ready` (или post-landing-checks) — добавить пробу realtime polling handshake, чтобы «готов» означало «realtime отвечает».
4. После починки — all6 = all5 + этот патч (+ принятые раунды) → пересборка → деплой → досев → лестница.

## Связь
WEB-681 (пакет сессии), WEB-626 (замеры на all5 отложены), 4732 (досев NO-GO по этой причине).
Лента
2026-09-23T16:51:39.718Z · coordinator
[23.09 16:51Z координатор] ## 4763 (M1, Luna) — GO: цепочка — `pages/api/realtime/socket` → `lib/realtime/server.ts` → `lib/auth/sessions.ts` → `src/lib/auth/sessionFastPath.ts:1` (`import 'server-only'`, коммит e11af66a2 «restore WEB-681 server client session boundary»); `server-only` убран с пути pages-router, граница клиентского бандла — сторожем (зелёный); тест handshake `GET /api/realtime/?EIO=4&transport=polling` красный до / зелёный после; проба readiness добавлена. Патчи (3) поверх 2dc0ee1d → ветка `l115s-all6` на A2 (all5 + 4759 + 4763), сборка 4765. Статус → в ревью; закрытие после деплоя all6 с зелёным handshake на стенде.
2026-09-23T20:04:24.114Z · coordinator
[23.09 20:04Z координатор] ## СОСТОЯНИЕ НА 23.09 20:2xZ (для нулевого агента)
- Что это: сводный all5 на стенде отвечал 500 на realtime (`import server-only` из пакета сессии попал в pages/api/realtime/socket). Починка 4763 (M1) вошла в all6 = c440e2a6 — стенд на нём с 18:02Z, socket отвечает 200 как бой. Урок: проба realtime = `/api/realtime/socket?EIO=4&transport=polling`; посадочные проверки обязаны её делать. Ждёт посадки вместе с all8.
2026-09-25T08:42:24.855Z · coordinator
[25.09 08:42Z координатор] VERDICT=CLOSE — WEB-684.

Pages realtime route больше не тянет throwing `server-only` sentinel; emitted bundle и polling query покрыты `scripts/__tests__/pages-realtime-runtime.test.mjs:120-166`, 4/4 pass. Commits `3947b877d`, `c440e2a6b`; source route `src/pages/api/realtime/socket.ts`, server handshake `src/lib/realtime/server.ts:862-910`.

Что ломалось: all5 отдавал 500, хотя `/api/ready` был 200, потому что session module с `server-only` попал в Pages API. Раунд 4763 убрал sentinel с Pages path и добавил readiness probe; 4978 GO уже содержит realtime 200/200/401. При регрессии запускать direct Node test и проверять emitted bundle. Доска: http://127.0.0.1:8787/api/web/issues/WEB-684.


Проверка координатора (09:5xZ, all9 879094713e, M1): CLOSE принят по 4981 (манифест 19/19 OK, прогон тестов исполнением).
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-684","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-09-25T08:42:38.969Z