From 75f76430d4aa563c8ec4a6ecff9c96445cb208ed Mon Sep 17 00:00:00 2001 From: grok Date: Sat, 26 Sep 2026 17:20:23 +0700 Subject: [PATCH] =?UTF-8?q?docs(e2e):=20=D0=B4=D0=BE=D0=BA=D0=B0=D0=B7?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D1=81=D1=82=D0=B2=D0=B0=20?= =?UTF-8?q?=E2=80=94=20=D0=BF=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=BF=D1=80=D0=B8=D1=91=D0=BC=D0=BA=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=81=D0=BB=D0=B5=20d52ecf3=20=D0=B8=20b022885?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Почему: пока шёл разбор, 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. --- .../round3-accept-f7d3c73-rerun.md | 95 +++++++++++++++++++ .../report-evidence/round3-k18-and-rehome.md | 67 +++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 tests/e2e/report-evidence/round3-accept-f7d3c73-rerun.md diff --git a/tests/e2e/report-evidence/round3-accept-f7d3c73-rerun.md b/tests/e2e/report-evidence/round3-accept-f7d3c73-rerun.md new file mode 100644 index 0000000..e8c4777 --- /dev/null +++ b/tests/e2e/report-evidence/round3-accept-f7d3c73-rerun.md @@ -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 — ТОЛЬКО ФОРМАТИРОВАНИЕ diff --git a/tests/e2e/report-evidence/round3-k18-and-rehome.md b/tests/e2e/report-evidence/round3-k18-and-rehome.md index 7764c65..03a076c 100644 --- a/tests/e2e/report-evidence/round3-k18-and-rehome.md +++ b/tests/e2e/report-evidence/round3-k18-and-rehome.md @@ -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 и ротация на реальном диске — не проверено.