ci: test every package at its keycardai-* sibling floors - #272
Merged
Conversation
Adds a sibling-floors matrix job to pr.yml: per package, build the wheel, install it from PyPI with each keycardai-* dependency pinned to its declared floor (no workspace sources), and run the package's test suite there. A floor that is ahead of PyPI fails with its own message unless the PR carries the floors-bootstrap label. Raises keycardai-fastmcp's keycardai-oauth floor from 0.7.0 to 0.12.0, the oldest version where its suite passes under this job. Co-Authored-By: Larry Osakwe <larry@keycard.ai>
Contributor
Author
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
…that pass at floor Both packages fail the sibling-floors job at their declared floors (mcp's pair is unsatisfiable, a2a needs KeycardAuthBackend(require_authentication=...)). The oldest passing pair for each is keycardai-oauth>=0.16.0 with keycardai-starlette>=0.9.0. uv.lock is unchanged: the workspace pins siblings to the local checkout. Co-Authored-By: Larry Osakwe <larry@keycard.ai>
Larry-Osakwe
approved these changes
Sep 5, 2026
Larry-Osakwe
left a comment
Contributor
There was a problem hiding this comment.
Reviewed the job line by line: --no-sources floor installs from the index, fail-fast off, fail-closed on unparseable requirements and unpublished floors, bootstrap label skips only the ahead-of-PyPI case. All six legs green is the empirical proof of the three corrected floors.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
ECO-379. The uv workspace resolves sibling packages to the local checkout, so every existing test runs against sibling code the published floor does not promise. This adds a
sibling-floorsmatrix job topr.ymlbeside the langchain version matrix, one leg per package that declares akeycardai-*dependency (a2a, fastmcp, langchain, mcp, starlette, temporal). Existing jobs are untouched.Per leg:
uv build --wheel packages/<pkg>(fetch-depth 0 so uv-dynamic-versioning gets the real version).[project].dependenciesforkeycardai-*>=Xfloors. Check eachXexists on PyPI first.uv venvplusuv pip install --no-sources <wheel>[test] keycardai-a==X keycardai-b==Y. Siblings come from PyPI at the exact floor; everything else resolves normally. Never falls back to a newer sibling.pytest tests/in that venv (import-smoke alone would catch the fastmcp class but not the starlette class, where the gap is an attribute read a test exercises).::error::naming the package, the pinned siblings, and the first error line (uv's resolver message for install failures, the firstE/FAILEDline for tests).Bootstrap escape hatch (documented in the job comment): if a floor names a sibling version PyPI does not have yet, the leg fails with a distinct "floor ... is ahead of PyPI" message. Adding the
floors-bootstraplabel to the PR turns that case, and only that case, into a skip so a carrier and consumer can merge together before the carrier releases.Floor corrections (metadata only, no release triggered)
The job found three live gaps on main. Each floor is raised to the oldest published version where the package's suite passes under the job. The corrected metadata ships with each package's next release; a scoped
chore(keycardai-<pkg>)bump can follow, this PR does not trigger one.uv.lockfiles are unchanged because the workspace records siblings as editable path sources, not specifiers.keycardai-fastmcp:keycardai-oauth>=0.7.0to>=0.12.0. 0.7.0 to 0.9.0 fail to import (keycardai.oauth.serverarrives in 0.10.0), 0.10.0 and 0.11.0 fail twoAccessContexttests (available_resourcesis[]instead ofNone). This is the fix ECO-379's comment flagged.keycardai-mcp:keycardai-oauth>=0.9.0,keycardai-starlette>=0.6.0to>=0.16.0,>=0.9.0. The old pair is unsatisfiable (starlette 0.6.0 requires oauth>=0.13.0); starlette 0.9 to 0.12 importInvalidTokenError, which lands in oauth 0.16.0; starlette 0.8.0 fails a metadata test.keycardai-a2a:keycardai-oauth>=0.11.0,keycardai-starlette>=0.3.0to>=0.16.0,>=0.9.0.KeycardAuthBackend(require_authentication=...)arrives in starlette 0.4.0; 0.4.0 to 0.8.0 fail one metadata test (503 vs 502).Verified locally for all six legs, plus the ahead-of-PyPI failure and the label skip.
Link to Devin session: https://app.devin.ai/sessions/bbc062cf32b548ef9c4b8b444d2ec67f
Open in Devin Desktop: https://app.devin.ai/desktop/session/bbc062cf32b548ef9c4b8b444d2ec67f?variant=devin
Requested by: @Larry-Osakwe