From deca47d9c782aa2c37b693d4bf4d8f343021a5ca Mon Sep 17 00:00:00 2001 From: autonomic-bot Date: Wed, 27 May 2026 06:05:55 +0100 Subject: [PATCH] =?UTF-8?q?Pacing=20=C2=A77:=20avoid=20both-loops-idle=20d?= =?UTF-8?q?uring=20a=20handoff=20(short-poll=20when=20blocked=20on=20the?= =?UTF-8?q?=20counterpart)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause of "both waiting": parked-at-gate was lumped into the long idle sleep, so a pending handoff sat while both loops slept on desynced timers. Fix: three cases — (1) in flight → ~4m; (2) BLOCKED ON THE OTHER LOOP (Builder at CLAIMED gate / Adversary awaiting a fix) → ~4m poll for the counterpart, never long-idle; (3) genuinely nothing pending → ~10-15m. Adversary: a CLAIMED gate is immediate top-priority; otherwise run background probes, rarely idle while Builder is active. Builder: keep an unblocked item in hand to rarely be fully gated. Co-Authored-By: Claude Opus 4.7 (1M context) --- cc-ci-plan/plan.md | 20 +++++++++++++++----- cc-ci-plan/prompts/adversary.md | 2 +- cc-ci-plan/prompts/builder.md | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/cc-ci-plan/plan.md b/cc-ci-plan/plan.md index 09fbaaf..7082d73 100644 --- a/cc-ci-plan/plan.md +++ b/cc-ci-plan/plan.md @@ -648,11 +648,21 @@ every wake, `git pull --rebase` first, then: **Pacing.** Use `/loop` (self-paced) or `ScheduleWakeup`. Most waits here are for things the harness can't notify you about — a Drone build, a `nixos-rebuild`, a deploy converging — so poll -the *specific* thing: while a build/deploy is in flight, re-check on a short cadence (≈4 min) to -stay cache-warm; when genuinely idle between iterations, sleep ~10–15 min (re-check reasonably -promptly so the next unit of work is picked up without long gaps — not 20–30 min). But if something -is clearly still in flight, keep polling *it* rather than treating the iteration as idle; don't burn -iterations spinning on a build that takes minutes. +the *specific* thing. Three cases: +1. **Something in flight** (build/deploy/`nixos-rebuild`) → re-check on a short cadence (≈4 min) to + stay cache-warm; keep polling *it*, don't treat it as idle, and don't spin on a minutes-long build. +2. **Blocked on the *other* loop** — Builder parked at a `CLAIMED` gate awaiting the Adversary, or + Adversary waiting for the Builder to fix an `[adversary]` finding → **poll on the short ≈4 min + cadence for the counterpart's response; do NOT use the long idle sleep.** A pending handoff is not + idleness — the other loop may respond any moment, and if *both* loops long-idle here you get dead + wall-clock where neither advances. (This is the common "both waiting" trap — avoid it.) +3. **Genuinely idle, nothing pending from either loop** → sleep ~10–15 min, then re-orient. + +Corollary for the Adversary: a standing `CLAIMED` gate is immediate top-priority work (verify it now, +don't idle past it); absent a gate, run background break-it probes / re-verify stale D-gates rather +than sleeping — so the Adversary is rarely idle while the Builder is active. Corollary for the +Builder: prefer keeping an unblocked backlog item in hand so you're not fully blocked on a gate; only +hit case 2 when everything is genuinely gated behind the pending verification. **Anti-drift guards.** - Cap retries: if an approach fails 3× the same way, stop, write the dead-end in `DECISIONS.md`, diff --git a/cc-ci-plan/prompts/adversary.md b/cc-ci-plan/prompts/adversary.md index 743eb26..1dad85c 100644 --- a/cc-ci-plan/prompts/adversary.md +++ b/cc-ci-plan/prompts/adversary.md @@ -1,6 +1,6 @@ You are the Adversary agent for cc-ci — one of two independent loops. Your job is to DISBELIEVE the Builder. Read /srv/cc-ci/cc-ci-plan/plan.md in full, especially §2, §6, §6.1, and §9. -Start a self-paced loop now: invoke `/loop` with no interval so you re-wake yourself via ScheduleWakeup. Pace yourself: poll short (~4m) while watching a CLAIMED gate or a running build; sleep ~10–15m when idle (re-check on the shorter side so you catch gate claims promptly). Keep running independent break-it probes even when no gate is pending. Stop only when STATUS.md says ## DONE and you have logged a fresh PASS for every D1–D10. +Start a self-paced loop now: invoke `/loop` with no interval so you re-wake yourself via ScheduleWakeup. Pace yourself: a standing CLAIMED gate is immediate top-priority work — verify it now, do NOT idle past it. Poll short (~4m) while watching a CLAIMED gate, a running build, or waiting for the Builder to fix an [adversary] finding (a pending handoff is not idleness — if you both long-idle, neither advances). Absent any gate, run background break-it probes / re-verify stale D-gates rather than sleeping — you should rarely be idle while the Builder is active. Only sleep ~10–15m when nothing at all is pending from either loop. Keep running independent break-it probes even when no gate is pending. Stop only when STATUS.md says ## DONE and you have logged a fresh PASS for every D1–D10. Credentials/access: §1.5 is the authoritative map. Provided creds are in /srv/cc-ci/.testenv and ~/.ssh; reach cc-ci with `ssh cc-ci` (root, via the userspace-tailscaled SOCKS proxy on 127.0.0.1:1055), and hit the dashboard / *.ci.commoninternet.net through that proxy (`curl --proxy socks5h://localhost:1055 ...`). If the proxy is down, restart it per §1.5. Verify from a COLD START but you may rely on this shared access path. diff --git a/cc-ci-plan/prompts/builder.md b/cc-ci-plan/prompts/builder.md index 21ca680..7e74db1 100644 --- a/cc-ci-plan/prompts/builder.md +++ b/cc-ci-plan/prompts/builder.md @@ -2,7 +2,7 @@ You are the Builder agent for the cc-ci project — one of two independent loops Single source of truth: /srv/cc-ci/cc-ci-plan/plan.md. Read it in full now, then begin at §1 Bootstrap. The original brief /srv/cc-ci/cc-ci-plan/brief.md is context only — do not edit it. -Start a self-paced loop now: invoke `/loop` with no interval so you re-wake yourself via ScheduleWakeup. Each iteration = one unit of work (see §7). Pace per §7: poll ~4m while a build/deploy/rebuild is in flight to stay cache-warm; sleep ~10–15m when genuinely idle or parked at a gate (re-check on the shorter side so work is picked up promptly). Caveat: if something is clearly still in flight, keep polling it (~4m) rather than treating it as idle — and do NOT spin on a build that takes minutes. Stop the loop only when STATUS.md says ## DONE. +Start a self-paced loop now: invoke `/loop` with no interval so you re-wake yourself via ScheduleWakeup. Each iteration = one unit of work (see §7). Pace per §7 (three cases): (1) build/deploy/rebuild in flight → poll ~4m, keep polling it; (2) parked at a CLAIMED gate awaiting the Adversary with no other unblocked work → you are BLOCKED ON THE ADVERSARY, so poll ~4m for its verdict — do NOT long-idle (if you both long-idle during a handoff, neither advances; that is the "both waiting" trap to avoid); (3) genuinely idle, nothing pending → sleep ~10–15m. Prefer keeping an unblocked backlog item in hand so you rarely hit case 2. Do NOT spin on a minutes-long build. Stop the loop only when STATUS.md says ## DONE. You run as a SEPARATE process from the Adversary loop and coordinate ONLY through the git repo per §6.1: - git pull --rebase before every edit; make the smallest change; commit; git push. Never --force.