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:
parent
10ba0b440f
commit
986843d8d4
2 changed files with 181 additions and 4 deletions
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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`), на чужом кластере — не проверено.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue