diff --git a/machine-docs/STATUS-2.md b/machine-docs/STATUS-2.md index 9e73136..9078c3d 100644 --- a/machine-docs/STATUS-2.md +++ b/machine-docs/STATUS-2.md @@ -49,22 +49,36 @@ tree must carry: - **Q5** — Completeness + docs; flip `## DONE`. ## In flight -**Q4.4 ghost — P4 + §4.3 create-post AUTHORED, full-lifecycle run IN FLIGHT (NOT claimed) @2026-05-30 -(commit `b4d03cc`).** Closes the open DEFERRED ghost create-post item + adds the missing P4 overlay. -- **WHAT authored:** `tests/ghost/` — `ops.py` + `test_{upgrade,backup,restore}.py` (P4: seed a - `ci_marker` row into the **MySQL** `ghost` DB via the `mysql` CLI in the `db` service — the recipe - is MySQL not sqlite; stale comment fixed); `functional/_ghost.py` (cookie-aware Ghost Admin API - client, stdlib http.cookiejar, Origin CSRF hdr) + `functional/test_post_roundtrip.py` (§4.3: - setup owner → session → POST published post w/ unique marker → GET read-back, title+html assert). -- **HOW to verify (Adversary, on claim):** `ssh cc-ci 'cd /root/ && git pull && RECIPE=ghost - PR=0 SRC=recipe-maintainers/ghost STAGES=install,upgrade,backup,restore,custom cc-ci-run - runner/run_recipe_ci.py'`. -- **EXPECTED:** install/upgrade/backup/custom GREEN, deploy-count=1; `test_create_post_roundtrip` - PASSED (publishing path). **P4 restore may go RED** — ghost recipe has a `mysqldump --tab` backup - pre-hook but **no `backupbot.restore.*` hook** + the mysql data volume isn't backupbot-labelled, so - the dump is never reimported (same defect class as immich#1 / mattermost-lts#1). If RED → - recipe-PR adding a mysqldump-reimport restore post-hook; NOT a weakened test. -- **WHERE:** commit `b4d03cc`; log on node `/root/ccci-ghost-full.log`. NOT yet claimed — validating. +**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). +- **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`. +- **P4 markers — backup+upgrade GREEN, restore RED (non-vacuous):** `test_upgrade_preserves_state + PASSED` + `test_backup_captures_state PASSED` (MySQL `ci_marker` in the `ghost` DB survives + upgrade + present at backup). `test_restore_returns_state FAILED` — marker did NOT survive restore + (generic `test_restore_healthy` PASSED, so app is up; my overlay caught the data loss). ROOT CAUSE: + recipe has `mysqldump --tab` backup pre-hook but **no `backupbot.restore.*` hook** + mysql data + volume not backupbot-labelled → dump never reimported. Same class as immich#1 / mattermost-lts#1. + **FIX = recipe-PR adding a mysql dump+reimport restore hook (mirror mattermost pg_backup.sh). + Ghost NOT yet mirrored on gitea (404) — must mirror first (plan §0b).** +- **TWO harness/infra fixes en route (NO test weakened):** + (1) `compose.ccci-health.yml` deploy overlay (commit `13da216`): raises app healthcheck + start_period to 900s. Ghost's ~6-9min fresh-DB migration was being killed by the recipe's 1m-grace + healthcheck mid-flight, leaving a stale `migrations_lock` → `MigrationsAreLockedError` deadlock (hit + on BOTH 2- and 4-vCPU; round-trip-bound, not CPU). Overlay validated working: migration ran past + the old kill point, install converged 1/1. Wired via COMPOSE_FILE + install_steps.sh + + CHAOS_BASE_DEPLOY. + (2) `generic.assert_upgraded` (commit `a7e2af4`): strip abra's `+U` untracked-tree marker from + chaos-version before the HC1 commit match. The untracked overlay makes abra stamp + `chaos-version='+U'`; the commit equals head_ref (HC1 ok) but `+U` broke the exact-prefix + match → spurious upgrade FAIL. Fix preserves HC1. **Needs a re-run to confirm upgrade now PASSES.** +- **NEXT:** (a) re-run to confirm upgrade-tier GREEN with `a7e2af4`; (b) mirror ghost + recipe-PR for + the mysql restore hook; (c) final green full-lifecycle run with the PR (restore→GREEN); then CLAIM. +- **Operator note:** cc-ci VM bumped 2→4 vCPU, sole VM on b1 (mid-session). Heavy ghost migration + still needs the healthcheck overlay regardless (round-trip-bound). **Q3.5 immich — ✅ Adversary PASS @2026-05-30 (REVIEW-2 `11c5498`).** Cold full lifecycle GREEN, deploy-count=1, real upgrade crossover, P4 restore `test_restore_returns_state` PASSED (non-vacuous;