feat: add review effort accounting and budget governor

This commit is contained in:
Claude
2026-09-01 11:41:08 +00:00
parent a202bd3598
commit 3a10deef06
15 changed files with 522 additions and 23 deletions
+10 -7
View File
@@ -7,7 +7,7 @@ from .opencode_synthesis import _normalize_lens_finding
LENS_TIMEOUT_S = 540
def _run_one_lens(workdir, spec, model, factory_root):
def _run_one_lens(workdir, spec, model, factory_root, budget=None, budget_state=None):
"""Run one lens through the compatibility module's runtime seam."""
from . import opencode as oc
@@ -28,9 +28,12 @@ def _run_one_lens(workdir, spec, model, factory_root):
"--agent", spec.id, "--dir", workdir, "--model", model, prompt,
]
try:
proc = oc.subprocess.run(
cmd, cwd=workdir, env=env, capture_output=True, text=True,
stdin=oc.subprocess.DEVNULL, timeout=LENS_TIMEOUT_S,
proc = oc._run_process(
cmd, cwd=workdir, env=env,
timeout=min(LENS_TIMEOUT_S, budget.max_duration_seconds)
if budget else LENS_TIMEOUT_S,
parse_events=oc.parse_opencode_events, budget=budget,
budget_state=budget_state, model=model,
)
except oc.subprocess.TimeoutExpired:
print(f"pragent: lens {spec.id} timed out after {LENS_TIMEOUT_S}s", flush=True)
@@ -69,7 +72,7 @@ def _run_one_lens(workdir, spec, model, factory_root):
return normalized, usage, spec.id
def run_lenses(workdir, reviewers, default_model, factory_root):
def run_lenses(workdir, reviewers, default_model, factory_root, budget=None, budget_state=None):
"""Run configured lenses in parallel and return results by lens id."""
if not reviewers:
return {}
@@ -81,7 +84,7 @@ def run_lenses(workdir, reviewers, default_model, factory_root):
futures = {
ex.submit(
_run_one_lens, workdir, spec,
spec.model or default_model, factory_root,
spec.model or default_model, factory_root, budget, budget_state,
): spec
for spec in reviewers
}
@@ -131,5 +134,5 @@ def merge_usage(parts):
for key in base:
if isinstance(base[key], (int, float)):
base[key] += usage.get(key, 0) or 0
base["iterations"].extend(usage.get("iterations", []) or [])
return base