WEB board

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

P0 LIVE: корневая тетрадь падает — PrismaClient попал в браузерный bundle; фикс clientbundle только в непосаженной 31-й

Закрыт P0 · горит ведёт: backup-opus
Суть
## 22.08 15:39:44Z — live owner reproduction

Owner still sees the root notebook error screen: “ПОМИЛКА / ERROR — Не вдалося завантажити — Щось пішло не так. Спробуйте ще раз.”

Exact live telemetry from serving release `da501c43`:
```
event=route-error-boundary
href=/
userAgent=iPhone iOS 18.7 Safari
message=PrismaClient is unable to run in this browser environment, or has been bundled for the browser
```

The serving browser chunk `.next/static/chunks/70825.66af55d7314c98d3.js` is 97,941 bytes and contains the Prisma browser stub plus the generated Prisma model registry. This is separate from WEB-308: accounting/egress is green and does not remove server code from a client chunk.

## Root and fix lineage
- Live source `da501c43` still has a client-reachable chain through `src/lib/biology/immuneSystem.ts -> @/lib/ai/serverModelDefaults`; the latter reaches Prisma and the provider registry.
- Accepted `clientbundle` commit `0d2b4040058e4aae376e368ae95d0ca764835401` explicitly injects the server model resolver from `nudgeActions.ts` instead of importing it in the browser-reachable module, and splits the visualize server half.
- It is merged into landing31 as `5232a778`; accepted landing31 HEAD is `0bcddc95b459d8f6b0cb5162bc9cec95c9e8d4cb`.
- Landing31 is not deployed. Its first ARM64 build passed all named prebuild gates but failed at the explicit 4 GiB V8 heap ceiling (rc=134), so no artifact exists from that run. One bounded 12 GiB recovery build is in progress on A1.

## Acceptance
Do not close from ancestry or source tests alone. Required: build/package proof, deployment of landing31, live static-chunk absence of Prisma browser runtime, fresh owner reproduction on the same iPhone path, and no new route-error-boundary event.

Owner notification: message_id 12805.

## 22.08 15:51:43Z — landing31 recovery build passed; artifact audit pending
- Exact accepted branch remains `l31-onto-da501c43` at `0bcddc95b459d8f6b0cb5162bc9cec95c9e8d4cb`.
- The first canonical build failed at its explicit 4 GiB V8 heap ceiling (rc=134); no artifact was claimed.
- The single bounded recovery command with 12 GiB heap completed rc=0 at `2026-08-22T15:51:43Z`; maximum RSS was 11,020,008 KiB and swaps were 0.
- This is build success, not deployment or live acceptance. Postbuild, canonical package, fresh re-extraction, source/migration/static/symlink/manifest checks and the atomic R2 report are still pending.
- Serving remains `da501c43`; the Prisma browser failure remains live until a verified landing31 artifact is separately deployed and accepted on the owner's iPhone path.
- Owner notified in Telegram: message_id 12808.

## 22.08 — L31_R2_PRISMA_STATIC_NO_GO_20260822

31-я **не посажена**. Independent artifact verdict:

- report: `/home/ubuntu/waves/L31-DA501C43-ARM64-R2-INDEPENDENT-VERDICT.md`;
- report SHA-256: `fdd36476a0ab8421585844e2b57d13e81ae6ff36b3bc0b09408fccd2de15b951`;
- marker: `L31_DA501C43_ARM64_R2_INDEPENDENT_REVISION_REQUIRED`;
- candidate source: `l31-onto-da501c43@0bcddc95b459d8f6b0cb5162bc9cec95c9e8d4cb`;
- artifact SHA-256: `9b48ad2d13447a8cc99f043bd2e6bc78349b1e2f021c4a202aa8a71652b1b811`.

Tar/manifest/migrations/worker/boot-contract bindings passed, but browser static output still contains the Prisma browser-stub error/generated model registry in chunk `24639…js` and client-side `new PrismaClient` in `91685…js`. This is a cutover blocker for the exact live notebook failure class. Prod remains `da501c43`; no deploy was attempted.

Next bounded wave is active on A1: `l31-web311-prisma-boundary-r1`. It traces both chunks to source, applies the minimal server/client boundary repair, and adds a fail-closed regression with negative mutation. No build/package/prod/DB/config in that wave.

## 22.08 16:49 UTC — source-fix активен после независимого NO-GO артефакта
- Rejected artifact verdict: `/home/ubuntu/waves/L31-DA501C43-ARM64-R2-INDEPENDENT-VERDICT.md`, SHA `fdd36476a0ab8421585844e2b57d13e81ae6ff36b3bc0b09408fccd2de15b951`, marker `L31_DA501C43_ARM64_R2_INDEPENDENT_REVISION_REQUIRED`.
- Cutover не выполнялся: browser static всё ещё содержал Prisma browser stub/model registry и client-side Prisma construction.
- A1 bounded Codex `l31-web311-prisma-boundary-r1` активен; отчёт pending, лог `/home/ubuntu/waves/l31-web311-prisma-boundary-r1-codex.log` вырос до `1,920,342` bytes к `16:49:31Z` и показывает фактический split client-safe config / server-only `configServer` с переносом server imports.
- Новый build/package этой волне запрещён; A1 `/` около `6.9G` free. До commit + tests + negative boundary gate READY продуктовый GO не заявляется.

## 22.08 17:07Z — ARM64 R3 build wave запущена, но build ещё не начался
После доказанного простоя запущена единственная bounded Codex wave `l31-web311-arm64-r3-build` от clean `31c6ed5c`. На момент тика она проверила branch/HEAD/clean, прочитала WEB-311/R2 reports, доказала отсутствие parallel build и проверила единственный разрешённый cleanup target — fresh extraction отвергнутого R2. Удаляется только воспроизводимая extraction; free уже 7.4G. В process list пока нет `pnpm build`/`next build`; финального report/artifact нет. Первый внутренний Codex CLI вызов дал rc=2 из-за позиции флага до task execution, исправленный запуск активен. Требуемая цепочка остаётся: source gates → ровно один Node22/12G build → package/fresh extract → zero Prisma static scan → independent artifact verdict → cutover.

## 22.08 17:08Z — единственный ARM64 R3 production build реально начался
После доказанного простоя bounded Codex wave `l31-web311-arm64-r3-build` от clean `31c6ed5c` проверила identity и отсутствие parallel build, затем удалила только разрешённую fresh extraction отвергнутого R2; A1 free вырос до 9.4G. Все четыре prebuild gates прошли: client-boundary check, client-boundary TAP, browser-Prisma TAP и focused autonomy test. В 17:08:43Z process evidence показал единственный Node 22 build: `pnpm exec next build --webpack` с heap 12288; процесс `next build` использует CPU. Первый внутренний Codex CLI вызов дал rc=2 из-за позиции флага до task execution; исправленный запуск активен, build retry не было. Финального report/artifact ещё нет. После build обязательны package/fresh extract, zero Prisma static scan и independent artifact verdict до cutover.

## 22.08 17:40Z — R3 готов; independent artifact acceptance ещё идёт
Build report `L31-WEB311-ARM64-R3-BUILD-REPORT.md` дал `L31_WEB311_ARM64_R3_ARTIFACT_READY`: exact source `31c6ed5c`, artifact 621130003 bytes, SHA `04101635…e5d9f`, build rc=0, built/extracted browser-Prisma scans 0 blocker matches, boot-contract rc=0. Отдельная A1 wave `l31-web311-arm64-r3-independent` read-only перепроверяет уже собранные байты без build/copy/new extraction. Она повторила focused test 9/9, browser-Prisma negative fixture suite 3/3 и client-boundary gate rc=0; финальный verdict ещё pending. Аудитор отдельно проверяет, достаточно ли sanitized synthetic boot receipt: live env/secrets не читались и значения не печатались. Cutover не выполнялся; Pi serving остаётся `da501c43`.

## 22.08 18:07Z — R3 staged на Pi, но 31-я ещё не переключена
Independent verdict R3 = `L31_WEB311_ARM64_R3_INDEPENDENT_GO`. Артефакт `621130003` bytes, SHA256 `04101635a4eaab205bd5d474a81458f7295ef3191aec41c20ef16988f34e5d9f`, доставлен A1→Intel→M1→Pi и совпал по размеру/SHA. На Pi безопасно проверено 127014 tar entries, unsafe paths 0; распаковка в fresh release завершена, `live-sha=31c6ed5c…`, service-worker `v4-31c6ed5c`, migrations 120. Это только staged bytes: systemd по-прежнему обслуживает `da501c43`. A1 bounded Codex дописывает cutover/rollback dossier; финального report marker пока нет, prod cutover не выполнялся.

## 22.08 — размер R3 отделён от cutover
R3 archive 621130003 bytes / extracted 2.5G: корень — материализация полного pnpm node_modules (2.2G, 104037 files), не WEB-311 Prisma fix и не миграции. Отдельный неблокирующий долг: WEB-312. Текущий R3 не пересобирать вслепую: independent GO и staged SHA уже доказаны.

## WEB-313 блокирует cutover 22.08 18:24Z
R3 staged bytes не переключаются: artifact migration-set `c821…` расходится с committed activation metadata `6de5…`; текущая подпись относится к `da501c43`. Systemd не тронут, owner-key не использован. Узкий source-fix идёт на A1; после него нужны R4 build + independent artifact review. Полный трейл: WEB-313.

## R4 artifact после WEB-313 — checkpoint 22.08 18:54Z
Prisma-boundary source `31c6ed5c` принят ранее; поверх него WEB-313 fix `26116cff`. Единственный R4 build/package rc=0, artifact SHA `a3c1c9d6…2d595`; browser/static/native/boot fresh-extract final report ещё формируется. Serving всё ещё `da501c43`; systemd не переключался. Полный activation trail — WEB-313.

## Landing31 R4 готов к независимой приёмке — 22.08 19:02Z
- Новый ARM64 R4 собран из `26116cff`; artifact SHA `a3c1c9d6…2d595`, manifest SHA `d1649d51…f9da3`.
- Prisma browser blocker: built `1118` файлов / `0` совпадений; extracted `1118` / `0`. Client-boundary и package-local ARM64/worker verifiers зелёные.
- WEB-313 migration drift закрыт на уровне bytes: `120 / c821f49d…1705` в generated, source, extract и обоих manifest.
- 31-я ещё не serving. Следующий гейт — независимый GO, затем перенос SHA на каждом хопе, target boot-contract/cutover/rollback и live QA.

## R4-INDEPENDENT-ACCEPTANCE-ACTIVE-20260822T1925Z
- R4 artifact remains staged only, not serving: source `26116cff`, artifact SHA `a3c1c9d6…2d595`, manifest SHA `d1649d51…f9da3`.
- Independent read-only acceptance is active on A1 after correcting the launcher to use the required M1 proxy relay. No rebuild/repackage/re-extract and no cutover occurred.
- The earlier direct Codex process only reconnected and produced no verdict; source/artifact bytes were not changed. Temporary fresh-extract/build-evidence trees will not be removed until an atomic GO/REVISION_REQUIRED report exists.

## R4-INDEPENDENT-GO-20260822T1930Z — artifact independently accepted for transfer/cutover preparation
- Verdict: /home/ubuntu/waves/L31-WEB311-ARM64-R4-INDEPENDENT-VERDICT.md; SHA f01e2f1aee348d67004e7d8dbb0f4b94774a9daf5d6b6e8070f629783abb72ab; marker L31_WEB311_ARM64_R4_INDEPENDENT_GO.
- Re-measured identities stayed exact: source 26116cff032ad8f015e1e2d9cba302e1e8f7ec27; artifact a3c1c9d623d2baa7f1a37caf85fde863cfac91785f2a61a75adf6c1416b2d595; external/embedded manifest d1649d5128d03bf4c1f96db877b215954bc3653057f76ce485537436aa0f9da3; clean tree 28699a94e3f7d6955aae667ffce0a306a1457f59.
- Existing migration equality gate rejected the deliberate first-row SHA mutation: equality rc=1 and external-vs-embedded cmp rc=1.
- Scope remains transfer/cutover preparation only; no deploy or Pi/prod mutation occurred.
- After GO, only the reproducible fresh extraction was removed: 2,277,558,869 measured bytes, 2,601,631,744 filesystem bytes reclaimed. Artifact, manifest, verdict and 1.99GB build/run evidence receipts remain. A1 free space is now about 12GB.

## 23.08 — вошёл в посадку, ждёт живой приёмки [эпик WEB-314]
- Груз в проде: 26116cff (посадка 31, 22.08 20:53 UTC, serving); артефакт a3c1c9d6…b595; paidReady=true.
- Метод приёмки: скрин: корнев����я тетрадь открывается (PrismaClient вне браузерного bundle) — P0-проверка.
- Порядок: ancestry+байты в артефакте → live-проба → скрин/raw run id в тикет; правила и доки-основания в WEB-314.

## 23.08 — ПРИНЯТ: визуальный PASS глазами координатора
- Скрин spark-волны 01-web311-root-after-login.png: корневая тетрадь после логина грузится полностью (карточки режимов, панель источников, план) — ни белого экрана, ни Prisma-ошибки в браузерном бандле.
- Плюс системно: clientbundle-линия в serving 26116cff (вердикты L31 R3 GO/R4), live-sha и SW совпадают.
- Скрин: M4 ~/work/qa-screens/shots-l3031/01-web311-root-after-login.png. P0 закрыт.

## 23.08 evidence-pass (l3031-evidence)
- Audit: GET before PATCH found no exact 23.08 evidence-pass section; existing body was preserved and this is the single appended section.
- Ancestry: git merge-base --is-ancestor 31c6ed5c 26116cff rc=0; exact source=26116cff032ad8f015e1e2d9cba302e1e8f7ec27.
- Bytes: local R4 artifact SHA-256=a3c1c9d623d2baa7f1a37caf85fde863cfac91785f2a61a75adf6c1416b2d595; manifest SHA-256=d1649d5128d03bf4c1f96db877b215954bc3653057f76ce485537436aa0f9da3; embedded live-sha=26116cff; built/extracted static Prisma blocker matches=0; browser-boundary checker rc=0. Raw summary SHA-256=4f5b382bfd04eba40d80429f235ea112179d8e14881fc3f38ea173cda206033f.
- Live: required browser screenshot/fresh owner reproduction not run because QA login callback HTTP 302/session=null (login SHA-256=3020bdf182128451795610e09688faefe24211460f13f84648c1991ad7e29a55). No deploy/cutover/mutation performed.
- Verdict proposal: NEEDS_SCREEN.

## 23.08 09:40 UTC — ЖИВАЯ приёмка (волна l3031live, M4, рабочий логин 200/200/200). NEEDS-FIX (P0 частично): корневая тетрадь ГРУЗИТСЯ (rootLoaded=true, focusOpened=true, pageerrors=0, НЕТ Prisma-текста/белого экрана — исходный P0 закрыт). НО /api/sync 3×HTTP 500 «Sync skipped (working locally)». Скрины web311-*. Остаётся review до фикса /api/sync.

## 2026-08-23 10:41 UTC — /api/sync 500 ДИАГНОСТИРОВАН (M4), фикс-волна запущена (A1)
Диагноз (M4 ~/work/WEB311-SYNC-DIAG-REPORT.md, маркер WEB311_SYNC_DIAGNOSED): burst одинаковых wipe-and-replace sync на одну notebook → P2034 write conflict в Serializable (src/app/api/sync/route.ts:1794-2211), retry 3×25/50ms исчерпывается, generic catch маскирует в 500 Internal Error. Pi journal подтвердил P2034 на Notebook.updateMany. Классификация: НЕ регресс миграции 31 — давний latent race, вскрытый тем, что после фикса P0-Prisma корень начал реально грузиться. 
Фикс-волна: A1 tmux web311fix (Luna xhigh), бриф /home/ubuntu/waves/WEB311-FIX-BRIEF.md: сервер pg_advisory_xact_lock по notebook + 409 Retry-After вместо 500, клиент per-notebook mutex, regression 6 конкурентных sync + НЕГАТИВНЫЙ тест. Ожидаю WEB311-FIX-REPORT.md, маркер WEB311_FIX_READY.


## 2026-08-23 11:07 UTC — ФИКС ГОТОВ (A1, маркер WEB311_FIX_READY), кандидат посадки 33
Волна web311fix (Luna xhigh) сдала: сервер — pg_advisory_xact_lock(hashtextextended(notebook.id,0)) первым действием в той же Serializable-транзакции (route.ts:1789-1800), retry P2034/40001 3×backoff+jitter (101-118), после исчерпания 409 + Retry-After:1 + код sync_conflict_retry вместо 500 (2127-2161); клиент — per-notebook in-flight queue с coalesce (useStore.ts:295-358,4688-4919). Тесты: contract 4/4, transactionReads 6/6 (в т.ч. 6 конкурентных POST → все 200, snapshot целый; неисправимый конфликт → 409 НЕГАТИВ), client suite 6/6. Scoped tsc rc=0. Коммит 0c3cdb4 (wt-web311 поверх 4482925), патч /home/ubuntu/waves/web311-fix.patch (18628 B, sha 15aa44c3572a2c3a0dd111adf34b51d2e8e41588121e85840a5ba0f7222ffa4e, копия на Интеле). Отчёт: A1 WEB311-FIX-REPORT.md. Дальше: посадка 33 batch B.


## 2026-08-23 14:57 UTC — ЗАДЕПЛОЕНО: посадка 33 (v4-00c402c) села с 1-й попытки
rel-00c402c (SHA 58af4a94…), аттестованный cutover c НОВЫМ пин-гейтом (все 7 env-пинов сверены с аттестацией ДО флипа — негативный гейт из урока посадки 32). paidReady=true, канон проштампован. Живая приёмка фикса — следующий шаг.


## 2026-08-23 16:12 UTC — ⚠️ РЕГРЕСС нашего фикса на проде: advisory-lock валит каждый sync
Журнал Pi 12:08 (v4-00c402c): каждый POST /api/sync → PrismaClientKnownRequestError `Failed to deserialize column of type 'void'` — pg_advisory_xact_lock() через $queryRaw. Owner видит баннер «Не удалось сохранить в облако — работаем локально, повторим» (скрин). УРОК: моки волны web311 скрыли поведение драйвера (void-десериализация) — класс «тест на моках ≠ драйвер».
HOTFIX: волна web311b (A1, отдельный клон wt-web311b, ветка web311b от 00c402c): $executeRaw вместо $queryRaw + тест, воспроизводящий void-класс + полная сборка артефакта. Ожидаю WEB311B_ARTIFACT_READY → немедленная посадка 33.1.


## 2026-08-23 17:35 UTC — 🎉 HOTFIX ПОСАЖЕН: посадка 33.1 (v4-9ad6323), 1-я попытка
rel-9ad6323 (SHA adf7da00…), advisory-lock через $executeRaw (регресс-контракт эмулирует void-бросок драйвера — класс закрыт тестом), 23 sync-теста, пин-гейт 7/7, paidReady=true, канон проштампован. Sync error в журнале с флипа: 0. Ждём подтверждения owner (баннер должен уйти после обновления страницы; локальные правки доедут в облако автоповтором). Статус review до owner-подтверждения.


## 2026-08-23 18:10 UTC — ✅ OWNER ПОДТВЕРДИЛ: баннер ушёл (tg 11:51 «подтверждаю»)
Посадка 33.1 (v4-9ad6323) закрыла регресс; sync-ошибок в журнале 0 с флипа. Полная эволюция тикета: 500-на-бёрсте → диагноз P2034-гонки → фикс advisory-lock+409 (посадка 33) → регресс void/$queryRaw (баннер) → hotfix $executeRaw (посадка 33.1) → owner-подтверждение. ЗАКРЫТ.
Починено в
26116cff
Лента
2026-08-23T08:30:21.909Z · codex-l3031-live
L3031 LIVE NEEDS-FIX: rootLoaded=true, functional mode opened, pageerrors=0, но console/network фиксируют 3×HTTP 500 /api/sync и Sync skipped: Internal Error. Скриншоты: shots-l3031-live/web311-root-after-login.png, web311-root-functional-mode.png; Raw: qa-screens/l3031-live-ui.json. Предлагаемый статус: нужна доработка /api/sync.
2026-08-23T09:40:56.138Z · codex-web311-sync-diag
WEB311_SYNC_DIAGNOSED — live + Pi read-only diagnosis (2026-08-23). Serving 26116cff; root notebook loads and GET /api/sync?mode=summary is 200. Captured root-open burst at 08:21:42Z: 6 concurrent POST /api/sync for notebook ea1870c7-17ef-4abd-8dad-65ac4632752b, body 278117–278118 bytes, 81 sources/2 messages/2 corpora; statuses in Network 200,200,500,500,500,200. Pi journal at 09:21:43+0100: Prisma P2034 on Invalid prisma.notebook.updateMany(), “write conflict or a deadlock”, meta modelName Notebook. Route source: retry loop maxAttempts=3 + Serializable transaction (src/app/api/sync/route.ts:1794–1798, 1800–1809, 2118–2122); after retries generic catch at :2205–2211 returns HTTP 500 body {"message":"Internal Error"}. Not migration/schema/nullable/timeout: sequential replay of same captured payload returned 200 {"success":true}. Root cause is concurrent full wipe/replace writers without per-notebook serialization; likely latent server race exposed by 30/31 root hydration after P0-Prisma. Impact: UI/local notebook works, but failed sync can leave changes only in localStorage and lose them across reload/session. Fix recipe (NOT applied): client per-notebook in-flight mutex/queue + debounce/coalesce; server per-notebook transaction/advisory lock, retain P2034 backoff, return controlled 409/503 Retry-After instead of opaque 500; add 3–6 concurrent sync regression test. Full report: /Users/milamarty/work/WEB311-SYNC-DIAG-REPORT.md; raw: /Users/milamarty/work/qa-screens/l3031-live-ui.json and web311-sync-replay.json. Proposed status: нужна доработка.
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-311","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-23T11:52:24.191Z