Три модели вместо одной считаются минуту и больше, плюс их загрузка при
первом обращении - держать на этом HTTP-запрос нельзя. Первый запрос
запускает сборку, страница обновляет себя сама и показывает ход работы.
Отдаётся страницей, а не документом: библиотеки для .docx в поставке нет,
а обновление возит только код. В Word переносится кнопкой копирования,
которая кладёт в буфер разметку вместе с текстом.
Тест поймал потерю: лишнее слово в конце реплики не отмечалось - индекс
выходил за границу, и метка молча пропадала.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Записи складываются в папку records и удаляются вместе с задачей по тому же
сроку. На странице разбора появился плеер, а щелчок по времени слева от
реплики перематывает запись - можно послушать спорное место, не таская
ползунок.
Настройка keep_records в config.toml. Если запись не сохранена, вместо
пустого плеера показывается объяснение.
Черновик с подсветкой расхождений пока остаётся отдельной командой:
build/make_draft.py. Ложные расхождения по написанию больше не подсвечиваются.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
При выносе общих стилей правила для сводки потерялись: подпись слипалась
со значением, и строки шли столбиком вместо ряда.
Длительность у задач, обработанных до 0.21.0, оставалась нулевой. Значение
есть в сохранённом результате, поэтому история чинится при открытии базы.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Длительность в списке всегда была нулевой: при загрузке файл ещё не
декодирован, и mark_done её не записывал.
Кнопка копирования кладёт в буфер и разметку, и простой текст: Word берёт
первое и сохраняет полужирные имена говорящих, простые редакторы - второе.
Срок хранения поднят с 3 суток до 336 часов, после чистки выполняется
VACUUM: SQLite помечает страницы свободными, но файл не уменьшает.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
GET /v1/jobs/view - список последних задач со ссылками на разбор. Токен
подставляется в ссылки, иначе по каждой пришлось бы дописывать его руками.
Отдельный тест следит, чтобы маршрут не перехватывался /v1/jobs/{job_id}.
build/compare_reference.py считает WER относительно эталона, выписанного
на слух. Косвенные метрики ловят крупные сдвиги и слепы к систематическим
мелким потерям - так и пропустили обрыв концов фраз.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Результаты, обработанные до 0.14.0, не содержат массива sentences. Пустой
блок разметки выглядел бы поломкой страницы - теперь он говорит, что нужно
отправить запись заново.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
По одному JSON не понять, чья ошибка: распознавание склеило реплики или
LLM неверно расставила роли. Страница показывает обе стороны и принимает
ответ модели, чтобы диалог собрался на глазах.
GET /v1/jobs/{id}/view - токен заголовком либо ссылкой ?token=ЗНАЧЕНИЕ.
Страница самодостаточна: ни одного внешнего запроса.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>