Skip to content

ci: detect new framework releases and test each one in isolation against the PR lock #1066

Closed

Description

@tommasobolis

Part of #1065.

Summary

Add a daily framework-release-watch.yml workflow. It finds every framework package whose newest stable PyPI release is newer than the PR lock. For each one, it runs the existing framework checks with only that package moved and everything else held at the lock, then opens or updates one framework-release issue per (package, version) with the results and the exact next step. The issue closes itself when the lock catches up.

Motivation

See #1065. The nightly fresh resolve catches breakage but can't name which release caused it, and nothing prompts the lock refresh ADR 0007 rule 3 requires. BG §1.8.

Current behavior (verified)

Proposal

1. python/scripts/check_framework_releases.py (stdlib only)

  • Import, don't copy. Take fetch_project and canonicalize from check_new_dependencies.py.
  • Watch set. For each ADAPTERS[k].extra, watch the direct requirements of that extra.
    • Locked version: the == pin in adapter-contract-<extra>-py3.12.txt.
    • Latest version: the newest non-yanked, non-pre-release version on PyPI.
  • --json: emits a GitHub matrix of {framework, extra, package, locked, latest, bump: major|minor|patch, released_at, release_notes_url}, where release_notes_url comes from info.project_urls (Changelog / Release notes / Source). Prints [] when nothing is new.
  • --constraints-for PKG==VER --out PATH: writes a copy of that extra's lock with that one pin replaced.
  • --package NAME: limits the run to one package (for workflow_dispatch).
  • --stale-issues: reads the open framework-release issues (gh JSON on stdin) and prints the numbers of those whose version is now <= the lock.

2. .github/workflows/framework-release-watch.yml

Triggers:

  • schedule: "30 5 * * *", before the 06:00 nightly
  • workflow_dispatch with an optional package input
  • pull_request filtered to the workflow and script paths, as a dry run: no issue writes, and the rendered issue bodies go to the job summary

Jobs:

  1. detect runs the script and outputs the matrix. Later jobs are skipped when it is empty.

  2. evaluate runs once per release, with fail-fast: false, timeout-minutes: 30, Python 3.12, and matrix values bound through env::

    • Install with everything else locked: pip install -e ".[llm,local,otel,$EXTRA]" --group dev -c <rewritten lock>.
    • If that doesn't resolve, the new release needs other packages moved too. Retry unconstrained and record the outcome as needs co-bump.
    • Then run verify_frameworks.py --only $FW --require-installed --json, pytest -q with DONKEY_CONTRACT_EXTRA=$EXTRA, and smoke_example.py $FW.
    • Collect outcomes. Each step uses continue-on-error and records its outcome, together with the installed version from importlib.metadata, into a result.json artifact.
  3. alert runs with if: always(), needs: every job, issues: write. It is the only job that writes. For each release, it opens or updates one issue titled framework-release: <pkg> <locked> → <latest>, labelled framework-release and dependencies (creating the label with gh label create --force). The body contains:

    • versions, bump kind, release date and release-notes link
    • a results table (signature / suite / smoke × isolated / co-bump) and the run link
    • a placeholder for the impact summary, filled by ci: add an AI changelog impact review to the framework release watch #1067
    • next action:
      • All green: "safe to bump". From python/, run python scripts/compile_constraints.py, then python scripts/verify_frameworks.py --only <fw> --emit-verified to refresh the section 8 row in docs/verified-apis.md, then the PR gate. Reference this issue in the bump PR.
      • Anything red: "adapt the adapter or record a §8.1 incompatibility, never add a ceiling (§8.4)".

    alert also closes the issues returned by --stale-issues, with a comment linking the lock commit. A re-run with unchanged results doesn't add a duplicate comment.

3. Docs

  • docs/ci.md: add a section for the new workflow.
  • CONTRIBUTING.md: in the lock-refresh step, name framework-release issues as the trigger.
  • No ADR change: rule 3 still holds, because the lock bump stays a maintainer PR.

Cross-surface impact

  • core/llm/registry/tools: not affected. integrations: read-only. ADAPTERS is the roster source, and adapter code doesn't change.
  • TypeScript parity (planned): not affected. When the TS port ships, its framework packages (npm) need the same watch. Note that in the Phase 5 TS epic.
  • CLI: not affected.
  • Nextra docs site: not affected (that's docs: publish a generated framework version-compatibility page #1068).
  • docs/verified-apis.md: no row changes in this issue. The issue body tells the maintainer how to refresh the section 8 rows with --emit-verified.

Out of scope

Acceptance criteria

  • tests/unit/test_check_framework_releases.py, using a fake Fetch, covers: pre-releases and yanked versions are skipped; major/minor/patch classification; lock parsing; the single-pin constraint rewrite; --stale-issues.
  • A roster-drift test asserts the watched set equals ADAPTERS × the extras' direct requirements, in the style of test_nightly_framework_legs_match_adapters (test_adapter_roster.py:152).
  • The new workflow passes test_workflow_bounds.py and test_ci_workflows.py, and is registered in both.
  • The PR's dry run lists today's real gaps (as of 2026-10-10: langchain-openai, langchain-core, litellm, strands-agents, agent-framework, anthropic, crewai) and renders their issue bodies in the job summary without creating issues.
  • After merge, workflow_dispatch with package=crewai creates exactly one issue. A second run updates it instead of duplicating it. Bumping the lock, then running the watch again, closes it.
  • pytest -q && mypy && ruff check . && lint-imports are green.

Activity

  1. added
    area:testingConformance kit, contract fixtures, nightly matrix
    choreBuild/tooling/refactor, no user-facing behavior change
    priority/p2Meaningful improvement, ship soon
    size/m1-2 days, multiple files
    area:adaptersFramework adapters and connection_kwargs() (1.8, 2.8)
    area:releasePackaging, PyPI, semver, changelog, CI
    dependenciesPull requests that update a dependency file
    on Oct 10, 2026
  2. self-assigned this
    on Oct 12, 2026
  3. added a commit that references this issue on Oct 12, 2026
    9698576
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:adaptersFramework adapters and connection_kwargs() (1.8, 2.8)area:releasePackaging, PyPI, semver, changelog, CIarea:testingConformance kit, contract fixtures, nightly matrixchoreBuild/tooling/refactor, no user-facing behavior changedependenciesPull requests that update a dependency filepriority/p2Meaningful improvement, ship soonsize/m1-2 days, multiple files

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions