diff --git a/BACKLOG-conc.md b/BACKLOG-conc.md new file mode 100644 index 0000000..3e3acbc --- /dev/null +++ b/BACKLOG-conc.md @@ -0,0 +1,22 @@ +# BACKLOG — sub-phase conc + +## Build backlog + +- [ ] P1 lock-lifetime hardening: prctl PDEATHSIG + ppid race check + SIGTERM handler → + teardown funnel + signal.alarm(3600) hard deadline; .drone.yml setsid/trap wrap; + PEP 446 comment on lock open() +- [ ] P2 flock-probe janitor: acquire_app_lock(domain) at register_run_app's call site; + janitor probes per-domain lockfiles (acquired→reap under probe lock, held→leave, + >120min mtime→warn); delete registry symbols +- [ ] P3 per-run ABRA_DIR: /var/lib/cc-ci-runs//abra with servers+catalogue symlinks, + fresh recipes/; fetch_recipe = plain clone; delete acquire_recipe_lock; route harness + recipe paths through ABRA_DIR +- [ ] P4 config cleanup: remove concurrency.limit from .drone.yml; maxTests is the single knob +- [ ] tests/concurrency suite (19 cases, real-kernel flock, explicit invocation only) +- [ ] P5 docs/concurrency.md rewrite to the new model +- [ ] M1 claim (branch complete, both suites + lint green) +- [ ] M2: merge to main after M1 PASS, push build green, live verification a–d + +## Adversary findings + +(adversary-owned) diff --git a/JOURNAL-conc.md b/JOURNAL-conc.md new file mode 100644 index 0000000..8b454ff --- /dev/null +++ b/JOURNAL-conc.md @@ -0,0 +1,24 @@ +# JOURNAL — sub-phase conc (Builder, append-only) + +## 2026-06-10 — bootstrap + +Read concurrency-restructure-full-plan.md (SSOT) + plan.md §6.1/§7/§9. Oriented on the code: + +- `runner/harness/lifecycle.py` — recipe flock (l.46), registry (l.65–97), deploy_app + registration (l.283), teardown unregister (l.723), three-way janitor (l.726). +- `runner/run_recipe_ci.py` — `acquire_recipe_lock` call site (l.843), `fetch_recipe` (l.140, + rm-rf + reclone of the shared tree), janitor call sites (l.600 quick, l.932 cold). +- `.drone.yml` — recipe-ci step runs `cc-ci-run runner/run_recipe_ci.py` bare (P1 wraps it), + `concurrency.limit: 2` (P4 removes). +- Greps for P3 fallout: `~/.abra/recipes` referenced in abra.py (recipe_checkout, + has_lightweight_version_tags, recipe_head_commit, recipe_versions), generic.py:28, + lifecycle.prepull_images, run_recipe_ci (fetch_recipe, snapshot_recipe_tests, comment), + warm_reconcile.py:202 (runs OUTSIDE per-run context — keeps default), and + tests/ghost+discourse install_steps.sh (`${HOME}/.abra/recipes/...` — these run INSIDE a + run and copy compose.ccci.yml into the deploy tree, so they must resolve the per-run dir). +- `~/.abra/servers/...` paths are unaffected by design (servers/ is symlinked to the canonical + /root/.abra/servers, so both resolutions land on the same file). + +Working setup: state files on main in this clone; code on branch `restructure/concurrency` +via a git worktree at ../cc-ci-conc; test runs on the cc-ci host via /root/builder-clone +(`cc-ci-run -m pytest ...`, `nix develop .#lint`). diff --git a/STATUS-conc.md b/STATUS-conc.md new file mode 100644 index 0000000..4bfcbaa --- /dev/null +++ b/STATUS-conc.md @@ -0,0 +1,19 @@ +# STATUS — sub-phase conc (concurrency restructure) + +Plan: /srv/cc-ci/cc-ci-plan/concurrency-restructure-full-plan.md (SSOT for this phase) + +## Phase state + +- Phase: conc — concurrency restructure (P1–P5 + tests/concurrency) +- Builder branch: `restructure/concurrency` (code lands there; main untouched until M2 merge) +- In flight: P1 (lock-lifetime hardening) +- Gate: none claimed yet + +## Gates + +- M1 (implementation verified): NOT CLAIMED +- M2 (merged + live-verified): NOT CLAIMED — blocked on M1 PASS + +## Blockers + +(none)