* feat(memory): add OPENAI_EMBEDDING_BATCH_DELAY support * docs(memory): update SKILL.md for progressive enhancement and auto-setup * docs(memory): update AGENTS.md tool usage policy * docs(memory): fix stale snake_case tool references in skills, agents, tools * docs(handoff): add handoff + ADR for reindex-skill-update * docs(handoff): set PR number * refactor(memory): extract _embed_in_batches to satisfy xenon rank A --------- Co-authored-by: opencode-agent <agent@opencode.local>
4.7 KiB
ADR-046: Reindex memory + finalize kebab-case tool names in docs (PR #104)
Статус
Accepted (2026-07-26)
Контекст
После серии PR #100–#103 (Python lazy-init, 5 TS tools, E2E tests, remove plugin + Rust) инфраструктура памяти была готова, но:
- Индекс
.rag/index.jsonсуществовал (220 MB, 2379 entries), ноmeta.jsonотсутствовал → Python incremental reindex не мог определить version mismatch при будущих запусках (fallback к full reindex или silent skip). - Документация (SKILL.md, AGENTS.md, 6 skills, memory-syncer agent, 3 TS tools,
spec command) содержала stale snake_case tool names (
memory_save,memory_search) — агенты могли вызывать несуществующие tools и получать "tool not found". OPENAI_EMBEDDING_BATCH_DELAYбыла в issue #99 как требование (throttle между батчами для OpenRouter rate limits), ноembedder.pyне поддерживал эту env var — добавление в.env.exampleбез поддержки в коде вводило бы в заблуждение.- Memory file
technical/rag-cli-embeddings-model.mdописывал Rust rag-cli (candle-transformers, all-MiniLM-L6-v2, 384-dim, GLIBC 2.39) как активный — агенты могли пытаться использовать удалённый путь (PR #103 удалил Rust).
Решение
-
Переиндекс через Python —
uv run python -m src.memory index. Создан.rag/meta.jsonсversion: "qwen/qwen3-embedding-8b:512:64"(Python формат,versionkey — НЕmodel_idкоторый был Rust). Incremental: 86 изменившихся файлов, 286s, 2584 entries total (merged со старым index.json). -
OPENAI_EMBEDDING_BATCH_DELAY— поддержка в коде +.env.example:embedder.py:BATCH_DELAY = float(os.environ.get("OPENAI_EMBEDDING_BATCH_DELAY", "0"))time.sleep(BATCH_DELAY)между батчами (только если> 0и не последний батч).env.example:OPENAI_EMBEDDING_BATCH_DELAY=0.5- Default
0— backwards compatible, не ломает существующие вызовы.
-
Stale references cleanup —
memory_save/memory_search/memory_setup(snake_case) →memory-save/memory-search/memory-doctor(kebab-case) в всех активных файлах (.opencode/skills/,.opencode/agents/,.opencode/tools/,.opencode/commands/,AGENTS.md). Историческиеdocs/decisions/иdocs/handoff/НЕ тронуты (snake_case отражает реальные имена на момент написания). -
Memory file
rag-cli-embeddings-model.mdпереписан — Rust rag-cli → Python + OpenRouter как единственный путь semantic. Зафиксировано что удалено. -
SKILL.md (memory) — добавлена секция "Архитектура (progressive enhancement)": keyword всегда, semantic если
OPENAI_BASE_URLset, fallback, auto-setup,memory-doctorкак read-only диагностика. Default путь исправлен:~/opencode-memory→/root/.local/share/opencode/opencode-memory.
Альтернативы
-
Не добавлять
OPENAI_EMBEDDING_BATCH_DELAYв код, только в.env.example— отклонено: env var в.env.exampleбез поддержки в коде вводит в заблуждение (пользователь думает что delay работает, но код его игнорирует). Минимальная правка embedder.py (3 строки) делает её рабочей. -
Трогать исторические
docs/decisions/иdocs/handoff/— отклонено: ADR и handoffs — исторические записи, snake_case там отражает реальные имена tools на момент написания (до PR #101 переименования). Правка исказила бы историю. -
Полный reindex (удалить старый index.json) — отклонено: incremental reindex по SHA256 (ADR-036) достаточно. 86 изменившихся файлов переиндексировано, остальные merged. Полный reindex = 13 минут + $0.0043, incremental = 286s + $0.00012. Нет причины делать полный если incremental корректен.