* fix(docker): add system ripgrep via apt for keyword search fallback * fix(ci): install ripgrep and npm deps for keyword search in CI * fix(memory-search): warn when ripgrep not resolvable instead of silent skip * fix(memory-doctor): check rg status, arch mismatch, and require errors * test(memory): add keyword search and doctor unit tests * test(memory): unskip e2e keyword tests without RUN_LIVE * docs(handoff): add handoff and ADR for keyword search fix * test(memory): remove unused var in keyword search test * docs(handoff): set PR number to 124 * docs(project-map): update after structural changes (PR#124) --------- Co-authored-by: opencode-agent <agent@opencode.local>
2.4 KiB
2.4 KiB
ADR-055: System ripgrep fallback + memory-doctor status checks
Статус
Accepted (2026-07-29)
Контекст
Keyword search (ripgrep) в memory-системе заявлен в README как "always
works", но на практике system rg не был установлен нигде — только
npm-пакет @vscode/ripgrep через volume-mount (хрупко, platform-specific).
CI не устанавливал ripgrep. memory-doctor имел 4 диагностических gap'а:
allGreen проверял rgBin!==null вместо r.status===0, расхождение
allowSystemFallback с memory-search, нет arch-mismatch detection,
require-ошибки не попадали в отчёт.
Решение
- Dual ripgrep source:
@vscode/ripgrep(npm, primary) + systemrgчерез apt (fallback). Dockerfile и CI устанавливают оба. resolveRgBinary({ allowSystemFallback: true })в memory-doctor — консистентно с memory-search (раньше doctor не пробовал system fallback, что расходилось с реальным поведением search).checkRipgrepвозвращает{ lines, rgWorks }—rgWorks=rgBin!==null && r.status===0.allGreenиспользуетrgWorks, неrgBin!==null— закрывает G9 (битый бинарник с существующим path).detectArchMismatch()— эвристика по имени path бинарника (contains 'darwin'/'linux'/'win32' + 'arm64'/'x64'). Не вызываетfile— portable.- Warning в stderr при
rgBin===nullв memory-search — вместо молчаливого skip. Упрощает диагностику.
Альтернативы
- Только system rg (убрать npm-пакет): rejected — npm-пакет даёт pinned version и не зависит от distro package manager; Dockerfile slim image может не иметь rg в apt без extra repos.
- Только npm-пакет (убрать apt): rejected — volume-mount хрупок, CI runner без npm install для .opencode/package.json = нет rg.
filecommand для arch-mismatch: rejected — extra dependency, эвристика по path покрывает основной случай (@vscode/ripgrep platform dir names стандартизированы).