The stateless freeshard loop has no attempt cap on two phases (whole-branch review findings #3 + #5):
- IMPLEMENT: if
local_verify never passes, every tick re-invokes Claude fresh (no PR yet) — unbounded Claude spend, never escalates. The retired machine had implement_max_retries = 3.
- CI_FIX:
run_ci_fix invokes Claude + pushes unconditionally. If Claude makes no commit (head unchanged → CI stays red → fix_attempts unchanged) it re-fires forever; if it commits without the fix(ci): prefix, the cap is silently defeated.
Needs a bounding policy + an escalation-without-PR shape (IMPLEMENT has no PR yet, so the manual-verify handoff needs an issue-level variant). Stateless option: count branch-unique ClaydeCode commits; escalate to manual-verify after N without green.
Safe to defer past supervised first runs; required before unattended operation.
The stateless freeshard loop has no attempt cap on two phases (whole-branch review findings #3 + #5):
local_verifynever passes, every tick re-invokes Claude fresh (no PR yet) — unbounded Claude spend, never escalates. The retired machine hadimplement_max_retries = 3.run_ci_fixinvokes Claude + pushes unconditionally. If Claude makes no commit (head unchanged → CI stays red →fix_attemptsunchanged) it re-fires forever; if it commits without thefix(ci):prefix, the cap is silently defeated.Needs a bounding policy + an escalation-without-PR shape (IMPLEMENT has no PR yet, so the manual-verify handoff needs an issue-level variant). Stateless option: count branch-unique ClaydeCode commits; escalate to manual-verify after N without green.
Safe to defer past supervised first runs; required before unattended operation.