# STATUS — phase `canon` (canonical sweep, make it real) Gate: M1 IN PROGRESS (not yet claimed). WHAT/HOW/EXPECTED/WHERE for the Adversary. Reasoning lives in JOURNAL-canon.md. ## Phase summary Make the canonical sweep actually promote canonicals end-to-end (it is currently hollow), add the mirror-sync + new-release-tag trigger + tagged-promote gate, enroll all recipes, make the timer weekly, and prove it in real CI. DoD = §5 of `cc-ci-plan/plan-phase-canon-canonical-sweep.md`. ## Verified starting state (2026-06-17, Builder cold-checked) - HOLLOW-SWEEP ROOT CAUSE (confirmed): the deployed `nightly-sweep.timer` fired 03:09 UTC and logged `enrolled canonicals = []`. Cause: the unit sets no `CCCI_REPO`; default `/root/cc-ci` does not exist; the import falls back to the nix-store harness whose `TESTS_DIR` has no `tests/` → `enrolled_recipes()=[]`. Verify: `ssh cc-ci 'journalctl -u nightly-sweep.service | grep "enrolled canonicals"'`. - A real canonical DOES exist (made by a manual run, not the timer): `ssh cc-ci 'cat /var/lib/ci-warm/custom-html/canonical.json'` → version `1.13.0+1.31.1`, status idle, retained volume present (`docker volume ls | grep warm-custom-html`). - Enroll set (authoritative) = `cc-ci-plan/used-recipes.md` (21 recipes). Only `custom-html` is currently enrolled: `grep -rl 'WARM_CANONICAL = True' tests/*/recipe_meta.py`. - Timer is daily: `nix/modules/nightly-sweep.nix` `OnCalendar = "*-*-* 03:00:00"`. - Disk `/`: 40G free / 73% used (`ssh cc-ci df -h /`). ## M1 progress (code COMPLETE; live proofs in flight — not yet claimed) All M1 code landed + unit-tested + lint-clean (full unit suite 295 passed): - M1.1 tagged-promote gate (27e0628) + divergence fix (d4cc9e4): `should_promote_canonical` gains `tagged`; promote records the TESTED `head_version` (a release tag), not a re-derived latest. `warm_reconcile.is_released_version`. Tests: `tests/unit/test_promote.py`, `test_warm_reconcile.py`. - M1.2 release-tag trigger + mirror-sync (a20890a): `warm_reconcile.sweep_decision` (pure, version_key keyed), `scripts/recipe-mirror-sync.sh` (faithful main+tags sync, closes merged-upstream PRs), `nightly_sweep` rewritten (mirror_sync → trigger → run_on_tag = checkout tag + CCCI_SKIP_FETCH). - M1.3 all 21 used-recipes enrolled (136100f). M1.4 hollow-sweep fix + M1.5 weekly timer (f8c0e53). Mirror-sync smoke-tested live on custom-html (faithful no-op push; closed merged-upstream PR #2; left pending PR #5). Live M1(A) proofs in progress on cc-ci from checkout /root/canon-verify @ d4cc9e4: - A-promote: `nightly_sweep.run_on_tag('custom-html','1.13.0+1.31.1')` → expect fresh canonical.json. ## Claims awaiting verification (M1 claim pending live-proof completion) ## Blocked (none)