diff --git a/JOURNAL-rcust.md b/JOURNAL-rcust.md index 4dfd553..45fae1d 100644 --- a/JOURNAL-rcust.md +++ b/JOURNAL-rcust.md @@ -8,3 +8,36 @@ be `restructure/recipe-custom` off main @ 76a4b6b. Starting P1: reading the six (run_recipe_ci.py::_load_meta, conftest.py::_recipe_meta, lifecycle.py::_recipe_extra_env, lifecycle.py::_recipe_meta_flag, deps.py::declared_deps, canonical.py::is_canonical_enrolled) before writing harness/meta.py. + +## 2026-06-10 P1 — single loader + registry (branch 472a68b) + +Wrote runner/harness/meta.py: KEYS registry (14 keys + CHAOS_BASE_DEPLOY/OIDC_AT_INSTALL/ +SKIP_GENERIC kept registered as deprecated=True so P1 lands green before P2 deletes them), +RecipeMeta generated from KEYS via dataclasses.make_dataclass (frozen; field set cannot drift from +the registry), load() = the only exec() of recipe_meta.py, MetaError on unknown ALL-CAPS/type +mismatch/callable-on-data-key, difflib suggestion in the unknown-key message. BACKUP_CAPABLE keeps +its tri-state via default None (None = auto-detect — preserves the old `"BACKUP_CAPABLE" in meta` +semantics in generic.backup_capable). + +Migrations: orchestrator loads once + passes meta down (deploy_app/perform_upgrade/_perform_op/ +run_lifecycle_tier all take the object); conftest meta fixture returns full RecipeMeta (R3 closed); +lifecycle._recipe_extra_env/_recipe_meta_flag and deps.declared_deps deleted; canonical.is_enrolled ++ enrolled_recipes go through meta.load (tests monkeypatch meta.TESTS_DIR now instead of +canonical.__file__); screenshot._load_screenshot_hook reads the attribute (R2 fixed — unit test +proves SCREENSHOT survives the real orchestrator load path). deploy_app keeps an optional +meta=None fallback (loads via the single loader) for fixture/manual callers — exec still happens +in exactly one function. + +Effective-value safety check before committing: dumped non_default() for all 21 recipe dirs through +the new loader — every recipe's customized key set matches its recipe_meta.py source (e.g. mumble: +DEPLOY_TIMEOUT/EXTRA_ENV/HEALTH_OK/READY_PROBE/UPGRADE_EXTRA_ENV). One intentional delta class: +deps.deploy_deps' fallback timeouts for a MISSING dep meta change from literal 900/600 to loading +the dep's real meta (orchestrator path always supplied metas, so CI behavior is identical). + +Verified on cc-ci (rsynced working tree before committing): + cc-ci-run -m pytest tests/unit -q -> 175 passed + nix develop .#lint --command scripts/lint.sh -> lint: PASS +Three pre-existing f212 unit tests passed dicts to wait_ready_probes — updated mechanically to +construct RecipeMeta via dataclasses.replace (assertions untouched). + +Next: P2a compose.ccci.yml first-class + auto-chaos. diff --git a/STATUS-rcust.md b/STATUS-rcust.md index 16b2a71..0ff9f41 100644 --- a/STATUS-rcust.md +++ b/STATUS-rcust.md @@ -6,17 +6,28 @@ Work branch: `restructure/recipe-custom` (one commit per phase P1–P6; merged t ## Phase progress -- [ ] P1 — harness/meta.py single loader + key registry + migrate L1–L6 + unit tests + doc gen +- [x] P1 — single loader + key registry + migrate L1–L6 + unit tests + doc gen + (branch commit 472a68b) - [ ] P2 — delete legacy keys/paths (CHAOS_BASE_DEPLOY, OIDC_AT_INSTALL, SKIP_GENERIC meta, conftest cleanup) - [ ] P3 — uniform ctx hook convention - [ ] P4 — custom-test ergonomics (placement rule, op_state/deps fixtures) - [ ] P5 — customization manifest - [ ] P6 — docs +## P1 verification facts (for the eventual M1 cold-verify) + +- WHERE: branch `restructure/recipe-custom`, commit 472a68b. +- HOW: `cc-ci-run -m pytest tests/unit -q` and `nix develop .#lint --command scripts/lint.sh` + from a clean checkout of the branch. +- EXPECTED: 175 passed; `lint: PASS`. +- New single loader: `runner/harness/meta.py::load()`; all-recipes typo gate + R2 proof in + `tests/unit/test_meta.py`; docs §4 table generated by `scripts/gen-meta-docs.py` (sync pinned + by unit test). + ## Gate -(none claimed yet — phase bootstrap) +(none claimed yet — M1 claims only after P1–P6 complete on the branch) ## Current -Bootstrapping phase; starting P1. +P1 done; starting P2 (legacy key/path deletion).