refactor(orchestrator): swap SubprocessBottleRunner → ProgrammaticBottleRunner
lint / lint (push) Failing after 2m15s
test / unit (pull_request) Successful in 51s
test / integration (pull_request) Successful in 21s
test / coverage (pull_request) Successful in 1m7s

BottleRunner Protocol tightened: start() → str, freeze/resume/destroy → None.
RunResult removed. lifecycle.py unpacks the slug directly. FakeRunner and
test_runner updated to match. Config.bot_bottle_cli dropped (nothing uses it).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-07-01 19:47:57 +00:00
parent 71699b3ecd
commit d5fb159857
7 changed files with 104 additions and 133 deletions
+6 -9
View File
@@ -7,7 +7,7 @@ from __future__ import annotations
from collections.abc import Sequence
from bot_bottle.orchestrator.runner import RunResult, slugify
from bot_bottle.orchestrator.runner import slugify
class FakeForge:
@@ -52,18 +52,15 @@ class FakeRunner:
label: str,
prompt: str,
forge_env: dict[str, str],
) -> RunResult:
) -> str:
self.calls.append(("start", agent, tuple(bottles), label, prompt, dict(forge_env)))
return RunResult(slug=slugify(label), exit_code=0)
return slugify(label)
def freeze(self, slug: str) -> int:
def freeze(self, slug: str) -> None:
self.calls.append(("freeze", slug))
return 0
def resume(self, slug: str, prompt: str) -> RunResult:
def resume(self, slug: str, prompt: str) -> None:
self.calls.append(("resume", slug, prompt))
return RunResult(slug=slug, exit_code=0)
def destroy(self, slug: str) -> int:
def destroy(self, slug: str) -> None:
self.calls.append(("destroy", slug))
return 0