docs(e2e): доказательства — повторная приёмка после d52ecf3 и b022885

Почему: пока шёл разбор, Codex запушил codex/fix-tenant-rehome d52ecf3
(17:02, синонимы C6) и codex/fix-pilot-backups b022885 (17:07, ротация на ПК).
Таблица по старым SHA устарела, поэтому все 7 веток прогнаны заново
(стенд a6a1b5e): round3-accept-f7d3c73-rerun.md.

В round3-k18-and-rehome.md, разд. 6: вывод [PILOT-REHOME] на d52ecf3 как есть
(многострочный JSON → «dry-run без JSON-отчёта»), пошаговая диагностика
в копии сценария, которую потом откатил (что упадёт дальше: сумма журнала
в dry-run, dry-run по умолчанию вместо переноса), и тесты backup на b022885.
This commit is contained in:
grok 2026-09-26 17:20:23 +07:00
parent d477dde387
commit 75f76430d4
2 changed files with 162 additions and 0 deletions

View file

@ -0,0 +1,95 @@
## accept-branch — 2026-09-26 10:17 UTC
База: `origin/codex/bootstrap-platform-foundation` = f7d3c73; стенд (оверлей tests/e2e, scripts/test): a6a1b5e; БД: роли созданы один раз через E2E_PG_ADMIN_URL (provision-pg), дальше --roles keep. Логи: `tests/e2e/evidence/accept/2026-09-26T10-14-42/`.
### Сводка
| Ветка | SHA | npm run check | integration (красные файлы) | e2e red/green | e2e: стало зелёным | e2e: стало красным |
| ------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------- | ------------------------------------------- | ------------------ | ------------------------------- |
| origin/codex/bootstrap-platform-foundation (база) | f7d3c73 | OK (195 passed | 1 skipped (196)) | 3/4 зелёных; FAIL: tenant-isolation.test.ts | 46/5 | n/a | n/a |
| origin/antigravity/fix-reject-device-shifts | b283736 | OK (196 passed | 3 skipped (199)) | 4/5 зелёных; FAIL: tenant-isolation.test.ts | 44/7 | K13/SYNC-A, K13/SYNC-B | — |
| origin/antigravity/fix-sync-c0-bootstrap | 24cc18d | OK (197 passed | 5 skipped (202)) | 5/6 зелёных; FAIL: tenant-isolation.test.ts | 43/8 | K13/SYNC-A, K13/SYNC-B, SYNC-C0 | — |
| origin/codex/fix-format-baseline | a05777c | OK (195 passed | 1 skipped (196)) | 3/4 зелёных; FAIL: tenant-isolation.test.ts | 46/5 | — | — |
| origin/codex/fix-live-database | 1573860 | OK (197 passed | 2 skipped (199)) | 4/5 зелёных; FAIL: tenant-isolation.test.ts | 44/7 | K3/N2, K4/N1 | — |
| origin/codex/fix-pilot-backups | b022885 | OK (195 passed | 1 skipped (196)) | 3/4 зелёных; FAIL: tenant-isolation.test.ts | 46/5 | — | — |
| origin/codex/fix-tenant-config | 535052e | FAIL exit=1: Error: STANDALONE_TENANT_ID uses the development placeholder, which is allowed only in development on loopback | 3/4 зелёных; FAIL: tenant-isolation.test.ts | 46/5 | — | — |
| origin/codex/fix-tenant-rehome | d52ecf3 | OK (198 passed | 2 skipped (200)) | 4/5 зелёных; FAIL: tenant-isolation.test.ts | 46/5 | — | — |
### Интеграционные тесты (каждый файл отдельно, свежая БД)
| Ветка | Файл | Итог | Test Files | Tests | Первая ошибка |
| ------------------------------------------- | --------------------------------- | ---- | ------------ | -------------- | -------------------------------------------------- |
| origin/codex/bootstrap-platform-foundation | health.test.ts | OK | 1 passed (1) | 3 passed (3) | |
| origin/codex/bootstrap-platform-foundation | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | |
| origin/codex/bootstrap-platform-foundation | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | |
| origin/codex/bootstrap-platform-foundation | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees |
| origin/antigravity/fix-reject-device-shifts | health.test.ts | OK | 1 passed (1) | 3 passed (3) | |
| origin/antigravity/fix-reject-device-shifts | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | |
| origin/antigravity/fix-reject-device-shifts | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | |
| origin/antigravity/fix-reject-device-shifts | sync-rejection.test.ts | OK | 1 passed (1) | 2 passed (2) | |
| origin/antigravity/fix-reject-device-shifts | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees |
| origin/antigravity/fix-sync-c0-bootstrap | health.test.ts | OK | 1 passed (1) | 3 passed (3) | |
| origin/antigravity/fix-sync-c0-bootstrap | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | |
| origin/antigravity/fix-sync-c0-bootstrap | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | |
| origin/antigravity/fix-sync-c0-bootstrap | sync-bootstrap.test.ts | OK | 1 passed (1) | 2 passed (2) | |
| origin/antigravity/fix-sync-c0-bootstrap | sync-rejection.test.ts | OK | 1 passed (1) | 2 passed (2) | |
| origin/antigravity/fix-sync-c0-bootstrap | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees |
| origin/codex/fix-format-baseline | health.test.ts | OK | 1 passed (1) | 3 passed (3) | |
| origin/codex/fix-format-baseline | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | |
| origin/codex/fix-format-baseline | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | |
| origin/codex/fix-format-baseline | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees |
| origin/codex/fix-live-database | health.test.ts | OK | 1 passed (1) | 3 passed (3) | |
| origin/codex/fix-live-database | live-postgres-remediation.test.ts | OK | 1 passed (1) | 1 passed (1) | |
| origin/codex/fix-live-database | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | |
| origin/codex/fix-live-database | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | |
| origin/codex/fix-live-database | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees |
| origin/codex/fix-pilot-backups | health.test.ts | OK | 1 passed (1) | 3 passed (3) | |
| origin/codex/fix-pilot-backups | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | |
| origin/codex/fix-pilot-backups | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | |
| origin/codex/fix-pilot-backups | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees |
| origin/codex/fix-tenant-config | health.test.ts | OK | 1 passed (1) | 3 passed (3) | |
| origin/codex/fix-tenant-config | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | |
| origin/codex/fix-tenant-config | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | |
| origin/codex/fix-tenant-config | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees |
| origin/codex/fix-tenant-rehome | health.test.ts | OK | 1 passed (1) | 3 passed (3) | |
| origin/codex/fix-tenant-rehome | openapi-runtime.test.ts | OK | 1 passed (1) | 1 passed (1) | |
| origin/codex/fix-tenant-rehome | portal.test.ts | OK | 1 passed (1) | 12 passed (12) | |
| origin/codex/fix-tenant-rehome | rehome-tenant.test.ts | OK | 1 passed (1) | 1 passed (1) | |
| origin/codex/fix-tenant-rehome | tenant-isolation.test.ts | FAIL | 1 failed (1) | 1 passed (1) | error: permission denied for table staff_employees |
### Попарные слияния (`git merge-tree --write-tree`)
| Ветка A | Ветка B | Результат | Конфликтные файлы |
| ------------------------------------------- | ------------------------------------------- | --------- | ----------------- |
| origin/codex/bootstrap-platform-foundation | origin/antigravity/fix-reject-device-shifts | чисто | |
| origin/codex/bootstrap-platform-foundation | origin/antigravity/fix-sync-c0-bootstrap | чисто | |
| origin/codex/bootstrap-platform-foundation | origin/codex/fix-format-baseline | чисто | |
| origin/codex/bootstrap-platform-foundation | origin/codex/fix-live-database | чисто | |
| origin/codex/bootstrap-platform-foundation | origin/codex/fix-pilot-backups | чисто | |
| origin/codex/bootstrap-platform-foundation | origin/codex/fix-tenant-config | чисто | |
| origin/codex/bootstrap-platform-foundation | origin/codex/fix-tenant-rehome | чисто | |
| origin/antigravity/fix-reject-device-shifts | origin/antigravity/fix-sync-c0-bootstrap | чисто | |
| origin/antigravity/fix-reject-device-shifts | origin/codex/fix-format-baseline | чисто | |
| origin/antigravity/fix-reject-device-shifts | origin/codex/fix-live-database | чисто | |
| origin/antigravity/fix-reject-device-shifts | origin/codex/fix-pilot-backups | чисто | |
| origin/antigravity/fix-reject-device-shifts | origin/codex/fix-tenant-config | чисто | |
| origin/antigravity/fix-reject-device-shifts | origin/codex/fix-tenant-rehome | чисто | |
| origin/antigravity/fix-sync-c0-bootstrap | origin/codex/fix-format-baseline | чисто | |
| origin/antigravity/fix-sync-c0-bootstrap | origin/codex/fix-live-database | чисто | |
| origin/antigravity/fix-sync-c0-bootstrap | origin/codex/fix-pilot-backups | чисто | |
| origin/antigravity/fix-sync-c0-bootstrap | origin/codex/fix-tenant-config | чисто | |
| origin/antigravity/fix-sync-c0-bootstrap | origin/codex/fix-tenant-rehome | чисто | |
| origin/codex/fix-format-baseline | origin/codex/fix-live-database | чисто | |
| origin/codex/fix-format-baseline | origin/codex/fix-pilot-backups | чисто | |
| origin/codex/fix-format-baseline | origin/codex/fix-tenant-config | чисто | |
| origin/codex/fix-format-baseline | origin/codex/fix-tenant-rehome | чисто | |
| origin/codex/fix-live-database | origin/codex/fix-pilot-backups | чисто | |
| origin/codex/fix-live-database | origin/codex/fix-tenant-config | чисто | |
| origin/codex/fix-live-database | origin/codex/fix-tenant-rehome | чисто | |
| origin/codex/fix-pilot-backups | origin/codex/fix-tenant-config | чисто | |
| origin/codex/fix-pilot-backups | origin/codex/fix-tenant-rehome | чисто | |
| origin/codex/fix-tenant-config | origin/codex/fix-tenant-rehome | чисто | |
### Форматирование без поведения
**origin/codex/fix-format-baseline** (a05777c), merge-base f5ac179, изменено файлов: 19 — ТОЛЬКО ФОРМАТИРОВАНИЕ

View file

@ -310,3 +310,70 @@ echo "== повторный apply"
DATABASE_REHOME_URL="$URL" node scripts/rehome-tenant.mjs --apply --source $STUB --target $TARGET --actor 01M3ACT0R000000000000000AA --backup-evidence /tmp/ab/k18/evidence.json; echo "exit=$?"
psql -d $DB -At -f "$BK/scripts/restore-drill-report.sql" | diff -q - /tmp/ab/k18/after.txt && echo "повтор: БД не изменилась"
```
## 6. Ветки сдвинулись во время приёмки (17:02 и 17:07 NOVT)
После `git fetch` (~17:13 NOVT): `codex/fix-tenant-rehome` c73bb3b → **d52ecf3** (`fix: accept audit harness tenant
rehome CLI aliases`, 17:02:16 +0700), `codex/fix-pilot-backups` a005c5e → **b022885** (`ops: schedule home pilot
backup and retain verified PC copies`, 17:07:36 +0700). Приёмка повторена по всем 7 веткам:
[`round3-accept-f7d3c73-rerun.md`](round3-accept-f7d3c73-rerun.md) (стенд a6a1b5e, логи
`tests/e2e/evidence/accept/2026-09-26T10-14-42/`).
### 6.1 d52ecf3: что изменилось в интерфейсе
`git diff c73bb3b origin/codex/fix-tenant-rehome -- scripts/rehome-tenant.mjs`: добавлены `--from`/`--to` (синонимы
`--source`/`--target`), `--json` (принимается, вывод и так JSON), `DATABASE_ADMIN_URL` (первым, дальше
`DATABASE_REHOME_URL`, `DATABASE_MIGRATION_URL`); `result.mode ??= 'dry-run'` — **без флага теперь dry-run**, а не
ошибка; `--apply` по-прежнему требует `--actor` и `--backup-evidence`. Вывод остался многострочным
(`JSON.stringify(…, null, 2)`), счётчики — строки, в dry-run суммы журнала нет.
### 6.2 [PILOT-REHOME] на d52ecf3, как есть (accept-branch)
```
× … [PILOT-REHOME] --dry-run, перенос админом, сверка, повторный запуск отказывает 73ms
AssertionError: dry-run без JSON-отчёта: {
"mode": "dry-run",
"source": "01J00000000000000000000000",
"target": "01M2R6AC5652NPT3MG34DKN4ZP",
"tables": {
"staff_attendance_events": "2",
…
}
}
: expected null not to be null
❯ tests/e2e/60-pilot-rehome.e2e.ts:468:70
```
Интерфейс C6: «`--json`: последней строкой stdout — `{…}`»; продукт печатает JSON на нескольких строках.
### 6.3 Диагностика: что упадёт следующим (правки только в неотслеживаемой копии сценария в worktree приёмки, потом откатил)
`node scripts/test/run-e2e.mjs` в `wt-codex-fix-tenant-rehome` (d52ecf3), каждый шаг добавляет одну правку к предыдущему:
| Правка в копии сценария | Итог `[PILOT-REHOME]` |
| --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| парсер принимает весь stdout как JSON | `expected { staff_attendance_events: '2', …(26) } to deeply equal { staff_attendance_events: 2, …(26) }` |
| + счётчики через `Number()` (это **ошибка сценария**, исправлена в d477dde) | `expected 'undefined' to be '375888'` — в dry-run нет `ledger_amount_minor_sum` |
| + убрана проверка суммы в dry-run | `под заглушкой остались строки: expected [ 'staff_attendance_events', …(26) ] to deeply equal []` — вызов без флага (`--json`) теперь dry-run, exit 0, переноса нет |
После отката: `diff -q tests/e2e/60-pilot-rehome.e2e.ts /workspace/krona-staff/tests/e2e/60-pilot-rehome.e2e.ts && echo restored` → `restored`.
### 6.4 b022885 (K18)
```
$ git worktree add --detach …/diag-pb2 origin/codex/fix-pilot-backups # b022885
$ bash scripts/test-backup.sh | tail -1
backup tests passed: syntax, CMS round-trip, pg_dump/OpenSSL/scp failures, no plaintext dump on disk
test-backup rc=0
$ bash scripts/test-backup-pull.sh | tail -1
backup pull tests passed: CMS+checksum, idempotence, stale/mismatch rejection, path validation, scp failure
test-backup-pull rc=0
```
Новое: ротация копий на ПК в `pull-pilot-backups.sh` (`BACKUP_LOCAL_RETENTION_DAYS`, по умолчанию 90; удаляет
только пары с корректным sha256, симлинки и посторонние файлы оставляет; в `test-backup-pull.sh` есть сценарий
`local-retention`), `deploy/pilot/krona-staff-backup-user.service` (пользовательский systemd-сервис),
`scripts/run-pilot-backup-pull.ps1` (задача Windows), `deploy/pilot/backup.home-server.example`. Ротации на сервере
нет (в `docs/BACKUP-RESTORE.md`: «server-side retention policy» — условие включения расписания). В
`run-pilot-backup-pull.ps1` и `backup.home-server.example` зашиты личные пути (`C:\Users\trush\…`,
`/home/ochenstarik/…`). Systemd-юнит, задача Windows и ротация на реальном диске — не проверено.