talkis/testing_plan.md
David Perov e30ee9c25e feat: home stats, processing stop/retry, uniform hotkey editing, support link
- Words statistics on the home page (month / all-time / words-per-minute), minimalist layout
- Live processing row in history with stop/cancel; retry for interrupted & failed entries (voice/file/call); startup reconciliation of orphaned jobs
- Uniform hotkey editing across OSes: physical-key (event.code) capture + apply-on-keydown on macOS
- Contact-support button and a GitHub link next to the version
- Stop ducking other apps audio: check mic permission via the Permissions API instead of opening getUserMedia at startup
- CI workflow running cargo check on macOS/Windows/Linux on push and PR
2026-06-22 00:24:40 +03:00

16 KiB
Raw Permalink Blame History

Тестирование стилей обработки Talkis

Конфигурация тестов

Параметр Значение
Язык ru (основной), en (дополнительно)
Стили Classic, Business, Tech
Модель STT gpt-4o-transcribe
Модель LLM gpt-4o-mini

1. 🎯 Классический стиль (classic)

Цель: Минимальная обработка. Текст максимально близок к тому, что сказал человек. Удаляются только явные филлеры и опечатки STT.

# Что говорим Ожидаемый результат На что смотрим
1.1 «Ну вот, короче, я думаю что нам нужно, ээ, переделать это всё» «Я думаю, что нам нужно переделать это всё.» Филлеры ну вот, короче, ээ убраны. Смысл сохранён
1.2 «Да» «Да.» Короткий ввод не расширяется и не дополняется
1.3 «Привет, это тестовое сообщение» «Привет, это тестовое сообщение.» Пунктуация расставлена, текст не изменён
1.4 «Я хотел сказать что это вот такая вот штука» «Я хотел сказать, что это вот такая вот штука.» вот такая вот сохранено — может быть манерой речи
1.5 «П-практичность очень важна» «П-практичность очень важна.» Заикание сохранено (ru:classic override)
1.6 «Мне нужно... ну типа... закончить проект» «Мне нужно закончить проект.» ну типа убрано, многоточие очищено
1.7 «Один два три четыре пять» «Один, два, три, четыре, пять.» Пунктуация при перечислении
1.8 (тишина / шум 1 сек) Пустая строка или "" Не должно быть иероглифов, рандомных символов

2. 💼 Деловой стиль (business)

Цель: Чуть более формальный текст. Убираются речевые запинки, сглаживаются неловкие конструкции. Для писем, задач, рабочих чатов.

# Что говорим Ожидаемый результат На что смотрим
2.1 «Ну вот, слушай, я тут подумал что нам бы надо, это самое, созвон назначить» «Я подумал, что нам нужно назначить созвон.» Филлеры и запинки убраны, формулировка сглажена
2.2 «П-практичность очень важна» «Практичность очень важна.» Заикание убрано (ru:business override)
2.3 «Скинь мне пожалуйста отчет за вчера, ну и ещё бы хорошо если бы ты добавил графики» «Скинь мне, пожалуйста, отчёт за вчера. Ещё было бы хорошо, если бы ты добавил графики.» Разбивка на предложения, ну убрано
2.4 «Задача: проверить все API endpoints до конца недели» «Задача: проверить все API endpoints до конца недели.» Структурированный ввод не переписан
2.5 «Можно пожалуйста полностью убрать левое меню с проекта в клиенте» «Можно, пожалуйста, полностью убрать левое меню с проекта в клиенте?» Вопросительный знак, запятые
2.6 «Ну это, как бы, ну, ладно, давай созвонимся завтра» «Давай созвонимся завтра.» Вся «обвязка» убрана, ядро сохранено
2.7 «Надо также обсудить бюджет» «Надо также обсудить бюджет.» Слово также сохранено — не филлер

3. 💻 Разработка (tech)

Цель: Code-aware обработка. Технические термины нормализуются, код-диктовка конвертируется в каноничный код. Русская речь о технологиях обрабатывается с пониманием контекста.

# Что говорим Ожидаемый результат На что смотрим
3.1 «Нам нужно использовать юз стейт для хранения данных» «Нам нужно использовать useState для хранения данных.» юз стейтuseState
3.2 «Добавь консоль лог для юзер айди» «Добавь console.log(userId).» Код-диктовка конвертирована
3.3 «Напиши импорт реакт фром реакт» «Напиши import React from "react".» Полная code-строка восстановлена
3.4 «Запусти гит статус потом гит пуш origin main» «Запусти git status, потом git push origin main.» Команды терминала нормализованы
3.5 «Открой src слеш components слеш app точка tsx» «Открой src/components/App.tsx.» слеш/, точка.
3.6 «Бэкенд уже обрабатывает любое имя модели с транскрайб корректно» «Бэкенд уже обрабатывает любое имя модели с transcribe корректно.» Рассказ о коде — остаётся прозой
3.7 «Это реакт компонент, он использует тайпскрипт» «Это React-компонент, он использует TypeScript.» Технические имена нормализованы
3.8 «Напиши конст юзер айди равно джейсон точка парс открывающая скобка response точка data закрывающая скобка» «Напиши const userId = JSON.parse(response.data).» Полная диктовка кода восстановлена
3.9 «Сделай карго чек и потом бан ран дев» «Сделай cargo check и потом bun run dev.» карго чекcargo check
3.10 «Проблема в файле эй ай точка ар эс» «Проблема в файле ai.rs.» Расшифровка побуквенного произношения

4. 🔇 Краевые случаи (все стили)

# Сценарий Что говорим / делаем Ожидаемый результат На что смотрим
4.1 Очень короткая запись «Да» (0.5 сек) «Да.» Не должно быть иероглифов
4.2 Шум без речи (фоновый шум 2 сек) "" или ничего Нет галлюцинаций STT
4.3 Смешанный язык «Мне нужен API endpoint для user management» «Мне нужен API endpoint для user management.» Англицизмы не переводятся
4.4 Числа «Двадцать пять тысяч рублей» «25 000 рублей.» или «Двадцать пять тысяч рублей.» Оба варианта допустимы
4.5 URL диктовка «Перейди на proxy точка talkis точка ru» «Перейди на proxy.talkis.ru.» URL собран
4.6 Повтор слов «Я я хочу хочу сказать» «Я хочу сказать.» Случайные повторы убраны
4.7 Длинный текст (20+ сек) Диктовка абзаца текста Полный абзац, корректная пунктуация Текст не обрезан
4.8 Emoji/спецсимволы в речи «Поставь звёздочку и плюсик» Зависит от стиля Нет крашей

5. Системные тесты (механика вставки)

# Сценарий Ожидаемый результат На что смотрим
5.1 Вставка в VS Code Текст корректно вставлен Не буква "v", а полный текст
5.2 Вставка в Telegram Текст в поле сообщения Фокус сохранён
5.3 Вставка в браузер (input) Текст в поле ввода Работает в Chrome, Safari
5.4 Вставка в терминал Текст в терминал Cmd+V работает
5.5 Быстрая двойная запись (2 подряд) Оба текста вставлены последовательно Нет потери второго
5.6 Буфер обмена восстановлен Скопировать текст → записать → вставить (Cmd+V ещё раз) Исходный буфер восстановился
5.7 Быстрое копирование последней записи Навести курсор на неактивный виджет после успешной транскрибации Внутри виджета появляется иконка копирования; клик копирует последний обработанный текст и кратко показывает состояние успеха

6. 📊 Статистика транскрибированных слов

# Сценарий Ожидаемый результат На что смотрим
6.1 Базовый подсчёт Надиктовать фразу из N слов → на главной «Слов за месяц» и «Слов всего» выросли на N Счёт по финальному (обработанному) тексту
6.2 Несколько записей Сделать 23 записи подряд Показатели суммируются, обновляются без перезапуска окна
6.3 Дедуп Повторная вставка / копирование / retry той же записи Счётчик НЕ увеличивается повторно
6.4 Скорость речи После голосовых записей показывается «сл/мин»; до данных — «—» Среднее = слова / минуты диктовки; файлы/созвоны не влияют на скорость
6.5 Персистентность Перезапустить приложение Показатели сохранились
6.6 Очистка истории Очистить журнал записей «Слов всего» НЕ обнуляется (статистика хранится отдельно)
6.7 Юнит-тесты bun test src/lib/statsCore.test.ts Все кейсы зелёные (подсчёт RU/EN/CJK, дедуп, помесячно, WPM)

7. ⌨️ Смена горячих клавиш (все ОС)

Поведение должно быть одинаковым: клик по полю → нажать сочетание → применилось сразу; Esc — отмена.

# Сценарий Ожидаемый результат На что смотрим
7.1 Windows: сменить на Ctrl+Alt+K Сочетание применилось и сразу работает Регресс AltGr: раньше Ctrl+Alt+<буква> не распознавались
7.2 Windows: не-US раскладка (рус.) Физическая клавиша распознаётся независимо от раскладки Основная клавиша берётся из event.code
7.3 macOS: сменить на Command+Shift+A Применяется по нажатию, без «зажми и отпусти» Раньше требовалось отпустить модификаторы
7.4 Linux: сменить на Ctrl+Shift+J Применилось и работает Тот же веб-путь, что и Windows
7.5 Esc во время записи Запись отменена, прежняя комбинация сохранена Все ОС
7.6 Занятое сочетание Показана ошибка, прежняя клавиша сохранена Регистрация откатывается, статус «не удалось»
7.7 Юнит-тесты bun test src/lib/frontendHotkeyCapture.test.ts Все кейсы зелёные (event.code, AltGr-регресс)

8. Обработка в таблице: статус, остановка, повтор

Идущая обработка показывается строкой в журнале на главной со статусом «Идёт обработка…» и кнопкой ■ (стоп). После остановки/сбоя — «Обработка прервана»/«не завершилась» с кнопкой повтора.

# Сценарий Ожидаемый результат На что смотрим
8.1 Длинная обработка (созвон/файл) В журнале появляется строка «Идёт обработка…» со спиннером и кнопкой ■ Строка видна сразу, до завершения
8.2 Стоп (облако) Нажать ■ → запрос реально отменяется, строка → «Обработка прервана» fetch прерывается AbortController; виджет уходит в idle без спиннера
8.3 Стоп (локальный движок) Нажать ■ → строка «прервана», поздний результат игнорируется Локальная задача добегает в фоне, но UI не обновляет
8.4 Повтор прерванной (голос/созвон/файл) Кнопка ⟲ запускает обработку заново → «завершено» Голос — из аудио, созвон — из дорожек, файл — из пути
8.5 Техсбой обработки Строка «Обработка не завершилась» + ⟲ Аудио/дорожки/путь сохранены для повтора
8.6 Краш/закрытие во время обработки После перезапуска «processing» → «Обработка прервана» Реконсиляция при старте виджета
8.7 Многократные клики ■ Безопасно, без ошибок cancelProcessing идемпотентен
8.8 Юнит-тесты bun test src/lib/statsCore.test.ts processing/interrupted не попадают в статистику

Чеклист прохождения

[ ] Classic 1.11.8
[ ] Business 2.12.7
[ ] Tech 3.13.10
[ ] Краевые 4.14.8
[ ] Вставка 5.15.6
[ ] Статистика 6.16.7
[ ] Горячие клавиши 7.17.7
[ ] Обработка/стоп/повтор 8.18.8