WEB-527 · Задача · — · web
P0: загруженный источник исчезает из аккаунта через минуты после успешной загрузки (POST /api/sync wipe-and-replace)
Закрыт
P0 · горит
ведёт: l109 b3a0c011a (пост-QA 1991)
эпик: WEB-086
Суть
## ДЛЯ НУЛЕВОГО АГЕНТА (обновлено 2026-09-05 UTC)
- **Суть одной строкой:** P0: загруженный источник исчезает из аккаунта через минуты после успешной загрузки (POST /api/sync wipe-and-replace)
- **Текущее состояние:** статус: done; что на проде: body: Текущее состояние:** статус: done; что на проде: 2026-09-05T09:27:39.528Z: [05.09 09:27Z координатор] АДВЕРСАРИАЛЬНАЯ ПРИЁМКА (ACCSYNCSOURCELOSS, A1, Fable 5.1, реальный PG и; 2026-09-05T09:27:39.528Z: [05.09 09:27Z координатор] АДВЕРСАРИАЛЬНАЯ ПРИЁМКА (ACCSYNCSOURCELOSS, A1, Fable 5.1, реальный PG и реальный роут) = GO, коммит 4cb930de: POST /api/sync б; 2026-09-05T12:40:28.159Z: [05.09 12:40Z координатор] l109 (135103a33) СЕЛ на прод 12:31Z: оба бэкенда, edge ×8, polling ok, paid ok, воркеры на l109; hetzbk-артефакт опубликован, e; 2026-09-05T14:36:21.066Z: [05.09 14:36Z координатор] Ревизия координатора 05.09 14:45Z: фикс уже есть и ПРИНЯТ — волна 1938 SYNCSOURCELOSS (claude-opus), commit 4cb930de поверх l10; 2026-09-05T14:39:15.740Z: [05.09 14:39Z координатор] ПОПРАВКА к предыдущему комментарию: фикс 4cb930de УЖЕ на живой линии — сел в l109 как b3a0c011a (тот же patch-id, cherry-pick п; что принято/ждёт посадки: body: Текущее состояние:** статус: done; что на проде: 2026-09-05T09:27:39.528Z: [05.09 09:27Z координатор] АДВЕРСАРИАЛЬНАЯ ПРИЁМКА (ACCSYNCSOURCELOSS, A1, Fable 5.1, реальный PG и; 2026-09-05T08:14:33.357Z: [05.09 08:14Z координатор] Автор (волна 1938 SYNCSOURCELOSS, A2, opus) = GO, коммит 4cb930de поверх 6930c683. КОРЕНЬ: POST /api/sync = wipe-and-replace; d; 2026-09-05T09:27:39.528Z: [05.09 09:27Z координатор] АДВЕРСАРИАЛЬНАЯ ПРИЁМКА (ACCSYNCSOURCELOSS, A1, Fable 5.1, реальный PG и реальный роут) = GO, коммит 4cb930de: POST /api/sync б; 2026-09-05T14:36:21.066Z: [05.09 14:36Z координатор] Ревизия координатора 05.09 14:45Z: фикс уже есть и ПРИНЯТ — волна 1938 SYNCSOURCELOSS (claude-opus), commit 4cb930de поверх l10; 2026-09-05T14:39:15.740Z: [05.09 14:39Z координатор] ПОПРАВКА к предыдущему комментарию: фикс 4cb930de УЖЕ на живой линии — сел в l109 как b3a0c011a (тот же patch-id, cherry-pick п; что в работе: body: Текущее состояние:** статус: done; что на проде: 2026-09-05T09:27:39.528Z: [05.09 09:27Z координатор] АДВЕРСАРИАЛЬНАЯ ПРИЁМКА (ACCSYNCSOURCELOSS, A1, Fable 5.1, реальный PG и; 2026-09-05T08:14:33.357Z: [05.09 08:14Z координатор] Автор (волна 1938 SYNCSOURCELOSS, A2, opus) = GO, коммит 4cb930de поверх 6930c683. КОРЕНЬ: POST /api/sync = wipe-and-replace; d; 2026-09-05T14:36:21.066Z: [05.09 14:36Z координатор] Ревизия координатора 05.09 14:45Z: фикс уже есть и ПРИНЯТ — волна 1938 SYNCSOURCELOSS (claude-opus), commit 4cb930de поверх l10; 2026-09-05T14:39:15.740Z: [05.09 14:39Z координатор] ПОПРАВКА к предыдущему комментарию: фикс 4cb930de УЖЕ на живой линии — сел в l109 как b3a0c011a (тот же patch-id, cherry-pick п
- **Кто работал:**
- body: Текущее состояние:** статус: done; что на проде: 2026-09-05T09:27:39.528Z: [05.09 09:27Z координатор] АДВЕРСАРИАЛЬНАЯ ПРИЁМКА (ACCSYNCSOURCELOSS, A1, Fable 5.1, реальный PG и
- 2026-09-05T08:14:33.357Z: [05.09 08:14Z координатор] Автор (волна 1938 SYNCSOURCELOSS, A2, opus) = GO, коммит 4cb930de поверх 6930c683. КОРЕНЬ: POST /api/sync = wipe-and-replace; d
- 2026-09-05T09:27:39.528Z: [05.09 09:27Z координатор] АДВЕРСАРИАЛЬНАЯ ПРИЁМКА (ACCSYNCSOURCELOSS, A1, Fable 5.1, реальный PG и реальный роут) = GO, коммит 4cb930de: POST /api/sync б
- 2026-09-05T14:36:21.066Z: [05.09 14:36Z координатор] Ревизия координатора 05.09 14:45Z: фикс уже есть и ПРИНЯТ — волна 1938 SYNCSOURCELOSS (claude-opus), commit 4cb930de поверх l10
- 2026-09-05T14:39:15.740Z: [05.09 14:39Z координатор] ПОПРАВКА к предыдущему комментарию: фикс 4cb930de УЖЕ на живой линии — сел в l109 как b3a0c011a (тот же patch-id, cherry-pick п
- **Ветки/бандлы/отчёты:**
- body: Текущее состояние:** статус: done; что на проде: 2026-09-05T09:27:39.528Z: [05.09 09:27Z координатор] АДВЕРСАРИАЛЬНАЯ ПРИЁМКА (ACCSYNCSOURCELOSS, A1, Fable 5.1, реальный PG и
- 2026-09-05T08:14:33.357Z: [05.09 08:14Z координатор] Автор (волна 1938 SYNCSOURCELOSS, A2, opus) = GO, коммит 4cb930de поверх 6930c683. КОРЕНЬ: POST /api/sync = wipe-and-replace; d
- 2026-09-05T09:27:39.528Z: [05.09 09:27Z координатор] АДВЕРСАРИАЛЬНАЯ ПРИЁМКА (ACCSYNCSOURCELOSS, A1, Fable 5.1, реальный PG и реальный роут) = GO, коммит 4cb930de: POST /api/sync б
- 2026-09-05T14:36:21.066Z: [05.09 14:36Z координатор] Ревизия координатора 05.09 14:45Z: фикс уже есть и ПРИНЯТ — волна 1938 SYNCSOURCELOSS (claude-opus), commit 4cb930de поверх l10
- 2026-09-05T14:39:15.740Z: [05.09 14:39Z координатор] ПОПРАВКА к предыдущему комментарию: фикс 4cb930de УЖЕ на живой линии — сел в l109 как b3a0c011a (тот же patch-id, cherry-pick п
- **KNOWN ISSUES / ТРАБЛШУТИНГ:** симптом → проверка → причина (file:line, если есть) → лечение
- body: KNOWN ISSUES / ТРАБЛШУТИНГ:** симптом → проверка → причина (file:line, если есть) → лечение
- 2026-09-05T08:14:33.357Z: [05.09 08:14Z координатор] Автор (волна 1938 SYNCSOURCELOSS, A2, opus) = GO, коммит 4cb930de поверх 6930c683. КОРЕНЬ: POST /api/sync = wipe-and-replace; d
- 2026-09-05T14:39:15.740Z: [05.09 14:39Z координатор] ПОПРАВКА к предыдущему комментарию: фикс 4cb930de УЖЕ на живой линии — сел в l109 как b3a0c011a (тот же patch-id, cherry-pick п
- **Эволюция:**
- 2026-09-05T08:14:33.357Z → [05.09 08:14Z координатор] Автор (волна 1938 SYNCSOURCELOSS, A2, opus) = GO, коммит 4cb930de поверх 6930c683. КОРЕНЬ: POST /api/sync = wipe-and-replace; dedupeSourceRowsByContentHa
- 2026-09-05T09:27:39.528Z → [05.09 09:27Z координатор] АДВЕРСАРИАЛЬНАЯ ПРИЁМКА (ACCSYNCSOURCELOSS, A1, Fable 5.1, реальный PG и реальный роут) = GO, коммит 4cb930de: POST /api/sync больше не может удалить ист
- 2026-09-05T12:40:28.159Z → [05.09 12:40Z координатор] l109 (135103a33) СЕЛ на прод 12:31Z: оба бэкенда, edge ×8, polling ok, paid ok, воркеры на l109; hetzbk-артефакт опубликован, env-line l109, Pi переключа
- 2026-09-05T14:36:21.066Z → [05.09 14:36Z координатор] Ревизия координатора 05.09 14:45Z: фикс уже есть и ПРИНЯТ — волна 1938 SYNCSOURCELOSS (claude-opus), commit 4cb930de поверх l106 6930c683 (5 файлов, src/
- 2026-09-05T14:39:15.740Z → [05.09 14:39Z координатор] ПОПРАВКА к предыдущему комментарию: фикс 4cb930de УЖЕ на живой линии — сел в l109 как b3a0c011a (тот же patch-id, cherry-pick при сборке l109), прод с 12
- **Следующий шаг:** см. текущую работу из комментариев: 2026-09-05T14:39:15.740Z: [05.09 14:39Z координатор] ПОПРАВКА к предыдущему комментарию: фикс 4cb930de УЖЕ на живой линии — сел в l109 как b3a0c011a (тот же patch-id, cherry-pick п
Лента
2026-09-05T08:14:33.357Z · coordinator[05.09 08:14Z координатор] Автор (волна 1938 SYNCSOURCELOSS, A2, opus) = GO, коммит 4cb930de поверх 6930c683. КОРЕНЬ: POST /api/sync = wipe-and-replace; dedupeSourceRowsByContentHash (sync/route.ts) схлопывал строки по хешу ТЕЛА — в тетради уже лежала старая байт-в-байт копия того же файла, поэтому новая server-only строка, корректно сохранённая защитой TEAM-0169, выбрасывалась следующим шагом, а source.deleteMany({notebookId}) уже стёр всё → createMany не вернул → жёсткое удаление без tombstone и без следа. Противоречие с DEDUP-1500 (sourceWriter.ts: ingest разрешает копии). Настоящий ключ — частичный индекс Source_notebook_contentHash_key (notebookId, metadata->>contentHash). ФИКС: resolveDuplicateMetadataContentHashes (снятие дубля ключа, не строки); диф по id вместо deleteMany, удаление только с явным tombstone; строки без content (read-gateway) не переписываются (createMany писал content NULL — ломало окно отмены WEB-133 и isActive:false); аудит [sync][source_deleted|source_delete_blocked|source_preserved]. Тесты 6+4. Приёмка 1971-accsyncsourceloss (A2, Fable 5.1, адверсариальная: 9 сценариев включая параллельные вкладки, tombstone на чужой id, content NULL, 409-ретрай, перф на 500 источниках).
KNOWN ISSUES / ТРАБЛШУТИНГ: «файл пропал через минуты после загрузки» → искать в тетради вторую копию с тем же телом + консоль 409/[sync] save failed → до посадки фикса: не загружать один файл дважды в одну тетрадь; после посадки — по журналу [sync][source_*].
2026-09-05T09:27:39.528Z · coordinator[05.09 09:27Z координатор] АДВЕРСАРИАЛЬНАЯ ПРИЁМКА (ACCSYNCSOURCELOSS, A1, Fable 5.1, реальный PG и реальный роут) = GO, коммит 4cb930de: POST /api/sync больше не может удалить источник без явного клиентского tombstone; конфликт ключа частичного индекса (notebookId, metadata->>contentHash) разрешается снятием дубля КЛЮЧА у более новой строки (ingest-копии живут, противоречие с DEDUP-1500 снято); deleteMany → диф по id; soft-deleted/isActive:false не переписываются (закрыта ловушка content NULL, ломавшая окно отмены WEB-133), corpusId возвращается после пересоздания папок; аудит [sync][source_*]; прод-инцидент воспроизведён на базе и невозможен на кандидате; перф 500 источников 243→209 мс. КАНДИДАТ В l109.
2026-09-05T12:40:28.159Z · coordinator[05.09 12:40Z координатор] l109 (135103a33) СЕЛ на прод 12:31Z: оба бэкенда, edge ×8, polling ok, paid ok, воркеры на l109; hetzbk-артефакт опубликован, env-line l109, Pi переключается. Фикс (b3a0c011) в живой линии: sync больше не удаляет источник без tombstone; аудит [sync][source_*] в журнале nc-a1. Тикет можно закрывать после недели без повторов.
2026-09-05T14:36:21.066Z · coordinator[05.09 14:36Z координатор] Ревизия координатора 05.09 14:45Z: фикс уже есть и ПРИНЯТ — волна 1938 SYNCSOURCELOSS (claude-opus), commit 4cb930de поверх l106 6930c683 (5 файлов, src/app/api/sync/route.ts и др.), адверсариальная приёмка ACC-1971 (claude-fable): VERDICT=GO, /home/ubuntu/waves/ACCSYNCSOURCELOSS-REPORT.md, бандл /home/ubuntu/waves/SYNCSOURCELOSS.bundle. В l107–l110 не попал (мой пропуск при сборке линий) — идёт в сборку l111 первым. Статус тикета переводится в review до посадки.
2026-09-05T14:39:15.740Z · coordinator[05.09 14:39Z координатор] ПОПРАВКА к предыдущему комментарию: фикс 4cb930de УЖЕ на живой линии — сел в l109 как b3a0c011a (тот же patch-id, cherry-pick при сборке l109), прод с 12:31Z; в l110 тоже. Пост-QA l109 (волна 1991) его проверил живьём: две копии одного .md, загруженные подряд, остаются двумя источниками (строка «ДЛЯ ТИКЕТА — WEB-527 / WEB-133» в /home/ubuntu/waves/L109POSTQA-REPORT.md). Из сборки l111 убран, статус → done. Ошибка была в моём аудите «непосаженного»: сравнивал по sha, а не по patch-id.
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-527","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-09-05T19:39:38.974Z