Skip to content

feat: mount OCI skills through Substrate image volumes - #3203

Merged
EItanya merged 6 commits into
mainfrom
feat/oci-skill-volumes
Oct 16, 2026
Merged

EItanya merged 6 commits into
mainfrom
feat/oci-skill-volumes

Conversation

@EItanya

@EItanya EItanya commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

OCI skills currently pull from inside the golden runtime, where registry access is unavailable. This moves those pulls to Substrate image volumes so the worker mounts the package before preparation and restores it with the actor, using the same registry credentials as workload images.

The compiler deduplicates digest-pinned images across skills, plugins, and shared agents. Runtimes load selected skills from the mounted directories, and the old OCI fetcher is removed. The public source.oci API stays the same.

Adds local-registry E2E coverage across Go ADK, Codex, Claude, and BYO ADK: skill discovery, loading SKILL.md through each harness's normal tools, real script execution, excluded skills, and suspend/resume. Model responses are deterministic; pulls, mounts, and tool execution are real. This checks runtime wiring, not real-model selection quality.

@EItanya
EItanya requested a review from a team as a code owner October 14, 2026 15:55
@github-actions github-actions Bot added enhancement New feature or request and removed enhancement New feature or request labels Oct 14, 2026

@supreme-gg-gg supreme-gg-gg left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change LGTM, two minor comments found by Codex, and also this would need rebasing

if selected != 1 {
return "", fmt.Errorf("exactly one artifact source is required")
}
if source.Directory != "" {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI generated

Can we make validation and copying handle .git consistently? Mounted images can contain special files that the old extractor skipped. A FIFO under .git bypasses validation and blocks copySkill in os.ReadFile. Please validate everything we copy, or skip .git during copying too, and add regression coverage.

require.NoError(t, os.WriteFile(filepath.Join(root, ".claude-plugin/plugin.json"), []byte(`{"name":"mounted-native"}`), 0o644))
materialized, err := Materialize(t.Context(), agentplugin.Resources{Plugins: []agentplugin.Bundle{{Source: agentplugin.Source{Directory: root}}}}, Paths{Packages: t.TempDir(), Skills: t.TempDir()})
require.NoError(t, err)
require.Equal(t, []string{root}, materialized.ClaudeFormatPluginRoots())

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI generated

Can we resolve root with filepath.EvalSymlinks before comparing? This assertion fails on macOS because the returned plugin root is canonicalized from /var/... to /private/var/....

@EItanya
EItanya force-pushed the feat/oci-skill-volumes branch 2 times, most recently from 805f3db to 9a4a696 Compare October 15, 2026 19:20
@blacksmith-sh

This comment has been minimized.

@EItanya

EItanya commented Oct 15, 2026

Copy link
Copy Markdown
Contributor Author

Found 2 test failures on Blacksmith runners:

Failures

Test View Logs
github.com/kagent-dev/kagent/go/core/test/e2e/TestOCISkillsSurviveSuspension View Logs
github.com/kagent-dev/kagent/go/core/test/e2e/TestOCISkillsSurviveSuspension View Logs
Fix with [code]smith Need help on this PR? Tag @codesmith-bot with what you need.

is it new? i didnt know it blacksmith

Yea, we started using it recently when github runners were super sparse, and these have been so much faster!

supreme-gg-gg
supreme-gg-gg previously approved these changes Oct 15, 2026
supreme-gg-gg
supreme-gg-gg previously approved these changes Oct 15, 2026
@EItanya
EItanya added this pull request to the merge queue Oct 15, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 15, 2026
jhyoong pushed a commit to jhyoong/kagent that referenced this pull request Oct 16, 2026
Depends on kagent-dev#3203 which makes OCI skills work again

Go ADK automatically registers bash when skills are loaded. Add
`runtime.skill_tools.disable_bash` to disable it for the root agent and
all subagents while preserving skill loading and file tools. Bash
remains enabled by default.

Group `file_search_tools`, `bash_venv_path`, and `disable_bash` into a
shared `SkillToolsConfig` used by controller defaults and ADK runtime
configuration. Update Go and Python consumers, Helm values,
documentation, and generated protobuf outputs. Existing flat settings
must move into the nested block.

For controller-managed runtimes, set
`config.runtimeDefaults.skillTools.disableBash: true`.

---------

Signed-off-by: Jet Chiang <[email protected]>
@EItanya
EItanya force-pushed the feat/oci-skill-volumes branch from 2af137c to 8f025a8 Compare October 16, 2026 13:29
@EItanya
EItanya enabled auto-merge October 16, 2026 13:31
@EItanya
EItanya disabled auto-merge October 16, 2026 13:44
@EItanya
EItanya merged commit 673d181 into main Oct 16, 2026
29 checks passed
@EItanya
EItanya deleted the feat/oci-skill-volumes branch October 16, 2026 13:44
QuentinBisson added a commit to giantswarm/kagent-upstream that referenced this pull request Oct 19, 2026
QuentinBisson added a commit to giantswarm/kagent-upstream that referenced this pull request Oct 19, 2026
* docs(fork): ledger facts as of 2026-10-19

Signed-off-by: QuentinBisson <[email protected]>

* docs(fork): the compiled-skills carried row superseded by upstream kagent-dev#3203

Signed-off-by: QuentinBisson <[email protected]>

* docs(fork): a machine-readable header on every carried-change file (#720)

* docs(fork): a machine-readable header on every carried-change file

Every file under fork/carried/ opens with the YAML front-matter proposed in #719, seeded from the row and the 2026-10-19 state board; scripts/fork/carried.sh skips the front-matter before checking the row; FORK.md names the fields.

Signed-off-by: QuentinBisson <[email protected]>

* docs(fork): drop internal tracker numbers from the headers, add the Substrate counterpart edges

Signed-off-by: QuentinBisson <[email protected]>

* ci(fork): check the ledger header schema

The fork-ledger check runs scripts/fork/ledger-header.sh on fork/carried next to carried.sh --check, with its --self-test fixtures, the same rules as fork-ledger validate (#719).

Signed-off-by: QuentinBisson <[email protected]>

---------

Signed-off-by: QuentinBisson <[email protected]>

---------

Signed-off-by: QuentinBisson <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants