- admin-owner-from-config первой строкой: сервис заводит владельца панели
по ключу конфига; задача отменяет требование спеки storage, и это названо
в рамках
- dev-run-task следом: task dev поднимает сервис и заглушку разом, гасит
оба по Ctrl+C; зависит от ключа конфига
- main.go и journal_route_test.go переехали в cmd/transcriber без правок
содержимого; образ собирает ./cmd/transcriber поимённо
- cmd/oidcstub отвечает на /authorize, /token и /userinfo, проверок не делает
и слушает петлевой адрес: войти без Authelia стало чем
- ступень сборки приложения переехала на node:24 с alpine — musl ждёт ответа
на AAAA, которого нет, и npm ci висел вместо отказа
- json-api-for-spa: адреса приложения уехали в своё пространство /app/,
приём стал POST /app/audiorecords, опрос /api/status/:id убран, заведены
список, карточка, текст, /app/me и /app/config; имя файла отправителя
легло своей колонкой рядом с заголовком
- три действия над записью — правка заголовка, возврат в работу и журнал
событий — собраны задачей audiorecord-actions
- голова очереди: контракт, каркас, экран загрузки, список, действия
- в прежних задачах поправлены адреса, рубежи конвейера и остатки Telegram
- шесть записей по кластерам причин: журнал под внешним значением, нулевой
код ответа в журнале, затирание вложения бедным ответом, открытый анониму
адрес подтверждения почты, рубеж расшифровки без работы, пределы длительности
- находка про код 500 у отказа приёма дописана в json-api-for-spa: там живёт
единая точка отображения доменной ошибки
- telegram-account-link и bot-api-only-through-bot-client оставлены с оговоркой,
что предмета у них нет до возвращения входа
- центральная сущность — аудиозапись: файлы, тексты, структура реплик и темы
живут отдельными строками, поля очереди перестают соседствовать с содержимым,
а провайдерское уезжает в свою таблицу
- конвейер становится цепочкой рубежей с остановкой признаком: рубеж не
стирается, и запись перезапускается с места остановки
- воркеры теряют специализацию, их число задаётся конфигом
- слово «провенанс» снято из словаря проектных текстов: у числа теперь
«происхождение», у вопроса и находки — «откуда»
- правлены форма вопроса в docs/review.md, шапка раздела об OIDC в
docs/research/pocketbase.md и две записи задач; формулировки прошли
вычитку агентами doc-wording и task-wording
- архив openspec/changes/archive/ не тронут: слово, верное на день записи,
остаётся свидетельством
- имя приведено к конвенции, которая сама называла его расхождением;
ссылки поправлены в README, CLAUDE.md, конвенциях, docs/review.md и двух
записях задач
- в шапке docs/conventions/config.md заодно поправлен второй пункт перечня:
проверки на старте у `[auth]` и `[telegram]` уже есть
- архив openspec/changes/archive/ не тронут: это запись о прошлом
- задача оказалась шире chore: у нормированного адреса входа появляется
новый исход отказа, а обязательность проверочного кода PKCE переезжает
в настройки провайдера в хранилище
- дальше она идёт сценарием решения, следующим прогоном
- Клиент бота собирается один раз и достаётся отправителю и транспорту;
разрез прошёл по «ответил ли Telegram»: ответ «такого бота нет» роняет
старт, недоступность даёт подъём без Telegram (ADR-2026-08-13). Ожидание
при сборке ограничено сроком — иначе молчащий Telegram вешал подъём.
- Недоставленный ответ не роняет шаг: пишется с job_id и считается метрикой,
уровень по причине — WARN для неподнятого входа, ERROR для неназванного
адресата. Заведены transcriber_intake_up и transcriber_undelivered_reply_count.
- Закрыта утечка токена в журнал: отказ разбора адреса рождается раньше
обращения к клиенту, то есть мимо чистки на его границе.
- Тип сменён с chore: подъём без токена бота меняет наблюдаемое поведение и
требует нормы, которой в openspec/specs нет.
- В тело записан второй предмет работы — судьба задачи из Telegram, дошедшей до
ответа при отсутствующем боте; он же стал четвёртым критерием приёмки.
- Отменены migrations-step-norm-and-tests, gate-steps-subject-guard и
review-config-from-go-upgrade: много механики, мало пользы.
- go-linters.md больше не числит отсутствие проверок шага migrations долгом —
это решение, а не незакрытая работа.
- migrations-step-norm-and-tests, gate-steps-subject-guard и
review-config-from-go-upgrade уехали в голову: слой проверок, которым верят
все задачи ниже;
- rollback-restores-wrong-session-duration встал рядом с соседом про откат,
bot-api-only-through-bot-client — рядом с чисткой транспорта,
pin-runtime-image-base — перед spa-skeleton, откуда начинаются пересборки;
- pipeline-spec-purpose-drift закрыта реализованной, а
docs-consistency-2026-08-13 переписана под пять оставшихся находок: шестую
свело повышение раскладки.
- 11 записей типа goal закрыты с причиной, называющей задачи-наследники;
ROADMAP.md удалён, индекс остался один — BACKLOG.md;
- 33 записи переписаны: ссылка «Двигает пункты N «Завершения» цели» уступила
место прямому утверждению — без целей номера пунктов вели в никуда;
- шапка BACKLOG.md размечена парой <!-- стадия -->, порядок строк теперь
объявлен зависимостью, а не важностью.
- Перевод на канон 1 доделан: адреса служебного файла и имена скиллов
переставлены в девяти местах прозы и кода, гейт зовёт три скрипта по новым
путям, прежние docs/.docs.json и tasks/.tasks.json удалены.
- Сверка двумя агентами нашла четырнадцать расхождений, тринадцать сведены
строками: число прогонов ревью и преамбула журнала дефектов, счёт capability,
маршруты README, дубли инварианта захвата и кодов прогона, протухшие указатели
записок разведки, маркер долга на переехавшем абзаце. Срок жизни сессии
нормирует спека access, database.md на неё ссылается.
- Purpose спеки pipeline объявляет неописанным то, что в ней же и стоит; правка
идёт изменением openspec, поэтому заведена задача pipeline-spec-purpose-drift.
- четыре новые записи: проверить шаг migrations так же, как шаг сверки версий Go;
свести шесть расхождений между документами канона; запретить обращаться к Bot
API мимо клиента бота; разведка о шагах гейта, теряющих предмет
- context-cancel-in-pipeline приведена к правде: дописан перечень сделанного
попутно, критерий с оракулом «тест на трёх прерываниях подряд» разбит надвое —
проверена была только его узкая половина
- порядок беклога и роадмапа назначен слоями: проверки, которым можно
верить → долги входа → владелец записи и контракт API → конвейер под
тестами → приложение и возможности поверх; у каждого движения записана
причина;
- заведены восемь задач под пункты «Завершения», которых не закрывала ни
одна запись, — цель any-audio-source была без задач вовсе;
- у четырёх задач сняты критерии, требовавшие того, что делает задача ниже
по очереди; исправлены ссылки на несуществующий repo/sqlite и на
отменённую разведку об очереди.
- шаг схемы закрывает поверхность, которую хранилище приносит открытой:
собственную регистрацию, вход по паролю и одноразовый код — без этого
закрытие приёма обходилось двумя запросами
- продление сессии выключено, срок семь суток: иначе отзыв доступа у
провайдера до сервиса не доходит никогда
- файл записи отдаётся вошедшему по токену файла — пересмотр
ADR-2026-08-12-file-link-open-but-not-logged
- четыре задачи из находок ревью и заметки владельца: проверки shellcheck и
hadolint с тестом скрипта сверки версий, закрепление рантайм-базы образа,
коды выхода шагов гейта, настройка конвейера ревью
- INBOX разобран целиком и очищен
- заведены записка разведки docs/research/spa-framework.md со сравнением Svelte,
Vue и React на одном экране и решение ADR-2026-08-11-spa-on-vue
- docs/conventions/web-ui.md переписан под Vue: компоненты, маршруты, состояние,
обращение к API и показ ошибок
- закрыт вопрос «Приложение» в docs/architecture.md, уточнена задача spa-skeleton
- заведены записка разведки job-queue-choice и ADR: готовые библиотеки River и
goqite отвергнуты, захват сворачивается в один запрос с RETURNING
- в architecture.md уточнён принцип «очередь таблицей» и закрыт открытый вопрос
«Очередь», кроме холостого опроса
- задача pocketbase-storage забрала очередь себе: границы, счётчик попыток,
состояние «мертва» и оракулы
- сняты повтор слова в записке разведки и та же строка в цитате ADR,
убран термин «чекпоинт», разведена цепочка местоимений в паспорте
- oidc-login: «зачем» перестало повторять тело, задача заявила пункт 3
«Завершения» цели multi-user — он не был закрыт ни одной её задачей
- разведка pocketbase-admin-fit ответила замером панели версии 0.39.10:
записка в docs/research/pocketbase.md, решение — в ADR
- панель показывает файлы и пользователей только своих, поэтому файлы
переезжают в её раскладку, а вход идёт через её провайдера OIDC
- периметр расширился панелью на /_/ и паролем суперпользователя;
закрывает её Authelia на прокси, задачи в беклоге у этого нет
- `docs/.pm.json` переименован в `docs/.docs.json`, версия канона — 14
- ADR принимает записку разведки как источник решения наравне с архивным
`design.md`
- заведён `tasks/.tasks.json`, а в описании гейта — шаги `tasks.py check` и
`openspec.py check`
- data-ownership — обратное право к бессрочному хранению: человек убирает свою
запись вместе с файлом, объектом в Object Storage и всеми уровнями текста;
- delete-record закрывает все пять пунктов цели: подтверждение, необратимость,
чужую запись не тронуть, повторная загрузка того же файла заводит новую
задачу, а строки потребления остаются — деньги потрачены;
- docs/security.md: пункт «Удаление данных по требованию» перестал говорить,
что задачи под это нет.
- intake-limits-measure меряет четыре звена, которых не берёт speechkit-limits:
приём из Telegram и по HTTP, конвертацию и заливку в Object Storage;
- reject-oversized-recording отклоняет запись сверх потолка на приёме,
long-text-delivery отдаёт текст в сотни килобайт файлом вместо сотни
сообщений Telegram;
- все шесть пунктов «Завершения» цели теперь закрыты задачами.
- паспорт: сервис объявлен архивом с бессрочным хранением записей и текстов,
машинная вычитка расшифровки внутри границ, приложение — основной вход;
добавлены две границы: не файловое хранилище общего назначения и не биллинг;
- заведены цели upload-reliability, user-settings, usage-stats и тринадцать
задач; очередь пересобрана — сперва починки, затем разведки о хранилище,
затем доступ и владелец, и только потом экраны;
- архитектура: четыре новых открытых вопроса — приём большого файла, учёт
расхода, срок хранения, потолок шести часов.
- пять из урожая change 2026-08-11-fix-http-handler-tests, тег review-2026-08-11;
утечка имени файла в журнал поставлена первой строкой очереди
- опечатка transcibe дописана в json-api-for-spa: текст ошибки — часть
необратимого контракта, и в одиночку он не правится