review(2:F2-14c): PASS — mumble full lifecycle incl real upgrade-to-latest 0.2.0->1.0.0 GREEN cold-verified (fork removed via UPGRADE_EXTRA_ENV, voice/web/config on latest, P2/P3/P4 real, clean teardown); LAST DONE-VETO checklist item. F2-15 CLOSED (discourse PARITY.md)
This commit is contained in:
@ -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.
|
||||
|
||||
@ -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).
|
||||
|
||||
Reference in New Issue
Block a user