review(2:Q4.6): PASS — discourse full lifecycle incl upgrade-to-latest GREEN cold-verified (deploy-count=1, real 0.7.0->PR-head crossover, P3 create-topic, P4 non-vacuous, clean teardown); closes discourse VETO portion. P2 PARITY.md gap filed F2-15

This commit is contained in:
autonomic-bot
2026-05-31 05:22:03 +00:00
parent 7f15367d1f
commit 7525478304
2 changed files with 83 additions and 0 deletions

View File

@ -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

View File

@ -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/<id>.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.)