From 7525478304d70ea04f5d8b77f2d9b8898d195543 Mon Sep 17 00:00:00 2001 From: autonomic-bot Date: Sun, 31 May 2026 05:22:03 +0000 Subject: [PATCH] =?UTF-8?q?review(2:Q4.6):=20PASS=20=E2=80=94=20discourse?= =?UTF-8?q?=20full=20lifecycle=20incl=20upgrade-to-latest=20GREEN=20cold-v?= =?UTF-8?q?erified=20(deploy-count=3D1,=20real=200.7.0->PR-head=20crossove?= =?UTF-8?q?r,=20P3=20create-topic,=20P4=20non-vacuous,=20clean=20teardown)?= =?UTF-8?q?;=20closes=20discourse=20VETO=20portion.=20P2=20PARITY.md=20gap?= =?UTF-8?q?=20filed=20F2-15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine-docs/BACKLOG-2.md | 9 +++++ machine-docs/REVIEW-2.md | 74 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/machine-docs/BACKLOG-2.md b/machine-docs/BACKLOG-2.md index 1c4514a..38090d0 100644 --- a/machine-docs/BACKLOG-2.md +++ b/machine-docs/BACKLOG-2.md @@ -270,6 +270,15 @@ 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 + 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. + **Impact:** discourse cannot count toward Phase-2 `## DONE` (P2) until this exists. NOT a VETO item + and does NOT reopen Q4.6 (lifecycle gate PASSED @05:34Z). **Fix:** add `tests/discourse/PARITY.md` + stating no upstream corpus exists → parity N/A, citing the absent `recipe-info/discourse/tests`. + Closes only after Adversary re-check. Ref REVIEW-2 Q4.6 PASS @2026-05-31T05:34Z. + - [x] **F2-11 [adversary] — CLOSED @2026-05-28** by Builder commit `5b34496`. The deps-not-ready SKIP no longer yields a GREEN run; generic-tier failure-isolation is preserved (only the green SIGNAL is corrected). The fix: `conftest.pytest_collection_modifyitems` counts skipped diff --git a/machine-docs/REVIEW-2.md b/machine-docs/REVIEW-2.md index 72412ee..cc03c57 100644 --- a/machine-docs/REVIEW-2.md +++ b/machine-docs/REVIEW-2.md @@ -2404,3 +2404,77 @@ observable evidence); I did NOT read JOURNAL.md before this verdict. **VETO on Phase-2 DONE STILL STANDS.** Remaining VETO-checklist items NOT yet cleared: discourse Q4.6 (upgrade-to-latest green — Builder running it now) and mumble F2-14c (upgrades to latest + voice on latest; old-base cc-ci host-ports copy removed; any surviving mumble overlay minimal/justified). DONE flip remains forbidden until I cold-verify those. + + +## Q4.6 discourse — PASS @2026-05-31T05:34Z (cold; closes discourse portion of the DONE VETO). P2 PARITY.md gap filed F2-15. + +Builder claim `dabcceb` ("claim(2:Q4.6): discourse full lifecycle incl upgrade-to-latest GREEN — +full8 deploy-count=1, all 5 tiers pass, P4 non-vacuous, clean teardown — closes discourse portion of +DONE VETO") + STATUS-2 ## Gate Q4.6. Cold-verified from my own clone `/srv/cc-ci/cc-ci-adv` +(HEAD e3720be; claim cc-ci commit 588a087 confirmed `merge-base --is-ancestor`) + `ssh cc-ci` (new +Hetzner box `cc-nix-test`). I did NOT re-deploy (single-node MAX_TESTS=1, heavy recipe); I cold-read +the authoritative run log + the on-disk suite + the live node state. Findings: + +**1. RUN SUMMARY (`/root/ccci-discourse-full8.log`, mtime 04:53:51Z) — measured, not taken on trust:** +``` +===== RUN SUMMARY ===== +deploy-count = 1 (expect 1) + install : pass upgrade : pass backup : pass restore : pass custom : pass +``` +`grep -c SKIPPED|xfail` = 0. No active runner (`ps … run_recipe_ci` = NONE); no later full9 — this is +the settled final run, not in-flight. + +**2. Real upgrade-to-latest crossover (the VETO's core requirement).** Log: +`[discourse] op=upgrade base=0.7.0+3.3.1 -> head=3758522 (chaos)`; +`install: deploy version=0.7.0+3.3.1`; `upgrade: deploy to PR head 3758522 (chaos --chaos)`; +`upgrade preserves marker: ci_upgrade_marker present after upgrade`. So the published predecessor +0.7.0+3.3.1 is deployed (made deployable by the re-pin overlay), then chaos-upgraded to the PR head, +and an upgrade marker survives. This is exactly the disposition the overlay policy @16:22:07Z +MANDATED (deploy 0.7.0 via the justified re-pin overlay → upgrade to PR head) — the earlier +"upgrade-tier N/A" path was reversed by that policy and is moot. + +**3. P3 ≥2 functional, real (read bodies in my clone, confirmed PASSED in log):** +`functional/test_create_topic.py::test_create_topic_roundtrip PASSED` — mints admin via Rails → +POST /posts.json (unique uuid marker in title+body) → GET /t/.json read-back, asserts title +round-trip AND marker present in cooked body (not health-only; unique-per-run so a stale echo can't +pass). `functional/test_site_basic.py::test_site_json_has_discourse_config PASSED` — asserts /site.json +returns a Discourse-specific `categories` list (distinctive structure, > a bare 200). Meets the §4.3 +floor (create-an-object+read-back + one distinctive feature). [Advisory: site_basic is the weaker of +the two; a 2nd strong characteristic test, e.g. a reply/2nd-user read or search, would harden P3 — +not a blocker, the floor is met.] + +**4. P4 backup data-integrity NON-VACUOUS (ops.py in my clone):** `pre_backup` seeds +`ci_marker='original'` (asserts the insert committed); `pre_restore` `DROP TABLE ci_marker` and +asserts `to_regclass` is null (the drop genuinely took, so a passing restore MUST re-import — not a +no-op); `test_restore.py::test_restore_returns_state` asserts the value == 'original' post-restore. +`test_backup_captures_state` + `test_restore_returns_state` both PASSED in full8. Real +seed→backup→mutate(drop)→restore→assert. (BACKUP_VERIFY=/pg_backup_verify.sh is a read-only +gzip+nonempty probe that triggers a backup re-run on a raced dump — weakens no assertion; restore +stays the gate.) + +**5. Overlay justified, no assertion weakened (`tests/discourse/compose.ccci.yml` read in full):** +re-pins app+sidekiq `bitnami/discourse:3.3.1` → `bitnamilegacy/discourse:3.3.1` (the Docker-Hub-404 +fix I myself endorsed in REVIEW-2 §7.1-DENIED / policy §1) + a grace-only `start_period: 1200s` on +the 0.7.0 base (readiness still gated by the real healthcheck test/interval/retries) + no-op re-pins +of postgres:13 / redis:7.4-alpine to their identical base images. Nothing softens a test. The PR head +3758522 ships the literal 20m start_period + pg_backup.sh backup/restore hooks (the published recipe +had pg_dump backup but NO restore hook → silent data loss; cc-ci's P4 overlay caught it — the same +data-loss class as immich/mattermost/ghost). + +**6. Clean teardown (live node @05:33Z):** `docker stack ls` = `traefik` only; 0 discourse +services / volumes / secrets; no runner process. Matches the claim's "clean teardown". + +**VERDICT: PASS.** The Q4.6 gate as claimed — discourse full lifecycle incl upgrade-to-latest GREEN, +deploy-count=1, ≥2 real P3, non-vacuous P4, justified overlay, clean teardown — is genuinely met. +This **closes the discourse portion of the standing DONE VETO** (VETO checklist @16:22:07Z: +no-upgrade-dropped ✓, discourse-tests-upgrade-to-latest ✓, full suite green ✓, recipe-PR cc-ci-green ✓). + +**BUT NOT yet a discourse-complete DoD — P2 PARITY.md MISSING (F2-15, filed below).** This is a P2 +Definition-of-Done item, NOT a VETO-checklist item, so it does not reopen the VETO — but discourse +cannot count toward Phase-2 `## DONE` until `tests/discourse/PARITY.md` exists. Parity is genuinely +N/A (upstream `recipe-info/discourse` has no test corpus — verified absent), but §4.1 requires the +file and peers (ghost, mattermost-lts) shipped an N/A PARITY.md; discourse must too. + +(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.)