All checks were successful
continuous-integration/drone/push Build is passing
M1 (machinery works locally, each piece proven) — code HEAD d4cc9e4, unit suite 295 passed:
- M1.1 tagged-promote gate + promote-tested-version: live proof-A wrote a fresh canonical
(commit df2e273 = the tag commit, correcting samever's main-HEAD 2b82eba); live proof-C
green-untagged → 0 promotes, canonical byte-identical (tagged-gate blocks untagged).
- M1.2 sweep_decision (version-keyed trigger) + vendored faithful recipe-mirror-sync.sh
(smoke-tested: faithful no-op main/tags push, closed merged-upstream PR #2, left PR #5);
nightly_sweep rewritten (mirror_sync -> trigger -> run_on_tag). Live SKIP demo on custom-html.
- M1.3 all 21 used-recipes enrolled. M1.4 hollow-sweep fix (CCCI_REPO=/etc/cc-ci). M1.5 weekly timer.
- M1(A) reattach: live proof-B --quick reused the retained volume green; known-good unchanged.
Evidence + verify recipes in STATUS-canon.md; reasoning in JOURNAL-canon.md; DECISIONS appended.
Gate: M1 CLAIMED, awaiting Adversary.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3.7 KiB
3.7 KiB
BACKLOG — phase canon
Build backlog (Builder-owned)
Milestone map → Definition of Done (§5). M1 = machinery + unit tests (Adversary cold-verifies the pieces). M2 = proven end-to-end in real CI.
M1 — machinery works locally, each piece proven
- M1.1 Tagged-promote gate (§2.A). Extend
should_promote_canonicalto ALSO require the tested head version corresponds to a published release tag. Add atagged: boolparam computed at the call site (head_version in recipe_tags(recipe)); keep the function pure. Untagged head → no promote. Unit tests: enrolled+green+cold+not-ref+tagged → True; each missing condition (incl. untagged) → False. - M1.2 Release-tag trigger + mirror-sync in the sweep (§2.C/§2.D). New pure helper
sweep_decision(recipe, latest_tag, canon_version)→run|skip:no-new-version|skip:never-released, keyed onversion_key(NOT commit). Wirenightly_sweep.sweep()to, per enrolled recipe: (1) faithful mirror-sync main+tags to upstream (reuse open-recipe-pr.sh--reconcile-only, vendored into the repo for reproducibility); (2) compute latest release tag vs canonical; (3) skip or run cold ON THE TAG (checkout tag +CCCI_SKIP_FETCH=1). Unit tests forsweep_decision(new tag → run; equal → skip; older/no tag → skip). - M1.3 Enroll all recipes (§2.B). Set
WARM_CANONICAL = Truein each of the 21 used-recipestests/<r>/recipe_meta.py. Leave fixtures (custom-html-*-bad, concurrency, regression) alone. - M1.4 Hollow-sweep fix (root cause). Make the deployed sweep read the REAL tests/ + run
current code: set
CCCI_REPO=/etc/cc-ciin the sweep service and runnightly_sweep.pyfrom the checkout (not the store copy). Deploy procedure pulls/etc/cc-cibefore nixos-rebuild. - M1.5 Weekly timer (§2.F).
nightly-sweep.nixOnCalendardaily → weekly (one line),Persistent=true(already set). Low-traffic slot.
M2 — proven end-to-end in real CI
- M2.1 Deploy the M1 changes:
git -C /etc/cc-ci pull+nixos-rebuild switch; verify host health after. - M2.2 Full sweep run across the enrolled set on cc-ci: mirrors synced, canonicals promoted for green recipes (records with correct version+commit), red recipes left intact, no-new-tag recipes skipped. Per-recipe results log captured.
- M2.3 Determinism proof: run the sweep a SECOND time immediately → every recipe SKIPS (latest tag == canonical for all) = clean no-op, no CI rerun.
- M2.4 Tagged-promote proof: a green run on an UNTAGGED state does NOT promote; a green run on a TAGGED release DOES. Construct if the live set doesn't cover it.
- M2.5 Real (non-hollow) timer fire: after a timer fire, canonicals have ADVANCED (evidence), not exit-0 on an empty set.
- M2.6 samever orthogonality: (a) no new tag (even with untagged commits on main) → SKIP, no upgrade-tier run, no promote; (b) new tag → cold-test new tag, canonical(older)→new, promote. Show step-back never fires inside the sweep.
- M2.7 Disk budget recorded; all recipes enrolled (or documented exception in DECISIONS).
- M2.8 §2.G UPGRADE_BASE_VERSION retirement — after plausible's canonical lands at 3.0.1: remove the pin, confirm dynamic base resolves 3.0.1 + passes; if it holds, strip the key (meta KEYS, resolver branch, docs, unit tests) + update bluesky-pds comment. Else KEEP with a recorded reason in DECISIONS.
Notes
- Order within M1: M1.1 → M1.2 (depend on version helpers) → M1.3/M1.4/M1.5 (config). Claim M1 only when all unit tests green + tree clean + pushed.