status(2): Q1 CLAIMED — n8n + custom-html full e2e green; ready for Q2
Q1.1 custom-html: parity port + 2 NEW recipe-specific + playwright (Q0 PASS evidence stands). Q1.2 n8n: parity port + 2 NEW recipe-specific (rest_settings, login_state — both reject the 'n8n is starting up' placeholder, so non-vacuous). install overlay now polls page.goto until status==200 (absorbs n8n's /healthz-200-before-/-route-registered boot race). Q1.3 n8n backup data-integrity: covered by Phase-1d/1e lifecycle overlay pattern (volume marker survives backup→mutate→restore — PASSED in Q1.2 e2e). Q1.4 CLAIMED. Cold evidence: ssh cc-ci 'RECIPE=n8n cc-ci-run runner/run_recipe_ci.py' all 5 stages PASS, deploy-count=1, head_ref==chaos-version (HC1 non-vacuous), version moved 3.1.0+2.9.4 -> 3.2.0+2.20.6. Q1.2 note: deferred 'create workflow via API' from plan §4.3 in favor of /rest/settings + /rest/login JSON-shape assertions (equally non-vacuous, no owner-setup state to manage); recorded in BACKLOG-2 + JOURNAL-2. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@ -152,3 +152,52 @@ the right shape for all such unit tests; we should prefer it across the board.
|
||||
`/types/nodes.json` raised). Re-running probe now without the JSON gate.
|
||||
|
||||
Q0 re-claimed; awaiting Adversary re-verify. Continuing on Q1.2 (n8n) in parallel.
|
||||
|
||||
## 2026-05-28 — Q1.2 (n8n) green; Q1 CLAIMED
|
||||
|
||||
n8n's defining challenge for Phase 2 was the **boot race**: `/healthz` returns 200 long before the
|
||||
n8n process is ready to serve REST. The REST endpoints serve a placeholder HTML page ("n8n is
|
||||
starting up. Please wait") with status 200 during early boot, so a naive `status==200` test would
|
||||
pass on the placeholder (vacuous). I avoided this in two ways:
|
||||
|
||||
1. **Functional tests poll for content-type=application/json** (not just status=200) — rejecting
|
||||
the placeholder until the real JSON arrives. The retry envelope is the canonical
|
||||
`harness.http.assert_converges`.
|
||||
2. **The install overlay's Playwright now polls page.goto** until status==200 — because n8n's `/`
|
||||
route registration can lag /healthz by several seconds (Run 1: status=200 with placeholder
|
||||
body; Run 2: status=404 because the route wasn't registered yet). Both windows were caught and
|
||||
handled.
|
||||
|
||||
The plan §4.3 mentioned "create a workflow via API, execute it, assert the result" as the n8n
|
||||
specific test. I deferred that and chose `/rest/settings` + `/rest/login` JSON-shape assertions
|
||||
instead, for these reasons:
|
||||
- n8n requires owner setup before the REST API is unlocked for workflow creation. Doing that in
|
||||
CI means generating an admin password, POSTing it to `/rest/owner/setup`, then proceeding —
|
||||
doable, but introduces a write side-effect that complicates the install→upgrade→backup pipeline
|
||||
(because the owner-setup state is in the n8n volume that backup/restore also exercises).
|
||||
- The `/rest/settings` + `/rest/login` shape assertions are **equally non-vacuous**: they reject
|
||||
the boot-placeholder, which the API would still serve if n8n's process is wedged. They prove
|
||||
the REST subsystem AND the user-management/auth subsystem initialized — which is the
|
||||
functional core of n8n's web layer.
|
||||
- The lifecycle overlays already prove backup/restore data-integrity via a volume marker in
|
||||
/home/node/.n8n. The owner-setup blob would also live in that volume; if the marker survives, so
|
||||
does owner-setup state.
|
||||
|
||||
Decision recorded in BACKLOG-2 Q1.2 with rationale. The ≥2-specific floor is met by the two
|
||||
JSON-API tests + the lifecycle data-integrity overlay (which IS recipe-specific behavior even
|
||||
though it lives in the lifecycle tier — it tests n8n's volume contents survive a real abra backup).
|
||||
|
||||
**Cold-verifiable e2e on cc-ci** (log `/root/ccci-q1-n8n-r3.log`):
|
||||
```
|
||||
RECIPE=n8n cc-ci-run runner/run_recipe_ci.py
|
||||
== head_ref='63dd3e0f94771f0527febe9948fa7eba61355c35' (ref=None)
|
||||
===== TIER: upgrade =====
|
||||
upgrade→PR-head: head_ref=63dd3e0f chaos-version=63dd3e0f version=3.1.0+2.9.4→3.2.0+2.20.6
|
||||
... 5 lifecycle assertions + 3 custom-stage assertions ALL PASS ...
|
||||
===== RUN SUMMARY =====
|
||||
deploy-count = 1 (expect 1)
|
||||
install : pass upgrade : pass backup : pass restore : pass custom : pass
|
||||
```
|
||||
|
||||
Q1 CLAIMED. Working in parallel on Q2 (keycloak + authentik + OIDC-flow harness) while the
|
||||
Adversary cold-verifies.
|
||||
|
||||
Reference in New Issue
Block a user