OpenHands / OpenHands/software-agent-sdk

CI stability audit: unpinned/floating dependencies that can flip CI from green to red

Open
#4,304 1 comment 0 reactions 1 assignee View on GitHub

@neubig is already working on this.

Since Jul 30, 2026.

ci dependencies github_actions
Dominant language
Python
Stars
1.1k
Forks
539
Avg merge
1d 19h
Merged PRs (30d)
137

Description

Summary

Audit (verified line-by-line against 9627f82c60e9ffb7d51dc7e6277cf4d0f61f01b4) of everything in this repo whose resolved behavior can change while the git SHA under test stays exactly the same — unpinned package versions, floating MCP/CLI invocations, mutable Action refs, unpinned Docker/OS inputs. Any of these can turn a previously-green commit red (or silently change agent behavior) with zero code changes on our side.

Verification pass corrected one thing from the original draft: the "moving major tag" claim for astral-sh/setup-uv / tj-actions/changed-files only applies to 3 specific stray call sites — the other ~24 occurrences of those actions are already correctly SHA-pinned (@<40-char-sha> # vN). That's called out below so we don't waste effort re-pinning things that are already fine.

Immediate risks (active in default/CI paths today)

CI workflows: unpinned/unlocked installs

Mutable GitHub Actions

  • .github/workflows/qa-changes-by-openhands.yml:39OpenHands/extensions/plugins/qa-changes@main.
  • 2 stray unpinned astral-sh/setup-uv@v7: persisted-settings-compat.yml:23, tests.yml:349 — the other ~24 call sites in this repo are already SHA-pinned; these two were just missed.
  • 1 stray unpinned tj-actions/changed-files@v47: tests.yml:338 — every other occurrence is SHA-pinned.
  • All official actions/* (checkout, setup-python, github-script, upload-artifact, download-artifact, setup-node) use moving major-version tags (@v6/@v7/@v8/@v9) throughout every workflow, never a SHA.

Pre-commit

Published wheel metadata (affects uvx/unlocked consumers, not normal repo CI — uv.lock covers in-repo dev/test)

  • Completely unversioned: internal openhands-sdk edge (from openhands-tools and openhands-agent-server pyproject.toml), cachetools.
  • Minimum-only (>=): agent-client-protocol, fastmcp, litellm, pydantic, browser-use, tree-sitter/tree-sitter-bash, httpx, fakeredis, libtmux, sqlalchemy, fastapi, uvicorn, websockets, alembic, aiosqlite, boto3, google-cloud-aiplatform, joserfc, deprecation, filelock, pillow, python-frontmatter, python-json-logger, tenacity, binaryornot, func-timeout, tom-swe, wsproto.
  • Upper-bounded but still floats within range: lmnr (>=0.7.56,<0.8.0), toolshield (>=0.1.3,<0.2), docker (>=7.1,<8), openai (>=2.33.0,<3), posthog (>=6,<7).

Unpinned container/OS inputs

  • Base images (tag, not digest): python:3.13-bookworm, nikolaik/python-nodejs:python3.13-nodejs22-slim, eclipse-temurin:17-jdk, golang:1.21-bookworm, ghcr.io/astral-sh/uv:0.11.6.
  • 21 .github/workflows/*.yml occurrences of runs-on: ubuntu-latest (GitHub's rolling runner image can change preinstalled tool/library versions under an unchanged commit).
  • Unversioned OS package installs via apt/apk/dnf/yum throughout CI.

Examples & docs (don't gate CI today, but get copy-pasted into user projects/workflows)

  • 4 more unversioned mcp-server-fetch examples: 01_standalone_sdk/07_mcp_integration.py, 10_persistence.py, 13_get_llm_metrics.py, 05_skills_and_plugins/02_loading_plugins/example_plugins/code-quality/.mcp.json.
  • 01_standalone_sdk/40_acp_agent_example.py — unversioned npx -y @agentclientprotocol/claude-agent-acp.
  • examples/03_github_workflows/{01_basic_action,02_pr_review,03_todo_management,04_datadog_debugging} — install the SDK from agent-sdk.git@main / reference qa-changes@main in example workflow files users copy verbatim.

Suggested priority

  1. Pin/remove the two active mcp-server-fetch invocations and the two Playwright auto-install call sites.
  2. Fix the 3 stray unpinned Action refs (setup-uv × 2, tj-actions/changed-files × 1) to match the rest of the repo's SHA-pinning convention.
  3. Replace @main git installs (assign-reviews/todo-management) and the raw.githubusercontent.com script fetches with pinned refs/SHAs.
  4. Pin the pre-commit hook to a SHA and cap the wheel-metadata deps that currently have no upper bound at all.
  5. Digest-pin the Docker base images; consider a checksum step for the ACP npm packages' transitive tree.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.