You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
OpenShellSpawner: Cross-platform skills_image extraction via crane #106
_load_skills() in OpenShellSpawner currently extracts skills from OCI images using the Podman Python SDK, which requires a Podman socket. This works when:
OpenShell gateway uses the Podman driver (runner has Podman socket mounted) ✅
Runner runs on a host with Podman ✅
It fails when:
OpenShell gateway uses the K8s driver (runner is a K8s pod with no Podman socket) ❌
Any environment without a container runtime accessible to the runner ❌
The current code raises RuntimeError("neither Podman SDK nor podman CLI available") in these cases.
Summary: Replace Podman-dependent skills image extraction with crane (static Go binary) for cross-platform support — enables K8s driver deployments where no Podman socket is available.
✅ Verification plan covers both Podman and K8s driver paths
⚠️crane binary in runner image adds ~15MB. Consider whether it should be optional (only included in OpenShell-aware runner builds) or always bundled.
⚠️ Registry auth for crane — plan says "standard auth" but doesn't specify how credentials reach crane in a K8s pod. crane reads ~/.docker/config.json or DOCKER_CONFIG by default. If the runner pod has a pull secret mounted, crane needs to be pointed at it.
Closing as superseded, not implemented as originally planned. #202 (closed 2026-08-28) found the whole crane/Podman-extraction + tar-upload approach broken for two stacked reasons (this issue, plus a separate permissions bug in #201) and redesigned the mechanism entirely: skills now ship baked into the sandbox image at build time, scoped per-run via allowed_skills/Landlock instead of extracted at runtime. _load_skills()/_extract_skills_image() no longer exist in openshell_spawner.py -- the Podman-socket dependency this issue was about is gone along with the code that needed it.
Activity
beesarmy commentedon Jul 11, 2026
Triage
Summary: Replace Podman-dependent skills image extraction with
crane(static Go binary) for cross-platform support — enables K8s driver deployments where no Podman socket is available.Affected components:
src/cloud_agents/spawner/openshell_spawner.py—_load_skills()(line 575),_extract_skills_image()(line 601)cranebinaryRelated issues/PRs:
Suggested labels:
enhancement,area/spawnerPlan review:
_extract_skills_image()uses Podman SDK/CLI, confirmed at line 601. Fails on K8s driver deployments.craneis a well-known tool for daemon-less OCI image operations — correct choice for this use caseexec_streamtar) unchanged — clean separation of extraction vs injectioncrane→ Podman SDK → podman CLI → error) is defensivecranebinary in runner image adds ~15MB. Consider whether it should be optional (only included in OpenShell-aware runner builds) or always bundled.crane— plan says "standard auth" but doesn't specify how credentials reachcranein a K8s pod.cranereads~/.docker/config.jsonorDOCKER_CONFIGby default. If the runner pod has a pull secret mounted,craneneeds to be pointed at it.Non-blocking⚠️ only. Plan approved.
🤖 Triaged by beesarmy via Claude Code
RSPEED-0000: Skills image via Podman driver_config + fragility analys…
Fix command injection via skills_paths across all three spawners (#203)
Redesign skills delivery: bake into image, scope per-step via Landlock (
jameswnl commentedon Aug 28, 2026
Closing as superseded, not implemented as originally planned. #202 (closed 2026-08-28) found the whole crane/Podman-extraction + tar-upload approach broken for two stacked reasons (this issue, plus a separate permissions bug in #201) and redesigned the mechanism entirely: skills now ship baked into the sandbox image at build time, scoped per-run via allowed_skills/Landlock instead of extracted at runtime.
_load_skills()/_extract_skills_image()no longer exist in openshell_spawner.py -- the Podman-socket dependency this issue was about is gone along with the code that needed it.