tasks: целевая картина пересобрана — три цели, тринадцать задач, сдвинутые границы
- паспорт: сервис объявлен архивом с бессрочным хранением записей и текстов, машинная вычитка расшифровки внутри границ, приложение — основной вход; добавлены две границы: не файловое хранилище общего назначения и не биллинг; - заведены цели upload-reliability, user-settings, usage-stats и тринадцать задач; очередь пересобрана — сперва починки, затем разведки о хранилище, затем доступ и владелец, и только потом экраны; - архитектура: четыре новых открытых вопроса — приём большого файла, учёт расхода, срок хранения, потолок шести часов.
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
# ✨ Считать объём, минуты и расход по каждому пользователю
|
||||
|
||||
- **Тип:** feature
|
||||
- **Категория:** Очередь
|
||||
- **Зачем:** Ни объём, ни длительность, ни обращения к платным сервисам никуда не записываются: восстановить расход задним числом не из чего.
|
||||
- **Теги:** goal:usage-stats
|
||||
|
||||
Двигает пункты 1, 2 и 4 «Завершения» цели: по каждому пользователю копятся
|
||||
объём, минуты и расход на внешние сервисы, и повтор шага не удваивает счёт.
|
||||
|
||||
Учёт ведётся записями о потреблении, а не счётчиком в строке пользователя:
|
||||
счётчик, увеличенный дважды при повторе шага, обратно не отматывается.
|
||||
|
||||
## Затрагивает
|
||||
|
||||
- таблица записей потребления: владелец, задача, вид ресурса, величина, время —
|
||||
и её миграция;
|
||||
- `TranscribeService.createTranscribeJob` — размер файла и длительность записи
|
||||
на приёме;
|
||||
- `TranscribeService.completeJob` и `failJob` — запись потребления после
|
||||
успешного шага и после отказа;
|
||||
- адаптер SpeechKit и адаптер языковой модели: откуда берутся минуты и токены;
|
||||
- `internal/metrics` — счётчики того же расхода без разбивки по людям;
|
||||
- `docs/database.md` — представление данных.
|
||||
|
||||
## Критерии приёмки
|
||||
|
||||
- Дошедшая до `done` запись оставляет строки потребления: объём файла,
|
||||
длительность в минутах, минуты распознавания и токены языковой модели. Оракул
|
||||
— тест конвейера на подставных адаптерах: четыре строки с владельцем задачи.
|
||||
- Повторный проход шага после перезапуска не удваивает потребление. Оракул — тест:
|
||||
шаг выполнен дважды, сумма по задаче не изменилась.
|
||||
- Отказавшая задача сохраняет то, что уже потрачено, а не обнуляет счёт. Оракул
|
||||
— тест на ветке `failJob` после успешной конвертации.
|
||||
- Величина расхода не смешивает пользователей: выборка по владельцу отдаёт
|
||||
только его строки. Оракул — тест на двух владельцах.
|
||||
|
||||
## Рамки
|
||||
|
||||
Снаружи эта задача не видна сама по себе: ни экрана, ни эндпоинта она не
|
||||
заводит — их строит `admin-stats-screen`. Тип оставлен `feature` сознательно,
|
||||
как шаг цели.
|
||||
|
||||
Потолков и отказов по исчерпании квоты не заводим — цель показывает, а не
|
||||
ограничивает. Пересчёт расхода в деньги здесь не делается: копятся минуты и
|
||||
токены, цена прайс-листа живёт вне сервиса. Данные о потреблении содержат
|
||||
идентификаторы, но не текст записи и не имя файла (инвариант приватности).
|
||||
Reference in New Issue
Block a user