Record in the zone journal the rule a leaked key bought: a mechanism that aggregates a directory outward must carry a list of what it never takes, and that list starts with secrets

This commit is contained in:
heaven 2026-09-05 07:11:51 +03:00
parent 7e2226a96e
commit 4230b5e672

View file

@ -86,6 +86,38 @@ cannot be spawned on this host`. Приёмка разделена и обе п
зоны — верно, обе в секции «Открытые — major» с весом `**major**`. Пропуск сознателен, спорить не с
чем.
### ⛔ ПРАВИЛО, КУПЛЕННОЕ УТЕЧКОЙ КЛЮЧЕЙ: то, что уезжает С ХОСТА, не везёт секретов
⚠ **Отдельной секцией по просьбе оркестратора, и просьба верная: следующий помощник предложит ровно
то же самое.** Ниже — не история починки, а правило, которое надо знать ДО того, как писать копир.
**Что было.** Первая редакция `internal/backup` копировала каталог книги «целиком, кроме `backups/`».
Каталог книги по КОНВЕНЦИИ ДВИЖКА может содержать `.env` рядом с `book.yaml` — файл ПРОВАЙДЕРСКИХ
КЛЮЧЕЙ (`backend/cmd/tmctl/main.go`, греп `loadDotEnv`). А раздел «Бэкап и восстановление» того же
пака велит оператору увозить каталог точек ПРОЧЬ С ХОСТА. ⇒ механизм, построенный ради переживания
потери диска, увозил бы ключи деплоя туда, куда уезжают бэкапы, **по расписанию, каждые шесть часов**.
**Почему это не поймал никто раньше.** Ни один гейт зоны такого не видит: батарея зелёная, линтер
чист, `govulncheck` не про это, а норма `ENGINEERING_STANDARDS` §«Безопасность» говорит «секреты не
попадают в репо и в логи» — про КОПИЮ КАТАЛОГА там нет ничего, потому что до этого пака зона ничего
никуда не копировала. Нашёл Fable-помощник чтением, я подтвердил по коду движка и запинил.
**Правило, которое из этого следует — шире бэкапов:**
> Любой механизм, который АГРЕГИРУЕТ чужой каталог и отдаёт результат наружу (бэкап, экспорт,
> диагностический архив, «пришлите логи»), обязан иметь СПИСОК ТОГО, ЧТО НЕ БЕРЁТ, и этот список
> обязан начинаться с секретов. «Копируем всё, кроме известного мусора» — неверная форма по
> построению: она безопасна ровно до следующего файла, который кто-то положит рядом.
**Как это выглядит в коде сейчас:** дотфайлы не копируются вовсе, и каждый пропуск ИМЕНУЕТСЯ в
манифесте (`books[].not_copied`) с причиной — чтобы через полгода читатель не выводил правило из
того, что уцелело. Пин ищет ключ ПО ФАЙЛАМ ТОЧКИ, а не по манифесту:
`TestProviderKeysBesideABookAreNeverCopiedAndTheOmissionIsRecorded` — то есть он краснеет и на
починке, которая «записала, что пропустила», но всё-таки скопировала.
⚠ И обратная половина того же правила: **исключать по расширению — тоже ловушка.** «Не брать `*.db`»
съедало ИСХОДНИК книги, загруженной как `novel.db` (интейк хранит расширение пользователя дословно) —
найдено воркфлоу-ревью, разбор в секции о пяти выживших. Список исключений опасен в обе стороны, и
обе стороны обязаны быть запинены.
### Батарея и гейты
```