# План v4: зеркалирование main в Gitea-бэкап (с предусловиями)

## Цель

Доставить локальный `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 не пройдёт. Шаг необходим именно для зеркалирования.
- **Побочные эффекты.** Считает отпечаток текущего staged-diff (индекс пуст), прогоняет
  tools-сюиту vitest на чтение (`npx vitest run --root app --config vitest.config.tools.mjs`),
  и при успехе пишет **единственный** файл `~/.claude/runtime/verify-receipt.json`.
  Код приложения, схему БД, рабочее дерево, прод и удалённые репо НЕ трогает; внешних
  сетевых вызовов нет; идемпотентна (перезапись той же расписки, инкремент `occurrence`).
- **Громкость.** «Громко» (запись файла расписки), эффект изолирован в protected runtime.

## Шаг 2 — push

`git push` локального `main` в Gitea по HTTPS-URL. `--force` не используется.

## Предусловия и обработка отказов

- **Учётка Gitea.** Push по HTTPS требует учётной записи владельца (`liderra`). Если
  аутентификация не пройдёт — операция останавливается, вывод показывается владельцу
  (не форсировать, не повторять вслепую).
- **Non-fast-forward.** Если Gitea отвергнет push как non-FF — остановиться без `--force`;
  история бэкапа не перезаписывается.
- **Откат.** Не требуется: 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 не раскрыт. Сняты — раздел «Шаг 1
(раскрытие)» даёт цель, побочные эффекты и громкость; раздел «Предусловия и обработка
отказов» фиксирует поведение при сбое auth/non-FF и гарантию отката.

### Круг 2

Наставник, прошу при одобрении зафиксировать в `recommendation` forward-указание для
исполнителя (например: «перед push убедиться в доступности учётной записи Gitea; при
любом отказе — остановиться и показать вывод владельцу, не форсировать»). Это операция
резервного копирования: прод и рабочее дерево не затрагиваются, откат гарантирован
самим характером push (только добавление коммитов в бэкап).
