# STATUS — Phase lvl5 (L5 lint rung + de-cap) ## DONE Phase complete 2026-06-11: M1 PASS (cfc87fd) + M2 PASS (13cad1f), both <24h, no VETO. The 5-rung ladder (L5 = abra recipe lint on the exact tested ref) and the de-capped level semantics (pass/fail/skip/unver; fails AND unverified rungs block, intentional skips climb; no cap/cap_reason anywhere) are live on main @ a521d43 and verified end-to-end (results.json schema 2 → card → dashboard → badge → PR comment, drone path included). Cleanup done: throwaway PR custom-html#4 closed, branch lvl5-lintdemo deleted; WC5 stage-completeness observation filed in machine-docs/DEFERRED.md. ## M2 claim — proven in real CI **WHAT:** plan-phase-lvl5 §4 M2: P3 matrix complete for ALL 19 enrolled recipes; P4 runs done (genuine L5, lint-blocked L4, N/A-skip climb, drone path ×3, canaries at re-derived designed levels, synthesized unver-blocks run); old artifacts render; durations not inflated; before/after table complete; card/dashboard/badge visually verified. **WHERE:** main @ `dc924c679b4ae6dd1e21bfe9d231acb28b58ddf8` (implementation merged 08e6cc8 after M1 + PR-path fix 68c3486). Evidence runs (all artifacts at `https://ci.commoninternet.net/runs//{results.json,summary.png,badge.svg,lint.txt}`): | run | what it proves | EXPECTED content | |---|---|---| | 398 hedgedoc cold | genuine L5, full clean climb | level=5, all 5 rungs pass, schema=2, no cap keys, dur 100s | | 399 custom-html-tiny cold | N/A-skip climb (was L2 @ #205) | level=5, backup_restore=skip + declared reason in skips.intentional, dur 45s | | 405 custom-html PR4 (!testme) | lint-blocked L4 + verdict-neutral | level=4, lint=fail rules_failed=[R011], **drone build status SUCCESS**, dur 61s | | 406 immich PR2 (!testme) | drone path L5 on real PR | level=5, dur 199s (shot baseline 198-199s — no inflation) | | 407 plausible PR3 (!testme) | drone path L5 on real PR | level=5, dur 164s (shot baseline 166s) | | 413 mumble cold | table row (no prior artifact) | level=5, dur 80s | | 415/416 bkp-bad/rst-bad (SRC+REF) | canaries at re-derived designed level | **verdict FAILURE (red)**, level=1, rungs {install pass, upgrade skip (no version tags on mirror), backup_restore fail, functional unver, lint pass} | | host `/var/lib/cc-ci-runs/lvl5-unver-demo/results.json` | synthesized unver-blocks (mission ex. #3) | hand-run STAGES=install,upgrade,custom on custom-html: level=2, backup_restore=unver in skips.unintentional, functional+lint pass above it | **HOW to verify (cold):** 1. Fresh clone main; `cc-ci-run -m pytest tests/unit/ -q` → EXPECTED **247 passed** (new since M1: `test_run_lint_detached_pr_tree_lints_exact_ref` — PR-path regression, see fix 68c3486: abra lint checks out the repo's DEFAULT BRANCH, so run_lint forces local `main` AT the tested ref + repoints origin to the scratch itself; found live in builds 400-402 where the rung correctly degraded to unver/level 4 with run verdicts unaffected). `nix develop .#lint --command bash scripts/lint.sh` → PASS. 2. Fetch each run's results.json above and check the EXPECTED column; drone build statuses via API (only 415/416 red — and red by tier failure, not by lint). 3. Visuals: Read `summary.png` of 398 (level 5 of 5, lint row PASS, green 5 badge), 399 (backup/restore row "INTENTIONAL SKIP" + reason, level 5), 405 (lint row FAIL red, level 4 of 5, badge #a0b93f); badges are number+colour ONLY. 4. Old artifacts: `/runs/370/{results.json,summary.png}` 200 + render (pre-lvl5 schema-1 with cap fields); dashboard `/` and `/recipe/immich` 200 with mixed-schema rows; unit history-compat tests (test_card/test_dashboard old-schema cases). 5. lint.txt served: `/runs/398/lint.txt` 200 (full abra table; rc/status header). 6. P3 matrix + §2.9 before/after table: BACKLOG-lvl5.md (19/19 lint pass sweep — re-runnable per the documented scratch method; baseline column from latest artifacts; REAL column from the runs above; canary re-derivation note). 7. Dashboard runtime is the rolled image `cc-ci-dashboard:15addbc7bf45` (reconcile per DECISIONS Phase 3/U2 — no host switch). **Notes for the verdict:** - The throwaway lint-violation PR (custom-html#4, branch lvl5-lintdemo) is left OPEN and marked do-not-merge so you can re-run `!testme` independently; Builder will close branch+PR after M2. - Level shifts vs baseline are exactly the rule change (table): formerly-capped intentional-N/A recipes climb; nothing else moved. - Observation (pre-existing, out of phase scope, noted in JOURNAL): WC5 promote-on-green-cold does not require all stages — the STAGES-filtered green hand-run promoted custom-html's canonical. Filed as a JOURNAL note; flag if you want it as a finding. --- ## (history) M1 claim — implementation complete (pre-merge): PASS @cfc87fd Branch `phase-lvl5` @ 3d8d286 (claim 24baac5); 246 unit tests cold-green, repo lint PASS, mirror-context decision reviewed, verdict-neutral confirmed. Merged to main 08e6cc8.