Browse Source

Memory: protocol v6 with stats op, decision_recall_stats, template sync

master
Serge Shutov 1 week ago
parent
commit
463b3d5e36
  1. 31
      memory/state.template.json

31
memory/state.template.json

@ -1,6 +1,6 @@
{ {
"version": 2, "version": 2,
"updatedAt": "2026-11-07T05:58:58.606Z", "updatedAt": "2026-11-07T06:07:24.274Z",
"entries": [ "entries": [
{ {
"id": "0f90dcf0-5d43-4ca4-bf86-ad8b3ee20382", "id": "0f90dcf0-5d43-4ca4-bf86-ad8b3ee20382",
@ -84,19 +84,20 @@
"scope": "user-global", "scope": "user-global",
"workspaceKey": "", "workspaceKey": "",
"key": "protocol_memory_system", "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", "importance": "always",
"tags": [ "tags": [
"protocol", "protocol",
"memory", "memory",
"triggers" "triggers",
"stats"
], ],
"version": 5, "version": 6,
"createdAt": "2026-11-02T23:35:16.258Z", "createdAt": "2026-11-02T23:35:16.258Z",
"updatedAt": "2026-11-07T05:57:12.533Z", "updatedAt": "2026-11-07T06:07:11.701Z",
"lastRecalled": null, "lastRecalled": null,
"recallCount": 0, "recallCount": 0,
"bytes": 3807 "bytes": 4641
}, },
{ {
"id": "2853ce0e-de50-455c-bd5a-ebbf9a3fe337", "id": "2853ce0e-de50-455c-bd5a-ebbf9a3fe337",
@ -130,15 +131,17 @@
"mcp", "mcp",
"artcraft" "artcraft"
], ],
"state": null,
"chatId": "",
"version": 1, "version": 1,
"createdAt": "2026-11-06T14:35:00.000Z", "createdAt": "2026-11-06T14:31:47.706Z",
"updatedAt": "2026-11-06T14:35:00.000Z", "updatedAt": "2026-11-06T14:31:47.706Z",
"lastRecalled": null, "lastRecalled": null,
"recallCount": 0, "recallCount": 0,
"bytes": 1893 "bytes": 1917
}, },
{ {
"id": "a7c3f1e2-9b4d-4e8a-b5c6-d7e8f9a0b1c2", "id": "da6fdc38-5118-413e-a012-ad3cfeee3b5c",
"track": "agent", "track": "agent",
"scope": "user-global", "scope": "user-global",
"workspaceKey": "", "workspaceKey": "",
@ -150,12 +153,14 @@
"policy", "policy",
"bash" "bash"
], ],
"state": null,
"chatId": "",
"version": 1, "version": 1,
"createdAt": "2026-11-07T00:00:00.000Z", "createdAt": "2026-11-07T03:58:24.727Z",
"updatedAt": "2026-11-07T00:00:00.000Z", "updatedAt": "2026-11-07T03:58:24.727Z",
"lastRecalled": null, "lastRecalled": null,
"recallCount": 0, "recallCount": 0,
"bytes": 2117 "bytes": 1706
}, },
{ {
"id": "3e51562d-a56b-4919-9720-cf36597553b6", "id": "3e51562d-a56b-4919-9720-cf36597553b6",

Loading…
Cancel
Save