docs(e2e): REPORT и NOTES — круг 3

Почему: TASK-GROK-3 — отчёт с командами и фактическим выводом и новые находки для исполнителей.
REPORT: раздел «Круг 3» (ожидания владельца на SHA из задания — все шесть совпали; проверка
форматирования; все открытые ветки после fetch 16:16 NOVT — конфликтов нет; локальная сборка
«после слияния» — храповик просит убрать ровно K3/N2, K4/N1, K13/SYNC-A, K13/SYNC-B, SYNC-C0;
PILOT-REHOME), новые числа ci-local (46 red / 10 green), «Не проверено».
NOTES: контракт C6 для scripts/rehome-tenant.mjs (с ограничениями схемы: RLS журнала, составные
FK, app.user_id в политиках INSERT) и раздел 7: двойное закрытие пула в sync-bootstrap.test.ts,
неописанный предохранитель live-postgres-remediation.test.ts, N5 в основе, FK outbox_id без tenant_id.
This commit is contained in:
grok 2026-09-26 16:25:47 +07:00
parent 10ba0b440f
commit 986843d8d4
2 changed files with 181 additions and 4 deletions

View file

@ -86,6 +86,36 @@ ID в названиях тестов — двойные «владелец/мо
неизвестный ключ → 400. `GET .../pay-assignment` возвращает их в `params`. неизвестный ключ → 400. `GET .../pay-assignment` возвращает их в `params`.
- Старые поля `rate_minor`/`percent_bp`/`guarantee_minor` можно оставить как сокращения. - Старые поля `rate_minor`/`percent_bp`/`guarantee_minor` можно оставить как сокращения.
### C6. Перенос арендатора пилота (PILOT-REHOME, TASK-CODEX-2 п.2.2)
Что проверяет `tests/e2e/60-pilot-rehome.e2e.ts` (`[PILOT-REHOME]`):
- Запуск: `DATABASE_ADMIN_URL=<админ БД> node scripts/rehome-tenant.mjs --from 01J00000000000000000000000 --to 01M2R6AC5652NPT3MG34DKN4ZP [--dry-run] [--json]`.
Стенд передаёт `DATABASE_ADMIN_URL` суперпользователя в БД стенда (`E2E_DB_ADMIN_URL` или
`E2E_PG_ADMIN_URL` с именем БД).
- `--json`: последней строкой stdout — `{"tables":{"<таблица>":<строк у --from>},"ledger_amount_minor_sum":<число или строка>}`.
Таблицы с нулём можно не печатать.
- `--dry-run`: exit 0, те же числа, в БД ничего не меняется.
- Перенос: exit 0; под `--from` 0 строк во **всех** таблицах с `tenant_id` (список из
`information_schema.columns`, не вручную); у `--to` те же счётчики и та же
`SUM(amount_minor)` в `staff_payroll_ledger`; другие арендаторы не тронуты.
- В `staff_audit_log` у нового арендатора появляется запись с `action`, содержащим `rehome`
(например, `tenant.rehomed`, старый tenant — в `new_values`).
- После переноса `krona_staff_app` видит тех же сотрудников (те же `id`) под новым tenant и никого
под старым; `UPDATE staff_payroll_ledger` ролью приложения по-прежнему отклоняется.
- Повторный запуск (под `--from` пусто / у `--to` уже есть данные) — exit ≠ 0, ничего не меняет.
Что нужно учесть (видно по схеме, `pg_policy`/`pg_constraint` на PG17):
- У `staff_payroll_ledger` нет политики UPDATE/DELETE, у приложения нет права UPDATE, FORCE RLS
действует и на владельца: `krona_migrator` строки журнала не перенесёт. Нужна роль с обходом RLS
(суперпользователь/BYPASSRLS) — поэтому `DATABASE_ADMIN_URL`.
- Внешние ключи составные `(tenant_id, …)` и не DEFERRABLE: переносить родителя раньше детей
нельзя — нужен порядок, отложенные проверки или `session_replication_role = replica` в одной транзакции.
- Политики INSERT `staff_audit_log`, `staff_payroll_ledger`, `staff_attendance_events`,
`staff_timesheet_entries` требуют `actor_id/created_by/updated_by = current_setting('app.user_id')` —
для записи аудита без обхода RLS выставить `app.user_id`.
## 2. Дефекты продукта, найденные сценариями (все красные сейчас) ## 2. Дефекты продукта, найденные сценариями (все красные сейчас)
Команда и фактический вывод — `tests/e2e/evidence/e2e-run.txt`; таблица — `tests/e2e/REPORT.md`. Команда и фактический вывод — `tests/e2e/evidence/e2e-run.txt`; таблица — `tests/e2e/REPORT.md`.
@ -189,3 +219,35 @@ CONFLICT DO NOTHING` со своим `runId` → строки/UPDATE по нес
- Ни одна ветка не влита в основную (f5ac179), поэтому ID из `known-defects.json` не удалены. - Ни одна ветка не влита в основную (f5ac179), поэтому ID из `known-defects.json` не удалены.
- Суммы в тестах кратны рублю: расчёт округляет строку до `rounding_unit_minor` - Суммы в тестах кратны рублю: расчёт округляет строку до `rounding_unit_minor`
(по умолчанию 100 коп.). Если округление должно быть другим — это решение продукта, не теста. (по умолчанию 100 коп.). Если округление должно быть другим — это решение продукта, не теста.
## 7. Круг 3 (TASK-GROK-3, 2026-09-26)
Команды и полный вывод — `tests/e2e/REPORT.md` («Круг 3») и `tests/e2e/report-evidence/round3-*.md`.
Приёмка одной командой: `node scripts/test/accept-branch.mjs <ветка>…` (нужен `E2E_PG_ADMIN_URL`
или готовые роли в `E2E_MIGRATOR_URL` + `E2E_APP_URL`).
- **Antigravity, `sync-bootstrap.test.ts` (8baad55)**: `Error: Called end on pool more than once` при
`Tests 2 passed`. Причина: `app.close()` в тесте вызывает хук `onClose` → `database.close()`
(`src/app.ts:148`), затем `afterAll` закрывает тот же `Database` ещё раз. На текущей голове
`24cc18d` файл зелёный (`1 passed (1) | 2 passed (2)`).
- **Antigravity, `sync-rejection.test.ts` (1df2019)**: `column "created_by" of relation "staff_employees"
does not exist` в `beforeAll` (`Tests 2 skipped`). На `6c5bf36`/`b283736` исправлено.
- **Конфликты**: на прежних головах `1df2019 × 8baad55` и `8baad55 × 513cdff` конфликтовали в
`src/domain/sync/service.ts`; на текущих головах (fetch 16:16 NOVT) конфликтов нет ни в одной из 55 пар.
- **Codex, `codex/fix-format-baseline`**: на `513cdff` в `service.ts`/`sync.test.ts` было 232/130 строк сверх
prettier, все есть в `antigravity/fix-reject-device-shifts`; на `a05777c` — только форматирование (19 файлов).
- **Codex, `live-postgres-remediation.test.ts`**: выполняется только при `DATABASE_TEST_ISOLATED=true`,
`DATABASE_TEST_GUARD_TOKEN`, таблице `krona_staff_test_guard` с этим маркером и имени БД
`krona_staff_audit_*`. Соглашение нигде, кроме самого теста, не описано, и ни CI, ни
`scripts/test/*` его не выполняют — в `npm run check` файл всегда `skipped`. `accept-branch` ставит
предохранитель в одноразовой БД: `1 passed (1)`. Предложение: описать соглашение в README/AGENTS
и после слияния включить его в CI (могу сделать в своей зоне, `.forgejo/workflows/ci.yml`).
- **N5 до сих пор в основе**: `tenant-isolation.test.ts` красный на `b0243d5` и всех ветках от
`f5ac179` (`permission denied for table staff_employees`); исправление — в `grok/e2e-harness`.
Локальная сборка основа + fix-live-database + fix-sync-c0-bootstrap + grok/e2e-harness:
интеграционные 7/7, храповик просит убрать ровно K3/N2, K4/N1, K13/SYNC-A, K13/SYNC-B, SYNC-C0.
- **Схема (низкий приоритет)**: `staff_notification_deliveries.outbox_id → staff_outbox(id)` — единственный
внешний ключ без `tenant_id`; все остальные составные `(tenant_id, …)`. База не мешает доставке
ссылаться на событие outbox другого арендатора (RLS фильтрует чтение, но не ссылку). Предложение:
`UNIQUE (tenant_id, id)` на `staff_outbox` и FK `(tenant_id, outbox_id)`.
- **PILOT-REHOME**: скрипта нет → `[PILOT-REHOME]` красный; контракт — C6.

View file

@ -31,6 +31,107 @@ SUPERUSER, все токены и пароли случайные (`crypto.rando
| §4 | Приёмка `antigravity/fix-reject-device-shifts`, `codex/fix-format-baseline`, `codex/fix-live-database` — таблицы ниже | | §4 | Приёмка `antigravity/fix-reject-device-shifts`, `codex/fix-format-baseline`, `codex/fix-live-database` — таблицы ниже |
| — | Синтетическая ставка 123,45 → 123,00 ₽/ч: расчёт округляет строку до рубля (`rounding_unit_minor`), тест не должен зависеть от округления (выяснилось на fix-live-database) | | — | Синтетическая ставка 123,45 → 123,00 ₽/ч: расчёт округляет строку до рубля (`rounding_unit_minor`), тест не должен зависеть от округления (выяснилось на fix-live-database) |
## Круг 3 (TASK-GROK-3)
Ветка продолжена поверх `ba59a48` без переписывания истории (без rebase на `b0243d5`, без force-push).
| Пункт | Что сделано |
| ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| п.1 | `scripts/test/accept-branch.mjs <ветка>…`: worktree на ветку в `../krona-staff-acceptance/` + оверлей текущего стенда (`tests/e2e/**`, `scripts/test/**`), `npm run check` без переменных БД, **каждый** `tests/integration/*.test.ts` отдельно на свежей мигрированной БД PG17 (красный — по строке `Test Files`, ловит ошибки `beforeAll/afterAll`; файл, где всё пропущено, — отдельный вердикт `SKIP`), e2e и разница с основой по ID, попарный `git merge-tree --write-tree` (все ветки между собой и с основой), итог в markdown. Логи — `tests/e2e/evidence/accept/<время>/` (пароли в URL заменены на `***`) |
| п.1 | Готовые роли: если заданы `E2E_MIGRATOR_URL` и `E2E_APP_URL`, `global-setup` и `accept-branch` роли не создают и пароли не меняют (БД — из URL, сброс откатом всех миграций). По умолчанию как раньше. `provision-pg.mjs --roles keep` пересоздаёт только БД: `accept-branch` создаёт роли один раз на прогон |
| п.1 | Предохранитель изолированной БД для `live-postgres-remediation.test.ts` (Codex): в admin-режиме интеграционная БД одноразовая (`krona_staff_audit_acc_it`), `krona_staff_test_guard` со случайным маркером, `DATABASE_TEST_ISOLATED=true` — без этого файл пропускается целиком |
| п.2 | «Форматирование без поведения» (для веток с `format` в имени и `--format-check <ветка>`): версия из merge-base → prettier (конфиг основы, API из `node_modules`) → сравнение с веткой; для лишних строк — сколько из них есть в других переданных ветках |
| п.3 | Прогон по всем открытым `codex/*`, `antigravity/*` — ниже |
| п.4 | Храповик **не тронут**: `origin/codex/bootstrap-platform-foundation` = `b0243d5` (только docs поверх `f5ac179`); `git merge-base --is-ancestor origin/<ветка> origin/codex/bootstrap-platform-foundation` — `NOT merged` для fix-live-database, fix-reject-device-shifts, fix-sync-c0-bootstrap, fix-format-baseline |
| п.5 | `[PILOT-REHOME-SEED]` (зелёный) и `[PILOT-REHOME]` (красный, в `known-defects.json`) — `tests/e2e/60-pilot-rehome.e2e.ts` |
| — | `run-e2e.mjs`: проверка секретов в `evidence/` больше не падает `EISDIR` на подкаталоге `accept/` |
### п.1: ожидания владельца на SHA из задания
Команда: `node scripts/test/accept-branch.mjs 1df2019 antigravity/fix-sync-c0-bootstrap codex/fix-format-baseline`
(16:04 NOVT; `1df2019` передан SHA, потому что ветка Antigravity к этому времени была перезаписана
на `6c5bf36`). Полный вывод — [`report-evidence/round3-accept-owner-shas.md`](report-evidence/round3-accept-owner-shas.md).
| Ожидание владельца | Фактический вывод |
| ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| sync-rejection.test.ts на 1df2019 FAIL `column "created_by" … does not exist` | `FAIL \| 1 failed (1) \| 2 skipped (2) \| error: column "created_by" of relation "staff_employees" does not exist` |
| sync-bootstrap.test.ts на 8baad55 FAIL `Called end on pool more than once` при `Tests 2 passed` | `FAIL \| 1 failed (1) \| 2 passed (2) \| Error: Called end on pool more than once` |
| SYNC-C0 зелёный на 8baad55 | e2e «стало зелёным»: `SYNC-C0` |
| AG reject + AG c0 — конфликт в src/domain/sync/service.ts | `1df2019 \| origin/antigravity/fix-sync-c0-bootstrap \| КОНФЛИКТ \| src/domain/sync/service.ts` |
| Codex format + AG c0 — конфликт | `origin/antigravity/fix-sync-c0-bootstrap \| origin/codex/fix-format-baseline \| КОНФЛИКТ \| src/domain/sync/service.ts` |
| Codex format + AG reject — чисто | `1df2019 \| origin/codex/fix-format-baseline \| чисто` |
Все шесть совпали. На `6c5bf36` (первый прогон по именам веток,
[`round3-accept-owner-branches-first.md`](report-evidence/round3-accept-owner-branches-first.md))
`sync-rejection.test.ts` уже зелёный (`1 passed (1) | 2 passed (2)`).
### п.2: форматирование без поведения
Команда: `node scripts/test/accept-branch.mjs --format-check tmp/prettier-only-f5ac179 --format-check codex/fix-format-baseline`
([`round3-format-proof.md`](report-evidence/round3-format-proof.md)).
`tmp/prettier-only-f5ac179` (`c552d38`) — локальная синтетическая ветка: `prettier --write .` поверх
`f5ac179`, 24 файла; **не запушена**.
| Ветка | Результат |
| ---------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `tmp/prettier-only-f5ac179` (c552d38) | изменено файлов: 24 — ТОЛЬКО ФОРМАТИРОВАНИЕ |
| `codex/fix-format-baseline` (513cdff, прежняя голова) | ЕСТЬ ИЗМЕНЕНИЯ СВЕРХ PRETTIER: `src/domain/sync/service.ts` 232 строки, `tests/unit/sync.test.ts` 130 строк; в `antigravity/fix-reject-device-shifts` есть 232/232 и 130/130 этих строк |
| `codex/fix-format-baseline` (a05777c, текущая, 16:09 NOVT) | изменено файлов: 19 — ТОЛЬКО ФОРМАТИРОВАНИЕ |
### п.3: все открытые ветки
Команда: `node scripts/test/accept-branch.mjs <все origin/codex/* и origin/antigravity/* кроме основы>`
после `git fetch` в 16:16 NOVT, стенд `6f408bc`. Полный вывод (интеграционные тесты по файлам, 55 пар
merge-tree) — [`report-evidence/round3-accept-all-open.md`](report-evidence/round3-accept-all-open.md).
Основа `b0243d5`: check OK, integration 3/4 (FAIL tenant-isolation), e2e 46 red / 5 green.
| Ветка | SHA | Влита в основу | check | integration | e2e red/green | Стало зелёным | Стало красным |
| ------------------------------------ | ------- | -------------------------- | ----- | --------------------------------------------------------- | ------------- | ------------------------------- | -------------------------------------------------------------------------- |
| antigravity/fix-reject-device-shifts | b283736 | нет (+1) | OK | 4/5, FAIL tenant-isolation | 44/7 | K13/SYNC-A, K13/SYNC-B | — |
| antigravity/fix-sync-c0-bootstrap | 24cc18d | нет (+3, включает b283736) | OK | 5/6, FAIL tenant-isolation | 43/8 | K13/SYNC-A, K13/SYNC-B, SYNC-C0 | — |
| codex/fix-format-baseline | a05777c | нет (+1, от f5ac179) | OK | 3/4, FAIL tenant-isolation | 46/5 | — | — |
| codex/fix-live-database | 1573860 | нет (+2, на a05777c) | OK | 4/5, FAIL tenant-isolation (live-postgres-remediation OK) | 44/7 | K3/N2, K4/N1 | — |
| antigravity/employee-notifications | 3e20544 | да (предок) | OK | 3/4 | 49/2 | — | HARNESS, PILOT-REHOME-SEED, SYNC-L (старый код: нет таблиц/маршрутов sync) |
| antigravity/offline-sync-backend | 5ee7517 | да (предок) | OK | 3/4 | 46/5 | — | — |
| codex/finance-calendar-dashboard | c08a7e6 | да (предок) | OK | 4/4 | 48/3 | A4, K4/N1 | CTRL, HARNESS, PILOT-REHOME-SEED, SYNC-L (старый код) |
| codex/frontend-library | 331e490 | да (предок) | OK | 3/4 | 46/5 | — | — |
| codex/security-finance-production | f74aa6d | да (предок) | OK | 4/4 | 49/2 | — | HARNESS, PILOT-REHOME-SEED, SYNC-L (старый код) |
| codex/server-web-production | 2f6b367 | да (предок) | OK | 4/4 | 49/2 | K4/N1 | CTRL, HARNESS, PILOT-REHOME-SEED, SYNC-L (старый код) |
- `git merge-tree`: **конфликтов нет** ни в одной из 55 пар (Antigravity выстроил цепочку reject → c0,
Codex пересобрал format без sync). Шесть веток — предки основы (уже влиты), для них «стало
красным» означает только «код старше основы».
- `tenant-isolation.test.ts` красный на основе и всех ветках от `f5ac179`
(`error: permission denied for table staff_employees`) — это N5, исправление есть в
`grok/e2e-harness` (`ba59a48`), в основу ещё не влито.
### Сборка «как будет после слияния» (локально, не запушено)
`tmp/combined-round3` = `b0243d5` + merge `codex/fix-live-database` (1573860) + merge
`antigravity/fix-sync-c0-bootstrap` (24cc18d) — без конфликтов; `tmp/combined-round3-grok` = то же +
merge `grok/e2e-harness`. Вывод — [`round3-combined-merge.md`](report-evidence/round3-combined-merge.md).
| Сборка | check | integration | e2e red/green | Стало зелёным |
| ------------------------------ | -------------------------- | -------------------------- | ------------- | --------------------------------------------- |
| combined-round3 (48128c8) | OK (199 passed, 6 skipped) | 6/7, FAIL tenant-isolation | 41/10 | K13/SYNC-A, K13/SYNC-B, K3/N2, K4/N1, SYNC-C0 |
| combined-round3-grok (e94415a) | OK (199 passed, 6 skipped) | **7/7** | 41/10 | то же |
Храповик на `combined-round3-grok`: `[run-e2e] FAIL: K13/SYNC-A, K13/SYNC-B, K3/N2, K4/N1, SYNC-C0 —
дефект исправлен, обновите known-defects.json` — ровно список из TASK-GROK-3 п.4. Удалю их отдельным
коммитом, когда ветки действительно окажутся в основе.
### п.5: PILOT-REHOME
- `[PILOT-REHOME-SEED]` — **зелёный**: 27 таблиц с `tenant_id` из `information_schema.columns`, в каждую
2+ строки заглушки `01J00000000000000000000000` и постороннего случайного арендатора (SQL мигратором,
`app.tenant_id`/`app.user_id` в транзакции); таблица без сида → красный со списком.
- `[PILOT-REHOME]` — **красный** (в `known-defects.json`): `scripts/rehome-tenant.mjs отсутствует
(TASK-CODEX-2 п.2.2): … Засеяно таблиц: 27, ledger SUM(amount_minor)=…`.
- Сценарий проверен временным эталоном скрипта (не коммитился, удалён): с ним зелёный; мутации
«без записи аудита», «без отказа на повтор», «пропущена таблица», «dry-run пишет» — красные
([`report-evidence/round3-pilot-rehome.txt`](report-evidence/round3-pilot-rehome.txt)).
- Контракт, который проверяет сценарий, — `NOTES-FOR-EXECUTORS.md`, C6.
## Как запустить ## Как запустить
```sh ```sh
@ -38,20 +139,28 @@ export E2E_PG_ADMIN_URL=postgres://<admin>:<pw>@127.0.0.1:55433/postgres # т
E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs # храповик known-defects (как в CI) E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs # храповик known-defects (как в CI)
node scripts/test/run-e2e.mjs --no-known-defects # строго: любой красный = exit 1 node scripts/test/run-e2e.mjs --no-known-defects # строго: любой красный = exit 1
./scripts/test/ci-local.sh # локальный эквивалент verify/format/e2e (bash) ./scripts/test/ci-local.sh # локальный эквивалент verify/format/e2e (bash)
node scripts/test/accept-branch.mjs <ветка> [<ветка>…] # приёмка веток (worktree, check, integration, e2e, merge-tree)
# роли уже есть (общий кластер): E2E_MIGRATOR_URL=… E2E_APP_URL=… — роли и пароли не трогаются
``` ```
## Таблица по ID (основная ветка f5ac179 + этот стенд) ## Таблица по ID (основная ветка f5ac179 + этот стенд)
Команда: `./scripts/test/ci-local.sh` (внутри `E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs`), Команда: `./scripts/test/ci-local.sh` (внутри `E2E_MIGRATIONS=roundtrip node scripts/test/run-e2e.mjs`),
2026-09-26 ~15:28 (UTC+7), PostgreSQL 17.11: 2026-09-26 ~16:25 (UTC+7), PostgreSQL 17.11, стенд круга 3:
```text ```text
== roundtrip OK: rolledBack=11 reapplied=11 ::: [check] with_db_env npm run check
Test Files 5 failed | 1 passed (6) Test Files 20 passed (20)
Tests 45 failed | 9 passed (54) Tests 196 passed (196)
::: [format-check] FAIL exit=1 # 23 файла базовой линии основы, ни одного из tests/e2e, scripts/test, .forgejo
Test Files 6 failed | 1 passed (7)
Tests 46 failed | 10 passed (56)
[run-e2e] OK: стенд работает, все красные сценарии — известные открытые дефекты [run-e2e] OK: стенд работает, все красные сценарии — известные открытые дефекты
``` ```
Круг 3 добавил `[PILOT-REHOME-SEED]` (GREEN) и `[PILOT-REHOME]` (RED, `scripts/rehome-tenant.mjs
отсутствует (TASK-CODEX-2 п.2.2)`); остальные строки таблицы — без изменений со второго круга.
| ID владельца / мой | Цвет | Фактический вывод (первая строка assert) | | ID владельца / мой | Цвет | Фактический вывод (первая строка assert) |
| ---------------------------- | ----- | ------------------------------------------------------------------------------------------------- | | ---------------------------- | ----- | ------------------------------------------------------------------------------------------------- |
| HARNESS (×5), CTRL (×2) | GREEN | 7/7 passed — стенд и позитивные контроли | | HARNESS (×5), CTRL (×2) | GREEN | 7/7 passed — стенд и позитивные контроли |
@ -93,6 +202,8 @@ node scripts/test/run-e2e.mjs --no-known-defects # строго: люб
| SYNC-C0 (нет ID у владельца) | RED | bootstrap pull `HTTP 500 code 42703 column "status" does not exist` | | SYNC-C0 (нет ID у владельца) | RED | bootstrap pull `HTTP 500 code 42703 column "status" does not exist` |
| SYNC-K (нет ID у владельца) | RED | ack курсора из будущего `HTTP 200` | | SYNC-K (нет ID у владельца) | RED | ack курсора из будущего `HTTP 200` |
| SYNC-L | GREEN | отозванное устройство получает 403 (позитивный контроль) | | SYNC-L | GREEN | отозванное устройство получает 403 (позитивный контроль) |
| PILOT-REHOME-SEED | GREEN | 27 таблиц с `tenant_id` засеяны (заглушка + посторонний арендатор) |
| PILOT-REHOME | RED | `scripts/rehome-tenant.mjs отсутствует (TASK-CODEX-2 п.2.2)` |
| PILOT-3 | GREEN | у `app` нет учётных данных мигратора | | PILOT-3 | GREEN | у `app` нет учётных данных мигратора |
| N5 (tenant-isolation) | GREEN | в `npm run check` с тестовой БД: `Test Files 20 passed (20)`, `Tests 196 passed (196)` | | N5 (tenant-isolation) | GREEN | в `npm run check` с тестовой БД: `Test Files 20 passed (20)`, `Tests 196 passed (196)` |
| N13 (скрипт, не vitest) | — | не воспроизведено: 0 из 30 попыток при 10/25/50 (обход K3 в одноразовой БД), см. ниже | | N13 (скрипт, не vitest) | — | не воспроизведено: 0 из 30 попыток при 10/25/50 (обход K3 в одноразовой БД), см. ниже |
@ -254,3 +365,7 @@ $ git status --porcelain
`codex/fix-live-database`. `codex/fix-live-database`.
- S9 проверен удалением SQL-запросом мигратора (публичного API удаления точки нет). - S9 проверен удалением SQL-запросом мигратора (публичного API удаления точки нет).
- Причина невоспроизводимости N13 — гипотеза по коду. - Причина невоспроизводимости N13 — гипотеза по коду.
- Круг 3: `scripts/rehome-tenant.mjs` не существует — `[PILOT-REHOME]` проверен только временным
эталоном; контракт C6 — предположение. `accept-branch` в CI не запускается (разовый инструмент
владельца/приёмщика). Режим `E2E_MIGRATOR_URL/E2E_APP_URL` проверен на том же локальном кластере
(роли созданы заранее `provision-pg`), на чужом кластере — не проверено.