WEB-449 · Задача · — · web
КАНОН: правила обогащения тикетов (для любого агента)
На проверке
P2
ведёт: —
Суть
## Суть одной фразой
Канон обогащения тикетов (правила 1–15) для любого агента — Фабл, кодекс-волны, нулевой агент; на него ссылается каждый тикет строкой «Правила обогащения: WEB-449».
## Где мы сейчас (13.09.2026)
Тело актуально на 13.09.2026: правила 1–14 сохранены, добавлено правило 15 (доказательство — только ссылкой на факт), правило 1 приведено к реальной практике (UTC), якорь прода обновлён на l115j `133fe00c` (13.09 08:50Z). Постоянная карточка без критерия закрытия — живой канон. Полный текст правил — в этом же теле, ниже, до черты истории. Полная копия канона — CANON.md (выход волны 3683).
## Хронология
- 04.09 правила 8–12 (пять процессных дефектов) и 13–14 (ещё два).
- 05.09 правило KNOWN ISSUES/ТРАБЛШУТИНГ.
- 12.09 обновление якоря (l103 `d91ebefe` / l104 `4d858be7` → l115g `9c8a9762`), волна 3577.
- 13.09 правило 15 (доказательство), правило 1 IST→UTC, якорь l115j `133fe00c`, волна 3683.
## Карта документов и кода
- Полный текст канона: /Users/milamarty/waves/3683-journal-and-canon-refresh-out/CANON.md.
- Отчёт волны: /Users/milamarty/waves/3683JOURNALCANON-REPORT.md.
- Резерв старого тела: /tmp/body-backup-WEB-449.md (M1), копия nc-ops-scripts/shift-20260912-resume/3577/collected/.
- Живая доска: web-board.sqlite + HTTP API http://127.0.0.1:8787/api/web/* на M1; НЕ board.sqlite (легаси iOS).
## Остаток (ответственный)
1. Поддерживать канон (правила, якорь, примеры образцовых карт) — координатор, постоянно.
2. Обновлять якорь прода при каждой посадке — координатор.
## Критерий закрытия
НЕТ — постоянная карточка. Критерий «актуальности»: якорь прода совпадает с текущей линией.
---
# ПРАВИЛА ОБОГАЩЕНИЯ ТИКЕТОВ (канон для ЛЮБОГО агента: Фабл, кодекс-волны, нулевой агент)
Этот тикет — автономный свод правил. Каждый эпик и рабочий тикет ссылается сюда строкой: «Правила обогащения: WEB-449». Работая над ЛЮБЫМ тикетом, соблюдай:
## 1. Каждый вердикт = запись в тикет ТУТ ЖЕ
Формат: дата/время UTC (Z; IST = UTC+5:30), кто (волна/приёмка/координатор), ЧТО решено, коммит/ветка, путь отчёта. Не «сделано», а сдача с доказательствами.
## 2. Глубина решения, не только вердикт
При GO архитектурной работы — выжимка МЕХАНИКИ в тикет: как устроено, какие сущности/файлы, где гейт, что было корнем. Проверка: «нулевой агент поймёт устройство, не открывая код?»
## 3. Карта документов линии
В каждом тикете-линии — блок «КАРТА ДОКУМЕНТОВ»: все отчёты, брифы, ранбуки с ПОЛНЫМИ путями (машина + путь). Обновлять при каждом вердикте.
## 4. Эволюция видима
Кумулятивные записи (append), НЕ перезапись. Ряд кругов (K2→K3→…) с причиной каждого круга. PATCH затирает evidence — только дописывать.
## 5. Раздел «ДЛЯ ТИКЕТА» в каждом отчёте волны
Каждый бриф обязывает волну закончить отчёт разделом «ДЛЯ ТИКЕТА»: 3-6 строк эволюции + пути документов. Координатор переносит целиком.
## 6. Траблшуты — в леджер дня (WEB-320)
Каждая ловушка с рецептом лечения. Ссылку из тикета-линии на леджер, если траблшут родился в её работе.
## 7. Тикет ступени/линии искать по ЭПИКУ, не по словам
Перед новым тикетом — проверь, нет ли уже (дубли были). Эпик-тикет заводится ДО волн.
Примеры образцовых карт: WEB-410 (лестница миграции), WEB-093 (энтерпрайз). Леджер траблшутов: WEB-320.
### ПОПОЛНЕНИЕ КАНОНА 04.09 — пять процессных дефектов, каждый стоил круга или больше
**8. Запрет типизации в брифе приёмки ограничивать файлами, которые трогает коммит.**
Репозиторный (общий) запрет на ошибки типизации **отклонил шесть хороших кругов** из-за ОДНОГО нетронутого легаси-файла. Правило: гейт типов применяется к изменённым файлам коммита, не ко всему дереву.
**9. Пара «красный на родителе / зелёный после фикса» — необходима, но НЕ достаточна.**
Фикс ролей прошёл ровно такую пару, сел в линию и **не изменил на проде ничего** ([[WEB-505]]: C2 как был 4/14, так и остался; расписка отдавала `outOfWindowAdmitted: 0`, а документ `Fixture Note T-364 (outside both windows).txt` продолжал утекать). Для фич с живым поведением приёмка обязана включать прогон на проде.
**10. Волны НЕ МОГУТ писать в `/home/ubuntu/nc` и обязаны сдавать бандлы.**
Одна приёмка была отклонена **исключительно** за то, что бриф требовал от волны невыполнимого — записи в базовый репозиторий. Бриф обязан давать волне рабочее дерево и требовать бандл, а не путь в базу.
**11. У волн нет root — хостовые установки делает координатор.**
Всё, что требует `/usr/local/libexec`, systemd drop-in, установки пакетов на хост, — не задача волны (примеры сегодня: [[WEB-470]] скрипты hetzbk, [[WEB-093]] env-файл и drop-in для четырёх служб).
**12. Порог свободного места у диспетчера волн стережёт ПАМЯТЬ, а не диск; гейта по диску нет.**
Из-за этого боксы тихо умирали при заполненном диске. Подробности и следующее действие — [[WEB-478]].
### ПОПОЛНЕНИЕ КАНОНА 04.09, вторая порция — ещё два процессных дефекта
**13. Бриф считается разосланным ТОЛЬКО когда лежит в КОРНЕ очереди.**
Семь брифов положили в каталог «в полёте» (in-flight) диспетчера вместо корня очереди — диспетчер их не подхватил, **три машины простояли без работы**. Правило: после записи брифа проверять ФАКТ ПОДХВАТА (появление в `running`), а не факт записи файла. Смыкается с уже известной ловушкой «бриф из ssh-heredoc тихо не записался».
**14. Посадка обязана двигать ВСЕ службы — расхождение версий внутри одного прода бывает молчаливым.**
Сегодня служба **экстракции продолжала работать на l100**, когда web и indexing были уже на **l103**. Никакой ошибки при этом не наблюдалось. Исправлено. Проверка версии по КАЖДОЙ службе — обязательный пункт приёмки посадки, а не только по web.
### ПРАВИЛО КАНОНА (13.09): доказательство — только ссылкой на факт
**15. Утверждение о готовности засчитывается ТОЛЬКО со ссылкой на факт.**
«Сделано», «исправлено», «должно работать» — доказательством НЕ являются. Работа считается сделанной, только если в карточке есть ССЫЛКА НА ФАКТ: номер волны с вердиктом, номер линии посадки, имя файла с доказательством, вывод команды с цифрами. Без такой ссылки — это статус RETURN с точным списком, чего не хватает.
### ПРАВИЛО КАНОНА (05.09): блок KNOWN ISSUES
Каждый тикет, где были находки, обязан нести блок «KNOWN ISSUES / ТРАБЛШУТИНГ»: симптом → как проверить за 2 минуты (команда/эндпоинт/поле evidence) → причина (файл:строка) → лечение/статус → ссылки (отчёт, ранбук, память). Обновлять дельтами при каждом новом круге. Примеры: WEB-99 (specs/ROLES-KNOWN-ISSUES.md), WEB-492/495 (specs/INFRA-A1-TWO-BACKENDS-LB.md).
## ЯКОРЬ ПРОДА (обновлено 13.09.2026)
**Якорь прода:** живая линия **l115j**, коммит **133fe00cb0f86982eea1fd6d2029e5b35fcc9e40** (13.09 08:50Z). Прежний якорь l115g `9c8a9762` (12.09) устарел.
Три посадки подряд за сутки:
- **l115h** (12.09 23:47Z, f0777c4d): карта живых гейтов безопасности, раннер гейтов (SQL через stdin, семантика UNKNOWN), 7 read-only receipt-роутов `/api/ops/security/*`, записанный долг периметра API.
- **l115i** (13.09 06:37Z, 6aac3421): фикс SEC-070, receipt SEC-067, QA-фикстуры; голос nearby/route (3585); тесты приёмки WEB-571/WEB-443 (3586); документы GDPR/AI Act (3588); живой прогон гейтов 13 PASS / 0 FAIL / 13 UNKNOWN.
- **l115j** (13.09 08:50Z, 133fe00c): WEB-205 REV-026 и 18 BLOCKED (3591); три дефекта редактора WEB-583 (3615/3613); QA-харнессы A/B/D (3597/3609/3614) и браузерные C (3598).
## ГДЕ ЖИВЁТ ДОСКА (чтобы канон не искали не там)
Живая доска: `web-board.sqlite` + HTTP `http://127.0.0.1:8787/api/web/*` на M1 (`ssh poolpooly@192.168.1.74`), id вида `WEB-NNN`.
НЕ живая: `board.sqlite` в том же каталоге — это iOS/легаси (таблицы `issues`, `ios_issues`, 2225 строк). Поиск `WEB-086` там ничего не находит — это признак, что смотрят не в ту базу.
`node` на M1 только абсолютным путём (`~/.nvm/versions/node/v22.21.1/bin/node`); русский текст через `curl -d` рвёт кавычки — писать `.mjs` с `fetch`.
PATCH полей `body`/`evidence` **затирает** значение: сначала GET, дописать в конец, потом PATCH.
## ЗАМЕТКА ПО ИНСТРУМЕНТУ ЗАПИСИ НА ДОСКУ
`node` в неинтерактивной ssh-сессии на M1 не в `PATH` (нужен абсолютный путь). Рабочая альтернатива без установки чего-либо: **`python3` + `urllib.request`** — читать GET, дописывать в конец, отправлять PATCH; кавычки русского текста не рвутся, потому что тело формируется `json.dumps`, а не строкой в `curl -d`.
---
## История (старый текст, сохранён ниже)
## Суть одной фразой
Канон обогащения тикетов (правила 1-14) для любого агента — Фабл, кодекс-волны, нулевой агент; на него ссылается каждый тикет строкой «Правила обогащения: WEB-449».
## Где мы сейчас (13.09.2026)
Тело актуально: правила 1-14 сохранены дословно, якорь прода обновлён на l115g 9c8a9762 волной 3577 (DeepSeek M4, 12.09). Постоянная карточка без критерия закрытия — живой канон. Мелочь: на 13.09 прод уже l115j (133fe00c) — якорь обновить в следующем цикле.
## Хронология
- 04.09 добавлены правила 8-12 и 13-14 (процессные дефекты, каждый стоил круга или больше).
- 05.09 правило KNOWN ISSUES/ТРАБЛШУТИНГ (симптом → проверка → причина файл:строка → лечение → ссылки).
- 12.09 обновление якоря (l103 d91ebefe / l104 4d858be7 → l115g 9c8a9762), волна 3577.
## Карта документов и кода
- Резерв старого тела: /tmp/body-backup-WEB-449.md (M1), копия nc-ops-scripts/shift-20260912-resume/3577/collected/.
- Отчёт обновления: /Users/milamarty/waves/3577BODYREFRESH-REPORT.md.
- Живая доска: web-board.sqlite + HTTP API http://127.0.0.1:8787/api/web/* на M1; НЕ board.sqlite (легаси iOS).
## Остаток (ответственный)
1. Поддерживать канон (правила, якорь, примеры образцовых карт) — координатор, постоянно.
2. Обновить якорь прода l115g → l115j при ближайшем цикле (координатор).
## Критерий закрытия
НЕТ — постоянная карточка. Критерий «актуальности»: якорь прода совпадает с текущей линией.
---
## История (старый текст, сохранён ниже)
# ПРАВИЛА ОБОГАЩЕНИЯ ТИКЕТОВ (канон для ЛЮБОГО агента: Фабл, кодекс-волны, нулевой агент)
Этот тикет — автономный свод правил. Каждый эпик и рабочий тикет ссылается сюда строкой: «Правила обогащения: WEB-449». Работая над ЛЮБЫМ тикетом, соблюдай:
## 1. Каждый вердикт = запись в тикет ТУТ ЖЕ
Формат: дата/время IST, кто (волна/приёмка/координатор), ЧТО решено, коммит/ветка, путь отчёта. Не «сделано», а сдача с доказательствами.
## 2. Глубина решения, не только вердикт
При GO архитектурной работы — выжимка МЕХАНИКИ в тикет: как устроено, какие сущности/файлы, где гейт, что было корнем. Проверка: «нулевой агент поймёт устройство, не открывая код?»
## 3. Карта документов линии
В каждом тикете-линии — блок «КАРТА ДОКУМЕНТОВ»: все отчёты, брифы, ранбуки с ПОЛНЫМИ путями (машина + путь). Обновлять при каждом вердикте.
## 4. Эволюция видима
Кумулятивные записи (append), НЕ перезапись. Ряд кругов (K2→K3→…) с причиной каждого круга. PATCH затирает evidence — только дописывать.
## 5. Раздел «ДЛЯ ТИКЕТА» в каждом отчёте волны
Каждый бриф обязывает волну закончить отчёт разделом «ДЛЯ ТИКЕТА»: 3-6 строк эволюции + пути документов. Координатор переносит целиком.
## 6. Траблшуты — в леджер дня (WEB-320)
Каждая ловушка с рецептом лечения. Ссылку из тикета-линии на леджер, если траблшут родился в её работе.
## 7. Тикет ступени/линии искать по ЭПИКУ, не по словам
Перед новым тикетом — проверь, нет ли уже (дубли были). Эпик-тикет заводится ДО волн.
Примеры образцовых карт: WEB-410 (лестница миграции), WEB-093 (энтерпрайз). Леджер траблшутов: WEB-320.
## ЯКОРЬ ПРОДА (обновлено 12.09.2026)
**Якорь прода:** живая линия **l115g**, коммит **9c8a97629b3f7fd8c79faff162eed482670f499d** (12.09). Прежние якоря l103 `d91ebefe` и l104 `4d858be7` (04.09) устарели.
**Доска:** живая доска — `web-board.sqlite` + HTTP API `http://127.0.0.1:8787/api/web/*` на M1 (`ssh poolpooly@192.168.1.74`). НЕ `board.sqlite` (это iOS/легаси, таблицы `issues`/`ios_issues`, 2225 строк, ключи другие).
### ПОПОЛНЕНИЕ КАНОНА 04.09 — пять процессных дефектов, каждый стоил круга или больше
**8. Запрет типизации в брифе приёмки ограничивать файлами, которые трогает коммит.**
Репозиторный (общий) запрет на ошибки типизации **отклонил шесть хороших кругов** из-за ОДНОГО нетронутого легаси-файла. Правило: гейт типов применяется к изменённым файлам коммита, не ко всему дереву.
**9. Пара «красный на родителе / зелёный после фикса» — необходима, но НЕ достаточна.**
Фикс ролей прошёл ровно такую пару, сел в линию и **не изменил на проде ничего** ([[WEB-505]]: C2 как был 4/14, так и остался; расписка отдавала `outOfWindowAdmitted: 0`, а документ `Fixture Note T-364 (outside both windows).txt` продолжал утекать). Для фич с живым поведением приёмка обязана включать прогон на проде.
**10. Волны НЕ МОГУТ писать в `/home/ubuntu/nc` и обязаны сдавать бандлы.**
Одна приёмка была отклонена **исключительно** за то, что бриф требовал от волны невыполнимого — записи в базовый репозиторий. Бриф обязан давать волне рабочее дерево и требовать бандл, а не путь в базу.
**11. У волн нет root — хостовые установки делает координатор.**
Всё, что требует `/usr/local/libexec`, systemd drop-in, установки пакетов на хост, — не задача волны (примеры сегодня: [[WEB-470]] скрипты hetzbk, [[WEB-093]] env-файл и drop-in для четырёх служб).
**12. Порог свободного места у диспетчера волн стережёт ПАМЯТЬ, а не диск; гейта по диску нет.**
Из-за этого боксы тихо умирали при заполненном диске. Подробности и следующее действие — [[WEB-478]].
### ГДЕ ЖИВЁТ ДОСКА (чтобы канон не искали не там)
Живая доска: `web-board.sqlite` + HTTP `http://127.0.0.1:8787/api/web/*` на M1 (`ssh poolpooly@192.168.1.74`), id вида `WEB-NNN`.
НЕ живая: `board.sqlite` в том же каталоге — это iOS/легаси (таблицы `issues`, `ios_issues`, 2225 строк). Поиск `WEB-086` там ничего не находит — это признак, что смотрят не в ту базу.
`node` на M1 только абсолютным путём (`~/.nvm/versions/node/v22.21.1/bin/node`); русский текст через `curl -d` рвёт кавычки — писать `.mjs` с `fetch`.
PATCH полей `body`/`evidence` **затирает** значение: сначала GET, дописать в конец, потом PATCH.
### ПОПОЛНЕНИЕ КАНОНА 04.09, вторая порция — ещё два процессных дефекта
**13. Бриф считается разосланным ТОЛЬКО когда лежит в КОРНЕ очереди.**
Семь брифов положили в каталог «в полёте» (in-flight) диспетчера вместо корня очереди — диспетчер их не подхватил, **три машины простояли без работы**. Правило: после записи брифа проверять ФАКТ ПОДХВАТА (появление в `running`), а не факт записи файла. Смыкается с уже известной ловушкой «бриф из ssh-heredoc тихо не записался».
**14. Посадка обязана двигать ВСЕ службы — расхождение версий внутри одного прода бывает молчаливым.**
Сегодня служба **экстракции продолжала работать на l100**, когда web и indexing были уже на **l103**. Никакой ошибки при этом не наблюдалось. Исправлено. Проверка версии по КАЖДОЙ службе — обязательный пункт приёмки посадки, а не только по web.
### ПРАВИЛО КАНОНА (05.09): блок KNOWN ISSUES
Каждый тикет, где были находки, обязан нести блок «KNOWN ISSUES / ТРАБЛШУТИНГ»: симптом → как проверить за 2 минуты (команда/эндпоинт/поле evidence) → причина (файл:строка) → лечение/статус → ссылки (отчёт, ранбук, память). Обновлять дельтами при каждом новом круге. Примеры: WEB-99 (specs/ROLES-KNOWN-ISSUES.md), WEB-492/495 (specs/INFRA-A1-TWO-BACKENDS-LB.md).
### ЗАМЕТКА ПО ИНСТРУМЕНТУ ЗАПИСИ НА ДОСКУ
`node` в неинтерактивной ssh-сессии на M1 не в `PATH` (нужен абсолютный путь). Рабочая альтернатива без установки чего-либо: **`python3` + `urllib.request`** — читать GET, дописывать в конец, отправлять PATCH; кавычки русского текста не рвутся, потому что тело формируется `json.dumps`, а не строкой в `curl -d`.
## История (ленты дня 04.09, для справки; время UTC / IST = UTC+5:30)
- l101 `d825eb0d` — флип 08:47Z. Девять ранее принятых изменений + фикс realtime-сокета.
- l102 `1b081c5a` — флип 11:18Z. Этап C движка, фикс окна цитат, мобильные боковые панели.
- l103 `d91ebefe` — флип 13:51Z. Перебазированная работа по ролям, фикс диалога приглашения, контур бэкапа.
- l104 `4d858be7` — флип 18:03Z. Проводка движка, регрессия телеграм-бота, фикс ретенции бэкапа.
- 12.09: текущий якорь l115g `9c8a9762`.
---
## история (тело до 13.09.2026)
# ПРАВИЛА ОБОГАЩЕНИЯ ТИКЕТОВ (канон для ЛЮБОГО агента: Фабл, кодекс-волны, нулевой агент)
Этот тикет — автономный свод правил. Каждый эпик и рабочий тикет ссылается сюда строкой: «Правила обогащения: WEB-449». Работая над ЛЮБЫМ тикетом, соблюдай:
## 1. Каждый вердикт = запись в тикет ТУТ ЖЕ
Формат: дата/время IST, кто (волна/приёмка/координатор), ЧТО решено, коммит/ветка, путь отчёта. Не «сделано», а сдача с доказательствами.
## 2. Глубина решения, не только вердикт
При GO архитектурной работы — выжимка МЕХАНИКИ в тикет: как устроено, какие сущности/файлы, где гейт, что было корнем. Проверка: «нулевой агент поймёт устройство, не открывая код?»
## 3. Карта документов линии
В каждом тикете-линии — блок «КАРТА ДОКУМЕНТОВ»: все отчёты, брифы, ранбуки с ПОЛНЫМИ путями (машина + путь). Обновлять при каждом вердикте.
## 4. Эволюция видима
Кумулятивные записи (append), НЕ перезапись. Ряд кругов (K2→K3→…) с причиной каждого круга. PATCH затирает evidence — только дописывать.
## 5. Раздел «ДЛЯ ТИКЕТА» в каждом отчёте волны
Каждый бриф обязывает волну закончить отчёт разделом «ДЛЯ ТИКЕТА»: 3-6 строк эволюции + пути документов. Координатор переносит целиком.
## 6. Траблшуты — в леджер дня (WEB-320)
Каждая ловушка с рецептом лечения. Ссылку из тикета-линии на леджер, если траблшут родился в её работе.
## 7. Тикет ступени/линии искать по ЭПИКУ, не по словам
Перед новым тикетом — проверь, нет ли уже (дубли были). Эпик-тикет заводится ДО волн.
Примеры образцовых карт: WEB-410 (лестница миграции), WEB-093 (энтерпрайз). Леджер траблшутов: WEB-320.
## ЯКОРЬ ПРОДА (обновлено 12.09.2026)
**Якорь прода:** живая линия **l115g**, коммит **9c8a97629b3f7fd8c79faff162eed482670f499d** (12.09). Прежние якоря l103 `d91ebefe` и l104 `4d858be7` (04.09) устарели.
**Доска:** живая доска — `web-board.sqlite` + HTTP API `http://127.0.0.1:8787/api/web/*` на M1 (`ssh poolpooly@192.168.1.74`). НЕ `board.sqlite` (это iOS/легаси, таблицы `issues`/`ios_issues`, 2225 строк, ключи другие).
### ПОПОЛНЕНИЕ КАНОНА 04.09 — пять процессных дефектов, каждый стоил круга или больше
**8. Запрет типизации в брифе приёмки ограничивать файлами, которые трогает коммит.**
Репозиторный (общий) запрет на ошибки типизации **отклонил шесть хороших кругов** из-за ОДНОГО нетронутого легаси-файла. Правило: гейт типов применяется к изменённым файлам коммита, не ко всему дереву.
**9. Пара «красный на родителе / зелёный после фикса» — необходима, но НЕ достаточна.**
Фикс ролей прошёл ровно такую пару, сел в линию и **не изменил на проде ничего** ([[WEB-505]]: C2 как был 4/14, так и остался; расписка отдавала `outOfWindowAdmitted: 0`, а документ `Fixture Note T-364 (outside both windows).txt` продолжал утекать). Для фич с живым поведением приёмка обязана включать прогон на проде.
**10. Волны НЕ МОГУТ писать в `/home/ubuntu/nc` и обязаны сдавать бандлы.**
Одна приёмка была отклонена **исключительно** за то, что бриф требовал от волны невыполнимого — записи в базовый репозиторий. Бриф обязан давать волне рабочее дерево и требовать бандл, а не путь в базу.
**11. У волн нет root — хостовые установки делает координатор.**
Всё, что требует `/usr/local/libexec`, systemd drop-in, установки пакетов на хост, — не задача волны (примеры сегодня: [[WEB-470]] скрипты hetzbk, [[WEB-093]] env-файл и drop-in для четырёх служб).
**12. Порог свободного места у диспетчера волн стережёт ПАМЯТЬ, а не диск; гейта по диску нет.**
Из-за этого боксы тихо умирали при заполненном диске. Подробности и следующее действие — [[WEB-478]].
### ГДЕ ЖИВЁТ ДОСКА (чтобы канон не искали не там)
Живая доска: `web-board.sqlite` + HTTP `http://127.0.0.1:8787/api/web/*` на M1 (`ssh poolpooly@192.168.1.74`), id вида `WEB-NNN`.
НЕ живая: `board.sqlite` в том же каталоге — это iOS/легаси (таблицы `issues`, `ios_issues`, 2225 строк). Поиск `WEB-086` там ничего не находит — это признак, что смотрят не в ту базу.
`node` на M1 только абсолютным путём (`~/.nvm/versions/node/v22.21.1/bin/node`); русский текст через `curl -d` рвёт кавычки — писать `.mjs` с `fetch`.
PATCH полей `body`/`evidence` **затирает** значение: сначала GET, дописать в конец, потом PATCH.
### ПОПОЛНЕНИЕ КАНОНА 04.09, вторая порция — ещё два процессных дефекта
**13. Бриф считается разосланным ТОЛЬКО когда лежит в КОРНЕ очереди.**
Семь брифов положили в каталог «в полёте» (in-flight) диспетчера вместо корня очереди — диспетчер их не подхватил, **три машины простояли без работы**. Правило: после записи брифа проверять ФАКТ ПОДХВАТА (появление в `running`), а не факт записи файла. Смыкается с уже известной ловушкой «бриф из ssh-heredoc тихо не записался».
**14. Посадка обязана двигать ВСЕ службы — расхождение версий внутри одного прода бывает молчаливым.**
Сегодня служба **экстракции продолжала работать на l100**, когда web и indexing были уже на **l103**. Никакой ошибки при этом не наблюдалось. Исправлено. Проверка версии по КАЖДОЙ службе — обязательный пункт приёмки посадки, а не только по web.
### ПРАВИЛО КАНОНА (05.09): блок KNOWN ISSUES
Каждый тикет, где были находки, обязан нести блок «KNOWN ISSUES / ТРАБЛШУТИНГ»: симптом → как проверить за 2 минуты (команда/эндпоинт/поле evidence) → причина (файл:строка) → лечение/статус → ссылки (отчёт, ранбук, память). Обновлять дельтами при каждом новом круге. Примеры: WEB-99 (specs/ROLES-KNOWN-ISSUES.md), WEB-492/495 (specs/INFRA-A1-TWO-BACKENDS-LB.md).
### ЗАМЕТКА ПО ИНСТРУМЕНТУ ЗАПИСИ НА ДОСКУ
`node` в неинтерактивной ssh-сессии на M1 не в `PATH` (нужен абсолютный путь). Рабочая альтернатива без установки чего-либо: **`python3` + `urllib.request`** — читать GET, дописывать в конец, отправлять PATCH; кавычки русского текста не рвутся, потому что тело формируется `json.dumps`, а не строкой в `curl -d`.
## История (ленты дня 04.09, для справки; время UTC / IST = UTC+5:30)
- l101 `d825eb0d` — флип 08:47Z. Девять ранее принятых изменений + фикс realtime-сокета.
- l102 `1b081c5a` — флип 11:18Z. Этап C движка, фикс окна цитат, мобильные боковые панели.
- l103 `d91ebefe` — флип 13:51Z. Перебазированная работа по ролям, фикс диалога приглашения, контур бэкапа.
- l104 `4d858be7` — флип 18:03Z. Проводка движка, регрессия телеграм-бота, фикс ретенции бэкапа.
- 12.09: текущий якорь l115g `9c8a9762`.
---
## история (тело до 13.09.2026)
## Суть одной фразой
Канон обогащения тикетов (правила 1-14) для любого агента — Фабл, кодекс-волны, нулевой агент; на него ссылается каждый тикет строкой «Правила обогащения: WEB-449».
## Где мы сейчас (13.09.2026)
Тело актуально: правила 1-14 сохранены дословно, якорь прода обновлён на l115g 9c8a9762 волной 3577 (DeepSeek M4, 12.09). Постоянная карточка без критерия закрытия — живой канон. Мелочь: на 13.09 прод уже l115j (133fe00c) — якорь обновить в следующем цикле.
## Хронология
- 04.09 добавлены правила 8-12 и 13-14 (процессные дефекты, каждый стоил круга или больше).
- 05.09 правило KNOWN ISSUES/ТРАБЛШУТИНГ (симптом → проверка → причина файл:строка → лечение → ссылки).
- 12.09 обновление якоря (l103 d91ebefe / l104 4d858be7 → l115g 9c8a9762), волна 3577.
## Карта документов и кода
- Резерв старого тела: /tmp/body-backup-WEB-449.md (M1), копия nc-ops-scripts/shift-20260912-resume/3577/collected/.
- Отчёт обновления: /Users/milamarty/waves/3577BODYREFRESH-REPORT.md.
- Живая доска: web-board.sqlite + HTTP API http://127.0.0.1:8787/api/web/* на M1; НЕ board.sqlite (легаси iOS).
## Остаток (ответственный)
1. Поддерживать канон (правила, якорь, примеры образцовых карт) — координатор, постоянно.
2. Обновить якорь прода l115g → l115j при ближайшем цикле (координатор).
## Критерий закрытия
НЕТ — постоянная карточка. Критерий «актуальности»: якорь прода совпадает с текущей линией.
---
## История (старый текст, сохранён ниже)
# ПРАВИЛА ОБОГАЩЕНИЯ ТИКЕТОВ (канон для ЛЮБОГО агента: Фабл, кодекс-волны, нулевой агент)
Этот тикет — автономный свод правил. Каждый эпик и рабочий тикет ссылается сюда строкой: «Правила обогащения: WEB-449». Работая над ЛЮБЫМ тикетом, соблюдай:
## 1. Каждый вердикт = запись в тикет ТУТ ЖЕ
Формат: дата/время IST, кто (волна/приёмка/координатор), ЧТО решено, коммит/ветка, путь отчёта. Не «сделано», а сдача с доказательствами.
## 2. Глубина решения, не только вердикт
При GO архитектурной работы — выжимка МЕХАНИКИ в тикет: как устроено, какие сущности/файлы, где гейт, что было корнем. Проверка: «нулевой агент поймёт устройство, не открывая код?»
## 3. Карта документов линии
В каждом тикете-линии — блок «КАРТА ДОКУМЕНТОВ»: все отчёты, брифы, ранбуки с ПОЛНЫМИ путями (машина + путь). Обновлять при каждом вердикте.
## 4. Эволюция видима
Кумулятивные записи (append), НЕ перезапись. Ряд кругов (K2→K3→…) с причиной каждого круга. PATCH затирает evidence — только дописывать.
## 5. Раздел «ДЛЯ ТИКЕТА» в каждом отчёте волны
Каждый бриф обязывает волну закончить отчёт разделом «ДЛЯ ТИКЕТА»: 3-6 строк эволюции + пути документов. Координатор переносит целиком.
## 6. Траблшуты — в леджер дня (WEB-320)
Каждая ловушка с рецептом лечения. Ссылку из тикета-линии на леджер, если траблшут родился в её работе.
## 7. Тикет ступени/линии искать по ЭПИКУ, не по словам
Перед новым тикетом — проверь, нет ли уже (дубли были). Эпик-тикет заводится ДО волн.
Примеры образцовых карт: WEB-410 (лестница миграции), WEB-093 (энтерпрайз). Леджер траблшутов: WEB-320.
## ЯКОРЬ ПРОДА (обновлено 12.09.2026)
**Якорь прода:** живая линия **l115g**, коммит **9c8a97629b3f7fd8c79faff162eed482670f499d** (12.09). Прежние якоря l103 `d91ebefe` и l104 `4d858be7` (04.09) устарели.
**Доска:** живая доска — `web-board.sqlite` + HTTP API `http://127.0.0.1:8787/api/web/*` на M1 (`ssh poolpooly@192.168.1.74`). НЕ `board.sqlite` (это iOS/легаси, таблицы `issues`/`ios_issues`, 2225 строк, ключи другие).
### ПОПОЛНЕНИЕ КАНОНА 04.09 — пять процессных дефектов, каждый стоил круга или больше
**8. Запрет типизации в брифе приёмки ограничивать файлами, которые трогает коммит.**
Репозиторный (общий) запрет на ошибки типизации **отклонил шесть хороших кругов** из-за ОДНОГО нетронутого легаси-файла. Правило: гейт типов применяется к изменённым файлам коммита, не ко всему дереву.
**9. Пара «красный на родителе / зелёный после фикса» — необходима, но НЕ достаточна.**
Фикс ролей прошёл ровно такую пару, сел в линию и **не изменил на проде ничего** ([[WEB-505]]: C2 как был 4/14, так и остался; расписка отдавала `outOfWindowAdmitted: 0`, а документ `Fixture Note T-364 (outside both windows).txt` продолжал утекать). Для фич с живым поведением приёмка обязана включать прогон на проде.
**10. Волны НЕ МОГУТ писать в `/home/ubuntu/nc` и обязаны сдавать бандлы.**
Одна приёмка была отклонена **исключительно** за то, что бриф требовал от волны невыполнимого — записи в базовый репозиторий. Бриф обязан давать волне рабочее дерево и требовать бандл, а не путь в базу.
**11. У волн нет root — хостовые установки делает координатор.**
Всё, что требует `/usr/local/libexec`, systemd drop-in, установки пакетов на хост, — не задача волны (примеры сегодня: [[WEB-470]] скрипты hetzbk, [[WEB-093]] env-файл и drop-in для четырёх служб).
**12. Порог свободного места у диспетчера волн стережёт ПАМЯТЬ, а не диск; гейта по диску нет.**
Из-за этого боксы тихо умирали при заполненном диске. Подробности и следующее действие — [[WEB-478]].
### ГДЕ ЖИВЁТ ДОСКА (чтобы канон не искали не там)
Живая доска: `web-board.sqlite` + HTTP `http://127.0.0.1:8787/api/web/*` на M1 (`ssh poolpooly@192.168.1.74`), id вида `WEB-NNN`.
НЕ живая: `board.sqlite` в том же каталоге — это iOS/легаси (таблицы `issues`, `ios_issues`, 2225 строк). Поиск `WEB-086` там ничего не находит — это признак, что смотрят не в ту базу.
`node` на M1 только абсолютным путём (`~/.nvm/versions/node/v22.21.1/bin/node`); русский текст через `curl -d` рвёт кавычки — писать `.mjs` с `fetch`.
PATCH полей `body`/`evidence` **затирает** значение: сначала GET, дописать в конец, потом PATCH.
### ПОПОЛНЕНИЕ КАНОНА 04.09, вторая порция — ещё два процессных дефекта
**13. Бриф считается разосланным ТОЛЬКО когда лежит в КОРНЕ очереди.**
Семь брифов положили в каталог «в полёте» (in-flight) диспетчера вместо корня очереди — диспетчер их не подхватил, **три машины простояли без работы**. Правило: после записи брифа проверять ФАКТ ПОДХВАТА (появление в `running`), а не факт записи файла. Смыкается с уже известной ловушкой «бриф из ssh-heredoc тихо не записался».
**14. Посадка обязана двигать ВСЕ службы — расхождение версий внутри одного прода бывает молчаливым.**
Сегодня служба **экстракции продолжала работать на l100**, когда web и indexing были уже на **l103**. Никакой ошибки при этом не наблюдалось. Исправлено. Проверка версии по КАЖДОЙ службе — обязательный пункт приёмки посадки, а не только по web.
### ПРАВИЛО КАНОНА (05.09): блок KNOWN ISSUES
Каждый тикет, где были находки, обязан нести блок «KNOWN ISSUES / ТРАБЛШУТИНГ»: симптом → как проверить за 2 минуты (команда/эндпоинт/поле evidence) → причина (файл:строка) → лечение/статус → ссылки (отчёт, ранбук, память). Обновлять дельтами при каждом новом круге. Примеры: WEB-99 (specs/ROLES-KNOWN-ISSUES.md), WEB-492/495 (specs/INFRA-A1-TWO-BACKENDS-LB.md).
### ЗАМЕТКА ПО ИНСТРУМЕНТУ ЗАПИСИ НА ДОСКУ
`node` в неинтерактивной ssh-сессии на M1 не в `PATH` (нужен абсолютный путь). Рабочая альтернатива без установки чего-либо: **`python3` + `urllib.request`** — читать GET, дописывать в конец, отправлять PATCH; кавычки русского текста не рвутся, потому что тело формируется `json.dumps`, а не строкой в `curl -d`.
## История (ленты дня 04.09, для справки; время UTC / IST = UTC+5:30)
- l101 `d825eb0d` — флип 08:47Z. Девять ранее принятых изменений + фикс realtime-сокета.
- l102 `1b081c5a` — флип 11:18Z. Этап C движка, фикс окна цитат, мобильные боковые панели.
- l103 `d91ebefe` — флип 13:51Z. Перебазированная работа по ролям, фикс диалога приглашения, контур бэкапа.
- l104 `4d858be7` — флип 18:03Z. Проводка движка, регрессия телеграм-бота, фикс ретенции бэкапа.
- 12.09: текущий якорь l115g `9c8a9762`.
---
## история (тело до 13.09.2026)
# ПРАВИЛА ОБОГАЩЕНИЯ ТИКЕТОВ (канон для ЛЮБОГО агента: Фабл, кодекс-волны, нулевой агент)
Этот тикет — автономный свод правил. Каждый эпик и рабочий тикет ссылается сюда строкой: «Правила обогащения: WEB-449». Работая над ЛЮБЫМ тикетом, соблюдай:
## 1. Каждый вердикт = запись в тикет ТУТ ЖЕ
Формат: дата/время IST, кто (волна/приёмка/координатор), ЧТО решено, коммит/ветка, путь отчёта. Не «сделано», а сдача с доказательствами.
## 2. Глубина решения, не только вердикт
При GO архитектурной работы — выжимка МЕХАНИКИ в тикет: как устроено, какие сущности/файлы, где гейт, что было корнем. Проверка: «нулевой агент поймёт устройство, не открывая код?»
## 3. Карта документов линии
В каждом тикете-линии — блок «КАРТА ДОКУМЕНТОВ»: все отчёты, брифы, ранбуки с ПОЛНЫМИ путями (машина + путь). Обновлять при каждом вердикте.
## 4. Эволюция видима
Кумулятивные записи (append), НЕ перезапись. Ряд кругов (K2→K3→…) с причиной каждого круга. PATCH затирает evidence — только дописывать.
## 5. Раздел «ДЛЯ ТИКЕТА» в каждом отчёте волны
Каждый бриф обязывает волну закончить отчёт разделом «ДЛЯ ТИКЕТА»: 3-6 строк эволюции + пути документов. Координатор переносит целиком.
## 6. Траблшуты — в леджер дня (WEB-320)
Каждая ловушка с рецептом лечения. Ссылку из тикета-линии на леджер, если траблшут родился в её работе.
## 7. Тикет ступени/линии искать по ЭПИКУ, не по словам
Перед новым тикетом — проверь, нет ли уже (дубли были). Эпик-тикет заводится ДО волн.
Примеры образцовых карт: WEB-410 (лестница миграции), WEB-093 (энтерпрайз). Леджер траблшутов: WEB-320.
## ЯКОРЬ ПРОДА (обновлено 12.09.2026)
**Якорь прода:** живая линия **l115g**, коммит **9c8a97629b3f7fd8c79faff162eed482670f499d** (12.09). Прежние якоря l103 `d91ebefe` и l104 `4d858be7` (04.09) устарели.
**Доска:** живая доска — `web-board.sqlite` + HTTP API `http://127.0.0.1:8787/api/web/*` на M1 (`ssh poolpooly@192.168.1.74`). НЕ `board.sqlite` (это iOS/легаси, таблицы `issues`/`ios_issues`, 2225 строк, ключи другие).
### ПОПОЛНЕНИЕ КАНОНА 04.09 — пять процессных дефектов, каждый стоил круга или больше
**8. Запрет типизации в брифе приёмки ограничивать файлами, которые трогает коммит.**
Репозиторный (общий) запрет на ошибки типизации **отклонил шесть хороших кругов** из-за ОДНОГО нетронутого легаси-файла. Правило: гейт типов применяется к изменённым файлам коммита, не ко всему дереву.
**9. Пара «красный на родителе / зелёный после фикса» — необходима, но НЕ достаточна.**
Фикс ролей прошёл ровно такую пару, сел в линию и **не изменил на проде ничего** ([[WEB-505]]: C2 как был 4/14, так и остался; расписка отдавала `outOfWindowAdmitted: 0`, а документ `Fixture Note T-364 (outside both windows).txt` продолжал утекать). Для фич с живым поведением приёмка обязана включать прогон на проде.
**10. Волны НЕ МОГУТ писать в `/home/ubuntu/nc` и обязаны сдавать бандлы.**
Одна приёмка была отклонена **исключительно** за то, что бриф требовал от волны невыполнимого — записи в базовый репозиторий. Бриф обязан давать волне рабочее дерево и требовать бандл, а не путь в базу.
**11. У волн нет root — хостовые установки делает координатор.**
Всё, что требует `/usr/local/libexec`, systemd drop-in, установки пакетов на хост, — не задача волны (примеры сегодня: [[WEB-470]] скрипты hetzbk, [[WEB-093]] env-файл и drop-in для четырёх служб).
**12. Порог свободного места у диспетчера волн стережёт ПАМЯТЬ, а не диск; гейта по диску нет.**
Из-за этого боксы тихо умирали при заполненном диске. Подробности и следующее действие — [[WEB-478]].
### ГДЕ ЖИВЁТ ДОСКА (чтобы канон не искали не там)
Живая доска: `web-board.sqlite` + HTTP `http://127.0.0.1:8787/api/web/*` на M1 (`ssh poolpooly@192.168.1.74`), id вида `WEB-NNN`.
НЕ живая: `board.sqlite` в том же каталоге — это iOS/легаси (таблицы `issues`, `ios_issues`, 2225 строк). Поиск `WEB-086` там ничего не находит — это признак, что смотрят не в ту базу.
`node` на M1 только абсолютным путём (`~/.nvm/versions/node/v22.21.1/bin/node`); русский текст через `curl -d` рвёт кавычки — писать `.mjs` с `fetch`.
PATCH полей `body`/`evidence` **затирает** значение: сначала GET, дописать в конец, потом PATCH.
### ПОПОЛНЕНИЕ КАНОНА 04.09, вторая порция — ещё два процессных дефекта
**13. Бриф считается разосланным ТОЛЬКО когда лежит в КОРНЕ очереди.**
Семь брифов положили в каталог «в полёте» (in-flight) диспетчера вместо корня очереди — диспетчер их не подхватил, **три машины простояли без работы**. Правило: после записи брифа проверять ФАКТ ПОДХВАТА (появление в `running`), а не факт записи файла. Смыкается с уже известной ловушкой «бриф из ssh-heredoc тихо не записался».
**14. Посадка обязана двигать ВСЕ службы — расхождение версий внутри одного прода бывает молчаливым.**
Сегодня служба **экстракции продолжала работать на l100**, когда web и indexing были уже на **l103**. Никакой ошибки при этом не наблюдалось. Исправлено. Проверка версии по КАЖДОЙ службе — обязательный пункт приёмки посадки, а не только по web.
### ПРАВИЛО КАНОНА (05.09): блок KNOWN ISSUES
Каждый тикет, где были находки, обязан нести блок «KNOWN ISSUES / ТРАБЛШУТИНГ»: симптом → как проверить за 2 минуты (команда/эндпоинт/поле evidence) → причина (файл:строка) → лечение/статус → ссылки (отчёт, ранбук, память). Обновлять дельтами при каждом новом круге. Примеры: WEB-99 (specs/ROLES-KNOWN-ISSUES.md), WEB-492/495 (specs/INFRA-A1-TWO-BACKENDS-LB.md).
### ЗАМЕТКА ПО ИНСТРУМЕНТУ ЗАПИСИ НА ДОСКУ
`node` в неинтерактивной ssh-сессии на M1 не в `PATH` (нужен абсолютный путь). Рабочая альтернатива без установки чего-либо: **`python3` + `urllib.request`** — читать GET, дописывать в конец, отправлять PATCH; кавычки русского текста не рвутся, потому что тело формируется `json.dumps`, а не строкой в `curl -d`.
## История (ленты дня 04.09, для справки; время UTC / IST = UTC+5:30)
- l101 `d825eb0d` — флип 08:47Z. Девять ранее принятых изменений + фикс realtime-сокета.
- l102 `1b081c5a` — флип 11:18Z. Этап C движка, фикс окна цитат, мобильные боковые панели.
- l103 `d91ebefe` — флип 13:51Z. Перебазированная работа по ролям, фикс диалога приглашения, контур бэкапа.
- l104 `4d858be7` — флип 18:03Z. Проводка движка, регрессия телеграм-бота, фикс ретенции бэкапа.
- 12.09: текущий якорь l115g `9c8a9762`.
Лента
2026-09-04T15:08:17.255Z · coordinator04.09 координатор: в body добавлен блок «ЭВОЛЮЦИЯ 04.09.2026» — состояние, причина с доказательством, что село, что осталось, ловушки.
2026-09-04T22:50:54.785Z · координаторДвижок document-session: пост-QA l104 (1820, 1840) и круг 1855 — NO-GO по единственному пункту: живая расписка адаптера с процесса не снята, потому что у QA-учётки не было пароля на боксе и лимит-3 сессий вытеснял старый storage-state. Координатор 22:50Z сбросил пароль qa.c09.browser (bcryptjs через файл, compareSync из базы true) → /home/ubuntu/waves/qa/qa-c09-password.txt (0640 ubuntu:wave). Токен evidence/c09prod/qa-storage-state.json был 0644 — закрыт 0600. Пост-QA l105 (1869-l105postqa, A1) обязан снять расписку document-session-product-receipt на документе cmtkm80jo01u8z8vgj446km1x под свежей сессией. Документы: FRESHQASESSION-REPORT.md, L104QAR2-REPORT.md.
2026-09-04T23:31:46.890Z · координаторПост-QA l105 (1869-l105postqa, A1, 22:48–23:16Z 04.09) — VERDICT=GO. ЖИВАЯ РАСПИСКА ДВИЖКА СНЯТА С РАБОТАЮЩЕГО ПРОЦЕССА: под свежей QA-сессией (qa.c09.browser, пароль сброшен координатором) на самом большом документе QA cmtkm80jo01u8z8vgj446km1x зафиксировано событие document-session-product-adapter/v1 adapter-mounted, documentUtf16Units=7798210, data-document-session-route=document-session (не c02-fallback). Это закрывает единственный открытый пункт пост-QA l104 (1820/1840/1855). Прод-пин 1185ca257 в начале и в конце круга. Отчёт: /home/ubuntu/waves/L105POSTQA-REPORT.md. Правила: WEB-449.
2026-09-05T01:41:11.739Z · координаторПРАВИЛО КАНОНА (владелец 05.09): каждый тикет, где были находки, обязан нести блок «KNOWN ISSUES / ТРАБЛШУТИНГ»: симптом → как проверить за 2 минуты (команда/эндпоинт/поле evidence) → причина (файл:строка) → лечение/статус → ссылки (отчёт, ранбук, память). Обновлять дельтами при каждом новом круге. Примеры: WEB-99 (specs/ROLES-KNOWN-ISSUES.md), WEB-492/495 (specs/INFRA-A1-TWO-BACKENDS-LB.md).
2026-09-06T13:05:53.662Z · coordinator[06.09 13:05Z координатор] [2026-09-06T13:05Z координатор] QA-учётка для пост-QA заведена штатно (invite через админ-маршрут, регистрация 200, credentials-login 302, сессия есть): qa.c09.browser2@sixbyy.com, креды /home/wave/qa/qa-c09-browser2.json (0600 wave). НАХОДКА: регистрация вернула emailVerification.required=true, sent=false — почтовый транспорт на проде выключен (startup: email.transport.configuration mode=off, provider=none) → новые пользователи не получают письмо подтверждения. Это касается всех регистраций по invite, не только QA. Вопрос владельцу/эпику витрины (WEB-516/566): включать транспорт (SMTP/провайдер) или снимать требование верификации для беты.
2026-09-12T22:17:55.157Z · coordinator[12.09 22:17Z координатор] МОЙКА 12.09 (3569-wash-g4-compliance-process): постоянная карточка КАНОН. Критериев закрытия нет. Устарел прод-якорь (l103/l104 → l115g). Остаётся: KEEP.
Остаток: Постоянный канон — никогда не DONE; Устаревший текст: прод-якорь l103/l104 неактуален (текущая линия l115g)
Отчёт: /Users/milamarty/waves/3569WASH*-REPORT.md (M4), копия nc-ops-scripts/shift-20260912-resume/wash-20260912/collected/. Проверка по исходнику прода l115g (9c8a9762).
2026-09-12T22:55:34.991Z · coordinator[12.09 22:55Z координатор] ОСВЕЖЕНИЕ ТЕКСТА 12.09 (волна 3577, DeepSeek на M4): тело карточки переписано (правила 1–14 сохранены дословно; якорь прода l103 d91ebefe / l104 4d858be7 → l115g 9c8a9762; примеры образцовых карт (WEB-410/093/320) сохранены). Старый текст сохранён координатором (/tmp/body-backup-WEB-449.md на M1, копия в nc-ops-scripts/shift-20260912-resume/3577/collected/). Отчёт /Users/milamarty/waves/3577BODYREFRESH-REPORT.md.
2026-09-13T10:37:40.017Z · coordinator[13.09 10:37Z координатор] Мойка доски, волна 3654. KEEP. Постоянный канон обогащения тикетов (правила 1-14 + якорь прода), тело актуально (волна 3577, 12.09). Не закрывается. Якорь в теле l115g — на 13.09 прод уже l115j, обновить в следующем цикле. Статус не меняю.
2026-09-13T12:02:07.010Z · coordinator[13.09 12:02Z координатор] Волна 3683. KEEP. Постоянный канон обогащения тикетов — живой, критерия закрытия нет. Добавлено правило 15 (доказательство только ссылкой на факт), правило 1 IST→UTC, якорь l115j. Статус не меняю.
2026-09-13T21:51:06.838Z · coordinator[13.09 21:51Z координатор] КАНОН НАПИСАН (волна 3748, VERDICT=GO). Документ `docs/operations/CANON-TICKET-ENRICHMENT.md`, ветка `agent/3748-canon-ticket-enrichment-20260913`.
Главное отличие от предыдущих попыток: **каждое правило опирается на НАСТОЯЩИЙ случай, случившийся 13.09**, а не на общие соображения. Правило без случая за спиной волне было запрещено — такие вынесены отдельно как «предлагается, случая пока нет».
Правила и случаи:
1. **Разделы тела тикета:** Факт → Источник факта → Что НЕ проверено → Ссылки → Эволюция → детский язык. Обосновано сразу всеми случаями дня: без раздела «источник факта» ни одну из пяти ошибок нельзя было бы поймать.
2. **Каждое утверждение о поведении — файл:строка, команда с выводом или коммит; писать непроверенный своими руками механизм запрещено.** Случай: WEB-658 был заведён с формулировкой «192 вызова эмбеддингов внутри одной 5-секундной транзакции» — проверка показала, что запись идёт короткими транзакциями, а настоящий дефект другой. Тикет пришлось переписывать.
3. **Устаревшее тело НЕ переписывается — поверх кладётся поправка с датой и прямым указанием, что именно устарело.** Случай: WEB-306 описывал SSH, открытый всему миру; живая сверка показала, что это давно закрыто, а настоящий остаток другой.
4. **Вердикт инструмента закрывает тикет только если покрыт весь заявленный путь И «красное до фикса» получено наблюдением старого поведения, а не ошибкой сборки.** Случай: WEB-576/571/583/325 — закрыл четыре, приёмка вернула три.
4a. **Прежде чем писать «не доказано» — проверить, не устарела ли форма ответа, которую ждёт пробник.** Случай: WEB-467, пробник ждал `entries`, настоящая форма `mode/days/summary/nextCursor`; моя ложная тревога.
5. **При противоречии находки и записанного факта — фиксировать обе стороны и разрешать по первичному доказательству**, а не по тому, кто громче или у кого больше доступа. Случай: «подаккаунт не заведён» от волны без доступа к доказательствам против моего факта «заведён и проверен»; верной оказалась составная формулировка «заведено — да, выдано — нет».
6. **Раздел детским языком:** 2–4 предложения — что сломано, что проверено, что дальше; ничего сверх раздела «Факт».
В конце документа — чек-лист на минуту, по которому готовый тикет можно проверить перед закрытием.
2026-09-14T12:42:10.722Z · coordinator[14.09 12:42Z координатор] VERDICT=GO
# 3857-web449-enrichment-canon — WEB-449 (КАНОН): правила обогащения тикетов сведены в один документ
Дата: 2026-09-14 UTC. Волна docs-only, дерево не меняет кода.
Base: `806c45d22f6e2616ae8135caabfb0c99180729b4` (`refs/waves/l115m`).
Head: `33b76d6926138862d7f13cb121228b8d5953a440` (`wave/3857-web449-enrichment-canon`).
## Что сделано
Свёл все действующие правила обогащения тикетов в один канон и добавил правила, выработанные практикой сегодня. Канон — один документ: `docs/operations/CANON-TICKET-ENRICHMENT.md` (148 строк, sha256 `77046f8b2b4d3ba258dfa97f4e55fe75e25236d1c7ba4be75208d8d7411e9f82`, проверено `git show HEAD:… | shasum -a 256` — совпадает с рабочей копией).
Доказательство сбора источников (что каждая ссылка файл:строка бьётся) — `3857WEB449EN-evidence/sources-verified.txt`.
## Канон: ключевые правила и их источники
Полный текст — в самом каноне. Здесь — сводка с первоисточниками.
**Действующие правила (собраны из документов проекта):**
- Факт ≠ пересказ: каждое утверждение обязано указывать `файл:строка` / команду+вывод / коммит. Источник: черновик канона `agent/3748-canon-ticket-enrichment-20260913` (`261c4c6e`) §2; согласовано с `AGENTS.md:49-76` («готово» только с доказательствами).
- Обязательные разделы тела тикета (Факт → Источник факта → Граница заявления → Ссылки → Эволюция с тупиками → ДЛЯ ТИКЕТА → Troubleshooter). Источник: `docs/PASSPORT/ZERO-AGENT-ONBOARDING-PROMPT.md:30`.
- Свежесть: устаревшее тело дополнять в «Эволюции», а не переписывать. Источник: черновик `agent/3748…` §3.
- Закрытие по вердикту инструмента — только если проверен весь путь и «красное до фикса» — наблюдение старого поведения, а не ошибка сборки (+4a: не путать дефект пробника с дефектом маршрута). Источник: черновик `agent/3748…` §4, §4a.
- Противоречие: фиксировать обе стороны и разрешать по первичному доказательству. Источник: черновик `agent/3748…` §5; `docs/PASSPORT/ZERO-AGENT-ONBOARDING-PROMPT.md:16`.
- «ДЛЯ ТИКЕТА детским языком»: 2-4 предложения без терминов, ничего сверх «Факта». Источник: черновик `agent/3748…` §6.
**Правила, выработанные практикой сегодня (в дереве их раньше не было, закрепляет канон):**
- Различать «заявлено» и «доказано»; формулировка из тела тикета — заявка, пока не воспроизвёл сам. Опора: `docs/PASSPORT/ZERO-AGENT-ONBOARDING-PROMPT.md:57`, `review-w313/COUNTEREXAMPLES.md:74-79`.
- Писать границу заявления: что доказано, что нет, и что именно нужно, если доказать нельзя. Опора: `review-w313/COUNTEREXAMPLES.md:74-79`, `docs/operations/busfactor/rehearsal-v4/REHEARSAL-STEPS-v4.md:718`.
- Эволюция с тупиками: записывать пройденные тупики — пройденный тупик экономит следующему больше, чем верный ответ.
- Ни одного числа без источника; нет числа — «не измерено».
- Troubleshooter в каждой карточке: команда + ожидаемый «ок»-вывод. Опора: `docs/PASSPORT/ZERO-AGENT-ONBOARDING-PROMPT.md:30` (требует `ТРАБЛШУТИНГ`).
## Образец карточки (выдуманный, чтобы была видна форма)
Приведён целиком в каноне (раздел «Образец карточки»): WEB-999 «кнопка Сохранить не записывает заметку» — с полями Факт / Источник факта / Граница заявления / Эволюция с тупиками / ДЛЯ ТИКЕТА / Troubleshooter.
## Чек-лист проверки карточки (нулевой агент разберётся, если все галочки стоят)
Приведён целиком в каноне (раздел «Чек-лист проверки карточки»). Сводно: Факт с пруфом; Источник факта (кто/что/когда); граница «заявлено/доказано» + что НЕ проверено; у каждого числа — источник; правки в «Эволюции» с датой и тупиками; закрытие по инструменту — с покрытием всего пути и честным «красным до фикса»; противоречия — обе стороны + первичное доказательство; «ДЛЯ ТИКЕТА» ≤ 4 предложений без терминов; Troubleshooter с командой; ссылки на карточку и связанные тикеты.
## Противоречия канона с нынешней практикой
Полный список с файл:строка — в каноне (раздел «Противоречия»). Главные:
1. Первая строка вердикта: контракт `…:31` требует `VERDICT: GO|NO-GO|INPUT_GAP` первой строкой; в корневых отчётах на деле `# Заголовок` без вердикта, `RESULT: PARTIAL/PASS`, `OUTCOME: …`, `VERDICT=` с `=`. Измерено `grep`/`head -1` по корневым `*-REPORT.md` (см. evidence).
2. «ДЛЯ НУЛЕВОГО АГЕНТА» (контракт `…:30`) против «ДЛЯ ТИКЕТА»/«Для тикета» (все 22 корневых отчёта) и машинных полей (`_DONE`, branch, `git show --name-only`) вместо детского языка.
3. «Эволюция» и «ТРАБЛШУТИНГ» требуются контрактом `…:30`, но в 22 корневых отчётах нет ни «тупик», ни «эволюция», а troubleshooter — в 2 из 22.
4. Черновик канона `agent/3748…` ссылается на `3340WASHEXTERNAL-REPORT.md:136-165`, `3696-keeper-email-pack-out/CHECKLIST.md:17`, `IF-SOMETHING-BREAKS.md:31` — ни одного из этих файлов нет в дереве l115m.
5. «Заявлено/доказано» и «ни одного числа без источника» до этого канона нигде в дереве не записаны.
## ДЛЯ ТИКЕТА детским языком (полный след для нулевого агента)
**Симптом словами пользователя.** «Правила, как заполнять карточки тикетов, складывались по ходу дела и разбросаны по разным документам. Человек, который открывает карточку впервые, не понимает её. Канон этих правил висит в review незаконченным — сведи всё в один документ.»
**Как нашли.** Прочитал бриф волны. Нашёл старый черновик канона — ветка `agent/3748-canon-ticket-enrichment-20260913`, коммит `261c4c6e` («add ticket enrichment canon (WEB-449)»). Проверил, есть ли он в базе l115m: файла `docs/operations/CANON-TICKET-ENRICHMENT.md` в дереве l115m нет (`git ls-tree` — пусто). Дальше обыскал дерево на предмет правил: контракт тикета нашёлся в `docs/PASSPORT/ZERO-AGENT-ONBOARDING-PROMPT.md:30-34`, требования к отчёту — в `AGENTS.md:35-39`, «граница доказательства» — в `review-w313/COUNTEREXAMPLES.md:74-79`, «честная граница» — в `docs/operations/busfactor/rehearsal-v4/REHEARSAL-STEPS-v4.md:718`, практика «ДЛЯ ТИКЕТА» — в 22 корневых отчётах.
**Эволюция с тупиками.**
1. Тупик: искал старый канон прямо в l115m — его там нет (не влит). Вывод: надо писать заново на базе l115m, а старый брать как черновик.
2. Тупик: пытался проверить ссылки старого канона (`3340WASHEXTERNAL-REPORT.md`, `3696-keeper-email-pack-out/CHECKLIST.md`, `IF-SOMETHING-BREAKS.md`) — файлов в дереве нет, ссылки неверифицируемы. Вывод: случаи (WEB-658, WEB-306, WEB-576/571/583/325, WEB-467) перенёс как пересказ черновика, пометив, что первоисточники вне дерева.
3. Тупик: искал в дереве готовые формулировки «заявлено/доказано», «ни одного числа», «тупик», «эволюция» — их нет. Вывод: это новое, его закрепляет канон, а не «находится в документе».
4. Мелкий тупик: `git bundle verify` снаружи репозитория падает («need a repository to verify a bundle») — verify/list-heads надо запускать из worktree.
**Что сделали (со ссылками).** Написал канон `docs/operations/CANON-TICKET-ENRICHMENT.md` (в дереве, коммит `33b76d692`), включив: собранные правила с файл:строка-источниками; 5 новых правил; образец карточки; чек-лист; 5 противоречий. Собрал bundle `3857WEB449EN.bundle` над базой l115m, посчитал `3857WEB449EN.bundle.sha256`, собрал evidence в `3857WEB449EN-evidence/`.
**Чем доказано и где граница.** Доказано: канон записан и закоммичен (head `33b76d692`, base `806c45d22`); bundle создан и `verify` говорит «is okay»; каждая цитата `файл:строка` в каноне воспроизведена `sed`/`grep` и лежит в `sources-verified.txt`; 22 отчёта с «ДЛЯ ТИКЕТА» и 2 с troubleshooter — измерено `grep -l … | wc -l`. Граница: канон не прошёл приёмку отдельным verifier-ом (контракт `…:34` требует ДРУГОГО verifier-а — для docs-волны это остаётся открытым); 5 новых правил закреплены, но ещё не показаны на живой карточке; случаи старого черновика (WEB-658, WEB-306, WEB-576/571/583/325, WEB-467) приняты как пересказ, не воспроизведены.
**Что открыто.** (1) Применить канон к реальной карточке и показать, что нулевой агент по ней разбирается. (2) Решить, вливать ли старый черновик `agent/3748…` и/или восстанавливать его первоисточники в дерево. (3) Решить, коммитить ли файлы брифов волн (сейчас источник правил «практики сегодня» живёт вне дерева).
**Troubleshooter.** Проверить целостность сдачи: `git -C ~/waves/wt-3857-web449-enrichment-canon rev-parse HEAD` → ждём `33b76d692…`; `git bundle verify ~/waves/3857WEB449EN.bundle` (из любого git-репозитория, напр. из worktree) → ждём «is okay»; `shasum -a 256 -c ~/waves/3857WEB449EN.bundle.sha256` → ждём OK; проверить цитаты канона — `shasum -a 256 -c ~/waves/3857WEB449EN-evidence/SHA256SUMS` → ждём OK. Если «need a repository» — запусти verify из worktree, а не из `~/waves`.
## KNOWN ISSUES
1. Старый черновик канона (`agent/3748-canon-ticket-enrichment-20260913`, `261c4c6e`) в l115m не влит; его случаи перенесены как пересказ, первоисточники вне дерева (см. противоречие 4).
2. 5 новых правил не имеют источника в дереве кроме самого канона — они закреплены, но не продемонстрированы на живой карточке.
3. Приёмка отдельным verifier-ом не проводилась (docs-волна, контракт `…:34`).
4. Косметика: git пишет `unable to access …/.config/git/ignore|attributes` (Permission denied) — на результат не влияет, все команды отработали с `RC=0`.
5. `git bundle verify` требует контекст репозитория; вне репозитория падает с «need a repository to verify a bundle».
## Сдача
- base `806c45d22f6e2616ae8135caabfb0c99180729b4` (`refs/waves/l115m`), head `33b76d6926138862d7f13cb121228b8d5953a440` (`wave/3857-web449-enrichment-canon`).
- Changed paths: `docs/operations/CANON-TICKET-ENRICHMENT.md` (единственный файл; `git show --name-only --oneline HEAD`).
- Проверки: `git show --name-only --oneline HEAD` → 1 файл; `git bundle list-heads` → head `33b76d692…`; `git bundle verify` → «is okay»; `shasum -a 256` совпал для bundle, канона (рабочая копия = версия в HEAD).
- Bundle: `3857WEB449EN.bundle` sha256 `b3e3071c1c803569154e289d3bdfda1a5c4352ca64e3c9d11356dc535011219c`.
- Evidence: `3857WEB449EN-evidence/` с `SHA256SUMS`.
2026-09-15T22:05:58.111Z · coordinatorENRICH-4132-WEB-449
```markdown
## ДЕЛЬТА ОБОГАЩЕНИЯ — 2026-09-15T21:54Z, M1/4132 (DeepSeek Flash 4.1, read-only аудит), VERDICT=DRAFT_DELTA
### 1. Вердикт
Якорь прода в теле — l115j `133fe00c` (13.09 08:50Z) — устарел на пять линий.
Живая линия: **l115o `68e25d8df5ae8263c5ac5466353631f57a17cfcc`**.
Карточка нарушает СВОЙ СОБСТВЕННЫЙ критерий актуальности («якорь прода совпадает с
текущей линией», строка 24 тела). Правила 1–15 не менялись и остаются в силе.
### 2. КАРТА ДОКАЗАТЕЛЬСТВ
- Доска, посадка l115o: WEB-626 id 5238 (2026-09-15T01:24:58.136Z); WEB-635 id 5257 (01:25:20.711Z).
- Доска, откат l115p: WEB-635 id 5425 (2026-09-15T21:18:29.795Z); WEB-626 id 5426 (21:18:43.811Z).
- HANDOFF-LIVE.md §1 «Прод» строки 445–450: релиз `arm64-l115o-20260915T003341Z`,
артефакт `me2-standalone-linux-arm64-68e25d8df-20260915T003341Z`,
sha256 `cd2773f65d66b09ec03d39b553041d2814ce09413e72d72b07bc9de89df536c8`,
поднят 00:56:03Z, миграций 209 / ожидает 0. Откат-цель — l115n `d85bb2dad15a3ba52c773b0a2362748009a2c3b9`.
- HANDOFF-LIVE.md тики 21:25Z (строка 32) и 21:28Z (строка 25): после отката
`/api/ready` = `ready=true`, `checks.release.sourceCommit=68e25d8df5ae8263c5ac5466353631f57a17cfcc`.
- Канон в дереве: `docs/operations/CANON-TICKET-ENRICHMENT.md`, волна 3857, head
`33b76d6926138862d7f13cb121228b8d5953a440`, base `806c45d22f6e2616ae8135caabfb0c99180729b4`,
sha256 `77046f8b2b4d3ba258dfa97f4e55fe75e25236d1c7ba4be75208d8d7411e9f82`
(доска: WEB-449 id 5001, 2026-09-14T12:42:10.722Z).
### 3. ЭВОЛЮЦИЯ / ПОПРАВКИ (append-only)
- l115j `133fe00c` (13.09 08:50Z) — прежний якорь, до этой дельты.
- Между ним и текущей линией: l115k, l115l, l115m (base волны 3857 = `806c45d2…`), l115n
(`d85bb2dad…`, откат-цель), **l115o** `68e25d8df…` (посадка 15.09 00:56Z, полное закрытие
посадки 01:50Z, платная проба: ключ `3b888a9e-…`, HTTP 200 за 5.9 с, `SETTLED_ACTUAL`,
одно терминальное событие на резервирование).
- **15.09 — попытка l115p откатилась.** Кандидат `ca6c06effbceb281151f39a71e4ca149251c21de`
(parent `5a9fb758…`, ref `refs/releases/l115p-candidate-final`) прошёл build, dry-run, flip
и machine verify, затем дал post-landing NO-GO на живой браузерной пробе и был откачен
штатно. Это НОВЫЙ СЛУЧАЙ к уже существующему правилу 9 («красный/зелёный — необходимо,
но не достаточно»): machine verify зелёный ≠ живая проба зелёная. Правило 15 тоже
отработало буквально — «machine verify прошёл» не является доказательством работоспособности.
- Две additive-миграции l115p сохранены при откате (ledger 209→211, old-client/new-schema
receipt `dangerous=0`).
- ПРЕДЛОЖЕНИЕ (случая ровно в такой форме пока нет, помечаю как предложение, не правило):
«статус посадки закрывается ТОЛЬКО парой: машинный verify + живая браузерная проба;
одного машинного verify недостаточно для строки „посажено“». Фактическая практика уже
такая (стоячее правило после каждой посадки), но в списке правил канона её нет.
### 4. KNOWN ISSUES / ТРАБЛШУТИНГ
1. **Якорь прода устаревает молча.**
- Симптом: тело называет линию, которой на проде уже нет; агент без контекста работает
по неверной карте.
- Проверка за 2 минуты: взять коммит из строки «ЯКОРЬ ПРОДА» тела и сверить с живым
`checks.release.sourceCommit` из `/api/ready`; расхождение = якорь устарел.
- Причина: якорь обновляется вручную при мойке, а посадок между мойками больше одной.
- Лечение/статус: обновить якорь этой дельтой; держать проверку в чек-листе мойки.
- Ссылки: WEB-626 id 5238, 5426; HANDOFF-LIVE.md строки 25/32/445–449.
2. **Карта документов не знает канона в дереве.**
- Симптом: тело ссылается на `CANON.md` волны 3683; актуальный документ
`docs/operations/CANON-TICKET-ENRICHMENT.md` (волна 3857) не упомянут.
- Проверка за 2 минуты: `ls docs/operations/CANON-TICKET-ENRICHMENT.md` в дереве линии →
файл есть; в теле — нет.
- Причина: тело обновлено 13.09, канон в дереве появился 14.09.
- Лечение/статус: добавить в карту документов обе точки входа (в дереве и вне дерева).
- Ссылки: WEB-449 id 5001.
3. **Канон требует от других того, чего не имеет сам** (KNOWN ISSUES с двухминутной
проверкой). Проверка: `grep -c 'KNOWN ISSUES' body` по WEB-449 → блок есть у правил, но
собственного блока с проверками у карточки не было до этой дельты. Лечение: этот блок.
### 5. ТЕКУЩИЙ ОСТАТОК (ответственный)
1. Поддерживать канон: правила, якорь, примеры образцовых карт — координатор, постоянно.
2. Обновлять якорь прода при каждой посадке — координатор. **На 15.09 21:54Z якорь =
l115o `68e25d8df5ae8263c5ac5466353631f57a17cfcc`.**
3. Добавить в карту документов `docs/operations/CANON-TICKET-ENRICHMENT.md` (3857) — координатор.
4. Открытые пункты самого канона 3857 (не закрыты и этой волной): (1) применить канон к
живой карточке и показать, что нулевой агент по ней разбирается — **частично закрыто
волной 4132: канон применён к 14 картам, результат в 4132ENRICHCANONINFRA-REPORT.md**;
(2) решить судьбу черновика `agent/3748…`; (3) решить, коммитить ли файлы брифов волн.
### 6. ПЕРВЫЙ ШАГ НУЛЕВОГО АГЕНТА (без агентов)
Сверить якорь: сравнить коммит из строки «ЯКОРЬ ПРОДА» этого тела с
`checks.release.sourceCommit` живого `/api/ready`. Совпало — тело актуально по якорю;
не совпало — дописать дельту обновления якоря и причину расхождения. Больше ничего не
делать: карточка постоянная, критерия закрытия нет.
```
--- 2026-09-22T23:14:32.715Z · coordinator[22.09 23:14Z координатор] ## 22.09 23:2xZ координатор — BF-08 change-impact trail для l115r (волна 4632, M1)
WEB-449 / l115r change-impact trail
Range `cc278e1810e1e03ac277b8e3a5fe06a2aebfba30..1a5822a8e18a177fdd36cd28b1661dcc28ffec0c` was reviewed against BF-08. All 20 changed paths have explicit classifications. The review covers Wave 4525 pool-budget admission, Wave 4526 shared lanes ceiling, Wave 4577 user-first ordinary queue/resume behavior, Wave 4579 release-verifier and hard-exit provenance, Wave 4586 test alignment, and the Wave 4598 final batch/ceiling follow-up.
Evidence-backed retests:
- Unknown operational paths: PASS receipt at `4632BF08RECEIPTSL115R-evidence/receipts/l115r/unknown-operational-path-review.json`; path-by-path decisions are in `classification.md`.
- Release/landing: PASS receipt at `4632BF08RECEIPTSL115R-evidence/receipts/l115r/deploy-systemd-post-landing.json`; source/artifact identity, units, drain, readiness, and verifier evidence are linked there.
- Operator page: `docs/operator/SOURCE-INDEXING-CONCURRENCY.md` is classified docs-only and its content is evidenced by `4526CEILINGTOENV-evidence/operations-page.md`.
The current range has no BF04/passport/WEB-449 book path, so BF-08 correctly reports `canonical-document-update` and `book_document_check` as MISSING. This comment and `book-update.md` are coordinator drafts. After committing the BF04/passport update in the checked range, add the exact current-range canonical-document receipt and rerun the gate; do not treat this draft as a book-change receipt.
- Book: `livepush/docs/PASSPORT/BF04-runbook.md` (коммит в livepush 23.09). Квитанции: `m1:~/waves/4632BF08RECEIPTSL115R-evidence/receipts/l115r/`.
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-449","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-09-13T21:51:07.267Z