---
pr: 167
title: fix(memory): cleanup bloat and make memory-syncer self-maintaining
---

## Что сделано

### Часть 1: Разовая чистка файлов памяти (`~/.local/share/opencode/opencode-memory/`)

**1.1 Миграция 4 дубликатов путей** (repos/ → repos/github.com/slaid098/):
- `antidetect-browser-mcp.md` — новый файл = надмножество (содержит все записи + handoff digest), старый удалён (`git rm`).
- `digital_factory.md` — старый = architectural overview, новый = cross-project Telethon gotcha. Объединены: полный architectural overview + durable Telethon gotcha в правильный путь, старый удалён.
- `opencode-voice-dictation.md` — старый = архитектурный обзор (Stack, Architecture, Gotchas), новый = PR digests PR#29-#39. Объединены: архитектурный обзор + PR digests + gotchas в правильный путь, старый удалён.
- `slaid098-dev.md` — старый = ранняя версия (Key conventions: centralized tests, Biome config, NO pre-commit, legacy-peer-deps), новый = надмножество PR digests PR#68-#93. Уникальные conventions из старого добавлены в новый как секция "Key conventions", старый удалён.

**1.2 Фикс битого frontmatter**:
- `repos/github.com/slaid098/telesoft.md` — отступы 2 пробела в `updated:`/`related:` → 0 пробелов.
- `repos/code_keeper_api.md` — `importance: 3` → `importance: medium`.
- `repos/youtube_comments.md` — `importance: 5` → `importance: low`.

**1.3 Удаление HTML-мусора**:
- `repos/github.com/slaid098/opencode.md` — удалены 20 HTML-комментариев `<!-- updated: ... PR#N handoff digest -->` + лишние `---` разделители (строки 11-30).

**1.4 Дистилляция video_uniq.md**:
- 623 KB / 1104 строк → 25 KB / 150 строк (96% сокращение).
- Сохранены durable: ffmpeg gotchas (drawbox in_w/in_h, crop iw/ih post-scale, amix normalize=0, x265 несовместимости), pydantic model_copy no validation, frozen-safe paths, filter chain order, pHash testing (hash_size=16), pool-mechanism, channel loop resilience.
- Выкинуты не-durable: 584 changelog-дампов («PR#N: добавили X»), receipts с повторяющимся содержанием, метрики PR (тестов passed, coverage %), хроника событий.
- Tags усечены ~1.5 KB → ~200 символов, summary ~2.5 KB → ~400 символов.

**1.5 memory-save** — commit + reindex + push в memory-репо выполнен.

### Часть 2: Фикс корня — расширение memory-syncer (в репо)

**2.1 `.opencode/agents/memory-syncer.md`**:
- **Дедуп перед записью** (ОБЯЗАТЕЛЬНО) — новая подсекция в Distillation: «Перед добавлением записи — прочитай существующий файл. Если похожая запись уже есть → обнови существующую (bump `updated`), НЕ добавляй новую.»
- **Строгая дистилляция** — усиlena секция Distillation: явный критерий durable («поможет ли это в следующий раз когда я полезу в этот код?»), запрет changelog-дампов («НЕ записывай что было сделано в PR — это changelog, код уже документирует»), запрет метрик PR (тестов passed, coverage %).
- **Лимит 100 KB** — новая секция «Compaction»: «Если после записи файл > 100 KB → компрессировать: прочитай все старые записи, оставь только durable, выкинь не-durable. Tags < 500 символов, summary < 500 символов.»
- **Фронт-матч фикс** — новое правило 11 в Rules: «Если frontmatter целевого файла сломан (битые отступы, невалидные importance) → починить при записи.»

**2.2 `.opencode/skills/memory/SKILL.md`**:
- Правило «править вместо дублирования» сделано ОБЯЗАТЕЛЬНЫМ (было рекомендацией) + объяснение (дубликаты раздули файлы до 600+ KB).
- Добавлен лимит 100 KB с процедурой компрессии.

**2.3 Синхронизация зеркала**: `cp` в `~/.config/opencode/agents/memory-syncer.md` и `~/.config/opencode/skills/memory/SKILL.md`, проверка идентичности через `diff`.

## Почему

Память раздулась до неконтролируемых размеров (video_uniq.md = 623 KB / 1104 строк, opencode.md = 135 KB). Корень проблемы — memory-syncer агент не имел инструкций для дедупликации и компрессии, писал changelog-дампы вместо durable knowledge. Issue #166 требовал: (1) разовую чистку раздутых файлов, (2) фикс корня — сделать memory-syncer self-maintaining чтобы файлы не раздувались снова.

## Pending

— (PR завершён, closes #166; разовая чистка + фикс корня выполнены)

## Watch out

- Изменения файлов памяти (`~/.local/share/opencode/opencode-memory/`) НЕ в diff этого PR — они живут в отдельном memory-репо (commit + push через `memory-save`). В этом репо видны только фикс корня (`.opencode/agents/memory-syncer.md`, `.opencode/skills/memory/SKILL.md`).
- Зеркало `~/.config/opencode/` синхронизировано вручную (`cp` + `diff`). Если кто-то правит `.opencode/` без синхронизации зеркала — drift.
- Новое правило 100 KB compaction: первая компакция большого файла (например video_uniq.md 623 KB) может занять заметное время на чтение всех старых записей.
