From 463b3d5e3667dc72c676f6c6b8e6daed5e169242 Mon Sep 17 00:00:00 2001 From: Serge Alex Date: Sat, 7 Nov 2026 09:07:41 +0300 Subject: [PATCH] Memory: protocol v6 with stats op, decision_recall_stats, template sync --- memory/state.template.json | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/memory/state.template.json b/memory/state.template.json index 07e41e8..69e1cc5 100644 --- a/memory/state.template.json +++ b/memory/state.template.json @@ -1,6 +1,6 @@ { "version": 2, - "updatedAt": "2026-11-07T05:58:58.606Z", + "updatedAt": "2026-11-07T06:07:24.274Z", "entries": [ { "id": "0f90dcf0-5d43-4ca4-bf86-ad8b3ee20382", @@ -84,19 +84,20 @@ "scope": "user-global", "workspaceKey": "", "key": "protocol_memory_system", - "text": "МЕХАНИЗМ ПАМЯТИ dsh-memory v2\n\nСлои. Protocol (track agent, importance always) инжектится в первый ход. Session (directive scope workspace) инжектится в первый ход текущего чата. Reference (called) и Archive (state archive) только по запросу.\n\nЧто инжектится всегда: все track agent + importance always, плюс directive_ scope workspace state active для текущего chatId с проверкой workspaceKey. Fingerprint: если тот же набор уже в истории чата — пропуск всего блока.\n\nЗапросы через dsh_memory (op):\nlist track scope importance state since limit — items с preview и bytes, totalBytes, matched\nget ids — items с content, totalBytes\nrecent since — items\nunread chatId — новее lastInjectAt\nsearch query track — plain substring, totalBytes\ndirectives chatId state active|done|archive|all — директивы\nbudgets — used по track и scope, alwaysCount, лимиты\nadd entry — новая запись, entry включает track scope workspaceKey key text importance tags\nreplace id text tags importance state chatId — правка\nremove id — удаление\n\nСервер ВСЕГДА отдаёт totalBytes в meta ДО контента. Модель видит объём и решает: взять всё, взять по ids, взять preview, отложить.\n\nТаксономия ключей: user_ факты о пользователе, project_ проекты, directive_ правила и шаги, pref_ привычки, tech_ стек, interest_ интересы, pitfall_ грабли и обходы, decision_ архитектурные решения. Префикс задаёт группу, программа не решает релевантность.\n\nКОГДА ПИСАТЬ (триггеры, важнее чем формат):\n1. Завершён этап работы (коммит, фича, интеграция) -> project_<тема> или decision_<тема>, importance called. Что сделано, где код, какие грабли.\n2. Наступил на грабли второй раз -> pitfall_<тема>, called. Симптом + обход.\n3. Изменилось правило поведения (новая политика, новый лимит) -> replace существующего protocol_*, всегда. Не дубликат.\n4. Появился новый инструмент/команда/приложение -> protocol_*, always. Чтобы модель в новом чате знала.\n5. Пользователь сказал факт о себе или предпочтение -> user_/pref_, called.\n6. Проект/сервис добавлен или изменён -> project_*, called.\n\nПравило записи: после каждого завершённого этапа (2+ коммита или значимая правка) — записать хотя бы одну project_ или decision_ запись. Если этап был без грабель и без новых правил — всё равно project_: что сделано, где смотреть. Иначе через неделю память не отражает реальность.\n\nЛимиты: always записей 10, tags 5 на запись по 32 символа, директив на чат 5, preview 200. Калибровать по обратной связи.\n\nОбновление факта: replace по тому же id, не дубликат. AUTHENTIC EXTRACTION ONLY: только явно сказанное пользователем. NEVER cite memory tags в ответе.", + "text": "МЕХАНИЗМ ПАМЯТИ dsh-memory v2\n\nСлои. Protocol (track agent, importance always) инжектится в первый ход. Session (directive scope workspace) инжектится в первый ход текущего чата. Reference (called) и Archive (state archive) только по запросу.\n\nЧто инжектится всегда: все track agent + importance always, плюс directive_ scope workspace state active для текущего chatId с проверкой workspaceKey. Fingerprint: если тот же набор уже в истории чата — пропуск всего блока.\n\nЗапросы через dsh_memory (op):\nlist track scope importance state since limit — items с preview и bytes, totalBytes, matched\nget ids — items с content, totalBytes. Инкрементит recallCount и lastRecalled.\nrecent since — items\nunread chatId — новее lastInjectAt\nsearch query track — plain substring, totalBytes\nbudgets — used по track и scope, alwaysCount, лимиты\nstats staleDays limit — анализ использования: total, usedCount, neverUsedCount, top[] (по recallCount), dead[] (0 recalls, idle >= staleDays), freshCount, neverAlways[]. Вызывать раз в 1-2 недели, чтобы видеть какие записи работают, а какие мёртвый груз.\ndirectives chatId state active|done|archive|all — директивы\nadd entry — новая запись\nreplace id text tags importance state chatId — правка\nremove id — удаление\n\nСервер ВСЕГДА отдаёт totalBytes в meta ДО контента. Модель видит объём и решает: взять всё, взять по ids, взять preview, отложить.\n\nТаксономия ключей: user_ факты о пользователе, project_ проекты, directive_ правила и шаги, pref_ привычки, tech_ стек, interest_ интересы, pitfall_ грабли и обходы, decision_ архитектурные решения. Префикс задаёт группу, программа не решает релевантность.\n\nКОГДА ПИСАТЬ (триггеры, важнее чем формат):\n1. Завершён этап работы (коммит, фича, интеграция) -> project_<тема> или decision_<тема>, importance called. Что сделано, где код, какие грабли.\n2. Наступил на грабли второй раз -> pitfall_<тема>, called. Симптом + обход.\n3. Изменилось правило поведения (новая политика, новый лимит) -> replace существующего protocol_*, always. Не дубликат.\n4. Появился новый инструмент/команда/приложение -> protocol_*, always. Чтобы модель в новом чате знала.\n5. Пользователь сказал факт о себе или предпочтение -> user_/pref_, called.\n6. Проект/сервис добавлен или изменён -> project_*, called.\n\nПравило записи: после каждого завершённого этапа (2+ коммита или значимая правка) — записать хотя бы одну project_ или decision_ запись. Если этап был без грабель и без новых правил — всё равно project_: что сделано, где смотреть. Иначе через неделю память не отражает реальность.\n\nУчёт использования. getInjection инкрементит recallCount для всех инжектируемых записей; op get — для запрошенных по ids. Поле lastRecalled — ISO-время. Раз в 1-2 недели смотреть stats: dead[] — кандидаты на удаление или архив, neverAlways[] — always-записи, которые не инжектились (аномалия), top[] — что реально пригодилось.\n\nЛимиты: always записей 10, tags 5 на запись по 32 символа, директив на чат 5, preview 200. Калибровать по обратной связи.\n\nОбновление факта: replace по тому же id, не дубликат. AUTHENTIC EXTRACTION ONLY: только явно сказанное пользователем. NEVER cite memory tags в ответе.", "importance": "always", "tags": [ "protocol", "memory", - "triggers" + "triggers", + "stats" ], - "version": 5, + "version": 6, "createdAt": "2026-11-02T23:35:16.258Z", - "updatedAt": "2026-11-07T05:57:12.533Z", + "updatedAt": "2026-11-07T06:07:11.701Z", "lastRecalled": null, "recallCount": 0, - "bytes": 3807 + "bytes": 4641 }, { "id": "2853ce0e-de50-455c-bd5a-ebbf9a3fe337", @@ -130,15 +131,17 @@ "mcp", "artcraft" ], + "state": null, + "chatId": "", "version": 1, - "createdAt": "2026-11-06T14:35:00.000Z", - "updatedAt": "2026-11-06T14:35:00.000Z", + "createdAt": "2026-11-06T14:31:47.706Z", + "updatedAt": "2026-11-06T14:31:47.706Z", "lastRecalled": null, "recallCount": 0, - "bytes": 1893 + "bytes": 1917 }, { - "id": "a7c3f1e2-9b4d-4e8a-b5c6-d7e8f9a0b1c2", + "id": "da6fdc38-5118-413e-a012-ad3cfeee3b5c", "track": "agent", "scope": "user-global", "workspaceKey": "", @@ -150,12 +153,14 @@ "policy", "bash" ], + "state": null, + "chatId": "", "version": 1, - "createdAt": "2026-11-07T00:00:00.000Z", - "updatedAt": "2026-11-07T00:00:00.000Z", + "createdAt": "2026-11-07T03:58:24.727Z", + "updatedAt": "2026-11-07T03:58:24.727Z", "lastRecalled": null, "recallCount": 0, - "bytes": 2117 + "bytes": 1706 }, { "id": "3e51562d-a56b-4919-9720-cf36597553b6",