* 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>
4.4 KiB
ADR-070: Make memory-syncer self-maintaining (dedup, strict distillation, 100KB compaction)
Статус
Accepted (2026-07-31)
Контекст
Memory-файлы в ~/.local/share/opencode/opencode-memory/ раздулись до неконтролируемых размеров:
video_uniq.md= 623 KB / 1104 строк (584 changelog-дампов на 60 PR)opencode.md= 135 KB / 298 строк (20 HTML-комментариев-мусора)- 4 файла-дубликата в
repos/(старый путь) вместоrepos/github.com/slaid098/(правильный путь per SKILL.md) - Битый frontmatter в 3 файлах (отступы 2 пробела,
importance: 3/5вместоhigh/medium/low)
Корень проблемы: memory-syncer.md агент имел секцию «Edit instead of duplicate» как рекомендацию (не обязательное правило), не имел критерия durable (что записывать vs что НЕ записывать), не имел лимита размера файла и процедуры компрессии. Каждый PR добавлял changelog-дампы («PR#N: добавили X») вместо durable knowledge (gotchas, паттерны, root causes), receipts дублировали содержание записей.
Решение
-
Дедуп перед записью — ОБЯЗАТЕЛЬНО: перед добавлением записи memory-syncer читает существующий файл. Если похожая запись уже есть (та же гоча/паттерн/root cause) → обновляет существующую (bump
updated), НЕ добавляет новую. Дубликаты = root cause раздутия. -
Строгая дистилляция с критерием durable: «поможет ли это в следующий раз когда я полезу в этот код?» Да → durable. Нет → НЕ пиши. Явный запрет changelog-дампов («PR#N: добавили X» — это changelog, код уже документирует), метрик PR (тестов passed, coverage %), хроники событий.
-
Лимит 100 KB + Compaction: если после записи файл > 100 KB → компрессировать (прочитать все старые записи, оставить durable, выкинуть не-durable, объединить дубликаты, усечь tags/summary). Цель — держать файл < 100 KB.
-
Фронт-матч фикс при записи: если frontmatter сломан (битые отступы, невалидные importance) → починить. Valid
importance:high|medium|low. -
SKILL.md синхронизирован: правило «править вместо дублирования» сделано обязательным (было рекомендацией), добавлен лимит 100 KB.
-
Зеркало
~/.config/opencode/синхронизировано с repo-local.opencode/(cp + diff проверка).
Альтернативы
- Только разовая чистка без фикса корня — отклонено: файлы раздуются снова при следующем PR. Issue #166 явно требовал оба типа работы.
- Автоматическая компрессия в memory-save tool — отклонено: memory-save = commit + reindex, не должен модифицировать содержимое файлов. Компрессия = ответственность memory-syncer агента (контекст handoff нужен для решения что durable).
- Лимит 50 KB (жёстче) — отклонено: video_uniq.md после дистилляции = 25 KB, но репо с 60+ PR могут legitimately иметь ~80 KB durable knowledge. 100 KB = баланс.
- Запрет receipts — отклонено: receipts обязательны (audit trail что memory-sync фаза выполнена). Убрано только дублирование содержания в receipts (receipts с повторяющимся содержанием выкидываются при компакции, короткие receipts «— (нет durable-записей)» остаются).