054dc09b38
test / run tests/run_tests.py (pull_request) Successful in 14s
Template Method pattern. BottleBackend.provision is now concrete and orchestrates four abstract sub-methods: provision_prompt -> str | None (only one with a meaningful return) provision_skills -> None provision_ssh -> None provision_git -> None Each is self-gating: skills/ssh/git short-circuit on empty inputs; prompt always copies (the path must exist) and returns None when the agent has no prompt content. DockerBottleBackend drops its own `provision` (inherited from the base) and now just implements the four sub-methods. Each sub-method takes `plan: BottlePlan` (matching the abstract) and asserts isinstance to narrow to DockerBottlePlan internally, same pattern as `launch`. A future fly.io backend implements the four sub-methods; provision works for it unchanged.