WEB board

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

WebKit/Safari теряет точность вставки: комбинирующая é схлопывается в NFC, пробел перед RTL становится NBSP — в Safari текст вставляется НЕ байт-в-байт

Закрыт P1 · важно ведёт: backup-opus
Суть
## Найдено 21.08 ~04:55 волной webkitclip — ПЕРВЫЙ РЕАЛЬНЫЙ ПРОГОН последней ноги Gate C (было NOT-RUN 3/3, стало FAIL 3/3 — это ПРОГРЕСС: теперь знаем правду)
Стенд: headed Playwright WebKit (AppleWebKit/605.1.15, Version/26.0 Safari), тот же ON-build 8S6CZ-OG3tX3cKeBojcFZ, macOS pbcopy/pbpaste только как адаптер хост-пастборда. WKWebView НЕ подменялся.
ЧТО РАБОТАЕТ: реальные copy/cut/paste происходят; хост-пастборд ТОЧЕН до и после (é🙂 שלום); trusted-события copy 2 / paste 2 / editor paste 2 / cut 1; insertFromPaste и deleteByCut наблюдаются; загрязнения нет.
ЧТО ЛОМАЕТСЯ (корень): WebKit нормализует контент НА ГРАНИЦЕ contenteditable — комбинирующая последовательность e+U+0301 приходит в paste-событие уже как é (NFC), а обычный SPACE между эмодзи и ивритом попадает в DOM как NBSP. Итог: strict-совпадений в финальном DOM 1 из 2 ожидаемых; при NFC+NBSP-folding — 2 из 2.
ЗНАЧИТ: это ПРОДУКТОВЫЙ дефект точности (в Safari пользователь получит не те байты, что копировал), а не дыра доказательной гарнитуры. Расписки: /Volumes/M4Ext/ops/gatecr9/webkitclip-evidence-20260820T203058Z (3 receipt JSONL с sha), verifier webkitclip-verify.py sha 9f8d7ff0…; honesty-mode rc=0, --require-pass rc=1, мутация raw-события rc=1 (негативный контроль ЕСТЬ).
ПЛАН ФИКСА: на границе вставки в WebKit сохранять исходную форму (не доверять clipboardData.getData текстовой нормализации): брать items/HTML-flavor, сравнивать с ожидаемым, при расхождении восстанавливать декомпозицию и обычный пробел; тест — этот же лег, ожидание PASS 3/3 без folding.
Связки: WEB-283 (Gate C, лег 9), WEB-085 (D1 хвост), WEB-086 (этап D). Отчёт: M4 /Users/milamarty/work/WEBKITCLIP-REPORT.md.

## 21.08 ~07:50 РЕЗУЛЬТАТ ЕСТЬ, КОММИТА НЕТ: волна wkfix получила WebKit PASS 3/3 без folding-послаблений + Chrome/Firefox зелёные + unit 4/4 (улики /Volumes/M4Ext/ops/gatecr9/wkfix-web089-evidence-20260820T211339Z/ с SHA256SUMS), но не смогла закоммитить — я посадил её и веер engc-C03 в ОДНО дерево (моя ошибка диспетчеризации). Второй заход (wkfin) вышел на ожидании сборки — сработало правило «волне нельзя ждать сборку». Третий заход запущен с явной инструкцией: отвязанная сборка + файл-квитанция rc.

## 21.08 ~08:20 ЗАКОММИЧЕНО КООРДИНАТОРОМ: 56d638bc5 (ветка web089-wkfix, worktree wt-web089). Три захода волны получали ЗЕЛЁНЫЙ результат, но выходили до коммита: (1) дерево занято веером engc-C03 — моя ошибка диспетчеризации; (2) и (3) выход на ожидании сборки, хотя сборка завершилась rc=0 (правило «волне нельзя ждать сборку» подтвердилось дважды). Проверил сам: сборка rc=0, вне .next только 5 файлов правки (EditorModal.tsx + webkitClipboardExactness.ts + тест + адаптер + tsconfig) — их и закоммитил, артефакты сборки не индексировал.
ПОСЛЕДНЯЯ НОГА GATE C ЗАКРЫТА: WebKit real-clipboard 3/3 PASS без folding, Chrome/FF регресс зелёный, unit 4/4. Запущена упаковка R22E (волна r22epack) с учётом D1: цифры COVER генерацией, внутренние отчёты регенерировать на этапе упаковки, mutation harness вложить.

## Трейл (21.08)
- Ветка посадки-30: `landing30` (worktree A1 /home/ubuntu/waves/wt-landing30, от serving f1e49bca), слито 6 веток / 88 файлов, проверка дубликатов ключей в словарях: 0.
- Живой статус смены: `~/Downloads/OPS-STATUS-LIVE.md` (ноутбук) + копии на M1 `~/livepush/` и M4 `/Users/milamarty/work/`.
- Паспорт проекта: https://bugs.wool2.online/passport (обновлён 21.08: serving arm64-f1e49bca, статы из свежей ветки, дельты в stats-history.json).
- Леджер ревизора: `/Volumes/M4Ext/ops/reviser-ledger/` (пакеты + аудит-бандлы, sha сверены).
- Диагностический прогон (FAIL 3/3, корень): M4 `WEBKITCLIP-REPORT.md`; улики `/Volumes/M4Ext/ops/gatecr9/webkitclip-evidence-20260820T203058Z` (3 receipt JSONL + sha), verifier `webkitclip-verify.py` sha `9f8d7ff0…`.
- Прогон после фикса (PASS 3/3 + регресс Chrome/FF): `/Volumes/M4Ext/ops/gatecr9/wkfix-web089-evidence-20260820T211339Z/SHA256SUMS.txt`.
- Фикс: worktree M4 `wt-web089`, ветка `web089-wkfix`, коммит `56d638bc5` (координаторский; 5 файлов, артефакты сборки не индексированы).
- Упаковка: волна r22epack → пакет ENGINE-GATEC-R22E (бриф `/Users/milamarty/work/r22epack-brief.md` с учётом D1 из вердикта R21E).
- Контекст гейта: вердикт R21E в леджере `ENGINE-GATEC-R21E-INDEPENDENT-AUDIT-20260820.zip` sha `bb07367c…`.

## 21.08 — ENGINE GATE C R22F verifier closure (Codex, isolated M4)
- Исходный пакет read-only: /Volumes/M4Ext/ops/gatecr9/r22seal-package-20260821T001616Z; 1.4 GB ZIP не пересобирался и не изменялся.
- Patch M4: /Volumes/M4Ext/ops/worktrees/r22f-verifier-20260821/ENGINE-R22F-MAIN.patch; SHA-256 02545f35a1fbb094e92ac78dfc8ceea8e087f3ae797c40f85951cf1a63f9f9cc0.
- Report M4: /Volumes/M4Ext/ops/worktrees/r22f-verifier-20260821/ENGINE-R22F-MAIN-REPORT.md; финальный SHA-256 b1b195e036b5c34e90eeb9f48fe1aa74d87cbf95c6811f08ec4d74d1d22430fb.
- Owner copies: ~/Downloads/ENGINE-R22F-MAIN.patch и ~/Downloads/ENGINE-R22F-MAIN-REPORT.md; SHA совпали M4 → M1 → ноутбук.
- Shared predicate пересчитывает raw trusted copy/paste/editor-paste/cut, payload arrays, contamination, target occurrences, timestamps и check/cell/run status; verify-package и dossier используют один модуль.
- Honest verify-package: PASS 8/8 rc=0; honest dossier: PASS 8/8 rc=0; test_derive_matrix 8 tests rc=0; focused processExit + reviewer trusted-copy mutation 2 tests rc=0.
- Reviewer mutation ребиндит custody/matrix/EPOCH/COVER/dossier/reports/SHA256SUMS, но оба verifier-а обязаны вернуть non-zero. Exact commit-object claim заменён на реально доставленные patch/file digests. PROPOSAL regenerated.
- Deploy/commit/push не выполнялись. Следующий гейт — независимая приёмка patch/report, затем решение о пересборке deliverable ZIP.

## R22G-R1-F1-INDEPENDENT-NOGO-20260822 — product evidence GO, reusable verifier NO-GO
- Independent audit report: `~/Downloads/INDEPENDENT-AUDIT-GATEC-R22G-R1-20260822.md`, SHA `fa8baa1194fe10efb622da10ab8ff50891b31ccb81076a254bc7033fe8f60242`.
- Accepted boundaries remain unchanged: R22G-R1 transport/replay remediation = GO; original sealed WEB-089 product evidence = GO.
- Blocking semantic finding: shared `webkitclip_predicate.py` counted trusted copy/cut without requiring `targetInEditor=true`, accepted insert/delete events without editor targeting, and did not bind adapter host digests to editor events. A coordinated metadata/hash rebind with all trusted copy/cut outside the editor still passed both reusable verifiers.
- A1 remediation `engine-r22g-r2-f1` is active against immutable core ZIP SHA `c0aefd86…c2cd`. Required gate: editor-targeted copy/paste/cut + editor-targeted insert/delete + structural control-copy→editor-copy→editor-paste→editor-cut order + adapter digest binding; coordinated true→false mutation and four separate negatives must fail both verifiers; reverse-regression and complete suite are mandatory.
- Overall verifier/package sign-off remains NO-GO until a new self-consistent R22G-R2 core is independently accepted. Production deploy/paid run remains out of scope.

## R22G-R2-F1-BLOCKED-F2-STARTED-20260822T1944Z
- F1 report /home/ubuntu/waves/ENGINE-R22G-R2-F1-A1-REPORT.md SHA 0cb439e8c4ba5a6a0da3214e59ae45d0b65538a4f4a8046128141d68b4204a04; marker ENGINE_R22G_R2_F1_A1_BLOCKED. Patch SHA 0f391bbf42a9af89ba4361207b15da39f26277087e03bae00596d7c04768a09b.
- Semantic repair itself is locally live: dossier 8/8, focused 6/6, matrix 8/8; legacy predicate accepts coordinated target mutation while fixed predicate refuses it. Overall reusable package remains NO-GO because canonical verify-package stopped rc=42 before semantics: accepted core-only ZIP omitted unchanged custody blobs.
- Exact accepted blobs were found and transferred to A1: ON 5d6a0790…fb3 / 253869677 bytes; OFF ae7b9c11…83a / 373618122 bytes. F2 Codex is active and must run full 87-test suite, canonical verifier through semantic negatives, then build a self-consistent R2 core. No browser rerun/prod/paid action.

## 2026-08-23 BOARDSWEEP: STALE-NOT-DEPLOYED
- Evidence: buildFixed is empty. Canonical editor serialization/normalization files were inspected, but Safari acceptance needs a deployed candidate and browser receipt; none is bound to canonical.
- buildFixed: <empty>; canonical: v4-081ff4fb5 / 081ff4fb5f6110f8001daec7ed910ccef2e395dc.
- Status preserved by sweep: review.
Доказательства
[24.08 00:06] ПОСАЖЕН посадкой 39 (v4-def2df3f7): патч WEB089-FIX.patch из ENGINE-R22G-F4-SELF-CONTAINED.zip (upstream 56d638bc), интеграционный коммит def2df3f7, конфликты EditorModal разрешены руками. Гейты: prisma-gate OK, пин-гейт 7/7, paidReady=true после флипа. Отчёт: /home/ubuntu/waves/L40FIXHUNT-REPORT.md. Родня: WEB-320.
Починено в
v4-def2df3f7
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-089","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-23T23:10:48.201Z