diff --git a/REVIEW-conc.md b/REVIEW-conc.md index 7a5049b..423c097 100644 --- a/REVIEW-conc.md +++ b/REVIEW-conc.md @@ -304,3 +304,31 @@ case asserts same-domain deploy-count isolation; (3) live (c) re-run shows BOTH the visible block line and zero leakage; (4) (a),(b),(d) re-confirmed unaffected. Only I clear this. (After this verdict I may consult JOURNAL-conc to contextualise — noting I had NOT read the (c) journal reasoning before forming this FAIL; I verified from the Drone API + code directly.) + +## 2026-06-10T08:20Z — CONC-A1 fix CODE-verified (veto conditions 1+2 met; 3+4 still pending — NOT cleared) + +Builder fixed CONC-A1 (b6e12ef, merged main 139e319) and is re-running M2 live (a)–(d). I +cold-verified the FIX CODE from my own clone + a fresh checkout on cc-ci (not the Builder's word): + +- **Condition (1) per-run keying — MET.** `run_recipe_ci._run_state_path(name)` keys all four + run-scoped state files (`deploys`, `opstate`, `deps`, `depskip`) by `run_id()` + `os.getpid()`, + never domain. Grep: ZERO residual `ccci--{domain}` literals in prod code (only the + app-LOCK path stays domain-keyed, which is correct). All consumers env-read `CCCI_*_FILE` + (lifecycle:148, deps:72/155, generic:134) — no path re-derivation. Uniqueness holds even in the + manual fallback (`run_id()`→domain) because the `+pid` suffix separates two processes. +- **Condition (2) same-domain isolation test — MET, and proven non-tautological.** + tests/concurrency/test_run_state.py adds test_20/20b/20c. test_20c drives REAL processes + the + REAL lock + real `_run_state_path`/`_record_deploy`, reproducing the 279/281 interleaving: run A + reads `COUNT 1` (NOT polluted to 2 by B's pre-lock increment) and B's file survives A's remove + (no FileNotFoundError). **Mutation check (my own):** reverting `_run_state_path` to domain-keying + in a throwaway cc-ci clone → all 3 test_run_state cases FAIL (incl. test_20c). So the test + genuinely guards the fix. +- **Suites cold (fresh clone @4f6c955 on cc-ci):** unit 138 passed, concurrency 23 passed (was 20), + concurrency still NOT collected by the default `pytest tests/unit` run (0). lint not re-run here + (no .drone.yml/nix change in the fix; will confirm at the M2 claim). + +**VETO NOT cleared.** Conditions (3) live (c) re-run BOTH builds GREEN + visible block line + zero +leakage, and (4) (a)/(b)/(d) re-confirmed on the fixed harness, still require the Builder's live +evidence (in flight). The code fix strongly predicts a (c) pass but M2 is a LIVE gate — I will +re-verify the (c) double-!testme cold from the Drone API once the Builder posts the M2 claim, and +only then clear the veto.