WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-644 · Задача · — · web

Bus factor / BF-03: Разрешённый доступ без владельца

Закрыт P2 ведёт: — эпик: WEB-641
Суть
1. Суть одной фразой: таблица минимальных прав восстановления без владельца — по каждой операции восстановления названы сервис, отдельная учётка/ключ, самый узкий набор прав, вход без владельца, чем проверяется доступ и как отозвать; явно разделено «хватает копии и права скачать» против «нужен контроль аккаунта, копией не заменяется».

2. Где мы сейчас (13.09.2026): карта инфраструктуры WEB-420 (якорь l115j = 133fe00c) разобрана на 12 мест, без которых восстановление невозможно; заполнено 6 строк целиком, 6 строк помечено «уточняет координатор» (публичность репо GitHub, ключ резервного подписанта, отдельная учётка OCI/AWS, роль restore БД, регистратор домена, резервный owner организации). Деление «КОПИЯ (6) / КОНТРОЛЬ АККАУНТА (6)» совпало с принципами WEB-644: контроль-класс — это и есть честный остаток bus-фактора. Резервный подписант остаётся заготовкой (реальный ключ не утверждён владельцем), HUMAN_ACCESS_CONTINUITY остаётся OPEN.

3. Хронология: 12.09 — запрос владельца, остановка волн 18:13Z; 12.09 R2 22:25Z — ждёт второго уполномоченного; 13.09 11:14Z — волна 3673 (OWNER-ACTIONS, тот же набор действий, что WEB-656/657); 13.09 11:32Z — карточка переписана R2 (хранилище — существующий Hetzner с подаккаунтом на чтение, резервный подписант); 13.09 12:06Z — волна 3686 (GO, 44ed3feb) сделала резервного подписанта и заготовку таблицы; 13.09 — волна 3694 заполнила таблицу по карте.

4. Карта документов и кода: заполненная таблица и открытые пункты — 3694-rights-table-fill-out/RIGHTS-TABLE-FILLED.md и OPEN-ITEMS.md (+ NOTES.md, BOARD-APPLY.json); источник фактов — WEB-420 (инфра-карта 13.09) и PROD-FACTS.md; контракт ролей БД — docs/runbooks/DB-LEAST-PRIVILEGE-ROLES.md; механизм резервного подписанта — волна 3686 (refs/waves/3686 = 44ed3feb).

5. Остаток: закрыть шесть строк «уточняет координатор» (публичность репо; утвердить ключ резервного подписанта; отдельная учётка OCI/AWS; роль restore в Postgres; имя регистратора домена; объём резервного owner GitHub); подключить резервного подписанта к реальному гейту восстановления; закрыть HUMAN_ACCESS_CONTINUITY действием второго уполномоченного человека.

6. Критерий закрытия: таблица заполнена по всем операциям восстановления (сейчас 6/12 заполнено, 6/12 «уточняет координатор» — остаток выше); резервный ключ зарегистрирован и проверен пятью проверками (правильная подпись проходит; неверный ключ отклонён; подменённый артефакт отклонён; отозванный ключ отклонён; неразрешённая операция отклонена); оставшиеся ограничения по внешним аккаунтам перечислены явно. Каждый пункт — ссылкой на факт (номер волны/коммита/вывод), не словами «сделано».

---

## история (тело до 13.09.2026)

# WEB-644 — какие права действительно нужны, чтобы работать без владельца

**Переписано 13.09.2026 (R2).**

## СУТЬ
Не раздавать администратора везде «на всякий случай», а составить точную таблицу: операция восстановления → нужный сервис → отдельная учётная запись или ключ → минимальные права → способ входа без владельца → проверка → способ отзыва.

## ПРИНЦИПЫ
- Где достаточно зеркала исходников или права скачать копию — полный администратор не запрашивается.
- Где нужен контроль организации, облачного аккаунта или домена — копией файлов это не подменяется, и если права не настроены, объём остаётся честно открытым.
- Резервный владелец организации на GitHub — отдельное полезное действие для непрерывности владения, оно не заменяется архивом.
- Контакт в мессенджере не является ни проверкой личности, ни разрешением выдать администратора: ключи и отпечатки подтверждаются независимым способом.

## РЕЗЕРВНЫЙ ПОДПИСАНТ
Отдельный постоянный ключ резервного подписанта добавляется в существующий доверенный список после утверждения владельцем. Личный ключ владельца НЕ копируется. Для согласованного аварийного объёма достаточно подписи владельца ИЛИ резерва. Постоянная регистрация ключа не означает бессрочного разрешения: каждая подпись привязана к конкретному артефакту, операции и окружению, ключ отзываем. Первый допустимый объём резерва — восстановление, откат и проверенные выпуски; автоматическое разрешение произвольного нового кода не включается.

## ПРОВЕРКИ, КОТОРЫЕ ОБЯЗАНЫ БЫТЬ
Правильная подпись проходит; неверный ключ отклоняется; подменённый артефакт отклоняется; отозванный ключ отклоняется; неразрешённая операция отклоняется. Команды отзыва и замены сохранены рядом.

## ОТ ВЛАДЕЛЬЦА
Входит в тот же единый список полномочий (см. WEB-657): утвердить резервного подписанта и права хранителя одним решением.

## КРИТЕРИЙ ЗАКРЫТИЯ
Таблица прав заполнена по всем операциям восстановления; резервный ключ зарегистрирован и проверен пятью проверками выше; оставшиеся ограничения по внешним аккаунтам перечислены явно, а не замолчаны.

---

## история (тело до 13.09.2026, схема с покупкой менеджера паролей и наймом инженера — отменена)

TAKEOVER-NC-R1:BF-03
Правила обогащения: WEB-449.

Цель/сдача/приёмка: Реестр ролей и защищённых способов получения доступа без значений секретов. Реальное разрешённое действие независимого получателя; HUMAN_ACCESS_CONTINUITY открыт до проверки другого уполномоченного человека. Новые административные права не выдавать автоматически.

Зависимости: нет
КАРТА ДОКУМЕНТОВ
Полная адаптация: WEB-641; Intel /Users/annakorin/nc-ops-scripts/takeover-20260912/TAKEOVER-NC-R1.md; оригинал Downloads/NC-TAKEOVER-PROOF-R1.md. Связанные WEB-093/626/082/470/515/320.

ЭВОЛЮЦИЯ
12.09.2026: запрос владельца; подготовка на малом ходу, без нового восьмичасового обещания. Экзамен ещё не проведён.

KNOWN ISSUES / ТРАБЛШУТИНГ
Паспорт l115a расходится с последней измеренной l115e; сверить 00-INDEX/CANON с расписками всех служб, обновить канонический снимок и повторить затронутые шаги. Остальные пробелы фиксировать по доказательствам.

## HANDOFF-20260912T1721:WEB-644 — точка входа для нового агента
Правила обогащения: [[WEB-449]]. Наблюдение: 12.09.2026 18:21:36 Europe/Dublin / 17:21:36 UTC. Автор: координатор. История выше сохранена; эту запись читать как текущий handoff на указанное время.

**Задача.** Bus factor / BF-03: Разрешённый доступ без владельца

**Что подтверждено и что остаётся.** Принято0/8 по обязательным критериям эпика.3517 дала карту и drafts с пробелами;3527 — документальный runbook GO, практической проверки нет. Экспорты трёх досок получены; полнота payload вложений и независимое чтение автономного пакета пока не доказаны. Экзамен BF05 NOT_RUN.

**Как устроено / почему остановилось.** Человек/агент начинает только с START и независимой копии. Доступ к текущему чату, M1, Intel или сайту доски не должен быть скрытой зависимостью экзамена. Наличие архива/бандла не доказывает restore. Human access, Web technical, iOS и bitwise — отдельные строки.

**Следующая операция.** Составить реестр ролей и защищённых способов доступа без значений секретов. HUMAN_ACCESS_CONTINUITY остаётся OPEN до действия другого уполномоченного человека; подготовку документации продолжать независимо, новые права автоматически не выдавать.

**Исполнитель и приёмка.** Подготовка пакета — исполнитель BF; coordinator отвечает за входные файлы и отдельный контур. Автор START и оператор blind-экзамена должны различаться.3531 имеет готовый бриф, живой старт M4 на последней wave-health не подтверждён.

**Условие закрытия.** Реестр ролей и защищённых способов получения доступа без значений секретов. Реальное разрешённое действие независимого получателя; HUMAN_ACCESS_CONTINUITY открыт до проверки другого уполномоченного человека. Новые административные права не выдавать автоматически.

**КАРТА ДОКУМЕНТОВ**
- Intel: /Users/annakorin/nc-ops-scripts/takeover-20260912/TAKEOVER-NC-R1.md
- Intel: /Users/annakorin/nc-ops-scripts/ops/busfactor-3531/3531-busfactor-offline-package-brief.md
- Intel: /Users/annakorin/nc-ops-scripts/tick-20260912-recovery/three-board-export-receipt.json
- Intel: /Users/annakorin/nc-ops-scripts/tick-20260912-recovery/3527/3527BUSFACTOROPERATINGRUNBOOK-REPORT.md
- M4: /Users/milamarty/waves/inputs/3531-busfactor-offline-package/ (передачу/SHA проверить); /Users/milamarty/waves/3531BUSFACTOROFFLINEPACKAGE-REPORT.md (ожидаемый)

**Порядок:** BF01/BF02/BF04→BF05→BF06→BF07; BF03 и BF08 ведутся отдельно. Родитель: [[WEB-641]]. Human-access OPEN не останавливает подготовку пакета.


SHIFT-STOP-20260912:FINAL:WEB-644
Bus factor / BF-03: Разрешённый доступ без владельца

Срез перед остановкой 12.09.2026. По поручению владельца 18:13:55 UTC новые волны и экзамены остановлены.
3531 LIMITED_PACKAGE_READBACK_PASS сохранён на Intel: HEAD7c380efb2eccd59162e14239a5d7fde142dd26fa, archive SHA150c3e194528fa45a788b0de9d3de1f4d889c198d306c14b713e7ca3ada1e1f8. Получены48 файлов с hash verification, clean/ancestry/bundle PASS. Package49 files, manifest47, SHA checks48; tamper negative exit1, links0 errors.
Это ограниченный offline package: 3 sanitized board exports, docs/runbook, manifest/SHA/verifier; 5783 attachment references, 0 collected attachment payloads. Полный OFFLINE_KNOWLEDGE PASS не выдан. Bus factor принято0/8, BF05 practical exam NOT_RUN, HUMAN_ACCESS_CONTINUITY OPEN.
Passport l115a stale; package source facts l115e не подтверждают новый l115f-r2. Для operational использования сначала актуализировать release/source/artifact/backup chain и совместимый rollback. Архивные команды обсуждений не выполнять вслепую.
Файлы Intel: /Users/annakorin/nc-ops-scripts/ops/busfactor-3531/3531-collection-receipt.json; delivery/3531BUSFACTOROFFLINEPACKAGE-REPORT.md; readback/package/ (проверенная распаковка). Source archive и bundle остаются на M4; local delivery сохранена.

ИНДИВИДУАЛЬНЫЙ ОСТАТОК
Проверить доступ второго уполномоченного человека без владельца по защищённому каналу. HUMAN_ACCESS_CONTINUITY=OPEN; ключи не включать в пакет.
Следующая смена начинает только после возобновления владельцем. Исторический status сохранён; STOPPED означает отсутствие выполняемой работы, не закрытие задачи.
Чем закрывается (приёмка)
Реестр ролей и защищённых способов получения доступа без значений секретов. Реальное разрешённое действие независимого получателя; HUMAN_ACCESS_CONTINUITY открыт до проверки другого уполномоченного человека. Новые административные права не выдавать автоматически.
Доказательства

HANDOFF-20260912T1721:WEB-644 — автономный handoff добавлен в body: причина, механизм, подтверждённое/OPEN, следующая операция, ответственный, критерий закрытия и карта документов. Срез фактов 2026-09-12T17:21:36.454887+00:00. Исторические отказы и статусы сохранены. Полный аудит записи: Intel /Users/annakorin/nc-ops-scripts/release-l115f/handoff-tickets/.

SHIFT-STOP-20260912:FINAL:WEB-644
Bus factor / BF-03: Разрешённый доступ без владельца

Срез перед остановкой 12.09.2026. По поручению владельца 18:13:55 UTC новые волны и экзамены остановлены.
3531 LIMITED_PACKAGE_READBACK_PASS сохранён на Intel: HEAD7c380efb2eccd59162e14239a5d7fde142dd26fa, archive SHA150c3e194528fa45a788b0de9d3de1f4d889c198d306c14b713e7ca3ada1e1f8. Получены48 файлов с hash verification, clean/ancestry/bundle PASS. Package49 files, manifest47, SHA checks48; tamper negative exit1, links0 errors.
Это ограниченный offline package: 3 sanitized board exports, docs/runbook, manifest/SHA/verifier; 5783 attachment references, 0 collected attachment payloads. Полный OFFLINE_KNOWLEDGE PASS не выдан. Bus factor принято0/8, BF05 practical exam NOT_RUN, HUMAN_ACCESS_CONTINUITY OPEN.
Passport l115a stale; package source facts l115e не подтверждают новый l115f-r2. Для operational использования сначала актуализировать release/source/artifact/backup chain и совместимый rollback. Архивные команды обсуждений не выполнять вслепую.
Файлы Intel: /Users/annakorin/nc-ops-scripts/ops/busfactor-3531/3531-collection-receipt.json; delivery/3531BUSFACTOROFFLINEPACKAGE-REPORT.md; readback/package/ (проверенная распаковка). Source archive и bundle остаются на M4; local delivery сохранена.

ИНДИВИДУАЛЬНЫЙ ОСТАТОК
Проверить доступ второго уполномоченного человека без владельца по защищённому каналу. HUMAN_ACCESS_CONTINUITY=OPEN; ключи не включать в пакет.
Следующая смена начинает только после возобновления владельцем. Исторический status сохранён; STOPPED означает отсутствие выполняемой работы, не закрытие задачи.
Лента
2026-09-12T09:11:17.877Z · coordinator
TAKEOVER-LINKS:BF-03
Parent WEB-641; зависимости нет; полная спецификация в родительском эпике.
2026-09-12T18:27:04.888Z · coordinator
SHIFT-STOP-20260912:FINAL:WEB-644
Bus factor / BF-03: Разрешённый доступ без владельца

Срез перед остановкой 12.09.2026. По поручению владельца 18:13:55 UTC новые волны и экзамены остановлены.
3531 LIMITED_PACKAGE_READBACK_PASS сохранён на Intel: HEAD7c380efb2eccd59162e14239a5d7fde142dd26fa, archive SHA150c3e194528fa45a788b0de9d3de1f4d889c198d306c14b713e7ca3ada1e1f8. Получены48 файлов с hash verification, clean/ancestry/bundle PASS. Package49 files, manifest47, SHA checks48; tamper negative exit1, links0 errors.
Это ограниченный offline package: 3 sanitized board exports, docs/runbook, manifest/SHA/verifier; 5783 attachment references, 0 collected attachment payloads. Полный OFFLINE_KNOWLEDGE PASS не выдан. Bus factor принято0/8, BF05 practical exam NOT_RUN, HUMAN_ACCESS_CONTINUITY OPEN.
Passport l115a stale; package source facts l115e не подтверждают новый l115f-r2. Для operational использования сначала актуализировать release/source/artifact/backup chain и совместимый rollback. Архивные команды обсуждений не выполнять вслепую.
Файлы Intel: /Users/annakorin/nc-ops-scripts/ops/busfactor-3531/3531-collection-receipt.json; delivery/3531BUSFACTOROFFLINEPACKAGE-REPORT.md; readback/package/ (проверенная распаковка). Source archive и bundle остаются на M4; local delivery сохранена.

ИНДИВИДУАЛЬНЫЙ ОСТАТОК
Проверить доступ второго уполномоченного человека без владельца по защищённому каналу. HUMAN_ACCESS_CONTINUITY=OPEN; ключи не включать в пакет.
Следующая смена начинает только после возобновления владельцем. Исторический status сохранён; STOPPED означает отсутствие выполняемой работы, не закрытие задачи.
2026-09-12T22:25:57.452Z · coordinator
[12.09 22:25Z координатор] ОБОГАЩЕНИЕ 12.09 (3572-enrich-web641):
Сделано: ничего не сдано; карточка ждёт второго уполномоченного человека.
На проде: нет.
Доказано: решение владельца 12.09 — второго человека нет, BF-05 экзаменуют три модели разных провайдеров (Claude/Codex/DeepSeek) вслепую (комментарии 20:54Z и 19:32Z).
Осталось: реестр ролей и защищённых способов доступа без секретов; реальное разрешённое действие независимого получателя; HUMAN_ACCESS_CONTINUITY=OPEN; ключи в пакет не включать.
Кто следующий: владелец (доступ/второй человек); документация — координатор параллельно.
Ссылки: /Users/annakorin/nc-ops-scripts/takeover-20260912/TAKEOVER-NC-R1.md; /Users/annakorin/nc-ops-scripts/ops/busfactor-3531/3531-busfactor-offline-package-brief.md; комментарий 4343 (решение владельца 12.09)
Отчёт волны: /Users/milamarty/waves/3572ENRICH*-REPORT.md (M4), копия nc-ops-scripts/shift-20260912-resume/wash-20260912/enrich-collected/.
2026-09-13T11:14:17.675Z · coordinator
[13.09 11:14Z координатор] Волна 3673. OWNER-ACTIONS: продвигается делами №2, №4, №5, №6, №7 на единой странице владельца (3673-owner-actions-single-page-out/OWNER-ACTIONS.md) — тот же набор действий, что и в WEB-656/WEB-657 (назвать хранителя и резервного оператора, завести хранилище ключей и общий диск, дать второй доступ в четырёх сервисах, решить про подпись релиза). HUMAN_ACCESS_CONTINUITY остаётся OPEN до выполнения.
2026-09-13T11:32:38.000Z · coordinator
[13.09 11:32Z координатор] Карточка переписана по упрощённому решению владельца (R2 13.09): без новых обязательных подписок, хранилище — существующий Hetzner с индивидуальным подаккаунтом на чтение, шифрование age на нескольких получателей, вторая копия вне этого хранилища, технический исполнитель — искусственный интеллект самого хранителя (его подписка, не наша). От владельца остаются ровно два действия: назвать хранителя и утвердить один список полномочий.
2026-09-13T12:06:23.325Z · coordinator
[13.09 12:06Z координатор] Волна 3686 (GO, refs/waves/3686 = 44ed3feb) сделала резервного подписанта.
Суть простыми словами: раньше «печать» была одна — владельца. Теперь можно завести вторую постоянную печать для хранителя, и любая из двух одинаково годится. Но у резервной есть предел: ею подтверждаются только возврат резервной копии, откат на прошлую версию и повтор уже проверенного выпуска. Разрешить совсем новый непроверенный код ею нельзя. Каждая подпись привязана к конкретному файлу и конкретному действию: подписью для одной операции нельзя воспользоваться для другой. Печать отзывается и заменяется, команды готовы и проверены на выдуманных тестовых ключах.
Честная оговорка волны: код рабочий и протестированный, но пока не подключён ни к одному реальному гейту восстановления — это заготовка по образцу уже существующего механизма. И настоящий ключ хранителя ещё не утверждён владельцем, в примере лежат вымышленные.
Там же заготовка таблицы минимальных прав: какие сервисы нужны для восстановления без владельца, какие права по минимуму, и где ответа пока честно нет — помечено открытым, а не спрятано.
2026-09-13T12:36:48.398Z · coordinator
[13.09 12:36Z координатор] Волна 3694. 
2026-09-14T17:40:12.103Z · coordinator
[14.09 17:40Z координатор] VERDICT=GO

# WEB-644 / BF-03 «Разрешённый доступ без владельца» — детальный план прав и чек-лист координатора

**Волна 3897.** База `refs/waves/l115n` = `d85bb2dad15a3ba52c773b0a2362748009a2c3b9`, ветка `wave/3897-web644-access-without-owner`. Дата отчёта 2026-09-14.

**Что означает этот VERDICT.** GO относится к составлению детального, исполнимого плана и чек-листа. Сам «доступ без владельца» **НЕ установлен** этой волной: волна — разведка и проект, она не создаёт и не меняет ничего в Hetzner, подаккаунтах, ключах и учётных записях (прямой запрет диспетча). Исполняет координатор по чек-листу, отдельным файлом `3897WEB644-checklist.md`.

**Правило честности, которое действует на весь текст.** Все факты инфраструктуры ниже взяты из прочитанных тикетов/карт/отчётов и помечены «заявлено»; живой доступ к A1/A2/M1/Hetzner/кабинетам у этой волны отсутствует, поэтому ничто на машинах **не проверено отсюда**. Чисел, которых я не получил сам, нет; что карта не отвечает — помечено «уточняет координатор», а не выдумано.

---

## 0. Что прочитано (материал)

- Тело и комментарии **WEB-644** (BF-03) в двух версиях: снимок доски 12.09 (`web-full.json` из офлайн-пакета 3531) и обновлённое тело R2 13.09 + 6 комментариев (`tickets.json` волны 3694/3703).
- **WEB-657** (схема хранения, R2 13.09) и **WEB-656** (репетиция A, R2 13.09) — тело + все комментарии (`tickets.json` волны 3703).
- **WEB-646** (BF-05 самостоятельный прогон) и родитель **WEB-641** (эпик) — тела из снимка доски 12.09.
- Заполненная таблица прав **RIGHTS-TABLE-FILLED.md** и **OPEN-ITEMS.md** (волна 3694).
- Карта инфраструктуры **WEB-420** (тело 13.09) и её перепись волной **3865** (14.09) — свежие факты по машинам/портам/бэкапам.
- `EMERGENCY-KIT-COORDINATOR-STEPS.md`, `rehearsal-v4/README.md`, код `ops/busfactor-kit/` (упаковщик/проверяльщик/подписант) — всё из текущего дерева `l115n`.
- Отчёты смежных волн: 3694 (таблица прав), 3703 (дела владельца), 3706 (итоговый лист BF-07), 3696 (письмо хранителю), 3685/3686 (инструменты комплекта и резервный подписант).

**Что уже решено владельцем (R2 13.09) и ограничивает ответ:**
1. Никаких новых платных подписок — только уже оплаченная инфраструктура.
2. Права именные: каждому хранителю свой доступ, не общий пароль.
3. Второй экземпляр комплекта — обязательно вне основного хранилища (Hetzner).
4. Технический исполнитель — ИИ самого хранителя (его подписка, не наша).
5. От владельца остаются ровно два действия: **назвать хранителя** и **утвердить один список полномочий**.

Хранитель уже назван (13.09 12:10Z, заявлено в комментарии WEB-656): **Слава, fandyy2023@gmail.com**. Резервный оператор-человек не назван — по R2 его роль исполняет ИИ хранителя (см. раздел 5).

Схему хранения (где лежит комплект, как зашифрован age-ом на нескольких получателей, вторая копия) эта волна **не переписывает** — она в WEB-657 и сейчас дорабатывается на другой машине. Ниже ссылаюсь на неё, а детально разбираю **права**: кто, к чему, в каком объёме, что может сломать, как отозвать.

---

## 1. Список доступов, которые нужны, чтобы поднять проект без владельца

Разделяю на два слоя, потому что у них разная цель и разный момент включения:

- **Слой «ПОЛУЧИТЬ» (вход в комплект).** Нужен хранителю-человеку, чтобы скачать и открыть аварийный комплект. Это самое узкое, что должно быть у хранителя всегда, ещё до аварии.
- **Слой «ВОССТАНОВИТЬ» (рабочие права).** Нужны техническому исполнителю (ИИ хранителя, действующему по его поручению), чтобы реально вернуть проект. Эти права именные, заводимые заранее, но включаемые/выдаваемые по сценарию (раздел 4).

Полный набор прав — это 12 строк таблицы волны 3694 (я её не перепридумываю, только дополняю анализом «что сломает / как ограничить / как отозвать») плюс **два входа слоя «ПОЛУЧИТЬ»**, которых в таблице 3694 не было (она была про восстановление, а не про доставку комплекта).

### 1.1 Слой «ПОЛУЧИТЬ» — доступ к самому комплекту

| # | Что / место | Объём | Зачем |
|---|---|---|---|
| П1 | Hetzner Storage Box, каталог `/busfactor-kit/` — индивидуальный подаккаунт хранителя | **только чтение/скачивание** этого каталога | скачать 4 файла комплекта (`kit.tar.age`, `manifest.json`, `manifest.sig.json`, `START-HERE.md`) из основного места |
| П2 | Вторая копия **вне** Hetzner (независимая площадка ИЛИ локальная копия у хранителя) | только чтение/скачивание | скачать те же 4 файла, когда основное место недоступно (обязательное требование R2) |

К ним примыкают **локальные ключи хранителя** (это не «доступ к сервису», а материалы, но без них комплект не открыть):
- **личный `age`-ключ хранителя** — расшифровать `kit.tar.age`;
- **`trusted-signers.json` + дерево проверяльщика + два отпечатка** — проверить подпись манифеста ДО запуска чего-либо из комплекта.

Эти три вещи должны быть у хранителя **до** первого скачивания и **не тем же каналом**, что сам архив (см. WEB-657 и `EMERGENCY-KIT-COORDINATOR-STEPS.md` §6).

### 1.2 Слой «ВОССТАНОВИТЬ» — рабочие права (12 строк)

| № | Операция восстановления | Что / место | Класс | Объём |
|---|---|---|---|---|
| 1 | Вернуть исходный код | GitHub `fandyy2023/0x2ALabs`, ветка `line/current` | КОПИЯ | чтение/клон (read-токен или коллаборатор), без push и прав организации |
| 2 | Вернуть код при недоступности GitHub | бандлы A1 `/home/ubuntu/mirrors/*.bundle` + M4Ext `/Volumes/M4Ext/ops/line-bundles/` | КОПИЯ | чтение/скачивание, ничего не писать |
| 3 | Подписать релиз / откат | ключ резервного подписанта (отдельный Ed25519, не копия owner-ключа) | КОНТРОЛЬ АККАУНТА | подпись конкретного артефакта+операции+окружения; объём = восстановление, откат, повтор проверенного выпуска. НЕ произвольный новый код |
| 4 | Посадить / откатить на проде | боевая A1 (Oracle), `ssh a1nc` | КОНТРОЛЬ АККАУНТА | отдельный sudo-пользователь; sudo только на `systemctl status/restart` юнитов `nc-a1`, `nc-a1-b`, `nc-a1-indexing`, `nc-a1-extraction` и nginx; запуск `land-lNNN.sh`; чтение расписок/артефакта. Без root, без БД-админки, без ключей hetzbk |
| 5 | Поднять машину заново | облако OCI (Oracle) / AWS | КОНТРОЛЬ АККАУНТА | start/stop/console/пересоздание только инстансов A1/A2; не тенант, не биллинг |
| 6 | Вернуть базу в Postgres | БД `noteclone` на A1 `:55432` | КОНТРОЛЬ АККАУНТА | выделенная роль `restore`: CREATE на public + write на таблицы, только база `noteclone` (в карте роли нет — `web_backup` только SELECT/pg_dump) |
| 7 | Скачать WAL+base базы | Hetzner Storage Box `/home/walg-nc/hetzbk-prod/` | КОПИЯ | sftp-read, скачивать сегменты; без записи/удаления/других каталогов |
| 8 | Скачать артефакт релиза | Hetzner `/home/app-artifact/` | КОПИЯ | sftp-read, скачать архив+sha |
| 9 | Вернуть доску | снимок `web-board.sqlite` (A1 mirrors/boards + Hetzner `/home/board-backups/`) | КОПИЯ | скачать `boards-YYYYMMDD.tgz` и сверить sha; без записи в живую доску |
| 10 | Вернуть паспорт | копия паспорта (A1 mirrors + Hetzner) или `docs/PASSPORT` из git | КОПИЯ | скачать/клонировать; без записи в живую публикацию |
| 11 | Вернуть домен/DNS | регистратор доменов `nb.wool2.online`, `sixbyy.com`, `bugs.wool2.online` | КОНТРОЛЬ АККАУНТА | менять DNS-записи этих доменов; без передачи домена, без биллинга |
| 12 | Непрерывность владения кодом | организация GitHub `fandyy2023`, резервный owner | КОНТРОЛЬ АККАУНТА | owner-роль организации (не только write в репо) |

**Разбивка по классам (наследуется из 3694, подтверждаю):** КОПИЯ — 6 строк (1, 2, 7, 8, 9, 10): хватает права скачать. КОНТРОЛЬ АККАУНТА — 6 строк (3, 4, 5, 6, 11, 12): копией не заменяется, это честный остаток bus-фактора.

**Кто выдаёт каждую строку:** во всех случаях — владелец (держатель соответствующего сервиса), и во всех выдача требует личного подтверждения владельца. Для «КОПИЯ» подтверждается «выдать право скачать», для «КОНТРОЛЬ АККАУНТА» — «выдать контроль учётки».

**Что карта не отвечает (уточняет координатор, не выдумано):**
- **O1** — публичный или приватный репозиторий GitHub (от этого зависит, нужно ли вообще выдавать read или хватит `git clone`);
- **O2** — настоящий ключ резервного подписанта (в заготовке 3686 лежат вымышленные тестовые ключи);
- **O3** — способ завести отдельную учётку облака, ограниченную A1/A2;
- **O4** — какая роль получит restore-права БД (роли `restore` в наборе нет);
- **O5** — имя регистратора доменов и где лежит DNS;
- **O6** — входит ли резервный owner GitHub в минимальный объём и как оформить.

---

## 2. Что хранитель сможет сломать каждым правом — и как это ограничить

Принцип из WEB-644: «Права, выданные на всякий случай, — это и есть дыра.» Ниже по каждой строке — главный вред и ограничение.

| # | Что сможет сломать, получив это | Как ограничить |
|---|---|---|
| П1 | Если подаккаунт получит запись/удаление — сотрёт сам комплект или, хуже, при расширении на соседние каталоги — бэкапы и артефакты | подаккаунт **только чтение**, **только `/busfactor-kit/`**, без прав на аккаунт и оплату; негативная проверка обязательна (не может удалить и не видит соседние каталоги) |
| П2 | Ничего на основной инфраструктуре (это внешняя/локальная копия); риск — только в том, что копия устареет или совпадёт с Hetzner | место фиксируется, дата и версия копии записываются в манифест; две папки на одном Storage Box **не** считаются второй копией |
| 1 | Read-токен GitHub сам по себе не даёт сломать код; риск — если выдать push или права организации | read без push, без настроек репо, без прав организации; отзыв = снять коллаборатора/токен |
| 2 | Чтение бандлов не ломает ничего; риск только в том, что бандл устарел | ничего не писать; сверять `git bundle verify` и sha с расписками |
| 3 | **Резервный подписант** — если разрешить произвольный новый код, хранитель/его ИИ посадит что угодно в прод. Это самая опасная строка | подпись привязана к артефакту+операции+окружению; объём = восстановление, откат, повтор проверенного выпуска; НЕ произвольный новый код; 5 проверок обязаны быть: верная подпись проходит, неверный ключ/подменённый артефакт/отозванный ключ/неразрешённая операция — отклоняются |
| 4 | **ssh+sudo на A1** — полный sudo/root = удалить БД, выключить прод, увести ключи hetzbk, затронуть чужие деревья | отдельный пользователь, sudo **только** на перечисленные юниты+nginx и `land-lNNN.sh`; без root, без БД-админки, без ключей hetzbk, без чужих деревьев; посадка только через штатный скрипт |
| 5 | Полный тенант облака = удалить/пересоздать чужие инстансы, крутить биллинг | учётка/IAM ограничена инстансами A1/A2; без биллинга, без чужих ресурсов |
| 6 | Роль `restore` с `DROP`/`SUPERUSER` = стереть всю базу; write без границ = порча данных | CREATE на public + write на таблицы **только базы `noteclone`**; без DROP базы, без SUPERUSER, без других баз |
| 7 | Запись/удаление в hetzbk = уничтожить историю бэкапов (WAL) | sftp-read только; скачивать сегменты; без записи/удаления/других каталогов |
| 8 | Запись в артефакты = подменить релизный архив | sftp-read только, скачать архив+sha и сверить с записью посадки |
| 9/10 | Запись в живую доску/паспорт = подменить знания оператора | только скачать снимок/копию и сверить sha; без записи в живую публикацию |
| 11 | Полный контроль домена = увести домен, поменять MX и забрать почту | доступ только к DNS-записям этих доменов; без передачи домена, без биллинга |
| 12 | Второй owner организации = выгнать владельца, увести репозиторий | owner-роль минимальна по самому назначению (непрерывность владения); это решение владельца, не автоматическое; отзыв = снять owner |

**Два системных ограничения, которые снимают самые дорогие риски целиком:**
1. **Дорме­nt-права вместо выдачи навсегда.** Права класса «КОНТРОЛЬ АККАУНТА» (строки 3–6, 11, 12) заводятся заранее, но реально активируются/выдаются только по подтверждённому сценарию «владелец недоступен» (раздел 4). Пока владелец на связи — хранитель держит только слой «ПОЛУЧИТЬ» (скачать комплект), а не контроль учёток.
2. **Проверка происхождения до исполнения.** Что бы хранитель/его ИИ ни скачал, он обязан сперва проверить подписанный манифест по заранее доверенному ключу (`trusted-signers.json` вне архива), и только потом исполнять. `verify_kit.py` останавливает процесс на повреждённом файле, неверной подписи, неизвестном ключе, слишком старой версии (и, добавлено волной 3811, на комплекте без подписанного `START-HERE`). Подмена через «подсказку» в `START-HERE` больше не проходит: `START-HERE.md` теперь входит в подписанную опись (закрыто волной 3811; прежний пробел, описанный в `EMERGENCY-KIT-COORDINATOR-STEPS.md` как «START-HERE не подписан», устарел).

---

## 3. Отзыв: как забрать доступ обратно

Требование WEB-644: схема, где отозвать нельзя, не годится. Разбор по трём уровням.

### 3.1 Отзыв по каждой строке (сводно)

| Строка | Как отозвать |
|---|---|
| П1, 7, 8, 9, 10 (Hetzner read-подаккаунты) | удалить подаккаунт / сменить его ключ в панели Hetzner |
| П2 (вторая копия) | сменить место/удалить доступ к площадке или стереть локальную копию у хранителя |
| 1, 12 (GitHub read / owner) | снять коллаборатора / снять owner-роль / удалить read-токен |
| 2 (бандлы) | снять read на каталог (ssh-read на A1 или файловый доступ к M4Ext) |
| 3 (резервный подписант) | отозвать/заменить ключ: команды отзыва и замены уже есть рядом с заготовкой 3686 (`revoke`/`replace`); переподписать доверенный список |
| 4 (ssh/sudo на A1) | удалить sudo-правило / удалить пользователя |
| 5 (облако) | снять права IAM / удалить учётку |
| 6 (роль restore БД) | `DROP ROLE` / `REVOKE` на public |
| 11 (регистратор DNS) | снять доступ к DNS / удалить учётку |

### 3.2 Отзыв комплекта — важная тонкость, которую нельзя пропустить

Удаление хранителя из `recipients.txt` и пересборка комплекта **не отзывают доступ к уже скачанным старым архивам** (R2 §3, зафиксировано в `EMERGENCY-KIT-COORDINATOR-STEPS.md` §7). Хранитель, однажды скачавший `kit.tar.age` и имеющий свой `age`-ключ, сможет расшифровать старый архив и после удаления из списка.

Поэтому отзыв хранителя — это **два действия сразу**:
1. убрать его из `recipients.txt`, пересобрать комплект с новой версией;
2. **сменить реальные секреты и права**, которые он мог видеть (ротация ключей/паролей, к которым у него был доступ), а не только пересобрать архив.

### 3.3 Проверка отзыва (не только выдать, но и доказать, что отняли)

Отзыв считается сделанным, когда **негативная проверка** прошла: бывший хранитель своим прежним входом **не** может скачать (подаккаунт удалён → отказ), не может подписать (ключ отозван → подпись отклоняется) и не может войти (учётка удалена). Позитивная проверка «у него получилось скачать» недостаточна — нужна и негативная. Это правило повторено в чек-листе (шаг отзыва).

---

## 4. «Владелец недоступен временно» против «недоступен навсегда»

Это два разных сценария, и путать их опасно. Временная недоступность **не должна** открывать полный доступ.

### 4.1 Временно (отпуск, болезнь, потерян телефон, нет связи день-неделю)

- **Что открывается:** только слой «ПОЛУЧИТЬ» — хранитель имеет возможность скачать и расшифровать комплект, прочитать `START-HERE` и ранбук, понять, что происходит. Это и есть его постоянная роль: он «держатель», а не «оператор».
- **Что НЕ открывается:** контроль учёток (строки 3–6, 11, 12) не активируются. Технический исполнитель (ИИ хранителя) **не** получает ssh/restore/подпись/облако.
- **Почему так:** при краткой недоступности владельца полный доступ = «украли телефон → полный захват проекта». Резервный подписант по R2 и так ограничен объёмом (восстановление/откат/проверенный выпуск), но даже его ввод в действие должен запускаться по сценарию, а не «владелец не ответил сутки».
- **Допустимое действие в этом режиме:** если в отсутствие владельца случилась поломка, требующая немедленного отката, — откат на последний проверенный выпуск через резервного подписанта (заранее согласованный объём), а не новая разработка.

### 4.2 Навсегда (смерть, недееспособность, исчезновение)

- **Что открывается:** полный сценарий передачи. Активируются дорме­nt-права (строки 3–6, 11, 12), ИИ хранителя по ранбуку проходит цепочку: восстановление → проверка БД/файла/ключей → вход/чтение/сохранение/перезапуск/readback → чистая сборка → тестовая посадка/откат → диагностика одного отказа (объём BF-05).
- **Что остаётся ограниченным даже здесь:** резервный подписант по-прежнему не подписывает произвольный новый код — только восстановление, откат, повтор проверенного выпуска. Полная «власть делать что угодно» не передаётся вообще — это граница, которую нельзя замазать (WEB-657: «шифрование не создаёт прав в чужом сервисе»).

### 4.3 Кто решает, что «навсегда», и чем это защищено — **открытый вопрос (уточняет владелец)**

Механизма переключения «временно → навсегда» в прочитанном материале **нет**. В WEB-656 (до переписывания R2) это был явный пункт решений владельца: «Что считается аварией и кто запускает процедуру, когда владелец не отвечает» и «допустимый срок получения доступа». В R2-версии этот пункт не закрыт. Отсюда честный вывод: **триггер передачи управления сейчас не определён** — и это блокер, который закрывается только решением владельца (см. раздел 7, пункт W3). По умолчанию предлагаю (на утверждение владельцу): фиксированный порог неответа + независимый подтверждающий (не хранитель), и только после этого — активация слоя «ВОССТАНОВИТЬ»; до порога — только «ПОЛУЧИТЬ».

---

## 5. Что, если хранитель не справится: есть ли второй

**Честный ответ: второго человека нет.** Это самый серьёзный остаток bus-фактора, и он не закрыт.

- **Назван ровно один хранитель** — Слава (fandyy2023@gmail.com), 13.09 12:10Z. Второго хранителя нет.
- **Резервный оператор (инженер) — не человек.** По R2 технический исполнитель = ИИ самого хранителя (его подписка). То есть «операторская часть» не закреплена за вторым независимым человеком.
- **Шифрование комплекта** сейчас, по гейту `pack_kit.py` «минимум два получателя», требует минимум два ключа: **владелец + хранитель**. Если владелец недоступен навсегда, открыть комплект может только Слава. Если при этом и Слава не справится (потерял ключ, ушёл, заболел, не смог запустить ИИ) — комплект **не открывает никто**.
- **Вывод без смягчения:** человеческая непрерывность упирается в одного человека. Это ровно то, что WEB-641 называет `HUMAN_ACCESS_CONTINUITY = OPEN`, и волна этот статус не меняет.

**Что это означает для плана (рекомендация, не факт):** чтобы снять точку отказа, владелец должен назвать **второго независимого хранителя** (своим `age`-ключом и своим read-подаккаунтом) и вписать его в `recipients.txt` — тогда комплект откроет любой из них, и потеря одного хранителя не теряет всё. Это решение владельца (раздел 7, пункт W2). Пока второго нет — в итоговом листе (BF-07) строка «человеческий доступ» должна оставаться «не сделано», а не краситься в зелёное.

---

## 6. Чек-лист для координатора

Полный пронумерованный чек-лист — отдельным файлом **`3897WEB644-checklist.md`**. Каждый шаг там содержит три вещи, как просил владелец: **что сделать руками → чем проверить результат → что считается сделанным**. Здесь — только каркас из 12 шагов:

1. Завести хранителю Hetzner read-подаккаунт на `/busfactor-kit/`.
2. Создать и зафиксировать вторую копию вне Hetzner.
3. Получить `age`-публичный ключ хранителя, сверить отпечаток вне канала связи.
4. Пересобрать комплект (получатели: владелец + хранитель), подписать реальным ключом владельца.
5. Передать хранителю `trusted-signers.json` + дерево проверяльщика + два отпечатка (другим каналом).
6. Залить комплект в основное место и во вторую копию.
7. Провести репетицию A с хранителем (его устройство, без помощи владельца) — обе ветки.
8. Негативная проверка: хранитель не может удалить и не видит соседние каталоги.
9. Утвердить и зарегистрировать ключ резервного подписанта (закрыть O2).
10. Завести дорме­nt-права слоя «ВОССТАНОВИТЬ» (ssh/sudo, restore-роль, облако, GitHub read, регистратор).
11. Провести тренировку отзыва одного права и убедиться, что доступ действительно исчез.
12. Обновить итоговый лист BF-07 с честными статусами (включая HUMAN_ACCESS_CONTINUITY = OPEN, пока нет второго).

---

## 7. Чего эта волна сделать не может (нужны секреты / root / кабинет / решение владельца)

Всё перечисленное — за пределами волны; исполняет координатор или владелец. Волна ничего из этого **не выполняла и не проверяла на боевых значениях**.

- **W1. Секреты и ключи.** Подпись боевого комплекта реальным ключом владельца; генерация/регистрация реального ключа резервного подписанта; значения любых секретов. Волна работает только с именами учёток/ключей/ролей, значения не печатаются.
- **W2. Решение владельца: второй хранитель.** Назвать второго независимого человека (или подтвердить, что его не будет и риск принимается). Это закрывает `HUMAN_ACCESS_CONTINUITY`.
- **W3. Решение владельца: триггер «временно → навсегда».** Что считается аварией, кто запускает передачу, допустимый срок неответа. Без этого сценарий раздела 4 не включается.
- **W4. Кабинеты провайдеров.** Создание/ограничение Hetzner-подаккаунтов (панель Hetzner), отдельная учётка OCI/AWS, второй owner организации GitHub, доступ к DNS у регистратора — всё это делается в кабинетах, к которым у волны нет доступа.
- **W5. root/админ на боевых машинах.** Создание sudo-пользователя и sudo-правил на A1, роли `restore` в Postgres (`DROP ROLE`/`REVOKE`/`CREATE ROLE`), настройка ssh — нужен root/postgres-админ на A1 (запрещено: SSH на другие машины, sudo).
- **W6. Реальная репетиция A (WEB-656).** Она требует живого хранителя на его устройстве; волна не проводит её и не может доказать «доступ без владельца работает».
- **W7. Закрытие шести открытых пунктов карты O1–O6** (публичность репо, ключ резерва, учётка облака, роль restore, регистратор, объём резервного owner) — это решения/данные владельца и координатора, не выдумываются волной.

---

## ДЛЯ ТИКЕТА — детским языком, полный след

**Что просили.** Сделать так, чтобы назначенный человек (хранитель) мог получить аварийный комплект и поднять проект, когда владельца нет, — но не получил лишнего. И написать это **детально, по шагам**, чтобы координатор мог исполнить без догадок.

**Что решено (владельцем, R2 13.09).** Не покупать ничего нового — использовать то, что уже оплачено (Hetzner). Права у каждого свои, не общий пароль. Второй экземпляр комплекта — обязательно не там же, где первый. Работу по восстановлению выполняет ИИ самого хранителя (его подписка). От владельца нужно ровно два: назвать хранителя и утвердить список полномочий. Хранитель назван — Слава.

**Что я сделал.** Прочитал все карточки (WEB-644/656/657/646/641), таблицу прав волны 3694 и свежую карту инфраструктуры, и собрал детальный план. Разделил доступ на два слоя: **«получить»** (скачать и открыть комплект — это у хранителя всегда) и **«восстановить»** (рабочие права: ssh, база, облако, подпись, домен — заводятся заранее, но включаются только по сценарию). По каждому праву написал: зачем оно, что им можно сломать, как это ограничить и как отозвать. Отдельно разобрал главное различие, которое нельзя путать: **владелец недоступен временно** (хранитель только держит комплект, полный доступ не открывается) против **навсегда** (тогда и только тогда включаются рабочие права, и даже тогда подпись не разрешает новый код — только откат/восстановление/повтор проверенного). Отдельно честно написал: **второго хранителя нет**, человеческая цепочка упирается в одного человека, и это не закрыто.

**Почему так.** Потому что «выдать администратора на всякий случай» — это и есть дыра: тогда украденный телефон или короткое отсутствие владельца превращаются в полный захват. Поэтому минимум прав, именные учётки, отзыв у каждого, и две скорости доступа.

**ГДЕ ГРАНИЦА.** Эта волна — только план. Она **ничего не создала и не поменяла** в Hetzner, подаккаунтах, ключах и учётных записях (запрещено). Доступ без владельца **не установлен**: всё, что требует секретов, root, кабинетов провайдеров или решения владельца (второй хранитель, триггер «навсегда», шесть открытых пунктов карты, реальная репетиция) — вынесено в раздел 7 и остаётся за координатором/владельцем. Что не проверено отсюда (живые машины, кабинеты) — помечено «заявлено», а не «доказано».

**Что осталось открытым.** (1) Нет второго хранителя → человеческий доступ = один человек. (2) Нет триггера «временно → навсегда». (3) Шесть открытых пунктов O1–O6 (публичность репо, ключ резерва, учётка облака, роль restore, регистратор, резервный owner). (4) Реальная репетиция A не проведена. (5) Резервный подписант — заготовка с вымышленными ключами, к боевому гейту не подключён. Все пять — в чек-листе и в KNOWN ISSUES ниже.

---

## KNOWN ISSUES

1. **Второго хранителя нет.** Назван один — Слава. При постоянной недоступности владельца и сбое хранителя комплект не откроет никто. `HUMAN_ACCESS_CONTINUITY = OPEN`. Закрывается только решением владельца (W2).
2. **Триггер «временно → навсегда» не определён.** Нет правила, кто и когда включает слой «ВОССТАНОВИТЬ». Открытый вопрос владельца (W3).
3. **Шесть открытых пунктов карты O1–O6** (3694) не закрыты: публичность репо, ключ резервного подписанта (реальный не утверждён), учётка облака, роль `restore` БД, регистратор домена, объём резервного owner GitHub.
4. **Резервный подписант — заготовка.** Код 3686 рабочий и тестированный, но на вымышленных ключах и не подключён к боевому гейту восстановления (заявлено волной 3686, не проверено отсюда).
5. **Репетиция A не проведена.** Вся цепочка проверена координатором 13.09 на боевом хранилище, но на учебных ключах и без живого хранителя; реальная репетиция (WEB-656) и вторая копия вне Hetzner — не сделаны (заявлено в комментариях 13.09, не проверено отсюда).
6. **Факты инфраструктуры — «заявлено», не «измерено».** Все IP, порты, имена машин, роли БД, пути бэкапов взяты из карты WEB-420 (13.09) и её переписи 3865 (14.09). С этой машины живой доступ к A1/A2/M1/Hetzner/кабинетам отсутствует — превратить «заявлено» в «доказано» можно только живым прогоном с машин (SSH запрещён диспетчем).
7. **Карта подвижна.** Свежая карта 3865 опровергла строку «A2 = standby с лагом ~0» (standby по паспорту — Pi `:55433`; A1→A2 закрыто). Значит, и этот план прав надо перечитывать против карты перед исполнением, а не исполнять вслепую.
8. **Отзыв хранителя не покрывается пересборкой.** Удаление из `recipients.txt` не отзывает уже скачанные старые архивы; обязательна ротация реальных секретов (раздел 3.2).

---

## Выход и evidence

- Чек-лист: `/Users/milamarty/waves/3897WEB644-checklist.md`.
- Evidence: `/Users/milamarty/waves/3897WEB644-evidence/` (SHA256SUMS внутри) — копии входных фактов, на которые опирается отчёт.
- Bundle: `/Users/milamarty/waves/3897WEB644.bundle` (+ `.bundle.sha256`), от линии `--not refs/waves/l115n`.
  - Голова бандла: `c06bbdfbb0b7f1bdfd02c900c97ebee26b553e8a refs/heads/wave/3897-web644-access-without-owner` (`git bundle list-heads`).
  - База: `d85bb2dad15a3ba52c773b0a2362748009a2c3b9` (`refs/waves/l115n`), требуется бандлом.
  - `git bundle verify` → `is okay`.
  - SHA256 бандла: `0d1b2b1b8d79103695186ae92718c2778560da43926e25e1b3f5c56f5cbcf705`.
2026-09-14T17:40:13.371Z · coordinator
[14.09 17:40Z координатор] # Чек-лист координатора — WEB-644 / BF-03: разрешённый доступ без владельца

Каждый шаг в формате: **что сделать руками → чем проверить → что считается сделанным.**
Исполнять по порядку. Шаги 1–8 — слой «ПОЛУЧИТЬ» + репетиция A; шаги 9–12 — слой «ВОССТАНОВИТЬ» и отзыв. Везде, где точное имя/путь неизвестны, — «уточняет координатор», а не угадано.

---

## 1. Завести хранителю индивидуальный Hetzner-подаккаунт на чтение каталога комплекта

- **Что сделать руками:** в панели Hetzner Storage Box (`u65664`) создать отдельный подаккаунт для хранителя (Слава). Ограничить: только чтение/скачивание, только каталог `/busfactor-kit/`. Не давать удаление, не давать другие каталоги, не давать доступ к аккаунту/оплате. Протокол (SSH/SFTP/WebDAV/Samba/Borg) — выбрать под устройство хранителя.
- **Чем проверить:** хранитель со своего устройства скачивает один файл из `/busfactor-kit/`; затем пытается удалить его (должен получить отказ) и пытается увидеть соседние каталоги (должен не увидеть). Негативная проверка обязательна, не только позитивная.
- **Считается сделанным:** скачивание прошло, удаление и просмотр соседних каталогов — отказаны; путь каталога и имя подаккаунта записаны в манифест следующей сборки (`copies[].location`, `kind:"primary"`).

## 2. Создать и зафиксировать вторую копию вне Hetzner

- **Что сделать руками:** выбрать одно конкретное место, независимое от Hetzner (существующая независимая площадка ИЛИ локальная копия у хранителя). Скопировать туда все 4 файла комплекта (`kit.tar.age`, `manifest.json`, `manifest.sig.json`, `START-HERE.md`). Две папки на одном Storage Box второй копией не считаются.
- **Чем проверить:** хранитель повторяет получение и проверку ЧЕРЕЗ вторую копию, считая основное место условно недоступным (это ветка репетиции A, шаг 7).
- **Считается сделанным:** вторая копия физически отдельна от Hetzner; дата и версия копии зафиксированы; хранитель достал комплект из неё без основного места.

## 3. Получить `age`-публичный ключ хранителя и сверить отпечаток вне канала

- **Что сделать руками:** хранитель один раз выполняет `age-keygen` на своём устройстве, сохраняет приватный ключ и его офлайн-копию у себя, передаёт координатору ТОЛЬКО публичный ключ `age1...` и его отпечаток — по каналу, независимому от того, где был получен контакт. Координатор добавляет ключ в `recipients.txt`. SSH-ключ здесь не годится (`pack_kit.py` откажет не-`age1...`).
- **Чем проверить:** отпечаток публичного ключа сверен независимым способом (голосом/при личной встрече) и зафиксирован рядом с именем хранителя. Код ловит повтор одного и того же ключа под разными написаниями — если один человек прислал несколько «разных» ключей, это ловит только ручная сверка отпечатка от живого человека.
- **Считается сделанным:** в `recipients.txt` — публичные ключи владельца и каждого хранителя; каждый отпечаток подтверждён независимо; приватный ключ хранителя в общую директорию не попадал.

## 4. Пересобрать и подписать боевой комплект

- **Что сделать руками:** прогнать `python3 ops/busfactor-kit/pack_kit.py` без флага `--allow-single-recipient` (гейт «минимум два получателя»: один получатель — отказ RC=2). Подписать манифест отдельным шагом `sign_manifest.py` **реальным ключом владельца** на его доверенном устройстве (не репетиционным).
- **Чем проверить:** `pack_kit.py` собрал комплект и не выдал `REFUSED: recipients file has exactly ONE recipient…`; `verify_kit.py verify` на этом пакете возвращает `"ok":true`, RC=0 и **пустое поле `warnings`**. Непустой `warnings` на боевом комплекте — ошибка выдачи.
- **Считается сделанным:** комплект подписан ключом владельца, проверяется с RC=0 без предупреждений; в `recipients.txt` два и более различных получателя.

## 5. Передать хранителю доверенный материал и два отпечатка (другим каналом)

- **Что сделать руками:** до первого скачивания передать хранителю, НЕ тем же каналом, что архив: (а) `trusted-signers.json`; (б) дерево проверяльщика из трёх файлов целиком (`ops/busfactor-kit/verify_kit.py`, `ops/busfactor-kit/canonical_trust.py`, `ops/web409/trust.py` — плоская раскладка даёт `ModuleNotFoundError`); (в) два отпечатка лично/голосом/на бумаге — отпечаток дерева проверяльщика и отпечаток `trusted-signers.json`.
- **Чем проверить:** хранитель сам посчитал оба отпечатка, сравнил с переданными числами и подтвердил совпадение ДО первого запуска проверяльщика; переписал оба числа во второе место (бумага теряется).
- **Считается сделанным:** у хранителя локально лежат проверяльщик и доверенный список; оба отпечатка сошлись по независимому каналу; менять эти файлы дальше только плановыми выпусками.

## 6. Залить комплект в основное место и во вторую копию

- **Что сделать руками:** положить 4 файла в `/busfactor-kit/` на Hetzner и в место второй копии (шаг 2). Если правится `start_here_template.ru.md` и появляется новое подставляемое значение — тем же коммитом обновить список из семи значений в `rehearsal-v4/REHEARSAL-STEPS-v4.md` (шаг 5): `kit_version`, `created_at`, `release_sha256`, `copies[primary].location`, `copies[secondary].location`, `archive.sha256`, `archive.filename`.
- **Чем проверить:** скачать комплект в чистый каталог и прогнать `verify_kit.py` против доверия ВНЕ пакета → PASS; отдельно сверить семь подставляемых значений `START-HERE.md` с `manifest.json` (START-HERE теперь входит в подписанную опись — проверяется и им).
- **Считается сделанным:** в обоих местах лежит одна и та же версия комплекта, проверка проходит из чистого каталога; пути обеих копий зафиксированы в манифесте.

## 7. Провести репетицию A с хранителем (обе ветки)

- **Что сделать руками:** хранитель на СВОЁМ устройстве, без помощи владельца и без подсказок координатора: открывает `START-HERE` → скачивает пакет из основного места → проверяет подпись заранее доверенным ключом → расшифровывает своим ключом → запускает предусмотренную процедуру → повторяет получение через вторую копию, считая основное место недоступным.
- **Чем проверить:** журнал шагов (кто, с какого устройства, сколько времени, где застрял); отпечатки проверенного манифеста; подтверждение получения из второй копии. Каждый шаг, где понадобилась помощь владельца/его телефон/аккаунт/подсказка, — дефект процедуры.
- **Считается сделанным:** обе ветки пройдены с сохранёнными доказательствами и НУЛЕВЫМ обращением к владельцу. (Честная граница: репетиция владельцем НА СЕБЕ доказывает, что комплект работает и инструкция понятна, но не передачу управления второму человеку — хранитель и владелец в этом случае одно лицо.)

## 8. Негативная проверка прав хранителя

- **Что сделать руками:** отдельно от репетиции подтвердить, что хранитель со своим входом НЕ может удалить файлы комплекта и НЕ видит каталоги бэкапов/артефактов/доски на том же Storage Box.
- **Чем проверить:** попытка удаления → отказ; листинг соседних каталогов → пусто/отказ.
- **Считается сделанным:** отказ зафиксирован; если отказ не получен — вернуться к шагу 1 и пересоздать подаккаунт уже.

## 9. Утвердить и зарегистрировать ключ резервного подписанта (закрыть O2)

- **Что сделать руками:** владелец утверждает одного резервного подписанта; его Ed25519-ключ (не копия ключа владельца) заносится в боевой доверенный список; объём = восстановление, откат, повтор проверенного выпуска, НЕ произвольный новый код.
- **Чем проверить:** пять проверок WEB-644: верная подпись проходит; неверный ключ отклоняется; подменённый артефакт отклоняется; отозванный ключ отклоняется; неразрешённая операция отклоняется. Команды отзыва/замены сохранены рядом.
- **Считается сделанным:** реальный ключ резерва зарегистрирован и прошёл все пять проверок; личный ключ владельца не копировался.

## 10. Завести дорме­nt-права слоя «ВОССТАНОВИТЬ» (не активируя до сценария)

- **Что сделать руками:** по одной строке таблицы (раздел 1.2 отчёта): read-доступ GitHub (`fandyy2023/0x2ALabs`, `line/current`) ИЛИ доступ к бандлам; отдельный sudo-пользователь на A1 (sudo только на юниты `nc-a1`, `nc-a1-b`, `nc-a1-indexing`, `nc-a1-extraction`, nginx + `land-lNNN.sh`); выделенная роль `restore` в Postgres (CREATE на public + write, только `noteclone`); учётка облака, ограниченная A1/A2; read-подаккаунт на WAL/артефакты Hetzner; доступ к DNS у регистратора; (по решению владельца) резервный owner GitHub.
- **Чем проверить:** для каждого права — команда из карты (например `git ls-remote`, `systemctl status nc-a1`, dry-run `pg_restore`, `dig` домена); и негативная — право не выходит за свой минимум (нельзя писать/удалять/менять настройки).
- **Считается сделанным:** каждое право заведено именным, минимальным, с подтверждением владельца и с записанным способом отзыва. Шесть открытых пунктов O1–O6 при этом закрываются фактами владельца/координатора, а не гаданием.

## 11. Провести тренировку отзыва одного права

- **Что сделать руками:** выбрать одно право (например, Hetzner-подаккаунт из шага 1) и отозвать его (удалить подаккаунт / сменить ключ), затем убрать хранителя из `recipients.txt`, пересобрать комплект с новой версией и сменить реальные секреты, которые он мог видеть.
- **Чем проверить:** бывший хранитель прежним входом не может скачать; подпись отозванным ключом отклоняется; учётка не входит. Негативная проверка — обязательна.
- **Считается сделанным:** доступ реально исчез (не только пересобран архив); процедура отзыва отработана и записана.

## 12. Обновить итоговый лист BF-07 честными статусами

- **Что сделать руками:** внести в итоговый лист передачи управления фактические статусы пяти позиций (доступ к обеим копиям, расшифровка/проверка, резервная подпись, агентное исполнение, права на внешние аккаунты).
- **Чем проверить:** каждая позиция со ссылкой на факт (номер волны с вердиктом, вывод команды, файл доказательства), а не фраза «сделано».
- **Считается сделанным:** `HUMAN_ACCESS_CONTINUITY` остаётся `OPEN`, пока не назван второй независимый хранитель; ни одна позиция не покрашена в зелёное авансом.

---

## Чего чек-лист НЕ закрывает (нужны секреты/root/кабинет/решение владельца)

См. раздел 7 отчёта: W1 (секреты и ключи), W2 (второй хранитель), W3 (триггер «временно → навсегда»), W4 (кабинеты провайдеров), W5 (root/админ на A1 и роль БД), W6 (реальная репетиция), W7 (закрытие O1–O6). Эти пункты координатор исполняет не руками волны, а решениями владельца и доступами, которых у волны нет.
2026-09-14T20:01:43.345Z · coordinator
[14.09 20:01Z координатор] # РЕПЕТИЦИЯ A: локальная часть пройдена ЦЕЛИКОМ. Граница названа точно

Владелец, выступая хранителем, скормил папку обычному ИИ. Результат:

- **подлинность проверена:** `ok: true`, версия `2026.09.14-r2`;
- **архив расшифрован** локальным `проверка/bin/age`;
- **книга восстановления и вопросы экзамена прочитаны**;
- ⭐ **боевые команды не запускались** — исполнитель остановился ровно там, где велено.

Это закрывает шаги 1–4 из пяти. Напомню, чего стоило до этого: первый прогон встал на шаге 3 (`UNKNOWN_KEY` — я собрала доверенный список без открытого ключа), второй — на отсутствии `age` (Homebrew потребовал обновить Command Line Tools, и в аварии этого пути бы не было). Оба дефекта были в **выдаче**, не в комплекте; оба закрыты — правильный список и готовая программа `age` теперь лежат в папке.

## Комплект выложен на Hetzner — шаг «скачать» стал проверяемым

Все четыре файла версии `2026.09.14-r2` загружены в `busfactor-kit` на Storage Box `u656648` — каталог, который читает подаккаунт хранителя `u656648-sub1` (создан и проверен 13.09: свой каталог читает, соседний не видит, удалять не может). Файлы от 13.09 заменены. Временные копии с A1 удалены.

Остаётся выдать хранителю данные подаккаунта — и тогда прогон пройдёт **от скачивания** до книги, без локальных костылей.

## ⭐ Готовый список выдачи, составленный самой репетицией

Исполнитель прошёл книгу по шагам и против **каждого** написал, чего не хватает. Это и есть «пакет доступов» из раздела F, но составленный не нами, а тем, кто реально упёрся:

| группа шагов | чего не хватает |
|---|---|
| A1–A8 (живая проверка) | A1, root, lock, live state; production services; systemd; `/proc` живых процессов; `<deploy.stateDir>/verified.json`; окно dryrun на `:3011` |
| B0–B16 (сборка) | repo, manifest, A1/A2; build host, lock, disk, deps; build tree и `node_modules`; migration tree; временная БД и live hashes; artifact dir |
| B17–B18 (посадка) | A1, tar и sidecar, root; activation/att-build/runtime env |
| B1–B5 (переход) | verified/receipts/units/catalog; prepared state; dryrun; systemd и controller; live evidence |
| D1 (миграции) | production DB и учётные данные |
| D2 (бэкап) | службы `hetzbk` и их секреты |

Отдельно исполнитель отметил, что шаги **B19 и B20 запускать вручную запрещено** — это внутренние стадии B3/B4, и ручной запуск ломает предусловия. Он это понял **из книги**, что само по себе хороший знак о качестве книги.

## Что осталось — решение владельца, последнее по этой линии

Граница дословно: «перед первым live-шагом нужны A1/A2, production-доступы, receipts и секреты владельцев».

**Вопрос:** хранитель получает боевые доступы **заранее** — или только описанный путь, как их добыть в аварии?

- Заранее: человек с комплектом поднимает систему немедленно; цена — доступы лежат у него всё время.
- Путь добычи: безопаснее; цена — в аварии добавляется шаг, который некому выполнить, если владельца нет.

Это `HUMAN_ACCESS_CONTINUITY` из раздела «остаток» эпика, и он закрывается только решением владельца. Техническая часть репетиции своё доказала.
2026-09-14T23:52:33.302Z · coordinator
[14.09 23:52Z координатор] **ЗАКРЫВАЮ. Доступ без владельца получен, проверен независимым исполнителем и работает.**

**Что требовалось:** разрешённый доступ, которым можно воспользоваться **без участия владельца**.

**Что сделано 14–15.09:**
- создан выделенный ключ входа `busfactor-keeper-2026-09-14` (ed25519), разрешён на **обеих** машинах для пользователя `ubuntu`; на обеих есть `sudo` без пароля;
- ключ **не выдан на руки**: он лежит внутри пакета `доступы.tar.age`, зашифрованного `age` на **двух** получателей (хранитель и владелец) и подписанного ключом `owner-busfactor`; подделка подписи отвергается (отрицательный контроль пройден);
- вместе с ключом запечатаны: учётные данные ролей базы (копия `/etc/nc-db-roles/`), секрет резервного копирования (`/etc/hetzbk/hetzbk.env`), расписки последней посадки и документ «что где лежит»;
- в документе доступов написано, **как этот доступ отозвать** после аварии: убрать строку `busfactor-keeper-2026-09-14` из `authorized_keys` на обеих машинах, сменить пароли ролей, перевыпустить комплект.

**Чем доказано — не моими словами:**
1. я сама вошла ключом **из распакованного пакета** на обе машины, `sudo` работает, здоровье продукта через этот вход `200`;
2. **независимый исполнитель** (ИИ, которому владелец отдал папку) расшифровал пакет, привёл права ключа к `600` сам и выполнил read-only проверки: на A1 службы активны, health `200`; на A2 ssh доступен, служб продукта нет — что **ожидаемо** для сборочной/резервной машины;
3. всё это — **без участия владельца**: он только передал папку.

**Честная оговорка, записанная в самом пакете:** ключ хранителя **числится разрешённым на боевых машинах постоянно**. Альтернатива «добывать доступ в аварии через консоль провайдера» строже, но занимает десятки минут и ломает наш собственный порог восстановления. Выбран запечатанный вариант; решение принято владельцем 14.09 («как безопаснее») и записано в WEB-641.

Статус → `done`.
2026-09-15T22:16:58.977Z · coordinator
ENRICH-4135-WEB-644

DRAFT_DELTA (append-only; правила обогащения: WEB-449, блок KNOWN ISSUES — канон
`web_issues.body id=WEB-449`, дамп `_extract/WEB-449.canon.txt` строки 85–86).
Волна 4135, M1/DeepSeek Flash 4.1, read-only аудит.
Источник: `/Users/poolpooly/waves-ds/4130/4130ENRICHBUSFACTOR-REPORT.md` + `_extract/`.

## 1. UTC / КТО / ВЕРДИКТ и точный статус

Закрытие: `2026-09-14T23:52:33.302Z` (координатор) — «**ЗАКРЫВАЮ. Доступ без владельца
получен, проверен независимым исполнителем и работает.**»; статус переведён в `done`.

Точный статус в живой доске: **`done`** (11 комментариев, последний —
`2026-09-14T23:52:33.302Z`). Статус `done` **не переписывается** этой дельтой и **не
принимается за доказательство**: канон требует от закрытия ту же доказательную базу
(блок KNOWN ISSUES, карта документов, шаг нулевого агента), которой в закрытии нет.

## 2. МЕХАНИЗМ / КОРЕНЬ

Механизм (тело, пункт 1 — таблица прав по операции восстановления): разрешённый доступ,
которым можно воспользоваться **без участия владельца**.

Что реально сделано 14–15.09 (`2026-09-14T23:52:33.302Z`):
- создан выделенный ключ входа `busfactor-keeper-2026-09-14` (ed25519), разрешён на
  **обеих** машинах для пользователя `ubuntu`, `sudo` без пароля на обеих;
- ключ не выдан на руки: лежит внутри `доступы.tar.age`, зашифрованного `age` на двух
  получателей (хранитель и владелец) и подписанного ключом `owner-busfactor`, отрицательный
  контроль пройден;
- в документе доступов записано, **как доступ отозвать**: убрать строку
  `busfactor-keeper-2026-09-14` из `authorized_keys` на обеих машинах, сменить пароли
  ролей, перевыпустить комплект.

Правило одной папки: `2026-09-14T20:49:32.326Z` — «мне нужна одна единственная папка,
а не куча мест»; двухтрековая выдача отменена.

## 3. КАРТА ДОКУМЕНТОВ (точные пути)

- Чек-лист координатора: `3897WEB644-checklist.md` (назван в комментарии
  `2026-09-14T17:40:12.103Z`)
- Заполненная таблица прав: `RIGHTS-TABLE-FILLED.md`; `OPEN-ITEMS.md` (волна 3694)
- Таблица прав в линии: `RIGHTS-TABLE.md` (ветка `wave/3686-backup-signer`)
- Карта инфраструктуры: WEB-420 (тело 13.09) и перепись волной 3865 (14.09)
- Пакет доступов: `/Users/annakorin/Downloads/БАС-ФАКТОР-ПЕРЕДАЧА/доступы.tar.age`
  (`HANDOFF-LIVE.md` строка 27; состав — WEB-642 `2026-09-15T01:33:51.976Z`)
- Отчёт этой волны: `/Users/poolpooly/waves-ds/4135/4135ENRICHBUSFACTORCOMMENTS-REPORT.md`

## 4. ЭВОЛЮЦИЯ и отозванные утверждения

**Противоречие внутри тикета, обязанное быть записанным как эволюция.**

1. Волна **3897**, комментарий `2026-09-14T17:40:12.103Z`: `VERDICT=GO` относится
   **только к составлению плана и чек-листа**. Дословно: «Сам «доступ без владельца»
   **НЕ установлен** этой волной: волна — разведка и проект, она не создаёт и не меняет
   ничего в Hetzner, подаккаунтах, ключах и учётных записях (прямой запрет диспетча)».
   База волны: `refs/waves/l115n` = `d85bb2dad15a3ba52c773b0a2362748009a2c3b9`, ветка
   `wave/3897-web644-access-without-owner`; HEAD `c06bbdfbb0b7f1bdfd02c900c97ebee26b553e8a`;
   bundle sha256 `0d1b2b1b8d79103695186ae92718c2778560da43926e25e1b3f5c56f5cbcf705`.
2. Репетиция A, комментарий `2026-09-14T20:01:43.345Z`: «**Владелец, выступая хранителем**,
   скормил папку обычному ИИ». Локальная часть пройдена целиком (подлинность `ok: true`,
   версия `2026.09.14-r2`, архив расшифрован локальным `проверка/bin/age`, боевые команды
   не запускались). Шаг 7 чеклиста `3897WEB644-checklist.md` сам признаёт, что репетиция
   «владелец как хранитель» **не доказывает передачу второму человеку**.
3. Закрытие `2026-09-14T23:52:33.302Z` формулирует результат шире, чем доказано прогоном:
   доказан **технический доступ без участия владельца** (ключ из распакованного пакета,
   независимый исполнитель расшифровал и провёл read-only проверки), но не
   `HUMAN_ACCESS_CONTINUITY` — вторая сторона в прогоне была владельцем.

**Противоречие 3897 ↔ закрытие не сведено внутри тикета.** Разница между «технический
доступ без владельца» и «второй человек принял управление» в закрытии не оговорена.

**Готовность пакета ≠ исполнение B/C:** `HANDOFF-LIVE.md` строка 27 (тик 15.09 21:28Z)
и WEB-641 `2026-09-15T15:47:18.373Z`.

## 5. KNOWN ISSUES / ТРАБЛШУТИНГ

Канонического блока в карточке нет; единственное вхождение «KNOWN ISSUES» — внутри истории
до 13.09.

**KI-1. Закрытие шире доказанного.**
- Симптом: читатель закрытия делает вывод «бас-фактор по доступу снят вторым человеком»,
  тогда как доказан только технический путь доступа без владельца, а прогон шёл
  «владелец как хранитель» (`2026-09-14T20:01:43.345Z`).
- **Проверка за 2 минуты (read-only):** прочитать два комментария подряд —
  `2026-09-14T17:40:12.103Z` (дисклеймер волны 3897) и `2026-09-14T23:52:33.302Z`
  (закрытие) — и убедиться, что второй не снимает первый. Снятия нет ⇒ формулировка
  закрытия остаётся шире доказанного.
- Причина: `HUMAN_ACCESS_CONTINUITY` — отдельная строка эпика, закрывается только выдачей
  доступов реальному человеку (тело WEB-641, «## 6. ОСТАТОК», пункт 2).
- Лечение/статус: закрытие не откатывается; дельта фиксирует границу. Решение — владелец.
- Ссылки: `4130ENRICHBUSFACTOR-REPORT.md` §2.5 пункт 4 и §5 пункт 3.

**KI-2. Отзыв доступа описан, но не проверялся.**
- Симптом: процедура отзыва (убрать строку из `authorized_keys`, сменить пароли ролей,
  перевыпустить комплект) записана в документе доступов, но прогона отзыва нет.
- **Проверка за 2 минуты (read-only):** найти в материалах карточки факт прогона отзыва
  (номер волны / файл); не найдено ⇒ отзыв не проверен.
- Причина: закрытие опиралось на получение доступа, не на его снятие
  (`2026-09-14T23:52:33.302Z`).
- Ссылки: там же.

## 6. ТОЧНЫЙ ОСТАТОК (граница владелец / исполнитель)

Тело, пункт 5 перечисляет шесть строк «уточняет координатор» без привязки к состоянию
после закрытия. Действующий остаток по этому тикету:

- `HUMAN_ACCESS_CONTINUITY` — назвать второго уполномоченного человека и испытать его
  путь: **владелец** (тело WEB-641, §6 пункт 2).
- Выдача хранителю данных подаккаунта, чтобы прогон прошёл **от скачивания** без локальных
  костылей: **координатор** (`2026-09-14T20:01:43.345Z`).
- Поддержание отзыва доступа в актуальном состоянии — **координатор**.

## 7. ПЕРВЫЙ ШАГ НУЛЕВОГО АГЕНТА (без агентов)

Прочитать `2026-09-14T17:40:12.103Z` и `2026-09-14T20:01:43.345Z` **до** закрытия
`2026-09-14T23:52:33.302Z`, иначе граница будет прочитана неверно. Выполнить проверку
KI-1 (два чтения). **Ничего не переоткрывать и не менять статус:** карточка `done`,
дельта только фиксирует непроведённую границу.
Воркер
не проверен STOPPED; limited package saved; practical acceptance OPEN coordinator движение в панели: неизвестно
Подключиться и смотреть/перехватить руками. Колесо мыши листает; клавишами — Ctrl-b затем [, выход из прокрутки q. Отсоединиться — Ctrl-b затем d:
Прочитать историю панели без подключения — листается и ищется (/ поиск, q выход), воркеру не помешает:
Обновлён
2026-09-14T23:52:33.938Z