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
+23 -100
View File
@@ -43,16 +43,10 @@
### Белый список Telegram
Бот отвечает только тем, кто перечислен в `[server] users_while_list`. В
`config.dist.toml` этого ключа нет — добавьте его сами:
```toml
[server]
users_while_list = ["@username"]
```
Значения сверяются со строкой автора сообщения из Telegram (`@username` либо имя
с фамилией), а не с числовым id.
Бот отвечает только тем, кто перечислен в конфиге. Кого и по какому признаку он
пускает — [docs/security.md](docs/security.md), «Что разграничивает доступ»;
известные прорехи образца конфига, включая недостающий ключ белого списка, —
[docs/conventions/config.md](docs/conventions/config.md).
## Деплой
@@ -66,76 +60,22 @@ inv pl -- transcriber
локально и едет на сервер через `docker save`/`load`, реестр не участвует.
Локально образ можно собрать и руками — `task image` даст `transcriber:dev`.
## API Endpoints
## HTTP API
### POST /api/audio
Четыре маршрута: `POST /api/audio` — приём записи, `GET /api/status/:id` —
готовность задачи, `GET /metrics` — метрики Prometheus с префиксом
`transcriber_`, `GET /health` — проверка живости.
Загружает аудиофайл и создает задачу на расшифровку. Отвечает `201 Created`.
**Параметры:**
- `audio` (form-data) - аудиофайл для расшифровки
**Пример запроса:**
```bash
curl -X POST \
http://localhost:8080/api/audio \
-F "audio=@/path/to/your/audio.mp3"
```
**Ответ:**
```json
{
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "created"
}
```
### GET /api/status/:id
Получает статус задачи расшифровки по ID. Поле `transcription_text` появляется,
когда задача перешла в `done`.
**Пример запроса:**
```bash
curl http://localhost:8080/api/status/550e8400-e29b-41d4-a716-446655440000
```
**Ответ:**
```json
{
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "done",
"created_at": "2024-01-01T12:00:00Z",
"transcription_text": "расшифрованный текст"
}
```
### GET /metrics
Метрики Prometheus с префиксом `transcriber_`.
### GET /health
Проверка работоспособности сервиса.
**Ответ:**
```json
{
"status": "ok",
"message": "Transcriber service is running"
}
```
Контракт приёма и опроса нормативен и живёт в
[openspec/specs/intake/spec.md](openspec/specs/intake/spec.md): поля запроса и
ответа, коды и условия. Менять его — необратимое действие
([CLAUDE.md](CLAUDE.md), «Работа»), и второго описания у него быть не должно.
## Состояния задач
- `created` - задача создана, файл сохранён, ждёт конвертации
- `converted` - файл сконвертирован в ogg, ждёт отправки на распознавание
- `transcribe` - распознавание запущено в Yandex SpeechKit, ждём результата
- `done` - задача завершена успешно
- `failed` - задача завершена с ошибкой
Задачи двигают три фоновых воркера: `conversion_worker`, `transcribe_worker` и
`check_worker`. Каждый опрашивает базу раз в секунду и делает один шаг.
Перечень состояний, переходы между ними и число воркеров —
[docs/database.md](docs/database.md), разделы «Таблицы» и «Представление
данных»; как сложен конвейер целиком — [docs/architecture.md](docs/architecture.md).
## Структура проекта
@@ -166,25 +106,9 @@ transcriber/
## База данных
### Таблица `files`
- `id` (TEXT) - UUID файла
- `storage` (TEXT) - где лежит файл: `local` или `s3`
- `file_name` (TEXT) - имя файла в хранилище
- `size` (INTEGER) - размер файла в байтах
- `created_at` (DATETIME) - время создания
### Таблица `transcribe_jobs`
- `id` (TEXT) - UUID задачи
- `state` (TEXT) - состояние задачи
- `source` (TEXT) - откуда пришла задача: `api`, `telegram` или `unknown`
- `file_id` (TEXT) - ссылка на текущий файл задачи
- `delay_time` (DATETIME) - не брать задачу раньше этого времени
- `acquisition_id`, `acquire_time` - захват задачи воркером
- `recognition_op_id` (TEXT) - ID операции распознавания в Yandex Cloud
- `transcription_text` (TEXT) - результат распознавания
- `is_error` (BOOLEAN), `error_text` (TEXT) - признак и текст ошибки
- `tg_chat_id`, `tg_reply_message_id` - куда отправить результат в Telegram
- `created_at`, `updated_at` (DATETIME) - времена создания и обновления
Две таблицы, `files` и `transcribe_jobs`. Колонки, ключи, правило времени и
идентификаторов, а также механика захвата задачи воркером —
[docs/database.md](docs/database.md).
## Разработка
@@ -204,12 +128,11 @@ goose -dir migrations sqlite3 data/transcriber.db up
goose -dir migrations sqlite3 data/transcriber.db down
```
Проверки перед коммитом:
Проверки перед коммитом — одной командой:
```bash
go build ./...
go vet ./...
gofmt -l .
go test ./...
golangci-lint run
task gate
```
Что она гоняет, чем краснеет и какой отказ считается объявленным долгом —
[CLAUDE.md](CLAUDE.md), раздел «Гейт».