docs(e2e): REPORT/NOTES — d52ecf3, b022885 и исправление сценария

Почему: таблица приёмки и разбор C6 должны соответствовать текущим SHA
веток Codex, а владелец должен видеть, какие расхождения с C6 остались
после d52ecf3 и какая часть красного была ошибкой сценария (типы счётчиков,
d477dde), а не продукта.

- REPORT: таблица по повторному прогону (b022885, d52ecf3), разбор d52ecf3.
- NOTES C6: что закрыл d52ecf3; открыто — многострочный JSON, сумма журнала
  в dry-run, dry-run по умолчанию и обязательные --apply/--actor/--backup-evidence.
- NOTES разд. 8: K18 на b022885 — ротация на ПК есть, на сервере нет,
  личные пути в новых файлах.
This commit is contained in:
grok 2026-09-26 17:20:23 +07:00
parent 75f76430d4
commit bf80b5040e
2 changed files with 31 additions and 11 deletions

View file

@ -93,7 +93,8 @@ ID в названиях тестов — двойные «владелец/мо
- Запуск: `DATABASE_ADMIN_URL=<админ БД> node scripts/rehome-tenant.mjs --from 01J00000000000000000000000 --to 01M2R6AC5652NPT3MG34DKN4ZP [--dry-run] [--json]`. - Запуск: `DATABASE_ADMIN_URL=<админ БД> node scripts/rehome-tenant.mjs --from 01J00000000000000000000000 --to 01M2R6AC5652NPT3MG34DKN4ZP [--dry-run] [--json]`.
Стенд передаёт `DATABASE_ADMIN_URL` суперпользователя в БД стенда (`E2E_DB_ADMIN_URL` или Стенд передаёт `DATABASE_ADMIN_URL` суперпользователя в БД стенда (`E2E_DB_ADMIN_URL` или
`E2E_PG_ADMIN_URL` с именем БД). `E2E_PG_ADMIN_URL` с именем БД).
- `--json`: последней строкой stdout — `{"tables":{"<таблица>":<строк у --from>},"ledger_amount_minor_sum":<число или строка>}`. - `--json`: последней строкой stdout — `{"tables":{"<таблица>":<строк у --from>},"ledger_amount_minor_sum":<число или строка>}`
(счётчики — число или строка с числом).
Таблицы с нулём можно не печатать. Таблицы с нулём можно не печатать.
- `--dry-run`: exit 0, те же числа, в БД ничего не меняется. - `--dry-run`: exit 0, те же числа, в БД ничего не меняется.
- Перенос: exit 0; под `--from` 0 строк во **всех** таблицах с `tenant_id` (список из - Перенос: exit 0; под `--from` 0 строк во **всех** таблицах с `tenant_id` (список из
@ -131,6 +132,12 @@ ID в названиях тестов — двойные «владелец/мо
| `ledger_amount_minor_sum` в dry-run и apply | в dry-run суммы нет; в apply `payrollLedger: [{currency, amountMinor}]` | с адаптером: `expected 'undefined' to be '328228'` | | `ledger_amount_minor_sum` в dry-run и apply | в dry-run суммы нет; в apply `payrollLedger: [{currency, amountMinor}]` | с адаптером: `expected 'undefined' to be '328228'` |
| `tables` — строки у `--from` | в apply `tables` — у `--to` после переноса (`staff_audit_log` +1) | не проверяется | | `tables` — строки у `--from` | в apply `tables` — у `--to` после переноса (`staff_audit_log` +1) | не проверяется |
**d52ecf3 (17:02)** закрыл строки 1, 4, 5 таблицы: `--from/--to`, `--json`, `DATABASE_ADMIN_URL` принимаются. Без
флага теперь **dry-run** (по C6 — перенос), так что запуск сценария без `--apply` не переносит данные. Открытыми
остаются многострочный JSON (сценарий: `dry-run без JSON-отчёта`), сумма журнала в dry-run и обязательные
`--apply --actor --backup-evidence` (разд. 6.3 в `report-evidence/round3-k18-and-rehome.md`). Типы счётчиков
расходились из-за ошибки сценария; она исправлена в d477dde, сравнение идёт через `Number()`.
Какой интерфейс оставить, решает владелец. Варианты: (а) Codex добавляет в скрипт C6-совместимые Какой интерфейс оставить, решает владелец. Варианты: (а) Codex добавляет в скрипт C6-совместимые
`--from/--to/--json`, `DATABASE_ADMIN_URL`, сумму журнала в dry-run, а `--actor`/`--backup-evidence` `--from/--to/--json`, `DATABASE_ADMIN_URL`, сумму журнала в dry-run, а `--actor`/`--backup-evidence`
берёт из переменных окружения (например, `REHOME_ACTOR_ID`, `REHOME_BACKUP_EVIDENCE`); (б) владелец утверждает берёт из переменных окружения (например, `REHOME_ACTOR_ID`, `REHOME_BACKUP_EVIDENCE`); (б) владелец утверждает
@ -283,13 +290,13 @@ does not exist` в `beforeAll` (`Tests 2 skipped`). На `6c5bf36`/`b283736` и
`tests/unit/sync.test.ts:556:18` → `STANDALONE_TENANT_ID uses the development placeholder…` `tests/unit/sync.test.ts:556:18` → `STANDALONE_TENANT_ID uses the development placeholder…`
(строка 553 — заглушка, 563 — `NODE_ENV: 'test'`). Вывод владельца подтверждён; как исправить — (строка 553 — заглушка, 563 — `NODE_ENV: 'test'`). Вывод владельца подтверждён; как исправить —
ACCEPTANCE-3 (разрешить заглушку при `NODE_ENV === 'test'`). ACCEPTANCE-3 (разрешить заглушку при `NODE_ENV === 'test'`).
- **codex/fix-tenant-rehome (c73bb3b)**: по существу перенос верный (копия после восстановления: счётчики, - **codex/fix-tenant-rehome (c73bb3b → d52ecf3)**: по существу перенос верный (копия после восстановления: счётчики,
ledger, FK, аудит `tenant.rehomed`, изоляция, отказ повтора). `[PILOT-REHOME]` красный из-за интерфейса — ledger, FK, аудит `tenant.rehomed`, изоляция, отказ повтора). `[PILOT-REHOME]` красный из-за интерфейса —
таблица различий в C6. Интеграционный тест `rehome-tenant.test.ts` зелёный только с таблица различий в C6. Интеграционный тест `rehome-tenant.test.ts` зелёный только с
`DATABASE_REHOME_TEST_URL`/`DATABASE_REHOME_TEST_CONFIRM` — в `npm run check` и CI он всегда `skipped`. `DATABASE_REHOME_TEST_URL`/`DATABASE_REHOME_TEST_CONFIRM` — в `npm run check` и CI он всегда `skipped`.
Тест требует подключения суперпользователя (`rehome-tenant.test.ts:92-93`) и содержит один `it` — Тест требует подключения суперпользователя (`rehome-tenant.test.ts:92-93`) и содержит один `it` —
запуск скрипта от не-суперпользователя (как `krona_migrator` в пилоте) не покрыт. запуск скрипта от не-суперпользователя (как `krona_migrator` в пилоте) не покрыт.
- **codex/fix-pilot-backups (a005c5e, K18)**: `test-backup.sh`/`test-backup-pull.sh` проходят (моки), но в - **codex/fix-pilot-backups (a005c5e → b022885, K18)**: `test-backup.sh`/`test-backup-pull.sh` проходят (моки), но в
`npm run check` и CI не входят. Учебное восстановление без Docker прошло (шим docker → pg_dump PG17, `npm run check` и CI не входят. Учебное восстановление без Docker прошло (шим docker → pg_dump PG17,
CMS, sha256, pg_restore, `restore-drill-report.sql` совпал). Замечания: CMS, sha256, pg_restore, `restore-drill-report.sql` совпал). Замечания:
- `backup.sh` снимает только `pg_dump -Fc` одной БД: ролей (globals) в копии нет. В кластере без ролей - `backup.sh` снимает только `pg_dump -Fc` одной БД: ролей (globals) в копии нет. В кластере без ролей
@ -300,7 +307,9 @@ does not exist` в `beforeAll` (`Tests 2 skipped`). На `6c5bf36`/`b283736` и
после переноса «source/target» поменяются местами — стоит параметризовать (`psql -v`). после переноса «source/target» поменяются местами — стоит параметризовать (`psql -v`).
- В `docs/BACKUP-RESTORE.md` личный путь `C:/Users/trush/Documents/KronaStaffBackups/` — в репозитории - В `docs/BACKUP-RESTORE.md` личный путь `C:/Users/trush/Documents/KronaStaffBackups/` — в репозитории
лучше указать роль или место без имени пользователя. лучше указать роль или место без имени пользователя.
- Ротации копий нет (сказано в документе); отказ таймера/pull должен кто-то мониторить — это пока только текст. - b022885: ротация копий на ПК есть (`BACKUP_LOCAL_RETENTION_DAYS`, 90 дней; в `test-backup-pull.sh` есть проверка),
ротации на сервере нет. В новых `scripts/run-pilot-backup-pull.ps1` и `deploy/pilot/backup.home-server.example`
тоже зашиты личные пути. Контроль отказов таймера и задачи pull пока описан только в документе.
- Предложение (моя зона, после слияния): добавить в CI `bash scripts/test-backup.sh`, - Предложение (моя зона, после слияния): добавить в CI `bash scripts/test-backup.sh`,
`bash scripts/test-backup-pull.sh` и запуск `rehome-tenant.test.ts` / `live-postgres-remediation.test.ts` `bash scripts/test-backup-pull.sh` и запуск `rehome-tenant.test.ts` / `live-postgres-remediation.test.ts`
на одноразовых БД — так же, как это делает `accept-branch`. на одноразовых БД — так же, как это делает `accept-branch`.

View file

@ -132,15 +132,18 @@ merge `grok/e2e-harness`. Вывод — [`round3-combined-merge.md`](report-evi
([`report-evidence/round3-pilot-rehome.txt`](report-evidence/round3-pilot-rehome.txt)). ([`report-evidence/round3-pilot-rehome.txt`](report-evidence/round3-pilot-rehome.txt)).
- Контракт, который проверяет сценарий, — `NOTES-FOR-EXECUTORS.md`, C6. - Контракт, который проверяет сценарий, — `NOTES-FOR-EXECUTORS.md`, C6.
### Круг 3б: основа `f7d3c73` (ACCEPTANCE-3), 16:59 NOVT ### Круг 3б: основа `f7d3c73` (ACCEPTANCE-3), 16:59 и 17:14 NOVT
Храповик **не тронут**: после `git fetch` `git merge-base --is-ancestor origin/<ветка> Храповик **не тронут**: после `git fetch` `git merge-base --is-ancestor origin/<ветка>
origin/codex/bootstrap-platform-foundation` — `not merged` для grok/e2e-harness, fix-live-database, origin/codex/bootstrap-platform-foundation` — `not merged` для grok/e2e-harness, fix-live-database,
fix-format-baseline, fix-reject-device-shifts, fix-sync-c0-bootstrap, fix-tenant-config, fix-format-baseline, fix-reject-device-shifts, fix-sync-c0-bootstrap, fix-tenant-config,
fix-tenant-rehome, fix-pilot-backups. fix-tenant-rehome, fix-pilot-backups.
Команда: `node scripts/test/accept-branch.mjs <7 веток, не являющихся предками основы>`, стенд `18f944e`. Команда: `node scripts/test/accept-branch.mjs <7 веток, не являющихся предками основы>`. Первый прогон (16:59, стенд
Полный вывод — [`report-evidence/round3-accept-f7d3c73.md`](report-evidence/round3-accept-f7d3c73.md). `18f944e`) — [`round3-accept-f7d3c73.md`](report-evidence/round3-accept-f7d3c73.md). Пока шёл разбор, Codex
запушил `fix-tenant-rehome` d52ecf3 (17:02) и `fix-pilot-backups` b022885 (17:07), поэтому все 7 веток прогнаны
повторно (17:14, стенд `a6a1b5e`) — [`round3-accept-f7d3c73-rerun.md`](report-evidence/round3-accept-f7d3c73-rerun.md).
В таблице — повторный прогон; на первом прогоне по c73bb3b и a005c5e результаты те же.
| Ветка | SHA | check | integration | e2e red/green | Стало зелёным | Стало красным | | Ветка | SHA | check | integration | e2e red/green | Стало зелёным | Стало красным |
| ------------------------------------ | ------- | ------------------------------------------------------------------------ | ----------------------------------------------------- | ------------- | ------------------------------- | ------------- | | ------------------------------------ | ------- | ------------------------------------------------------------------------ | ----------------------------------------------------- | ------------- | ------------------------------- | ------------- |
@ -149,9 +152,9 @@ fix-tenant-rehome, fix-pilot-backups.
| antigravity/fix-sync-c0-bootstrap | 24cc18d | OK | 5/6, FAIL tenant-isolation | 43/8 | K13/SYNC-A, K13/SYNC-B, SYNC-C0 | — | | antigravity/fix-sync-c0-bootstrap | 24cc18d | OK | 5/6, FAIL tenant-isolation | 43/8 | K13/SYNC-A, K13/SYNC-B, SYNC-C0 | — |
| codex/fix-format-baseline | a05777c | OK | 3/4, FAIL tenant-isolation | 46/5 | — | — | | codex/fix-format-baseline | a05777c | OK | 3/4, FAIL tenant-isolation | 46/5 | — | — |
| codex/fix-live-database | 1573860 | OK | 4/5, FAIL tenant-isolation | 44/7 | K3/N2, K4/N1 | — | | codex/fix-live-database | 1573860 | OK | 4/5, FAIL tenant-isolation | 44/7 | K3/N2, K4/N1 | — |
| codex/fix-pilot-backups | a005c5e | OK | 3/4, FAIL tenant-isolation | 46/5 | — | — | | codex/fix-pilot-backups | b022885 | OK | 3/4, FAIL tenant-isolation | 46/5 | — | — |
| codex/fix-tenant-config | 535052e | **FAIL** `Error: STANDALONE_TENANT_ID uses the development placeholder…` | 3/4, FAIL tenant-isolation | 46/5 | — | — | | codex/fix-tenant-config | 535052e | **FAIL** `Error: STANDALONE_TENANT_ID uses the development placeholder…` | 3/4, FAIL tenant-isolation | 46/5 | — | — |
| codex/fix-tenant-rehome | c73bb3b | OK | 4/5 (rehome-tenant.test.ts OK), FAIL tenant-isolation | 46/5 | — | — | | codex/fix-tenant-rehome | d52ecf3 | OK | 4/5 (rehome-tenant.test.ts OK), FAIL tenant-isolation | 46/5 | — | — |
- `git merge-tree`: 28 пар (7 с основой + 21 между собой) — **все чисто**. - `git merge-tree`: 28 пар (7 с основой + 21 между собой) — **все чисто**.
- «Форматирование без поведения» `a05777c`: `изменено файлов: 19 — ТОЛЬКО ФОРМАТИРОВАНИЕ`. - «Форматирование без поведения» `a05777c`: `изменено файлов: 19 — ТОЛЬКО ФОРМАТИРОВАНИЕ`.
@ -180,10 +183,18 @@ placeholder, which is allowed only in development on loopback`, `❯ tests/unit/
вариант 1 (только перевод флагов и формата) — `expected 'undefined' to be '328228'`: **в dry-run нет суммы вариант 1 (только перевод флагов и формата) — `expected 'undefined' to be '328228'`: **в dry-run нет суммы
журнала**; вариант 2 (сумму досчитывает адаптер) — `✓ [PILOT-REHOME]`. Других расхождений сценарий не нашёл. журнала**; вариант 2 (сумму досчитывает адаптер) — `✓ [PILOT-REHOME]`. Других расхождений сценарий не нашёл.
Ошибок в самом сценарии не нашёл, поэтому он не менялся. На **d52ecf3** (17:02) Codex добавил синонимы `--from/--to`, `--json`, `DATABASE_ADMIN_URL` и сделал dry-run режимом
по умолчанию. `[PILOT-REHOME]` всё равно красный: `dry-run без JSON-отчёта: { "mode": "dry-run", … } : expected null
not to be null` — JSON печатается на нескольких строках, а C6 требует его последней строкой. Если снимать
расхождения по одному в копии сценария (не в коммите, [`round3-k18-and-rehome.md`](report-evidence/round3-k18-and-rehome.md), разд. 6.3), дальше
падают: счётчики-строки (`'2'` vs `2`) → **это ошибка сценария**, исправлена в `d477dde` (сравнение через `Number()`);
`expected 'undefined' to be '375888'` — в dry-run нет суммы журнала; `под заглушкой остались строки` — вызов без
флага теперь dry-run, а по C6 это перенос, для которого продукт требует `--apply --actor --backup-evidence`.
Других изменений в сценарии нет.
**codex/fix-pilot-backups (K18).** `bash scripts/test-backup.sh` и `bash scripts/test-backup-pull.sh` — **codex/fix-pilot-backups (K18).** `bash scripts/test-backup.sh` и `bash scripts/test-backup-pull.sh` —
оба `passed`, exit 0 (моки docker/ssh/scp). В `npm run check` и CI они не входят. Учебное восстановление без оба `passed`, exit 0 (моки docker/ssh/scp) и на a005c5e, и на b022885 (b022885 добавил ротацию копий на ПК, 90 дней,
и пользовательский systemd-сервис; ротации на сервере нет). В `npm run check` и CI они не входят. Учебное восстановление без
Docker (шим `docker compose exec` → локальный `pg_dump` PG17): `backup.sh` exit 0, на сервере 0 незашифрованных Docker (шим `docker compose exec` → локальный `pg_dump` PG17): `backup.sh` exit 0, на сервере 0 незашифрованных
файлов, `sha256sum -c` OK, расшифровка ключом вне сервера, `pg_restore --exit-on-error` exit 0, файлов, `sha256sum -c` OK, расшифровка ключом вне сервера, `pg_restore --exit-on-error` exit 0,
`restore-drill-report.sql` на источнике и копии — `идентичны` (79 строк, `RLS|27|t`), isolation: `restore-drill-report.sql` на источнике и копии — `идентичны` (79 строк, `RLS|27|t`), isolation: