Motivation
OSA's runner infrastructure (hooks, sources) is currently wired to Docker/OCI via OciProvider. Deployers who run OSA in environments without a Docker daemon — or who want to use a different container orchestrator — have no way to swap the runner implementations without forking.
The domain layer already uses clean Protocol-based ports (HookRunner, SourceRunner), and the DI system (Dishka) supports "last provider wins" semantics. The composition root just needs to accept external providers so downstream consumers can override bindings.
Scope
create_container() accepts *extra_providers — extra Dishka providers appended after defaults, overriding any overlapping bindings
create_app() accepts an optional container_factory callable, allowing callers to supply a pre-configured container
- Zero-arg calls remain unchanged — existing deployments and tests are unaffected
Non-goals
- This issue does not implement any specific alternative runner (e.g. Kubernetes Jobs). It only exposes the seam.
- No runtime feature flags or conditional logic in OSA itself.
Related
Motivation
OSA's runner infrastructure (hooks, sources) is currently wired to Docker/OCI via
OciProvider. Deployers who run OSA in environments without a Docker daemon — or who want to use a different container orchestrator — have no way to swap the runner implementations without forking.The domain layer already uses clean Protocol-based ports (
HookRunner,SourceRunner), and the DI system (Dishka) supports "last provider wins" semantics. The composition root just needs to accept external providers so downstream consumers can override bindings.Scope
create_container()accepts*extra_providers— extra Dishka providers appended after defaults, overriding any overlapping bindingscreate_app()accepts an optionalcontainer_factorycallable, allowing callers to supply a pre-configured containerNon-goals
Related