[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71GVE3SJTAN2DA5GEEETC5Z":3,"skill-same:01M71GVE3SJTAN2DA5GEEETC5Z":74},{"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":45,"linkOnly":46,"markdownContent":47,"markdownBody":48,"frontMatter":49,"refName":50,"commitSha":51,"skillDirectory":52,"forksCount":53,"repositoryHtmlUrl":54,"repositoryHomepageUrl":55,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M71GVE3SJTAN2DA5GEEETC5Z","test-e2e-podman",null,"Run end-to-end tests for the podman 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-podman\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,44],"test e2e podman","podman","e2e","test","test e2e","for","end","calls","tests","container","api","backend","run","2026-11-10 10:12:30",false,"---\nname: test-e2e-podman\ndescription: Run end-to-end tests for the podman backend using real container and API calls\n---\n\n# End-to-End Podman Backend Test\n\nRun full lifecycle tests of the podman backend across harnesses and auth modes.\nAll tests run inside a CI container with nested podman.\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\u002Fpodman`                     | `$CI_IMAGE`               |\n| Claude runner    | `quay.io\u002Faipcc\u002Fagentic-ci\u002Fclaude-runner:latest`        | `$CLAUDE_IMAGE`           |\n| OpenCode runner  | `quay.io\u002Faipcc\u002Fagentic-ci\u002Fopencode-runner:latest`      | `$OPENCODE_IMAGE`         |\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, E): 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, F): The API key file above.\n\n## Container setup\n\nAll agentic-ci commands run inside the CI container. The container needs\n`--privileged` for nested podman (the podman backend starts a second\ncontainer inside the CI container).\n\n### Start the test container\n\n```bash\npodman rm -f podman-e2e 2>\u002Fdev\u002Fnull || true\npodman run -d --name podman-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 podman-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\nVerify:\n- `podman exec podman-e2e agentic-ci --help` prints usage\n- `podman exec podman-e2e podman --version` shows podman is available\n\n## Cleanup between tests\n\nReset the inner agentic-ci container between sections:\n\n```bash\npodman exec podman-e2e bash -c 'podman rm -f agentic-ci 2>\u002Fdev\u002Fnull || true'\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    | (not supported via Vertex) | `anthropic\u002Fclaude-haiku-4-5-20251001` |\n\n---\n\n## Section A: Claude Code + Vertex AI\n\nRequires GCP ADC credentials and `ANTHROPIC_VERTEX_PROJECT_ID`.\n\n### A1. Setup\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci setup --image \"$CLAUDE_IMAGE\"\n  '\n```\n\nVerify:\n- Output shows `Auth: Vertex AI`\n- Output says `--- Podman container started ---`\n- `podman exec podman-e2e podman ps --filter name=agentic-ci` shows the\n  inner container running\n\n### A2. Run (streaming, no OTEL)\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \"Respond with exactly: A2_OK\" \\\n      --image \"$CLAUDE_IMAGE\" \\\n      --model claude-haiku-4-5 --no-otel\n  '\n```\n\nVerify:\n- Output says `--- Podman container already running ---` (reuses container\n  from setup)\n- Streaming output shows colored text blocks (thinking, tool calls, Claude\n  response)\n- Claude's response contains `A2_OK`\n- Exit code is 0\n\n### A3. Run (streaming, with OTEL)\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \"Respond with exactly: A3_OK\" \\\n      --image \"$CLAUDE_IMAGE\" \\\n      --model claude-haiku-4-5\n  '\n```\n\nVerify:\n- Container is still reused (`already running`)\n- OTEL collector starts on a dynamic port\n- Streaming output works\n- Claude's response contains `A3_OK`\n- OTEL Token\u002FCost Summary prints at the end with token counts and USD costs\n- Exit code is 0\n\n### A3a. 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:\n\n```bash\npodman exec podman-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 podman-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### A4. Run (no streaming)\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \"Respond with exactly: A4_OK\" \\\n      --image \"$CLAUDE_IMAGE\" \\\n      --model claude-haiku-4-5 --no-streaming --no-otel\n  '\n```\n\nVerify:\n- No formatted streaming output (no colored blocks, no tool summaries)\n- Exit code is 0\n\n### A5. Stop\n\n```bash\npodman exec \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci stop --image \"$CLAUDE_IMAGE\"\n  '\n```\n\nVerify:\n- Output says `--- Podman container stopped ---`\n- `podman exec podman-e2e podman ps -a --filter name=agentic-ci` shows no\n  container\n\n---\n\n## Section B: Claude Code + API Key\n\nRun cleanup first.\n\n### B1. Setup and run\n\n```bash\npodman exec \\\n  -e \"ANTHROPIC_API_KEY=$(cat \"$API_KEY_FILE\")\" \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \"Respond with exactly: B1_OK\" \\\n      --image \"$CLAUDE_IMAGE\" \\\n      --model claude-haiku-4-5 --no-otel\n  '\n```\n\nVerify:\n- Output shows `Auth: API key` (not `Vertex AI`)\n- Streaming output works\n- Claude's response contains `B1_OK`\n- Exit code is 0\n\n### B2. Run (streaming, with OTEL)\n\n```bash\npodman exec \\\n  -e \"ANTHROPIC_API_KEY=$(cat \"$API_KEY_FILE\")\" \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \"Respond with exactly: B2_OK\" \\\n      --image \"$CLAUDE_IMAGE\" \\\n      --model claude-haiku-4-5\n  '\n```\n\nVerify:\n- OTEL collector starts and Token\u002FCost Summary prints at the end\n- Claude's response contains `B2_OK`\n- Exit code is 0\n\n### B2a. Verify trace records for mlflow-push\n\nSame check as A3a — verify the JSONL log has `\u002Fv1\u002Ftraces` records:\n\n```bash\npodman exec podman-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\n### B3. Stop\n\n```bash\npodman exec \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci stop --image \"$CLAUDE_IMAGE\"\n  '\n```\n\nVerify:\n- Output says `--- Podman container stopped ---`\n\n---\n\n## Section C: OpenCode + Vertex AI\n\nRequires GCP ADC credentials.\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 OPENCODE_IMAGE=\"$OPENCODE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \"Respond with exactly: C1_OK\" \\\n      --harness opencode \\\n      --image \"$OPENCODE_IMAGE\" \\\n      --model google-vertex\u002Fclaude-haiku-4-5@20251001 \\\n      --no-otel\n  '\n```\n\nVerify:\n- Output shows `Harness: OpenCode` and `Auth: Vertex AI`\n- Streaming output shows agent activity\n- Exit code is 0\n\n### C2. Stop\n\n```bash\npodman exec \\\n  -e OPENCODE_IMAGE=\"$OPENCODE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci stop --harness opencode --image \"$OPENCODE_IMAGE\"\n  '\n```\n\nVerify:\n- Output says `--- Podman container stopped ---`\n\n---\n\n## Section D: OpenCode + API Key\n\nRequires `ANTHROPIC_API_KEY` (via API key file).\n\nRun cleanup first.\n\n### D1. Run\n\n```bash\npodman exec \\\n  -e \"ANTHROPIC_API_KEY=$(cat \"$API_KEY_FILE\")\" \\\n  -e OPENCODE_IMAGE=\"$OPENCODE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \"Respond with exactly: D1_OK\" \\\n      --harness opencode \\\n      --image \"$OPENCODE_IMAGE\" \\\n      --model anthropic\u002Fclaude-haiku-4-5-20251001 \\\n      --no-otel\n  '\n```\n\nVerify:\n- Output shows `Harness: OpenCode` and `Auth: API key`\n- Streaming output shows agent activity\n- Exit code is 0\n\n### D2. Stop\n\n```bash\npodman exec \\\n  -e OPENCODE_IMAGE=\"$OPENCODE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci stop --harness opencode --image \"$OPENCODE_IMAGE\"\n  '\n```\n\nVerify:\n- Output says `--- Podman container stopped ---`\n\n---\n\n## Section E: Skill execution — Vertex AI\n\nVerifies that a plugin skill loads and executes correctly inside the\nrunner container. Uses the `git-shallow-clone` skill from the\n`odh-git` plugin to clone a repo into `\u002Ftmp` and confirm the\nresult.\n\nRequires GCP ADC credentials and `ANTHROPIC_VERTEX_PROJECT_ID`.\n\nRun cleanup first.\n\n### E1. Run\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \\\n      --image \"$CLAUDE_IMAGE\" \\\n      --model claude-haiku-4-5 --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### E2. Stop\n\n```bash\npodman exec \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci stop --image \"$CLAUDE_IMAGE\"\n  '\n```\n\n---\n\n## Section F: Skill execution — API Key\n\nSame test as Section E but with API key auth.\n\nRun cleanup first.\n\n### F1. Run\n\n```bash\npodman exec \\\n  -e \"ANTHROPIC_API_KEY=$(cat \"$API_KEY_FILE\")\" \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \\\n      --image \"$CLAUDE_IMAGE\" \\\n      --model claude-haiku-4-5 --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### F2. Stop\n\n```bash\npodman exec \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci stop --image \"$CLAUDE_IMAGE\"\n  '\n```\n\n---\n\n## Final cleanup\n\n```bash\npodman rm -f podman-e2e\n```\n\n## Running the full suite\n\nExecute sections in order (A through F), running the cleanup step before\neach section. Skip sections whose prerequisites are not met. If any step\nfails, stop and investigate. Check inner container logs with:\n\n```bash\npodman exec podman-e2e podman logs agentic-ci\n```\n","# End-to-End Podman Backend Test\n\nRun full lifecycle tests of the podman backend across harnesses and auth modes.\nAll tests run inside a CI container with nested podman.\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\u002Fpodman`                     | `$CI_IMAGE`               |\n| Claude runner    | `quay.io\u002Faipcc\u002Fagentic-ci\u002Fclaude-runner:latest`        | `$CLAUDE_IMAGE`           |\n| OpenCode runner  | `quay.io\u002Faipcc\u002Fagentic-ci\u002Fopencode-runner:latest`      | `$OPENCODE_IMAGE`         |\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, E): 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, F): The API key file above.\n\n## Container setup\n\nAll agentic-ci commands run inside the CI container. The container needs\n`--privileged` for nested podman (the podman backend starts a second\ncontainer inside the CI container).\n\n### Start the test container\n\n```bash\npodman rm -f podman-e2e 2>\u002Fdev\u002Fnull || true\npodman run -d --name podman-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 podman-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\nVerify:\n- `podman exec podman-e2e agentic-ci --help` prints usage\n- `podman exec podman-e2e podman --version` shows podman is available\n\n## Cleanup between tests\n\nReset the inner agentic-ci container between sections:\n\n```bash\npodman exec podman-e2e bash -c 'podman rm -f agentic-ci 2>\u002Fdev\u002Fnull || true'\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    | (not supported via Vertex) | `anthropic\u002Fclaude-haiku-4-5-20251001` |\n\n---\n\n## Section A: Claude Code + Vertex AI\n\nRequires GCP ADC credentials and `ANTHROPIC_VERTEX_PROJECT_ID`.\n\n### A1. Setup\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci setup --image \"$CLAUDE_IMAGE\"\n  '\n```\n\nVerify:\n- Output shows `Auth: Vertex AI`\n- Output says `--- Podman container started ---`\n- `podman exec podman-e2e podman ps --filter name=agentic-ci` shows the\n  inner container running\n\n### A2. Run (streaming, no OTEL)\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \"Respond with exactly: A2_OK\" \\\n      --image \"$CLAUDE_IMAGE\" \\\n      --model claude-haiku-4-5 --no-otel\n  '\n```\n\nVerify:\n- Output says `--- Podman container already running ---` (reuses container\n  from setup)\n- Streaming output shows colored text blocks (thinking, tool calls, Claude\n  response)\n- Claude's response contains `A2_OK`\n- Exit code is 0\n\n### A3. Run (streaming, with OTEL)\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \"Respond with exactly: A3_OK\" \\\n      --image \"$CLAUDE_IMAGE\" \\\n      --model claude-haiku-4-5\n  '\n```\n\nVerify:\n- Container is still reused (`already running`)\n- OTEL collector starts on a dynamic port\n- Streaming output works\n- Claude's response contains `A3_OK`\n- OTEL Token\u002FCost Summary prints at the end with token counts and USD costs\n- Exit code is 0\n\n### A3a. 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:\n\n```bash\npodman exec podman-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 podman-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### A4. Run (no streaming)\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \"Respond with exactly: A4_OK\" \\\n      --image \"$CLAUDE_IMAGE\" \\\n      --model claude-haiku-4-5 --no-streaming --no-otel\n  '\n```\n\nVerify:\n- No formatted streaming output (no colored blocks, no tool summaries)\n- Exit code is 0\n\n### A5. Stop\n\n```bash\npodman exec \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci stop --image \"$CLAUDE_IMAGE\"\n  '\n```\n\nVerify:\n- Output says `--- Podman container stopped ---`\n- `podman exec podman-e2e podman ps -a --filter name=agentic-ci` shows no\n  container\n\n---\n\n## Section B: Claude Code + API Key\n\nRun cleanup first.\n\n### B1. Setup and run\n\n```bash\npodman exec \\\n  -e \"ANTHROPIC_API_KEY=$(cat \"$API_KEY_FILE\")\" \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \"Respond with exactly: B1_OK\" \\\n      --image \"$CLAUDE_IMAGE\" \\\n      --model claude-haiku-4-5 --no-otel\n  '\n```\n\nVerify:\n- Output shows `Auth: API key` (not `Vertex AI`)\n- Streaming output works\n- Claude's response contains `B1_OK`\n- Exit code is 0\n\n### B2. Run (streaming, with OTEL)\n\n```bash\npodman exec \\\n  -e \"ANTHROPIC_API_KEY=$(cat \"$API_KEY_FILE\")\" \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \"Respond with exactly: B2_OK\" \\\n      --image \"$CLAUDE_IMAGE\" \\\n      --model claude-haiku-4-5\n  '\n```\n\nVerify:\n- OTEL collector starts and Token\u002FCost Summary prints at the end\n- Claude's response contains `B2_OK`\n- Exit code is 0\n\n### B2a. Verify trace records for mlflow-push\n\nSame check as A3a — verify the JSONL log has `\u002Fv1\u002Ftraces` records:\n\n```bash\npodman exec podman-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\n### B3. Stop\n\n```bash\npodman exec \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci stop --image \"$CLAUDE_IMAGE\"\n  '\n```\n\nVerify:\n- Output says `--- Podman container stopped ---`\n\n---\n\n## Section C: OpenCode + Vertex AI\n\nRequires GCP ADC credentials.\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 OPENCODE_IMAGE=\"$OPENCODE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \"Respond with exactly: C1_OK\" \\\n      --harness opencode \\\n      --image \"$OPENCODE_IMAGE\" \\\n      --model google-vertex\u002Fclaude-haiku-4-5@20251001 \\\n      --no-otel\n  '\n```\n\nVerify:\n- Output shows `Harness: OpenCode` and `Auth: Vertex AI`\n- Streaming output shows agent activity\n- Exit code is 0\n\n### C2. Stop\n\n```bash\npodman exec \\\n  -e OPENCODE_IMAGE=\"$OPENCODE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci stop --harness opencode --image \"$OPENCODE_IMAGE\"\n  '\n```\n\nVerify:\n- Output says `--- Podman container stopped ---`\n\n---\n\n## Section D: OpenCode + API Key\n\nRequires `ANTHROPIC_API_KEY` (via API key file).\n\nRun cleanup first.\n\n### D1. Run\n\n```bash\npodman exec \\\n  -e \"ANTHROPIC_API_KEY=$(cat \"$API_KEY_FILE\")\" \\\n  -e OPENCODE_IMAGE=\"$OPENCODE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \"Respond with exactly: D1_OK\" \\\n      --harness opencode \\\n      --image \"$OPENCODE_IMAGE\" \\\n      --model anthropic\u002Fclaude-haiku-4-5-20251001 \\\n      --no-otel\n  '\n```\n\nVerify:\n- Output shows `Harness: OpenCode` and `Auth: API key`\n- Streaming output shows agent activity\n- Exit code is 0\n\n### D2. Stop\n\n```bash\npodman exec \\\n  -e OPENCODE_IMAGE=\"$OPENCODE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci stop --harness opencode --image \"$OPENCODE_IMAGE\"\n  '\n```\n\nVerify:\n- Output says `--- Podman container stopped ---`\n\n---\n\n## Section E: Skill execution — Vertex AI\n\nVerifies that a plugin skill loads and executes correctly inside the\nrunner container. Uses the `git-shallow-clone` skill from the\n`odh-git` plugin to clone a repo into `\u002Ftmp` and confirm the\nresult.\n\nRequires GCP ADC credentials and `ANTHROPIC_VERTEX_PROJECT_ID`.\n\nRun cleanup first.\n\n### E1. Run\n\n```bash\npodman exec \\\n  -e ANTHROPIC_VERTEX_PROJECT_ID=\u003Cyour-project-id> \\\n  -e CLOUD_ML_REGION=global \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \\\n      --image \"$CLAUDE_IMAGE\" \\\n      --model claude-haiku-4-5 --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### E2. Stop\n\n```bash\npodman exec \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci stop --image \"$CLAUDE_IMAGE\"\n  '\n```\n\n---\n\n## Section F: Skill execution — API Key\n\nSame test as Section E but with API key auth.\n\nRun cleanup first.\n\n### F1. Run\n\n```bash\npodman exec \\\n  -e \"ANTHROPIC_API_KEY=$(cat \"$API_KEY_FILE\")\" \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci run \\\n      --image \"$CLAUDE_IMAGE\" \\\n      --model claude-haiku-4-5 --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### F2. Stop\n\n```bash\npodman exec \\\n  -e CLAUDE_IMAGE=\"$CLAUDE_IMAGE\" \\\n  podman-e2e bash -c '\n    agentic-ci stop --image \"$CLAUDE_IMAGE\"\n  '\n```\n\n---\n\n## Final cleanup\n\n```bash\npodman rm -f podman-e2e\n```\n\n## Running the full suite\n\nExecute sections in order (A through F), running the cleanup step before\neach section. Skip sections whose prerequisites are not met. If any step\nfails, stop and investigate. Check inner container logs with:\n\n```bash\npodman exec podman-e2e podman logs agentic-ci\n```\n",{"name":5,"description":7},"main","87ae7609993a4db6b8fd0bf78122eb4a63761135",".claude\u002Fskills\u002Ftest-e2e-podman",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":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add opendatahub-io\u002Fagentic-ci --skill test-e2e-podman",{"tool":66,"command":67},"bunx","bunx skills add opendatahub-io\u002Fagentic-ci --skill test-e2e-podman",{"tool":69,"command":70},"pnpm","pnpm dlx skills add opendatahub-io\u002Fagentic-ci --skill test-e2e-podman","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fopendatahub-io\u002Fagentic-ci\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftest-e2e-podman\u002FSKILL.md",true,[],[75,81,92,110],{"skillNo":76,"name":42,"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":77,"categories":78,"keywords":80,"publishedAt":45},"01M71GVGRRC9WXQ2X7GE87RTJT","https:\u002F\u002Fgithub.com\u002Fopendatahub-io\u002Fagentic-ci\u002Fblob\u002Fmain\u002Fdocs\u002Fapi\u002Fskill.md",[79],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[42],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":90,"publishedAt":45},"01M71GVB6E19QT2TVZYQVB0ZPH","test-e2e-openshell","Run end-to-end tests for the openshell backend using real container and API calls","https:\u002F\u002Fgithub.com\u002Fopendatahub-io\u002Fagentic-ci\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftest-e2e-openshell\u002FSKILL.md",[87,88,89],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},[91,36,35,34,37,38,39,40,41,42,43,44],"test e2e openshell",{"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":45},"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","new","true","version","tags","tagging","cut","git",{"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":45},"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,41,127,128,129,130,131,43,132,133],"debug agentic ci","debug","investigate","engine","Bash","issues","gate","grep","errors","use","forge","when","read","operations","pr","mr"]