22 KiB
REVIEW — Adversary — phase cfold
Adversary-only. Append-only. All verdicts here are cold-verified from a fresh shell + own clone. SSOT for what is being verified: /srv/cc-ci/cc-ci-plan/plan-phase-cfold-custom-folder.md
2026-06-11T22:54Z — Adversary initialized; awaiting Builder M1 claim
Baseline recorded in BACKLOG-cfold.md (pre-migration inventory). No claims pending. Will verify M1 and M2 on Builder claim.
Key break-it probes planned:
- Grep codebase for any remaining
functional/orplaywright/folder-name string literals after M1. - Run discovery cold to confirm no test was dropped (count must equal 64 custom test files).
- Verify deprecated-alias warning fires when a test is in old folder (per plan §2.1 recommendation).
- Confirm
from playwright.sync_apireferences NOT touched (they reference the package, not a folder). - Verify unit tests are updated (test_discovery_phase2.py, test_manifest.py) and still pass.
- Confirm manifest.py custom_counts changes correctly (sub will be "custom" not "functional"/"playwright").
- Confirm RUNG name "functional" (L4) is NOT renamed — only the folder name changes.
- M2: real Drone !testme sweep across all enrolled recipes — same level, same tests, zero leaks.
2026-06-12T00:00Z — No cfold gate claim visible; phase STATUS file missing
- Cold pull in
/srv/cc-ci/cc-ci-adv:git pull --rebase->Already up to date. machine-docs/STATUS-cfold.mdis absent in the shared repo state, so there is no canonical cfold gate claim / WHAT+HOW+EXPECTED+WHERE payload to verify perplan.md§6.1 and the phase kickoff.- No
ADVERSARY-INBOX.mdpresent. No formal cfold claim pending. - Action: notified Builder via
machine-docs/BUILDER-INBOX.mdto create/populateSTATUS-cfold.mdbefore claiming M1 or M2.
2026-06-12T16:00Z — Cold audit: still no cfold claim; repo remains pre-migration
- Cold rebase in
/srv/cc-ci/cc-ci-adv:git pull --rebase->Already up to date. machine-docs/STATUS-cfold.mdis still absent onorigin/main; no formal M1/M2 WHAT+HOW+EXPECTED+WHERE payload exists to verify.git log --all --grep='cfold' --grep='custom/' --grep='functional/' --grep='playwright/'shows no Builder-side cfold implementation/claim commits yet; only the Adversary bootstrap/notice commits are present for this phase.- Cold tree audit still matches the pre-migration shape: custom tests remain under
tests/<recipe>/functional/andtests/<recipe>/playwright/, and docs/discovery/unit-test literals still reference those folder names. - Verdict: no gate claim pending; nothing to PASS/FAIL yet. Waiting for Builder to publish
STATUS-cfold.mdand a formal M1 or M2 claim.
2026-06-12T16:20Z — M1 PASS
Cold verification from /srv/cc-ci/cc-ci-adv against Builder inputs in machine-docs/STATUS-cfold.md
and implementation commit 44e0242:
git ls-files "tests/*/custom/test_*.py" | wc -l->64git ls-files "tests/*/functional/*" "tests/*/playwright/*"-> no output- Per-recipe canonical counts match the phase baseline exactly:
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 - Focused unit suite:
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.11s - Deprecated-alias safety probe: a synthetic recipe with legacy
functional/+playwright/trees still discovers both tests and emits one-line warnings for each deprecated folder. - Stale-consumer audit: remaining
functional//playwright/literals are only the intentional deprecated-alias docs/tests/discovery references. No live cc-ci test tree remains under those dirs. - No test weakening found in the moved custom-test files reviewed at line level. The non-100% rename similarities were docstring/path-comment updates only; assertions and test bodies remained intact.
- Coverage-preservation proof: normalized
(recipe, filename)custom-test set before migration (87928a9, oldfunctional/+playwright/) exactly matches after migration (44e0242, newcustom/):before 64,after 64,missing [],extra [].
Verdict: M1 PASS. The canonical custom/ migration preserves coverage, keeps deprecated aliases
loud rather than silent, and updates the expected docs/discovery/manifest/unit-test surfaces.
2026-06-12T22:05:50Z — Idle audit; no M2 claim yet
- Cold rebase in
/srv/cc-ci/cc-ci-adv:git pull --rebase->Already up to date. machine-docs/STATUS-cfold.mdstill showsM2 — IN PROGRESS; there is noGate: M2 — CLAIMED, awaiting Adversarypayload to verify yet.- No
machine-docs/ADVERSARY-INBOX.mdis present. - Focused stale-consumer audit: remaining
functional//playwright/literals are confined to expected phase ledgers plus the intentional deprecated-alias docs/tests/discovery surfaces. No live repo custom-test tree has reappeared under deprecated folders. - Recent cfold coordination history is consistent with the ledger:
44e0242implementation,e1d623aM1 claim,4b4d665M1 PASS,39e53d7status update into M2 work.
Verdict: no new finding and no gate pending. Waiting for a formal M2 claim or a Builder inbox message.
2026-06-13T03:13:34Z — Idle audit; teardown still clean, no formal M2 claim
- Cold rebase in
/srv/cc-ci/cc-ci-advcompleted at wake; shared repo state remains unchanged for cfold. machine-docs/STATUS-cfold.mdstill shows## M2 — IN PROGRESS; there is still noGate: M2 — CLAIMED, awaiting AdversaryWHAT/HOW/EXPECTED/WHERE payload to verify.- No inbox side-channel files are present for Adversary consumption; specifically,
machine-docs/ADVERSARY-INBOX.mdis absent. - Independent cold live-host teardown check remains clean:
ssh cc-ci 'printf "live_pr_apps="; docker stack ls --format "{{.Name}}" | grep -c -- "-pr" || true'->live_pr_apps=0
Verdict: no new finding and no gate pending. Waiting for a formal M2 claim or a Builder inbox message.
2026-06-13T03:54:03Z — Idle audit; teardown still clean, no formal M2 claim
- Cold rebase in
/srv/cc-ci/cc-ci-advcompleted before this audit; current shared state still shows## M2 — IN PROGRESSinmachine-docs/STATUS-cfold.mdand noGate: M2 — CLAIMED, awaiting AdversaryWHAT/HOW/EXPECTED/WHERE payload to verify. - No inbox side-channel files are present for Adversary consumption; specifically,
machine-docs/ADVERSARY-INBOX.mdis absent. - Independent cold live-host teardown check remains clean:
ssh cc-ci 'printf "live_pr_apps="; docker stack ls --format "{{.Name}}" | grep -c -- "-pr" || true'->live_pr_apps=0
Verdict: no new finding and no gate pending. Waiting for a formal M2 claim or a Builder inbox message.
2026-06-13T03:33:37Z — Idle audit; teardown still clean, no formal M2 claim
- Cold rebase in
/srv/cc-ci/cc-ci-adv:git pull --rebase->Already up to date. machine-docs/STATUS-cfold.mdstill shows## M2 — IN PROGRESS; there is still noGate: M2 — CLAIMED, awaiting AdversaryWHAT/HOW/EXPECTED/WHERE payload to verify.- No inbox side-channel files are present for Adversary consumption; specifically,
machine-docs/ADVERSARY-INBOX.mdis absent. - Independent cold live-host teardown check remains clean:
ssh cc-ci 'printf "live_pr_apps="; docker stack ls --format "{{.Name}}" | grep -c -- "-pr" || true'->live_pr_apps=0
Verdict: no new finding and no gate pending. Waiting for a formal M2 claim or a Builder inbox message.
2026-06-13T04:11:00Z — M2 PASS
Cold verification from /srv/cc-ci/cc-ci-adv against Builder inputs in machine-docs/STATUS-cfold.md
and claim commit abe5e33:
- Drone build metadata check:
ssh cc-ci 'tok=$(cat /run/secrets/bridge_drone_token); curl -fsS -H "Authorization: Bearer $tok" https://drone.ci.commoninternet.net/api/repos/recipe-maintainers/cc-ci/builds/585 | jq -r "[.number,.status,.after,.params.RECIPE,.params.PR,.params.REF] | @tsv"'- ->
585 success d44f799de945d0775933aad58726d46509154a64 ghost 5 d42d0f7c7cf9946077a583ffa3f7c96abfe94a77
- Ghost real-CI run artifact check:
ssh cc-ci 'jq -r "{level,recipe,ref,results,stages:(.stages|map({name,status}))}" /var/lib/cc-ci-runs/585/results.json'- ->
level: 5,recipe: ghost,ref: d42d0f7c7cf9,results.install=pass,results.upgrade=pass,results.backup=pass,results.restore=pass,results.custom=pass; stagesinstall,upgrade,backup,restore,custom,lintallpass
- Ghost junit counts match the expected custom coverage and upgrade execution:
ssh cc-ci 'printf "ghost custom junit="; ls /var/lib/cc-ci-runs/585/junit/custom__cc-ci__*.xml | wc -l; printf " ghost upgrade junit="; ls /var/lib/cc-ci-runs/585/junit/upgrade*.xml | wc -l'- ->
ghost custom junit=4,ghost upgrade junit=2
- Focused same-code-path repro after the fix is green:
ssh cc-ci 'jq -r ".results, .stages" /var/lib/cc-ci-runs/ghost-repro-cfold-3/results.json'- ->
install: pass,upgrade: pass; the upgrade stage contains both the generic reconvergence test andtests.ghost.test_upgrade::test_upgrade_preserves_state
- Full sweep matrix audit remains green at the expected level/custom counts for all 20 enrolled recipes:
ssh cc-ci 'for spec in ...; do ...; done'- ->
bluesky-pds 556 level=5/5 custom=4/4,cryptpad 554 5/5 4/4,custom-html 541 5/5 4/4,custom-html-tiny 510 5/5 1/1,discourse 521 5/5 3/3,drone 506 5/5 1/1,ghost 585 5/5 4/4,hedgedoc 555 5/5 2/2,immich 522 5/5 3/3,keycloak 553 5/5 3/3,lasuite-docs 523 5/5 5/5,lasuite-drive 524 5/5 3/3,lasuite-meet 525 5/5 3/3,mailu 526 5/5 3/3,matrix-synapse 527 5/5 3/3,mattermost-lts 529 5/5 3/3,mumble 558 5/5 5/5,n8n 528 5/5 4/4,plausible 530 5/5 2/2,uptime-kuma 531 5/5 4/4
- Teardown remains clean after the sweep:
ssh cc-ci 'printf "live_pr_apps="; docker stack ls --format "{{.Name}}" | grep -c -- "-pr" || true'- ->
live_pr_apps=0
- Focused source audit of the final Ghost fix:
git diff ee6b613..d44f799 -- tests/ghost/compose.ccci.yml- shows the app-side race mitigation changed from a restart delay to a tiny DB-ready TCP wait wrapped around the existing
/abra-entrypoint.sh node current/index.jsboot path, with the pre-existing 15m app/db healthcheck grace preserved.
Verdict: M2 PASS. The cfold phase now has a green full real-CI !testme sweep with unchanged
L5 outcomes and expected canonical custom-test coverage across all enrolled recipes, plus zero leaked
live -pr stacks. Fresh M1 and M2 PASSes are both present within 24h.
2026-06-12T22:25:33Z — Idle break-it audit; still no M2 claim
- Cold rebase in
/srv/cc-ci/cc-ci-adv:git pull --rebase->Already up to date. machine-docs/STATUS-cfold.mdstill shows## M2 — IN PROGRESS; there is still noGate: M2 — CLAIMED, awaiting AdversaryWHAT/HOW/EXPECTED/WHERE handoff to verify.- No
machine-docs/ADVERSARY-INBOX.mdis present. - Recent cfold history is consistent and unchanged since the last audit:
44e0242implementation,e1d623aM1 claim,4b4d665M1 PASS,39e53d7M2-in-progress status,93f56aeprior idle audit. - Focused stale-consumer/break-it audit: no live cc-ci recipe custom-test tree has reappeared under
deprecated
functional/orplaywright/dirs; remaining matches are confined to intentional alias references in docs/unit tests/discovery and the phase ledgers recording the migration history.
Verdict: no new finding and no gate pending. Waiting for a formal M2 claim or a Builder inbox message.
2026-06-12T22:41:00Z — Cold artifact audit after Builder M2 sweep snapshot; still no M2 claim
- Cold rebase in
/srv/cc-ci/cc-ci-adv:git pull --rebase-> fast-forward tod24bb8f(status(cfold): record M2 sweep snapshot). machine-docs/STATUS-cfold.mdstill shows## M2 — IN PROGRESS; there is still noGate: M2 — CLAIMED, awaiting AdversaryWHAT/HOW/EXPECTED/WHERE handoff to verify, so no M2 PASS/FAIL verdict is available yet.- Independent cold check of the blocking
ghostdeviation on the live cc-ci host is consistent with the Builder's status note and points away from cfold itself:ssh cc-ci "jq '{level, recipe, stages: (.stages | map({name, status}))}' /var/lib/cc-ci-runs/557/results.json"->level: 1,recipe: ghost, stages present and passing forinstall,backup,restore,custom,lint.ssh cc-ci "jq '{level, recipe, stages: (.stages | map({name, status}))}' /var/lib/cc-ci-runs/559/results.json"-> same shape:level: 1,recipe: ghost, same five passing stages.ssh cc-ci "grep -R -n 'd88f5801' /var/lib/cc-ci-runs/557/abra/recipes/ghost/.git"shows build557checked out Ghost headd88f580188c145b04484074079ddf6f37662d3a1.ssh cc-ci "grep -R -n 'd42d0f7c' /var/lib/cc-ci-runs/559/abra/recipes/ghost/.git"shows build559checked out the probe refd42d0f7c7cf9946077a583ffa3f7c96abfe94a77.ssh cc-ci "printf 'build557 custom junit count='; ls /var/lib/cc-ci-runs/557/junit/custom__cc-ci__*.xml | wc -l; printf 'build557 upgrade junit count='; ls /var/lib/cc-ci-runs/557/junit/upgrade*.xml 2>/dev/null | wc -l"->build557 custom junit count=4,build557 upgrade junit count=0.ssh cc-ci "printf 'build559 custom junit count='; ls /var/lib/cc-ci-runs/559/junit/custom__cc-ci__*.xml | wc -l; printf 'build559 upgrade junit count='; ls /var/lib/cc-ci-runs/559/junit/upgrade*.xml 2>/dev/null | wc -l"->build559 custom junit count=4,build559 upgrade junit count=0.
- Interpretation: both fresh Ghost runs executed the canonical
tests/ghost/custom/test_*.pyset (4 junit files) and failed before any upgrade-tier junit artifact was produced. That supports the Builder's current statement that Ghost is an upgrade-path regression, not a custom-folder coverage loss.
Verdict: no new finding from this cold audit, but M2 is not passable yet. The phase still lacks both
the formal claim(cfold): M2 ... handoff and the required all-green full sweep (ghost remains non-green).
2026-06-12T23:00:00Z — Idle audit; still no formal M2 claim
- Cold rebase in
/srv/cc-ci/cc-ci-adv:git pull --rebase->Already up to date. machine-docs/STATUS-cfold.mdstill shows## M2 — IN PROGRESS; there is still noGate: M2 — CLAIMED, awaiting AdversaryWHAT/HOW/EXPECTED/WHERE payload to verify.- No
machine-docs/ADVERSARY-INBOX.mdis present. - Current ledger still points to the same blocker for a future M2 claim:
ghostremains the lone non-green recipe in the full sweep, and the latest recorded evidence continues to indicate a cfold-neutral upgrade-path failure rather than custom-test discovery loss.
Verdict: no new finding and no gate pending. Waiting for a formal M2 claim or a Builder inbox message.
2026-06-12T23:45:11Z — Cold Ghost follow-up audit; still no formal M2 claim
- Cold rebase in
/srv/cc-ci/cc-ci-adv:git pull --rebase->Already up to date. machine-docs/STATUS-cfold.mdstill shows## M2 — IN PROGRESS; there is still noGate: M2 — CLAIMED, awaiting AdversaryWHAT/HOW/EXPECTED/WHERE payload to verify.- Independent cold artifact check on cc-ci continues to support the Builder's current framing of the
lone remaining
ghostdeviation as cfold-neutral rather than a custom-tier discovery drop:ssh cc-ci "jq '{level, recipe, stages: (.stages | map({name, status}))}' /var/lib/cc-ci-runs/557/results.json"->level: 1,recipe: ghost, passing stages only forinstall,backup,restore,custom,lint.ssh cc-ci "jq '{level, recipe, stages: (.stages | map({name, status}))}' /var/lib/cc-ci-runs/559/results.json"-> same shape:level: 1,recipe: ghost, same five passing stages.ssh cc-ci "printf '557 custom='; ls /var/lib/cc-ci-runs/557/junit/custom__cc-ci__*.xml | wc -l; printf ' 557 upgrade='; ls /var/lib/cc-ci-runs/557/junit/upgrade*.xml 2>/dev/null | wc -l; printf ' 559 custom='; ls /var/lib/cc-ci-runs/559/junit/custom__cc-ci__*.xml | wc -l; printf ' 559 upgrade='; ls /var/lib/cc-ci-runs/559/junit/upgrade*.xml 2>/dev/null | wc -l; printf ' 185 custom='; ls /var/lib/cc-ci-runs/185/junit/custom__cc-ci__*.xml | wc -l; printf ' 185 upgrade='; ls /var/lib/cc-ci-runs/185/junit/upgrade*.xml 2>/dev/null | wc -l"->557 custom=4 557 upgrade=0 559 custom=4 559 upgrade=0 185 custom=4 185 upgrade=2.ssh cc-ci "printf '557 ref='; grep -R -n 'd88f5801' /var/lib/cc-ci-runs/557/abra/recipes/ghost/.git | wc -l; printf ' 559 ref='; grep -R -n 'd42d0f7c' /var/lib/cc-ci-runs/559/abra/recipes/ghost/.git | wc -l"-> both runs confirm the expected checked-out Ghost refs are present in the run artifacts.
- Interpretation: fresh runs
557and559still execute the canonical four-filetests/ghost/custom/set, but fail before producing any upgrade-tier junit files. Historical run185has both the same four custom junit files and two upgrade junit files, reinforcing that the regression remains in the Ghost upgrade path rather than in cfold's custom-folder migration.
Verdict: no new finding and no gate pending. M2 still cannot PASS until the sweep is formally claimed
and all recipes are green.
2026-06-13T00:23:55Z — Cold M2 artifact/teardown audit; still no formal M2 claim
- Cold rebase in
/srv/cc-ci/cc-ci-adv:git pull --rebase-> fast-forward tofb8762a. machine-docs/STATUS-cfold.mdstill shows## M2 — IN PROGRESS; there is still noGate: M2 — CLAIMED, awaiting AdversaryWHAT/HOW/EXPECTED/WHERE payload to verify.- Independent cold audit on
cc-ciof the sweep builds listed in the current M2 baseline matrix:ssh cc-ci 'for spec in ...; do ...; done'confirms every listed build still has the expected canonical custom-test junit count for its recipe. - The same audit confirms recipe levels remain
5/5for every listed recipe exceptghost, which is still1/5on build557while retaining the full expected custom junit count4/4. - Teardown state is currently clean:
ssh cc-ci 'docker stack ls --format "{{.Name}}" | grep -c -- "-pr" || true'->live_pr_apps=0.
Verdict: no new finding from this cold audit, but M2 is still not claimable/passable. The sweep
evidence continues to support coverage preservation across all recipes while ghost remains the lone
non-green, apparently cfold-neutral blocker, and there are no leaked live -pr stacks at present.
2026-06-13T00:40:00Z — Cold bridge replay-fix audit; still no formal M2 claim
- Cold rebase in
/srv/cc-ci/cc-ci-adv:git pull --rebase-> fast-forward to07cce4e. machine-docs/STATUS-cfold.mdstill shows## M2 — IN PROGRESS; there is still noGate: M2 — CLAIMED, awaiting AdversaryWHAT/HOW/EXPECTED/WHERE payload to verify.- No
machine-docs/ADVERSARY-INBOX.mdis present. - Independent cold source audit of the newly pulled bridge replay fix:
bridge/bridge.pynow guards the poller with_is_preexisting_comment()so a reopened PR cannot replay historical!testmecomments created before the current bridge process started.poll_loop()marks such comments seen via_claim(cid)instead of triggering them.
- Focused unit verification from the adversary clone:
nix shell nixpkgs#python311Packages.pytest -c pytest tests/unit/test_bridge_trigger.py -q->10 passed in 0.04s- The unit coverage includes both sides of the new timestamp guard:
test_preexisting_comment_from_before_bridge_start_is_ignoredandtest_comment_after_bridge_start_is_not_treated_as_preexisting.
Verdict: no new finding from this cold audit. The replay-guard fix appears consistent with the Ghost
triple-trigger root cause described in STATUS-cfold.md, but M2 is still not claimable/passable
because there is no formal claim and the Ghost recipe remains non-green.
2026-06-13T02:12:23Z — Idle audit; still no formal M2 claim
- Cold rebase in
/srv/cc-ci/cc-ci-adv:git pull --rebase->Already up to date. machine-docs/STATUS-cfold.mdstill shows## M2 — IN PROGRESS; there is still noGate: M2 — CLAIMED, awaiting AdversaryWHAT/HOW/EXPECTED/WHERE payload to verify.- No inbox side-channel files are present in
machine-docs/; specifically, nomachine-docs/ADVERSARY-INBOX.mdmessage is waiting. - Independent repo-side gate search also finds no fresh
awaiting Adversarymarker for cfold.
Verdict: no new finding and no gate pending. Waiting for a formal M2 claim or a Builder inbox message.
2026-06-13T02:31:55Z — Idle audit; teardown still clean, no formal M2 claim
- Cold rebase in
/srv/cc-ci/cc-ci-advcompleted before this audit; current shared state still shows## M2 — IN PROGRESSinmachine-docs/STATUS-cfold.mdand noGate: M2 — CLAIMED, awaiting AdversaryWHAT/HOW/EXPECTED/WHERE payload to verify. - No inbox side-channel files are present in
machine-docs/; specifically, nomachine-docs/ADVERSARY-INBOX.mdmessage is waiting. - Independent cold live-host teardown check remains clean:
ssh cc-ci 'printf "live_pr_apps="; docker stack ls --format "{{.Name}}" | grep -c -- "-pr" || true'->live_pr_apps=0
Verdict: no new finding and no gate pending. Waiting for a formal M2 claim or a Builder inbox message.
2026-06-13T02:52:34Z — Idle audit; teardown still clean, no formal M2 claim
- Cold rebase in
/srv/cc-ci/cc-ci-adv:git pull --rebase->Already up to date. machine-docs/STATUS-cfold.mdstill shows## M2 — IN PROGRESS; there is still noGate: M2 — CLAIMED, awaiting AdversaryWHAT/HOW/EXPECTED/WHERE payload to verify.- No inbox side-channel files are present for Adversary consumption; specifically,
machine-docs/ADVERSARY-INBOX.mdis absent. - Independent cold live-host teardown check remains clean:
ssh cc-ci 'printf "live_pr_apps="; docker stack ls --format "{{.Name}}" | grep -c -- "-pr" || true'->live_pr_apps=0
Verdict: no new finding and no gate pending. Waiting for a formal M2 claim or a Builder inbox message.