- в секции [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.
- Закрыта утечка токена в журнал: отказ разбора адреса рождается раньше
обращения к клиенту, то есть мимо чистки на его границе.
- Двадцать сценариев шага были единственной проверкой над проверкой в проекте;
запрет CLAUDE.md остался без исключений.
- Ссылки на файл сняты в памятке, конвенции линтеров, журнале ревью и статусе
ADR о спеке toolchain; норма шага живёт комментариями в самом скрипте.
- Уровень проверки один: линтеры и тесты судят код сервиса, судить их самих
проект не берётся; названы попавшие под запрет виды работ.
- Пересказ решения в go-linters.md и review.md заменён ссылкой на дом.
- Перевод на канон 1 доделан: адреса служебного файла и имена скиллов
переставлены в девяти местах прозы и кода, гейт зовёт три скрипта по новым
путям, прежние docs/.docs.json и tasks/.tasks.json удалены.
- Сверка двумя агентами нашла четырнадцать расхождений, тринадцать сведены
строками: число прогонов ревью и преамбула журнала дефектов, счёт capability,
маршруты README, дубли инварианта захвата и кодов прогона, протухшие указатели
записок разведки, маркер долга на переехавшем абзаце. Срок жизни сессии
нормирует спека access, database.md на неё ссылается.
- Purpose спеки pipeline объявляет неописанным то, что в ней же и стоит; правка
идёт изменением openspec, поэтому заведена задача pipeline-spec-purpose-drift.
- в go-linters.md заведён раздел «Отмена и внешний собеседник», перечень
механизированного пополнен девятью правилами и двумя шагами гейта, названы
остатки: contextcheck не видит сигнатуру без контекста вовсе, шаг migrations
судит только шаги, бывшие в базе диффа, rowserrcheck и sqlclosecheck
профилактические — предмета в коде нет
- в logging.md и security.md чистка отказа Telegram описана по факту: точка одна
и лежит на границе клиента, закрыты все пять путей вместе с логгером самой
библиотеки. Прежнее «*Расхождение:* вычистки нет... она не логируется» было
неверным дважды
- в журнал дефектов записаны две находки: отказ скачивания уносил токен бота
(проскочил, жил с самого начала) и остановка сервиса хоронила конвертируемую
запись в failed (поймано ревью до коммита)
- вопрос темы operations про отмену переформулирован: спрашивать надо не
«доходит ли контекст», а «что шаг делает с задачей, деньгами и ответом
отправителю»; вопрос про таймаут оставлен с оговоркой, что проброс контекста
на него не отвечает
- в памятке: словарь кодов новых шагов, требование компилятора C у детектора
гонок и оговорка, что «CGO не нужен» относится к сборке, а не к гейту
- документ docs/autotests.md снят: перечень правил, подавлений и лестница
механизации — это конвенция о том, чем машина читает код, и место ей среди
прочих записей
- в шапке названо, чего в записи нет: как писать тесты. Свойства, которые обязан
проверять тест, остаются в review.md, «Типовые узлы»
- ссылки переставлены в памятке, индексе конвенций, четырёх записях, review.md,
.golangci.yml, lefthook.yml и пакете сканеров
- лестница механизации из пяти ступеней, два круга проверок, перечень правил
таблицами по родам, перечень подавлений с причинами, порядок заведения
правила; названы остатки правил и отклонённые подъёмы
- утверждения «Механизировано» в четырёх записях конвенций и единые точки в
architecture.md приведены к сегодняшнему состоянию; изъятие «транспорт знает
адаптер хранилища» названо строкой
- в журнал дефектов записаны две находки: узнавание конца потока по тексту и
правило гейта, обходимое одной лишней строкой
- перечень «Механизировано» и то, что осталось прозой, снято из конвенций: они
про то, как писать код, а не про инструменты, которые его читают
- новый документ — дом темы ревью autotests, с границами: семантика гейта
остаётся в CLAUDE.md, журнал дефектов и вопросы по темам — в review.md
- вопрос ревью о суждении по готовому ответу сужен до того, что машина не
проверяет: до ответа мимо recorder
- шаг vulns гоняет govulncheck последним: ему одному нужна сеть, и он самый
долгий; отсутствие инструмента даёт код окружения, а не пропуск
- закрыты обе достижимые находки — grpc до 1.82.1, aws-sdk-go-v2/service/s3 до
1.97.3 с eventstream 1.7.8; прогон на реальных ключах Yandex не делался
- место шага названо в семантике гейта: он судит достижимость из кода, и
недостижимая GO-2026-5932 в golang.org/x/crypto/openpgp его не роняет
- недостающий скрипт у всех четырёх обёрток в Taskfile.yml даёт 3, как обещает
словарь: прежний 1 значил «дрейф» и отправлял искать разъехавшееся там, где
просто неполно дерево
- в словарь кодов CLAUDE.md добавлены сами обёртки и оговорка про 201: этим
кодом task отдаёт наружу любой отказ шага, а код шага печатает строкой
- шаг схемы закрывает поверхность, которую хранилище приносит открытой:
собственную регистрацию, вход по паролю и одноразовый код — без этого
закрытие приёма обходилось двумя запросами
- продление сессии выключено, срок семь суток: иначе отзыв доступа у
провайдера до сервиса не доходит никогда
- файл записи отдаётся вошедшему по токену файла — пересмотр
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`; долг из четырёх
замечаний линтера закрыт, гейт зелёный целиком
- хвост после последней точки попадает в журнал внутри пути файла и остаётся
там осознанно; наружу он выходит только приведённым к перечню
- в модели угроз это перестало читаться незакрытым остатком
- README разгружен: контракт HTTP API, таблицы БД, состояния задач и белый
список отданы нормативным источникам ссылками
- в `architecture.md` и `review.md` числа и механика захвата задачи заменены
ссылками на `database.md`, а описание конвейера ревью — на прогон от 2026-08-11
- в `CLAUDE.md` и `security.md` поправлены границы домена, оценка объёма записи
и адрес очереди задач
- `docs/.pm.json` переименован в `docs/.docs.json`, версия канона — 14
- ADR принимает записку разведки как источник решения наравне с архивным
`design.md`
- заведён `tasks/.tasks.json`, а в описании гейта — шаги `tasks.py check` и
`openspec.py check`
- проверки больше не зовут ffprobe и не меняют рабочий каталог процесса;
добавлены случаи на отказ чтения метаданных и на отсутствие поля audio
- заведена спека intake на приём по HTTP, ADR о подставных адаптерах,
запись в журнал ревью о проверке, которая не могла упасть
- go test снят из объявленных долгов CLAUDE.md, послабление errcheck
для _test.go в .golangci.yml убрано
docs/ по канону 12: паспорт с целью проекта, архитектура сегодняшнего
устройства, схема хранилища, модель угроз, конвенции кода, журнал ревью.
Конвенции перенесены из jellybit; места, где код им не следует, помечены
строкой «Расхождение» как объявленный долг.
tasks/ с роадмапом: две достигнутые цели, две запланированные (веб и
многопользовательский режим), два направления (все форматы, долгие
записи) и пять задач в беклоге.
openspec/config.yaml — маршрутизатор с адресами документов, спек пока нет.
CLAUDE.md переписан по форме канона: инварианты с severity, семантика
гейта, запреты с путями. Taskfile получил task gate.
CLAUDE.md описывает конвейер задач, подвохи конфига и правило про четыре
списка колонок в репозитории sqlite.
.golangci.yml включает стандартный набор плюс errorlint; осознанные
непроверенные вызовы вынесены в исключения.
README приведён к коду: эндпоинты /api/audio и /api/status/:id, состояния
задач, структура internal/, фактические колонки таблиц.