"text":"Жизненный цикл памяти dsh-memory: архив, контракт протокола, порт из storage. Сделано 07.11.2026, коммиты b7558ea, 70f5f65, e616399, 5995fa1.\n\nПРОБЛЕМА. protocol_*-записи с always инжектились в каждый чат и врали: protocol_tools_and_rules говорил «dsh_bash блокирует метасимволы», а код уже спрашивал confirm. protocol_recovery вёл на несуществующий PART16. Директива описывала состояние на 03.11.2026. Поле state (active|done|archive) было в схеме, но getInjection его игнорировал — заархивировать always-запись было нельзя, только удалить.\n\nЧТО СДЕЛАНО. getInjection пропускает state=archive и state=done (bridge/memory.js). Три старые грабли заархивированы: pitfall_mjs_escaping, pitfall_crlf_mixed, pitfall_double_patch. Три протокола переписаны под текущий код: protocol_tools_and_rules (safe-list+confirm), protocol_pitfalls (большой oldText ломается и в SSE, CRLF нормализовать), protocol_recovery (актуальные файлы вместо PART16). Директива v5 — индекс файлов с датами. В protocol_memory_system v7 добавлено критическое правило: protocol_ с always = контракт с кодом, обновляется в том же коммите, расхождение = критический баг.\n\nПОРТ И CONFIRM. background.js и storage-bridge.js читают порт из chrome.storage (dshmem-bridge-port), дефолт 8766. В панели поле Port, сохраняется по change, требует F5. Health в логе пишет порт. confirm показывает команду dsh_bash (до 200 символов) или путь файлового инструмента, но не content/oldText (данные не показываются).\n\nГРАБЛИ. dsh_edit с большим oldText в README задвоил файл (1396 строк вместо 710) — откат через git checkout, замена скриптом по маркерам. Лимит 10 вызовов: пачки replace свыше 10 молча отбрасываются, версии не растут — проверять version после replace.",