- Перевод на канон 1 доделан: адреса служебного файла и имена скиллов
переставлены в девяти местах прозы и кода, гейт зовёт три скрипта по новым
путям, прежние docs/.docs.json и tasks/.tasks.json удалены.
- Сверка двумя агентами нашла четырнадцать расхождений, тринадцать сведены
строками: число прогонов ревью и преамбула журнала дефектов, счёт capability,
маршруты README, дубли инварианта захвата и кодов прогона, протухшие указатели
записок разведки, маркер долга на переехавшем абзаце. Срок жизни сессии
нормирует спека access, database.md на неё ссылается.
- Purpose спеки pipeline объявляет неописанным то, что в ней же и стоит; правка
идёт изменением openspec, поэтому заведена задача pipeline-spec-purpose-drift.
- заведён internal/clock: Now даёт метку в UTC, Start — начало измерения
длительности с монотонными часами; девять мест рабочего кода и запрос захвата
переведены на него, долг «время time.Now() по месту» закрыт
- клиент SpeechKit узнавал конец потока сравнением err.Error() == "EOF": отказ
с тем же текстом вернул бы усечённую расшифровку как готовую, теперь
errors.Is(err, io.EOF)
- починены находки новых линтеров: две опечатки, два slog.DiscardHandler,
четыре неэкранированные подстановки в docker/entrypoint.sh
- шаги PocketBase переехали из файла в пакет
internal/adapter/repo/pocketbase/migrations, файл на шаг с именем
зарегистрированного шага; туда же имена коллекций, срок сессии — в provider.go
- ключ migrations в docs/.docs.json наведён на этот каталог: прежнее значение
указывало на несуществующий migrations/, и шаг гейта проходил зелёным при
всякой правке схемы
- app.go подключает пакет шагов явным пустым импортом: пропавшая ссылка на
константы унесла бы регистрацию, и хранилище поднялось бы без коллекций
- шаг схемы закрывает поверхность, которую хранилище приносит открытой:
собственную регистрацию, вход по паролю и одноразовый код — без этого
закрытие приёма обходилось двумя запросами
- продление сессии выключено, срок семь суток: иначе отзыв доступа у
провайдера до сервиса не доходит никогда
- файл записи отдаётся вошедшему по токену файла — пересмотр
ADR-2026-08-12-file-link-open-but-not-logged
- записи, метаданные и файлы съехались под один каталог данных; появилась
панель владельца, а gin, goqu, goose и требование CGO ушли
- захват задачи стал одним запросом с RETURNING; заведены число попыток,
состояние dead и нарастающая пауза вместо признака is_error
- имя файла в хранилище задаёт сервис и в журнал не идёт: вместе с
идентификатором записи оно собирало бы ссылку на скачивание