diff --git a/lib/substantive_fixer.py b/lib/substantive_fixer.py index 907f6f2..e5878db 100644 --- a/lib/substantive_fixer.py +++ b/lib/substantive_fixer.py @@ -650,22 +650,25 @@ async def verdict_deadlock_reaper_cycle(conn) -> int: # # Branch allowlist invariant: the reaper closes ONLY disposable, pipeline- # generated branches — content the pipeline (or a daily cron) created and - # can recreate. Three classes qualify: + # can recreate. Four classes qualify: # # extract/* — per-source extraction PRs, regenerated next ingest cycle # reweave/* — nightly graph-edge maintenance, regenerated next reweave # fix/* — pipeline-internal fix branches - # */research-2* — daily {agent}/research-{YYYY-MM-DD} sessions; the date - # suffix scopes this to cron-generated outputs only and - # excludes hand-named research branches like - # rio/research-batch-agents-memory-harnesses, which are - # feature work owned by the agent. + # */research-YYYY-MM-DD — daily {agent}/research-{date} cron sessions. + # Matched via SQLite `_` single-char wildcards as + # `research-20__-__-__` to literally enforce the date- + # suffix shape. Excludes hand-named research branches + # (rio/research-batch-agents-memory-harnesses, + # theseus/research-2nd-attempt-on-X, etc.) which are + # feature work owned by the agent. Pattern good through + # 2099; revisit then. # # WIP agent feature branches (theseus/feature-foo, epimetheus/some-fix, # rio/research-thesis-name) are NEVER reaped — owners review their own PRs - # on their own cadence. The */research-2* pattern threads the needle: it - # picks up daily synthesis output that the agent will regenerate tomorrow - # while leaving manually-named research work alone. + # on their own cadence. The date-shaped pattern threads the needle: picks + # up daily synthesis output the agent regenerates tomorrow while leaving + # manually-named research work alone. rows = conn.execute( """SELECT number, branch, eval_issues, leo_verdict, domain_verdict, last_attempt, fix_attempts @@ -677,7 +680,7 @@ async def verdict_deadlock_reaper_cycle(conn) -> int: AND (branch LIKE 'extract/%' OR branch LIKE 'reweave/%' OR branch LIKE 'fix/%' - OR branch LIKE '%/research-2%') + OR branch LIKE '%/research-20__-__-__') AND ( (leo_verdict = 'request_changes' AND domain_verdict = 'approve') OR (leo_verdict = 'skipped' AND domain_verdict = 'request_changes')