tests: закрыты три дыры в покрытии, найденные мутационным анализом

This commit is contained in:
2026-10-02 03:06:40 +03:00
parent dc8d9bc598
commit 2c7bca0d82
9 changed files with 183 additions and 19 deletions
+64 -5
View File
@@ -10,17 +10,21 @@
## Статус
Проектирование завершено. Код не написан.
Реализовано и принято на эталонном корпусе. 38 тестов, мутационная проверка, сквозной recall@5 = 20/20.
| Документ | Что внутри |
| Что | Вердикт приёмки |
|---|---|
| [`docs/SPEC.md`](docs/SPEC.md) | полная спека: модель данных, индекс, маршрутизация, watcher, интерфейс, приёмка |
| [`TASK.md`](TASK.md) | ТЗ для исполнителя (opencode): стек, схема БД, контракты, чего не делать |
| [`TESTING.md`](TESTING.md) | тест-план: 6 приёмочных проверок, команды, признаки провала |
| юнит-тесты всех модулей | ✅ |
| мутационная проверка (13 мутаций) | ✅ все убиты |
| индексация: 3 коллекции, повторный прогон — 0 обновлений | ✅ |
| recall@5 на эталонном корпусе (sem 20/20, lex 3/3) | ✅ |
| MCP-протокол живым клиентом + холодный старт | ✅ |
## Идея
- Коллекций (папок-тем) — сколько угодно; они не мешают друг другу.
- **Коллекция — каталог, в котором есть `*.md` напрямую** (не в подкаталогах). Вложенные папки
без своих заметок коллекциями не считаются — иначе одни и те же файлы индексируются по нескольку раз.
- Индекс каждой коллекции живёт в её `.memo/index.db` и **удаляется без потерь** — пересобирается.
- Поиск — обычный read-only инструмент; записи в markdown он не делает никогда.
- Только локально: эмбеддинг на CPU, сеть не нужна ни при индексации, ни при поиске.
@@ -36,6 +40,61 @@ memo-mcp # MCP-сервер (stdio): memo_search / memo_status / memo_reinde
`memo-core` не знает ни про watcher, ни про MCP — это драйверы поверх ядра.
## Быстрый старт
```bash
./gradlew installDist # собрать все дистрибутивы
CLI=memo-cli/build/install/memo/bin/memo
$CLI index ~/notes # проиндексировать дерево (коллекции найдутся сами)
$CLI search ~/notes "чем чинят карточку в jellyfin"
$CLI search ~/notes "76.132" --mode lex --json
$CLI status ~/notes
```
MCP-сервер (stdio), регистрируется как обычный MCP-сервер:
```json
{
"mcpServers": {
"memo": {
"command": "/opt/memo/memo-mcp",
"env": { "MEMO_MODEL_DIR": "/opt/memo/models/siglip2" }
}
}
}
```
Инструменты: `memo_search(path, query, k, mode)`, `memo_status(path)`, `memo_reindex(path)`.
`memo_search` **сам создаёт индекс**, если его ещё нет — можно просто писать `.md` и сразу искать.
Демон слежения (для правок мимо агента — людьми, git, сторонними редакторами):
```bash
memo-watch/build/install/memo-watch/bin/memo-watch ~/notes
```
## Приёмка
```bash
bash scripts/accept.sh # полный прогон: сборка, тесты, мутации, индекс, recall, MCP
bash scripts/accept.sh --fast # то же без мутационной проверки (самая долгая)
```
Правило проекта: **«зелёная сборка» ничего не доказывает.** Тесты проверяются мутациями
(`e2e/mutations.tsv`): боевой код ломается, и нужный тест обязан упасть. Выжившая мутация —
дыра в покрытии, а не удача. Приёмка идёт на реальном корпусе (`scripts/make_e2e_corpus.sh`),
а не на моках.
## Документы
| Документ | Что внутри |
|---|---|
| [`docs/SPEC.md`](docs/SPEC.md) | полная спека: модель данных, индекс, маршрутизация, watcher, интерфейс, приёмка |
| [`TASK.md`](TASK.md) | ТЗ для исполнителя: стек, схема БД, контракты, чего не делать |
| [`TESTING.md`](TESTING.md) | тест-план: приёмочные проверки, команды, признаки провала |
| [`docs/orders/`](docs/orders/) | журнал заказов исполнителю — с доказательствами дефектов, а не «сделай хорошо» |
## Зависимости (проверено 02.10.2026)
| Что | Координата | Откуда |