# 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: 1. Grep codebase for any remaining `functional/` or `playwright/` folder-name string literals after M1. 2. Run discovery cold to confirm no test was dropped (count must equal 64 custom test files). 3. Verify deprecated-alias warning fires when a test is in old folder (per plan §2.1 recommendation). 4. Confirm `from playwright.sync_api` references NOT touched (they reference the package, not a folder). 5. Verify unit tests are updated (test_discovery_phase2.py, test_manifest.py) and still pass. 6. Confirm manifest.py custom_counts changes correctly (sub will be "custom" not "functional"/"playwright"). 7. Confirm RUNG name "functional" (L4) is NOT renamed — only the folder name changes. 8. 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.md` is absent in the shared repo state, so there is no canonical cfold gate claim / WHAT+HOW+EXPECTED+WHERE payload to verify per `plan.md` §6.1 and the phase kickoff. - No `ADVERSARY-INBOX.md` present. No formal cfold claim pending. - Action: notified Builder via `machine-docs/BUILDER-INBOX.md` to create/populate `STATUS-cfold.md` before 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.md` is still absent on `origin/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//functional/` and `tests//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.md` and 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` -> `64` - `git 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`, old `functional/` + `playwright/`) exactly matches after migration (`44e0242`, new `custom/`): `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.md` still shows `M2 — IN PROGRESS`; there is no `Gate: M2 — CLAIMED, awaiting Adversary` payload to verify yet. - No `machine-docs/ADVERSARY-INBOX.md` is 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: `44e0242` implementation, `e1d623a` M1 claim, `4b4d665` M1 PASS, `39e53d7` status 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-adv` completed at wake; shared repo state remains unchanged for cfold. - `machine-docs/STATUS-cfold.md` still shows `## M2 — IN PROGRESS`; there is still no `Gate: M2 — CLAIMED, awaiting Adversary` WHAT/HOW/EXPECTED/WHERE payload to verify. - No inbox side-channel files are present for Adversary consumption; specifically, `machine-docs/ADVERSARY-INBOX.md` is 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-adv` completed before this audit; current shared state still shows `## M2 — IN PROGRESS` in `machine-docs/STATUS-cfold.md` and no `Gate: M2 — CLAIMED, awaiting Adversary` WHAT/HOW/EXPECTED/WHERE payload to verify. - No inbox side-channel files are present for Adversary consumption; specifically, `machine-docs/ADVERSARY-INBOX.md` is 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.md` still shows `## M2 — IN PROGRESS`; there is still no `Gate: M2 — CLAIMED, awaiting Adversary` WHAT/HOW/EXPECTED/WHERE payload to verify. - No inbox side-channel files are present for Adversary consumption; specifically, `machine-docs/ADVERSARY-INBOX.md` is 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`; stages `install`, `upgrade`, `backup`, `restore`, `custom`, `lint` all `pass` - 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 and `tests.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.js` boot 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.md` still shows `## M2 — IN PROGRESS`; there is still no `Gate: M2 — CLAIMED, awaiting Adversary` WHAT/HOW/EXPECTED/WHERE handoff to verify. - No `machine-docs/ADVERSARY-INBOX.md` is present. - Recent cfold history is consistent and unchanged since the last audit: `44e0242` implementation, `e1d623a` M1 claim, `4b4d665` M1 PASS, `39e53d7` M2-in-progress status, `93f56ae` prior idle audit. - Focused stale-consumer/break-it audit: no live cc-ci recipe custom-test tree has reappeared under deprecated `functional/` or `playwright/` 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 to `d24bb8f` (`status(cfold): record M2 sweep snapshot`). - `machine-docs/STATUS-cfold.md` still shows `## M2 — IN PROGRESS`; there is still no `Gate: M2 — CLAIMED, awaiting Adversary` WHAT/HOW/EXPECTED/WHERE handoff to verify, so no M2 PASS/FAIL verdict is available yet. - Independent cold check of the blocking `ghost` deviation 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 for `install`, `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 build `557` checked out Ghost head `d88f580188c145b04484074079ddf6f37662d3a1`. - `ssh cc-ci "grep -R -n 'd42d0f7c' /var/lib/cc-ci-runs/559/abra/recipes/ghost/.git"` shows build `559` checked out the probe ref `d42d0f7c7cf9946077a583ffa3f7c96abfe94a77`. - `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_*.py` set (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.md` still shows `## M2 — IN PROGRESS`; there is still no `Gate: M2 — CLAIMED, awaiting Adversary` WHAT/HOW/EXPECTED/WHERE payload to verify. - No `machine-docs/ADVERSARY-INBOX.md` is present. - Current ledger still points to the same blocker for a future M2 claim: `ghost` remains 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.md` still shows `## M2 — IN PROGRESS`; there is still no `Gate: M2 — CLAIMED, awaiting Adversary` WHAT/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 `ghost` deviation 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 for `install`, `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 `557` and `559` still execute the canonical four-file `tests/ghost/custom/` set, but fail before producing any upgrade-tier junit files. Historical run `185` has 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 to `fb8762a`. - `machine-docs/STATUS-cfold.md` still shows `## M2 — IN PROGRESS`; there is still no `Gate: M2 — CLAIMED, awaiting Adversary` WHAT/HOW/EXPECTED/WHERE payload to verify. - Independent cold audit on `cc-ci` of 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/5` for every listed recipe except `ghost`, which is still `1/5` on build `557` while retaining the full expected custom junit count `4/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 to `07cce4e`. - `machine-docs/STATUS-cfold.md` still shows `## M2 — IN PROGRESS`; there is still no `Gate: M2 — CLAIMED, awaiting Adversary` WHAT/HOW/EXPECTED/WHERE payload to verify. - No `machine-docs/ADVERSARY-INBOX.md` is present. - Independent cold source audit of the newly pulled bridge replay fix: - `bridge/bridge.py` now guards the poller with `_is_preexisting_comment()` so a reopened PR cannot replay historical `!testme` comments 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_ignored` and `test_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.md` still shows `## M2 — IN PROGRESS`; there is still no `Gate: M2 — CLAIMED, awaiting Adversary` WHAT/HOW/EXPECTED/WHERE payload to verify. - No inbox side-channel files are present in `machine-docs/`; specifically, no `machine-docs/ADVERSARY-INBOX.md` message is waiting. - Independent repo-side gate search also finds no fresh `awaiting Adversary` marker 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-adv` completed before this audit; current shared state still shows `## M2 — IN PROGRESS` in `machine-docs/STATUS-cfold.md` and no `Gate: M2 — CLAIMED, awaiting Adversary` WHAT/HOW/EXPECTED/WHERE payload to verify. - No inbox side-channel files are present in `machine-docs/`; specifically, no `machine-docs/ADVERSARY-INBOX.md` message 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.md` still shows `## M2 — IN PROGRESS`; there is still no `Gate: M2 — CLAIMED, awaiting Adversary` WHAT/HOW/EXPECTED/WHERE payload to verify. - No inbox side-channel files are present for Adversary consumption; specifically, `machine-docs/ADVERSARY-INBOX.md` is 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.