docs/ по канону 12: паспорт с целью проекта, архитектура сегодняшнего устройства, схема хранилища, модель угроз, конвенции кода, журнал ревью. Конвенции перенесены из jellybit; места, где код им не следует, помечены строкой «Расхождение» как объявленный долг. tasks/ с роадмапом: две достигнутые цели, две запланированные (веб и многопользовательский режим), два направления (все форматы, долгие записи) и пять задач в беклоге. openspec/config.yaml — маршрутизатор с адресами документов, спек пока нет. CLAUDE.md переписан по форме канона: инварианты с severity, семантика гейта, запреты с путями. Taskfile получил task gate.
3.1 KiB
3.1 KiB
🧹 Перевести хранилище на встроенный PocketBase
- Тип: chore
- Категория: Инфра
- Зачем: Хранилище, учётные записи и веб-панель нужны все три, и SQLite с goqu не даёт ни второго, ни третьего.
PocketBase встраивается библиотекой в тот же бинарник и приносит хранилище, учётные записи и панель администратора разом. Наблюдаемое поведение сервиса после перевода не меняется: те же два входа, тот же конвейер, тот же текст на выходе.
Данные не переносим — база заводится с чистого листа, и это решение принято сознательно.
Затрагивает
- таблицы
filesиtranscribe_jobs, каталогmigrations/и весь механизм goose; internal/adapter/repo/sqliteцеликом, включая захват задачи черезFindAndAcquire;internal/contract, интерфейсыFileRepositoryиTranscriptJobRepository;- ключ конфигурации
[database] pathи раскладка каталогаdata/; - сборка образа: PocketBase тянет свой набор зависимостей, а
mattn/go-sqlite3с его требованием CGO может уйти; docs/database.md— схема, представление данных и таблица настроек.
Критерии приёмки
- Сервис поднимается на чистом каталоге данных, накатывает свою схему сам и
принимает запись обоими входами. Оракул — запуск на пустом
data/и прогон записи из Telegram и черезPOST /api/audioдо состоянияdone. - Захват задачи воркером не выдаёт одну запись двум вызывающим. Оракул — тест на трёх параллельных вызовах захвата по одному состоянию: ровно один получает запись.
- Задача, брошенная на середине, достаётся снова по истечении срока захвата.
Оракул — тест с проставленным задним числом
acquire_time. docs/database.mdописывает новую схему, а старые упоминания goose и goqu из документов канона убраны. Оракул —task gate, шагdocs.py check.
Рамки
Данные прежней базы не переносим и не пытаемся сохранить; выкладку не запускаем; смена формата хранения на сервере необратима, и момент перехода назначает человек.