status(2): Q1 RE-CLAIMED — F2-3 + F2-4 closed by Builder

Per Adversary cold (REVIEW-2 Q1 FAIL):
- F2-4: 'needs owner setup' rationale was the prohibited 'needs SSO setup' class per plan §7.1.
  Fixed by tests/n8n/functional/test_workflow_roundtrip.py (commit fc89552) — the plan §4.3
  prescribed create-and-read-back test, with run-scoped owner credential.
- F2-3: page.goto raised PlaywrightError outside the retry loop on net::ERR_*. Fixed by wrapping
  page.goto in try/except PlaywrightError so transient navigation failures retry, same shape as
  F1e-1's exec_in_app hardening.

Cold-verifiable: ssh cc-ci 'RECIPE=n8n cc-ci-run runner/run_recipe_ci.py'
  all 5 stages PASS; custom tier 4 PASS including new workflow_create_and_read_back; deploy-count=1.

Keycloak Q2.1 e2e (separate background task) had install hit 502 from /realms/master after 600s
HTTP_TIMEOUT — likely cold-start JVM+mariadb on the host. Will investigate post Q1 verdict.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-28 07:08:57 +01:00
parent fc89552347
commit 764fd8f330
3 changed files with 80 additions and 17 deletions

View File

@ -54,10 +54,14 @@ the existing run path; PARITY.md + functional/ + playwright/ in place; data-inte
the lifecycle overlay pattern. Next: keycloak parity port + OIDC-flow harness primitive.
## Gate
**Gate: Q1 — CLAIMED, awaiting Adversary @2026-05-28** (commit `2f3d5aa` Q1.2 n8n; commit
`bec9265` Q1.1 custom-html). Acceptance per plan §6 Q1: both custom-html (simple) and n8n
(single-volume, stateful) have full parity port + ≥2 NEW recipe-specific functional tests + real
backup data-integrity + green via the existing run path; PARITY.md complete for both.
**Gate: Q1 — RE-CLAIMED, awaiting Adversary @2026-05-28** (commit `fc89552` F2-3 + F2-4 fixes on
top of original Q1 claim `2f3d5aa`). Acceptance per plan §6 Q1 + Adversary Q1 FAIL findings:
- **F2-4 closed:** `tests/n8n/functional/test_workflow_roundtrip.py` lands the plan §4.3
prescribed test (owner setup → workflow create → workflow read-back), removing the prohibited
"needs owner setup" excuse. Cold e2e PASS.
- **F2-3 closed:** `tests/n8n/test_install.py` now wraps `page.goto(...)` in `try/except
PlaywrightError` inside the retry loop so transient `net::ERR_*` errors trigger a retry instead
of test failure. Cold e2e PASS first try.
**Objective evidence pointers (Q1):**
- **custom-html (Q1.1)** — already cold-verified in Q0 PASS. Same evidence stands: full e2e green,
@ -77,14 +81,17 @@ backup data-integrity + green via the existing run path; PARITY.md complete for
- restore: generic `test_restore_healthy` PASS + cc-ci `test_restore_returns_state` PASS
(marker mutated to `mutated` by `ops.pre_restore`, restored to `original` — real backup
data-integrity).
- **Custom tier results (3 PASS):**
- **Custom tier results (4 PASS — log `/root/ccci-q1-n8n-r4.log` post-F2-4/F2-3 fix):**
- `tests/n8n/functional/test_health_check.py::test_n8n_returns_200` — parity port (HTTP 200
from `/`), with `SOURCE: recipe-info/n8n/tests/health_check.py` comment.
- `tests/n8n/functional/test_workflow_roundtrip.py::test_workflow_create_and_read_back` —
**plan §4.3 prescribed create+read-back**: owner setup → POST /rest/workflows → GET
/rest/workflows/<id>; assert id/name/nodes round-trip. (F2-4 fix.)
- `tests/n8n/functional/test_rest_settings.py::test_rest_settings_returns_json_with_known_keys`
NEW: polls `/rest/settings` until content-type is `application/json` (rejecting the
— polls `/rest/settings` until content-type is `application/json` (rejecting the
"n8n is starting up" placeholder HTML), then asserts known public-settings keys
(`userManagement` / `defaultLocale` / `authCookie`) in the `data` envelope.
- `tests/n8n/functional/test_login_state.py::test_login_endpoint_returns_json` — NEW: polls
- `tests/n8n/functional/test_login_state.py::test_login_endpoint_returns_json` — polls
`/rest/login` until content-type is `application/json`, proves auth subsystem initialized.
- **PARITY.md complete:** `tests/n8n/PARITY.md` — parity row for `health_check.py`, rationale
for the 2 recipe-specific tests, data-integrity + playwright sections.