User Story
As an OpenShell operator or contributor, I want standalone compute drivers to share a clear startup contract, so that I can run gateway-external drivers consistently across Docker, Podman, VM, and CI environments.
Problem Statement
OpenShell supports external compute drivers through the gateway remote driver path: the gateway selects a configured driver name and connects to a Unix socket. However, the startup UX for standalone driver processes is not consistent across drivers.
The gateway-side contract is generic:
- select one compute driver
- configure
[openshell.drivers.<driver>].socket_path
- connect to the external driver over the socket
The driver-side startup contract is not yet generic:
- Docker uses
--bind-socket, --config, and --gateway-bind
- Podman uses
--bind-socket or OPENSHELL_COMPUTE_DRIVER_SOCKET plus many individual flags/env vars
- VM has its own set of startup flags
- Kubernetes external-driver mode is expressed through Helm/image composition
This makes external-driver testing and CI artifact reuse harder than it should be. It also makes it unclear which options are part of the common external-driver API versus driver-specific runtime configuration.
Impact / Why This Matters
Today, each E2E harness has to know driver-specific launch details. That increases duplication and makes it easy for coverage to drift. In particular, restoring rootless Podman through Nix VM tooling exposed that the gateway-side external-driver model is generic, but the standalone driver launch UX is not.
This blocks a clean CI workflow where prepared artifacts can be composed predictably:
- driver-free gateway artifact
- standalone compute-driver artifact
- supervisor/sandbox artifact
- Nix VM guest runtime
This also leaves a narrower coverage gap after #2981 removed the original rootless Podman lane: rootless Podman with pasta, a driver-free gateway, and an external openshell-driver-podman process.
Related PR: #2981
Proposed Design
Define and implement a consistent startup UX for standalone compute drivers.
Externally observable behavior should include:
- Every standalone compute driver can bind its public gateway socket through the same option, for example
--bind-socket.
- Every standalone compute driver can consume driver runtime configuration through a consistent mechanism, for example
--config.
- Gateway callback/listener inputs have a consistent name and meaning across drivers.
- The gateway continues to select external mode through
[openshell.drivers.<driver>].socket_path.
- E2E tooling can start an external driver without embedding one-off launch logic for each driver.
Use VM-backed rootless Podman testing as one validation path:
- Build or download a driver-free gateway artifact.
- Build or download
openshell-driver-podman.
- Start both inside the Ubuntu 26.04 Nix test guest.
- Run the rootless Podman E2E suite against the external driver.
Acceptance Criteria
Alternatives Considered
Keep adding driver-specific branches to each E2E helper. This is simpler short-term, but it preserves the API ambiguity and makes future external-driver coverage harder to compose.
Treat rootless Podman external-driver coverage as only a test gap. That restores one lost CI scenario, but it does not address the underlying inconsistency exposed by the work.
User Story
As an OpenShell operator or contributor, I want standalone compute drivers to share a clear startup contract, so that I can run gateway-external drivers consistently across Docker, Podman, VM, and CI environments.
Problem Statement
OpenShell supports external compute drivers through the gateway remote driver path: the gateway selects a configured driver name and connects to a Unix socket. However, the startup UX for standalone driver processes is not consistent across drivers.
The gateway-side contract is generic:
[openshell.drivers.<driver>].socket_pathThe driver-side startup contract is not yet generic:
--bind-socket,--config, and--gateway-bind--bind-socketorOPENSHELL_COMPUTE_DRIVER_SOCKETplus many individual flags/env varsThis makes external-driver testing and CI artifact reuse harder than it should be. It also makes it unclear which options are part of the common external-driver API versus driver-specific runtime configuration.
Impact / Why This Matters
Today, each E2E harness has to know driver-specific launch details. That increases duplication and makes it easy for coverage to drift. In particular, restoring rootless Podman through Nix VM tooling exposed that the gateway-side external-driver model is generic, but the standalone driver launch UX is not.
This blocks a clean CI workflow where prepared artifacts can be composed predictably:
This also leaves a narrower coverage gap after #2981 removed the original rootless Podman lane: rootless Podman with
pasta, a driver-free gateway, and an externalopenshell-driver-podmanprocess.Related PR: #2981
Proposed Design
Define and implement a consistent startup UX for standalone compute drivers.
Externally observable behavior should include:
--bind-socket.--config.[openshell.drivers.<driver>].socket_path.Use VM-backed rootless Podman testing as one validation path:
openshell-driver-podman.Acceptance Criteria
openshell-driver-podmaninside the Nix VM.Alternatives Considered
Keep adding driver-specific branches to each E2E helper. This is simpler short-term, but it preserves the API ambiguity and makes future external-driver coverage harder to compose.
Treat rootless Podman external-driver coverage as only a test gap. That restores one lost CI scenario, but it does not address the underlying inconsistency exposed by the work.