claim(Q4.4): ghost full lifecycle GREEN — P3 create-post + P4 data-integrity (incl restore) via recipe-PR #1

All 5 tiers + create-post pass, deploy-count=1, upgrade crossover 1.1.1->1.3.0 (chaos-version
6d6227f7+U), P4 restore non-vacuous (catalogue/no-fix negative control RED 'ci_marker doesn't
exist'), clean teardown. recipe-maintainers/ghost#1 adds the mysqldump backup+reimport-on-restore
hook (was backup-but-no-restore, immich/mattermost class). Healthcheck overlay + +U HC1 fix en route.
Closes DEFERRED ghost create-post. Log /root/ccci-ghost-pr1d.log. Awaiting Adversary.
This commit is contained in:
2026-05-30 07:26:35 +01:00
parent 424ef16174
commit 109229bd88
2 changed files with 46 additions and 6 deletions

View File

@ -132,7 +132,11 @@ before the build is called done) — but does **not** force closure.
that requires Socket.IO client primitives in the harness (whichever comes first).
- **Linked IDEA:** `cc-ci-plan/IDEAS.md`*Optional `--extra` flag for heavy/operational tests*.
### 2026-05-28 — ghost create-a-post round-trip (§4.3 prescribed)
### 2026-05-28 — ghost create-a-post round-trip (§4.3 prescribed) — ✅ RESOLVED @2026-05-30
- [x] **RESOLVED @2026-05-30 (Builder):** `tests/ghost/functional/test_post_roundtrip.py` (helper
`_ghost.py`) authored + GREEN (`test_create_post_roundtrip PASSED`, full-lifecycle run
`/root/ccci-ghost-pr1d.log`). Owner setup → admin session cookie → POST published post (unique
marker) → GET read-back (title+html). Part of the Q4.4 ghost claim (STATUS-2 ## Gate Q4.4).
- [ ] **What:** Add `tests/ghost/functional/test_post_roundtrip.py` exercising Ghost's admin setup
+ token-auth + POST `/ghost/api/v3/admin/posts/` (create) + GET
`/ghost/api/v3/admin/posts/<id>/` (read back), asserting the post round-trips.

View File

@ -49,10 +49,15 @@ tree must carry:
- **Q5** — Completeness + docs; flip `## DONE`.
## In flight
**Q4.4 ghost — P3 create-post GREEN + P4 overlays NON-VACUOUS; restore gap → recipe-PR PENDING; NOT
claimed @2026-05-30.** Full-lifecycle run-4 (`/root/ccci-ghost-4.log`, commit `13da216`+`a7e2af4`)
RESULTS: deploy-count=1; **install PASS, backup PASS, custom PASS**; upgrade FAIL (now fixed, see
below); restore FAIL (real recipe gap, see below).
**Q4.4 ghost — ✅ FULL LIFECYCLE GREEN — CLAIMED @2026-05-30, awaiting Adversary (see ## Gate Q4.4).**
Final run `/root/ccci-ghost-pr1d.log` (`RECIPE=ghost PR=1 REF=6d6227f7 SRC=recipe-maintainers/ghost`):
deploy-count=1; **install/upgrade/backup/restore/custom ALL PASS**; create-post P3 PASSED; P4 restore
`test_restore_returns_state PASSED` (ci_marker survived backup→restore) — non-vacuous (catalogue/no-fix
runs had it RED `ci_marker doesn't exist`); upgrade crossover 1.1.1→1.3.0 (PR head, chaos-version
`6d6227f7+U`); clean teardown. Detail below + ## Gate Q4.4.
**(history) run-4 (`/root/ccci-ghost-4.log`, `13da216`+`a7e2af4`):** deploy-count=1; install/backup/
custom PASS; upgrade FAIL (then-fixed `+U`); restore FAIL (then-fixed via recipe-PR #1).
- **P3 create-post — GREEN:** `tests/ghost/functional/test_post_roundtrip.py::test_create_post_roundtrip
PASSED (22s)` — owner setup → admin session (cookie) → POST published post (unique marker) → GET
read-back, title+html asserted. Closes the DEFERRED ghost create-post item. Helper `_ghost.py`.
@ -263,7 +268,38 @@ SKIP no longer yields a GREEN `!testme`.
## Gate
**Gate: Q4.3 bluesky-pds — ✅ Adversary PASS @2026-05-30 (REVIEW-2 `e45e0ee`).** Cold full lifecycle
**Gate: Q4.4 ghost — CLAIMED @2026-05-30, awaiting Adversary.** Full lifecycle GREEN with recipe-PR;
P3 create-post + P4 data-integrity (incl. restore) real & non-vacuous.
- **WHAT:** Q4.4 ghost — P1 coverage (full green install+upgrade+backup-restore), P3 (§4.3 create-post
round-trip), P4 (MySQL `ci_marker` survives upgrade + backup + **restore**), P2 N/A (no
recipe-maintainer corpus — documented in `tests/ghost/PARITY.md`). Restore made green by recipe-PR
`recipe-maintainers/ghost#1` (adds a mysqldump backup + reimport-on-restore hook; published recipe
had backup-but-no-restore → silent data loss, same class as immich#1 / mattermost-lts#1).
- **HOW (Adversary cold-verify, own clone):**
`RECIPE=ghost PR=1 REF=6d6227f7ba62435256274073c6bd2d2187c994fc SRC=recipe-maintainers/ghost
STAGES=install,upgrade,backup,restore,custom cc-ci-run runner/run_recipe_ci.py`
Negative control (proves P4-restore non-vacuous): run **without** the PR
(`RECIPE=ghost PR=0 SRC=recipe-maintainers/ghost STAGES=install,upgrade,backup,restore,custom`) →
`test_restore_returns_state` FAILS `Table 'ghost.ci_marker' doesn't exist` (catalogue 1.2.0, no
restore hook). create-post: read `tests/ghost/functional/test_post_roundtrip.py` (setup owner →
admin session cookie → POST published post w/ unique marker → GET read-back, title+html asserted).
- **EXPECTED:** RUN SUMMARY `deploy-count = 1`; `install/upgrade/backup/restore/custom` all `pass`;
`tests/ghost/functional/test_post_roundtrip.py::test_create_post_roundtrip PASSED`;
`tests/ghost/test_restore.py::test_restore_returns_state PASSED` (ci_marker='original' read back);
`tests/ghost/test_backup.py::test_backup_captures_state PASSED`; `test_upgrade_preserves_state
PASSED`; upgrade crossover `1.1.1+6-alpine → 1.3.0+6.21.2-alpine`, chaos-version `6d6227f7+U`
(= PR head, the `+U` untracked-overlay marker tolerated by the `a7e2af4` HC1 fix); clean teardown.
- **WHERE:** cc-ci commits — ghost tests `b4d03cc`, healthcheck overlay `13da216`, `+U` HC1 fix
`a7e2af4`. Recipe-PR `git.autonomic.zone/recipe-maintainers/ghost#1` branch `ci/mysql-backup` head
`6d6227f7ba62435256274073c6bd2d2187c994fc`. Builder full-run log on node `/root/ccci-ghost-pr1d.log`.
- **ENV NOTE (non-blocking):** ghost cold-boot needs the cc-ci healthcheck overlay
(`compose.ccci-health.yml`, start_period 900s) or the ~6-9min fresh MySQL migration is killed →
`migrations_lock` deadlock (DECISIONS 2026-05-30). The mysql:8.0 db healthcheck is ALSO flaky on
cold init (one task may exit137 "unhealthy" then recover 1/1; one install timed out once, pr1c) —
**if a cold-verify install flakes, retry** (it converged on retry, pr1d). Round-trip-bound, not CPU.
GREEN, deploy-count=1, real upgrade crossover 0.1.1+v0.4→0.2.0+v0.4, P4 atproto account-marker survives
backup→restore (non-vacuous, in-band delete-assert), 2 distinct P3 functional, clean teardown. No veto.
DONE. (Claim detail retained below.)