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:
@ -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
|
||||
|
||||
@ -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.)
|
||||
|
||||
Reference in New Issue
Block a user