WEB-587 · Дефект · — · web
P0 [SEC/аудит B34-02]: очередь извлечения не связана с полномочиями актора — чужой воркер и чужой арендатор дописывают содержимое источника
Закрыт
P0 · горит
ведёт: —
Суть
<!-- BLOCK32-40-L114S-INTAKE-20260909-WEB-587 -->
## ДЛЯ ТИКЕТА — эволюция WEB-515, 09.09, l114s
Условие: B34-02: повторная проверка полномочий актора при захвате ExtractionJob. Существующий тикет координатора; дубликат не создаётся.
История: B34-02 / 3121; 9a5ec5025 и migration manifest 5701c4360 по расписке. Координатор сообщил NO-GO проверки на исходной линии Z; исходный worker report ещё не доставлен в доступный lead inbox. File:line, actual fixture proof и CVSS не выдумывать: AWAITING_REPORT_TRANSFER.
L114S-RELEASE-RECEIPT.md сообщает посадку исправления в l114s 5701c436097e10240a2b8cdd5d87a786b1014def 09.09 18:02Z. Состояние lead: LANDED_COORDINATOR_RECEIPT / INDEPENDENT_PROOF_REVIEW_PENDING. Это не повторное открытие исправленного поведения и не independent closure. Статус workflow и parentId не менялись.
KNOWN ISSUES / ТРАБЛШУТИНГ: исторический tested SHA Z не равен S; до получения отчёта нельзя переносить verdict на текущую линию. Нет разрешения на prod/host operations. Следующий шаг — принять существующий report+artifacts, связать точные proof/commit и записать остаток; не запускать duplicate fix. Связанный эпик WEB-515; intake: ~/audit/outbox/BLOCK32-34-RETURNS-L114S-TRANSFER-AND-DEDUPE-20260909.md.
---
## Эволюция 09.09 (вечер) — полный след для нулевого агента
**Живой прод:** l114u `54243a5cff19ef2bacf2531a0951b7bb82a71633`, посажен 09.09 ~20:0xZ. Откат = l114t `3b1a451cf6cf5b300bd32ce75c9304098448a308`.
**Расписки линий:** `L114S-RELEASE-RECEIPT.md`, `L114T-RELEASE-RECEIPT.md` — лежат в очередях волн на A1/A2/M4 и у security lead в `~/audit/inbox` на M1.
**Обзорный документ эпика энтерпрайза:** https://bugs.wool2.online/labs/enterprise-ent093-20260909.html
**Паспорт, топология парка (добавлен Нео, исправлена строка M4):** https://bugs.wool2.online/passport/03-TOPOLOGY-INFRA.md
**Живой журнал координатора:** `/Users/annakorin/Downloads/OPS-STATUS-LIVE.md` на ноуте владельца.
**Линии, посаженные 09.09:** l114m → l114u, каждая с браузерной пробой открытия документа на проде.
### Авторство задач извлечения — ПОСАЖЕНО
- **Находка (аудит B34-02, security lead):** задача извлечения не связана с полномочиями актора; захват задачи не проверял, на чьих правах публикуется тело. `src/lib/ingest/extractionJobQueue.ts:97-190`, `sourceWriter.ts:166-175`, `prisma/schema.prisma:953-980`.
- **Волна 3216b → GO**, коммит `9a5ec5025 fix(ingest): re-check actor authority when an extraction job is claimed (WEB-587)`.
- **Миграция** `20260909150000_web587_extraction_job_actor_authority`: в `ExtractionJob` добавлены `actorUserId`, `actorTenantId`, `notebookId`, `authorityBoundAt` — все NULL-допустимые; бэкфилл только для строк в статусах `queued`/`running`; `actorTenantId` намеренно оставлен NULL для бэкфилла, чтобы проверка дрейфа арендатора не превратилась в тавтологию.
- **🔴 Гейт P19 остановил сборку l114s:** автор волны добавил миграцию, но не объявил её в `prisma/migration-compatibility-manifest.json`. Координатор объявила её как `expand` (коммит `5701c4360`), baseline → 198 записей, `migrationSetSha256` → `b3d4e83d37d07ffcffa4ba027c8f5381c8f471fa39776bc1207643e5a17267f0`.
- **Вторая ловушка той же посадки:** в `spend-runtime-l114s.env` копировался старый `SPEND_MIGRATION_SET_SHA256` от предыдущей линии → сухой прогон дал `paidReady=false`, `activation_attestation:runtime_comparandum_mismatch`, чат 500. Исправлено ДО флипа. Эта ловушка повторяется на КАЖДОЙ линии с новой миграцией.
- **Посажено:** линия l114s, прод 09.09 18:02Z. Колонки проверены прямым запросом к боевой базе.
Лента
2026-09-09T18:23:48.344Z · astra-securityBLOCK32-40-L114S-INTAKE-20260909 — 2026-09-09T18:23:48.343635+00:00 / IST=2026-09-09T23:53:48.343639+05:30
## ДЛЯ ТИКЕТА — эволюция WEB-515, 09.09, l114s
Условие: B34-02: повторная проверка полномочий актора при захвате ExtractionJob. Существующий тикет координатора; дубликат не создаётся.
История: B34-02 / 3121; 9a5ec5025 и migration manifest 5701c4360 по расписке. Координатор сообщил NO-GO проверки на исходной линии Z; исходный worker report ещё не доставлен в доступный lead inbox. File:line, actual fixture proof и CVSS не выдумывать: AWAITING_REPORT_TRANSFER.
L114S-RELEASE-RECEIPT.md сообщает посадку исправления в l114s 5701c436097e10240a2b8cdd5d87a786b1014def 09.09 18:02Z. Состояние lead: LANDED_COORDINATOR_RECEIPT / INDEPENDENT_PROOF_REVIEW_PENDING. Это не повторное открытие исправленного поведения и не independent closure. Статус workflow и parentId не менялись.
KNOWN ISSUES / ТРАБЛШУТИНГ: исторический tested SHA Z не равен S; до получения отчёта нельзя переносить verdict на текущую линию. Нет разрешения на prod/host operations. Следующий шаг — принять существующий report+artifacts, связать точные proof/commit и записать остаток; не запускать duplicate fix. Связанный эпик WEB-515; intake: ~/audit/outbox/BLOCK32-34-RETURNS-L114S-TRANSFER-AND-DEDUPE-20260909.md.
2026-09-10T17:11:13.192Z · astra-securityBACKLOG64-TRIAGE-20260910-WEB-587 — 2026-09-10T17:11:13.191410+00:00 / IST=2026-09-10T22:41:13.191417+05:30
## ДЛЯ ТИКЕТА — доставка старых отчётов и backlog64
R28: настоящая находка. Z actual terminal extraction authority; existing fix reported landedS.
/Users/poolpooly/audit/inbox/3121-B34-02-REPORT.md
SHA256 b75410304263e658925dad8f747eb326f6b730d87f45aa23a3262963bff123ab
Статус workflow не менялся. Историческая база не переписана наl115a; duplicateSEC/повторныйfixне создан. Current app по координатору: **l115a `8d598d69a663cfa8977816d96bb20303e9a9650c`**; migration set `b3d4e83d37d07ffcffa4ba027c8f5381c8f471fa39776bc1207643e5a17267f0`,198миграций. Это не замена tested SHA в отчётах. Native gateway изменён10.09 16:02Z правкой WEB-597 (`stasisSnoopIngressSpike.js`, `bargeInPlayback.js`) поверх живого снимка; полное равенство репозиторию не заявлено. Правила installed-vs-repo остаютсяWEB-595. Самостоятельных prod/host действий lead не выполнял.
2026-09-15T01:25:06.555Z · coordinator[15.09 01:25Z координатор] ## 15.09 01:40Z — ВОШЁЛ В ПОСАДКУ l115o. Требуется пост-QA на проде.
Прод работает на `l115o-68e25d8d` (коммит `68e25d8df5ae8263c5ac5466353631f57a17cfcc`, артефакт `cd2773f65d66b09ec03d39b553041d2814ce09413e72d72b07bc9de89df536c8`) с 00:56Z 15.09. Посадка проверена: `ready=true`, коммит совпал, браузерная проба открыла документ, 0 новых ошибок.
**Работу по этому тикету принесли волны:** 3718.
**Что это значит для этого тикета.** Работа по нему пролежала принятой, но НЕ посаженной — в некоторых случаях неделями. Теперь она на проде. Приёмка волной доказывала, что код правильный в дереве волны; она НЕ доказывала, что фича работает на живом проде. Это разные вещи, и мы на этом уже обжигались.
**Поэтому статус — `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:01:25.114Z · coordinator[15.09 12:01Z координатор] Post-QA 3993: VERDICT=REVIEW. Evidence 8/8 SHA256 проверены.
На точной l115o защита стоит в исполняемой цепочке: authority проверяется при claim и повторно непосредственно перед записью Source. Focused suites 41/41 PASS; независимые synthetic owner/editor проходят, foreign user/tenant/worker, revoked access и notebook drift отказывают, partial writes на отказе 0. Красный контроль действительно достигает записи и падает при инвертированном ожидании.
Закрывать пока нельзя: после старта l115o production-ветки success/refusal/mismatch не наблюдались, а count queued/running jobs без authority binding отсутствует. Нужен один безопасный operator receipt с этими агрегатами; NOT_OBSERVED не превращать в PASS. Код повторно аудировать не нужно.
2026-09-15T12:40:31.289Z · coordinator[15.09 12:40Z координатор] [15.09 12:40Z координатор] Post-QA 4003 завершена `VERDICT=REVIEW`, не DONE и не REOPEN.
Exact production l115o `68e25d8df…` и ancestry WEB-587 подтверждены. Read-only SQL в транзакции показал queued=0, running=0 и 0 текущих строк без обязательных actor/notebook/authority bindings. Но в окне после l115o journal не содержит ни success, ни fail-closed refusal, ни terminal outcome: все ветки `NOT_OBSERVED`, тишина не PASS.
Evidence 5/5 SHA256 проверено координатором. Один остаток: bounded live canary через штатный ingest — один разрешённый job должен закончиться done, второй после revoke/downgrade должен закончиться failed с `extraction_actor_revoked|downgraded` и без body write. До этой расписки тикет остаётся review.
Report: `/home/wave/waves/4003WEB587RECEIPT-REPORT.md`.
2026-09-15T14:10:44.958Z · coordinator[15.09 14:10Z координатор] [15.09 14:09Z координатор] Post-QA 4027 завершён: VERDICT=DONE, evidence 14/14 SHA256. На exact l115o выполнены два run-owned synthetic extraction job через текущий queue/authority код и disposable PostgreSQL. Положительный job завершён done; после легитимного claim и downgrade editor→viewer терминальный finish отказан, job стал failed с extraction_actor_downgraded, Source.content остался пустым, storedFile отсутствует. Provider/network/live DB/production не использовались, teardown пройден. WEB-587 закрыт.
2026-09-15T22:04:50.073Z · coordinatorДЛЯ ТИКЕТА WEB-587 - сводка под нулевого агента (составлено 2026-09-15, read-only)
Симптом. Очередь извлечения не связана с полномочиями актора: чужой воркер и чужой арендатор могут дописывать содержимое в источник.
Тело - заглушка, и она устарела. Тело датировано 09.09 и прямо пишет: AWAITING_REPORT_TRANSFER, "исходный worker report ещё не доставлен в доступный lead inbox", "File:line, actual fixture proof и CVSS не выдумывать". Следующий шаг в теле - "принять существующий report+artifacts, связать точные proof/commit и записать остаток". Отчёт с тех пор доставлен: 2026-09-10T17:11:13.192Z, BACKLOG64-TRIAGE, /Users/poolpooly/audit/inbox/3121-B34-02-REPORT.md, SHA256 b75410304263e658925dad8f747eb326f6b730d87f45aa23a3262963bff123ab. То есть первый шаг, записанный в теле, уже выполнен, а тело этого не отражает.
Посадка. L114S-RELEASE-RECEIPT.md: фикс в l114s 5701c436097e10240a2b8cdd5d87a786b1014def, 09.09 18:02Z. Состояние на тот момент - LANDED_COORDINATOR_RECEIPT / INDEPENDENT_PROOF_REVIEW_PENDING, то есть не независимое закрытие. Живой прод в теле указан l114u 54243a5c...
Круги приёмки - три, все с фактом:
- 2026-09-15T12:01:25.114Z - пост-QA 3993, VERDICT=REVIEW, evidence 8/8 SHA256. На точной l115o защита стоит в исполняемой цепочке: authority проверяется при claim и повторно непосредственно перед записью Source. Focused сюиты 41/41 PASS; независимые synthetic owner/editor проходят; foreign user/tenant/worker, revoked access и notebook drift отказывают; partial writes на отказе - 0. Красный контроль действительно достигает записи.
- 2026-09-15T12:40:31.289Z - пост-QA 4003, VERDICT=REVIEW ("не DONE и не REOPEN"). Exact production l115o 68e25d8df... и родство WEB-587 подтверждены. Read-only SQL в транзакции: queued=0, running=0, 0 текущих строк без обязательных actor/notebook/authority bindings. Но в окне после l115o журнал не содержит ни успеха, ни fail-closed отказа, ни терминального исхода: все ветки NOT_OBSERVED, "тишина не PASS". Evidence 5/5.
- 2026-09-15T14:10:44.958Z - пост-QA 4027, VERDICT=DONE, evidence 14/14 SHA256. На exact l115o выполнены два run-owned синтетических extraction job через текущий код очереди и authority, на одноразовом PostgreSQL. Положительный job завершён done; после легитимного claim и понижения editor->viewer терминальный finish отказан, job стал failed с extraction_actor_downgraded, Source.content остался пустым, storedFile отсутствует. Provider/network/live DB/production не использовались.
Первый шаг нулевого агента (2 минуты). Ничего чинить не надо. Проверьте одно: что в теле нет живой инструкции "принять существующий report" - она выполнена 10.09, и если вы пойдёте её исполнять, вы сделаете дубликат. Затем допишите в шапку, что закрытие состоялось на l115o распиской 4027 (2026-09-15T14:10:44.958Z, evidence 14/14 SHA256).
Карта документов. /Users/poolpooly/audit/inbox/3121-B34-02-REPORT.md (SHA256 выше); intake ~/audit/outbox/BLOCK32-34-RETURNS-L114S-TRANSFER-AND-DEDUPE-20260909.md; L114S-RELEASE-RECEIPT.md; посадочный коммит l114s 5701c436... Отчёт волны 4027 в карточке полным путём не приложен - дописать.
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-587","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-09-15T14:10:45.403Z