docs: устранены расхождения документов между собой и с кодом

- README разгружен: контракт HTTP API, таблицы БД, состояния задач и белый
  список отданы нормативным источникам ссылками
- в `architecture.md` и `review.md` числа и механика захвата задачи заменены
  ссылками на `database.md`, а описание конвейера ревью — на прогон от 2026-08-11
- в `CLAUDE.md` и `security.md` поправлены границы домена, оценка объёма записи
  и адрес очереди задач
This commit is contained in:
av
2026-08-11 12:24:41 +03:00
parent 2161d7f38e
commit ba7b4f37a6
6 changed files with 58 additions and 121 deletions
+10 -7
View File
@@ -21,6 +21,7 @@
- **Очередь таблицей.** Состояние задачи лежит в SQLite, воркер забирает работу
запросом с захватом. Внешний брокер не заводим: нагрузка — единицы записей в
день (оценка владельца, не замер: `research/` пуст).
<!-- канон: поведение → openspec/specs/pipeline -->
- **Шаг конвейера идемпотентен по повтору.** Задача, брошенная на середине,
достаётся снова по истечении срока захвата и проходит шаг заново.
- **Ядро зависит от интерфейсов.** `internal/service` знает только
@@ -87,7 +88,8 @@
`transcriber_worker_job_count` с меткой `error="true"` и по логам контейнера.
Отдельного оповещения нет.
- **Характер потока:** непрерывный, но разреженный. Бот держит длинный опрос,
три воркера опрашивают базу раз в секунду вхолостую.
три воркера опрашивают базу вхолостую с паузой из
[database.md](database.md), «Настройки с числовым значением».
## Единые точки проекта
@@ -136,8 +138,9 @@
- **Долгие записи.** Потолок сегодня неизвестен и не замерялся: 20 МиБ на приём
из Telegram — точно, ограничения `deferred-general` по длине — нет. Расчётный
потолок проекта — шесть часов, и он взят с запасом, а не замером.
- **Приём большого файла.** Форма читается целиком, предел
`router.MaxMultipartMemory` — 32 МиБ, обрыв начинает загрузку заново.
- **Приём большого файла.** Форма читается целиком, предел памяти под multipart
задан числом в [database.md](database.md), «Настройки с числовым значением»;
обрыв начинает загрузку заново.
Загрузку частями разбирает разведка `chunked-upload-choice`; её выбор меняет
публичный контракт приёма и потому идёт через решение в `adr/`.
- **Учёт расхода.** Распознавание и языковая модель оплачиваются по факту, а
@@ -152,10 +155,10 @@
- **Видео.** Дорожку из видеофайла бот принимает по MIME-типу `video/`, но
конвертер этот случай не проверялся.
- **Очередь.** Принцип «очередь таблицей» и захват `FindAndAcquire` написаны
вручную: захват не транзакционен, повторов с нарастающей паузой нет, число
попыток не считается, очереди мёртвых задач нет. Пересматривается разведкой
`job-queue-choice` раньше смены хранилища, чтобы не переписывать захват
дважды.
вручную; чем именно захват несовершенен — [database.md](database.md),
«Представление данных». Не решено здесь другое: пересматривать ли модель
очереди целиком — разведка `job-queue-choice`, раньше смены хранилища, чтобы
не переписывать захват дважды.
- **Наблюдаемость.** `/metrics` остаётся и развивается. Чем — дописывать
счётчики через `client_golang` или перейти на OpenTelemetry с трассировкой —
решает разведка `opentelemetry-fit`. Коллектор был бы процессом, которого в