- «Файл отдаётся ссылкой» осталось от снятого решения: тело требования прямо
отрицает выдачу значения на предъявителя, право даёт узнавание при каждом
обращении
- слово «ссылка» перестало нести в одном требовании три смысла: указатель в
базе, значение доступа и путь к файлу в журнале
- один факт — один дом: рецепт локального входа, правило чтения
X-Forwarded-For, уровень строки журнала и опись опор изъятия сведены к
своим домам, копии заменены ссылками
- форма [auth.test_headers] выровнена по образцу конфига в семи местах;
сценарии intake и archive перестали ссылаться на сессию, которой сервис
не выдаёт
- поправлены протухшие факты: ключ объекта строит ULID, а не UUID; сверку
адреса пира зовут трое, а не двое; обзор capability access знает о
задаче 2026-08-23
- в конфиг добавлены секция [auth.test_headers] и предохранитель [server] debug:
заголовки входа подставляет слой транспорта, второго процесса локальный запуск
больше не требует
- подкоманда devtools proxy удалена целиком: всё, ради чего её поднимали, делает
сам сервис
- адресного предохранителя нет по решению владельца — цена названа в ADR и в
модели угроз
- база своя: два пула, захват одним UPDATE ... RETURNING, шаги схемы на goose
под файловым замком, одна миграция начальной схемы вместо семи прежних
- транспорт переписан на net/http: свои слои, свой ограничитель частоты,
отдача файла с проверкой владельца; панель /_/ и пространство /api/ исчезли
- по находкам ревью: журнал не пишет путь под корнем приложения, ключ бюджета
читается справа налево, узнавание известного идёт читающим пулом
- пришедшего называет заголовок Remote-User от прокси, и верят ему только с
адреса из перечня trusted_proxies; своего входа у сервиса не осталось — ни
корня /auth, ни кук, ни срока сессии, ни секрета клиента в конфиге и в базе
- учётная запись заводится первым обращением: EnsureUser в пакете хранилища,
шаг схемы 202608220001 с колонкой provider_login и снятыми правилами users
- cmd/oidcstub заменён на cmd/devtools с подкомандой proxy; заодно закрыт
унаследованный DL3066 — пользователь образа назван числом
- заведён каталог web/ — Vue 3, роутер пятой версии, сборка Vite; собранное
вшивается через go:embed и раздаётся корневым маршрутом: разметка на
неизвестном пути вне корней сервиса, отказ контракта внутри корня
- перечень корней сервиса стал единой точкой и порождает регистрацию маршрутов,
а не описывает её; журнал раздачи пишет исход и длину пути, но не сам путь
- шаг front зовёт Node контейнером docker — Biome, юнит-тесты Vue и сборка
входят в гейт, а в Dockerfile появилась ступень приложения
- адреса приложения переехали в своё пространство `/app/`, опрос готовности
убран целиком: рубеж и причину остановки владелец узнаёт карточкой записи,
текст — отдельным адресом названного вида
- заведена единая точка отображения доменной ошибки и слой, приводящий к той же
форме отказы библиотеки: тело несёт машиночитаемый код рядом с сообщением
- у записи появились имя файла отправителя, длительность и размер своими
колонками, а у ленты владельца — свой индекс: без него страница сканировала
весь архив сервиса
- убраны клиент бота, транспорт обновлений, отправитель сообщений, сборка
входа при старте, секция настроек и зависимость go-telegram-bot-api; из
конвейера ушла доставка ответа отправителю — исход виден опросом готовности.
Колонки адресата и значение источника остались в схеме: применённые шаги не
переписываются
- шаг 202608140003 запрещает пустого владельца у аудиозаписи и у файла;
существующие строки он не проверяет, и это принято сознательно — искать их
надо запросом до выкладки
- ревью нашло два пред-существующих дефекта, оба закрыты: пустой второй ответ
распознавателя стирал сохранённую расшифровку, а пустая расшифровка перестала
быть заметной вместе с убранной доставкой. Попутно поднят golang.org/x/image
до v0.45.0 — красный шаг vulns, воспроизводился и на чистом master
- audiorecords вместо transcribe_jobs: приложения (texts, structures,
recognitions, record_events, topics) живут своими коллекциями, ссылки на
исходник и на приведённую копию перестали переставляться
- рубеж называет достигнутое, отказ стал признаком остановки с причиной, а
сторожей стало двое: число отказов и время в рубеже
- воркеры потеряли специализацию, их число задаётся [pipeline] workers, шаг
выбирается по рубежу, а захват отдаёт идентификатор и признак захвата
- колонка `owner` связью с `users` в обеих коллекциях новым шагом схемы
`202608140001`; чтение задачи сужено владельцем, и чужая, ничья и
несуществующая дают один ответ; правило просмотра файлов сужено им же
- приём по HTTP берёт владельца из сессии, а предъявителя без учётной записи
пользователя отвергает до чтения тела: позже пришлось бы убирать уложенный
файл, а уборки файлов сервис не умеет. Выборка воркера владельцем не сужается
- удаление учётной записи с записями отвергается стражем, и вешает его сама
сборка хранилища: сборка, забывшая его позвать, теряла защиту молча
- в секции [telegram] заведён обязательный ключ enabled: умолчания у него нет,
файл без него негоден; bot_token стал только ключом доступа и при
enabled = false не читается вовсе, а пустой при enabled = true роняет старт
- выключенный вход даёт подъём одним входом без единого обращения к Telegram и
записью INFO вместо прежнего WARN: это выбор владельца, а не отклонение
- отказ разбора файла настроек больше не пересказывает toml — её ParseError
несёт в тексте разбираемое значение, и оборванная строка секретного ключа
уносила его в журнал; теперь называются путь, строка, столбец и последний ключ
- CLAUDE.md, «Язык»: ссылаться можно на конкретную запись или на весь корпус
разом, но не на их количество — число протухает молча, машина его не считает.
Изъятие названо: неизменное число и историческое в записи о прошлом остаются.
- Сняты счёты capability, прогонов ревью, типизированных ошибок, воркеров,
сверок документов и правил линтера в docs/, спеке pipeline и CLAUDE.md.
- Заодно исправлено то, что этот же счёт и скрывал: типизированных ошибок три,
а не две — LostAcquisitionError был потерян из перечня.
- Клиент бота собирается один раз и достаётся отправителю и транспорту;
разрез прошёл по «ответил ли Telegram»: ответ «такого бота нет» роняет
старт, недоступность даёт подъём без Telegram (ADR-2026-08-13). Ожидание
при сборке ограничено сроком — иначе молчащий Telegram вешал подъём.
- Недоставленный ответ не роняет шаг: пишется с job_id и считается метрикой,
уровень по причине — WARN для неподнятого входа, ERROR для неназванного
адресата. Заведены transcriber_intake_up и transcriber_undelivered_reply_count.
- Закрыта утечка токена в журнал: отказ разбора адреса рождается раньше
обращения к клиенту, то есть мимо чистки на его границе.
- Инструментарий проекта спеками не нормируется: capability toolchain удалена,
норму шага сверки версий Go держат его проверки в scripts.
- Перечень capability в архитектуре и ревью сокращён до четырёх, решение
ADR-2026-08-12-spec-norms-build-toolchain помечено устаревшим.
- ссылки на tasks/ROADMAP.md переведены на BACKLOG.md и на openspec/specs,
упоминания целей — на задачи, которые эту работу делают;
- судьи документации нашли восемь расхождений: Purpose спеки pipeline объявлял
неописанным то, что уже нормирован пятью требованиями, вид времени в
конвенции спорил со схемой, а квоты, шесть часов и отказ от Web Push жили
сразу в двух документах без ссылки друг на друга;
- два числа получили провенанс: 259 200 запросов в сутки и потолок в шесть
часов теперь ведут к записке разведки, а не читаются как замер.
- периметр: passport.md и security.md больше не утверждают, что HTTP API
открыт без аутентификации, а review.md не числит эту находку типовой
ложноположительной — приём, опрос и файл закрыты сессией с 2026-08-12;
- logging.md писал, что расширение попадает в журнал полем пути: описано
изъятие инварианта приватности — собственное поле, имени и пути нет;
- узел ревью переименован в repo/pocketbase, поведение конвейера из обзора
уехало ссылкой в спеку pipeline, Purpose спеки storage написан вместо
заглушки, в ADR о переезде дописано уточнение о действующей раскладке.
- шаг схемы закрывает поверхность, которую хранилище приносит открытой:
собственную регистрацию, вход по паролю и одноразовый код — без этого
закрытие приёма обходилось двумя запросами
- продление сессии выключено, срок семь суток: иначе отзыв доступа у
провайдера до сервиса не доходит никогда
- файл записи отдаётся вошедшему по токену файла — пересмотр
ADR-2026-08-12-file-link-open-but-not-logged
- шаг go-version в task gate сверяет объявленную версию в go.mod, Dockerfile,
CLAUDE.md и README.md; судит по репозиторию, go не зовёт, docker и сети не
требует
- заведена capability toolchain: до сих пор спеки нормировали только поведение
сервиса, теперь и инструмент сборки. Причина и цена — в двух ADR
- закрыт дефект 2026-08-12: образ на golang:1.24-alpine разошёлся с go.mod и
перестал собираться, а восемь шагов гейта и шесть проходов ревью были зелёными
- записи, метаданные и файлы съехались под один каталог данных; появилась
панель владельца, а gin, goqu, goose и требование CGO ушли
- захват задачи стал одним запросом с RETURNING; заведены число попыток,
состояние dead и нарастающая пауза вместо признака is_error
- имя файла в хранилище задаёт сервис и в журнал не идёт: вместе с
идентификатором записи оно собирало бы ссылку на скачивание
- признаки «работы нет» и «задача не найдена» узнаются по смыслу, а не
приведением типа: обёртка `%w` на пути больше не превращает пустой прогон
воркера в отказ раз в секунду
- отказ закрытия соединения с распознавателем доходит до вызывающего
(`errors.Join`) либо до журнала; у `errcheck` включён `check-blank`, иначе
критерий принимал реализацию, выбрасывающую отказ в пустоту
- заведены первые тесты пакета worker и capability `pipeline`; долг из четырёх
замечаний линтера закрыт, гейт зелёный целиком
- расширение приводится к перечню известных форматов прежде метки метрики:
страница метрик открыта, и хвост имени уезжал на неё дословно
- проверки приёма перехватывают все три потока журнала и читают реестр метрик,
каждая падает при снятии того, что сторожит
- проверки больше не зовут ffprobe и не меняют рабочий каталог процесса;
добавлены случаи на отказ чтения метаданных и на отсутствие поля audio
- заведена спека intake на приём по HTTP, ADR о подставных адаптерах,
запись в журнал ревью о проверке, которая не могла упасть
- go test снят из объявленных долгов CLAUDE.md, послабление errcheck
для _test.go в .golangci.yml убрано