* fix(memory-syncer): enforce dedup, strict distillation, 100KB compaction, frontmatter fix * docs(handoff): add handoff and ADR-070 for memory cleanup and self-maintaining * docs(handoff): set PR number 167 * docs(handoff): fix Pending/Watch out sections + remove stale ADR comment * fix(memory-syncer): encoding artifact and trailing newlines --------- Co-authored-by: opencode-agent <agent@opencode.local>
58 lines
6.4 KiB
Markdown
58 lines
6.4 KiB
Markdown
---
|
||
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) может занять заметное время на чтение всех старых записей.
|