# Прогресс реализации SelfPost Живой трекер фаз. **Переживает `/clear`** — читается первым при возобновлении работы. План фаз: [implementation-plan.md](implementation-plan.md). ТЗ: [specification.md](specification.md). ## Как возобновить после сброса контекста 1. Прочитать этот файл (текущая фаза, статус, что сделано, что дальше). 2. Прочитать соответствующую фазу в `implementation-plan.md`. 3. При необходимости — детали в `specification.md`. 4. Продолжить с пункта «Следующий шаг». ## Рекомендуемая модель по фазам | Фаза | Модель | Почему | |---|---|---| | 0 — каркас + спайк milter | **Opus** | архитектура + главный технический риск (7.3) | | 1 — Docker/supervisord/обёртка | **Opus** | тонкая логика холодного старта сокетов | | 2 — SQLite/setup-link/auth | **Opus** | безопасность 7.6 (крипто-токен, сессии, bcrypt) | | 3 — домены + OpenDKIM | **Opus** | генерация конфигов + exec-safety (7.6.3–4) | | 4 — приложения + SASL + sender_login_maps | **Opus** | риск open relay / привязки отправителя | | 5 — полный Postfix | **Opus** | самый чувствительный тракт доставки | | 6 — journal-milter | **Opus** | наивысший риск (баг ломает релей) | | 7 — UI мониторинга | **Sonnet** | шаблоны/CRUD, рутинно | | 8 — rate limit L2 | **Opus** | логика лимитов в milter | | 9 — бэкап/restore/экспорт | **Opus** | целостность данных, версионирование | | 10 — деплой + docs | **Sonnet** | compose-файлы и документация | | 11 — security-проход | **Opus** | аудит соответствия 7.6 | Правило: безопасность / инфра / риск-критичное → **Opus**; UI / документация / бойлерплейт → **Sonnet**; тривиальная механика → **Haiku**. ## Коммиты Коммит на **каждом осмысленном шаге** (не каждое сохранение файла, но и не только конец фазы): рабочий под-функционал, зелёная сборка, конец фазы. Минимум — один коммит на закрытую фазу + промежуточные на связные под-шаги. Ветка `main` (если пользователь не попросит отдельную). Push/PR — только по явной команде. Сообщение коммита завершается трейлером `Co-Authored-By: Claude Opus 4.8 `. ## Протокол закрытия фазы Перед `/clear` в конце каждой фазы Claude: 1. Обновляет этот файл: статус фазы → ✅, заполняет «Сделано» и «Следующий шаг». 2. Проверяет критерии «Готово, когда…» из плана. 3. Пишет одну строку в журнал ниже. 4. Делает финальный коммит фазы. 5. Явно говорит: «Фаза N закрыта — можно `/clear`, следующая фаза N+1 на модели X». --- ## Текущее состояние - **Текущая фаза:** 0 ✅ закрыта → следующая **Фаза 1** (Docker + supervisord + три процесса) - **Модель для Фазы 1:** Opus - **Статус:** каркас собран и проверен на сервере; спайк milter снял главный риск ТЗ 7.3 - **Следующий шаг (Фаза 1):** `Dockerfile` (bookworm-slim: postfix, opendkim, cyrus-sasl, supervisor, logrotate); `supervisord.conf` с `priority=` (opendkim→panel→postfix); стартовая обёртка Postfix с ожиданием milter-сокетов; панель `:8080` с заглушкой + stub journal-milter listener + stub log-tailer; непривилегированный пользователь панели. Проверка: `docker build`, контейнер стартует, три процесса живы. ### Сделано в Фазе 0 - Go-модуль `codeberg.org/mix/selfpost`, каркас `cmd/panel` + `cmd/selfpost-backup`, общий `internal/buildinfo` (версия через ldflags). - `Makefile` (статическая сборка `CGO_ENABLED=0`), `LICENSE` (полный AGPL-3.0), скелет `README.md`, `.gitattributes` (LF). - Проверено на сервере: `go vet` чист, `make build` даёт статические бинарники, версия впечатывается. - **Спайк go-milter** (де-риск ТЗ 7.3): v0.4.1 (BSD-2) ↔ Postfix 3.7.11 bookworm, протокол v6. Подтверждено чтение From/To(per-rcpt)/Subject/queue-id, client IP из Connect(), **fail-open** при падении milter'а. Детали: `dev/spike-milter-notes.md`. - **Провижён dev-сервер:** Go 1.26.5, Docker 29.6.1, git, rsync, make. Host-postfix (спайковый) остановлен+отключён. ## Рабочая петля (dev loop) — ВАЖНО Локально (Windows, ``) **нет Go и Docker** — только редактирование и git. Вся сборка/тесты идут на dev-сервере `selfpost.example.com` (Debian 12 bookworm, тот же, что базовый образ; провижён под разработку). Цикл: править локально → `rsync` дерева на сервер → `go build`/`go vet`/`docker build`/тесты там. Источник истины и git-история — локальный репозиторий; сервер — только исполнитель сборки/тестов. Подключение: `ssh root@selfpost.example.com` (по ключу). ## Утверждённые решения - Module path: `codeberg.org/mix/selfpost` - SQLite: `modernc.org/sqlite` (чистый Go, без cgo) - milter: `github.com/emersion/go-milter` (проверить совместимость в Фазе 0) - Структура: стандартная Go-раскладка (`cmd/`, `internal/`) - Front-end: `html/template` + вендоренный HTMX - Коммиты — только по явной команде пользователя (ТЗ 12.1) ## Журнал фаз - **Фаза 0** (2026-07-11, Opus) — каркас проекта + build-пайплайн + спайк go-milter (риск ТЗ 7.3 снят). Коммиты `4e589e1` (каркас), `87388b4` (план).