From 4230b5e672c568a87e79a1b7d7f86d077f0f5c4d Mon Sep 17 00:00:00 2001 From: heaven Date: Sat, 5 Sep 2026 07:11:51 +0300 Subject: [PATCH] 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 --- platform/docs/platform-PROGRESS.md | 32 ++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/platform/docs/platform-PROGRESS.md b/platform/docs/platform-PROGRESS.md index c9c4d611..1af9faf7 100644 --- a/platform/docs/platform-PROGRESS.md +++ b/platform/docs/platform-PROGRESS.md @@ -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` (интейк хранит расширение пользователя дословно) — +найдено воркфлоу-ревью, разбор в секции о пяти выживших. Список исключений опасен в обе стороны, и +обе стороны обязаны быть запинены. + ### Батарея и гейты ```