[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71GVB6E19QT2TVZYQVB0ZPH":3,"skill-same:01M71GVB6E19QT2TVZYQVB0ZPH":73},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":31,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":54,"ownerHtmlUrl":55,"ownerBlogUrl":56,"ownerDescription":57,"updatedAt":58,"install":59,"resources":72},"01M71GVB6E19QT2TVZYQVB0ZPH","test-e2e-openshell",null,"Run end-to-end tests for the openshell backend using real container and API calls","opendatahub-io\u002Fagentic-ci","opendatahub-io","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F57720972?v=4","01M71GV44JHF2SWWQW4W55AQYX","Open Data Hub","01M71GV458GEMWPFK0TBCK1WFW",14,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fopendatahub-io\u002Fagentic-ci\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftest-e2e-openshell\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43],"e2e","test","test e2e","test e2e openshell","for","end","calls","tests","container","api","backend","run","2026-11-10 10:12:30",false,"---\nname: test-e2e-openshell\ndescription: Run end-to-end tests for the openshell backend using real container and API calls\n---\n\n# End-to-End OpenShell Backend Test\n\nRun full lifecycle tests of the OpenShell backend across harnesses and auth modes.\nAll tests run inside a privileged container.\n\nEach section below is independent. Run whichever sections match your environment and skip the rest.\n\n## Before you start\n\nPresent the following default container images to the user and ask them\nto confirm or override each one before proceeding:\n\n| Role               | Default image                                          | Variable                    |\n|--------------------|--------------------------------------------------------|-----------------------------|\n| CI image           | `quay.io\u002Faipcc\u002Fagentic-ci\u002Fopenshell`                  | `$CI_IMAGE`                 |\n| Supervisor         | `quay.io\u002Fopendatahub\u002Fodh-openshell-supervisor:v0.1.6-rhaiv.4` | `$SUPERVISOR_IMAGE`  |\n| Sandbox runtime    | `quay.io\u002Fopendatahub\u002Fodh-openshell-sandbox:v0.1.6-rhaiv.4`    | `$SANDBOX_RUNTIME_IMAGE` |\n| Claude sandbox     | `quay.io\u002Faipcc\u002Fagentic-ci\u002Fclaude-sandbox`              | `$CLAUDE_SANDBOX_IMAGE`     |\n| OpenCode sandbox   | `quay.io\u002Faipcc\u002Fagentic-ci\u002Fopencode-sandbox`            | `$OPENCODE_SANDBOX_IMAGE`   |\n\nThe supervisor and sandbox runtime tags must match `OPENSHELL_IMAGE_TAG` in\n`images\u002Fci\u002FContainerfile.openshell` (the CLI and gateway baked into the CI\nimage). The CI image already sets both variables to those images; the `-e`\nflags below override them, so never leave `$SUPERVISOR_IMAGE` or\n`$SANDBOX_RUNTIME_IMAGE` empty or untagged: an empty value makes the gateway\nfall back to its compiled-in `ghcr.io\u002Fnvidia\u002Fopenshell` images, which CI\ncannot pull, and an untagged one pulls `:latest`.\n\nAlso ask for:\n\n- **API key file** — path to a local file containing an Anthropic API key\n  (one line, no whitespace). Needed for Sections B and D. Store as\n  `$API_KEY_FILE`.\n\nPer-section requirements:\n- **Vertex AI auth** (Sections A, C, E, F, G): GCP ADC credentials at\n  `~\u002F.config\u002Fgcloud\u002Fapplication_default_credentials.json` and\n  `ANTHROPIC_VERTEX_PROJECT_ID` + `CLOUD_ML_REGION` set in the environment.\n- **API key auth** (Sections B, D, H): The API key file above.\n\n## Container setup\n\nOpenShell requires `--privileged` for nested podman (user namespace mapping,\noverlay mounts, network namespace creation). All agentic-ci commands run\ninside this outer container.\n\n### Start the test container\n\n```bash\npodman rm -f openshell-e2e 2>\u002Fdev\u002Fnull || true\npodman run -d --name openshell-e2e \\\n  --privileged \\\n  -v \"$(pwd):\u002Fworkspace:ro,z\" \\\n  -v ~\u002F.config\u002Fgcloud:\u002Fhost-gcloud:ro,z \\\n  -v \"$API_KEY_FILE:\u002Fhost-api-key:ro,z\" \\\n  $CI_IMAGE \\\n  sleep infinity\n```\n\n### Prepare the environment\n\n```bash\npodman exec openshell-e2e bash -c '\n  mkdir -p ~\u002F.config\u002Fgcloud\n  cp \u002Fhost-gcloud\u002Fapplication_default_credentials.json ~\u002F.config\u002Fgcloud\u002F\n  cd \u002Fworkspace && uv pip install --system --no-cache .\n'\n```\n\nIf the sandbox images are on a registry, the container's podman will pull\nthem automatically during sandbox creation. If they are only available\nlocally (not pushed to any registry), copy them into the container's\npodman storage:\n\n```bash\npodman save $CLAUDE_SANDBOX_IMAGE -o \u002Ftmp\u002Fopenshell-claude.tar\npodman save $OPENCODE_SANDBOX_IMAGE -o \u002Ftmp\u002Fopenshell-opencode.tar\npodman cp \u002Ftmp\u002Fopenshell-claude.tar openshell-e2e:\u002Ftmp\u002F\npodman cp \u002Ftmp\u002Fopenshell-opencode.tar openshell-e2e:\u002Ftmp\u002F\npodman exec openshell-e2e bash -c '\n  podman load -i \u002Ftmp\u002Fopenshell-claude.tar\n  podman load -i \u002Ftmp\u002Fopenshell-opencode.tar\n  rm -f \u002Ftmp\u002Fopenshell-*.tar\n'\nrm -f \u002Ftmp\u002Fopenshell-claude.tar \u002Ftmp\u002Fopenshell-opencode.tar\n```\n\nVerify:\n- `podman exec openshell-e2e openshell --version` shows version output\n- `podman exec openshell-e2e agentic-ci --help` prints usage\n- `podman exec openshell-e2e podman images` lists both sandbox images\n\n## Cleanup between tests\n\nThe gateway and sandbox state must be fully reset between tests. Run this\nbefore each new section:\n\n```bash\npodman exec openshell-e2e bash -c '\n  pids=$(ss -tlnp | grep 17670 | grep -oP \"pid=\\K[0-9]+\" 2>\u002Fdev\u002Fnull)\n  [ -n \"$pids\" ] && kill -9 $pids 2>\u002Fdev\u002Fnull\n  pkill -9 -f \"podman system\" 2>\u002Fdev\u002Fnull\n  sleep 1\n  podman rm -af 2>\u002Fdev\u002Fnull\n  podman network rm openshell 2>\u002Fdev\u002Fnull\n  rm -rf ~\u002F.config\u002Fopenshell ~\u002F.local\u002Fstate\u002Fopenshell\n'\n```\n\n## Models\n\nUse haiku to keep cost down. The model name format varies by harness:\n\n| Harness     | Vertex AI model                             | API key model                          |\n|-------------|---------------------------------------------|----------------------------------------|\n| Claude Code | `claude-haiku-4-5`                          | `claude-haiku-4-5`                     |\n| OpenCode    | `google-vertex\u002Fclaude-haiku-4-5@20251001`   | `anthropic\u002Fclaude-haiku-4-5-20251001`  |\n\n## Known issue: Claude Code + Vertex AI\n\nClaude Code sends a `context_management` field that Vertex AI's rawPredict\nrejects with HTTP 400. This is an upstream OpenShell bug\n([NVIDIA\u002FOpenShell#1752](https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FOpenShell\u002Fpull\u002F1752)).\nThe workaround is `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1`, which\nagentic-ci now sets automatically in the sandbox env script.\n\nSee `docs\u002Fopenshell-vertex-streaming-bug.md` for details.\n\n---\n\n## Section A: Claude Code + Vertex AI\n\nRequires GCP ADC credentials and `ANTHROPIC_VERTEX_PROJECT_ID`.\n\n### A1. Run\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e OPENSHELL_SUPERVISOR_IMAGE=\"$SUPERVISOR_IMAGE\" \\\n  -e OPENSHELL_SANDBOX_RUNTIME_IMAGE=\"$SANDBOX_RUNTIME_IMAGE\" \\\n  -e SANDBOX_IMAGE=\"$CLAUDE_SANDBOX_IMAGE\" \\\n  openshell-e2e bash -c '\n    agentic-ci run \\\n      --backend openshell \\\n      --harness claude-code \\\n      --image \"$SANDBOX_IMAGE\" \\\n      --model claude-haiku-4-5 \\\n      --no-otel \\\n      \"Respond with exactly: A1_OK\"\n  '\n```\n\nVerify:\n- Output shows `Auth: Vertex AI`\n- Output shows `Starting OpenShell gateway` (or `already running`)\n- Output shows `Creating Vertex AI provider` (or `already exists`)\n- Output shows `Created sandbox: ci`\n- Output shows `Running Claude Code (claude-haiku-4-5) via openshell backend`\n- Claude's response contains `A1_OK`\n- Token metrics show non-zero counts and cost is non-zero (e.g. `$0.04`)\n- `Agent exit code: 0`\n- `Sandbox deleted` and `Gateway stopped` at the end\n\n---\n\n## Section B: Claude Code + API Key\n\nRun cleanup first.\n\n### B1. Run\n\n```bash\npodman exec \\\n  -e \"ANTHROPIC_API_KEY=$(cat \"$API_KEY_FILE\")\" \\\n  -e OPENSHELL_SUPERVISOR_IMAGE=\"$SUPERVISOR_IMAGE\" \\\n  -e OPENSHELL_SANDBOX_RUNTIME_IMAGE=\"$SANDBOX_RUNTIME_IMAGE\" \\\n  -e SANDBOX_IMAGE=\"$CLAUDE_SANDBOX_IMAGE\" \\\n  openshell-e2e bash -c '\n    agentic-ci run \\\n      --backend openshell \\\n      --harness claude-code \\\n      --image \"$SANDBOX_IMAGE\" \\\n      --model claude-haiku-4-5 \\\n      --no-otel \\\n      \"Respond with exactly: B1_OK\"\n  '\n```\n\nVerify:\n- Output shows `Auth: API key`\n- Output shows `Creating Anthropic API key provider`\n- Claude's response contains `B1_OK`\n- Token metrics show non-zero counts and cost is non-zero\n- `Agent exit code: 0`\n\n---\n\n## Section C: OpenCode + Vertex AI\n\nRequires GCP ADC credentials and `ANTHROPIC_VERTEX_PROJECT_ID`.\n\nRun cleanup first.\n\n### C1. Run\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e OPENSHELL_SUPERVISOR_IMAGE=\"$SUPERVISOR_IMAGE\" \\\n  -e OPENSHELL_SANDBOX_RUNTIME_IMAGE=\"$SANDBOX_RUNTIME_IMAGE\" \\\n  -e SANDBOX_IMAGE=\"$OPENCODE_SANDBOX_IMAGE\" \\\n  openshell-e2e bash -c '\n    agentic-ci run \\\n      --backend openshell \\\n      --harness opencode \\\n      --image \"$SANDBOX_IMAGE\" \\\n      --model \"google-vertex\u002Fclaude-haiku-4-5@20251001\" \\\n      --no-otel \\\n      \"Respond with exactly: C1_OK\"\n  '\n```\n\nVerify:\n- Output shows `Harness: OpenCode` and `Auth: Vertex AI`\n- Inference configured with `Model: claude-haiku-4-5` (prefix stripped)\n- `Agent exit code: 0`\n\n---\n\n## Section D: OpenCode + API Key\n\nRun cleanup first.\n\n### D1. Run\n\n```bash\npodman exec \\\n  -e \"ANTHROPIC_API_KEY=$(cat \"$API_KEY_FILE\")\" \\\n  -e OPENSHELL_SUPERVISOR_IMAGE=\"$SUPERVISOR_IMAGE\" \\\n  -e OPENSHELL_SANDBOX_RUNTIME_IMAGE=\"$SANDBOX_RUNTIME_IMAGE\" \\\n  -e SANDBOX_IMAGE=\"$OPENCODE_SANDBOX_IMAGE\" \\\n  openshell-e2e bash -c '\n    agentic-ci run \\\n      --backend openshell \\\n      --harness opencode \\\n      --image \"$SANDBOX_IMAGE\" \\\n      --model \"anthropic\u002Fclaude-haiku-4-5-20251001\" \\\n      --no-otel \\\n      \"Respond with exactly: D1_OK\"\n  '\n```\n\nVerify:\n- Output shows `Harness: OpenCode` and `Auth: API key`\n- Agent response contains `D1_OK`\n- `Agent exit code: 0`\n\n---\n\n## Section E: Workdir round-trip\n\nVerifies that the OpenShell backend uploads the workdir into the sandbox,\nthe agent can modify files inside it, and changes are downloaded back to\nthe host after the run completes. Uses Vertex AI auth and Claude Code.\n\nRun cleanup first.\n\n### E1. Prepare workdir\n\nCreate a temporary directory with a seed file:\n\n```bash\npodman exec openshell-e2e bash -c '\n  mkdir -p \u002Ftmp\u002Fworkdir-test\n  echo red > \u002Ftmp\u002Fworkdir-test\u002Fcolor.txt\n'\n```\n\nVerify:\n\n```bash\npodman exec openshell-e2e cat \u002Ftmp\u002Fworkdir-test\u002Fcolor.txt\n```\n\nShould print `red`.\n\n### E2. Run agent to modify the file\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e OPENSHELL_SUPERVISOR_IMAGE=\"$SUPERVISOR_IMAGE\" \\\n  -e OPENSHELL_SANDBOX_RUNTIME_IMAGE=\"$SANDBOX_RUNTIME_IMAGE\" \\\n  -e SANDBOX_IMAGE=\"$CLAUDE_SANDBOX_IMAGE\" \\\n  openshell-e2e bash -c '\n    agentic-ci run \\\n      --backend openshell \\\n      --harness claude-code \\\n      --image \"$SANDBOX_IMAGE\" \\\n      --model claude-haiku-4-5 \\\n      --workdir \u002Ftmp\u002Fworkdir-test \\\n      --no-otel \\\n      \"Overwrite the file color.txt with exactly the word blue (no newline, no quotes). Do not create any other files.\"\n  '\n```\n\nVerify:\n- Output shows `Uploading workdir`\n- Output shows `Downloading workdir`\n- `Agent exit code: 0`\n\n### E3. Verify workdir was updated on the host\n\n```bash\npodman exec openshell-e2e cat \u002Ftmp\u002Fworkdir-test\u002Fcolor.txt\n```\n\nThe file should now contain `blue`, not `red`. This confirms the full\nround-trip: the workdir was uploaded into the sandbox, the agent modified\nit, and the changes were downloaded back to the host.\n\n### E4. Clean up workdir\n\n```bash\npodman exec openshell-e2e rm -rf \u002Ftmp\u002Fworkdir-test\n```\n\n---\n\n## Section F: OTEL telemetry collection\n\nVerifies that the sandbox-local OTEL collector receives metrics from the\nagent and prints a token\u002Fcost summary. Uses Vertex AI auth and Claude Code\n(the only harness that supports OTEL).\n\nThe OpenShell sandbox network isolation prevents reaching an external OTEL\ncollector, so agentic-ci embeds a lightweight OTLP receiver inside the\nsandbox on localhost. After the run, the OTEL log is downloaded from the\nsandbox and the summary is printed on the host.\n\nRun cleanup first.\n\n### F1. Run with OTEL enabled\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e OPENSHELL_SUPERVISOR_IMAGE=\"$SUPERVISOR_IMAGE\" \\\n  -e OPENSHELL_SANDBOX_RUNTIME_IMAGE=\"$SANDBOX_RUNTIME_IMAGE\" \\\n  -e SANDBOX_IMAGE=\"$CLAUDE_SANDBOX_IMAGE\" \\\n  openshell-e2e bash -c '\n    cd \u002Ftmp\u002Fe2e-workdir && \\\n    agentic-ci run \\\n      --backend openshell \\\n      --harness claude-code \\\n      --image \"$SANDBOX_IMAGE\" \\\n      --model claude-haiku-4-5 \\\n      \"Respond with exactly: F1_OK\"\n  '\n```\n\nNote: no `--no-otel` flag.\n\nVerify:\n- Output shows `Running Claude Code (claude-haiku-4-5) via openshell backend`\n- Agent runs and completes with `F1_OK` in the response\n- Output shows `Token\u002FCost Summary (OpenTelemetry)` section\n- Token counts are non-zero (input tokens, output tokens, cache)\n- Cost is non-zero (e.g. `$0.04`)\n- `Agent exit code: 0`\n- `Sandbox deleted` and `Gateway stopped` at the end\n\n### F2. Verify trace records for mlflow-push\n\nCheck that the OTEL JSONL log contains `\u002Fv1\u002Ftraces` records — these are\nwhat `agentic-ci mlflow-push` needs. The JSONL file is copied to the\nCI artifact directory or stays in the run directory:\n\n```bash\npodman exec openshell-e2e bash -c '\n  JSONL=$(ls -t \u002Ftmp\u002Fagentic-ci-run.*\u002Fclaude-otel.jsonl 2>\u002Fdev\u002Fnull | head -1)\n  echo \"JSONL file: $JSONL\"\n  grep -c \"\u002Fv1\u002Ftraces\" \"$JSONL\"\n'\n```\n\nVerify:\n- The JSONL file exists\n- The trace count is at least 1\n- Optionally inspect a trace record:\n  ```bash\n  podman exec openshell-e2e bash -c '\n    JSONL=$(ls -t \u002Ftmp\u002Fagentic-ci-run.*\u002Fclaude-otel.jsonl 2>\u002Fdev\u002Fnull | head -1)\n    grep \"\u002Fv1\u002Ftraces\" \"$JSONL\" | head -1 | python3 -m json.tool\n  '\n  ```\n  - Record has `\"path\"` containing `\u002Fv1\u002Ftraces`\n  - Record has `\"payload\"` with `\"resourceSpans\"` array\n\n---\n\n## Section G: Skill execution — Vertex AI\n\nVerifies that a plugin skill loads and executes correctly inside the\nsandbox. Uses the `git-shallow-clone` skill from the `odh-git`\nplugin to clone a repo into `\u002Ftmp` and confirm the result.\n\nRequires GCP ADC credentials and `ANTHROPIC_VERTEX_PROJECT_ID`.\n\nRun cleanup first.\n\n### G1. Run\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e OPENSHELL_SUPERVISOR_IMAGE=\"$SUPERVISOR_IMAGE\" \\\n  -e OPENSHELL_SANDBOX_RUNTIME_IMAGE=\"$SANDBOX_RUNTIME_IMAGE\" \\\n  -e SANDBOX_IMAGE=\"$CLAUDE_SANDBOX_IMAGE\" \\\n  openshell-e2e bash -c '\n    mkdir -p \u002Ftmp\u002Fe2e-workdir && cd \u002Ftmp\u002Fe2e-workdir && \\\n    agentic-ci run \\\n      --backend openshell \\\n      --harness claude-code \\\n      --image \"$SANDBOX_IMAGE\" \\\n      --model claude-haiku-4-5 \\\n      --no-otel \\\n      \"Use the \u002Fodh-git:git-shallow-clone skill to shallow-clone https:\u002F\u002Fgithub.com\u002Fopendatahub-io\u002Fagentic-ci.git into \u002Ftmp\u002Fagentic-ci. After the clone completes, run: ls \u002Ftmp\u002Fagentic-ci and print the output, then respond with exactly: SKILL_OK\"\n  '\n```\n\nVerify:\n- `Plugins:` line includes `odh-git`\n- Output shows `Skill` tool invocation for `odh-git:git-shallow-clone`\n- Output shows a `Bash` tool call running `git clone`\n- Output shows `ls \u002Ftmp\u002Fagentic-ci` with repo contents (e.g. `src`, `pyproject.toml`, `Makefile`)\n- Agent response contains `SKILL_OK`\n- `Agent exit code: 0`\n\n---\n\n## Section H: Skill execution — API Key\n\nSame test as Section G but with API key auth.\n\nRun cleanup first.\n\n### H1. Run\n\n```bash\npodman exec \\\n  -e \"ANTHROPIC_API_KEY=$(cat \"$API_KEY_FILE\")\" \\\n  -e OPENSHELL_SUPERVISOR_IMAGE=\"$SUPERVISOR_IMAGE\" \\\n  -e OPENSHELL_SANDBOX_RUNTIME_IMAGE=\"$SANDBOX_RUNTIME_IMAGE\" \\\n  -e SANDBOX_IMAGE=\"$CLAUDE_SANDBOX_IMAGE\" \\\n  openshell-e2e bash -c '\n    mkdir -p \u002Ftmp\u002Fe2e-workdir && cd \u002Ftmp\u002Fe2e-workdir && \\\n    agentic-ci run \\\n      --backend openshell \\\n      --harness claude-code \\\n      --image \"$SANDBOX_IMAGE\" \\\n      --model claude-haiku-4-5 \\\n      --no-otel \\\n      \"Use the \u002Fodh-git:git-shallow-clone skill to shallow-clone https:\u002F\u002Fgithub.com\u002Fopendatahub-io\u002Fagentic-ci.git into \u002Ftmp\u002Fagentic-ci. After the clone completes, run: ls \u002Ftmp\u002Fagentic-ci and print the output, then respond with exactly: SKILL_OK\"\n  '\n```\n\nVerify:\n- Output shows `Auth: API key`\n- `Plugins:` line includes `odh-git`\n- Output shows `Skill` tool invocation for `odh-git:git-shallow-clone`\n- Output shows `ls \u002Ftmp\u002Fagentic-ci` with repo contents (e.g. `src`, `pyproject.toml`, `Makefile`)\n- Agent response contains `SKILL_OK`\n- `Agent exit code: 0`\n\n---\n\n## Final cleanup\n\n```bash\npodman rm -f openshell-e2e\n```\n\n## Running the full suite\n\nExecute sections in order (A through H), running the cleanup step before each\nsection. Skip sections whose prerequisites are not met. If any step fails,\ncheck the gateway log inside the container:\n\n```bash\npodman exec openshell-e2e bash -c 'cat ~\u002F.local\u002Fstate\u002Fopenshell\u002Fgateway-*.log'\n```\n","# End-to-End OpenShell Backend Test\n\nRun full lifecycle tests of the OpenShell backend across harnesses and auth modes.\nAll tests run inside a privileged container.\n\nEach section below is independent. Run whichever sections match your environment and skip the rest.\n\n## Before you start\n\nPresent the following default container images to the user and ask them\nto confirm or override each one before proceeding:\n\n| Role               | Default image                                          | Variable                    |\n|--------------------|--------------------------------------------------------|-----------------------------|\n| CI image           | `quay.io\u002Faipcc\u002Fagentic-ci\u002Fopenshell`                  | `$CI_IMAGE`                 |\n| Supervisor         | `quay.io\u002Fopendatahub\u002Fodh-openshell-supervisor:v0.1.6-rhaiv.4` | `$SUPERVISOR_IMAGE`  |\n| Sandbox runtime    | `quay.io\u002Fopendatahub\u002Fodh-openshell-sandbox:v0.1.6-rhaiv.4`    | `$SANDBOX_RUNTIME_IMAGE` |\n| Claude sandbox     | `quay.io\u002Faipcc\u002Fagentic-ci\u002Fclaude-sandbox`              | `$CLAUDE_SANDBOX_IMAGE`     |\n| OpenCode sandbox   | `quay.io\u002Faipcc\u002Fagentic-ci\u002Fopencode-sandbox`            | `$OPENCODE_SANDBOX_IMAGE`   |\n\nThe supervisor and sandbox runtime tags must match `OPENSHELL_IMAGE_TAG` in\n`images\u002Fci\u002FContainerfile.openshell` (the CLI and gateway baked into the CI\nimage). The CI image already sets both variables to those images; the `-e`\nflags below override them, so never leave `$SUPERVISOR_IMAGE` or\n`$SANDBOX_RUNTIME_IMAGE` empty or untagged: an empty value makes the gateway\nfall back to its compiled-in `ghcr.io\u002Fnvidia\u002Fopenshell` images, which CI\ncannot pull, and an untagged one pulls `:latest`.\n\nAlso ask for:\n\n- **API key file** — path to a local file containing an Anthropic API key\n  (one line, no whitespace). Needed for Sections B and D. Store as\n  `$API_KEY_FILE`.\n\nPer-section requirements:\n- **Vertex AI auth** (Sections A, C, E, F, G): GCP ADC credentials at\n  `~\u002F.config\u002Fgcloud\u002Fapplication_default_credentials.json` and\n  `ANTHROPIC_VERTEX_PROJECT_ID` + `CLOUD_ML_REGION` set in the environment.\n- **API key auth** (Sections B, D, H): The API key file above.\n\n## Container setup\n\nOpenShell requires `--privileged` for nested podman (user namespace mapping,\noverlay mounts, network namespace creation). All agentic-ci commands run\ninside this outer container.\n\n### Start the test container\n\n```bash\npodman rm -f openshell-e2e 2>\u002Fdev\u002Fnull || true\npodman run -d --name openshell-e2e \\\n  --privileged \\\n  -v \"$(pwd):\u002Fworkspace:ro,z\" \\\n  -v ~\u002F.config\u002Fgcloud:\u002Fhost-gcloud:ro,z \\\n  -v \"$API_KEY_FILE:\u002Fhost-api-key:ro,z\" \\\n  $CI_IMAGE \\\n  sleep infinity\n```\n\n### Prepare the environment\n\n```bash\npodman exec openshell-e2e bash -c '\n  mkdir -p ~\u002F.config\u002Fgcloud\n  cp \u002Fhost-gcloud\u002Fapplication_default_credentials.json ~\u002F.config\u002Fgcloud\u002F\n  cd \u002Fworkspace && uv pip install --system --no-cache .\n'\n```\n\nIf the sandbox images are on a registry, the container's podman will pull\nthem automatically during sandbox creation. If they are only available\nlocally (not pushed to any registry), copy them into the container's\npodman storage:\n\n```bash\npodman save $CLAUDE_SANDBOX_IMAGE -o \u002Ftmp\u002Fopenshell-claude.tar\npodman save $OPENCODE_SANDBOX_IMAGE -o \u002Ftmp\u002Fopenshell-opencode.tar\npodman cp \u002Ftmp\u002Fopenshell-claude.tar openshell-e2e:\u002Ftmp\u002F\npodman cp \u002Ftmp\u002Fopenshell-opencode.tar openshell-e2e:\u002Ftmp\u002F\npodman exec openshell-e2e bash -c '\n  podman load -i \u002Ftmp\u002Fopenshell-claude.tar\n  podman load -i \u002Ftmp\u002Fopenshell-opencode.tar\n  rm -f \u002Ftmp\u002Fopenshell-*.tar\n'\nrm -f \u002Ftmp\u002Fopenshell-claude.tar \u002Ftmp\u002Fopenshell-opencode.tar\n```\n\nVerify:\n- `podman exec openshell-e2e openshell --version` shows version output\n- `podman exec openshell-e2e agentic-ci --help` prints usage\n- `podman exec openshell-e2e podman images` lists both sandbox images\n\n## Cleanup between tests\n\nThe gateway and sandbox state must be fully reset between tests. Run this\nbefore each new section:\n\n```bash\npodman exec openshell-e2e bash -c '\n  pids=$(ss -tlnp | grep 17670 | grep -oP \"pid=\\K[0-9]+\" 2>\u002Fdev\u002Fnull)\n  [ -n \"$pids\" ] && kill -9 $pids 2>\u002Fdev\u002Fnull\n  pkill -9 -f \"podman system\" 2>\u002Fdev\u002Fnull\n  sleep 1\n  podman rm -af 2>\u002Fdev\u002Fnull\n  podman network rm openshell 2>\u002Fdev\u002Fnull\n  rm -rf ~\u002F.config\u002Fopenshell ~\u002F.local\u002Fstate\u002Fopenshell\n'\n```\n\n## Models\n\nUse haiku to keep cost down. The model name format varies by harness:\n\n| Harness     | Vertex AI model                             | API key model                          |\n|-------------|---------------------------------------------|----------------------------------------|\n| Claude Code | `claude-haiku-4-5`                          | `claude-haiku-4-5`                     |\n| OpenCode    | `google-vertex\u002Fclaude-haiku-4-5@20251001`   | `anthropic\u002Fclaude-haiku-4-5-20251001`  |\n\n## Known issue: Claude Code + Vertex AI\n\nClaude Code sends a `context_management` field that Vertex AI's rawPredict\nrejects with HTTP 400. This is an upstream OpenShell bug\n([NVIDIA\u002FOpenShell#1752](https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FOpenShell\u002Fpull\u002F1752)).\nThe workaround is `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1`, which\nagentic-ci now sets automatically in the sandbox env script.\n\nSee `docs\u002Fopenshell-vertex-streaming-bug.md` for details.\n\n---\n\n## Section A: Claude Code + Vertex AI\n\nRequires GCP ADC credentials and `ANTHROPIC_VERTEX_PROJECT_ID`.\n\n### A1. Run\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e OPENSHELL_SUPERVISOR_IMAGE=\"$SUPERVISOR_IMAGE\" \\\n  -e OPENSHELL_SANDBOX_RUNTIME_IMAGE=\"$SANDBOX_RUNTIME_IMAGE\" \\\n  -e SANDBOX_IMAGE=\"$CLAUDE_SANDBOX_IMAGE\" \\\n  openshell-e2e bash -c '\n    agentic-ci run \\\n      --backend openshell \\\n      --harness claude-code \\\n      --image \"$SANDBOX_IMAGE\" \\\n      --model claude-haiku-4-5 \\\n      --no-otel \\\n      \"Respond with exactly: A1_OK\"\n  '\n```\n\nVerify:\n- Output shows `Auth: Vertex AI`\n- Output shows `Starting OpenShell gateway` (or `already running`)\n- Output shows `Creating Vertex AI provider` (or `already exists`)\n- Output shows `Created sandbox: ci`\n- Output shows `Running Claude Code (claude-haiku-4-5) via openshell backend`\n- Claude's response contains `A1_OK`\n- Token metrics show non-zero counts and cost is non-zero (e.g. `$0.04`)\n- `Agent exit code: 0`\n- `Sandbox deleted` and `Gateway stopped` at the end\n\n---\n\n## Section B: Claude Code + API Key\n\nRun cleanup first.\n\n### B1. Run\n\n```bash\npodman exec \\\n  -e \"ANTHROPIC_API_KEY=$(cat \"$API_KEY_FILE\")\" \\\n  -e OPENSHELL_SUPERVISOR_IMAGE=\"$SUPERVISOR_IMAGE\" \\\n  -e OPENSHELL_SANDBOX_RUNTIME_IMAGE=\"$SANDBOX_RUNTIME_IMAGE\" \\\n  -e SANDBOX_IMAGE=\"$CLAUDE_SANDBOX_IMAGE\" \\\n  openshell-e2e bash -c '\n    agentic-ci run \\\n      --backend openshell \\\n      --harness claude-code \\\n      --image \"$SANDBOX_IMAGE\" \\\n      --model claude-haiku-4-5 \\\n      --no-otel \\\n      \"Respond with exactly: B1_OK\"\n  '\n```\n\nVerify:\n- Output shows `Auth: API key`\n- Output shows `Creating Anthropic API key provider`\n- Claude's response contains `B1_OK`\n- Token metrics show non-zero counts and cost is non-zero\n- `Agent exit code: 0`\n\n---\n\n## Section C: OpenCode + Vertex AI\n\nRequires GCP ADC credentials and `ANTHROPIC_VERTEX_PROJECT_ID`.\n\nRun cleanup first.\n\n### C1. Run\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e OPENSHELL_SUPERVISOR_IMAGE=\"$SUPERVISOR_IMAGE\" \\\n  -e OPENSHELL_SANDBOX_RUNTIME_IMAGE=\"$SANDBOX_RUNTIME_IMAGE\" \\\n  -e SANDBOX_IMAGE=\"$OPENCODE_SANDBOX_IMAGE\" \\\n  openshell-e2e bash -c '\n    agentic-ci run \\\n      --backend openshell \\\n      --harness opencode \\\n      --image \"$SANDBOX_IMAGE\" \\\n      --model \"google-vertex\u002Fclaude-haiku-4-5@20251001\" \\\n      --no-otel \\\n      \"Respond with exactly: C1_OK\"\n  '\n```\n\nVerify:\n- Output shows `Harness: OpenCode` and `Auth: Vertex AI`\n- Inference configured with `Model: claude-haiku-4-5` (prefix stripped)\n- `Agent exit code: 0`\n\n---\n\n## Section D: OpenCode + API Key\n\nRun cleanup first.\n\n### D1. Run\n\n```bash\npodman exec \\\n  -e \"ANTHROPIC_API_KEY=$(cat \"$API_KEY_FILE\")\" \\\n  -e OPENSHELL_SUPERVISOR_IMAGE=\"$SUPERVISOR_IMAGE\" \\\n  -e OPENSHELL_SANDBOX_RUNTIME_IMAGE=\"$SANDBOX_RUNTIME_IMAGE\" \\\n  -e SANDBOX_IMAGE=\"$OPENCODE_SANDBOX_IMAGE\" \\\n  openshell-e2e bash -c '\n    agentic-ci run \\\n      --backend openshell \\\n      --harness opencode \\\n      --image \"$SANDBOX_IMAGE\" \\\n      --model \"anthropic\u002Fclaude-haiku-4-5-20251001\" \\\n      --no-otel \\\n      \"Respond with exactly: D1_OK\"\n  '\n```\n\nVerify:\n- Output shows `Harness: OpenCode` and `Auth: API key`\n- Agent response contains `D1_OK`\n- `Agent exit code: 0`\n\n---\n\n## Section E: Workdir round-trip\n\nVerifies that the OpenShell backend uploads the workdir into the sandbox,\nthe agent can modify files inside it, and changes are downloaded back to\nthe host after the run completes. Uses Vertex AI auth and Claude Code.\n\nRun cleanup first.\n\n### E1. Prepare workdir\n\nCreate a temporary directory with a seed file:\n\n```bash\npodman exec openshell-e2e bash -c '\n  mkdir -p \u002Ftmp\u002Fworkdir-test\n  echo red > \u002Ftmp\u002Fworkdir-test\u002Fcolor.txt\n'\n```\n\nVerify:\n\n```bash\npodman exec openshell-e2e cat \u002Ftmp\u002Fworkdir-test\u002Fcolor.txt\n```\n\nShould print `red`.\n\n### E2. Run agent to modify the file\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e OPENSHELL_SUPERVISOR_IMAGE=\"$SUPERVISOR_IMAGE\" \\\n  -e OPENSHELL_SANDBOX_RUNTIME_IMAGE=\"$SANDBOX_RUNTIME_IMAGE\" \\\n  -e SANDBOX_IMAGE=\"$CLAUDE_SANDBOX_IMAGE\" \\\n  openshell-e2e bash -c '\n    agentic-ci run \\\n      --backend openshell \\\n      --harness claude-code \\\n      --image \"$SANDBOX_IMAGE\" \\\n      --model claude-haiku-4-5 \\\n      --workdir \u002Ftmp\u002Fworkdir-test \\\n      --no-otel \\\n      \"Overwrite the file color.txt with exactly the word blue (no newline, no quotes). Do not create any other files.\"\n  '\n```\n\nVerify:\n- Output shows `Uploading workdir`\n- Output shows `Downloading workdir`\n- `Agent exit code: 0`\n\n### E3. Verify workdir was updated on the host\n\n```bash\npodman exec openshell-e2e cat \u002Ftmp\u002Fworkdir-test\u002Fcolor.txt\n```\n\nThe file should now contain `blue`, not `red`. This confirms the full\nround-trip: the workdir was uploaded into the sandbox, the agent modified\nit, and the changes were downloaded back to the host.\n\n### E4. Clean up workdir\n\n```bash\npodman exec openshell-e2e rm -rf \u002Ftmp\u002Fworkdir-test\n```\n\n---\n\n## Section F: OTEL telemetry collection\n\nVerifies that the sandbox-local OTEL collector receives metrics from the\nagent and prints a token\u002Fcost summary. Uses Vertex AI auth and Claude Code\n(the only harness that supports OTEL).\n\nThe OpenShell sandbox network isolation prevents reaching an external OTEL\ncollector, so agentic-ci embeds a lightweight OTLP receiver inside the\nsandbox on localhost. After the run, the OTEL log is downloaded from the\nsandbox and the summary is printed on the host.\n\nRun cleanup first.\n\n### F1. Run with OTEL enabled\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e OPENSHELL_SUPERVISOR_IMAGE=\"$SUPERVISOR_IMAGE\" \\\n  -e OPENSHELL_SANDBOX_RUNTIME_IMAGE=\"$SANDBOX_RUNTIME_IMAGE\" \\\n  -e SANDBOX_IMAGE=\"$CLAUDE_SANDBOX_IMAGE\" \\\n  openshell-e2e bash -c '\n    cd \u002Ftmp\u002Fe2e-workdir && \\\n    agentic-ci run \\\n      --backend openshell \\\n      --harness claude-code \\\n      --image \"$SANDBOX_IMAGE\" \\\n      --model claude-haiku-4-5 \\\n      \"Respond with exactly: F1_OK\"\n  '\n```\n\nNote: no `--no-otel` flag.\n\nVerify:\n- Output shows `Running Claude Code (claude-haiku-4-5) via openshell backend`\n- Agent runs and completes with `F1_OK` in the response\n- Output shows `Token\u002FCost Summary (OpenTelemetry)` section\n- Token counts are non-zero (input tokens, output tokens, cache)\n- Cost is non-zero (e.g. `$0.04`)\n- `Agent exit code: 0`\n- `Sandbox deleted` and `Gateway stopped` at the end\n\n### F2. Verify trace records for mlflow-push\n\nCheck that the OTEL JSONL log contains `\u002Fv1\u002Ftraces` records — these are\nwhat `agentic-ci mlflow-push` needs. The JSONL file is copied to the\nCI artifact directory or stays in the run directory:\n\n```bash\npodman exec openshell-e2e bash -c '\n  JSONL=$(ls -t \u002Ftmp\u002Fagentic-ci-run.*\u002Fclaude-otel.jsonl 2>\u002Fdev\u002Fnull | head -1)\n  echo \"JSONL file: $JSONL\"\n  grep -c \"\u002Fv1\u002Ftraces\" \"$JSONL\"\n'\n```\n\nVerify:\n- The JSONL file exists\n- The trace count is at least 1\n- Optionally inspect a trace record:\n  ```bash\n  podman exec openshell-e2e bash -c '\n    JSONL=$(ls -t \u002Ftmp\u002Fagentic-ci-run.*\u002Fclaude-otel.jsonl 2>\u002Fdev\u002Fnull | head -1)\n    grep \"\u002Fv1\u002Ftraces\" \"$JSONL\" | head -1 | python3 -m json.tool\n  '\n  ```\n  - Record has `\"path\"` containing `\u002Fv1\u002Ftraces`\n  - Record has `\"payload\"` with `\"resourceSpans\"` array\n\n---\n\n## Section G: Skill execution — Vertex AI\n\nVerifies that a plugin skill loads and executes correctly inside the\nsandbox. Uses the `git-shallow-clone` skill from the `odh-git`\nplugin to clone a repo into `\u002Ftmp` and confirm the result.\n\nRequires GCP ADC credentials and `ANTHROPIC_VERTEX_PROJECT_ID`.\n\nRun cleanup first.\n\n### G1. Run\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e OPENSHELL_SUPERVISOR_IMAGE=\"$SUPERVISOR_IMAGE\" \\\n  -e OPENSHELL_SANDBOX_RUNTIME_IMAGE=\"$SANDBOX_RUNTIME_IMAGE\" \\\n  -e SANDBOX_IMAGE=\"$CLAUDE_SANDBOX_IMAGE\" \\\n  openshell-e2e bash -c '\n    mkdir -p \u002Ftmp\u002Fe2e-workdir && cd \u002Ftmp\u002Fe2e-workdir && \\\n    agentic-ci run \\\n      --backend openshell \\\n      --harness claude-code \\\n      --image \"$SANDBOX_IMAGE\" \\\n      --model claude-haiku-4-5 \\\n      --no-otel \\\n      \"Use the \u002Fodh-git:git-shallow-clone skill to shallow-clone https:\u002F\u002Fgithub.com\u002Fopendatahub-io\u002Fagentic-ci.git into \u002Ftmp\u002Fagentic-ci. After the clone completes, run: ls \u002Ftmp\u002Fagentic-ci and print the output, then respond with exactly: SKILL_OK\"\n  '\n```\n\nVerify:\n- `Plugins:` line includes `odh-git`\n- Output shows `Skill` tool invocation for `odh-git:git-shallow-clone`\n- Output shows a `Bash` tool call running `git clone`\n- Output shows `ls \u002Ftmp\u002Fagentic-ci` with repo contents (e.g. `src`, `pyproject.toml`, `Makefile`)\n- Agent response contains `SKILL_OK`\n- `Agent exit code: 0`\n\n---\n\n## Section H: Skill execution — API Key\n\nSame test as Section G but with API key auth.\n\nRun cleanup first.\n\n### H1. Run\n\n```bash\npodman exec \\\n  -e \"ANTHROPIC_API_KEY=$(cat \"$API_KEY_FILE\")\" \\\n  -e OPENSHELL_SUPERVISOR_IMAGE=\"$SUPERVISOR_IMAGE\" \\\n  -e OPENSHELL_SANDBOX_RUNTIME_IMAGE=\"$SANDBOX_RUNTIME_IMAGE\" \\\n  -e SANDBOX_IMAGE=\"$CLAUDE_SANDBOX_IMAGE\" \\\n  openshell-e2e bash -c '\n    mkdir -p \u002Ftmp\u002Fe2e-workdir && cd \u002Ftmp\u002Fe2e-workdir && \\\n    agentic-ci run \\\n      --backend openshell \\\n      --harness claude-code \\\n      --image \"$SANDBOX_IMAGE\" \\\n      --model claude-haiku-4-5 \\\n      --no-otel \\\n      \"Use the \u002Fodh-git:git-shallow-clone skill to shallow-clone https:\u002F\u002Fgithub.com\u002Fopendatahub-io\u002Fagentic-ci.git into \u002Ftmp\u002Fagentic-ci. After the clone completes, run: ls \u002Ftmp\u002Fagentic-ci and print the output, then respond with exactly: SKILL_OK\"\n  '\n```\n\nVerify:\n- Output shows `Auth: API key`\n- `Plugins:` line includes `odh-git`\n- Output shows `Skill` tool invocation for `odh-git:git-shallow-clone`\n- Output shows `ls \u002Ftmp\u002Fagentic-ci` with repo contents (e.g. `src`, `pyproject.toml`, `Makefile`)\n- Agent response contains `SKILL_OK`\n- `Agent exit code: 0`\n\n---\n\n## Final cleanup\n\n```bash\npodman rm -f openshell-e2e\n```\n\n## Running the full suite\n\nExecute sections in order (A through H), running the cleanup step before each\nsection. Skip sections whose prerequisites are not met. If any step fails,\ncheck the gateway log inside the container:\n\n```bash\npodman exec openshell-e2e bash -c 'cat ~\u002F.local\u002Fstate\u002Fopenshell\u002Fgateway-*.log'\n```\n",{"name":5,"description":7},"main","87ae7609993a4db6b8fd0bf78122eb4a63761135",".claude\u002Fskills\u002Ftest-e2e-openshell",24,"https:\u002F\u002Fgithub.com\u002Fopendatahub-io\u002Fagentic-ci","https:\u002F\u002Fopendatahub-io.github.io\u002Fagentic-ci\u002F","https:\u002F\u002Fgithub.com\u002Fopendatahub-io","https:\u002F\u002Fopendatahub.io","Organization for Open Data Hub community","2026-11-12 03:48:59",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add opendatahub-io\u002Fagentic-ci --skill test-e2e-openshell",{"tool":65,"command":66},"bunx","bunx skills add opendatahub-io\u002Fagentic-ci --skill test-e2e-openshell",{"tool":68,"command":69},"pnpm","pnpm dlx skills add opendatahub-io\u002Fagentic-ci --skill test-e2e-openshell","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fopendatahub-io\u002Fagentic-ci\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftest-e2e-openshell\u002FSKILL.md",true,[],[74,80,92,110],{"skillNo":75,"name":41,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":79,"publishedAt":44},"01M71GVGRRC9WXQ2X7GE87RTJT","https:\u002F\u002Fgithub.com\u002Fopendatahub-io\u002Fagentic-ci\u002Fblob\u002Fmain\u002Fdocs\u002Fapi\u002Fskill.md",[78],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[41],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":89,"publishedAt":44},"01M71GVE3SJTAN2DA5GEEETC5Z","test-e2e-podman","Run end-to-end tests for the podman backend using real container and API calls","https:\u002F\u002Fgithub.com\u002Fopendatahub-io\u002Fagentic-ci\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftest-e2e-podman\u002FSKILL.md",[86,87,88],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},[34,33,32,90,91,36,37,38,39,40,41,42,43],"podman","test e2e podman",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":44},"01M71GV8Y03HHFD8Q4HAG9NWDZ","release-agentic-ci","Cut a new agentic-ci release by tagging and pushing. Version is derived from git tags automatically.","https:\u002F\u002Fgithub.com\u002Fopendatahub-io\u002Fagentic-ci\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Frelease-agentic-ci\u002FSKILL.md",[],[99,100,101,102,103,104,105,106,107,108,109],"release agentic ci","agentic","ci","release","version","new","tags","tagging","cut","git","true",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":117,"publishedAt":44},"01M71GV6E8NMVWMGSXSCJJZS20","debug-agentic-ci","Investigate infrastructure-level failures in the agentic-ci framework. Covers container backend issues, skill engine errors, forge MR\u002FPR failures, and gate problems. Use when the container failed, MR operations broke, or the skill engine returned errors.","https:\u002F\u002Fgithub.com\u002Fopendatahub-io\u002Fagentic-ci\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fdebug-agentic-ci\u002FSKILL.md",[116],{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},[101,118,100,119,120,121,122,123,124,125,126,40,127,128,129,130,131,132,42,133],"debug agentic ci","debug","mr","investigate","engine","read","gate","grep","errors","use","forge","when","Bash","issues","operations","pr"]