WEB-571 · Дефект · Чат · web
P2 [подкасты]: кнопка «Поделиться» у эпизода не открывает нативное меню (у профиля — открывает)
Парковка
P2
ведёт: —
Суть
# WEB-571 — [подкасты] кнопка «Поделиться» у эпизода не открывает нативное меню (у профиля — открывает)
## 1. Суть
Кнопка «Поделиться» у эпизода подкаста должна открывать нативное меню обмена устройства, как кнопка «Share profile», а не молча копировать ссылку.
## 2. Где мы сейчас (13.09.2026)
Статус review, P2, bug. Фикс в коде: нативное меню там, где Web Share доступен; видимый fallback (копирование) с подтверждением там, где недоступен; отказ пользователя от шаринга не считается ошибкой (волна 2962 GO, фикс de3c5eaa4). Шаринг эпизода идёт через общий helper — заголовок/ссылка относятся к эпизоду, не к профилю (волна 3586 GO, тест shareEpisode.episodeVsProfile.test.ts, refs/waves/3586 = b0464a20). Тесты приёмки посажены в l115i (13.09 06:37Z, PROD-FACTS). Финальная живая браузерная приёмка нативного меню (волна 3413) в тикете НЕ закрыта.
## 3. Хронология
- 08.09: поймано владельцем (/radio?tab=feed, карточка эпизода).
- 08.09 19:30: волна 2962 GO, фикс de3c5eaa4.
- 10.09: независимая браузерная проверка 3341-wash-live-ui; волна 3413 (acc-share-visible).
- 12.09: МОЙКА 3568 — KEEP, ждём финальную браузерную проверку.
- 12.09 23:17Z: волна 3586 (DeepSeek, M4) — приёмка шаринга чтением + тест episodeVsProfile.
- 12.09 23:40Z: 3586 GO; тесты прогнаны координатором на A1, все pass; статус review до посадки тестов в l115i.
- 13.09 06:37Z: тесты приёмки WEB-571 посажены в l115i (PROD-FACTS).
## 4. Карта документов и кода
- Обработчик кнопки эпизода приведён к рабочему образцу «Share profile» (общий helper).
- Тест: shareEpisode.episodeVsProfile.test.ts (refs/waves/3586 = b0464a20).
- Фикс: de3c5eaa4.
## 5. Остаток
1. Финальная живая браузерная приёмка: нативное меню у эпизода открывается, fallback видим, заголовок/ссылка — про эпизод (вердикт волны 3413 не закрыт в тикете) — исполнительская волна.
## 6. Критерий закрытия
Живая браузерная проба на проде: нажатие «Share» у эпизода открывает нативное меню (или видимый fallback с подтверждением); заголовок/ссылка — про эпизод, не профиль; поведение профиля не сломано.
---
## История (прежнее тело, сохранено по канону WEB-449)
## СЕЙЧАС
Кнопка «Поделиться» у ЭПИЗОДА подкаста не открывает нативное меню обмена — она просто копирует ссылку. Раньше открывалось меню устройства.
**Ключевая улика — рядом на том же экране есть РАБОЧИЙ образец.** Кнопка «Share profile» на странице профиля подкаста открывает нативное меню правильно: владелец показал скриншотом список «В список для чтения, AirDrop, Почта, Сообщения, Заметки, Freeform, Напоминания, Команды, Telegram» с заголовком «Wool2 Temp — Thought Radio».
Один механизм, два места вызова, одно правильное. Чинить — приведением вызова у эпизода к рабочему образцу профиля, а не переписыванием заново.
## ГДЕ ВИДНО
`/radio?tab=feed`, карточка эпизода, кнопка «Share» рядом с «Play» и сердечком. Поймано владельцем 08.09.2026.
## ЧТО ПРОВЕРИТЬ ПРИ ПОЧИНКЕ
- нативное меню у эпизода открывается так же, как у профиля;
- если браузер нативного обмена не поддерживает, падать в копирование ссылки можно, но пользователь обязан ВИДЕТЬ, что скопировалось, а не получать молчание;
- заголовок и ссылка в меню относятся к ЭПИЗОДУ, а не к профилю;
- поведение у профиля не сломано.
## KNOWN ISSUES / ТРАБЛШУТИНГ
- **Симптом:** нажатие «Share» у эпизода ничего видимого не делает либо тихо копирует ссылку.
- **Проверка:** сравнить обработчик кнопки эпизода с обработчиком «Share profile» — рабочий образец на том же экране.
- **Вероятная причина:** у эпизода не вызывается системный обмен, сразу идёт ветка копирования; либо вызов не проходит требование браузера о пользовательском жесте.
- **Ссылки:** WEB-449 — правила обогащения тикетов.
## ДЛЯ ТИКЕТА
Заведено координатором 08.09.2026 по прямому сообщению владельца со скриншотами. Владелец отдельно просил фиксировать такие мелочи тикетами сразу, чтобы не терялись оптом.
FILL-2104:3380:active
Проверено 2026-09-10T21:10:06.758266+00:00. Волна 3380, A1, состояние active. Живая tmux pane и свежий журнал подтверждены. Exact BASE 1ad52e16b784d3ae80a148fddae4d5a3ab4a89c4. Входы SHA256 и bundle ref проверены перед dispatch. Бриф Intel nc-ops-scripts/fill-slots-20260910-2104/3380-share-feedback-brief.md. Сдача /home/wave/waves/3380SHAREFEEDBACK-REPORT.md. Посадки/окончательной приёмки этой работы нет.
REFILL-20260910-2155-3413
Снимок 2026-09-10T21:54:52.066911+00:00. Волна 3413 / acc-share-visible на A2: active. Оператор Codex, модель gpt-5.6-luna. Живой процесс подтверждён; возраст журнала 2 с. Входы /home/ubuntu/waves/inputs/3413-acc-share-visible; SHA256 и exact BASE 23283639c625226dd88d99b5b150b7f275a1d398 проверены при доставке. Новых посадок и измерений capacity нет; source QA не означает окончательное закрытие Security.
---
## история (тело до 13.09.2026)
## СЕЙЧАС
Кнопка «Поделиться» у ЭПИЗОДА подкаста не открывает нативное меню обмена — она просто копирует ссылку. Раньше открывалось меню устройства.
**Ключевая улика — рядом на том же экране есть РАБОЧИЙ образец.** Кнопка «Share profile» на странице профиля подкаста открывает нативное меню правильно: владелец показал скриншотом список «В список для чтения, AirDrop, Почта, Сообщения, Заметки, Freeform, Напоминания, Команды, Telegram» с заголовком «Wool2 Temp — Thought Radio».
Один механизм, два места вызова, одно правильное. Чинить — приведением вызова у эпизода к рабочему образцу профиля, а не переписыванием заново.
## ГДЕ ВИДНО
`/radio?tab=feed`, карточка эпизода, кнопка «Share» рядом с «Play» и сердечком. Поймано владельцем 08.09.2026.
## ЧТО ПРОВЕРИТЬ ПРИ ПОЧИНКЕ
- нативное меню у эпизода открывается так же, как у профиля;
- если браузер нативного обмена не поддерживает, падать в копирование ссылки можно, но пользователь обязан ВИДЕТЬ, что скопировалось, а не получать молчание;
- заголовок и ссылка в меню относятся к ЭПИЗОДУ, а не к профилю;
- поведение у профиля не сломано.
## KNOWN ISSUES / ТРАБЛШУТИНГ
- **Симптом:** нажатие «Share» у эпизода ничего видимого не делает либо тихо копирует ссылку.
- **Проверка:** сравнить обработчик кнопки эпизода с обработчиком «Share profile» — рабочий образец на том же экране.
- **Вероятная причина:** у эпизода не вызывается системный обмен, сразу идёт ветка копирования; либо вызов не проходит требование браузера о пользовательском жесте.
- **Ссылки:** WEB-449 — правила обогащения тикетов.
## ДЛЯ ТИКЕТА
Заведено координатором 08.09.2026 по прямому сообщению владельца со скриншотами. Владелец отдельно просил фиксировать такие мелочи тикетами сразу, чтобы не терялись оптом.
FILL-2104:3380:active
Проверено 2026-09-10T21:10:06.758266+00:00. Волна 3380, A1, состояние active. Живая tmux pane и свежий журнал подтверждены. Exact BASE 1ad52e16b784d3ae80a148fddae4d5a3ab4a89c4. Входы SHA256 и bundle ref проверены перед dispatch. Бриф Intel nc-ops-scripts/fill-slots-20260910-2104/3380-share-feedback-brief.md. Сдача /home/wave/waves/3380SHAREFEEDBACK-REPORT.md. Посадки/окончательной приёмки этой работы нет.
REFILL-20260910-2155-3413
Снимок 2026-09-10T21:54:52.066911+00:00. Волна 3413 / acc-share-visible на A2: active. Оператор Codex, модель gpt-5.6-luna. Живой процесс подтверждён; возраст журнала 2 с. Входы /home/ubuntu/waves/inputs/3413-acc-share-visible; SHA256 и exact BASE 23283639c625226dd88d99b5b150b7f275a1d398 проверены при доставке. Новых посадок и измерений capacity нет; source QA не означает окончательное закрытие Security.
Доказательства
FILL-2104:3380:active
Проверено 2026-09-10T21:10:06.758266+00:00. Волна 3380, A1, состояние active. Живая tmux pane и свежий журнал подтверждены. Exact BASE 1ad52e16b784d3ae80a148fddae4d5a3ab4a89c4. Входы SHA256 и bundle ref проверены перед dispatch. Бриф Intel nc-ops-scripts/fill-slots-20260910-2104/3380-share-feedback-brief.md. Сдача /home/wave/waves/3380SHAREFEEDBACK-REPORT.md. Посадки/окончательной приёмки этой работы нет.
REFILL-20260910-2155-3413
Снимок 2026-09-10T21:54:52.066911+00:00. Волна 3413 / acc-share-visible на A2: active. Оператор Codex, модель gpt-5.6-luna. Живой процесс подтверждён; возраст журнала 2 с. Входы /home/ubuntu/waves/inputs/3413-acc-share-visible; SHA256 и exact BASE 23283639c625226dd88d99b5b150b7f275a1d398 проверены при доставке. Новых посадок и измерений capacity нет; source QA не означает окончательное закрытие Security.
Лента
2026-09-08T19:30:25.648Z · Волна 2962, VERDICT=GO: нативное меню там, где Web Share доступен; видимый запасной путь с подтверждением там, где недоступен; отказ пользователя от шаринга не считается ошибкой и не показывает ложное сообщение. Фикс de3c5eaa4. Ждёт посадки в l113x.
2026-09-08T19:30:32.177Z · Волна 2962, VERDICT=GO: нативное меню там, где Web Share доступен; видимый запасной путь с подтверждением там, где недоступен; отказ пользователя от шаринга не считается ошибкой и не показывает ложное сообщение. Фикс de3c5eaa4. Ждёт посадки в l113x.
2026-09-10T18:55:03.494Z · coordinatorBOARD-WASH-20260910:WAVE-3330
По поручению владельца 18:43Z назначена исполнительская волна 3330 (ui), Codex gpt-5.6-luna xhigh, M4. Полная история карточки и база l115c 1ad52e16b доставлены, brief-guard и проверка Git-базы пройдены. Задача: проверить существующую сдачу, устранить остатки, передать бандл и доказательства. Финальная приёмка и посадка остаются за координатором. Запуск группы подтверждён в журнале диспетчера.
КАРТА ДОКУМЕНТОВ: ноут /Users/annakorin/nc-ops-scripts/board-wash-20260910/3330-wash-ui-brief.md; M4 /Users/milamarty/waves/inputs/board-wash-20260910/ui-tickets.json; ожидаемый отчёт /Users/milamarty/waves/3330WASHUI-REPORT.md. Правила обогащения: WEB-449.
2026-09-10T19:00:23.069Z · coordinatorBOARD-WASH-LIVE-QA-3341-20260910
На освободившейся A2 в 18:58Z запущена независимая браузерная проверка текущего l115c, волна 3341-wash-live-ui. Проверяет share подкаста, контраст паспорта, подписи/видимость gamepad и редактор, используя только synthetic QA. Исходные группы 3330/3331 продолжают source-side работу. Финальный GO ещё не получен. Бриф: ноут /Users/annakorin/nc-ops-scripts/board-wash-20260910/3341-wash-live-ui-brief.md. Ожидаемая сдача: A2 /home/ubuntu/waves/3341WASHLIVEUI-REPORT.md + screenshots/logs/SHA256. Сторож bbn6klg2b отслеживает 12 групп, включая неполные сдачи и отказы по лимиту.
2026-09-10T21:10:32.314Z · coordinatorFILL-2104:3380:active
Проверено 2026-09-10T21:10:06.758266+00:00. Волна 3380, A1, состояние active. Живая tmux pane и свежий журнал подтверждены. Exact BASE 1ad52e16b784d3ae80a148fddae4d5a3ab4a89c4. Входы SHA256 и bundle ref проверены перед dispatch. Бриф Intel nc-ops-scripts/fill-slots-20260910-2104/3380-share-feedback-brief.md. Сдача /home/wave/waves/3380SHAREFEEDBACK-REPORT.md. Посадки/окончательной приёмки этой работы нет.
2026-09-10T21:55:31.049Z · coordinatorREFILL-20260910-2155-3413
Снимок 2026-09-10T21:54:52.066911+00:00. Волна 3413 / acc-share-visible на A2: active. Оператор Codex, модель gpt-5.6-luna. Живой процесс подтверждён; возраст журнала 2 с. Входы /home/ubuntu/waves/inputs/3413-acc-share-visible; SHA256 и exact BASE 23283639c625226dd88d99b5b150b7f275a1d398 проверены при доставке. Новых посадок и измерений capacity нет; source QA не означает окончательное закрытие Security.
2026-09-12T22:17:55.131Z · coordinator[12.09 22:17Z координатор] МОЙКА 12.09 (3568-wash-g3-editor-ui): фикс шаринга эпизода в дереве (de3c5eaa) — нативное меню + видимый копи-фолбэк. Но приёмка видимости (3413) ещё шла, вердикта в тикете нет. KEEP, ждём финальную браузерную проверку.
Остаток: Финальная браузерная приёмка share-видимости (волна 3413) не закрыта в тикете.; Нет записи о проверке «заголовок/ссылка про эпизод, а не профиль» на живом проде.
Отчёт: /Users/milamarty/waves/3568WASH*-REPORT.md (M4), копия nc-ops-scripts/shift-20260912-resume/wash-20260912/collected/. Проверка по исходнику прода l115g (9c8a9762).
2026-09-12T23:18:33.184Z · coordinator[12.09 23:18Z координатор] ВЗЯТО В РАБОТУ 12.09 23:17Z (владелец: «мойка = брать тикеты в работу»): волна 3586-accept-share-visibility-and-write-failure (DeepSeek, M4): приёмка фикса шаринга de3c5eaa чтением исходника l115g + тесты для прогона на A1. Сдача — бандл + отчёт, комментарий сюда по вердикту.
2026-09-12T23:40:15.365Z · coordinator[12.09 23:40Z координатор] Волна 3586 (DeepSeek, M4) — GO по чтению исходника прода l115g: шаринг эпизода идёт через общий helper (заголовок/ссылка эпизода, не профиля); написан узкий тест shareEpisode.episodeVsProfile.test.ts (refs/waves/3586 = b0464a20). Координатор прогоняет тест на A1 — результат следующим комментарием.
2026-09-12T23:40:37.224Z · coordinator[12.09 23:40Z координатор] Координатор: тесты волны 3586 прогнаны на A1 на исходнике прода l115g через tsx-загрузчик (`node --import tsx --test …`) — все pass (обе группы; цифры в OPS-STATUS). Приёмка закрыта чтением + тестами; статус остаётся review до посадки тестов в линию l115i (refs/waves/3586).
2026-09-13T10:37:39.853Z · coordinator[13.09 10:37Z координатор] Мойка доски, волна 3652. RETURN: фикс de3c5eaa4 + тест shareEpisode.episodeVsProfile.test.ts (волна 3586 GO) посажены l115i (13.09 06:37Z). Не хватает финальной живой браузерной приёмки нативного меню (вердикт волны 3413 не закрыт в тикете). Статус review.
2026-09-13T13:07:55.947Z · coordinator[13.09 13:07Z координатор] Волна 3697 проверила живьём и нашла настоящую причину, по которой карточку нельзя закрыть.
Хорошая часть: нацеливание работает правильно и доказано в браузере — кнопка у эпизода никогда не подсовывает ссылку профиля и наоборот, оба пути идут через один и тот же системный вызов меню.
Плохая часть: главное, ради чего карточка заводилась — ВИДИМАЯ обратная связь — по-прежнему молча пропадает при первом нажатии на холодной странице. Причина названа точно: настоящий продуктовый фикс (безусловный показ уведомлений в обёртке маршрутов, коммит 47b78de8d) НИКОГДА не был влит в линию l115j, на которой шла проверка.
Что делаю: отдельная волна переносит этот коммит в кандидат следующей линии, после чего повторяем ровно одну проверку — первое нажатие на холодной странице.
2026-09-13T16:27:44.946Z · coordinator[13.09 16:27Z координатор] RETURN → кандидат линии l115k. Фикс `47b78de8d` («make podcast share feedback visible»: RouteScopedProviders.tsx, PodcastProfile.tsx, shareEpisode.ts + 4 теста) — тот самый, отсутствие которого волна 3697 назвала причиной молчаливого первого нажатия — влит координатором в `candidate/l115k` отдельным слиянием, HEAD кандидата `4a6e99ed474d3da746b041417f637d0fb2efd81c`. Тесты WEB-571 в дереве кандидата: 10 pass / 0 fail (`node --import tsx --test tests/unit/web571-share-feedback.dom.test.tsx tests/unit/web571-share-host.wiring.test.ts src/lib/podcast/__tests__/shareEpisode.test.ts`).
Статус остаётся review до посадки линии. После посадки — ровно одна живая проверка: первое нажатие «Поделиться» у эпизода на холодной странице, ожидается видимое подтверждение.
2026-09-13T17:37:04.565Z · coordinator[13.09 17:37Z координатор] ПОСАЖЕНО В ПРОД. Линия l115k, источник `ac4eb8c68d70de829608bcae5a7acef693ab85fb`, артефакт `me2-standalone-linux-arm64-ac4eb8c68-20260913T165733Z` sha256 `eafbeb5146ddf0b498f82d608ddd30d15053d23156b43603dfb88dfe71aaebed`, релиз `arm64-l115k-20260913T165733Z`, переключение 13.09 17:27:44Z.
Проверено после переключения: публичный `https://app.sixbyy.com/` 200, `/api/ready` `ready:true` с коммитом линии, проба базы пройдена, `paidReady:true`, поза `enforce_ready`, обе копии приложения (3010 и 3012) и рабочие таймеры на новом релизе, упавших юнитов нет. Артефакт опубликован на Hetzner: `release_id=l115k-ac4eb8c6`, 244545299 байт, удержание 5.
Откат: `sudo python3 /home/ubuntu/transition-l115k.py rollback` → l115j (`133fe00c`).
Особенность этой посадки: впервые с 12.09 поехали настоящие миграции, 206 → 209 (`web651_source_text_chunk`, `web575_erasure_tombstone`, `web575_embed_share_audience`), расписка `prod/shared/l115k-migration/apply-receipt.json`, личность применения `web_migrator`.
2026-09-13T20:18:50.203Z · coordinator[13.09 20:18Z координатор] ПОСТ-QA РАУНД 2 — ДОКАЗАНО. Инструмент: `scripts/postqa/l115k-postqa-dom.mjs` (волна 3742), прогон координатора против исходника КОММИТА, КОТОРЫЙ СЕЙЧАС В ПРОДЕ (`ac4eb8c68d70de829608bcae5a7acef693ab85fb`, отдельный worktree `wt-postqa-release`), результат `/tmp/l115k-postqa-dom.json` на A1.
Итог: **PROVEN 4, не проверяется этим способом 1.**
- WEB-576 — маркер происхождения ИИ переживает выгрузку EPUB/FB2/MOBI — **PROVEN**
- WEB-571 — видимая обратная связь кнопки «Поделиться» (фоллбэк буфера + тост) — **PROVEN**
- WEB-583 — редактор: разделение сохранения и переиндексации, сохранение прокрутки на больших документах — **PROVEN**
- WEB-325 — рубильник Gate E действительно блокирует правки ИИ (очистка localStorage сохраняет оба рубильника) — **PROVEN**
- WEB-651 — клиентская половина (баннер «только для чтения») — не проверяется в jsdom: она вшита в эффект живого socket.io-присоединения к сессии; серверная половина проверяема живым пробником.
ПОЧЕМУ ЭТОМУ МОЖНО ВЕРИТЬ, А НЕ ПРОСТО «ТЕСТЫ ЗЕЛЁНЫЕ». У каждой проверки есть пара «краснеет/зеленеет», и краснеет она НА НАСТОЯЩЕМ КОДЕ ДО ФИКСА, а не на синтетической заглушке:
- WEB-576 → красный на `66dbb8882~1`
- WEB-571 → красный на `db5b414cc~1`
- WEB-325 → красный на `a4353bcda~1`
- WEB-583 → красный на мутанте (`shouldShowIndexingDeferredNotice` всегда `false`), это единственная синтетическая пара из четырёх, и волна это честно пометила.
ЧТО ЭТО ДОКАЗЫВАЕТ И ЧЕГО НЕ ДОКАЗЫВАЕТ. Доказывает: поведение кода, который сейчас работает в проде, в среде DOM, с отрицательным контролем на настоящем до-фиксном коде. НЕ доказывает: клик живого человека в настоящем браузере на настоящем проде — для этого нужна ручная проба, и для WEB-651 волна расписала её по шагам (открыть документ сверх 16 000 000 единиц UTF-16, убедиться, что редактор открылся только для чтения с баннером и БЕЗ сообщения «не удалось сохранить»).
СТАТУСЫ: WEB-576, WEB-571, WEB-583, WEB-325 → done. WEB-651 остаётся открытым до ручной браузерной пробы.
Отдельно закрыт долг инструмента: проверка WEB-467 переписана под настоящую форму ответа кошелька (`mode='real_spend_ledger'`, `days[].groups[].details[]`) и смотрит на статусы урегулирования и подвисшие кредиты, а не на факт ответа 200. Ложных тревог по ней больше не будет.
2026-09-13T21:07:12.919Z · coordinator[13.09 21:07Z координатор] ВОЗВРАЩАЮ ТИКЕТ В РАБОТУ. Я закрыл его преждевременно, независимая приёмка (волна 3743, другой исполнитель) это поймала и поставила `VERDICT=NO-GO`: `WEB-576=OK WEB-571=BAD WEB-583=BAD WEB-325=BAD`.
Что приёмка ПОДТВЕРДИЛА (чтобы не переделывали лишнего): все три заявленные «настоящие» до-фиксные пары честные — на до-фиксном коде пробник действительно краснеет, на релизном исходнике зеленеет, зелёного до фикса не найдено. Врущих проверок нет. Ошибка не в пробнике, а в ОБЪЁМЕ: он проверяет не весь путь, ради которого заводился тикет, а я закрыл тикеты так, будто проверяет.
Разбор по тикетам:
- **WEB-576 — остаётся закрытым.** Проверены все три формата (EPUB, FB2, MOBI), до-фиксная пара настоящая: до фикса `ncai.provenance` отсутствует во всех трёх, после — есть во всех трёх. Заявленный объём покрыт.
- **WEB-571 → review.** Проверен ТОЛЬКО путь запасного варианта (копирование в буфер + видимый тост). Настоящего `navigator.share` в jsdom нет, то есть главный путь — нативное меню обмена, ради которого тикет и заводился, — не проверен ничем. Нужна браузерная проба основного пути.
- **WEB-583 → review.** У пробника НЕТ настоящей пары: в до-фиксном коммите `11a076721^` вспомогательной функции `shouldShowIndexingDeferredNotice` ещё не существует, пробник получает ошибку сборки и превращает её в «не доказано». Ошибка сборки — это не наблюдение старого поведения. Плюс из трёх дефектов тикета проверяется только первый. Нужен адаптер к настоящему до-фиксному `updateDocument`, а не к функции, появившейся вместе с фиксом.
- **WEB-325 → review.** Проверено только сохранение рубильников при очистке localStorage. Запрет вставок ИИ в месте вызова (`EditorModal.tsx`) — то есть сам смысл «рубильник действительно блокирует правки ИИ» — не проверяется.
Почему записываю это подробно: сегодня я уже один раз поднял ложную тревогу по WEB-467 из-за неверного допущения инструмента, а теперь — обратная ошибка: принял частичную проверку за полную. Оба раза спасала независимая приёмка. Правило для следующего агента: вердикт пробника закрывает тикет только если покрыт ЗАЯВЛЕННЫЙ В ТИКЕТЕ путь целиком, и до-фиксная пара краснеет по НАБЛЮДЕНИЮ СТАРОГО ПОВЕДЕНИЯ, а не по ошибке сборки.
2026-09-14T11:13:34.770Z · coordinator[14.09 11:13Z координатор] ПОЧЕМУ ЭТА КАРТОЧКА СНОВА В REVIEW, ХОТЯ Я ЕЁ ЗАКРЫВАЛ (для того, кто откроет без контекста).
Я закрыл её по пост-QA, а независимая приёмка вернула это закрытие обратно. Приёмка была права.
Хронология:
1. Браузерная приёмка 3697 нашла точную причину: настоящий продуктовый фикс (безусловный показ уведомлений, коммит 47b78de8d) НИКОГДА не вливался в линию. Нацеливание кнопки при этом было правильным и доказано.
2. Волна 3714 перенесла коммит в кандидат.
3. Пост-QA 3742 прогнала проверки против исходника прод-коммита и я закрыл карточку вместе с тремя другими.
4. Приёмка 3743 вернула ТРИ моих закрытия, включая это: у пары «до фикса / после фикса» красное было получено НЕ настоящим до-фиксным кодом, а ошибкой сборки. Красное от ошибки сборки не доказывает ничего — оно краснеет всегда, независимо от дефекта.
5. Волна 3777 (пост-QA линии l115k) переделала проверку: WEB-571 проверен НАСТОЯЩИМ React и настоящим sonner Toaster под jsdom, а не заглушкой. Один саб-тест не прогнался зелёным в песочнице; вердикт не понижен, потому что то же поведение доказано другим настоящим тестом, и ограничение названо честно.
ГРАНИЦА ЗАЯВЛЕНИЯ: доказано поведение прод-кода в DOM — уведомление показывается безусловно, нацеливание кнопки верное. НЕ доказан клик живого человека по нативному «Поделиться» на настоящем устройстве.
ЧТО ЗАКРОЕТ КАРТОЧКУ: ручная проба на устройстве с нативным share-листом, либо явное решение, что доказательства в DOM достаточно.
УРОК, который стоит держать рядом с этой карточкой: закрытие по зелёному тесту без отрицательного контроля — не закрытие. Отрицательный контроль обязан краснеть на НАСТОЯЩЕМ до-фиксном коде; если он краснеет из-за того, что сборка не собралась, проверка ничего не проверяет. За смену этот класс ловился трижды.
2026-09-14T12:07:38.582Z · coordinator[14.09 12:07Z координатор] WEB-571 — кнопка «Поделиться» ничего не отвечает
Обновление от 2026-09-14. Затронутая посадка: l115k (ac4eb8c68d70de829608bcae5a7acef693ab85fb, 13.09 17:27:44Z).
Карточка написана для человека, который открывает её впервые и не имеет ни журнала смены, ни переписки.
1. ЧТО БЫЛО СЛОМАНО
Пользователь нажимает «Поделиться» — и ничего видимого не происходит. Ни подтверждения, ни ошибки. Человек не может понять, сработало или нет, и нажимает ещё раз.
2. КАК НАШЛИ И ПОЧЕМУ НЕ ПОЙМАЛИ РАНЬШЕ
Нашла браузерная приёмка 3697 (её общий вердикт был NO-GO, но находки оказались ценнее вердикта). Причина названа ТОЧНО: настоящий продуктовый фикс видимой обратной связи — коммит `47b78de8d`, безусловный показ уведомлений плюс четыре теста — НИКОГДА НЕ ВЛИВАЛСЯ НИ В ОДНУ ЛИНИЮ. Нацеливание кнопки при этом было правильным, и это тоже доказано.
Почему не поймали раньше: фикс существовал, был написан и протестирован, но жил на ветке вне всех линий. Со стороны доски он выглядел как сделанная работа. Это один из десяти случаев за смену, когда критический код жил вне линии — тот же класс, что «фикс аварийного комплекта существовал только в незакоммиченном каталоге».
3. ЭВОЛЮЦИЯ, ВКЛЮЧАЯ ТУПИКИ
3.1. ТУПИК — тикет был закрыт по вердикту программы-пробника, и независимая приёмка его ВЕРНУЛА.
Координатор закрыл четыре тикета сразу, опираясь на прогон DOM-пробника `scripts/postqa/l115k-postqa-dom.mjs` против исходника коммита, работающего в проде. Пробник дал PROVEN по четырём пунктам.
Независимая приёмка 3743 вернула три из четырёх закрытий, в том числе это. Разбор точный:
ПРОБНИК НЕ ВРЁТ. Приёмка перепрогнала заявленные до-фиксные пары и подтвердила: на до-фиксном коде красный, на релизном исходнике зелёный, зелёного до фикса нет.
ОШИБКА В ОБЪЁМЕ, и она координатора. Пробник покрывает НЕ ВЕСЬ путь тикета, а закрыто было так, будто весь. Конкретно: проверен только ЗАПАСНОЙ путь — копирование в буфер обмена и всплывающее уведомление. Настоящего системного «Поделиться» (`navigator.share`) в jsdom не существует, поэтому ГЛАВНЫЙ путь, ради которого тикет и заведён, не проверен ничем.
ПРАВИЛО, записанное после этого прямо в тикеты: вердикт пробника закрывает тикет ТОЛЬКО если покрыт ЗАЯВЛЕННЫЙ путь ЦЕЛИКОМ И красное до фикса получено НАБЛЮДЕНИЕМ старого поведения, а не ошибкой сборки.
3.2. РАУНД 3 пост-QA был поставлен ровно по пробелам приёмки: главный путь через достоверный двойник системного «Поделиться».
3.3. ПОЛНЫЙ ПОСТ-QA ЛИНИИ. Линия l115l прошла проверку по каждому тикету, а l115k — нет, хотя именно она принесла первые настоящие миграции. Пробел закрыт волной 3777: WEB-571 проверен НАСТОЯЩИМ React и НАСТОЯЩИМ компонентом уведомлений под jsdom, а не заглушкой. Один суб-тест не прогнался зелёным в песочнице; вердикт НЕ БЫЛ ПОНИЖЕН, потому что то же поведение доказано другим настоящим тестом, и ограничение названо честно.
4. ЧТО СДЕЛАЛИ В ИТОГЕ
Коммит `47b78de8d` влит в кандидат линии ОТДЕЛЬНЫМ слиянием: HEAD кандидата стал `4a6e99ed474d3da746b041417f637d0fb2efd81c`, итоговая линия l115k — `ac4eb8c68d70de829608bcae5a7acef693ab85fb`, посажена 13.09 17:27:44Z. Комментарий о посадке разослан в этот тикет в числе прочих.
5. ЧЕМ ДОКАЗАНО И ГРАНИЦЫ ЗАЯВЛЕНИЯ
ДОКАЗАНО:
Тесты WEB-571 в дереве кандидата: 10 pass / 0 fail (`node --import tsx --test`).
Пара до/после НАСТОЯЩАЯ: на коммите, предшествующем `db5b414cc`, проверка красная; на релизном исходнике — зелёная.
Пост-QA l115k (волна 3777): проверено настоящим React и настоящим компонентом уведомлений под jsdom.
ГРАНИЦЫ — читать обязательно и не сглаживать:
ДОКАЗАНО ПОВЕДЕНИЕ ПРОД-КОДА В DOM. НЕ ДОКАЗАН КЛИК ЧЕЛОВЕКА В БРАУЗЕРЕ. Эта граница записана в тикет намеренно.
Проверен ЗАПАСНОЙ путь (буфер обмена и уведомление). ГЛАВНЫЙ путь — системное «Поделиться» — в jsdom не существует; он проверялся двойником, а не настоящим API устройства.
Один суб-тест не прогнался зелёным в песочнице.
6. ЧТО ОСТАЛОСЬ ОТКРЫТЫМ
Ровно одна живая проверка: ПЕРВОЕ нажатие «Поделиться» на ХОЛОДНОЙ странице в настоящем браузере, желательно на устройстве, где системное «Поделиться» действительно есть.
7. TROUBLESHOOTER — ЕСЛИ ДЕФЕКТ ПОВТОРИТСЯ
Шаг 1. Первым делом проверить, что фикс не выпал из линии снова:
git merge-base --is-ancestor 47b78de8d <коммит прода>
Код возврата 0 = фикс в проде. Этот коммит уже однажды существовал вне всех линий, и именно это было причиной тикета.
Шаг 2. Понять, на КАКОМ ИЗ ДВУХ ПУТЕЙ вы находитесь. Системное «Поделиться» есть не везде; jsdom и обычный настольный Chromium идут по ЗАПАСНОМУ пути (буфер обмена плюс уведомление). Зелёный тест в jsdom не говорит НИЧЕГО о главном пути.
Шаг 3. Не принимать вердикт программы-пробника за закрытие. Требовать двух вещей сразу: покрыт ли ЗАЯВЛЕННЫЙ путь целиком, и получено ли красное до фикса НАБЛЮДЕНИЕМ старого поведения (а не ошибкой сборки).
2026-09-15T01:25:02.872Z · coordinator[15.09 01:25Z координатор] ## 15.09 01:40Z — ВОШЁЛ В ПОСАДКУ l115o. Требуется пост-QA на проде.
Прод работает на `l115o-68e25d8d` (коммит `68e25d8df5ae8263c5ac5466353631f57a17cfcc`, артефакт `cd2773f65d66b09ec03d39b553041d2814ce09413e72d72b07bc9de89df536c8`) с 00:56Z 15.09. Посадка проверена: `ready=true`, коммит совпал, браузерная проба открыла документ, 0 новых ошибок.
**Работу по этому тикету принесли волны:** 3742, 3745.
**Что это значит для этого тикета.** Работа по нему пролежала принятой, но НЕ посаженной — в некоторых случаях неделями. Теперь она на проде. Приёмка волной доказывала, что код правильный в дереве волны; она НЕ доказывала, что фича работает на живом проде. Это разные вещи, и мы на этом уже обжигались.
**Поэтому статус — `review`, а не `done`.** Закрыть тикет имеет право только пост-QA, который проверит поведение на работающем проде и приложит доказательство. До тех пор «сделано» — это заявка.
### Для нулевого агента (тот, кто будет делать пост-QA)
Ты приходишь на этот тикет без нашей истории. Что надо знать:
1. **Проверяй на проде, не на стенде.** Стенд сейчас вообще не поднят — у него не было своего артефакта, он запускался из каталога боевого релиза и заблокировал проверку посадки; пересобирается волной 3948 (WEB-662).
2. **`/api/health` ничего не доказывает** — он проходит и на пустом приложении. Нужно деловое действие: аутентифицированная сессия делает то, про что этот тикет.
3. **Отсутствие ошибок в логе — не доказательство жизни.** Нужен положительный результат, а не тишина.
4. **Числа в обосновании закрытия получай командой в момент закрытия.** Я однажды закрыла тикет числом `4255`, взятым из `pg_stat_user_tables.n_live_tup` — это ОЦЕНКА. Настоящее `count(*)` дало `107 817`. Разница в 25 раз.
5. **Не верь имени волны в теме коммита** — проверяй наличие содержимого (`git cherry`), а не упоминание номера.
6. Запускатель тестов в проекте — `node --test`. Vitest нет.
2026-09-15T12:49:48.909Z · coordinator[15.09 12:49Z координатор] [15.09 12:47Z координатор] Post-QA 4010 завершена: VERDICT=REVIEW/NOT_OBSERVED, не регрессия и не закрытие.
Точная l115o `68e25d8df…`; фикс `47b78de8d…` подтверждён как предок. Current source wiring корректен: episode Share использует `sharePodcastEpisode`, payload относится к эпизоду, profile Share остаётся отдельным. Focused проверки ненулевые и зелёные: episode-vs-profile 3/3, связанный share suite 17/17.
Но на M4 не оказалось уже авторизованной видимой browser surface с доступным visual/accessibility control. Safari/Chrome установлены, однако доказать real `navigator.share`, выполнить первый холодный click и увидеть системный share sheet безопасно не удалось. Логин не предпринимался, synthetic API/DOM snapshot не засчитывались, кликов и отправок было 0, Safari после пробы закрыт.
Остаток ровно один: на уже авторизованном реальном устройстве открыть production `/radio?tab=feed`, первым кликом открыть системный Share у эпизода, проверить episode title/URL, отменить без выбора получателя; затем так же проверить profile Share. До этой живой расписки WEB-571 остаётся review.
2026-09-22T18:08:56.281Z · triage-m1РЕШЕНИЕ=in_progress
ОСНОВАНИЕ=Приёмка 4010: VERDICT=REVIEW/NOT_OBSERVED; посадка зафиксирована на l115o (68e25d8df5ae8263c5ac5466353631f57a17cfcc), но живой cold-click не наблюдался.
ЧТО НУЖНО=Production browser receipt первого cold-click episode Share с настоящим системным share и симметричной проверкой profile Share.
triage-m1 4607
2026-09-23T12:11:33.337Z · triage-neoРЕШЕНИЕ=parked
ОСНОВАНИЕ=2026-09-15, волна 4010 REVIEW/NOT_OBSERVED; посадка l115o, 68e25d8df; cold-click системного Share у эпизода не наблюдался.
ЧТО НУЖНО=первый шаг: production browser receipt первого cold-click и симметричная проверка profile Share; ПРЕДЛОЖЕНИЕ=split
triage-neo 4704
Воркер
не проверен
wq-acc-share-visible
A2
движение в панели: неизвестно
Подключиться и смотреть/перехватить руками. Колесо мыши листает; клавишами — Ctrl-b затем [, выход из прокрутки q. Отсоединиться — Ctrl-b затем d:
Прочитать историю панели без подключения — листается и ищется (/ поиск, q выход), воркеру не помешает:
Обновлён
2026-09-23T12:11:33.351Z