diff --git a/machine-docs/BACKLOG-2.md b/machine-docs/BACKLOG-2.md index 1856700..bcfeb2d 100644 --- a/machine-docs/BACKLOG-2.md +++ b/machine-docs/BACKLOG-2.md @@ -148,7 +148,16 @@ Phase plan: `/srv/cc-ci/cc-ci-plan/plan-phase2-recipe-tests.md` §4.3 prescribed register-2-users + send/receive message). EXTRA_ENV TIMEOUT=900. Cold green after capacity unblock (commit `8350865`). Shell-script parity tests (compress_state/test_complexity_limit/test_purge) deferred with technical rationale. -- [ ] **Q4.2** — mumble: enroll; specific (connect a client/CLI, channel presence beyond TCP health). +- [x] **Q4.2** — mumble: **FULL LIFECYCLE GREEN @2026-05-29 — CLAIMED (STATUS-2 Gate Q4.2), awaiting + Adversary.** TCP/voice recipe (not HTTP-native) enrolled via mumbleweb (HTTP readiness + web_client + parity) + host-ports (64738 on host for protocol tests). P2: 3 parity ports (health_check→ + test_tcp_health, mumble_connect→test_protocol_handshake [TLS handshake+channel presence+ServerSync], + web_client→test_web_client). P3: 2 specific (test_welcome_text_roundtrip + test_server_config_limits + — config round-trips over the protocol). P4: sqlite ci_marker in /data/mumble-server.sqlite survives + backup→mutate→restore. install+upgrade(real 0.2.0→1.0.0+ crossover, head_ref==chaos-version)+backup+ + restore+custom all pass; deploy-count=1; clean teardown. Harness: CHAOS_BASE_DEPLOY flag, + recipe_checkout -f, TCP READY_PROBE (wait_ready_probes); install_steps provides host-ports.yml to + versions predating it. Commits 6841048+6bf0425+999dd0d+a0fd58b+1890cb5+ec76072; log ccci-mumble-full6. - [x] **Q4.3** — bluesky-pds: enrolled. install_steps.sh generates per-run secp256k1 PLC rotation key (recipe's pds_plc_rotation_key is generate=false). PARITY.md, recipe_meta.py + 3 functional tests (health_check, describe_server, session_auth-requires-auth). Cold green diff --git a/machine-docs/STATUS-2.md b/machine-docs/STATUS-2.md index d407b58..d516e59 100644 --- a/machine-docs/STATUS-2.md +++ b/machine-docs/STATUS-2.md @@ -70,9 +70,10 @@ config round-trips over the protocol) + P4 (ops/test_backup/test_restore via sql test_install overlay + PARITY.md + install_steps.sh (provides host-ports overlay to versions predating it) + `CHAOS_BASE_DEPLOY` harness flag (untracked overlay trips abra's pinned clean-tree check → chaos base deploy). Smoke proved web 200 + `Mumble`/`config.js`, TCP 64738 host-published, -sqlite3 in container. **Full harness run QUEUED behind the Adversary's in-flight plausible cold run -(`/root/adv-q47-plausible-cold.log`, stack `plau-0c70fd`) — single node; not deploying concurrently -to protect their clean cold-verify signal.** +sqlite3 in container. **FULL LIFECYCLE GREEN @2026-05-29 — CLAIMED (see ## Gate Q4.2), awaiting +Adversary.** All 5 tiers pass, deploy-count=1, HC1 upgrade crossover 0.2.0→1.0.0+, P4 ci_marker +survives, clean teardown; log `/root/ccci-mumble-full6.log`. Needed 4 fixes en route (host-ports for +old versions, CHAOS_BASE_DEPLOY, recipe_checkout -f, TCP voice-server READY_PROBE) — all in DECISIONS. **Q3.3 lasuite-meet — ✅ Adversary PASS @2026-05-29 (REVIEW-2 `a46f7d4`).** Cold-verify all 5 tiers GREEN, real upgrade crossover, meeting_flow + OIDC PASSED, ci_marker survives, clean teardown; WebRTC @@ -166,6 +167,73 @@ SKIP no longer yields a GREEN `!testme`. ## Gate +**Gate: Q4.2 mumble — CLAIMED @2026-05-29, awaiting Adversary.** + +**WHAT.** mumble (the §5 TCP/voice recipe — first non-HTTP-native recipe) runs its **full lifecycle +GREEN**: install + upgrade (real prev→PR-head crossover) + backup + restore + custom. `deploy-count=1`, +clean teardown. Enrolled by deploying two upstream overlays via +`COMPOSE_FILE=compose.yml:compose.mumbleweb.yml:compose.host-ports.yml`: +- **mumbleweb** → an HTTP web-client sidecar (HEALTH_PATH `/` → 200) giving the generic harness its + serving/readiness signal + the `web_client.py` parity surface. +- **host-ports** → publishes 64738 (tcp+udp, mode:host) on the cc-ci host so the on-host (cc-ci-run) + protocol tests connect to 127.0.0.1:64738. +- **P2 (3 parity ports, all green):** `health_check.py`→`functional/test_tcp_health.py` (TCP 64738); + `mumble_connect.py`→`functional/test_protocol_handshake.py` (TLS handshake → server Version → auth + accepted → ≥1 channel = channel presence → ServerSync, via vendored `functional/_mumble_proto.py`); + `web_client.py`→`functional/test_web_client.py` (HTTPS 200 + `Mumble`/`config.js`/``). + No recipe-maintainer mumble test omitted. `tests/mumble/PARITY.md` has the mapping. +- **P3 (2 specific, beyond parity, version-independent config round-trips):** + `functional/test_welcome_text_roundtrip.py` (deploy-set `WELCOME_TEXT` marker + `cc-ci-mumble-welcome-7f3a9c` surfaces in the ServerSync welcome_text) + + `functional/test_server_config_limits.py` (deploy-set non-default `USERS=42` surfaces as + ServerConfig.max_users==42). Both prove deploy-time config propagated into the running murmur server. +- **P4 (real backup data-integrity):** `ops.py` seeds a `ci_marker` row into + `/data/mumble-server.sqlite` (the exact file the recipe's backupbot `.backup`/restore hooks dump), + `test_backup.py` asserts it at backup time, `pre_restore` drops it, `test_restore.py` asserts it + returns as `original`. sqlite busy timeout set via the silent `.timeout` dot-command. + +Harness/enrollment additions (DECISIONS.md "mumble" entries): `recipe_meta.CHAOS_BASE_DEPLOY` flag + +`lifecycle._recipe_meta_flag` + a `deploy_app` branch (the cc-ci-provided untracked host-ports overlay +trips abra's pinned clean-tree check → chaos base deploy of the checked-out pinned version, not +LATEST); `abra.recipe_checkout` now `git checkout -f` (the version-pinning checkout must yield the +exact ref tree, robust to the cc-ci overlay colliding with head_ref's tracked copy); `wait_ready_probes` +now supports a TCP probe (`{tcp_host,tcp_port,stable=N}`) so readiness gates on the **voice server** +(64738) being stably listening — HEALTH_PATH only proves the mumble-web sidecar, and after the chaos +upgrade redeploy the host-mode 64738 port churns (old task releases → new binds), which otherwise let +backup-bot exec into a not-running app container (409). `tests/mumble/install_steps.sh` provides an +identical `compose.host-ports.yml` to versions predating it (the upgrade base 0.2.0+; upstream added it +in 1.0.0). No browser flow (P6 N/A — mumble's core UX is the native client over the voice protocol, +covered by the handshake test; the web UI is asserted via test_web_client). + +**HOW (Adversary, cold, on cc-ci):** +``` +ssh cc-ci 'cd /root/ && git pull && RECIPE=mumble PR=0 cc-ci-run runner/run_recipe_ci.py' +``` + +**EXPECTED:** +- RUN SUMMARY: `deploy-count = 1 (expect 1)`; `install/upgrade/backup/restore/custom` **all `pass`**. +- Base deploy log: `deploy_app(mumble@0.2.0+v1.6.870-0): CHAOS_BASE_DEPLOY set → chaos base deploy …` + and `mumble install_steps: provided compose.host-ports.yml to recipe checkout (mumble)`. +- `ready-probe OK (tcp 3x): 127.0.0.1:64738` appears **TWICE** (post-install + post-upgrade). +- Upgrade: `upgrade→PR-head: head_ref=9fa5e949 chaos-version=9fa5e949 version=0.2.0+v1.6.870-0→ + 1.0.0+v1.6.870-0` (real crossover; head_ref==chaos-version = HC1). +- Custom tier — **5 PASS**: `test_tcp_health`, `test_protocol_handshake` + (`test_handshake_completes_with_channel_presence`), `test_web_client` + (`test_web_client_serves_mumble_web_ui`), `test_welcome_text_roundtrip` + (`test_configured_welcome_text_surfaces_in_serversync`), `test_server_config_limits` + (`test_configured_max_users_surfaces_in_serverconfig`). +- P4: `test_backup_captures_state` + `test_restore_returns_state` **PASSED** (ci_marker survives). +- Clean teardown: post-run `docker stack ls | grep mumb` → empty. + +**WHERE.** Commits `6841048` (test content) + `6bf0425` (install_steps host-ports) + `999dd0d` +(CHAOS_BASE_DEPLOY) + `a0fd58b` (sqlite .timeout) + `1890cb5` (recipe_checkout -f) + `ec76072` +(TCP READY_PROBE). Files: `tests/mumble/{recipe_meta.py,PARITY.md,ops.py,install_steps.sh, +compose.host-ports.yml,test_install.py,test_backup.py,test_restore.py,functional/*.py}`, +`runner/harness/{lifecycle.py,abra.py}`. Log `/root/ccci-mumble-full6.log`. Isolation diagnostic +(backup/restore green on a stable deploy, no upgrade): `/root/ccci-mumble-diag.log`. + +--- + **Gate: HQ1 image pre-pull — ✅ Adversary PASS @2026-05-29 (REVIEW-2 `0215bd2`).** **WHAT.** `runner/harness/lifecycle.prepull_images(recipe, domain)` warms the local image store BEFORE