| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Users installing `mcp` get the newest release of every dependency the day it ships, but PR CI only tests uv.lock and the floors, so an upstream release that breaks the SDK is currently noticed by users first (median 11 days across past incidents). Running "highest" on every PR was tried and removed (#1869) because a half-uploaded release turns unrelated PRs red; the weekly lock-bump PR that replaced it (#1874) never got merged. This adds a scheduled workflow instead. Every Monday it re-resolves the runtime closure of mcp[cli,rich] to the newest versions the specifiers allow (test tooling stays at uv.lock, releases younger than a day are ignored), runs the suite on ubuntu 3.10/3.14 and windows 3.14, and keeps a single tracking issue in sync: opened and assigned when newest-allowed breaks, refreshed while it stays broken, closed once it passes again. Each cell re-runs failures serially and once more with deprecation warnings demoted, so the issue says whether users are actually broken or a dependency merely deprecated something. The report lists what changed since the last green run, what is held below latest by someone else's cap, and the exact command to reproduce the resolution. It never runs on pull requests and never opens a PR adding a ceiling; the issue carries the runbook and a maintainer decides. No-Verification-Needed: CI-only change (workflow + scripts/ci); scripts exercised locally, workflow verified by a branch run
The canary relies on `--exclude-newer` leaving locked versions in place for packages it does not explicitly upgrade, which uv only guarantees from 0.10 (astral-sh/uv#17721), and on relative cutoffs. Move every workflow to the same pin so the canary and PR CI cannot disagree about resolution semantics. 0.10/0.11 carry no breaking changes that touch how this repo uses uv (frozen syncs, lowest-direct resolution, lock --check). No-Verification-Needed: CI configuration only; exercised by PR CI itself
The workflow ran green end to end on the branch (run 31947729778), so remove the push trigger that exercised it. Also read pyright's error count rather than its last output line for the informational summary, and silence its new-version nag. No-Verification-Needed: CI-only change (workflow trigger + report cosmetics)
Review feedback, taken as one structural change rather than patches: the report classified whatever artifacts happened to arrive, so a cell that timed out or lost its runner simply vanished (two passing cells read as green and would have closed a live incident), a cancelled run could still write to the issue, and any resolve-job failure was reported as "cannot be resolved". Now the matrix is defined once and published by the resolve job, the report checks every planned cell against `needs.test.result`, a cell writes a provisional status before doing anything, `uv lock` records whether it was the thing that failed, and incomplete runs are their own class that comments on an open incident instead of rewriting or closing it. Artifacts carry their own top-level directory and are merged on download, so the layout no longer depends on how many of them exist. Smaller corrections from the same review: per-package cutoffs instead of a global --exclude-newer (a freshly bumped exact pin elsewhere could otherwise fail the resolution); the since-last-green diff uses the lock the last green run actually uploaded rather than re-resolving today's tree at an old cutoff; the issue's reproduce block is the literal commands the job ran (group strip included) under `uvx uv@<version>`; per-cell output is size-bounded at the source and the full report goes to the step summary before any truncation; the flake/deprecation re-runs key on whether pytest recorded failures rather than on its exit code; titles say "nothing changed since last green" when that is the case; bash runs with pipefail everywhere; the group-strip generator follows include-group and default-groups = "all"; wording says tooling is preferred at uv.lock, not frozen. The temporary branch trigger is back for one more end-to-end run. No-Verification-Needed: CI-only change (workflow + scripts/ci); scripts exercised locally, workflow verified by a branch run
Second end-to-end branch run (31949021363) is green with the revised layout. No-Verification-Needed: CI-only change (workflow trigger)
| Back | FazBrowse Home | New Git URL |
Adds a scheduled "dependency canary": once a week, re-resolve the runtime dependencies of mcp[cli,rich] to the newest versions our specifiers allow, run the test suite against them, and keep a single tracking issue in sync with the result. Also moves CI to uv 0.11.33, which the canary's resolution step relies on.
Motivation and Context
pyproject.toml deliberately carries floors only, so anyone running pip install mcp gets the newest release of every dependency the day it ships. PR CI never sees that combination: it tests uv.lock (locked) and the floors (lowest-direct). Looking back over the repo's history there have been roughly six "a new upstream release broke the SDK" events a year (click 8.2, pydantic 2.11/2.12/2.13, starlette 0.52 typing, httpx 1.0 pre-releases, pytest 9.1, pyjwt 2.11, ...), with a median of 11 days before anyone here noticed and a third of them reported by users first.
We have tried two other shapes already. A real highest leg on every PR (#1609) was removed in #1869 after a half-uploaded ruff release turned every open PR red — an upstream release should not be able to do that. The weekly uv lock --upgrade PR that replaced it (#1874) produced four PRs, none merged (CI did not even trigger on the bot's pushes), and was deleted in #2919 in favour of Dependabot, whose PRs tend to get closed in bulk. The common thread is that a PR nobody particularly wants to merge is not an alert.
What demonstrably works elsewhere is a scheduled run that files one deduplicated issue and closes it again when things go green (FastMCP's upgrade checks close each incident within days; xarray, dask and scikit-learn run the same pattern). Scheduled runs that only go red, or only ping Slack, rot: pydantic's dependencies-check workflow has failed 100+ runs in a row unnoticed, and logfire's weekly job sat red for 16 weeks.
What the workflow does
.github/workflows/dependency-canary.yml, Mondays 05:23 UTC plus workflow_dispatch:
Everything is gh CLI plus two small scripts under scripts/ci/; no third-party actions, permissions: {} at the top with issues: write only on the report job, which installs nothing.
What it deliberately does not do
uv 0.11.33
Combining -P <closure> with an upload-time cutoff only keeps the non-upgraded packages at their locked versions from uv 0.10 (astral-sh/uv#17721); on 0.9.5 the cutoff would silently float everything. Rather than run the canary on a different uv than CI, the second commit moves every workflow to 0.11.33 (0.10 and 0.11 have no breaking changes touching frozen syncs, lowest-direct, or lock --check).
How Has This Been Tested?
Newest-allowed is green today, so merging this should not open an issue on the first Monday.
Breaking Changes
None; CI only.
Types of changes
Checklist
Additional context
AI Disclaimer