From 0d5d5164f91b767dc35a3255da8ed758630b21f2 Mon Sep 17 00:00:00 2001 From: autonomic-bot Date: Sun, 31 May 2026 05:26:17 +0000 Subject: [PATCH] =?UTF-8?q?review(2:F2-14c):=20PASS=20=E2=80=94=20mumble?= =?UTF-8?q?=20full=20lifecycle=20incl=20real=20upgrade-to-latest=200.2.0->?= =?UTF-8?q?1.0.0=20GREEN=20cold-verified=20(fork=20removed=20via=20UPGRADE?= =?UTF-8?q?=5FEXTRA=5FENV,=20voice/web/config=20on=20latest,=20P2/P3/P4=20?= =?UTF-8?q?real,=20clean=20teardown);=20LAST=20DONE-VETO=20checklist=20ite?= =?UTF-8?q?m.=20F2-15=20CLOSED=20(discourse=20PARITY.md)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine-docs/BACKLOG-2.md | 2 +- machine-docs/REVIEW-2.md | 78 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/machine-docs/BACKLOG-2.md b/machine-docs/BACKLOG-2.md index 38090d0..9039872 100644 --- a/machine-docs/BACKLOG-2.md +++ b/machine-docs/BACKLOG-2.md @@ -270,7 +270,7 @@ Phase plan: `/srv/cc-ci/cc-ci-plan/plan-phase2-recipe-tests.md` ## Adversary findings -- [ ] **F2-15** [adversary] discourse: `tests/discourse/PARITY.md` MISSING (P2 / plan §4.1). Upstream +- [x] **F2-15** (CLOSED @2026-05-31T05:26Z — discourse PARITY.md added `470afbf`, cold-verified N/A-documented) [adversary] discourse: `tests/discourse/PARITY.md` MISSING (P2 / plan §4.1). Upstream has no discourse test corpus (`/srv/recipe-maintainer/recipe-info/discourse` does not exist → no `tests/*.py` to port), so parity is genuinely N/A — but §4.1 lists PARITY.md as a required per-recipe file and P2 requires non-ports documented; peers ghost/mattermost-lts shipped an N/A PARITY.md. diff --git a/machine-docs/REVIEW-2.md b/machine-docs/REVIEW-2.md index cc03c57..12f9130 100644 --- a/machine-docs/REVIEW-2.md +++ b/machine-docs/REVIEW-2.md @@ -2478,3 +2478,81 @@ file and peers (ghost, mattermost-lts) shipped an N/A PARITY.md; discourse must (Post-verdict: I may now consult JOURNAL-2; this verdict was formed from the plan SSOT, STATUS-2's WHAT/HOW/EXPECTED/WHERE, the code in my own clone, the cold run log, and the live node — not from the Builder's JOURNAL narrative, per §6.1 anti-anchoring.) + + +## F2-14c mumble — PASS @2026-05-31T05:26Z (cold; LAST DONE-VETO checklist item now cleared) + +Builder claim `1461e44` ("claim(2:F2-14c): mumble full lifecycle incl upgrade-to-latest GREEN, cc-ci +host-ports fork removed (UPGRADE_EXTRA_ENV hook); deploy-count=1, voice/web/config on latest, P4 +non-vacuous, clean teardown — LAST DONE-VETO item") + STATUS-2 ## Gate F2-14c. Cold-verified from my +own clone `/srv/cc-ci/cc-ci-adv` (claim cc-ci commit 4bf9e1d confirmed `merge-base --is-ancestor`) + +`ssh cc-ci`. Did not re-deploy (single-node); cold-read the run log + on-disk suite + live node. + +**1. RUN SUMMARY (`/root/ccci-mumble-f214c.log`, mtime 05:09:27Z) — measured:** +``` +deploy-count = 1 (expect 1) + install : pass upgrade : pass backup : pass restore : pass custom : pass +``` +No active runner (`ps … run_recipe_ci` = NONE). 2 SKIPs only (justified — see §4). + +**2. Real upgrade-to-latest crossover (the VETO's core requirement).** Log: +`upgrade-env: COMPOSE_FILE=compose.yml:compose.mumbleweb.yml:compose.host-ports.yml` then +`upgrade→PR-head: head_ref=9fa5e949 chaos-version=9fa5e949 version=0.2.0+v1.6.870-0→1.0.0+v1.6.870-0`. +chaos-version == head_ref → genuine prev-published(0.2.0) → latest(1.0.0) crossover, not a re-deploy. + +**3. cc-ci fork of upstream files REMOVED (the F2-14c disposition itself).** In my clone: +`tests/mumble/compose.host-ports.yml` and `tests/mumble/install_steps.sh` are both ABSENT +(`find tests -name 'compose.*.yml'` → only ghost + discourse remain, no mumble). The host-ports +overlay is now applied to the *latest* deploy NATIVELY (1.0.0 ships it upstream) via the new general +harness hook `UPGRADE_EXTRA_ENV` (recipe_meta: base `EXTRA_ENV.COMPOSE_FILE` = web-only, +`UPGRADE_EXTRA_ENV.COMPOSE_FILE` adds host-ports; applied by `generic.perform_upgrade` after PR-head +checkout). So no cc-ci fork of any upstream mumble file remains — exactly what the disposition asked. + +**4. The 2 SKIPs are dimensional, NOT corner-cuts (read the guard + confirmed coverage).** +`test_install.py::test_voice_server_listening` skips ONLY when the live COMPOSE_FILE lacks +host-ports — i.e. on the 0.2.0 base, which predates compose.host-ports.yml (added in 1.0.0), so 64738 +is not host-published there and an on-host TCP probe is genuinely N/A. The voice server IS asserted on +the post-upgrade LATEST: READY_PROBE does a tcp-3x check on 64738 (gates backup) AND the custom-tier +`functional/test_protocol_handshake.py::test_handshake_completes_with_channel_presence PASSED` does a +full TLS control-channel handshake (tls_connect + server Version + auth_accepted + ≥1 channel presence ++ ServerSync). So voice-server liveness is fully proven where it's testable; the skip drops nothing. + +**5. P2 parity REAL (PARITY.md + bodies).** `tests/mumble/PARITY.md` maps all THREE upstream tests +1:1: `health_check.py`→`test_tcp_health.py` (TCP 64738), `mumble_connect.py`→`test_protocol_handshake.py` +(+`_mumble_proto.py`, the full handshake — confirmed in the body, not a hollow rename), +`web_client.py`→`test_web_client.py` (200 + `Mumble`/`config.js` markers). No upstream test omitted. + +**6. P3 ≥2 characteristic, real assertions (both PASSED on latest):** +`test_welcome_text_roundtrip` (deploy-time WELCOME_TEXT marker surfaces in the ServerSync delivered to +a connecting client — create-config→read-back over the real protocol) + +`test_server_config_limits` (configured USERS=42 surfaces as max_users in ServerConfig). Both assert +OUR configured markers (version-independent), not hard-coded upstream values. + +**7. P4 backup data-integrity NON-VACUOUS.** `ops.py` seeds a sqlite `ci_marker` in the recipe's own +backed-up state; `pre_restore` drops it (divergence → a passing restore can't be a no-op); +`test_backup.py::test_backup_captures_state PASSED` + `test_restore.py::test_restore_returns_state +PASSED` (marker survives seed→backup→drop→restore). + +**8. Clean teardown (live node @05:25Z):** 0 mumble services / volumes / secrets / networks; no runner. + +**VERDICT: PASS.** mumble F2-14c — full lifecycle incl real upgrade-to-latest, voice/web/config proven +on latest, cc-ci upstream-file fork removed, P2 parity real, ≥2 real P3, non-vacuous P4, clean +teardown — is genuinely met. **This is the LAST item on the standing DONE VETO checklist +(REVIEW-2 @16:22:07Z: ghost ✓ F2-14b, discourse ✓ Q4.6 @05:34Z, mumble ✓ F2-14c @05:26Z).** + +**VETO status:** the three upgrade-to-latest gate items the VETO required are now all Adversary-PASSED. +I am NOT lifting the VETO in this verdict — before DONE can stand I still owe a pass over the +remaining Phase-2 P1-coverage / Q5 items (plausible Q4.7b is open per STATUS-2; drone Q4.10 deferral; +the §5 set + Q5 docs/sample re-verify) and the open `[adversary]` findings (F2-15 closing below). The +VETO's *named upgrade-to-latest checklist* is satisfied; full DONE authorization is a separate, later +gate I have not yet run. + +(Post-verdict: JOURNAL not consulted before this verdict, per §6.1 anti-anchoring.) + +## F2-15 discourse PARITY.md — CLOSED @2026-05-31T05:26Z + +Builder added `tests/discourse/PARITY.md` (commit `470afbf`). Cold-read in my clone: it documents +parity genuinely N/A (no upstream `recipe-info/discourse/tests` — I independently confirmed the dir is +absent), cites the same ghost/mattermost-lts disposition, and accurately maps the P3 tests + P4 +data-integrity I already cold-verified in the Q4.6 PASS. Satisfies §4.1 (required file present) and +P2 (non-ports documented). **F2-15 CLOSED** (ticked in BACKLOG-2 below).