Repository navigation
release: 1.5.1 (cap mcp<2) - #125
Merged
Merged
Conversation
Codex Review Summary: ✅ CompletedThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Published 1.5.0 and 1.4.1 require mcp>=1.0.0 with no upper bound. A plain `pip install index-it-mcp==1.5.0` resolves mcp 2.3.0 and `index-it-mcp stdio` fails at import: McpError is gone from mcp.shared.exceptions. Release smoke and the PMCP pilot install under uv.lock (mcp 1.27.0), so neither saw it. - Cap the runtime requirement at mcp>=1.27,<2; the lock stays on 1.27.0. Porting to mcp 2.x is Code-Index-MCP#124. - Add release_smoke.py --unconstrained, run by `make release-smoke` (and so by the CI agent gate and Release Automation): install the wheel alone into a fresh Python 3.12 venv with no lock constraints, check --version, prefetch grammars into an explicit TREE_SITTER_LANGUAGE_PACK_CACHE_DIR, then run a raw JSON-RPC initialize/tools/list probe and the lexical STDIO queries. The locked and unconstrained smokes share one built wheel. It fails on 1.5.0's requirements (mcp 2.3.0) and passes with the cap (mcp 1.30.0). - Bump to 1.5.1 across pyproject, __version__, uv.lock, the release workflow default, Docker installers, release docs and release-gate tests; add the CHANGELOG section and the unconstrained flag to delivered acceptance. - Docs (on top of #123): 1.5.1 is the prepared corrective candidate, 1.5.0 is published with partial delivered acceptance, and neither 1.5.0 nor 1.4.1 should be installed unpinned. Drop #123's "mcp<2" install pin, which 1.5.1 makes unnecessary; keep its 1.5.0 acceptance record as history. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ViperJuice
force-pushed
the
release/v1.5.1
branch
from
November 9, 2026 01:46
be60068 to
f6c26cf
Compare
…oke env (#125 review) Review of f6c26cf (MERGE-READY, 0 blocking): - S1: "unpinned" was ambiguous: `pip install index-it-mcp==1.5.0` looks pinned but is exactly the broken install. The docs and CHANGELOG now say not to install 1.5.0 or 1.4.1 without constraining `mcp` below 2, even as `index-it-mcp==1.5.0`; the docs tests require that phrase and reject "unpinned". - S2: the unconstrained install now sees only an allowlist of environment variables (interpreter, uv cache, temp, locale, TLS, proxies) and resolves with `--default-index https://pypi.org/simple`. `--no-config` does not block UV_OFFLINE, UV_DEFAULT_INDEX, UV_FIND_LINKS or UV_EXCLUDE, which could make delivered acceptance pass on older versions than PyPI users get. The contract test sets those variables and asserts they never reach the install. A real run with UV_OFFLINE=1 and UV_EXCLUDE_NEWER=2026-01-01 set still resolved the newest PyPI versions (mcp 1.30.0) and passed. - NIT: the runbook says an unconstrained-smoke failure at publish means a new dependency bound, never a rerun; the no-op PIP_CONSTRAINT entry is gone with the strip list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merged
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.
Defect
Published
index-it-mcp1.5.0, and 1.4.1 before it, requiremcp>=1.0.0with no upper bound. A plainpip install index-it-mcp==1.5.0resolvesmcp2.3.0, andindex-it-mcp stdiothen crashes at import:Release smoke and the PMCP pilot both install under
uv.lock(mcp1.27.0), so neither caught it.Fix
pyproject.toml:mcp>=1.0.0→mcp>=1.27,<2. Inuv.lock, only the specifier and the project's own version change;mcpstays locked at 1.27.0.uv lock --checkpasses.mcp2.x is tracked in Port to the mcp 2.x SDK (co-install with pmcp 3) #124 and is not part of this PR.pyproject.toml,__version__, the project'suv.lockentry, the Release Automation default, both Docker installers, README / GETTING_STARTED / MCP_CONFIGURATION / SUPPORT_MATRIX /docs/operations/v13-release.md, and the release-gate tests.## [1.5.1] - 2026-11-08"prepared corrective release" section (the 1.4.1 pattern). It covers the defect and the fix, says 1.5.0 and 1.4.1 must not be installed unpinned, names Port to the mcp 2.x SDK (co-install with pmcp 3) #124 as the follow-up, and notes the planned yank.ac2cffa). README, GETTING_STARTED, MCP_CONFIGURATION, SUPPORT_MATRIX andv13-release.mdnow say:mcp;"mcp<2"install pin is removed from the install instructions (README status block, Quick Start, PyPI paragraph and Current Status; GETTING_STARTED status and wheel block; MCP_CONFIGURATION; SUPPORT_MATRIX;v13-release.mddistribution line;public-package-identity.md), because 1.5.1 makes it unnecessary.v1.5.0image, which passed delivered acceptance.v13-release.mdand theV13_EXECUTION.mdrecord, including their note that adding"mcp<2"fixed the 1.5.0 install.mcp<2hint for users stays in the CHANGELOG, for hosts that must stay on 1.4.1 (glibc older than 2.34).PUBLISHED_VERSION = "1.5.0"is added besideEXPECTED_VERSION = "1.5.1";1.5.0" and "unpinned", and must not contain"mcp<2";v1.5.1image on publication and name the signedv1.5.0image.New guard: unconstrained release smoke
scripts/release_smoke.py --unconstrained:uv pip install --no-config --resolution highest <wheel>;-clock constraints and stripsUV_CONSTRAINT,UV_OVERRIDE,UV_EXCLUDE_NEWERand similar variables, so only the wheel's ownRequires-Distlimits what resolves;uv pip check, prints the resolved direct dependencies, and runsindex-it-mcp --version(which must report the source version);index-it-mcp grammars prefetchinto an explicitTREE_SITTER_LANGUAGE_PACK_CACHE_DIR: the caller's cache if one is set (as in CI), otherwise a private one. A caller's..._LIBS_DIRis dropped, because it holds libraries for the locked language pack;installed_runtime_smoke.py --mode initializeprobe: MCPinitialize,notifications/initializedandtools/listover raw newline-delimited JSON-RPC, with no MCP client library. It works whatevermcpversion was resolved, and fails fast with the server's stderr if the server exits;Wiring:
make release-smokenow runs--wheel --stdio --unconstrained, so it is part of the CI agent gate (agent-gate-local→release-smoke) and of Release Automation's prepare and publish preflight.--unconstrainedalso works with--wheel-path/--wheel-sha256, and delivered acceptance inv13-release.mdnow includes it, so a registry wheel is checked the way users install it.Fail/pass evidence (dev0, 2026-11-08):
mcporigin/main81980d0 (1.5.0 requirements) with the new smoke copied in--mode initialize:ImportError: cannot import name 'McpError' from 'mcp.shared.exceptions' … Did you mean: 'MCPError'?→RuntimeError: STDIO server exited before response 1 (exit code 1){"stdio_initialize": "passed", "protocol_version": "2025-06-18", "tools": 8}, two STDIO query sessions passed,{"unconstrained_smoke": "passed", "python": "3.12"}make release-smokeon the rebased head f6c26cf passed: the locked smoke (schema, prepare, python, STDIO, lifecycle/safety) and then the unconstrained smoke, on one wheel (sha256 0aa2da0f…493154fd). It also passed on the pre-rebase head be60068.Dependency audit (other unbounded runtime requirements)
I compared a fresh unconstrained install against
uv.lock. These direct runtime requirements can move a lot:mcp>=1.0.0openai>=1.51.0watchdog>=3.0.0fastapi>=0.100.0uvicorn>=0.23.0voyageai>=0.2.0jedi>=0.19.0click,pydantic,numpy,qdrant-client,psutil,bcrypt,argon2-cffi,httpx,python-dotenv,pyyamltree-sitter,treesitter-chunker,tree-sitter-language-pack,pathspec,baml-bridgeSome transitive packages also move a major version: cryptography 50, filelock 4, huggingface-hub 2, multidict 7, pillow 13, portalocker 4, pyarrow 26, python-dateutil 4, xxhash 4, and argon2-cffi-bindings 26. Their parents' own bounds govern them.
Evidence that the uncapped ones are safe (fresh 3.12 venvs, cap applied, unconstrained compared with lock-constrained):
--version, grammar prefetch, initialize/tools/list and the STDIO queries.mcp_server.*module gives identical results in both venvs. 8 modules fail to import in both: they need optional extras (jinja2,tabulate,javalang,matplotlib) or hit the existinginterfaces/*MRO errors. None of these failures comes from a dependency version.schemaandpythonprobes pass, and the HTTP gateway (uvicorn mcp_server.gateway:app, fastapi 0.162 / uvicorn 0.54) passes the installedhttpprobe, in both venvs.OpenAI(...).embeddings.create, includingdimensions, andAsyncOpenAI(...).chat.completions.createon openai 3.46;voyageai.Client.embed/rerankwith the same parameters on 0.5.0;QdrantClient(":memory:")on 1.20;watchdogObserveron 7.1.Conclusion: no other bound is needed for 1.5.1. Live semantic calls (they need API keys) were not run. Any future major release of a dependency will now fail the unconstrained smoke at the next release gate. It cannot protect wheels that are already published.
Packaging and co-install (fresh Python 3.12.14 venvs)
uv build:index_it_mcp-1.5.1-py3-none-any.whlandindex_it_mcp-1.5.1.tar.gz. Wheel metadata hasRequires-Dist: mcp<2,>=1.27.pip install <wheel>: resolvesmcp1.30.0.pip checkis clean,index-it-mcp --versionreports 1.5.1, and the raw-JSON-RPCinitializeprobe passes (8 tools).phase-loop-runtime==0.7.30:uv pip install <wheel> phase-loop-runtime==0.7.30gives mcp 1.30.0, baml-bridge 0.23.0, tree-sitter 0.26.0 and treesitter-chunker 6.0.0.uv pip checkreports "All installed packages are compatible", and STDIOinitializepasses in that venv.pmcp>=3.0.1needsmcp>=2.2.0,<3, souv pip compilereturns "requirements are unsatisfiable". Runindex-it-mcpin its own environment until the port lands.Tests run (dev0, serial,
nice, one file per invocation, no xdist)All results below were re-run on the rebased head f6c26cf; 72 files passed, none failed.
tests/smoke/test_release_smoke_contract.py: 30 passed, on Python 3.12 and 3.14. 7 new tests: unconstrained install without lock constraints or pin variables, explicit and default grammar cache,--versionmismatch refusal, one build shared by locked and unconstrained, delivered-mode mixing refusal, a raw JSON-RPC probe against a fake server, and a fast failure when the server cannot import.tests/test_release_metadata.py: 27 passed, including a new check thatmcp>=1.27,<2is inpyproject.tomland the lock stays onmcp1.x.tests/test_release_notes.py: 4 passedtests/test_p25_release_gates.py: 7 passedtests/test_workflow_release_policy.py: 42 passedtests/test_localci_workflow_posture.py: 5 passedtests/test_p26_alpha_evidence.py: 6 passedtests/test_v13_pmcp_pilot.py: 160 passed (Python 3.12)tests/docs/test_*.pyfiles andtests/test_requirements_consolidation.pypass.black,isortandflake8are clean on the changed files;uv lock --checkpasses.make release-smokeon f6c26cf passed.The full suite was not run on dev0; hosted CI covers it.
Remaining publish steps (each needs owner approval)
ac2cffa).docs/operations/v13-release.md: check that PyPI, GHCR, the GitHub release and the tag have nov1.5.1collisions, then dispatchRelease Automationonce withmode=publish,version=v1.5.1,auto_merge=false,expected_commit=<merge sha>,expected_tree=<accepted tree>,--ref main.release_smoke.py --wheel-path <pypi wheel> --wheel-sha256 <registry sha256> --unconstrained --image-ref <ghcr>@sha256:<digest>, then the PMCP pilot modes. Also run a plainpip install index-it-mcp==1.5.1in a fresh venv and start STDIO.No tag, release dispatch, publish, yank or merge was done in this PR.
Review fixes (
e4387e7)The independent review of
f6c26cfwas MERGE-READY (0 blocking, 2 should-fix, 3 nits). Fixed ine4387e7:pip install index-it-mcp==1.5.0looks pinned but is exactly the broken install.mcpbelow 2, even as==1.5.0.--default-index https://pypi.org/simple.--no-configletUV_OFFLINE,UV_DEFAULT_INDEX,UV_FIND_LINKSandUV_EXCLUDEthrough.UV_OFFLINE=1andUV_EXCLUDE_NEWER=2026-01-01set, it still resolved the newest PyPI versions (mcp1.30.0, openai 3.46.0) and passed.PIP_CONSTRAINTentry was removed.tests/docsfiles, v13 release candidate, and workflow release policy all pass, run one at a time. black, isort and flake8 are clean on the changed tests; the unusedsysimport inscripts/release_smoke.pypredates this commit and is outside CI's lint scope.🤖 Generated with Claude Code