Files
email-assistant/openspec/changes/archive/2026-09-11-email-storage-analysis/design.md
T

4.9 KiB
Raw Blame History

Design: Анализ хранения писем — ФС vs Maildir

Обзор

Документ STORAGE_ANALYSIS.md пишется вручную (это аналитика, не код). Анализ опирается на:

  • реальные данные архива (структуру, число файлов, размеры)
  • стандарты Maildir/MBOX/notmuch
  • мотивацию пользователя (локальная LLM в скриптах)

Файлы

Файл Действие Описание
/opt/hermes/email-assistant/STORAGE_ANALYSIS.md создать Анализ + таблица + рекомендация
/opt/hermes/email-assistant/README.md изменить Добавить ссылку в раздел «Оценка альтернатив»

Анализ (что будет в документе)

Текущий формат (email.md)

  • Плюсы: человекочитаемый (YAML-frontmatter + Markdown-тело), идеален для LLM (grep/find/obsidian), атомарность записи (новая директория UID), прозрачность бэкапов
  • Минусы: нестандартный (MUA не читают), без флагов на уровне ФС (Seen/Answered в frontmatter, не атрибут), дублирование с SQLite-индексом (mail_index.db), нет жёсткой гарантии целостности (нет fsync-семантики Maildir)

Maildir

  • Плюсы: стандарт (mutt/neomutt/thunderbird, dovecot), атомарность (tmp→new→cur), флаги в имени файла (:2,RS), быстрый инкрементальный скан (число файлов в new/), не требует БД
  • Минусы: тело в raw-MIME (нужен парсинг для LLM — но mail/mhonarc извлекают), имена файлов нечитаемы, нет человекочитаемых метаданных, сложнее grep по теме (тема в заголовке MIME, не в frontmatter)

MBOX

  • Минусы: один файл на папку (перезапись всего файла при изменении), блокировки, не для инкрементального чтения LLM — сразу исключается для нашего сценария

notmuch

  • Плюсы: индексный слой поверх Maildir, быстрый полнотекстовый поиск, тэги (подходят для «назначенных тэгов» из UI), интеграция с MUA
  • Минусы: нужен демон/индекс, не заменяет хранение (всё равно Maildir или own format), ещё один слой сложности

LLM-сценарий (главный)

  • LLM в скриптах: cat email.md | ollama run qwen3:8b — работает напрямую (frontmatter + тело). Для Maildir нужен mail/munpack/свой парсер MIME.
  • Тэги для веб-UI: в текущем формате можно добавить поле tags: [] в frontmatter. Maildir — тэги как флаги не предусмотрены (только Seen/Answered/ Flagged), для UI-тэгов нужен отдельный индекс (notmuch или SQLite)

Рекомендация (предварительная)

Остаться на текущем email.md + SQLite FTS5, но с эволюцией:

  1. Добавить tags: [] в frontmatter для UI-тэгов
  2. Оставить Maildir-совместимость как опцию экспорта (не миграции)
  3. notmuch — опция для поиска, если FTS5 станет тесным

Обоснование: мотивация пользователя (LLM из скриптов) полностью закрывается текущим форматом; Maildir даёт стандартность, но теряет человекочитаемость, удобство LLM и требует парсинга MIME. Гибрид (email.md + экспорт в Maildir/ notmuch) даёт лучшее из двух миров. Окончательный вывод — после замеров.

Команды применения

# Создать анализ (вручную, здесь)
# Обновить README: добавить ссылку

Верификация

grep -q 'STORAGE_ANALYSIS' /opt/hermes/email-assistant/README.md
test -f /opt/hermes/email-assistant/STORAGE_ANALYSIS.md
find /opt/hermes/email -name 'email.md' | wc -l   # без изменений с 2652

Rollback

rm /opt/hermes/email-assistant/STORAGE_ANALYSIS.md
# убрать ссылку из README.md