"text":"ИНСТРУМЕНТЫ И ПАРАМЕТРЫ\n\ndsh_tree: path, depth. Дерево папки.\ndsh_read: path, offset, limit. Читать файл (512 КБ прямо, 2 МБ с offset/limit).\ndsh_write: path, content. Записать файл (content до 2 МБ).\ndsh_edit: path, oldText, newText. Заменить одно вхождение.\ndsh_search: path, query. Найти подстроку.\ndsh_bash: command. Только whitelist. Блокируются: powershell, rm, del, sed, символы вертикальной черты, амперсанда, угловых скобок, точки с запятой, доллара, переносы строк.\ndsh_git_status: path. Статус. Передавать path явно, если репозиторий не в корне workspace.\ndsh_git_diff: path. Различия.\n\nПРАВИЛА\nМаксимум 10 вызовов в сообщении, рекомендуется 3-4 (rate limit моста 60/min, задержка 3 сек на вызов). Пути относительные от workspace. Абсолютные запрещены. Rate limit 60 req/min, задержка 3 сек на вызов.",
"text":"ИНСТРУМЕНТЫ И ПАРАМЕТРЫ\n\ndsh_tree: path, depth. Дерево папки.\ndsh_read: path, offset, limit. Читать файл (512 КБ прямо, 2 МБ с offset/limit).\ndsh_write: path, content. Записать файл (content до 2 МБ).\ndsh_edit: path, oldText, newText. Заменить одно вхождение. Большие блоки (>20 строк) — скриптом, не dsh_edit (см. pitfall_dsh_edit_large_oldtext).\ndsh_search: path, query. Найти подстроку.\ndsh_bash: command. Safe-list выполняется без подтверждения, всё остальное и policy-флаги (shell, destructive, network, absolute-path, parent-path) — confirm Allow/Deny в панели. Жёстко блокируются только пустая команда и >2000 символов. Полные правила в protocol_policy.\ndsh_git_status: path. Статус. Передавать path явно, если репозиторий не в корне workspace.\ndsh_git_diff: path. Различия.\ndsh_memory: op list|get|recent|unread|search|budgets|stats|directives|add|replace|remove. stats — анализ использования памяти.\n\nПРАВИЛА\nМаксимум 10 вызовов в сообщении, рекомендуется 3-4 (rate limit моста 60/min, задержка 3 сек на вызов). Пути относительные от workspace. Абсолютные запрещены.",
"importance":"always",
"tags":[
"protocol",
"tools"
],
"version":2,
"version":3,
"createdAt":"2026-11-02T23:35:16.258Z",
"updatedAt":"2026-11-02T23:46:25.799Z",
"lastRecalled":null,
"recallCount":0,
"bytes":1186
"updatedAt":"2026-11-07T06:22:42.557Z",
"lastRecalled":"2026-11-07T06:13:58.509Z",
"recallCount":5,
"bytes":1506
},
{
"id":"f03151af-0efc-426b-8e8d-80573bc2f613",
@ -46,18 +46,18 @@
@@ -46,18 +46,18 @@
"scope":"user-global",
"workspaceKey":"",
"key":"protocol_pitfalls",
"text":"КРИТИЧЕСКИЕ ГРАБЛИ\n\n1 ДЕДУП. Повторный вызов того же tool с теми же args отбрасывается молча. Симптом: статус зелёный idle, ошибок нет, в логе dup call skipped. Лечение: сменить файл или аргументы. Reset не помогает.\n\n2 ЛИНКИФИКАЦИЯ (только DOM). Рендерер превращает домены и URL в ссылки, collectText вставляет переводы строк. JSON ломается. В SSE этой проблемы нет.\n\n3 МНОГОСТРОЧНЫЙ OLD TEXT (только DOM). В dsh_edit не находится из-за разницы переводов. В SSE работает.\n\n4 BASH TIMEOUT. Поле timeout иногда приводит к молчанию. Вызывать без него. Команды вне whitelist требуют подтверждения в панели.\n\n5 ПРОВЕРКА ПОСЛЕ ЗАПИСИ. Отправил не значит записалось. После критичной записи читать файл обратно через dsh_read.\n\n6 JSON. Внутри маркера обязан быть валидным. Кавычки двойные.\n\n7 СМЕШАННЫЕ CRLF. Если в файле часть строк CRLF, часть LF — патчи по номерам съезжают. Нормализовать к LF перед патчем.\n\n8 ДВОЙНОЕ ПРИМЕНЕНИЕ ПАТЧА. Anchor не должен присутствовать в замене. Проверять повторным запуском: должен быть SKIP или fixed 0.",
"text":"КРИТИЧЕСКИЕ ГРАБЛИ\n\n1 ДЕДУП. Повторный вызов того же tool с теми же args отбрасывается молча. Симптом: статус зелёный idle, ошибок нет, в логе dup call skipped. Лечение: сменить файл или аргументы. Reset не помогает.\n\n2 ЛИНКИФИКАЦИЯ (только DOM). Рендерер превращает домены и URL в ссылки, collectText вставляет переводы строк. JSON ломается. В SSE этой проблемы нет.\n\n3 БОЛЬШОЙ OLD TEXT в dsh_edit. Блок больше 15-20 строк может примениться криво (вставить новый, не удалить старый, задвоить файл). В SSE многострочный текст работает, но размер — отдельный риск. Для больших блоков писать в отдельный файл и заменять скриптом по маркерам. Подробнее в pitfall_dsh_edit_large_oldtext.\n\n4 СМЕШАННЫЕ CRLF/LF. dsh_edit не находит oldText, если файл в CRLF, а oldText в LF. Нормализовать к LF перед правкой (скриптом), потом dsh_edit. Подробнее в pitfall_eol_normalize.\n\n5 ПРОВЕРКА ПОСЛЕ ЗАПИСИ. Отправил не значит записалось. После критичной записи читать файл обратно через dsh_read или проверять размер/заголовки скриптом.\n\n6 JSON. Внутри маркера обязан быть валидным. Кавычки двойные.\n\n7 ДВОЙНОЕ ПРИМЕНЕНИЕ ПАТЧА. Anchor не должен присутствовать в замене. Проверять повторным запуском: SKIP или fixed 0.\n\n8 BASH TIMEOUT. Поле timeoutMs у dsh_bash иногда приводит к молчанию. Вызывать без него, полагаться на bashTimeoutMs из config.json.",
"importance":"always",
"tags":[
"protocol",
"pitfalls"
],
"version":1,
"version":2,
"createdAt":"2026-11-02T23:35:16.258Z",
"updatedAt":"2026-11-02T23:35:16.258Z",
"lastRecalled":null,
"recallCount":0,
"bytes":1715
"updatedAt":"2026-11-07T06:23:52.855Z",
"lastRecalled":"2026-11-07T06:13:58.509Z",
"recallCount":5,
"bytes":2162
},
{
"id":"2c416cb6-7f41-48fb-a2e0-fd2a1219974c",
@ -65,18 +65,18 @@
@@ -65,18 +65,18 @@
"scope":"user-global",
"workspaceKey":"",
"key":"protocol_recovery",
"text":"ВОССТАНОВЛЕНИЕ И ПРОВЕРКА МОСТА (dsh-memory 1.0.0)\n\nШаг 1. Проверка моста. Вызови dsh_read на любой путь, например .dsh-memory/notes/START.md.\nТри исхода:\n- пришёл dsh-result с ok true — мост жив, файл есть\n- пришёл dsh-result с E_ARGS_INVALID File not found — мост жив, файла нет, это тоже успех калибровки\n- ответа нет вообще, статус idle, ошибок нет — мост выключен или вызов отброшен дедупом (не повторяй тот же tool с теми же args)\n\nШаг 2. Если мост жив — прочитай .dsh-memory/notes/START.md. Он ведёт на актуальный чекпоинт (PART16), RECOVERY_CHECKLIST, PROTOCOLS_DSH.\n\nШаг 3. Короткий отчёт: мост жив, что прочитано, следующий шаг, готов продолжать.\n\nПроверка папки моста: .dsh-memory/logs/execution-log.jsonl создаётся на первом же tool-вызове. Если он есть — мост точно работал.\n\nВерсия приложения 1.0.0 (функционально завершено). Этапы 1-5 закрыты: SSE основной, память v2, директивы, .dsh-memory/, STG. Этап 6 калибровка отложен.\n\nНаличие блока в сообщении не доказывает что мост жив. Единственное доказательство — успешный dsh_read.",
"text":"ВОССТАНОВЛЕНИЕ И ПРОВЕРКА МОСТА (dsh-memory 1.0.0)\n\nШаг 1. Проверка моста. Вызови dsh_read на dsh-memory/README.md.\nТри исхода:\n- dsh-result ok true — мост жив, файл есть\n- E_ARGS_INVALID File not found — мост жив, файла нет, тоже успех калибровки\n- ответа нет, статус idle — мост выключен или дедуп (не повторяй тот же tool с теми же args)\n\nШаг 2. Если мост жив — прочитай dsh-memory/README.md (разделы MCP: ArtCraft, Протокол и команды) и .dsh-memory/notes/HANDOFF_MCP_UI.txt. Для брелков — PLAN_KEYCHAIN_PIPELINE.txt. Для VPN/WARP — backup-20261104/RECOVERY-AWG-SITE-TO-SITE.md.\n\nШаг 3. Отчёт: мост жив, что прочитано, следующий шаг.\n\nПроверка: .dsh-memory/logs/execution-log.jsonl создаётся на первом вызове. Если есть — мост работал.\n\nВерсия 1.0.0. Этапы 1-5 закрыты, этап 6 отложен. 06-07.11.2026: MCP-интеграция (17 приложений), UI-бокс ArtCraft, супервизор с ярлыком, bash-политика. См. project_mcp_integration, decision_bash_policy.\n\nНаличие блока не доказывает что мост жив. Доказательство — успешный dsh_read.",
"importance":"always",
"tags":[
"protocol",
"recovery"
],
"version":3,
"version":4,
"createdAt":"2026-11-02T23:35:16.258Z",
"updatedAt":"2026-11-03T07:44:54.590Z",
"lastRecalled":null,
"recallCount":0,
"bytes":1639
"updatedAt":"2026-11-07T06:23:55.861Z",
"lastRecalled":"2026-11-07T06:13:58.509Z",
"recallCount":5,
"bytes":1488
},
{
"id":"c545a8d5-f6ae-4644-b760-1e0b570c12ad",
@ -84,20 +84,20 @@
@@ -84,20 +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. Инкрементит 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 в ответе.",
"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 со state active или null, плюс directive_ scope workspace state active для текущего chatId с проверкой workspaceKey. state=archive и state=done НЕ инжектятся. Fingerprint: если тот же набор уже в истории чата — пропуск блока.\n\nАРХИВ. state=archive — запись остаётся в памяти, видна в stats и через op get, но не инжектится. Способ убрать устаревшее, сохранив историю. remove — только для мусора.\n\nЗАПРОСЫ (op): list, get (инкрементит recallCount), recent, unread, search, budgets, stats (top/dead/neverAlways), directives, add, replace (текст, теги, importance, state), remove.\n\nКОГДА ПИСАТЬ: завершён этап -> project_/decision_ (called); грабли второй раз -> pitfall_ (called); изменилось правило -> replace существующего protocol_ (always); новый инструмент -> protocol_ (always); факт о пользователе -> user_/pref_ (called).\n\nКРИТИЧЕСКОЕ ПРАВИЛО: protocol_ с always — КОНТРАКТ С КОДОМ, не заметка. Если код изменился (политика bash, инструменты, MCP, safe-list) — protocol_ обновляется В ТОМ ЖЕ коммите. Расхождение протокола и кода = критический баг. Пример: protocol_tools_and_rules говорил 'блокируются метасимволы', а код уже спрашивает confirm — исправлено 07.11.\n\nУСТАРЕВШЕЕ: архивировать (state=archive), не удалять. Директива — индекс актуальных файлов, не ссылка на устаревший чекпоинт.\n\nУчёт: getInjection инкрементит recallCount для инжектируемых; op get — для запрошенных. lastRecalled ISO. Раз в 1-2 недели смотреть stats.\n\nЛимиты: always 10, tags 5 по 32, директив на чат 5, preview 200.\n\nОбновление факта: replace по тому же id. AUTHENTIC EXTRACTION ONLY: только явно сказанное пользователем. NEVER cite memory tags в ответе.",