diff --git a/agents/claude/inbox/2026-10-19-stage1-pr4-review-and-deploy.md b/agents/claude/inbox/2026-10-19-stage1-pr4-review-and-deploy.md new file mode 100644 index 0000000..fee1aaa --- /dev/null +++ b/agents/claude/inbox/2026-10-19-stage1-pr4-review-and-deploy.md @@ -0,0 +1,142 @@ +# Claude — независимая проверка PR #4 и развёртывание Stage1 + +Дата: 2026-10-19. От: владелец, задание подготовил Codex по прямому запросу. + +## Base SHA и материалы + +- PR: https://git.ochenstarik.ru/ochenstarik/randomayzer/pulls/4 +- Base PR при подготовке: `52fb7587d7dda5ae3d1c5e9ecef96b7f48d147a3`. +- Head PR, подлежащий проверке: `930e6ee5e73c9269088b0a9eff576a58ec6ea158`, ветка `codex/stage1-completion`. +- Production source/tests/dependencies/Prisma/Docker/Compose/tools проверены на `cce70c0b8feb263cc9209332c8c50a44bc97428a`; после этого они не менялись до указанного head. +- R5 templates/runbook независимо перепроверены на `c5ede46bd1c31b1e23434538fdb8a1cd925751a6`. +- Этот handoff добавляется следующим документационным коммитом. При старте получить фактические base/head PR: если изменились runtime/config-файлы, проверить новый diff и заново определить reviewed SHA. Не подменять проверенный snapshot текущим HEAD молча. +- Исходное задание: `agents/codex/inbox/2026-10-19-stage1-completion.md` (включая обновление R5 из base выше). +- Итог Codex: `agents/codex/done/2026-10-19-stage1-completion.md`. +- Обязательный runbook: `docs/STAGE1_DEPLOYMENT_RUNBOOK.md`. +- VK checklist/инструкция smoke: `docs/VK_REAL_SMOKE_TEST.md`; контракты: `docs/VK_ID_LIVE_CONTRACT.md`, `docs/VK_INTEGRATION_PLAN.md`. +- Production guards: `docs/PRODUCTION_GUARDS.md`. +- Review evidence: оба `2026-10-19-auditor*-rereview-cce70c0` / `auditor2-high-rereview` и оба `2026-10-19-auditor*-r5-rereview-c5ede46` в `agents/codex/done/`; точные имена взять из дерева репозитория. + +## Scope / роль + +Провести независимый review PR, воспроизвести gate, затем развернуть проверенный результат по runbook на домашнем сервере и существующем VPS. Выполнить оставшиеся живые VK и сетевые проверки. Зафиксировать evidence и решение о приёмке; зелёные локальные тесты Codex не заменяют эту работу. + +Сначала review, затем deployment только после устранения release-blocking findings и выполнения предусловий. Merge в main выполняет владелец либо Claude по исходному заданию и принятому владельцем порядку; не делать merge автоматически до успешного review. Перед deployment зафиксировать выбранный reviewed/deployed SHA и image ID; при merge записать также merge SHA и убедиться, что развёрнут именно проверенный код. + +В рамках этого задания разрешены операторские изменения только Randomayzer: его app/DB/backup, отдельный доменный блок и маршруты существующих прокси, узкие firewall rules согласно runbook. Изменение production source по найденным замечаниям — отдельный implementation task/commit и повторное review, без смешивания с независимым отчётом. Это задание не разрешает незапрошенный рефакторинг. + +## Do not change / границы + +- Соблюдать `AGENTS.md`, `agents/README.md` и протокол памяти `/srv/projects/AI-Memory/00_SYSTEM/AGENT_PROTOCOL.md`. Прочитать project CURRENT_STATE/HANDOFF/TASKS и релевантные verified lessons/patterns. +- Существующие тесты и проверки не ослаблять. Уже разрешённое владельцем исключение: seed32 bytes/64hex и узкие seed assertions, запись `agents/codex/inbox/2026-10-19-seed-owner-authorization.md`. Нового разрешения менять Randomizer/AuditProof/proof format/snapshot hash/HMAC algorithm нет. +- Сохранить чужие рабочие изменения, в частности локальный `AGENTS.md`; не включать их в свои коммиты. +- Не менять WireGuard, домашний роутер, чужие Apache/Express/Nextcloud/Forgejo/fleet/krona/business-platform/Authelia и их volumes. Не ставить второй proxy на80/443. Не выполнять global prune, production down -v, force-push, restart/recreate общих proxy-контейнеров. +- Не включать Authelia вместо Basic Auth без отдельного подтверждения действующей policy; текущий runbook использует Basic Auth. +- Не публиковать БД, wildcard/LAN bind приложения, credentials или proxy configs. Не выводить `.Config.Env`, raw OAuth callback/logs, response bodies с private data, cookies, bearer tokens или Basic Auth hash в отчёт. + +## 1. Независимый review и gate + +1. Получить PR/ветку, записать полный base/head SHA и проверить diff, отчёт Codex и независимые re-review. Проверить узкие seed-исключения, initial migration, сохранность ownership/public-audit boundaries, отсутствие partial participant saves, proxy socket-peer boundary, local-single-user и строгий domain-профиль, smoke LIVE marker, backup/restore и rollback. +2. Убедиться, что прежние HIGH malformed VK records и MEDIUM mock-smoke / отсутствующий reload закрыты именно на проверяемом SHA. Воспроизводимый PoC сильнее общего PASS; новое CRITICAL/HIGH блокирует deployment, нужен отдельный fix и re-review. +3. На отдельной verification checkout/среде выполнить, записывая exit code и краткий фактический результат: + + ```bash + npm ci + npx prisma generate + npm test + npx tsc --noEmit + npm run lint + npm run build + npm audit --omit=dev + ``` + + Ожидание по Codex: 380/380, lint0errors/6warnings, build/tsc pass, production audit0. Это ориентир, не подстановка результата. Полный dev-inclusive audit ранее содержал19 advisories; не объявлять весь dependency tree чистым. +4. Воспроизвести R2 по разделу5 runbook: отдельная PostgreSQL16, только127.0.0.1:55439 после проверки свободного порта; чистая тестовая БД, migrate deploy (3 migrations), integration12/12, schema diff без различий. Integration tests удаляют данные: production DATABASE_URL запрещён. Для чистоты использовать новый только тестовый volume/DB; не удалять существующие volumes для удобства проверки. +5. Проверить proxy templates: `bash agents/codex/notes/validate-r5-templates.sh`; это локальная syntax-проверка, не доказательство active VPS config. Реальную версию и active config проверить отдельно. + +Оставшиеся LOW не скрывать: pre-existing COMMUNITY adminDetection metadata (текущие routes SERVICE/USER/static guard не позволяют неподдерживаемую проверку) и отсутствие обычного HTTP→HTTPS redirect, если добавлен только HTTP-01 маршрут. Для второго HTTPS/ACME acceptance обязательна, редирект обычного HTTP не заявлен. Не направлять обычный HTTP к приложению без защиты ради закрытия LOW; если требуется отдельный redirect route, согласовать scope, проверить diff и порядок активации. + +## 2. Предусловия и фиксация baseline + +- Проверить доступ к обеим машинам. Домашний сервер — текущий сервер проекта, VPS —178.212.13.102; не предполагать, что локальная shell автоматически на нужной машине. +- Подтвердить у владельца, что WG peer10.77.0.1 — именно этот VPS. На доме ожидается существующий krona-wg10.77.0.3/24; проверить маршруты в обе стороны. Сырые private keys/WG configs не публиковать. +- DNS random.ochenstarik.ru должен указывать на178.212.13.102. Ранее локально наблюдался185.26.122.80: перепроверить, не считать исправленным. Если запись неверна — blocker владельцу, не продолжать выпуск сертификата. +- Проверить `ss`, RAM/CPU и диск (ранее82% занято). Порты80/3000/5432/8080 заняты другими сервисами; выбрать свободный3100. Ничего не освобождать остановкой чужих сервисов. +- Владельцу предоставить реальные VK ID app/service credentials и отдельные AUTH_SECRET/TOKEN_ENCRYPTION_KEY в защищённом0600-файле вне Git; production env и smoke session file — разные файлы. Не генерировать/подменять реальные credentials молча. Если их нет, продолжать независимый review/несекретную подготовку, живые шаги отметить BLOCKED. +- VK ID redirect URI проверять фактически в кабинете: R4 `http://localhost:3100/api/auth/vk/callback`, R5 `https://random.ochenstarik.ru/api/auth/vk/callback`. При смене профиля использовать согласованный canonical origin. Поддержку localhost данным VK-приложением не предполагать. +- На VPS снять other-site baseline для всех действующих доменов на80/443, минимум git.ochenstarik.ru; записать status/latency и доступность ключевых сервисов без sensitive bodies. Подтвердить окно без параллельных правок proxy configs. + +## 3. Домашний сервер: R4, backup/restore, затем R5 overlay + +Выполнять разделы1–4 runbook в их порядке, без копирования placeholder path/user в shell: + +- Env0600 вне checkout; `compose.production.yml`, app127.0.0.1:3100, отдельные randomayzer-сети/volume, PG без host port. Пользователи node/postgres, лимиты app1GiB/1.5CPU и PG512MiB/1CPU проверить в runtime. +- Перед изменением существующей БД сделать backup и clean restore drill. Initial migration не применять CREATE поверх уже существующих таблиц: сверить schema/history и только при доказанном соответствии использовать предусмотренный baseline resolve. Ownership migration не обходить фиктивным applied. +- При первом развёртывании поднять БД/миграции/app, проверить health и anonymous `/api/auth/me`. Не использовать fake env/тестовые volumes Codex для реального deployment. +- Проверить loopback profile через браузер/SSH tunnel и строгие guards вне loopback. Проверить cookie HttpOnly/SameSite и Secure согласно профилю, canonical callback/PKCE, CSRF origin и отказ forged forwarded headers от недоверенного peer. Не менять production credentials для имитации тестов. +- Выполнить `tools/db-backup-daily.sh` с реальным env и приватным каталогом: dump восстановлен в чистую temporary DB, проверены schema и counts, drill DB удалена. Не восстанавливать dump поверх действующей БД. Установить/проверить backup timer/service с реальными operator paths/ownership, следующее срабатывание и успешный ручной oneshot. В отчёт только факт/числа/exit, не данные пользователей. +- Перед domain overlay установить узкие правила через фактически действующий firewall manager, с persistence и rollback; не смешивать iptables/nftables/ufw/firewalld. При неизвестной топологии — STOP. +- Только после этого включить `compose.domain.yml`: host bindings127.0.0.1 и10.77.0.3, без0.0.0.0/LAN/DBports. Domain app guards строгие HTTPS/Secure/canonical origin. С VPS upstream10.77.0.3:3100 должен отвечать. + +## 4. VPS: только additive proxy changes по разделу6 runbook + +- Подтвердить actual images/patch versions/mount paths/includes/process argv и active/source config совпадение у `krona-reverse-proxy` (Caddy2.8) и `krona-proxy-mux` (HAProxy3.0). Не угадывать backend names или предполагать SNI passthrough: выяснить actual topology. +- Сохранить оба active/source configs и необходимые config trees в root-only backup, проверить полноту/совпадение. Не выкладывать их в Git/report. Single-file bind mount редактировать с сохранением inode, сверить содержимое внутри контейнера. +- До правок должны проходить `caddy validate` и `haproxy -c` с реальными путями и всеми active -f; после каждой правки повторить. При baseline error не чинить чужой proxy в рамках Randomayzer. +- Подтвердить штатный reload до правок: PID1 master-worker и -W/-Ws + полный config set для указанной функции USR2; Caddy admin API доступен для штатного reload. Если preconditions не доказаны — STOP, не использовать restart как обход. +- Порядок: при необходимости только HTTP-01 Host/path route → validate/reload HAProxy; защищённый Basic Auth Caddy site → validate/reload Caddy; затем TLS SNI route → validate/reload HAProxy. На каждом этапе сравнить existing-site baselines. Не заменять целиком configs шаблонами репозитория. +- Проверить, что worker handoff HAProxy состоялся, а ID/StartedAt/RestartCount обоих proxy containers не изменились. Отсутствие рестарта подтвердить наблюдением, не только названием команды. +- TLS выдан для правильного домена, chain/hostname/expiry валидны без curl -k, HTTP-01 реально работает; synthetic validate не доказывает certificate issuance. Не форсировать repeated ACME issuance/renewal до rate limit. +- Из внешней точки без proxy auth —401; с proxy auth, но без app session — безопасный unauthenticated JSON; VK callback/login по домену работает, cookies Secure. Basic Auth пароль не передавать в CLI args; использовать interactive prompt/0600-file из smoke инструкции. +- Если отдельный HTTP redirect не настроен, записать фактическое поведение HTTP как LOW; не объявлять его проверенным HTTPS redirect. + +## 5. Живой VK: A–H и ручные I–M + +Использовать owner-approved тестовый аккаунт, публичный пост с заведомо непустыми likes/comments, доступный этому organizer restricted post и группу для subscription. Нужны реальные ответы; MOCK/пустой импорт не доказательство. Для полной приёмки E/H не пропускать из-за необязательности env-полей. + +1. Пройти browser consent вручную, проверить точный callback/ошибки и authenticated session. Экран B никогда не засчитывается по exit code скрипта. +2. Создать отдельный smoke env0600 вне Git по `docs/VK_REAL_SMOKE_TEST.md`. Cookie и proxy credentials только там; `VK_SMOKE_CREATE_GIVEAWAY=YES` означает разрешённое создание тестового giveaway. Использовать только согласованный тестовый контент. +3. Выполнить `./tools/vk-smoke.sh ` в применимых профилях; итоговый domain run обязателен. Записать каждый A–H со статусом PASS/FAIL/SKIP/MANUAL/BLOCKED, временем и безопасным evidence. Exit0 не превращает SKIP/MANUAL в PASS. +4. Проверить смысл пунктов: A PKCE S256/OAuth redirect; B настоящий consent; C session; D public SERVICE; E restricted USER (видимый organizer); F creation; G непустой полный import likes/comments; H полная subscription check, включая участника/неучастника при наличии разрешённых данных. Если реальные scopes/capabilities не позволяют сценарий — фактическая ошибка и BLOCKED/UNVERIFIED, не смена policy ради PASS. +5. Ручные I–M: lock snapshot → один draw → public verification без app session → refresh на естественно истёкшем/разрешённом тестовом credential либо явная reauthentication → logout/unauthenticated. Для public verify сохранить обязательную proxy auth, убрать именно app session; приватные organizer/participant/credential данные не должны попасть в public response. Refresh не имитировать редактированием live credential DB; если нельзя безопасно дождаться expiry — оставить отдельный BLOCKED. +6. В браузере проверить объяснения неподдерживаемых manager/repost правил, понятность отказов и отсутствие ложного статуса участника. Проверить сохранение previous participants при неполном импорте; опасные/malformed сценарии воспроизводить в изолированной fixture, не вмешиваться в live VK и не создавать искусственную нагрузку для rate limit. +7. Для VK API/VK ID/OAuth/scopes/limits/method capabilities сверить актуальную официальную документацию VK/VKCOM, записать прямой источник и дату. Разделить official contract, наблюдавшийся live result и оставшийся UNVERIFIED; не выводить общий контракт из одного успешного запроса. `execute` текущим provider не вызывается: не добавлять его для smoke, отметить неприменимость и неизвестные лимиты. +8. Тестовые giveaways отметить и убрать только согласованным штатным способом после сохранения безопасного evidence; не делать прямой SQL cleanup production данных. Выйти из тестовой session, удалить smoke cookie-file/private temp artifacts безопасным способом. Реальные production env/backup не удалять. + +## 6. Сетевая изоляция и чужие сервисы + +Проверить доступность app3100 из каждой точки; для каждой записать source/destination и результат: + +| Точка | Ожидание | +|---|---| +| Домашний loopback127.0.0.1 | app доступен | +| VPS10.77.0.1 → home10.77.0.3 | app доступен через WG | +| Другая LAN машина → домашний LAN IP и10.77.0.3, если есть маршрут | app недоступен | +| Независимая внешняя машина → домашний публичный IP и VPS public IP:3100 | app не опубликован | +| Другой WG peer, если доступен для проверки | app недоступен | +| Внешняя машина → random.ochenstarik.ru:443 | TLS +401 без proxy auth | + +Отсутствие тестовой точки не равно PASS: отметить UNVERIFIED с конкретным недостающим evidence. Проверить, что PG не имеет published port (не спутать с чужим127.0.0.1:5432). Из разрешённого туннеля подтвердить реальный socket peer10.77.0.1; forged Host/X-Forwarded-* от чужого peer не должны выбирать доверенный контекст. Приложение не должно молча терять peer из-за Docker/NAT; если теряет — blocker, не включать TRUST_PROXY=true для всех. + +После каждого proxy reload и в конце повторить baseline всех прежних сайтов/сервисов: Forgejo, fleet-hub, krona, business-platform и существующий auth flow. Сравнить80/443 и meaningful доступность с собственным baseline; прежний401/redirect не считать сбоем, но изменение поведения расследовать. Не использовать для этого чужие credentials. + +## 7. Условия остановки и rollback + +При новом CRITICAL/HIGH, неизвестной topology/credential policy, невалидном config, отсутствии backup/reload evidence, лишнем bind, failed migration, недоступности app или ухудшении любого чужого сайта остановить дальнейшее продвижение. Не публиковать небезопасный deployment ради завершения checklist. + +Откат строго по разделам4/6.6 runbook: вернуть только свои config edits без затирания параллельных изменений, validate, штатные reload без restart, повторить all-site baselines; убрать только свои firewall rules и domain overlay, оставить loopback. App rollback к сохранённому image. Текущую production DB/volume сохранять; при необходимости DB restore — новая БД, проверка и согласованное переключение, не автоматическое затирание данных. Если безопасный rollback общих proxy не доказан — передать владельцу точную ошибку/backup location без секретов, не перезапускать их наугад. + +## Definition of Done и отчёт + +Сохранить `agents/claude/done/2026-10-19-stage1-pr4-review-and-deploy.md` и собственный worklog; обновить project state согласно memory protocol, сохраняя чужие записи. + +Отчёт обязан содержать: +- PR URL, base/reviewed/result/merge/deployed полные SHA, image ID и фактические версии; когда/на какой машине выполнено. +- Все изменённые repo files и краткое описание operator changes, backup/rollback locations без sensitive contents. +- Реально выполненные команды, exit codes/краткий sanitized вывод; тесты/lint/build/audit и clean migrations/integration/restore отдельно. +- CRITICAL/HIGH/MEDIUM/LOW findings с evidence и CLOSED/OPEN, решения по двум известным LOW; не закрывать своим заявлением finding без повторной проверки. +- Матрицу A–M (каждый пункт отдельно), live contractual sources, proxy/TLS/401/domain login, firewall persistence и все сетевые точки, other-site baseline до/после, отсутствие proxy restart. +- Список UNVERIFIED, blockers и non-blocking debt; если есть SKIP/MANUAL/BLOCKED, итог не «всё PASS». +- Вердикты отдельно: PR review; домашний deployment; VPS/domain; live VK; рекомендация главному координатору. Отсутствие credentials/access — частичный отчёт с конкретным blocker, без придуманного успеха. + +Полная приёмка возможна только при выполнении исходного DoD, фактических gates, отсутствии release-blocking CRITICAL/HIGH, сводке независимых findings и зафиксированном deployed SHA. Исполнитель не объявляет Phase CLOSED/release-ready/production-ready самостоятельно: финальное решение принимает главный координатор по evidence. diff --git a/agents/codex/done/2026-10-19-claude-handoff-task.md b/agents/codex/done/2026-10-19-claude-handoff-task.md new file mode 100644 index 0000000..6c7d198 --- /dev/null +++ b/agents/codex/done/2026-10-19-claude-handoff-task.md @@ -0,0 +1,20 @@ +# Result — задание Claude +Base SHA: 930e6ee5e73c9269088b0a9eff576a58ec6ea158. +Production code не менялся; result — документационный коммит этого отчёта, определяется git log -1 -- agents/claude/inbox/2026-10-19-stage1-pr4-review-and-deploy.md. + +Изменённые файлы: +- agents/codex/inbox/2026-10-19-claude-handoff-task.md +- agents/claude/inbox/2026-10-19-stage1-pr4-review-and-deploy.md +- agents/codex/done/2026-10-19-claude-handoff-task.md + +Подготовлено исполнимое задание на независимый review PR4, проверку gate и clean PostgreSQL, deployment дома/VPS по runbook, backup/restore/timer, Caddy/HAProxy no-restart reload, live VK A–M, TLS/401/cookies/forwarded-peer/network isolation, existing-site baseline, rollback и итоговый evidence report. Известные LOW и внешние blockers явно сохранены. Другие чаты/люди не уведомлялись; это документ для передачи владельцем. + +Фактическая проверка: +- Forgejo get_pull_request_by_index(4): open, merged=false, mergeable=true; base52fb7587d7dda5ae3d1c5e9ecef96b7f48d147a3 / head930e6ee5e73c9269088b0a9eff576a58ec6ea158. +- Сверка runbook, VK_REAL_SMOKE_TEST, итогового Codex evidence и independent review conclusions. +- Python structure/reference assertions: exit0. +- git diff --check: exit0. +- npm/Prisma/Docker tests не запускались: изменены только задания/отчёт, runtime files не менялись. + +UNVERIFIED: actual VPS/DNS/WG/firewall/TLS, реальные VK credentials/consent/scopes/refresh и deployment остаются задачей Claude/оператора. Развёртывание этим действием не выполнялось; Phase CLOSED не объявлена. +Blockers подготовки документа: нет. Оставшиеся operational blockers/debt перечислены в задании и исходном отчёте. diff --git a/agents/codex/inbox/2026-10-19-claude-handoff-task.md b/agents/codex/inbox/2026-10-19-claude-handoff-task.md new file mode 100644 index 0000000..bb89c65 --- /dev/null +++ b/agents/codex/inbox/2026-10-19-claude-handoff-task.md @@ -0,0 +1,7 @@ +# Task — задание Claude на review и развёртывание stage1 +Base SHA: 930e6ee5e73c9269088b0a9eff576a58ec6ea158. +Запрос владельца: подготовить задание Claude на проверку PR4, развёртывание по runbook и оставшиеся проверки живого VK/VPS. +Scope: сохранить полный исполнимый handoff в agents/claude/inbox/, включить критерии приёмки, prerequisites, границы доступа, evidence и rollback; опубликовать документ в текущей ветке PR4. +Do not change: production source/tests, инфраструктура/credentials, пользовательская правка AGENTS.md. +Definition of Done: документ доступен владельцу и Claude, содержит точные SHA/ссылки/команды и все открытые проверки. Развёртывание в этой сессии не выполняется. +Required verification: сверить задание с актуальным PR, runbook, VK smoke checklist и независимыми review; git diff --check.