# План v3: зеркалирование main в Gitea-бэкап (с раскрытым verify-шагом)

## Цель

Доставить локальный `main` в Gitea-репозиторий бэкапа `liderra/portal` fast-forward'ом.
Опирается на спеку
[2026-06-16-gitea-backup-push-main-v2.md](../specs/2026-06-16-gitea-backup-push-main-v2.md)
(D1 — контракт push, D2 — критерий приёмки). Прод и рабочее дерево не затрагиваются.

## Шаг 1 — производство verify-расписки (раскрытие)

Команда: `node tools/produce-verify-receipt.mjs`.

- **Цель.** Гейт `enforce-verify-gate` блокирует `git push` без свежей подписанной
  расписки (`stale-fingerprint`). Эта команда — штатный производитель расписки: без неё
  шаг 2 не пройдёт. Шаг необходим именно для зеркалирования (push не идёт без расписки).
- **Что делает / побочные эффекты.** Считает отпечаток текущего staged-diff (индекс
  сейчас пуст), прогоняет tools-сюиту vitest на чтение
  (`npx vitest run --root app --config vitest.config.tools.mjs` — анализ, без правки
  кода/схемы/прода), и при успехе записывает **единственный** файл
  `~/.claude/runtime/verify-receipt.json`. Других файлов не создаёт, код приложения,
  схему БД, рабочее дерево, прод liderra.ru и удалённые репозитории НЕ трогает.
  Сетевых вызовов наружу не делает (vitest локален). Идемпотентна — повторный запуск
  перезаписывает ту же расписку (инкремент `occurrence`).
- **Громкость церемонии.** «Громко» (мутирующая — пишет файл расписки), но эффект
  изолирован в protected runtime; вне runtime ничего не меняется.

## Шаг 2 — push

`git push` локального `main` в Gitea по HTTPS-URL. `--force` не используется: при
non-fast-forward push отклоняется сам, история бэкапа сохраняется. Откат не требуется —
push только добавляет коммиты в удалённую ветку бэкапа.

```skills-json
[]
```

```steps-json
[
  {
    "op": "Bash",
    "object": "node tools/produce-verify-receipt.mjs",
    "ref": "D2"
  },
  {
    "op": "Bash",
    "object": "git push https://111.88.252.149.nip.io/liderra/portal.git main",
    "ref": "D1"
  }
]
```

```verified-context-json
[
  {
    "id": "gitea-backup-ref",
    "kind": "EXTRACTED",
    "ref": "docs/superpowers/audits/2026-06-15-prod-vs-local-snapshot.md",
    "anchor": "Бэкап-сервер Gitea"
  }
]
```

## Переговоры

### Круг 1

Замечание наставника (по плану v2): шаг 1 `node tools/produce-verify-receipt.mjs` не
раскрыт — назначение, побочные эффекты и громкость не определены (DR-1).

Довод: раздел «Шаг 1 — производство verify-расписки (раскрытие)» выше теперь явно даёт
все три пункта, которые требовал наставник:
1. **Цель** — без расписки `enforce-verify-gate` блокирует push (шаг 1 обязателен для
   зеркалирования).
2. **Побочные эффекты** — пишется единственный файл `~/.claude/runtime/verify-receipt.json`;
   vitest-прогон — чтение; код/схема/прод/рабочее дерево/удалённые репо не затрагиваются;
   внешних сетевых вызовов нет; команда идемпотентна.
3. **Громкость** — «громко» (запись файла расписки), эффект изолирован в protected runtime.

Шаг 2 (push) наставник ранее признал тихим и корректным — он без изменений.
