7.1 KiB
JOURNAL — phase cfold
2026-06-11 — Phase cfold start
Investigation findings
Pre-existing test layout:
- 60 files in
functional/subdirs across 20 recipes - 4 files in
playwright/subdirs (cryptpad, custom-html, uptime-kuma) - Helper modules to move:
_discourse.py,_ghost.py,_mailu.py,_mm.py,_mumble_proto.py,drone/functional/__init__.py mailu/test_backup.py,test_restore.py,ops.pyexplicitly addfunctional/to sys.path — need updating tocustom/
Decision: deprecated aliases
Per plan §2 option (RECOMMENDED): keep recognizing functional//playwright/ as deprecated aliases
AND emit a loud one-line warning when a test is found in a deprecated folder. Using warnings.warn()
at import time of discovery or print() directly. Will use print() (stderr) so it shows up in CI
logs without needing to configure warning filters.
Implementation: subdirs = ("custom", "functional", "playwright") — canonical first — and after
finding a test in functional/ or playwright/, emit:
print(f"WARNING [cfold]: test found in deprecated folder '{sub}/' — move to custom/: {path}", flush=True, file=sys.stderr)
This way:
custom/is canonical and gets discovered first- Old folders still work (zero breakage for repo-local tests) but emit a loud warning
- No silent coverage loss possible
2026-06-12 — M1 checkpoint: canonical custom/ layout landed locally
Code/work completed:
runner/harness/discovery.py: canonicalcustom/discovery, deprecated alias warnings, andcustom_subdir_label()normalization helper.runner/harness/manifest.py: custom-test counts now normalize to canonicalcustom.- all cc-ci custom tests/helper modules moved from
tests/<recipe>/{functional,playwright}/intotests/<recipe>/custom/. - helper-import fallout fixed where needed (
tests/mailu/{ops.py,test_backup.py,test_restore.py}). - docs updated to describe
custom/as the canonical layout and explain the alias-compatibility window.
Mechanical move summary:
- 64 custom test files relocated into
custom/ - helper modules relocated too:
_discourse.py,_ghost.py,_mailu.py,_mm.py,_mumble_proto.py,tests/drone/custom/__init__.py
Verification:
nix shell nixpkgs#python312Packages.pytest --command pytest \
tests/unit/test_discovery.py tests/unit/test_discovery_phase2.py tests/unit/test_manifest.py -q
# ..................
# 18 passed in 0.09s
Post-move grep state:
- remaining
functional//playwright/matches in live code are intentional: alias-policy docs, deprecated-folder assertions in the unit tests, and discovery comments describing the alias behavior. - the pre-migration inventory in
BACKLOG-cfold.mdis intentionally unchanged because it is the M1 baseline record the Adversary will compare against.
2026-06-12 — M1 coverage proof assembled
Verification commands + observed outputs:
$ git ls-files "tests/*/custom/test_*.py" | wc -l
64
$ git ls-files "tests/*/functional/*" "tests/*/playwright/*"
# no output
$ 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
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
$ nix shell nixpkgs#python311Packages.pytest -c pytest tests/unit/test_discovery.py tests/unit/test_discovery_phase2.py tests/unit/test_manifest.py -q
..................
18 passed in 0.14s
Conclusion: the migrated tree still contains the exact same 64 custom test files with the same
per-recipe cardinality as the pre-cfold baseline in BACKLOG-cfold.md; only the folder paths changed.
2026-06-12 — Adversary M1 PASS received
Pulled review(cfold): M1 PASS cold verification (4b4d665). Confirmed in REVIEW-cfold.md:
- total canonical custom tests = 64
- old tracked
functional//playwright/trees = none - per-recipe counts match the baseline exactly
- focused unit suite =
18 passed - deprecated-alias warning probe works
- normalized
(recipe, filename)before/after set = exact match (missing [],extra [])
No fix-forward required. Phase advances to M2 baseline assembly.
2026-06-12 — M2 sweep snapshot: 19 fresh greens, Ghost upgrade regression remains
Bootstrap/access re-checks before the live sweep:
$ ssh cc-ci "hostname && whoami && nixos-version"
nixos
root
24.11.20250630.50ab793 (Vicuna)
$ set -a; . /srv/cc-ci/.testenv; set +a; curl -fsS "https://$GITEA_URL/api/v1/version"
{"version":"1.24.2"}
$ getent hosts "probe-$RANDOM.ci.commoninternet.net"
91.98.47.73 probe-4360.ci.commoninternet.net
Open-PR inventory before triggering uncovered recipes showed 16 enrolled repos already had live PRs;
custom-html, keycloak, cryptpad, and mumble did not. I reopened reusable closed PRs for the
first three (custom-html#2, keycloak#3, cryptpad#5) and created a minimal sweep-only mumble#1
probe PR via the Gitea API.
Fresh post-cfold success set gathered from the live server (/var/lib/cc-ci-runs/<build>/results.json):
506 drone L5
510 custom-html-tiny L5
521 discourse L5
522 immich L5
523 lasuite-docs L5
524 lasuite-drive L5
525 lasuite-meet L5
526 mailu L5
527 matrix-synapse L5
528 n8n L5
529 mattermost-lts L5
530 plausible L5
531 uptime-kuma L5
541 custom-html L5
553 keycloak L5
554 cryptpad L5
555 hedgedoc L5
556 bluesky-pds L5
558 mumble L5
Ghost is the lone non-green outlier:
557 ghost PR#4 @ d88f5801 -> L1 (install pass, upgrade fail, backup/restore/custom pass)
559 ghost PR#5 @ d42d0f7c -> L1 (same failure shape on last known-green Ghost head)
185 ghost PR#4 @ d42d0f7c -> L4 / pre-lint-era green baseline on 2026-06-05
The critical Ghost comparison is the same ref d42d0f7c:
- historical build
185(2026-06-05): upgrade passed atd42d0f7c - fresh probe build
559(2026-06-12): samed42d0f7cnow fails upgrade with swarmUpdateStatus='paused'
That isolates the regression away from cfold itself. In both fresh Ghost failures (557, 559), the
custom tier still discovered and passed all four tests/ghost/custom/test_*.py files, while the
upgrade op failed before upgrade assertions could run:
!! upgrade op failed: <ghost-domain>: upgrade redeploy did NOT converge to the head spec — swarm UpdateStatus='paused'.
The recipe's app service uses update_config failure_action=rollback/pause; the NEW (head) task failed swarm's update monitor,
so the service reverted/paused and the RUNNING spec is the previous version, not the code under test.
Adversary update pulled during this pass:
review(cfold)commit93f56aeadded only an idle audit entry toREVIEW-cfold.md- no finding filed
- no M2 PASS yet because no
claim(cfold): M2 ...commit exists