tasks: восемь записей интейка получили место в плане стройки

- 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 переписана под пять оставшихся находок: шестую
  свело повышение раскладки.
This commit is contained in:
av
2026-08-13 16:11:58 +03:00
parent 2c12376262
commit f7a8a1df9d
9 changed files with 24 additions and 79 deletions
@@ -1,7 +1,7 @@
# 🧹 Запретить обращаться к Bot API мимо клиента бота
- **Тип:** chore
- **Категория:** Очередь — Класс уже дал утечку токена; сегодня его держат две проверки на сегодняшних местах, а не правило.
- **Категория:** Очередь — Правило границы клиента ставится на тот же транспорт, мелочи которого разбирает строка выше: своя обёртка, заведённая раньше правила, вернёт утечку токена молча.
- **Зачем:** Чистка отказа от адреса с токеном живёт в клиенте; свой http.Client в транспорте вернёт утечку молча — правило noctx такую подмену не ловит, а класс уже стоил одного дефекта.
Токен бота стоит в пути каждого обращения к Bot API, а `http.Client` кладёт
+11 -11
View File
@@ -1,14 +1,19 @@
# 🧹 Свести шесть расхождений между документами канона
# 🧹 Свести пять расхождений между документами канона
- **Тип:** chore
- **Категория:** Очередь — Находки одной сверки: чинится одним заходом, пока помнится, чем каждое место было найдено.
- **Зачем:** Сверка 2026-08-13 нашла шесть мест, где два документа отвечают на один вопрос по-разному; четыре из них в architecture.md, и по ним читатель строит решения о выкладке и о периметре.
- **Категория:** Очередь — Документы правятся до того, как на них обопрутся экраны и контракт: расхождение в таблице зависимостей и в периметре читают, принимая решения ниже по списку.
- **Зачем:** Сверка 2026-08-13 нашла шесть мест, где два документа отвечают на один вопрос по-разному; одно сведено при повышении раскладки, а три из пяти оставшихся стоят в architecture.md, и по ним читатель строит решения о выкладке и о периметре.
Находки сверки документов агентами `doc-consistency` и `doc-code-drift`,
прогнанной 2026-08-13 вместе с работой о контексте и токене. К той работе
расхождения отношения не имеют — они старше, и потому не чинились тем же
коммитом.
Мест было шесть. Шестое — вид временной метки, где `conventions/database.md`
требовал RFC 3339 с `T`, а хранилище пишет `2006-01-02 15:04:05.000Z`, — сведено
2026-08-13 строкой «*Расхождение:*» в конвенции при повышении раскладки до
версии 3. Остальные пять живы.
Каждое место названо с домом факта, то есть с тем документом, который прав:
1. **Панель администратора против Authelia.** `architecture.md`, «Открытые
@@ -26,11 +31,7 @@
4. **gin в `README.md`.** Веб-фреймворка нет: HTTP-поверхность — роутер
встроенной PocketBase, и `logging.md` прямо говорит, что вместе с gin ушёл и
`sloggin`. Дом стека — `CLAUDE.md`.
5. **Вид временной метки.** `conventions/database.md`: RFC 3339 с `T`, секундная
точность. `docs/database.md`: `2006-01-02 15:04:05.000Z`, и вид обязателен
побайтово — сравнение в SQLite строковое. Дом — `docs/database.md`;
конвенции нужна строка «*Расхождение:*».
6. **Дубли текста в `CLAUDE.md`** — подавления `hadolint` и настройка
5. **Дубли текста в `CLAUDE.md`** — подавления `hadolint` и настройка
`errcheck` пересказаны там дословно, хотя обе преамбулы договорились, что
дом перечня подавлений — `go-linters.md`.
@@ -38,7 +39,6 @@
- `docs/architecture.md` — «Открытые вопросы», таблица внешних зависимостей,
раздел «Эксплуатация»;
- `docs/conventions/database.md` — вид временной метки;
- `docs/security.md` и `docs/database.md` — как дома фактов, если правка
потребует уточнить формулировку;
- `README.md` — перечень технологий;
@@ -46,8 +46,8 @@
## Критерии приёмки
- Ни одно из шести мест не отвечает на свой вопрос двумя способами. Оракул —
повторный прогон `av-dev:doc-healthcheck`: перечисленные шесть находок не
- Ни одно из пяти мест не отвечает на свой вопрос двумя способами. Оракул —
повторный прогон `av-dev:doc-healthcheck`: перечисленные пять находок не
возвращаются.
- Провайдер OIDC стоит в таблице внешних зависимостей со своими четырьмя
столбцами отказа, и счёт зависимостей в «Открытых вопросах» сходится с
+1 -1
View File
@@ -1,7 +1,7 @@
# 🔬 Шаги гейта, у которых правило может потерять предмет
- **Тип:** research
- **Категория:** Очередь — Разведка о чужих скриптах: пока ответа нет, неизвестно даже, есть ли работа.
- **Категория:** Очередь — Разведка того же класса: правило, потерявшее предмет. Её исход правит соседние шаги гейта, поэтому идёт до работы над ними.
- **Зачем:** У шага migrations страж предмета есть, у шагов docs, tasks и openspec неизвестно: они зовут чужие скрипты из плагинов, и правило, потерявшее файлы, зеленело бы молча.
Класс известен и записан: правило, чей предмет исчез, обходит пустой перечень
@@ -1,7 +1,7 @@
# 🧹 Проверить шаг гейта migrations так же, как шаг сверки версий Go
- **Тип:** chore
- **Категория:** Очередь — Шаг уже стоит в гейте и уже назван стражем critical-инварианта в двух документах — необеспеченное обещание дороже отсутствующего.
- **Категория:** Очередь — Страж шага гейта — тот же слой оснований, что и покрытие изменённых строк: проверкам, которым верят ниже по списку, верить можно только после этого.
- **Зачем:** Шаг охраняет critical-инвариант «применённый шаг схемы не переписывается», но своих проверок не имеет: дрейф шаблона имени, переезд каталога или потеря grep в конвейере оставят его вечно зелёным, и это не заметит ничто.
Шаг заведён 2026-08-13 и проверен мутацией на восьми исходах вручную — правка
+1 -1
View File
@@ -1,7 +1,7 @@
# 🧹 Закрепить версию рантайм-базы образа
- **Тип:** chore
- **Категория:** Очередь — Закрепление базы образа окупается при частых пересборках, а они начнутся с приложением.
- **Категория:** Очередь — Встаёт прямо перед spa-skeleton: частые пересборки образа начинаются с приложением, и до него незакреплённая база ничего не ломает.
- **Зачем:** Финальный слой Dockerfile собирается на alpine:latest, а task image идёт с --pull, поэтому два образа из одного коммита с разницей в неделю несут разный ffmpeg — регрессия конвертации после такой пересборки выглядит как задачи в failed при пустом диффе репозитория, и откат на прежний коммит её не чинит.
Класс тот же, ради которого задача `go-1-26-upgrade` завела шаг сверки версий:
@@ -1,54 +0,0 @@
# 🧹 Свести Purpose спеки pipeline с её же требованиями
- **Тип:** chore
- **Категория:** Очередь — Правка одного раздела спеки, но откладывать её значит держать нормативный документ противоречащим себе.
- **Зачем:** Преамбула спеки объявляет сознательно неописанными пять требований, которые в ней же и стоят с 2026-08-12: читатель узнаёт границу нормы из раздела, который ей противоречит.
Нашла сверка документов 2026-08-13. `Purpose` спеки `pipeline` перечисляет как
сознательно неописанные захват задачи и срок его протухания, число попыток,
состояние «мертва» и паузу перед повтором. Ниже в той же спеке эти требования
стоят: их дописало изменение `pocketbase-storage` 2026-08-12, а преамбулу не
поправило.
Не переехала в спеку одна вещь — цепочка переходов
`created``converted``transcribe``done` либо `failed`. Маркер долга в
[architecture.md](../../docs/architecture.md) уже уточнён под это и называет
неперехавшей именно цепочку, так что после правки `Purpose` два документа
сойдутся.
Материал для замены — формулировка из отчёта сверки:
> Описаны: пустой прогон воркера, неделимость захвата и срок его протухания,
> число попыток и состояние «мертва», условность записи результата по признаку
> захвата, нарастающая пауза перед повтором. Сознательно не описаны: цепочка
> переходов `created` → `converted` → `transcribe` → `done` либо `failed`,
> отмена контекста посреди шага, освобождение ресурсов внешних клиентов. Это не
> значит, что такого поведения нет: оно живёт в коде, а требования на него не
> написаны, потому что требование без проверки — предположение, а не норма.
> Первая задача, которая трогает любое из перечисленного, дописывает его сюда.
## Затрагивает
- раздел `Purpose` в `openspec/specs/pipeline/spec.md` — требований спеки правка
не касается, они уже написаны;
- маркер долга о поведении в `docs/architecture.md` — как парная сторона
утверждения о том, что ещё не переехало.
## Критерии приёмки
- `Purpose` не называет неописанным ни одно требование, которое в спеке стоит.
Оракул — построчная сверка перечня из `Purpose` с заголовками `Requirement`
той же спеки: пересечения нет.
- Спека остаётся годной для инструмента. Оракул — `openspec validate --strict`
отрабатывает без отказа.
- Маркер долга в `docs/architecture.md` и `Purpose` называют неперехавшим одно и
то же. Оракул — чтение обоих мест подряд: перечни совпадают.
## Рамки
Правится преамбула, а не требования: поведение сервиса задача не меняет и кода
не трогает. Спека правится изменением openspec своим порядком, а не прямой
правкой файла. Соседняя задача
[context-cancel-in-pipeline](context-cancel-in-pipeline.md) уберёт из перечня
неописанного отмену контекста, когда доедет, — здесь эта строка остаётся на
месте.
+1 -1
View File
@@ -1,7 +1,7 @@
# 🧹 Настроить конвейер ревью по итогам прогона go-1-26-upgrade
- **Тип:** chore
- **Категория:** Очередь — Настройка конвейера ревью по итогам прогона — работа над процессом, не над продуктом.
- **Категория:** Очередь — Настраивает конвейер ревью, которым проверяется всё, что ниже: настройка после половины списка проверила бы вторую половину иначе, чем первую.
- **Зачем:** Прогон вскрыл две прорехи настройки: «Типовые узлы» знают только рантайм и не знают рода «проверочный шаг набора проверок», а «Триггеры метки» не видят оси «изменение трогает канон» — и именно она дала обе блокирующие находки.
Обе прорехи одного рода — настройка конвейера, живущая в `docs/review.md`, — и
@@ -1,7 +1,7 @@
# 🐞 Починить срок сессии, который ставит откат шага входа
- **Тип:** fix
- **Категория:** Очередь — Путь сегодня недостижим: откаты не подключены, и пока они не подключены, цена дефекту нулевая.
- **Категория:** Очередь — Оба про откат шага схемы: соседняя строка называет, что откат не отменяет применённое, эта чинит константу, которую он ставит. Порознь их правят дважды в одном файле.
- **Зачем:** Константа defaultAuthTokenDuration в шаге 202608120001 названа умолчанием библиотеки, но 1209600 — это 14 суток, а умолчание PocketBase 432000, пять суток: откат объявляет возврат к умолчанию и ставит срок вдвое больше выбранных владельцем семи.
Найдено ревью пачки задач о гейте 2026-08-12, проход разбора кода. Дефект