feat: core recording lifecycle (#1) #2
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/1-core-recording-lifecycle"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #1
Ядро жизненного цикла записи (
src/core/, без импортовobsidianи Node API) по плануdocs/superpowers/plans/2026-09-27-core-recording-lifecycle.mdи спекеopenspec/changes/core-recording-lifecycle/:saveCapture,QueueRunner.tick, ручные командыretryиclaimAll;test-01.Проверка:
npm test— 10 файлов, 125/125;npm run build— exit 0. Каждая задача прошла ревью через subagent-driven-development, финальное ревью всей ветки — на Opus (Critical нет; 1 Important и 3 Minor исправлены одной волной, повторная проверка — все 7 пунктов ADDRESSED).Rulings I made
Все записаны в
openspec/changes/core-recording-lifecycle/design.md, раздел «Decisions made without discussion», №29–36.tests/queue.test.tsиtests/queue-commands.test.tsоставлены как в плане, не вынесены вtests/fakes.ts. Цена ошибки: около 20 строк дублирующейся подготовки держать синхронными; перенос позже механический.dispose()очередь не отправляет и не пишет в vault.tick()не начинает проход, цикл отправки прерывается,send()выходит до записиsent; запрос в полёте завершается как временная ошибка. Отступление от дословного кода плана, добавлен тест. Причина: код плана сжигал попытку у каждой оставшейся записи при выгрузке и писал в vault после неё — больше, чем принятая в решении 24 цена в одну попытку. Цена ошибки: несколько строк проверок и тест, лишние, если обёртка никогда не вызываетtick()послеdispose().retryэтого устройства иsentстарше 10 минут), как требует спека; абзац «Ручные команды» в design.md обновлён. Цена ошибки: свои повторы уходят до 30 минут раньше срока (один лишний запрос на запись, без потери данных). Поведение подтверждено человеком.pass(). Первая ошибка пробрасывается в конце, так чтоtick()по-прежнему отклоняется. Цена ошибки:pass()чуть сложнее;retry()/claimAll()могут отклониться, уже изменив свою запись.tests/fixtures/*.webmубран из.gitignore. Решения 9 и 25 требуют коммитить аудио-фикстуры; правило давало ложный зелёный локально и красный на чистом клоне. Цена ошибки: можно случайно закоммитить большой webm.sentэтого устройства с тем жеvoice-sent-at; послеdispose()не работают восстановление зависшихsent,retry()иclaimAll(); тест наsentна диске во время запроса; тест, чтоretry()дляsentничего не делает. M-3, T1, T4 оставлены отложенными. Цена ошибки: около 20 лишних строк; если проверка слишком строгая — законный поздний результат отбрасывается и запись повторяется через 10 минут (один лишний запрос).Отложенные мелочи
Финальное ревью сочло, что ни одна не блокирует merge.
esbuild.config.mjsжёстко задаёт абсолютный путь к тестовому vault (решение 19). Путь теперь вписан в CLAUDE.md проекта; переопределение через env остаётся отложенным.types: ["node"]в tsconfig позволяет Node-глобалам (process,Buffer) проходить проверку типов вsrc/core; защитный тест ловит только import/require. Рекомендация ревьюера — закрыть до issue про обёртку (отдельный tsconfig дляsrcили расширить регулярку).note.tsнет обработки CRLF — такая заметка молча пропускается и остаётсяsaved, данные не теряются.voice-error/voice-next-attempt/voice-sent-atчитаются как отсутствующие (согласуется с решением 23).claimизsavedне покрыт юнит-тестом (покрыт сквозным).renderNote(inserted)безtextмолча вставляет пустую строку.'—'в статусе retry недостижимо.statusLineнеявно покрываетinserted.notePathвычисляется дважды вcapture.ts.createBinary, который бросает исключение вместо перезаписи.tick()нужно учесть в обёртке (doc-комментарий добавлен, сторона обёртки открыта).🤖 Generated with Claude Code
https://claude.ai/code/session_01QKHeGuAYh4W1jNdjMConZa