WEB board

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

Замороженная 311-сюита движка КРАСНАЯ (308/311): поздняя волна занесла DOM в DOM-free ядро и пробила границу DS-T013

Закрыт P0 · горит ведёт: backup-opus
Суть
## Найдено 21.08 волной shadowrec (только чтение), отчёт M4 `/Users/milamarty/work/SHADOWREC-REPORT.md`

Прогон на текущем HEAD движка (`engc-C01` @ `eaa27fec4`), пиннованный компилятор из дерева (TypeScript 5.9.3 — ровно тот, что требует `scripts/gateb-v4-immutable-spec.mjs`):
```
# tests 311   # suites 62   # pass 308   # fail 3   EXIT=1
```
Счётчик ровно 311 — состав сюиты не менялся, значит это регрессия, а не изменение объёма.

Падают три теста, все на одной границе **DS-T013**, но по **двум независимым причинам**:
```
not ok 57 - DS-T013: the core compiles under the normative DOM-free strict configuration
not ok 60 - DS-T013: no forbidden import or DOM identifier in the feature-facing core
not ok 63 - DS-T013 — DOM-free feature-facing core (подтест «names no DOM global»)
```

### Причина А — production-ресивер занесён внутрь DOM-free ядра
`src/lib/document-session/revisioned-content-receiver.ts:53-55`:
```ts
function publishRevisionedContentReceipt(receipt: RevisionedContentReceipt): void {
    if (typeof window === 'undefined') return;
    console.log(`${REVISIONED_CONTENT_RECEIPT_CONSOLE_PREFIX} ${JSON.stringify(receipt)}`);
    window.dispatchEvent(new CustomEvent(REVISIONED_CONTENT_RECEIPT_EVENT, { detail: receipt }));
}
```
`tsc` под `tsconfig.core.json`: `TS2304: Cannot find name 'window'` (×2), `TS2584: Cannot find name 'console'`, `TS2304: Cannot find name 'CustomEvent'`. Сканер идентификаторов: «references DOM global "window."».
**Файл к волнам W1-W4 отношения не имеет** — на shadow-ветках его нет вовсе. Занесён коммитом `9cb91c8d0` («gatestale (wave): … receiver ported into engine tree …»). То есть поздняя волна перенесла продуктовый ресивер внутрь DOM-free ядра и пробила ровно ту границу, которую волна W4 закрывала девять дней назад.

### Причина Б — shadow-код W2 больше не компилируется под `exactOptionalPropertyTypes`
Пять мест в `gatec-shadow-w2-runtime.ts` (строки 1294, 1383, 1529, 1562, 1609).

## Почему это важно
Это наш класс «починка одного слоя ≠ работающая фича», только развёрнутый во времени: граница была закрыта, принята, и **молча пробита следующей волной**, потому что между волнами замороженная сюита не гонялась. Ноль ошибок в логе ничего не значил — сюиту просто никто не запускал.

## Что делать
1. Вынести публикацию ресипта из DOM-free ядра (порт/адаптер на стороне продукта), не глуша тест.
2. Починить пять мест под `exactOptionalPropertyTypes`.
3. **Вшить прогон замороженной 311-сюиты в обязательные ворота движка** — чтобы следующая волна не смогла пробить границу тихо. Негативный тест обязателен: верни DOM в ядро → ворота обязаны упасть.

Смежное: сфокусированная Gate C shadow-сюита ✅ 15/15, adversarial-сюиты ⚠️ 23/24. Полный матричный прогон блокирован отсутствием распакованных тулчейнов TS 5.8.3/5.9.3 (качать = установка, волне запрещено).

## 22.08 10:34 UTC — auditor archive custody verified; R22G is not yet repacked into it
Laptop archive directory /Users/annakorin/Downloads/ENGINE-GATEC-R22E-20260821 contains three parts totaling 1,320,721,936 bytes. Rejoin SHA256 independently recomputed: 247d67e8f3c76f7ca4bb7bf4d3f8dc1d65755650b8fe797ae71f00c02ab4e0f8; part SHA values match ПЕРЕДАЧА-РЕВИЗОРУ.md. This is the R22E package already handed off, not a new R22G package.
R22G independent GO is a separate patch, not a rebuilt 1.32GB archive: /Volumes/M4Ext/ops/worktrees/r22f-verifier-20260821/ENGINE-R22G-MAIN.patch SHA c0220da95bf986fb103e8db72e9cd3e1e3abee03be6b50ddb05b2cd37f73a535; independent verdict SHA e2405b6086ac6fe97bad0ef63bfd476727486fe47800c0704fe18b28d0fe9551. It cleanly applies to untouched package, both canonical verifiers 8/8, two fresh paths regenerate byte-identically, mutations/relocation/allowlist fail closed. Honest status: auditor has the intact R22E archive; R22G closure is proved as patch but has not been repackaged/delivered as a replacement archive. Product P0 also remains: frozen suite 308/311 at current engine HEAD.

## 22.08 12:02 UTC — missing R22G replacement archive now assigned
R22G patch and independent GO existed, but no replacement auditor ZIP had been built or delivered; local owner files were still old R22E parts. M4 Codex engine-r22g-package is active. It must build one deterministic ENGINE-GATEC-R22G-PACKAGE-20260822.zip from accepted R22E plus exact reviewed R22G bytes, regenerate all inventories/COVER/SHA256SUMS, include patch+author report+independent verdict, pass clean-room/negative/deterministic rebuild, then independent package review before owner delivery. Brief SHA 79483a983c85a2cfbbe0536e0c6fa19d768ad9ea6c7b963ca3d8de1bfedab9b0. No prod/paid/live.

## 22.08 13:52 UTC — R22G-R1 SEALED CANDIDATE UNDER NEGATIVE HARNESS
- Candidate: `/Volumes/M4Ext/ops/r22g-r1-20260822T132715Z/r1-output/ENGINE-GATEC-R22G-R1-PACKAGE-20260822.zip`; bytes `1340473128`; SHA-256 `ff8b6f483dff8e28373ee5c90eff14608cafdb87ba2c3722d705e1c31ccb029e`.
- Construction defect closed: clean patch outputs are exactly 10 reviewed paths; `SHA256SUMS` is generated final inventory only. Sealed patch-touched comparison: count 10, mismatch 0.
- Staged, sealed-ZIP and relocated-root auditor PASS; both engine verifiers 8/8. Honest boundary: fail-closed mutation harness still running and atomic final report absent, so this is not yet independent package GO and nothing was delivered to owner/reviewer queue.

## 2026-08-23 18:20 UTC — проверка против перенесённой линии (A1 web305, read-only)
Гипотеза: V4-цепь (529/529 в web323) уже вылечила красную сюиту. Волна прогонит замороженную 311-сюиту на web323-shipdark и вынесет вердикт с пруфом. Ожидаю WEB305_VERDICT.


## 2026-08-23 18:35 UTC — ✅ ВЕРДИКТ: GREEN 311/311 — ЗАКРЫТ
Волна web305 (read-only, worktree wt-305 на web323-shipdark c8a64ff37): точный замороженный корпус GB6-FULL-DOCUMENT-SESSION (gateb-v4-immutable-spec.mjs, FULL_SUITE_TESTS) прогнан против перенесённой линии: 311 tests / 62 suites / 311 pass / 0 fail (28с), WEB305_FROZEN_SUITE_RC=0. Красноту (308/311) вылечила V4-цепь Gate B (V4C→V4P), перенесённая волной web323. Исходники не редактировались. P0 закрыт с пруфом.
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-305","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-23T12:03:45.580Z