# STATUS — phase cfold (custom-folder collapse) **Phase:** cfold — collapse `functional/`+`playwright/` into `custom/` **Builder:** autonomic-bot **Updated:** 2026-06-12 --- ## M1 — PASS Gate result: `REVIEW-cfold.md` 2026-06-12T16:20Z -> **M1 PASS** Inputs for verification: - Implementation commit: `44e0242` (`feat(cfold): canonicalize custom test layout`) Completed in this checkpoint: - discovery.py: `custom/` canonical + deprecated aliases with warnings - `git mv` all 64 custom tests (60 functional + 4 playwright) across 20 recipes - helper modules moved alongside their tests into `custom/` - sys.path refs updated in mailu lifecycle overlays - docs updated (`README.md`, `recipe-customization.md`, `testing.md`, `enroll-recipe.md`) - unit tests updated (`test_discovery.py`, `test_discovery_phase2.py`, `test_manifest.py`) - manifest.py now reports canonical `custom` counts WHAT: - M1 implementation is complete: custom-test discovery is canonicalized to `custom/`, deprecated aliases warn loudly instead of silently dropping coverage, all cc-ci custom tests/helpers moved to `tests//custom/`, manifest counts are canonicalized, and the placement-rule docs/unit tests were updated. HOW: - `git ls-files "tests/*/custom/test_*.py" | wc -l` - `git ls-files "tests/*/functional/*" "tests/*/playwright/*"` - `for recipe in bluesky-pds cryptpad custom-html custom-html-tiny discourse drone ghost hedgedoc immich keycloak lasuite-docs lasuite-drive lasuite-meet mailu matrix-synapse mattermost-lts mumble n8n plausible uptime-kuma; do count=$(git ls-files "tests/$recipe/custom/test_*.py" | wc -l); printf "%s %s\n" "$recipe" "$count"; done` - `nix shell nixpkgs#python311Packages.pytest -c pytest tests/unit/test_discovery.py tests/unit/test_discovery_phase2.py tests/unit/test_manifest.py -q` EXPECTED: - Total canonical custom tests: `64` - Old tracked trees: no output for `functional/*` or `playwright/*` - Per-recipe counts exactly match the baseline table below - Focused unit suite: `18 passed` WHERE: - Discovery + alias warnings: `runner/harness/discovery.py` - Canonical manifest counts: `runner/harness/manifest.py` - Migrated custom tests/helpers: `tests/*/custom/` - Focused unit coverage: `tests/unit/test_discovery.py`, `tests/unit/test_discovery_phase2.py`, `tests/unit/test_manifest.py` - Placement-rule docs: `docs/recipe-customization.md`, `docs/testing.md`, `docs/enroll-recipe.md`, `README.md` Adversary verdict: - `machine-docs/REVIEW-cfold.md` lines 52-77 - PASS facts include: 64 canonical custom tests, zero old tracked custom trees, focused unit suite `18 passed`, deprecated-alias warning probe green, normalized `(recipe, filename)` coverage set preserved exactly (`missing []`, `extra []`). --- ## M2 — IN PROGRESS Current work item: - full real-CI `!testme` sweep evidence is mostly assembled; one recipe (`ghost`) remains non-green for a cfold-neutral upgrade regression on the recipe/environment side ### M2 baseline matrix (built from live PR heads + fresh post-cfold evidence) | Recipe | PR / ref | Expected level | Custom tests | Fresh evidence | |---|---|---:|---:|---| | bluesky-pds | PR #2 `f7b6c8df` | 5 | 4 | build `556` -> L5 | | cryptpad | PR #5 `9c18c176` | 5 | 4 | build `554` -> L5 | | custom-html | PR #2 `db9a9502` | 5 | 4 | build `541` -> L5 | | custom-html-tiny | PR #7 `526502ba` | 5 | 1 | build `510` -> L5 | | discourse | PR #2 `b7d8a244` | 5 | 3 | build `521` -> L5 | | drone | PR #1 `049438e1` | 5 | 1 | build `506` -> L5 | | ghost | PR #4 `d88f5801` | 5 | 4 | build `557` -> L1 (upgrade fail) | | hedgedoc | PR #1 `441c411c` | 5 | 2 | build `555` -> L5 | | immich | PR #2 `17f1649c` | 5 | 3 | build `522` -> L5 | | keycloak | PR #3 `bfe0d16f` | 5 | 3 | build `553` -> L5 | | lasuite-docs | PR #5 `8a06cfc2` | 5 | 5 | build `523` -> L5 | | lasuite-drive | PR #2 `6771622b` | 5 | 3 | build `524` -> L5 | | lasuite-meet | PR #6 `05cdafb5` | 5 | 3 | build `525` -> L5 | | mailu | PR #4 `682ccaaa` | 5 | 3 | build `526` -> L5 | | matrix-synapse | PR #2 `72f0176a` | 5 | 3 | build `527` -> L5 | | mattermost-lts | PR #2 `966c6d61` | 5 | 3 | build `529` -> L5 | | mumble | PR #1 `2b50b2f7` | 5 | 5 | build `558` -> L5 | | n8n | PR #5 `989c44b3` | 5 | 4 | build `528` -> L5 | | plausible | PR #3 `709a294d` | 5 | 2 | build `530` -> L5 | | uptime-kuma | PR #3 `b0ce7942` | 5 | 4 | build `531` -> L5 | ### Ghost deviation (blocking a formal M2 claim) `ghost` is the only recipe still preventing an M2 claim. - Current upgrade PR head `d88f5801` (PR #4) failed again in build `557`: install/backup/restore/custom all passed, but the upgrade op paused and rolled back before any upgrade-tier assertions could run. - To isolate cfold from recipe-head drift, a separate probe PR #5 was opened at Ghost's last known-green PR head `d42d0f7c` (historical build `185` = L4/L5-equivalent on 2026-06-05). That probe re-failed in build `559` with the same upgrade pause: install/backup/restore/custom all passed, upgrade failed. - Conclusion so far: Ghost's current failure is not caused by the `custom/` folder migration; the custom tier still discovers and passes all 4 canonical custom tests, and the regression reproduces on the previously-green Ghost head as an upgrade convergence failure. ### Fresh Adversary state - `REVIEW-cfold.md` 2026-06-12T22:05:50Z: idle audit only, no new finding, no M2 claim pending. --- ## Baseline (pre-cfold) — custom test count per recipe | Recipe | Count | |--------|-------| | bluesky-pds | 4 | | cryptpad | 4 | | custom-html | 4 | | custom-html-tiny | 1 | | discourse | 3 | | drone | 1 | | ghost | 4 | | hedgedoc | 2 | | immich | 3 | | keycloak | 3 | | lasuite-docs | 5 | | lasuite-drive | 3 | | lasuite-meet | 3 | | mailu | 3 | | matrix-synapse | 3 | | mattermost-lts | 3 | | mumble | 5 | | n8n | 4 | | plausible | 2 | | uptime-kuma | 4 | | **TOTAL** | **64** |