Task card: ручной deploy exact candidate в STAGE¶
Access-часть G9 ниже отражает исходный deploy. Решение 0030 позднее сняло Basic Auth со всех test origins; текущий
skuaro.topдоступен публично, а защищённые Product API по-прежнему требуют SKUARO session/permissions.
- Дата: 2026-08-26.
- Статус:
ACCEPTED_FOR_HANDOFF. - Исполнитель: основной агент.
- Независимый verifier: project reviewer до mutation и после deploy.
- Candidate:
4f9d7153fb8346cc8088f551d330b44c5dbdae0fиз приватнойorigin/DEV; GitHub CI run32893511115завершён успешно. - Server image:
sha256:af1bc31c4e0798d7077bebe11870d2b2c54a7e62030375c465f6f08f3f24867e. - Web image:
sha256:48daa0719d3010bf27e1ca13112c54cd5b11297ac58e873e4ceb5cb6bfc762dd. - Связанные решения: 0013, 0016, 0017, 0019, 0020, 0025, 0026.
Цель¶
Развернуть проверенный exact candidate только в существующем ручном STAGE-контуре на тестовом сервере, сохранив DEV и PROD неизменными, и доказать состояние по обязательным gate G1-G12.
Scope¶
Включено¶
- read-only snapshot STAGE/DEV/edge, ресурсов, image IDs, restart counters и Compose;
- отдельный STAGE logical dump с mode
600иpg_restore --list; - restore dump в одноразовую изолированную PostgreSQL-БД и применение migration candidate до изменения постоянной STAGE-БД;
- защищённая rollback-копия STAGE env и точные предыдущие image IDs;
- отдельный новый STAGE Auth secret;
- отдельный STAGE Resend sending-only credential для подтверждённого домена
mail.skuaro.top; DEV credential не переносится и не переиспользуется; - ручной deploy exact server/web images только в Compose project
skuaro-stage; - legacy STAGE App origin
https://skuaro.topдо отдельной миграции решения 0019; - migration, health, HTTPS, Basic Auth, security headers, negative access, log-marker и restart-loop проверки;
- один полностью синтетический STAGE Auth flow, только если тестовое письмо можно получить без раскрытия секретов или персональных данных;
- restore smoke на отдельной временной БД после deploy;
- документирование доказательств без secret values.
Исключено¶
- deploy или переключение DEV; DEV остаётся на прежнем runtime artifact;
- PROD, merge, PR, создание/продвижение Git-ветки
STAGE, pipeline и GitHub Environment; - DNS/domain migration
skuaro.top -> lk.skuaro.top; - реальные пользователи, клиентские данные и массовая отправка;
- удаление volumes, старых images/releases/backups или schema downgrade;
- публикация developer-site: она выполняется отдельным task contract и gate.
Критерии приёмки¶
- G1 Scope: этот task card фиксирует exact SHA/images, границы, stop conditions, rollback и G9-G12; dirty рабочее дерево не входит в release.
- G2 Static: exact SHA совпадает с
origin/DEV, remote CI успешен. - G3 Unit: unit/coverage exact candidate успешны в remote CI.
- G4 Database: STAGE schema/count snapshot снят без значений данных; dump
восстановлен в отдельную БД; migration candidate там завершилась
0. - G5 Build: image labels содержат полный exact SHA; server/web image IDs совпадают с зафиксированными в card.
- G6 Security: STAGE использует отдельные Auth/Resend credentials; активный env не смешивает Gmail и Resend; значения не попадают в вывод, Git и документы.
- G7 Local E2E: обязательные exact-candidate E2E и затронутые visual проверки подтверждены CI/closeout evidence без runtime code drift.
- G8 Deploy: до migration сохранены валидный dump, предыдущие images/env и recovery path; миграция и запуск STAGE завершены успешно либо выполнен rollback.
- G9 Stage Smoke: liveness/readiness, HTTPS, Basic Auth, same-origin API, HSTS/noindex/no-referrer, containers и логи проходят обязательный smoke.
- G10 Role E2E: фактически реализованные Auth/access negatives проходят;
нереализованные роли явно получают
NOT_APPLICABLE. - G11 Cross-domain: для фактического legacy STAGE проверяются origin isolation,
Basic Auth и отсутствие общей cookie; целевые Site/Docs origins получают
NOT_APPLICABLEдо отдельного deploy решения 0019. - G12 Restore: свежий STAGE dump повторно восстанавливается в отдельную временную БД, schema/data counts сверяются, постоянный volume не изменяется.
- DEV image IDs/start/restart/config и PROD остаются неизменными.
Ожидаемые артефакты¶
- pre/post snapshot без секретов;
- mode-600 STAGE dump и успешный
pg_restore --list; - isolated restore/migration evidence;
- rollback env copy и точные previous image IDs;
- отдельный STAGE credential status только как
SET/EMPTY; - migration/health/HTTPS/access/log/restore evidence;
- итоговая матрица
G1-G12 -> evidence -> PASS/FAIL/BLOCKED/N/A; - обновлённые
docs/STATUS.mdи session log без автоматического Product commit/push.
Permissions¶
- владелец 2026-08-26 явно потребовал: «размести Stage на тестовом сервере, не надо размещать DEV»;
- разрешение охватывает обязательные backup, migration rehearsal, отдельные STAGE runtime credentials, ручное переключение STAGE и проверочные синтетические действия;
- разрешение не охватывает DEV/PROD deploy, merge/PR/pipeline, Git push и удаление данных или recovery artifacts.
Stop conditions¶
- exact SHA/CI/image labels не совпадают;
- не удаётся создать отдельный STAGE Resend credential или provider config смешан;
- свежий dump,
pg_restore --list, isolated restore/migration либо rollback point отсутствуют; - недостаточно disk/memory, Compose/Caddy invalid или isolation DEV/STAGE не доказана;
- migration/health/security/access fail;
- для продолжения требуется раскрыть secret/PII, удалить данные, изменить DEV/PROD, активировать pipeline или выполнить неразрешённую domain migration.
Rollback¶
- Остановить дальнейшие post-deploy действия при первом обязательном FAIL.
- Вернуть только STAGE env и предыдущие server/web image IDs из защищённой копии.
- Выполнить
docker compose up -d --waitтолько дляskuaro-stage. - Не выполнять автоматический schema downgrade и не удалять STAGE volume/backups.
- Проверить health, legacy HTTPS, прежние image IDs и неизменность DEV.
- Зафиксировать
STAGE FAILED; новый deploy требует отдельного исправления и review.
Pre-mutation review 1¶
Независимый reviewer выдал BLOCKED: отсутствовали этот STAGE task contract,
отдельный STAGE Resend credential, rehearsal migration legacy schema и полный G8
recovery package. Разрешена только подготовка card, backup, isolated restore/migration
и resource/config snapshots; переключение STAGE запрещено до повторного review.
Pre-mutation review 2¶
После создания отдельного domain-scoped STAGE Resend credential, восстановления
dump в изолированной PostgreSQL, rehearsal migration и проверки rollback package
независимый reviewer выдал VERIFIED и разрешил ограниченную server mutation.
Фактическое выполнение¶
- Exact candidate
4f9d7153fb8346cc8088f551d330b44c5dbdae0fразвёрнут только вskuaro-stage; API и web используют зафиксированные content-addressed images, PostgreSQL/API/web healthy, worker running, restart counters0. - Активный STAGE env использует отдельные
SKUARO_AUTH_SECRETи domain-scopedSKUARO_RESEND_API_KEY; Gmail credentialsEMPTY. DEV images, start times, restart counters и Gmail runtime не изменены. - До первого deploy, после него и перед повторным переключением созданы mode-
600logical dumps;pg_restore --list, изолированный restore и candidate API smoke прошли. - Синтетический flow прошёл: sign-up
200, вход до verify403 EMAIL_NOT_VERIFIED, Resenddelivered, verify302, replay302без создания сессии, login/access200; effective access: settingstrue, today/adminfalse,startPath=/home. - Первый post-check ошибочно считал любое
token=утечкой, включая безопасноеtoken=[REDACTED], поэтому был выполнен предусмотренный rollback. Rollback выявил и доказал необходимость возвращать вместе старые images, env и Compose: новый Compose несовместим со старым расположением entrypoint и migrator. - Изолированная runtime-проверка candidate и повторный live gate различили raw и
redacted значения: literal/encoded raw markers
0/0,[REDACTED]—2, edge raw markers0/0, API error markers0. После этого тот же exact candidate повторно развёрнут с новым dump и полным rollback package. - External smoke: guest/wrong Basic Auth
401, authenticated home200, session access200, HSTS/noindex/no-referrer присутствуют. - Product commit/push, merge, pipeline, DEV и PROD не выполнялись.
Независимый post-deploy verdict¶
Project reviewer независимо сверил Git identity, CI evidence, runtime package,
external headers и Auth artifacts и выдал VERIFIED: G1–G12, corrected raw-marker
gate и DEV invariant — PASS, блокирующих STAGE findings нет. Прямой SSH-снимок
verifier не повторял из-за отсутствия отдельной SSH-auth; серверные image/restore
доказательства сверены по переданному package, а внешние проверки повторены
независимо. Координатор присвоил ACCEPTED_FOR_HANDOFF.