Q0.1 harness.http canonical Phase-2 recipe-test HTTP API. Q0.2 discovery recurses into functional/+playwright/ subdirs. Q0.3 custom-html PARITY.md + parity-port functional/health_check. Q1.1 +2 recipe-specific functional + playwright smoke. Acceptance cold-verifiable on cc-ci: cc-ci-run -m pytest tests/unit -v # 21 PASS RECIPE=custom-html cc-ci-run runner/run_recipe_ci.py # all 5 stages PASS, deploy-count=1 head_ref=8a026066 == chaos-version=8a026066 (HC1 non-vacuous) Q0.4 (dep resolver) deferred to Q2 (no Q1 recipe needs deps). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6.3 KiB
6.3 KiB
BACKLOG — Phase 2 (per-recipe test authoring)
Phase-namespaced backlog. Builder edits ## Build backlog; Adversary edits ## Adversary findings.
Phase plan: /srv/cc-ci/cc-ci-plan/plan-phase2-recipe-tests.md
Build backlog
Q0 — Harness additions
- Q0.1 —
runner/harness/http.pylanded (canonical Phase-2 recipe-test HTTP API:http_get/http_post/http_request/retry_http_get/retry_http_post/wait_for_http/assert_converges). TTY abra wrapper already present (runner/harness/abra.py::_run_pty) from Phase 1d. 11 unit tests landed. - Q0.2 —
discovery.custom_testsrecurses intotests/<recipe>/{functional,playwright}/(Phase 2 §4.1 layout); 2 unit tests landed. - Q0.3 —
tests/custom-html/PARITY.mdlanded (parity row for health_check + rationale for 2 new recipe-specific tests + data-integrity + playwright sections). Parity port:tests/custom-html/functional/test_health_check.py(SOURCE comment present). - Q0.4 — Dependency resolver harness primitive (read
tests/<recipe>/recipe.tomlrequires/test_requires, deploy deps before the recipe under test, tear down with it). MindMAX_TESTS/node budget; sequence heavy ones. Deferred to Q2 (needed once SSO providers come online; no Phase-2 recipe in Q1 needs deps). Tracked in BACKLOG. - Q0.5 — CLAIMED @2026-05-28. Custom-html reference recipe runs the full parity + ≥2 specific + playwright suite green on cc-ci via the existing run path; deploy-count=1; DECISIONS.md Phase-2 section in place. Awaiting Adversary cold-verify gate PASS.
Q1 — Pattern proof (custom-html + n8n)
- Q1.1 — custom-html: ≥2 NEW recipe-specific functional tests (beyond parity
health_check). Candidates from plan §4.3: "serve/persist content: write content, fetch it back" — custom-html serves the/usr/share/nginx/htmlvolume, so a content round-trip + a content-type header check are appropriate. Playwright already exists intests/custom-html/test_install.py. - Q1.2 — n8n: enroll under cc-ci. Port
recipe-info/n8n/tests/health_check.py→tests/n8n/functional/health_check.py. Add ≥2 specific tests: (a) create a workflow via API, execute it, assert result; (b) the workflow persists across an upgrade. PARITY.md filled. - Q1.3 — Real backup data-integrity for n8n: seed a workflow → backup → wipe → restore → list workflows, prove the seeded one survived. (custom-html already has this pattern from 1e.)
- Q1.4 — Q1 gate: both recipes green via
!testme; both PARITY.md complete.
Q2 — SSO providers (keycloak + authentik)
- Q2.1 — keycloak: port
tests/keycloak/oidc_integration.py(the dependent-recipe test) andtests/health_check.py. Add specific tests from plan §4.3 (realm+client via admin API; password and client-credentials token grants; JWT claims). - Q2.2 — authentik: mirror the upstream repo if needed (per recipe mirror+PR flow); port health_check + add specific tests.
- Q2.3 — Reusable SSO-setup/OIDC-flow harness primitive: deploy provider → setup realm/client/
test-user (port
recipe-info/<dep>/setup_<provider>_integration.py) → persist credentials per-run → "full OIDC login → token → protected API call" assertion. Implement once inrunner/harness/; reused by every SSO-dependent recipe. - Q2.4 — Q2 gate: a dependent recipe deploys its provider + runs an OIDC login test in one run.
Q3 — SSO-dependent suite (lasuite-docs, lasuite-drive, lasuite-meet, cryptpad, immich)
- Q3.1 — lasuite-docs: parity (health_check, oidc_login, upload_conversion) + specific (create-a-doc + WOPI discovery).
- Q3.2 — lasuite-drive: enroll (mirror via recipe mirror+PR flow if absent); parity + specific (upload to workspace, list/download; MinIO bucket present).
- Q3.3 — lasuite-meet: parity (health_check, oidc_login, meeting_flow, webrtc-media, webrtc-relay) + specific (create-a-room, two-user LiveKit token issuance, ICE-candidate gathering).
- Q3.4 — cryptpad: parity (health_check, oidc_login) + specific (Playwright pad create+persist — JS-rendered so curl insufficient).
- Q3.5 — immich: enroll (mirror as needed); add specific (upload asset, list it back, thumbnail/derivative).
- Q3.6 — Q3 gate: each green with deps deployed, within node budget; SSO setup automated.
Q4 — Remaining recipes
- Q4.1 — matrix-synapse: parity (port shell tests as Python;
compress_state,test_complexity_limit,test_purge) + specific (register two users; one sends a message, the other reads it; media upload→download;/_matrix/federation/v1/versionreachable). - Q4.2 — mumble: enroll; specific (connect a client/CLI, channel presence beyond TCP health).
- Q4.3 — bluesky-pds: parity (port
goat_account) + specific (atproto post round-trip, then delete account). - Q4.4 — ghost: enroll; specific (create-a-post round-trip).
- Q4.5 — mattermost-lts: enroll; specific (create-a-message round-trip).
- Q4.6 — discourse: enroll; specific (create-a-topic round-trip).
- Q4.7 — plausible: enroll; specific (track a test event, query it back).
- Q4.8 — uptime-kuma: enroll; specific (create a monitor, list it).
- Q4.9 — mailu: enroll; specific (create a mailbox, send/receive verification).
- Q4.10 — drone: enroll; specific (create/list builds via API).
- Q4.11 — Q4 gate: each recipe green with parity + specific.
Q5 — Completeness + docs
- Q5.1 —
docs/enroll-recipe.mdupdated with the per-recipe test contract (§4.1), thefunctional/andplaywright/subdirectory layout, the PARITY.md convention, the dependency resolver hook, the SSO-setup harness — with a worked example. - Q5.2 — Adversary samples a subset and cold-verifies parity tables + specific tests are real (not health-only, not skipped). NO weakened test, no corners cut (P7).
- Q5.3 — Phase 2
## DONEafter all P1–P8 Adversary cold-verified PASS, no standing VETO.
Adversary findings
(empty — Adversary writes here)