WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-304 · Задача · Редактор · web

Движок: работа волн W1-W4 (shadow-контур) не является предком текущей линии — проверить, что доехало

Закрыт P1 · важно ведёт: backup-opus
Суть
## Вопрос владельца (21.08): «волна 3-4 по движку — вы её закончили или нет?»

## Установленные факты
Волны Gate C **W1-W4 от 11-12.08** делали ship-dark shadow-контур:
- W1 — рекордер расхождений (ring + JSONL);
- W2 — проводка read-only shadow в легаси-редактор, коммит `9184db66`, за флагом `DOCUMENT_SESSION_SHADOW_W1_ENABLED`;
- W3 — телеметрия + soak + oracle-log, коммит `ab348446` (промт `/Users/milamarty/work/M4-GATEC-W3-PROMPT.md`);
- W4 — починка 311-сюиты (308/311 RED с W1, две архитектурные границы, в т.ч. DS-T013 `node:fs` внутри DOM-free ядра) + реальный rewind-баг, который поймал soak-тест W3 (промт `M4-GATEC-W4-PROMPT.md`).

Обе тогда были доведены. **Но линия потом пошла по другой родословной**: `agent/gatec-r2` → `gatec-r3-onweb` → `gatecr11` → r19e/r20e/r21e → текущая `engc-C01` (HEAD `eaa27fec4`).

| проверка | результат |
|---|---|
| `9184db66` предок HEAD? | **НЕТ** |
| `ab348446` предок HEAD? | **НЕТ** |
| файлы shadow-линии в HEAD | **ЕСТЬ**: `gatec-shadow-w1.ts`, `gatec-shadow-w2-runtime.ts`, `gatec-shadow-telemetry.ts`, `gatec-shadow-telemetry-transport.ts`, флаг в `EditorModal.tsx` |
| коммитов вне HEAD на `agent/gatec-shadow-w1-20260811` | **13** |
| на `agent/gatec-shadow-w2-20260812` | **16** |
| на `agent/gatec-shadow-w3-20260812` | **14** |

Вывод: содержимое переносили **пересозданием, а не слиянием**. «Файлы на месте» и «вся работа на месте» — разные утверждения, и второе не доказано.

## Что делается
Волна `shadowrec` (M4, **только чтение**, бриф `/Users/milamarty/work/shadowrec-brief.md`) раскладывает каждый файл из коммитов вне HEAD на три корзины: ДОЕХАЛО / ДОЕХАЛО ЧАСТИЧНО (с указанием, какое поведение потеряно) / ПОТЕРЯНО. Отдельно проверяются четыре самых ценных предмета: персистентная схема телеметрии shadow, soak-тест с oracle-log, исправление rewind-бага, две архитектурные границы 311-сюиты (и зелёная ли сюита сейчас).
Волне запрещено сливать, делать `cherry-pick` и удалять ветки — ветки единственный носитель этой работы.

## Связки
Эпики: WEB-283 (Gate C, леги 1-9), WEB-086 (этап C, CodeMirror-гибрид), WEB-085 (D1 хвост пакета R22E).
Класс дефекта тот же, что в правиле «никогда не сливать волны через `cherry-pick -X theirs`» и в инциденте с git alternates 13.08 (потеря BOARD-волн W1-W6).
Отчёт будет: `/Users/milamarty/work/SHADOWREC-REPORT.md`.

## 21.08 02:16 — СВЕРКА ЗАКОНЧЕНА (волна shadowrec, только чтение, RC=0)
Отчёт: M4 `/Users/milamarty/work/SHADOWREC-REPORT.md` (35 КБ).

**Поправка к моим вводным.** `git diff --stat HEAD...<ветка>` не исполняется: у HEAD и shadow-веток **нет общего предка** (`fatal: no merge base`) — это два независимых корня. Сравнение шло прямым пофайловым `git diff HEAD:<файл> <ветка>:<файл>`.
И три ветки — не три независимых набора работы, а **вложенная лестница**: W1 (`3c63bde85`) → W2 (`9184db66a`) → W3 → W4 (`bd5737d7d`) → Sign-Off R1 (`970324047`).
- `agent/gatec-shadow-w1-20260811` заканчивается на W2, своей работы сверх него не несёт;
- `agent/gatec-shadow-w2-20260812` — **самый полный носитель** (W1→W2→W3→W4→R1);
- `agent/gatec-shadow-w3-20260812` — альтернативная, **отвергнутая** реализация W3 (там `node:fs` жил прямо в DOM-free ядре; W4 её переписал);
- коммит «W3» на ветке w2 содержит **только evidence-логи** (40 файлов `leg1-evidence-w2/*`), ни одного файла под `src/` — код W3 физически приехал в составе W4. Это и объясняет, почему W3 «невидим» при поиске по исходникам.

| корзина | шт. | что |
|---|---:|---|
| **ДОЕХАЛО** | **13** | `gatec-shadow-w1.ts`, `gatec-shadow-w2-runtime.ts`, `gatec-shadow-telemetry.ts`, `…-jsonl-writer.ts`, admin-роут телеметрии, `EditorModal.tsx`, `document-session/index.ts`, четыре теста, `GATEC-SIGNOFF-ADVERSARIAL.test.ts`, `GATEC-R1-REPORT.md` |
| **ДОЕХАЛО ЧАСТИЧНО** | **1** | `src/lib/document-session/core.ts` |
| **ПОТЕРЯНО** | **7** | секция Gate C в `compile-proofs/negative.ts` + шесть документов (`GATEC-SHADOW-W1/W2-REPORT.md`, `GATEC-W3/W4-REPORT.md`, `GATEC-TELEMETRY-SCHEMA.md`, `GATEC-ORACLE-LOG.md`) |

По коду HEAD оказался **строгим надмножеством**: например `gatec-shadow-w1.ts` — 8 вставок против 256 удалений в направлении HEAD→ветка, плюс поздние `SelectionSnapshot`/`SelectionAvailability`. В `w2-runtime.ts` пословно сверены 9 групп маркеров поведения; единственный нулевой — `advanceDeferredEditState`, функция встроена, само отложенное применение живо (`shouldDeferOrdinaryEdit`, `deferredOrdinaryEdits` на месте). Потери поведения не обнаружено.

**Главный вывод сверки оказался не про потери, а про регрессию** → заведён P0 **WEB-305**: замороженная 311-сюита на текущем HEAD **красная 308/311**, и обе причины лежат на границе DS-T013, которую W4 закрывал.

Осталось из потерянного: вернуть секцию Gate C в `compile-proofs/negative.ts` (это код, а не документ) и решить судьбу шести отчётов — они на ветках, ветки не удалять.

## 2026-08-23 13:40 UTC — сверка с картой этапов движка (вопрос owner, источник: ~/Downloads/conversation.txt)
Карта этапов редакторного движка (принята ~18.08): Этап A (P0, WEB-223..227) — ЗАКРЫТ, в проде. Gate A — контракт document-session-contract-v1 принят. Этап B (docsession: ядро F00-F07 + веер миграции фич) = ЭТОТ эпик/линия. Этап C (CodeMirror-гибрид для огромных доков, «Война и мир» 800К токенов) = WEB-086. Этап D (спайк ProseMirror) — не начат.
СТАТУС ЧЕСТНО: сейчас волн по линии НЕТ (приостановлена ~19-20.08 ради ролей/фактчека/монетизации/посадок). Аудиторский пакет R22G-F4 (WEB-085, вердикт GO 23.08) — это custody/proof ДОКАЗАТЕЛЬСТВ поведения движка, НЕ посадка кода. Продуктовая пересадка = отдельная работа: сперва WEB-304 (работа shadow-волн W1-W4 не предок текущей линии — сверить что реально в serving и пересадить потерянное), потом хвосты B, потом этап C. Связки: [[WEB-291]] (класс потерянных фиксов), [[WEB-305]] (замороженная 311-сюита красная).


## 2026-08-23 14:05 UTC — уточнение карты (две лестницы)
## Карта: ДВЕ лестницы движка (зафиксировано 23.08 после вопроса owner)
ЛЕСТНИЦА ГЕЙТОВ DocumentSession (доверие движку): Gate A контракт ✅ (document-session-contract-v1) → Gate B библиотека ✅ (F01-F06, 311+135 тестов, 8 раундов V4→V4Q) → Gate C legacy shadow ✅ (ЗАКРЫТ 23.08: пакет R22G-F4, вердикт аудита GO — браузерные пруфы selection/clipboard/edit-mirror, ON/OFF артефакты, WEB-089 CLOSED-VERIFIED) → Gate D controlled writer (NO-GO, ждёт интеграции+одобрения) → Gate E mutating AI (NO-GO) → Gate F production collaboration (NO-GO).
ПРОДУКТОВАЯ лестница этапов редактора (другая!): этап A P0-фиксы ✅ (в проде) → этап B docsession-веер фич (WEB-283) → этап C CodeMirror-гибрид для ТЯЖЁЛЫХ ФАЙЛОВ (WEB-086) → этап D спайк ProseMirror.
ВАЖНО: движок-библиотека живёт в ОТДЕЛЬНОМ дереве (wq/o3/docsession-*) и НЕ является предком прод-линии (WEB-304) — т.е. Gates B/C приняты аудитором, но этот код НЕ в serving. Первый шаг к проду = WEB-323 (интеграция ship-dark).

Тикеты гейтов: [[WEB-323]] интеграция ship-dark (вход), [[WEB-324]] Gate D, [[WEB-325]] Gate E, [[WEB-326]] Gate F.

## 2026-08-23 BOARDSWEEP: IN_PROGRESS-LIVE
- Evidence: updatedAt=2026-08-23T10:52:20.264Z, within 24h; shadow-contour ancestry audit is current. No status change.
- buildFixed: <empty>; canonical: v4-081ff4fb5 / 081ff4fb5f6110f8001daec7ed910ccef2e395dc.
- Status preserved by sweep: in_progress.
Доказательства

[2026-08-27 связь] Подтверждено практикой: работа Gate D ведётся в отдельной ветке gdiag поверх прод-линии 2c6c2276 (не в shadow-контуре W1-W4). Сегодня в этой ветке: gdiag -> gdfix2 -> gdfix3 -> gdfix4 -> gdfix5, приёмки accgd..accgd7. На прод Gate D пока НЕ посажен (последний блокер — divergence на пробеле, чинится).

[BOARDTRIAGE] Последний пруф около 27.08 19:03Z: gdiag→gdfix5 идёт отдельно от W1–W4, Gate D на прод не посажен. До следующего тика нужен новый commit/приёмка; иначе вернуть в todo.
Лента
2026-09-02T13:58:39.648Z · Fable
[A1 14:02 Фабл] Закрытие для нулевого агента: вопрос «доехал ли shadow-контур W1–W4 до прод-линии» решён через WEB-323 (done): движок DocumentSession перенесён в прод-линию ship-dark из ПРИНЯТОГО пакета R22G-F4 (Gate C GO 23.08), не из веток W1–W4 (их коммиты 9184db66/ab348446 в текущем репо отсутствуют — старое дерево wq/o3/docsession-*). С тех пор движок живёт в serving-линии: продуктовая проводка (NEXT_PUBLIC_/DOCUMENT_SESSION_PRODUCT_WIRING_ENABLED, cohort all) включена на l86+, CodeMirror-гибрид для тяжёлых файлов (WEB-333/086) — l90/l91. Gate D/E/F по-прежнему NO-GO по лестнице доверия (WEB-324/325/326). Тикет → done как «сверка родословной выполнена».
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-304","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-09-02T13:58:39.696Z