From bf3149fdd00089e89e05854e0ffe733ca2d9fbeb Mon Sep 17 00:00:00 2001 From: Markov Date: Wed, 25 Feb 2026 23:29:19 +0100 Subject: [PATCH] Phase 2 resolved: per-project memory + viewer role --- AGENT-PLAN.md | 54 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/AGENT-PLAN.md b/AGENT-PLAN.md index e5530d8..efd34bc 100644 --- a/AGENT-PLAN.md +++ b/AGENT-PLAN.md @@ -22,24 +22,42 @@ --- -## Фаза 2: Память агента (ТРЕБУЕТ РЕСЕРЧ) +## Фаза 2: Память агента ✅ РЕШЕНО -### Вопросы для исследования -- [ ] **Per-project vs shared memory?** — стоит ли разделять память по проектам? Агент работает на нескольких проектах — смешивать или изолировать? -- [ ] **Структура памяти** — как организовать memory/: - - `memory/global/` — общие знания, уроки - - `memory/projects/{slug}/` — контекст конкретного проекта - - `memory/sessions/` — автокомпакция сессий -- [ ] **Загрузка контекста** — как агент выбирает какую память загружать? По текущему проекту? По задаче? Всю? -- [ ] **Размер контекста** — лимиты на bootstrap context (сейчас 15K chars). Как масштабировать при росте памяти? -- [ ] **Компакция** — автоматическая очистка старой памяти? Суммаризация? -- [ ] **Shared knowledge** — если два агента работают на одном проекте, должны ли они видеть память друг друга? +### Структура (двухуровневая, per-project) +``` +agents/{slug}/ + AGENT.md # инструкции (статичные) + memory/ + agent.md # личные уроки, стиль (грузится ВСЕГДА) + projects/ + {slug}/ + context.md # архитектура, решения (грузится per-task) + recent.md # последние действия (rolling window, ~20 записей) +``` -### Возможные решения -- **Вариант A:** Flat memory — всё в `memory/`, агент сам разбирается (текущее) -- **Вариант B:** Per-project dirs — `memory/projects/{slug}/`, загружается по контексту задачи -- **Вариант C:** Semantic search — агент ищет по памяти через embeddings (тяжёлое решение) -- **Вариант D:** Project files as memory — документы проекта на трекере = общая память команды +### Загрузка контекста +1. Task приходит с `project_slug` +2. Bootstrap: `AGENT.md` + `memory/agent.md` + `memory/projects/{slug}/context.md` + `recent.md` +3. Итого ~7K chars вместо 15K (экономия ~50%) +4. Кросс-проектная инфа — on-demand через MCP-тулзы, НЕ в bootstrap + +### Компакция +- После завершения задачи: LLM суммаризирует сессию → 3-5 строк → append `recent.md` +- `recent.md`: rolling window, последние ~20 записей, старые вытесняются +- Weekly: LLM ревьюит `recent.md` → обновляет `context.md` (long-term) +- Сырые JSONL сессии: удалять через 7 дней (суммаризация уже произошла) + +### Кросс-проектный доступ +- Агент = **member** в своём проекте, **viewer** в связанных +- Viewer = read-only (list_tasks, list_project_files через REST) +- Viewer НЕ получает WS push-события (экономия токенов) +- Три уровня контроля: AGENT.md → MCP-тулзы → API (403) + +### Shared knowledge +- Project docs (README, ARCHITECTURE) = shared, живут в трекере/репо +- Personal memory = agent-only, не шарится между агентами +- Координация — через project docs или чат, не через чужую память --- @@ -59,3 +77,7 @@ | Трекер = source of truth для routing/orchestration | 2026-02-25 | | Агент не раскрывает api_key трекеру | 2026-02-25 | | Directory mode для мульти-агент (уже работает) | 2026-02-25 | +| Per-project память: agent.md (always) + projects/{slug}/ (per-task) | 2026-02-25 | +| Viewer-роль: read-only доступ к чужим проектам | 2026-02-25 | +| Viewer без WS push — только REST pull | 2026-02-25 | +| Shared knowledge через project docs, не через чужую память | 2026-02-25 |