Records variant (b): the panel will check Origin / Sec-Fetch-Site in the same middleware as the security headers, and will not carry CSRF tokens. The coverage table above the decision already says what that buys; what the item was missing is what it does not buy, so both are now written down — the accepted risk (a client sending neither header still gets through, which is exactly the old-browser row) and the two escalation paths with their price, tightening the policy to reject those requests, or session-bound tokens. Phase 14.A grows the implementation rules: which requests are checked, the three-way decision, and the fact that only the host is compared because the panel sits behind a proxy and never sees its own external scheme. The rule depends on r.Host being the external name — all four shipped proxy fragments preserve it (checked), but a proxy that rewrites Host would turn every POST into a 403, so the rejection has to log both sides of the comparison and the container test has to run through a real proxy. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
5.3 KiB
Прогресс реализации SelfPost
Живой трекер состояния. Переживает /clear — читается первым при возобновлении работы.
План (открытые вопросы + опциональные фазы): implementation-plan.md.
ТЗ: specification.md. История релизов: CHANGELOG.md.
История сделанного по фазам (0→13, все закрыты) — в git log и в CHANGELOG, здесь не дублируется.
Как возобновить после сброса контекста
- Прочитать этот файл (текущее состояние, что дальше).
- Открыть
implementation-plan.md— там нерешённые вопросы, Фаза 14 и опциональная линия 2.x.x (Фаза O1+). - При необходимости — детали в
specification.md. - Продолжить с пункта «Следующий шаг».
Модель по типу работы
Правило: безопасность / инфра / риск-критичное → Opus; UI / документация / бойлерплейт → Sonnet; тривиальная механика → Haiku.
Коммиты
Коммит на каждом осмысленном шаге (не каждое сохранение файла, но и не только конец фазы): рабочий под-функционал, зелёная сборка, конец фазы. Минимум — один коммит на закрытую фазу + промежуточные на связные под-шаги. Ветка main (если пользователь не попросит отдельную). Push/PR — только по явной команде. Сообщение коммита завершается трейлером Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>.
На каждом таком шаге — запись в CHANGELOG.md под [Unreleased] (формат Keep a Changelog). При явном решении зарезать версию — секция [Unreleased] переименовывается в [X.Y.Z] - дата, заводится новая пустая [Unreleased]. Тег/пуш образа — только по явному запросу (см. workflow release.yml).
Протокол закрытия фазы/крупного шага
Перед /clear в конце каждого законченного шага Claude:
- Обновляет этот файл: «Текущее состояние» → что изменилось, что дальше.
- Проверяет применимые критерии «Готово, когда…».
- Дописывает
CHANGELOG.mdпод[Unreleased]. - Делает финальный коммит шага.
Текущее состояние
- Выполнено и принято: базовый линейный план 0→11 (v1.0; аудит безопасности ТЗ 7.6 — полное соответствие), Фаза 12 (UI/UX) и Фаза 13 (страница
/status, DNS-проверки домена). Что именно сделано — вgit logиCHANGELOG.md, здесь не дублируется. - Дальше — то, что перечислено в
implementation-plan.md: открытые вопросы (разделы A-D — hardening сверх обязательного 7.6, надёжность, e2e в CI), Фаза 14 — security-заголовки и проверка origin (принят вариант «б» по CSRF:Origin/Sec-Fetch-Siteвместо токенов) + документация про/data/setup-token; опциональная Фаза O1+ (входящий релей, линия 2.x.x, требует согласования). - Прод:
selfpost.mixfed.ru, реальный Let's Encrypt сертификат, живой e2e (DKIM/SPF pass).
Рабочая петля (dev loop) — ВАЖНО
Локально (Windows, D:\Local\Git\selfpost) нет Go и Docker — только редактирование и git. Вся сборка/тесты идут на dev-сервере selfpost.mixfed.ru (Debian 12 bookworm, тот же, что базовый образ; провижён под разработку). Цикл: править локально → залить дерево на сервер → go build/go vet/docker build/тесты там. rsync в локальном git-bash нет, поэтому дерево едет tar'ом по ssh: tar -czf - --exclude=.git . | ssh root@selfpost.mixfed.ru 'rm -rf /root/selfpost-src && mkdir -p /root/selfpost-src && tar -xzf - -C /root/selfpost-src'; Go на сервере — в /usr/local/go/bin (не в PATH по умолчанию); образ — docker build -f build/Dockerfile -t selfpost:dev --build-arg VERSION=dev .. Источник истины и git-история — локальный репозиторий; сервер — только исполнитель сборки/тестов. Подключение: ssh root@selfpost.mixfed.ru (по ключу).