"text":"Проект dsh-memory: unified Chrome-расширение. Замена DSH PRO и dsmemory (оба больше не нужны). Версия 1.0.0 — функционально завершено, дальше косметика и расширение.\n\nМост 127.0.0.1:8766, zero npm deps, Node.js. SSE основной путь исполнения вызовов (текст из XHR, минуя DOM-рендерер), DOM резервный (только если SSE сломался после обновления DeepSeek).\n\nПамять v2: Entry-модель, директивы scope workspace, служебная папка .dsh-memory/ в workspace (logs, outputs, notes). Инъекция протокола в первый ход нового чата автоматически. STG-кнопка в настройках панели — принудительная инъекция в старые чаты.\n\nЭтапы 1-5 закрыты. Этап 6 (калибровка контекста) отложен до накопления статистики по чатам. README содержит установку для новичка на Windows, описание протокола и команд, интерфейс панели, режимы моста, заимствования.",
"importance":"called",
"tags":[
"project",
"architecture",
"dsh-memory"
],
"state":null,
"chatId":"",
"version":2,
"createdAt":"2026-11-03T03:40:13.183Z",
"updatedAt":"2026-11-03T07:44:27.175Z",
"lastRecalled":null,
"recallCount":0,
"bytes":1317
},
{
"id":"ced4efed-0c7a-4e5a-a717-4efaf4ad1b9a",
"track":"agent",
"scope":"user-global",
"workspaceKey":"",
"key":"tech_stack_dsh_memory",
"text":"Стек dsh-memory: Node.js без зависимостей, Chrome MV3 extension. MAIN world XHR hook в injected/chat-logger.js перехватывает chat/completion, extractAssistant отделяет thinking от answer. ISOLATED content/content.js парсит вызовы, отправляет в мост через bridge-client.js. Мост: bridge/server.js HTTP, bridge/tools.js инструменты, bridge/memory.js память, bridge/state-dir.js служебная папка, bridge/guard.js безопасность путей. Хранилище: memory/state.json (runtime, gitignore) + memory/state.template.json (в git).",
"importance":"called",
"tags":[
"tech",
"stack",
"dsh-memory"
],
"state":null,
"chatId":"",
"version":1,
"createdAt":"2026-11-03T03:40:16.201Z",
"updatedAt":"2026-11-03T03:40:16.201Z",
"lastRecalled":null,
"recallCount":0,
"bytes":653
},
{
"id":"c075b839-41ed-499e-bdeb-95539477e3f4",
"track":"user",
"scope":"user-global",
"workspaceKey":"",
"key":"pref_language_style",
"text":"Пользователь: русский язык. Технический стиль, минимум воды, конкретика. Не терпит поспешных выводов и гаданий. Требует проверки кода фактами, а не по памяти. Ценит честные ответы 'не знаю' больше чем догадки. Все объяснения с обоснованием, а не просто результат.",
"importance":"called",
"tags":[
"pref",
"communication"
],
"state":null,
"chatId":"",
"version":1,
"createdAt":"2026-11-03T03:40:19.219Z",
"updatedAt":"2026-11-03T03:40:19.219Z",
"lastRecalled":null,
"recallCount":0,
"bytes":476
},
{
"id":"400aecd2-7a3c-46c8-b5e4-ea0039ee3816",
"track":"user",
"scope":"user-global",
"workspaceKey":"",
"key":"pref_workflow_discipline",
"text":"Рабочий процесс: сначала план, потом шаги с согласованием. После блока работы — коммит, после этапа — push. Не делать поспешных выводов о лимитах контекста. Проверять факты в коде, не по памяти. При сомнении спрашивать. Тесты и проверки важнее скорости.",
"importance":"called",
"tags":[
"pref",
"workflow"
],
"state":null,
"chatId":"",
"version":1,
"createdAt":"2026-11-03T03:40:29.451Z",
"updatedAt":"2026-11-03T03:40:29.451Z",
"lastRecalled":null,
"recallCount":0,
"bytes":456
},
{
"id":"54fb4b87-0114-4d1f-a60a-cc5cebfedeb8",
"track":"agent",
"scope":"user-global",
"workspaceKey":"",
"key":"pitfall_mjs_escaping",
"text":"В content .mjs не использовать обратный слэш + n для переводов строк. Многоуровневое экранирование в JSON-маркере (четыре бэкслэша) ломает JSON.parse, парсер молча пропускает вызов. Симптом: packet.sseCalls больше parsedCount. Использовать String.fromCharCode(10) или массив строк с .join(sep). Для литерального бэкслэша — String.fromCharCode(92).",
"importance":"called",
"tags":[
"pitfall",
"escaping",
"mjs"
],
"state":null,
"chatId":"",
"version":2,
"createdAt":"2026-11-03T03:40:32.461Z",
"updatedAt":"2026-11-03T03:41:22.376Z",
"lastRecalled":null,
"recallCount":0,
"bytes":537
},
{
"id":"fbbc5ef3-e6bc-43ed-8d1c-e2631b2b798e",
"track":"agent",
"scope":"user-global",
"workspaceKey":"",
"key":"pitfall_crlf_mixed",
"text":"Смешанные переводы строк (часть CRLF, часть LF) в файле ломают патчи по номерам строк. Индексы съезжают, guard ABORT при корректном содержимом. Нормализовать к LF перед патчем (split CRLF join LF), писать обратно однородным LF. Проверять счётчики CR и LF до патча.",
"importance":"called",
"tags":[
"pitfall",
"crlf",
"patching"
],
"state":null,
"chatId":"",
"version":1,
"createdAt":"2026-11-03T03:40:35.473Z",
"updatedAt":"2026-11-03T03:40:35.473Z",
"lastRecalled":null,
"recallCount":0,
"bytes":438
},
{
"id":"a559d2bb-6a79-43fd-a562-e4a71a594e01",
"track":"agent",
"scope":"user-global",
"workspaceKey":"",
"key":"pitfall_double_patch",
"text":"Патч применяется дважды из-за дублирования вызовов рендерером. Симптом: в файле дубли строк или блоков после одного запуска. Anchor патчера не должен присутствовать в тексте замены. После запуска прогнать патчер второй раз: должно быть SKIP или fixed 0. Защита в самом патчере: if indexOf marker already present then exit.",
"importance":"called",
"tags":[
"pitfall",
"patching"
],
"state":null,
"chatId":"",
"version":1,
"createdAt":"2026-11-03T03:40:46.974Z",
"updatedAt":"2026-11-03T03:40:46.974Z",
"lastRecalled":null,
"recallCount":0,
"bytes":535
},
{
"id":"bef39421-5921-445a-8bb4-2e918d6c7805",
"track":"agent",
"scope":"user-global",
"workspaceKey":"",
"key":"decision_state_dir",
"text":"Папка .dsh-memory/ заменяет .dsh-pro/. Единая служебная папка в корне workspace: logs/ (execution-log.jsonl), outputs/ (большие результаты, git diff), notes/ (чекпоинты, протоколы, README с шаблоном). Создаётся мостом при старте для каждого allowedRoots и при каждом logExecution через ensureStateDir. В .gitignore проекта. Модуль bridge/state-dir.js — единая точка путей. DSH PRO и dsmemory больше не нужны.",
"importance":"called",
"tags":[
"decision",
"architecture",
"dsh-memory"
],
"state":null,
"chatId":"",
"version":1,
"createdAt":"2026-11-03T03:40:49.982Z",
"updatedAt":"2026-11-03T03:40:49.982Z",
"lastRecalled":null,
"recallCount":0,
"bytes":586
},
{
"id":"df427310-12de-4260-bb00-033a6758944d",
"track":"agent",
"scope":"user-global",
"workspaceKey":"",
"key":"decision_dom_sse",
"text":"SSE основной путь: текст из XHR через extractAssistant, минуя DOM-рендерер. Нет линкификации, многострочный oldText работает, любой юникод и пунктуация. Лимит 10 вызовов. DOM резервный: линкификация доменов, многострочный edit падает, лимит 3-4 вызова. Переключатель в панели, ключ storage dshmem-transport, значения dom/sse. При падении DOM сравнивать packet.text с dom-parse-fail.msgText.",
"importance":"called",
"tags":[
"decision",
"modes",
"dsh-memory"
],
"state":null,
"chatId":"",
"version":1,
"createdAt":"2026-11-03T03:40:52.990Z",
"updatedAt":"2026-11-03T03:40:52.990Z",
"lastRecalled":null,
"recallCount":0,
"bytes":608
},
{
"id":"117b3835-5042-46b9-974f-6ef0691d7d76",
"track":"agent",
"scope":"workspace",
"workspaceKey":"V:/Site",
"key":"pitfall_git_push",
"text":"После коммитов в dsh-memory всегда делать git push origin master — иначе коммиты остаются локально и не видны в веб-репозитории git.starvery.ru. git status 'ahead N' = не отправлено.",