opencode-config/docs/decisions/055-pr-124-keyword-search-out-of-box.md
Sergey 7249f1fcb5
fix(memory): keyword search out-of-box + doctor gaps + tests (#124)
* 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>
2026-07-29 17:20:59 +03:00

40 lines
No EOL
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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) + system `rg`
через 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.
- **`file` command для arch-mismatch**: rejected — extra dependency,
эвристика по path покрывает основной случай (@vscode/ripgrep platform
dir names стандартизированы).