Зачем:
- Сохранить полный ход проверки гипотез и исключить ненужный повтор старой матрицы.
Что:
- Добавлен ledger этапов W/M/Q/E/C с рецептами, числами и причинами отсева.
- Зафиксированы правила переиспользования результатов и границы повторных прогонов.
- Связана следующая end-to-end карта в задаче #45.
Проверка:
- uv run --no-sync pytest -q (389 passed, 2 skipped).
- Codex taste-review и ai-text-lint: APPROVED.
Зачем:
- Проверить переносимость Intel-handoff на Ryzen и закрыть выбор CPU-профиля.
Что:
- Усилена проверка связи Ryzen-manifest с капсулой и переносимости рецептов.
- Добавлены регрессионные тесты и публичный отчет с исходом new map.
Проверка:
- uv run --no-sync pytest -q (389 passed, 2 skipped).
- uv run --no-sync ruff check src/local_transcriber/benchmark_experiment.py tests/test_benchmark_experiment.py.
Зачем:
- капсула должна содержать каждый вход, названный в manifest
- Intel handoff нужно проверять на Ryzen без сравнения чужого SKU
Что:
- входы manifest связаны с индексом и SHA-256 файлов капсулы
- validate-only финального handoff пропускает только проверку машины
- версии Python, пакетов и экспериментальной сборки по-прежнему обязательны
Проверка:
- uv run pytest -q tests/test_benchmark_experiment.py
- uv run ruff check для изменённых файлов
Зачем:
- часть Intel-стендов не публикует ACPI platform_profile
- balanced-режим на таком стенде доступен через power-profiles-daemon
Что:
- добавлен fallback на powerprofilesctl get
- поведение закреплено тестом
Проверка:
- uv run pytest -q tests/test_benchmark_experiment.py
- uv run ruff check для изменённых файлов
- Зачем:
- нужно оценить локальные ASR-кандидаты для русских встреч с английскими IT-терминами.
- Что:
- собраны первичные данные по GigaAM, Nemotron, Qwen3-ASR, Canary и Cohere.
- разделены известные факты, рабочие гипотезы, рекомендация и неизвестные.
- сопоставлены языки, таймкоды, режимы работы, поставка и лицензии.
- Проверка:
- выполнено горячее ревью документа и git diff --cached --check.
- Зачем:
- один агент не может последовательно работать на двух ноутбуках.
- Что:
- этапы 0-4 закреплены за Intel, этапы 5-6 - за зависимой Ryzen-задачей.
- добавлен проверяемый handoff через отчет, commit и приватную ZIP-капсулу.
- устранен штатный возврат с Ryzen на Intel и ограничен финальный бюджет.
- Проверка:
- `.venv/bin/pytest -q tests/test_diarization_calibration.py tests/test_speaker_diarizer.py tests/test_diarization.py` (61 passed).
- Зачем:
- нужен ограниченный эксперимент для отсева явных проигрышей без полного перебора и лишней точности.
- Что:
- зафиксирована поэтапная матрица проверок на Intel и Ryzen.
- определены пороги скорости, условия качества, контроль памяти и приватности.
- описаны воспроизводимость стенда, QDQ-происхождение данных и правила решения.
- Проверка:
- `.venv/bin/pytest -q tests/test_diarization_calibration.py tests/test_speaker_diarizer.py tests/test_diarization.py` (61 passed).
- Зачем:
- вывод об обычном обновлении должен опираться на проверяемые API и wheel для поддерживаемых сред.
- Что:
- исправлены ссылки на tagged source и уточнены границы manylinux и будущего CPython 3.15.
- зафиксирован smoke test CPython 3.13 и практическая польза обновления.
- вычищены двусмысленные формулировки без изменения фактов и чисел.
- Проверка:
- uv run pytest -q: 334 passed, 2 skipped.
- 23 внешние ссылки отвечают HTTP 200; git diff --check.
- Зачем:
- требовалось определить первый wheel с публичным API для шага окна.
- Что:
- зафиксирована граница 1.13.5/1.13.6 и матрица Python/платформ.
- выбрано обычное обновление и задана точная граница прототипа.
- Проверка:
- git diff --cached --check.
- Зачем:
- исследовательское решение должно однозначно задавать повторное использование эмбеддингов и проверку счетчиков.
- Что:
- выбран внутренний интерфейс подготовки и финализации sherpa-onnx.
- закреплены входы, вариант NME и критерии качества.
- измерения CPU и памяти отделены от будущих гейтов карты.
- Проверка:
- `uv run pytest -q` (334 passed, 2 skipped).
- `git diff --check`.
- 31 внешняя ссылка отвечает HTTP 200.
- Зачем:
- README и backlog должны одинаково и однозначно описывать границы CPU-замеров перед merge.
- Что:
- Замер Ryzen ограничен одной зафиксированной тестовой машиной.
- Из backlog убраны повтор и искусственные противопоставления вокруг целевого SKU.
- Проверка:
- `git diff --check`.
- Зачем:
- Исследование числа говорящих не проходило отдельный Wayfinder-тикет и не должно публиковаться как принятое решение.
- Что:
- Записка об оценке числа говорящих удалена из publication-ветки.
- Проверка:
- `git diff --check`.
- Зачем:
- вопрос тикета требует проверить формы официальных release-графов, а исходная записка опиралась только на экспортные контракты.
- Что:
- зафиксированы реальные формы и CPU smoke-test batch size 2 для WeSpeaker, CAMPPlus и TitaNet.
- уточнены поддержка equal-length batch у CAMPPlus и fallback между S8S8, U8U8 и U8S8.
- Проверка:
- git diff --check.
- Зачем:
- нужно выбрать реалистичный способ ускорения эмбеддингов на разных x86 CPU.
- Что:
- зафиксированы ограничения batch, stream/session и static INT8 для трех моделей.
- рекомендованы два прототипа и минимальная матрица CPU/ISA.
- Проверка:
- git diff --cached --check.
- Зачем:
- требовалось сравнить облегченные модели диаризации на старом CPU без изменения рабочей конфигурации.
- Что:
- добавлен воспроизводимый и возобновляемый прогон матрицы Pyannote FP32/INT8 с WeSpeaker и TitaNet.
- зафиксированы измерения 108 ячеек, ограничения эксперимента и решение сохранить модель по умолчанию.
- локальные записи в каталоге tmp исключены из индекса Git.
- Проверка:
- .venv/bin/python -m pytest.
- /tmp/local-transcriber-ruff-bin/ruff check scripts/benchmarks/diarization_calibration.py tests/test_diarization_calibration.py.
- Зачем:
- транскрипты ONNX и faster-whisper на CPU имели одинаковую подпись.
- Что:
- для ONNX добавлено обозначение ONNX (CPU) в метаданных транскрипта.
- различие движков и пользовательская шапка покрыты тестами.
- примеры шапки в README и PRD приведены к текущему ONNX-профилю.
- Проверка:
- env -u FORCE_COLOR -u COLUMNS -u LINES uv run pytest.
- Зачем:
- предупреждения из задачи #7 выглядели как фрагменты Python traceback.
- Что:
- на время запуска CLI установлен однострочный Rich-рендер предупреждений.
- сохранены буквальный текст сообщений и восстановление глобального hook.
- single- и batch-сценарии покрыты автоматическим тестом.
- Проверка:
- uv run pytest tests/test_cli.py -q.
- Зачем:
- в #27 чистая установка Linux не включала sherpa-onnx-core, поэтому import sherpa_onnx падал при загрузке libonnxruntime.so.
- uv при универсальном резолвинге использовал метаданные armv7 wheel без Requires-Dist и терял обязательную платформенную зависимость.
- Что:
- версия sherpa-onnx зафиксирована на 1.13.5 вместе с явным metadata override для sherpa-onnx-core==1.13.5.
- рядом с pin и override записано правило их совместного обновления.
- uv.lock обновлен с зависимостью на core и wheel-файлами поддерживаемых платформ.
- Проверка:
- uv lock --check и uv tree --locked --package sherpa-onnx подтвердили зависимость от core 1.13.5.
- чистые uv sync --frozen, uv pip check и import sherpa_onnx завершились успешно в Linux.
- uv run pytest -q: 282 passed, 2 skipped.
- uvx ruff check src/local_transcriber/speaker_diarizer.py tests/test_speaker_diarizer.py завершился успешно.
- Зачем:
- в #27 чистая установка Linux не включала sherpa-onnx-core, поэтому import sherpa_onnx падал при загрузке libonnxruntime.so.
- uv при универсальном резолвинге использовал метаданные armv7 wheel без Requires-Dist и терял обязательную платформенную зависимость.
- Что:
- версия sherpa-onnx зафиксирована на 1.13.5 вместе с явным metadata override для sherpa-onnx-core==1.13.5.
- рядом с pin и override записано правило их совместного обновления.
- uv.lock обновлен с зависимостью на core и wheel-файлами поддерживаемых платформ.
- Проверка:
- uv lock --check и uv tree --locked --package sherpa-onnx подтвердили зависимость от core 1.13.5.
- чистые uv sync --frozen, uv pip check и import sherpa_onnx завершились успешно в Linux.
- uv run pytest -q: 282 passed, 2 skipped.
- uvx ruff check src/local_transcriber/speaker_diarizer.py tests/test_speaker_diarizer.py завершился успешно.
- Зачем:
- решения по неопределённым словам и CPU-стоимости должны быть проверяемыми до публикации реализации.
- Что:
- задокументировано отклонение post-hoc сглаживания Speaker ? по соседним кластерам.
- добавлено исследование стоимости каскада и облегчённых embedding-моделей.
- Проверка:
- `git diff --cached --check` — без ошибок.
Зачем:
- локальным транскриптам нужна структура реплик для конспектов и протоколов.
Что:
- добавлены пословные таймкоды для всех ASR-бэкендов и сведение с Sherpa-ONNX.
- реализованы CLI-флаги, деградация без потери ASR и speaker Markdown.
- добавлены проверяемый кеш моделей, тесты и документация.
Проверка:
- `pytest` — 283 passed, 1 skipped.
- `pyright` — 0 errors.
- Ruff и `git diff --check` — без ошибок.
- выполнены три контрольных прогона на реальных записях.
- Зачем:
- спецификация не должна оставлять неоднозначности перед реализацией диаризации.
- Что:
- уточнены сведение слов, таймкоды и предупреждение о малом кластере.
- очищены терминология и граница между ADR и спецификацией.
- сохранён результат сравнения WeSpeaker и CAMPPlus.
- Проверка:
- git diff --cached --check и проверка относительных ссылок.
- Зачем:
- решения карты должны стать устойчивой основой для реализации диаризации.
- Что:
- добавлены ADR-007 и спецификация пословной диаризации.
- дополнен доменный словарь и удалены закрытые направления из backlog.
- Проверка:
- git diff --cached --check.
- Зачем:
- потребовалось отделить временный результат диаризации от итоговых реплик транскрипта.
- Что:
- добавлено определение разметки говорящих и перечислены нежелательные синонимы.
- уточнено, что разметка не содержит текст, имена участников и голосовые эмбеддинги.
- Проверка:
- выполнена команда git diff --cached --check.
- Зачем:
- решение о пословной привязке должно использовать единый язык во всех документах карты.
- Что:
- определены сегмент распознавания и слово с временной привязкой.
- реплика говорящего отделена от единицы запуска модели распознавания.
- Проверка:
- git diff --check.
- Зачем:
- результат benchmark нужно интерпретировать с учётом ограничения питания ноутбука.
- Что:
- зафиксировано урезанное питание во время прогонов.
- визуальная оценка потери производительности около 30% явно отделена от измеренных результатов.
- Проверка:
- git diff --check.
- Зачем:
- требовалось проверить долю смешанных ASR-сегментов на трёх записях, включая разговоры на двоих.
- Что:
- добавлен отчёт с долями сегментов и времени для трёх рабочих созвонов.
- обвязка замеров переведена на откалиброванный порог 0,89.
- исследовательский скрипт приведён к формату ruff.
- Проверка:
- выполнены три полных прогона bench_conflict.py с WeSpeaker и порогом 0,89.
- uv run ruff check и ruff format --check прошли успешно.
- Зачем:
- слуховая проверка (#12) показала, что разметку диаризации читают как
истину, хотя она содержит ложный кластер, пропуски и неполные перекрытия.
- Что:
- в глоссарий добавлен термин «Опорная разметка» с запретом на
«эталонную», «истинную» и ground truth.
- определение описывает роль разметки в измерении, а не результат
конкретного прогона: выводы о пороге 0,9 остались в тикетах карты.
- Проверка:
- git show --stat HEAD и чтение CONTEXT.md.
- Зачем:
- выводы о жизненном цикле и возможностях моделей должны читаться как единое исследование.
- Что:
- материал перестроен вокруг слоёв, платформ и уровней доказательства.
- объединены выводы по Intel, AMD, Apple и браузерным путям.
- подтверждённые возможности отделены от выводов и необходимых экспериментов.
- Проверка:
- относительные ссылки и структура Markdown проверены.
- git diff --cached --check выполнен успешно.
- Зачем:
- нужна фактическая опора для решений карты о диаризации на Intel-пути.
- Что:
- исследованы жизненные циклы ORT, OpenVINO, DirectML и Windows ML.
- сравнены пути AMD, Apple Silicon и браузерные EP для текущих моделей.
- зафиксированы wheel-матрицы, fallback и необходимые model-specific тесты.
- Проверка:
- git diff --cached --check.
- Зачем:
- тикеты карты #10-#13 опираются на измерительную обвязку, которая до сих пор
жила во временном каталоге сессии и исчезла бы вместе с ним.
- Что:
- перенесены четыре скрипта разведки: ASR, один прогон диаризации, свип порога
кластеризации и подсчёт чистоты ASR-сегментов.
- общая часть вынесена в common.py: пути от корня репозитория вместо
захардкоженных, конфигурация диаризатора, проверка наличия моделей.
- починен замер пиковой памяти: нужен экспорт K32GetProcessMemoryInfo из
kernel32 и явные argtypes, иначе дескриптор процесса уезжает 32-битным.
- модели и выход замеров исключены из истории локальным .gitignore.
- Проверка:
- export PYTHONIOENCODING=utf-8
- uv run --with sherpa-onnx python .scratch/diarization/bench_diar.py "<запись>" 8 0.9
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>