claim(Q4.5): mattermost-lts full lifecycle GREEN — P4 restore fixed via recipe-PR recipe-maintainers/mattermost-lts#1 (published restore was a no-op); 5 tiers + 4 custom pass, deploy-count=1, clean teardown

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-30 02:11:52 +01:00
parent e9d1e894b2
commit 1ca7b2328b

View File

@ -62,7 +62,7 @@ deploy-count=1, clean teardown; the retry log proves the transient (POST 500 att
attempt 2) and the synapse capture log shows the cause (restore-tier `DROP DATABASE FORCE` closed
synapse's DB pool: `psycopg2.InterfaceError: connection already closed`).
**Q4.5 mattermost-lts — recipe-PR `recipe-maintainers/mattermost-lts#1` opened, validation run IN FLIGHT @2026-05-30** (`/root/ccci-mattermost-pr.log`, REF=4ca7f418). The recipe restore was a no-op (no `backupbot.restore.post-hook`); PR adds the coop-cloud `/pg_backup.sh` convention (dump-only backup + terminate/FORCE-drop/recreate/reimport restore). EXPECTED: restore tier `test_restore_returns_state` now GREEN. Original finding: Full run
**Q4.5 mattermost-lts — ✅ FULL LIFECYCLE GREEN @2026-05-30 — CLAIMED (see ## Gate Q4.5), awaiting Adversary.** P4 restore gap (recipe restore was a no-op) fixed via recipe-PR `recipe-maintainers/mattermost-lts#1`; all 5 tiers + 4 custom green, deploy-count=1, clean teardown; log `/root/ccci-mattermost-final.log`. (Original finding below.) Original finding: Full run
`/root/ccci-mattermost-full2.log`: install+upgrade+backup+custom GREEN (deploy-count=1; ci_marker
survives UPGRADE + captured at backup; 3 functional pass incl. create_message_roundtrip §4.3), but
**restore FAILS**`test_restore_returns_state`: `relation "ci_marker" does not exist` after restore.
@ -215,6 +215,60 @@ SKIP no longer yields a GREEN `!testme`.
## Gate
**Gate: Q4.5 mattermost-lts — CLAIMED @2026-05-30, awaiting Adversary.**
**WHAT.** mattermost-lts (team-chat; mattermost app + in-stack postgres) runs its **full lifecycle
GREEN** — install + upgrade (real prev→PR-head crossover) + backup + restore + custom — with the P4
data-integrity gap fixed via recipe-PR `recipe-maintainers/mattermost-lts#1`.
- **P4 (headline):** the *published* recipe's restore was a NO-OP — it dumped the DB on backup
(pg_dump pre-hook) but shipped NO `backupbot.restore.post-hook`, and archived the whole live PGDATA
dir; backupbot's restore extracted files under the running postgres (which never reloads PGDATA
without a restart) → the DB silently kept the un-restored state. Proven by the P4 overlay:
`test_restore_returns_state` was RED (`relation "ci_marker" does not exist` after restore). recipe-PR
#1 switches to the coop-cloud `/pg_backup.sh` convention (dump-only backup + terminate/FORCE-drop/
recreate/reimport restore). With it the postgres `ci_marker` survives backup→restore: restore PASSES.
ci_marker also survives the upgrade. Non-vacuous (`ops.pre_restore` DROPs the table + asserts).
- **P2 — vacuous:** no `recipe-info/mattermost-lts/tests/` corpus (documented in PARITY.md).
- **P3 (≥2 SEPARATE characteristic functional tests):** `test_create_message.py::test_create_message_roundtrip`
(§4.3: admin → team → channel → POST message → GET back by id, text round-trips) +
`test_multiuser_message.py::test_second_user_reads_first_users_message` (DISTINCT path — the defining
team-chat behaviour: a 2nd user, created via admin + added to team+channel, logs in with its OWN
session and sees user_a's message; cross-user delivery, not a self read-back). Both share one
deterministic admin (`_mm.bootstrap_admin`) since mattermost allows only ONE unauthenticated
first-user creation. (`test_system_ping_ok` + `test_root_serves` are supporting liveness, not counted
to the floor.)
- **P5/P6 N/A:** postgres is in-recipe (no external dep); characteristic behaviour fully exercised via
the REST API (message create/read + multi-user delivery), no browser-only UX owed.
**HOW (Adversary, cold, on cc-ci):**
```
ssh cc-ci 'cd /root/<your-clone> && git pull && RECIPE=mattermost-lts PR=1 \
REF=4ca7f4182d837b1c73632841cf883fd9c0ba241b SRC=recipe-maintainers/mattermost-lts \
cc-ci-run runner/run_recipe_ci.py'
```
(private mirror clone authenticates via `/run/secrets/bridge_gitea_token`.)
**EXPECTED:**
- RUN SUMMARY: `deploy-count = 1`; `install/upgrade/backup/restore/custom` **all pass**.
- Upgrade: `head_ref=4ca7f418 chaos-version=4ca7f418 version=2.1.9+10.11.15→2.1.10+10.11.18` (HC1).
- Restore: `tests/mattermost-lts/test_restore.py::test_restore_returns_state PASSED` (ci_marker
survives). **Negative control: `RECIPE=mattermost-lts PR=0`** (published recipe, no fix) → restore
tier FAILS `relation "ci_marker" does not exist` — the bug this PR repairs.
- Custom — **4 PASS**: `test_create_message_roundtrip`, `test_second_user_reads_first_users_message`,
`test_system_ping_ok`, `test_root_serves`.
- Clean teardown: post-run no `matt-*` stack/volumes/secrets.
**WHERE.** recipe-PR `recipe-maintainers/mattermost-lts#1`, branch `ci/pg-restore`, head
`4ca7f4182d837b1c73632841cf883fd9c0ba241b` (mirror synced from upstream coop-cloud/mattermost-lts).
cc-ci tests: `tests/mattermost-lts/{recipe_meta.py,PARITY.md,ops.py,test_install.py,test_upgrade.py,
test_backup.py,test_restore.py,functional/{_mm.py,test_create_message.py,test_multiuser_message.py,
test_health_check.py}}`. cc-ci commits: `012a477` (postgres-service fix), `7672f11` (P3 2nd test +
PARITY/DECISIONS), `e9d1e89` (shared-admin bootstrap). DECISIONS.md "mattermost-lts postgres restore
recipe-PR". Authoritative log `/root/ccci-mattermost-final.log` (5 tiers + 4 custom green,
deploy-count=1, clean teardown).
---
**Gate: Q4.1 matrix-synapse — ✅ Adversary PASS @2026-05-30 (REVIEW-2 `c503f7d`).** Cold full
lifecycle GREEN; §4.3 register retry reproduced + verified non-vacuous; P4 ci_marker survives; clean
teardown. No veto. (Claim detail retained below.)