| Field | Value |
|---|---|
| Decision ID | ADR-044 |
| Initiative | unsorry — swarm throughput / goal lifecycle |
| Proposed By | unsorry maintainers |
| Date | 2026-06-15 |
| Status | Accepted |
A prove goal carries an affinity score (⟦Γ:Affinity⟧, ADR-010). select_prove_candidates
ranks the claimable pool and _rank drops everything with affinity < TAU_V (−5) as
“below viability — awaiting re-decomposition.” A failed prove attempt demotes a goal by
−10 (demote_goal), so a goal that fails its first claim’s attempt ladder drops from 0 to
−10 in one step — below the floor — and select_prove_candidates can never surface it
again.
The intended recovery (ADR-009) is decomposition into sub-lemmas, but decomposition only
fires at failure-time inside prove_goal. If that one decomposition does not happen
(decompose disabled, the provider produced no usable split, the depth cap, or simply a run
that demoted instead of decomposing), the goal is orphaned: parked below the floor, no
sub-lemmas, and nothing ever revisits it. ADR-024 cross-cycle lesson memory records a
⟦Δ:Lesson⟧ for each failed attempt, but lessons are only injected when a goal is
re-selected for proving — which never happens for a parked goal.
Observed on main (2026-06-15): of 58 phase=prove, status=open goals, 48 were parked
below TAU_V (46 at −10, 2 at −20) with no decomposition, while the 10 viable ones
all had open prove PRs in flight. The swarm reported “nothing claimable” despite 48 open,
recoverable goals — and prove --once runs exited immediately. The pool was starved.
In the context of a prove queue that drops goals below TAU_V and only ever
decomposes a goal at failure-time, while ADR-024 now carries each failed attempt’s lesson
forward so a re-attempt need not start from an empty board,
facing the fact that a goal demoted to −10 on its first failed claim is parked below
the floor with no decomposition and no path back — never re-selected, its accumulated
lessons never reused — so the working pool drains to “only in-flight goals remain” and the
swarm idles while dozens of open goals sit recoverable,
we decided for an idle recovery pass: when a --prove cycle finds no claimable
viable goal, re-surface one goal parked below TAU_V (the recovery-candidates
selector — the exact inverse of prove-candidates, least-buried first) and run it through
the same prove_goal pipeline, which retries with its lessons injected (ADR-024) and
decomposes on failure (ADR-009) — no duplicated recovery logic, just a second source for
the existing claim+work step (UNSORRY_RECOVERY=0 disables it),
and neglected a dedicated re-decomposition sweep that splits parked goals directly
(rejected — it duplicates prove_goal’s decompose path and skips the cheaper
retry-with-lessons stage the maintainer specifically wanted first), lowering/removing
TAU_V so parked goals stay in the normal queue (rejected — the floor’s whole purpose is
to keep the normal queue focused on viable work; recovery is the explicit, idle-only
exception), and re-promoting parked goals’ affinity in place (rejected — it loses the
“these already failed once” signal and lets a hard goal crowd the viable queue every
cycle),
to achieve a swarm that, instead of idling, spends an otherwise-empty prove cycle
giving an orphaned goal a lessons-armed retry and then a decomposition — so the pool keeps
making progress until goals are genuinely proved or split,
accepting that a recovered goal that fails again is demoted further (−20, …) and the
next idle pass takes the next-least-buried goal (bounded: one recovery goal per cycle,
HANDLED prevents repeats within a session, and live-claim filtering avoids two agents
recovering the same goal), and that recovery deliberately runs only when no viable work
exists, so it never competes with normal proving.
prove_goal wholesale — retry-with-lessons (ADR-024) then decompose-on-failure
(ADR-009) — with no parallel recovery code path.--dry-run reports the parked pool it would
recover.UNSORRY_RECOVERY=0 opts out.TAU_V, the demote
magnitude, or the decomposition caps — those remain ADR-010/ADR-009 territory.| Reference ID | Title | Type | Location |
|---|---|---|---|
| REF-1 | Recovery spec | Specification | specs/SPEC-044-A-Idle-Recovery-Of-Parked-Goals.md |
| REF-2 | Affinity ranking & viability floor | ADR | ADR-010-Affinity-Gap-Selection.md |
| REF-3 | Decomposition on prove failure | ADR | ADR-009-Goal-Decomposition.md |
| REF-4 | Cross-cycle lesson memory | ADR | ADR-024-Cross-Cycle-Lesson-Memory.md |
| REF-5 | Claim released at PR-open (in-flight skip) | ADR | ADR-017-Swarm-Supervisor.md |
| Status | Approver | Date |
|---|---|---|
| Proposed | unsorry maintainers | 2026-06-15 |
| Accepted | unsorry maintainers | 2026-06-15 |