feat: OpenAI-compatible transcriber provider (#5) #6
@ -108,4 +108,5 @@ new OpenAiTranscriber(http: HttpClient, settings: () => OpenAiSettings, random:
|
||||
15. 2026-09-27 (план) — Boundary — `----voice-note-` + 24 hex-символа из `random` (`Math.random` в плагине). *Детерминированно в тестах; вероятность совпадения с байтами аудио пренебрежимо мала при 96 битах.* **Совпадение boundary с байтами аудио испортит тело — 400, `permanent`; «Повторить распознавание» сгенерирует новый boundary.**
|
||||
16. 2026-09-27 (исполнение, контроллер SDD, R-1) — В `OpenAiTranscriber.transcribe` (Task 3) единственный вызов `redact()` вынесен из `try/catch` в отдельный, тоже защищённый `try/catch` с запасным вариантом — жёстко заданной строкой `'внутренняя ошибка'` без интерполяции — если `redact()` сам бросит исключение. Это отступление от буквального кода плана (Task 3, Step 5): план дословно ставил единственный вызов `redact()` ПОСЛЕ `try/catch`, что ревьюер финального ревью задачи 3 нашёл как реальный (Important) пробел. *Дословный код плана проходил все тесты и typecheck, но противоречил собственному Global Constraint плана «`OpenAiTranscriber.transcribe` никогда не бросает»: гипотетическое будущее изменение `classify()`/`fail()`, из-за которого `message` перестанет быть строкой, привело бы к необработанному исключению за пределами метода — ровно то, что этот метод существует, чтобы предотвратить.* **Цена ошибки: крайне маловероятный, сейчас недостижимый при текущих типах путь; если рулинг был не нужен — цена лишь две защитные строки кода без изменения поведения ни для одного существующего пути.**
|
||||
17. 2026-09-27 (исполнение, Task 6 implementer, R-2) — В `src/main.ts` поле `settings` класса `VoiceNotePlugin` объявлено с модификатором `override`, которого нет в буквальном коде плана (Task 6, Step 3). *Дословный код плана не проходил typecheck (TS4114): установленный пакет `obsidian` (1.13.1) с версии 1.13.0 объявляет базовое поле `Plugin.settings?: unknown`, а `tsconfig.json` репозитория требует `noImplicitOverride: true` — любое поле подкласса, перекрывающее поле базового класса, обязано нести `override`.* **Цена ошибки: ноль — чисто синтаксический модификатор без изменения поведения; без него код не компилируется, других исходов нет.**
|
||||
18. 2026-09-27 (исполнение, контроллер SDD, R-3) — Из находок финального ревью всей ветки (M-1..M-5, плюс дообследование отложенных T3.5) исправлены только M-1 (индекс среза `Content-Disposition` в `redact()` считался по строке в нижнем регистре, но применялся к оригиналу — некоторые Unicode-символы меняют длину при `toLowerCase()`), T3.5 (`errorText` в `transcribe()` теоретически может бросить на объекте без `toString`/`valueOf`/`Symbol.toPrimitive`) и M-2 (устаревшие сигнатуры `classify(status,text)`/`redact(message,apiKey)` и неточное описание пустого `.catch` в этом же design.md, строки 35 и 68). *Ревьюер сам предложил объединить эти три в один фикс-коммит как однострочные, нулевого риска правки без изменения поведения ни на одном достижимом пути.* **Цена ошибки: не найдено критичных/важных находок; отложенные (M-3 стилистика недостижимого catch, M-4 косметическое Notice после unload, M-5 saveSettings перезаписывает только `{openai}` — задел на будущее для issue-обёртки) переносятся в описание PR и, если актуальны, в follow-up issue при закрытии.** Отклонённые находки: M-3, M-4, M-5 (обоснование см. в отчёте финального ревью и в ledger SDD).
|
||||
18. 2026-09-27 (исполнение, контроллер SDD, R-3) — Из находок финального ревью всей ветки (M-1..M-5, плюс дообследование отложенных T3.5) исправлены только M-1 (индекс среза `Content-Disposition` в `redact()` считался по строке в нижнем регистре, но применялся к оригиналу — некоторые Unicode-символы меняют длину при `toLowerCase()`), T3.5 (`errorText` в `transcribe()` теоретически может бросить на объекте без `toString`/`valueOf`/`Symbol.toPrimitive`) и M-2 (устаревшие сигнатуры `classify(status,text)`/`redact(message,apiKey)` и неточное описание пустого `.catch` в этом же design.md, строки 35 и 68). *Ревьюер сам предложил объединить эти три в один фикс-коммит как однострочные, нулевого риска правки без изменения поведения ни на одном достижимом пути.* **Цена ошибки: не найдено критичных/важных находок; отложенные (M-3 стилистика недостижимого catch, M-4 косметическое Notice после unload, M-5 saveSettings перезаписывает только `{openai}` — задел на будущее для issue-обёртки) переносятся в описание PR и, если актуальны, в follow-up issue при закрытии.** Статус M-3, M-4, M-5 — `deferred` (обоснование см. в отчёте финального ревью и в ledger SDD).
|
||||
19. 2026-10-10 (завершение ветки, основная сессия, R-4) — Мелкие находки ревью задач T1.1, T1.2, T3.1–T3.4, T5.1, T5.2 закрыты статусом `rejected`: финальное ревью ветки заново рассмотрело каждую и признало приемлемой как есть, T3.5 исправлена в R-3. Попутно исправлена формулировка решения 18: M-3, M-4, M-5 — `deferred`, а не «отклонённые», как и записано в ledger (R-3). *У каждой находки должен быть итоговый статус. Вывод финального ревьюера (opus) — единственная независимая оценка этих находок; ни одна не затрагивает поведение на достижимых путях.* **Если какая-то из них окажется значимой (например, T1.1 — экранирование `"`/CRLF в имени части multipart при появлении недоверенного вызывающего кода), её придётся завести заново; сейчас все вызывающие места передают фиксированные имена.**
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user