93987f2dfc
Seventeen markdown files at the repo root, twelve of them dated one-shot reports sitting next to CLAUDE.md. That is why stale docs read as current: nothing in the path said which was which. Root now keeps CLAUDE.md and AGENTS.md. Living docs move under docs/ and carry a Last verified line. Dated measurements move to docs/evals/ ISO-prefixed, and are never edited after the day, so a newer number is a new file. The senior review moves to docs/archive/. Every reference was rewritten across markdown, Go comments, the Makefile and the recall fixture. The touched Go packages still build. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
419 lines
18 KiB
JSON
419 lines
18 KiB
JSON
{
|
||
"schema_version": 1,
|
||
"name": "ru_recall_v1",
|
||
"notes": [
|
||
"Held-out note-recall fixture. Each case is a fresh semantic store: insert every note, embed the query, take the top 3 — the same read path cmd/mavend/voice.go runs for IntentQuery.",
|
||
"Queries paraphrase their note on purpose. A query that repeats the note's words measures string matching, not recall. TestFixtureIsParaphrased enforces a ceiling on word overlap.",
|
||
"want:\"\" means the query must recall NOTHING. Those cases measure false recall — the direction the spec calls out (a confident wrong fact is worse than a known gap).",
|
||
"The distractor tag marks cases where a second note is plausible and only one is right. The hard tag marks cases with little or no shared vocabulary.",
|
||
"Content is written for this operator: his preferences, his homelab, things he said once and would expect Maven to remember weeks later."
|
||
],
|
||
"filler": [
|
||
{"id": "f1", "text": "в субботу ходил в баню", "kind": "note"},
|
||
{"id": "f2", "text": "купил новые кроссовки сорок третьего размера", "kind": "note"},
|
||
{"id": "f3", "text": "сериал закончился на третьем сезоне", "kind": "note"},
|
||
{"id": "f4", "text": "сосед сверху делает ремонт", "kind": "note"},
|
||
{"id": "f5", "text": "билеты в театр брал заранее", "kind": "note"},
|
||
{"id": "f6", "text": "выучил пару аккордов на гитаре", "kind": "note"},
|
||
{"id": "f7", "text": "записался к стоматологу", "kind": "note"},
|
||
{"id": "f8", "text": "поменял лампочку в коридоре", "kind": "note"},
|
||
{"id": "f9", "text": "погулял вдоль реки", "kind": "note"},
|
||
{"id": "f10", "text": "the balcony door sticks in winter", "kind": "note"},
|
||
{"id": "f11", "text": "the neighbour's dog barks at cyclists", "kind": "note"},
|
||
{"id": "f12", "text": "i finished the book about volcanoes", "kind": "note"}
|
||
],
|
||
"cases": [
|
||
{
|
||
"id": "ru-pref-001",
|
||
"lang": "ru",
|
||
"tags": ["preference", "paraphrase"],
|
||
"query": "какой кофе мне наливать",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "я пью кофе без сахара", "kind": "note"},
|
||
{"id": "n2", "text": "по утрам бегаю в парке", "kind": "note"},
|
||
{"id": "n3", "text": "не люблю громкую музыку", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-pref-002",
|
||
"lang": "ru",
|
||
"tags": ["preference", "homelab", "paraphrase", "hard"],
|
||
"query": "когда запускать резервное копирование",
|
||
"want": "n1",
|
||
"note": "The docs/design.md preference-seam example, phrased as the operator would ask it later.",
|
||
"notes": [
|
||
{"id": "n1", "text": "бэкапы лучше делать ночью в три часа", "kind": "note"},
|
||
{"id": "n2", "text": "обновления ставлю по субботам", "kind": "note"},
|
||
{"id": "n3", "text": "логи храню месяц", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-home-003",
|
||
"lang": "ru",
|
||
"tags": ["homelab", "paraphrase"],
|
||
"query": "что помогло от мерцания монитора",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "мерцание экрана прошло после обновления драйвера amdgpu", "kind": "note"},
|
||
{"id": "n2", "text": "вентилятор шумит на полной нагрузке", "kind": "note"},
|
||
{"id": "n3", "text": "поставил новый ssd в ноутбук", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-home-004",
|
||
"lang": "ru",
|
||
"tags": ["homelab", "distractor", "hard"],
|
||
"query": "адрес домашнего сервера",
|
||
"want": "n2",
|
||
"note": "Two notes carry an IP. Only one is the server.",
|
||
"notes": [
|
||
{"id": "n1", "text": "роутер живёт на 192.168.1.1", "kind": "note"},
|
||
{"id": "n2", "text": "домашний сервер на 192.168.1.104", "kind": "note"},
|
||
{"id": "n3", "text": "принтер подключен по usb", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-home-005",
|
||
"lang": "ru",
|
||
"tags": ["homelab"],
|
||
"query": "где искать настройки nginx",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "конфиг nginx лежит в /etc/nginx/sites-enabled", "kind": "note"},
|
||
{"id": "n2", "text": "сертификаты обновляет certbot по расписанию", "kind": "note"},
|
||
{"id": "n3", "text": "порт 8080 занят вебкой", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-pref-006",
|
||
"lang": "ru",
|
||
"tags": ["preference", "distractor", "hard"],
|
||
"query": "что мне нельзя есть",
|
||
"want": "n1",
|
||
"note": "The Friday-meat note is a plausible second answer but it is a habit, not a restriction.",
|
||
"notes": [
|
||
{"id": "n1", "text": "у меня аллергия на орехи", "kind": "note"},
|
||
{"id": "n2", "text": "не ем мясо по пятницам", "kind": "note"},
|
||
{"id": "n3", "text": "люблю острую еду", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-pers-007",
|
||
"lang": "ru",
|
||
"tags": ["distractor", "paraphrase"],
|
||
"query": "когда мамин праздник",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "день рождения мамы четырнадцатого марта", "kind": "note"},
|
||
{"id": "n2", "text": "у брата день рождения в июле", "kind": "note"},
|
||
{"id": "n3", "text": "годовщина в сентябре", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-home-008",
|
||
"lang": "ru",
|
||
"tags": ["homelab", "hard", "paraphrase"],
|
||
"query": "чем ускоряется языковая модель",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "модель крутится на встройке через vulkan", "kind": "note"},
|
||
{"id": "n2", "text": "whisper работает на процессоре", "kind": "note"},
|
||
{"id": "n3", "text": "голос у piper русский", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-pref-009",
|
||
"lang": "ru",
|
||
"tags": ["preference", "distractor"],
|
||
"query": "во сколько я обычно засыпаю",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "ложусь спать около часа ночи", "kind": "note"},
|
||
{"id": "n2", "text": "встаю в семь утра", "kind": "note"},
|
||
{"id": "n3", "text": "днём не сплю", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-home-010",
|
||
"lang": "ru",
|
||
"tags": ["homelab", "paraphrase"],
|
||
"query": "где у меня хранятся пароли",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "пароли держу в keepassxc", "kind": "note"},
|
||
{"id": "n2", "text": "двухфакторку сделал через totp", "kind": "note"},
|
||
{"id": "n3", "text": "ssh ключи лежат на юбикее", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-home-011",
|
||
"lang": "ru",
|
||
"tags": ["homelab", "hard", "paraphrase"],
|
||
"query": "из-за чего кончилось место",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "диск забился логами докера в июне", "kind": "note"},
|
||
{"id": "n2", "text": "рейд собрал из двух дисков", "kind": "note"},
|
||
{"id": "n3", "text": "бэкап на внешний диск раз в неделю", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-pref-012",
|
||
"lang": "ru",
|
||
"tags": ["preference", "distractor"],
|
||
"query": "какой чай мне нравится",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "чай пью только зелёный", "kind": "note"},
|
||
{"id": "n2", "text": "кофе пью без сахара", "kind": "note"},
|
||
{"id": "n3", "text": "воду пью из фильтра", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-silent-013",
|
||
"lang": "ru",
|
||
"tags": ["silent"],
|
||
"query": "какая погода будет в пятницу",
|
||
"want": "",
|
||
"notes": [
|
||
{"id": "n1", "text": "роутер живёт на 192.168.1.1", "kind": "note"},
|
||
{"id": "n2", "text": "бэкапы лучше делать ночью", "kind": "note"},
|
||
{"id": "n3", "text": "у меня аллергия на орехи", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-silent-014",
|
||
"lang": "ru",
|
||
"tags": ["silent"],
|
||
"query": "как зовут сестру моего коллеги",
|
||
"want": "",
|
||
"notes": [
|
||
{"id": "n1", "text": "конфиг nginx лежит в /etc/nginx/sites-enabled", "kind": "note"},
|
||
{"id": "n2", "text": "порт 8080 занят вебкой", "kind": "note"},
|
||
{"id": "n3", "text": "сертификаты обновляет certbot", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-silent-015",
|
||
"lang": "ru",
|
||
"tags": ["silent"],
|
||
"query": "сколько я заплатил за машину",
|
||
"want": "",
|
||
"notes": [
|
||
{"id": "n1", "text": "чай пью только зелёный", "kind": "note"},
|
||
{"id": "n2", "text": "ложусь спать около часа ночи", "kind": "note"},
|
||
{"id": "n3", "text": "не люблю громкую музыку", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-home-016",
|
||
"lang": "ru",
|
||
"tags": ["homelab", "paraphrase"],
|
||
"query": "откуда берётся токен бота",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "токен телеграма лежит в deploy/telegram.env", "kind": "note"},
|
||
{"id": "n2", "text": "вебхуки не использую, только long-poll", "kind": "note"},
|
||
{"id": "n3", "text": "уведомления приходят в личку", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-hard-017",
|
||
"lang": "ru",
|
||
"tags": ["hard", "paraphrase", "homelab"],
|
||
"query": "как я восстановил конфиги",
|
||
"want": "n1",
|
||
"note": "No shared word between query and note beyond none at all. This is the case a lexical embedder cannot win.",
|
||
"notes": [
|
||
{"id": "n1", "text": "после переустановки системы вернул все настройки из git", "kind": "note"},
|
||
{"id": "n2", "text": "разделы на диске резал вручную", "kind": "note"},
|
||
{"id": "n3", "text": "загрузчик поставил заново", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-dist-018",
|
||
"lang": "ru",
|
||
"tags": ["distractor"],
|
||
"query": "чем кормить кота",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "кот ест только сухой корм", "kind": "note"},
|
||
{"id": "n2", "text": "собаке даю мясо", "kind": "note"},
|
||
{"id": "n3", "text": "рыбок кормлю раз в день", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-home-019",
|
||
"lang": "ru",
|
||
"tags": ["homelab", "hard", "paraphrase"],
|
||
"query": "как контейнер получает доступ к видеокарте",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "docker compose пробрасывает /dev/dri внутрь", "kind": "note"},
|
||
{"id": "n2", "text": "контейнеры рестартуют сами", "kind": "note"},
|
||
{"id": "n3", "text": "образы чищу вручную", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-pref-020",
|
||
"lang": "ru",
|
||
"tags": ["preference", "distractor"],
|
||
"query": "когда мне нельзя звонить",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "не звони мне после десяти вечера", "kind": "note"},
|
||
{"id": "n2", "text": "утром не трогай меня до кофе", "kind": "note"},
|
||
{"id": "n3", "text": "по выходным не работаю", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "en-pref-021",
|
||
"lang": "en",
|
||
"tags": ["preference", "paraphrase"],
|
||
"query": "which colour scheme do i like",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "i prefer dark theme everywhere", "kind": "note"},
|
||
{"id": "n2", "text": "font size 14 is fine", "kind": "note"},
|
||
{"id": "n3", "text": "i use vim keybindings", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "en-home-022",
|
||
"lang": "en",
|
||
"tags": ["homelab", "distractor"],
|
||
"query": "where is the big disk mounted",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "the nas drive is mounted at /mnt/hdd1", "kind": "note"},
|
||
{"id": "n2", "text": "models live on the ssd", "kind": "note"},
|
||
{"id": "n3", "text": "backups go to the nas nightly", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "en-silent-023",
|
||
"lang": "en",
|
||
"tags": ["silent"],
|
||
"query": "what is my bank account number",
|
||
"want": "",
|
||
"notes": [
|
||
{"id": "n1", "text": "the nas drive is mounted at /mnt/hdd1", "kind": "note"},
|
||
{"id": "n2", "text": "i prefer dark theme everywhere", "kind": "note"},
|
||
{"id": "n3", "text": "the router runs openwrt", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "en-hard-024",
|
||
"lang": "en",
|
||
"tags": ["hard", "paraphrase"],
|
||
"query": "what fixed the screen problem",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "the flicker went away once i swapped the display cable", "kind": "note"},
|
||
{"id": "n2", "text": "the laptop fan is loud", "kind": "note"},
|
||
{"id": "n3", "text": "the second monitor is 1440p", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "en-pref-025",
|
||
"lang": "en",
|
||
"tags": ["preference", "hard"],
|
||
"query": "should i be offered wine",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "i do not drink alcohol", "kind": "note"},
|
||
{"id": "n2", "text": "i skip breakfast", "kind": "note"},
|
||
{"id": "n3", "text": "i like spicy food", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-home-026",
|
||
"lang": "ru",
|
||
"tags": ["homelab", "paraphrase"],
|
||
"query": "какая модель распознавания речи мне подходит",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "whisper модель small хватает для русского", "kind": "note"},
|
||
{"id": "n2", "text": "голос ирина звучит лучше остальных", "kind": "note"},
|
||
{"id": "n3", "text": "слово активации маven", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-fact-027",
|
||
"lang": "ru",
|
||
"tags": ["distractor", "hard", "paraphrase"],
|
||
"query": "когда я последний раз обслуживал машину",
|
||
"want": "n1",
|
||
"note": "A fact, not a note — both share the vector index, so a fact can win a recall.",
|
||
"notes": [
|
||
{"id": "n1", "text": "последний раз менял масло в мае", "kind": "fact"},
|
||
{"id": "n2", "text": "шины поменял осенью", "kind": "fact"},
|
||
{"id": "n3", "text": "страховка до декабря", "kind": "fact"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-pref-028",
|
||
"lang": "ru",
|
||
"tags": ["preference", "hard", "paraphrase"],
|
||
"query": "как мне присылать оповещения",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "терпеть не могу уведомления со звуком", "kind": "note"},
|
||
{"id": "n2", "text": "вибрацию оставь включённой", "kind": "note"},
|
||
{"id": "n3", "text": "письма читаю вечером", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-silent-029",
|
||
"lang": "ru",
|
||
"tags": ["silent"],
|
||
"query": "во сколько отходит поезд",
|
||
"want": "",
|
||
"notes": [
|
||
{"id": "n1", "text": "кот ест только сухой корм", "kind": "note"},
|
||
{"id": "n2", "text": "люблю острую еду", "kind": "note"},
|
||
{"id": "n3", "text": "пароли держу в keepassxc", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "en-home-030",
|
||
"lang": "en",
|
||
"tags": ["homelab", "paraphrase"],
|
||
"query": "what firmware is on the router",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "the router runs openwrt", "kind": "note"},
|
||
{"id": "n2", "text": "wifi channel is 6", "kind": "note"},
|
||
{"id": "n3", "text": "the guest network is off", "kind": "note"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-mixed-031",
|
||
"lang": "ru",
|
||
"tags": ["mixed", "paraphrase", "hard"],
|
||
"note": "notes and facts in one store and the note is the answer — the daemon indexes both (Vikunja #373)",
|
||
"query": "куда я спрятал второй ключ от квартиры",
|
||
"want": "n1",
|
||
"notes": [
|
||
{"id": "n1", "text": "запасной ключ от квартиры лежит в синей коробке на полке", "kind": "note"},
|
||
{"id": "x1", "text": "поменял замок в двери двадцатого июня", "kind": "fact"},
|
||
{"id": "x2", "text": "отдал ключ соседке в мае", "kind": "fact"}
|
||
]
|
||
},
|
||
{
|
||
"id": "ru-mixed-032",
|
||
"lang": "ru",
|
||
"tags": ["mixed", "distractor"],
|
||
"note": "the mirror of ru-mixed-031: the fact answers and the notes are the distractors",
|
||
"query": "когда я в последний раз заливал бензин",
|
||
"want": "x1",
|
||
"notes": [
|
||
{"id": "x1", "text": "залил полный бак в четверг вечером", "kind": "fact"},
|
||
{"id": "n1", "text": "на заправке у моста дешевле бензин", "kind": "note"},
|
||
{"id": "n2", "text": "надо поменять зимние шины", "kind": "note"}
|
||
]
|
||
}
|
||
]
|
||
}
|