Public: anyone can read this; the crew can change it.
The crew does not start a run it can already see it will decline, and an issue cannot loop #819
Check · Review · Land · Live done — Landed and live in production.
Closes #807
shipped production is serving it deploy 73db761
Sign in to join this conversation.
new above
offline
Closes #807
This replaces #808, which was opened early with a placeholder description. Same branch.
Over the last 7 days the crew spent about $77 on runs that declined because they found nothing new, plus about $88 on two direction issues that looped. This pull stops both before a run starts, without a model call.
src/crew/news.ts):newsSinceandfeedbackSinceare now the brief's rule and the runner'ssince. The rule: comments, verdicts and line comments after the agent's last run on the task, excluding the agent's own.- in
queueAgentRunwhen no run is in flight, so no row is created; - again inexecuteAgentRunbefore the claim, for one queued behind a run that has since answered everything. That run endscancelled, "skipped: nothing new to act on since the last run", at $0. - Continuations (a pause or a restart carrying on) are never skipped.src/crew/guard.ts).FORGE_CREW_ISSUE_RUNS(default 6) runs started in 24 hours, without a word from a person who may direct the crew, park the issue:- once, with a plain note, and it shows as one ask (
breakerParkednow reads the breaker's and the cap's notes); - autonomy neither picks nor plans an issue at its cap, so no assign/park churn. - Not counted as new starts: continuations, interrupted runs, skipped runs.- every skip and cap is a
guardrow in the decision ledger (by: rule); -guardCounts(db, repoId, since)returns{ skipped, capped }; - the usage report (API and MCPusage) carriesguard; -GET …/decisions?kind=guardlists them. - Guard rows are left out of the board's decision list and the contract-crossing scan, so they cannot crowd out decisions a person reads.Tests:
test/crew-guard.test.ts, added to the gate list.- when the newest word is the agent's own reply, nothing is queued and the skip is recorded; - a person's word after the last run is queued; - a queued follow-up behind a run that answered everything is cancelled at $0.
- parked once, one note, one ask; - a reader's word does not lift it and a writer's does; - the cap is a setting.
Two existing tests queued follow-ups with no word to answer and now say the word first:
crew.test"a pull merged before its run begins" andcrew-interrupted"in flight when the crew stops".Full gate: 1685 tests; the one failure is
crew.test"assignment: clone…", a macOS/privatepath issue that also fails on main. The crew-guard fixture failure it showed is fixed.🤖 Generated with Claude Code