Conversation
- pyproject: mcp>=1.28.1,<2 (mcp 2.x removed mcp.server.fastmcp, so an uncapped range installs a breaking major), pydantic-settings>=2.14.2, python-dotenv>=1.2.2, Pillow>=12.3.0, pytest>=9.0.3. - CodeQL #10 (py/incomplete-url-substring-sanitization): parse the URL line of the metrics report and compare scheme and hostname instead of a substring check. - CodeQL #9 (py/unused-global-variable): remove the dead STRUCTURED_OUTPUT_SCHEMA constant; vision.py prompts with its own JSON_OUTPUT_INSTRUCTION and nothing references it. - Temporary workflow regenerates uv.lock (too large for the API push). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0171XyyqTUH64gAi1AcerwjN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0171XyyqTUH64gAi1AcerwjN
|
@coderabbitai review |
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository: rishitank/animawatch/.coderabbit.yaml Review profile: ASSERTIVE Plan: Advanced Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (2)
💤 Files with no reviewable changes (1)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. Summary by CodeRabbit
WalkthroughThe pull request raises minimum versions for five dependencies, removes ChangesDependency minimums
Model schema removal
Metrics URL assertion
Priority: ⬆️ High Estimated code review effort: 1 (Trivial) | ~5 minutes Change: Bug fix Merge Risk: ⚪ Minimal · up to The dependency lock matches the updated requirements, and the schema and metrics changes have no identified contract break. No concrete change-specific merge risk is established. Security Architecture ReviewSecurity architecture risk: 🔵 Low · up to The dependency limits appear intended to keep installations on a compatible, updated MCP release. No new production access path was identified, but installed versions and downstream use of the removed schema export have not been verified. Retained concerns Security review detailsSecurity Blast Radius
Trust Boundaries and Controls
Resilience and Maintainability Implications
Hardening Proposals
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Apprentice, versions rise in line Comment |
|
|
@coderabbitai review |
✅ Action performedReview finished.
|
|
Brought up to date with main using Update branch. The new head is
This PR stays a draft until #32 (which fences 🤖 Generated with Claude Code |
|
@coderabbitai review |
|
|
@coderabbitai review |
✅ Action performedReview finished.
|
What
This PR clears all 65 open Dependabot alerts (1 critical, 33 high, 24 medium, 7 low, all in
uv.lock) and the 2 open CodeQL alerts (#10, #9).uv.lock: targeted upgrades only, viauv lock --upgrade-package anyio pillow cryptography pyasn1 pyjwt mcp starlette python-multipart urllib3 msgpack pip pydantic-settings idna python-dotenv pytest requests pygments click. Nothing else in the lock moved.click8.3.1 → 8.5.0 is included becausepip-audit(theSecurity Auditjob) flags PYSEC-2026-2132 against it, even though Dependabot has no alert for it.pyproject.toml: raised the lower bounds of the direct dependencies that had alerts, so a fresh install can't resolve a vulnerable version:mcp>=1.28.1,<2pydantic-settings>=2.14.2python-dotenv>=1.2.2Pillow>=12.3.0pytest>=9.0.3mcphas an upper bound (<2): mcp 2.x is out (2.2.0). It removedmcp.server.fastmcp(FastMCP was renamedMCPServer), soserver.pyfails at import. I tried it:ModuleNotFoundError: No module named 'mcp.server.fastmcp'. This is mcp 2.x …. The oldmcp>=1.9.0range means anyone who installsanimawatchfrom PyPI today gets mcp 2.x and a broken server, so the cap also fixes that. mcp 1.30.0 is the latest 1.x and includes every mcp security fix. Migrating to 2.x is a real piece of work, and Renovate will propose it as amajor-upgradePR for a human to review (see the Renovate PR).py/incomplete-url-substring-sanitization, high) attests/test_metrics.py:149. The test checked"https://test.com" in report. It now finds the report'sURL:line, parses it withurllib.parse.urlparse, and assertsscheme == "https"andhostname == "test.com". That is also a stricter assertion than before.py/unused-global-variable, note) atsrc/animawatch/models.py:143. I removedSTRUCTURED_OUTPUT_SCHEMA. Nothing in the repo references it:vision.pyprompts with its ownJSON_OUTPUT_INSTRUCTION. The now-unusedtyping.Anyimport went with it.Alert → fixed-version map
mainhas 65 open alerts. Every one is resolved by the locked version below; I checked this programmatically against each alert'sfirst_patched_version.anyio#72 · critical · GHSA-82r6-8w77-94w6 · ≥4.14.2
cryptography#9 · low · GHSA-m959-cc7f-wv43 · ≥46.0.6
#11 · medium · GHSA-p423-j2cm-9vmq · ≥46.0.7
#40 · high · GHSA-537c-gmf6-5ccf · ≥48.0.1
#65 · high · GHSA-g6cj-pr64-35w5 · ≥50.0.0
#73 · medium · GHSA-m2h6-j472-rp4c · ≥49.0.0
#74 · high · GHSA-jwv3-5hgf-82ww · ≥49.0.0
idnamcp(direct, bound raised)#45 · high · GHSA-jpw9-pfvf-9f58 · ≥1.27.2
#46 · high · GHSA-vj7q-gjh5-988w · ≥1.28.1
msgpackpillow(direct, bound raised)#12 · high · GHSA-whj4-6x5x-4v2j · ≥12.2.0
#17 · medium · GHSA-5xmw-vc9v-4wf2 · ≥12.2.0
#18 · high · GHSA-pwv6-vv43-88gr · ≥12.2.0
#19 · medium · GHSA-wjx4-4jcj-g98j · ≥12.2.0
#20 · medium · GHSA-r73j-pqj5-w3x7 · ≥12.2.0
#47 · medium · GHSA-pg7v-jwj7-p798 · ≥12.3.0
#48 · high · GHSA-62p4-gmf7-7g93 · ≥12.3.0
#49 · high · GHSA-5x94-69rx-g8h2 · ≥12.3.0
#50 · high · GHSA-8v84-f9pq-wr9x · ≥12.3.0
#51 · high · GHSA-45hq-cxwh-f6vc · ≥12.3.0
#52 · high · GHSA-phj9-mv4w-65pm · ≥12.3.0
#53 · medium · GHSA-4x4j-2g7c-83w6 · ≥12.3.0
#54 · high · GHSA-6r8x-57c9-28j4 · ≥12.3.0
#55 · high · GHSA-xj96-63gp-2gmr · ≥12.3.0
#56 · high · GHSA-9hw9-ch79-4vh6 · ≥12.3.0
#57 · high · GHSA-vjc4-5qp5-m44j · ≥12.3.0
#58 · medium · GHSA-fj7v-r99m-22gq · ≥12.3.0
#59 · high · GHSA-jjj6-mw9f-p565 · ≥12.3.0
pip#21 · medium · GHSA-jp4c-xjxw-mgf9 · ≥26.1
#43 · medium · GHSA-wf93-45jw-7689 · ≥26.1.2
#68 · medium · GHSA-qwm4-qh6w-59xr · ≥26.2.0
pyasn1#60 · high · GHSA-hm4w-wwcw-mr6r · ≥0.6.4
#61 · high · GHSA-8ppf-4f7h-5ppj · ≥0.6.4
#64 · high · GHSA-m4p7-r5rc-7g4j · ≥0.6.4
pydantic-settings(direct, bound raised)pygmentspyjwt#28 · medium · GHSA-jq35-7prp-9v3f · ≥2.13.0
#29 · medium · GHSA-w7vc-732c-9m39 · ≥2.13.0
#31 · high · GHSA-xgmm-8j9v-c9wx · ≥2.13.0
#62 · low · GHSA-fhv5-28vv-h8m8 · ≥2.13.0
#63 · medium · GHSA-993g-76c3-p5m4 · ≥2.13.0
pytest(direct, bound raised)python-dotenv(direct, bound raised)python-multipart#22 · high · GHSA-pp6c-gr5w-3c5g · ≥0.0.27
#32 · low · GHSA-vffw-93wf-4j4q · ≥0.0.30
#33 · low · GHSA-6jv3-5f52-599m · ≥0.0.30
#34 · low · GHSA-v9pg-7xvm-68hf · ≥0.0.31
#35 · high · GHSA-5rvq-cxj2-64vf · ≥0.0.30
requestsstarlette#36 · medium · GHSA-x746-7m8f-x49c · ≥1.1.0
#37 · high · GHSA-wqp7-x3pw-xc5r · ≥1.1.0
#38 · low · GHSA-jp82-jpqv-5vv3 · ≥1.3.0
#39 · high · GHSA-82w8-qh3p-5jfq · ≥1.3.1
urllib3#24 · high · GHSA-qccp-gfcp-xxvc · ≥2.7.0
(Alert #2,
protobuf, is alreadyfixed: protobuf left the lock in #4.)How it was verified
All of this was run locally with uv 0.8.17 on Python 3.12, the version CI uses, on the final lock (which is byte-for-byte what the relock workflow committed):
uv sync --all-extras --dev --locked: OKuv run pytest: 149 passeduv run ruff check .anduv run ruff format --check .: cleanuv run mypy src/: no issues in 16 filesuv run pip-audit: No known vulnerabilities found (onmainit reports click PYSEC-2026-2132)first_patched_versionwith the locked version: 0 still vulnerable.uv.lockis around 330 KB, too big for an API push. A temporary workflow (zz-tmp-uv-lock.yml, pinned to uv 0.8.17) ran the sameuv lock --upgrade-package …command on this branch and committed onlyuv.lockasgithub-actions[bot](8eac26c). The workflow was then deleted by an ordinary commit (b80a921), so CI runs on the final head.Risks
starlette0.52 → 1.7 is a major version, pulled in transitively by mcp 1.30. The tests pass, but no test covers the--http(streamable-http) transport end to end. I startedanimawatch --http: the server boots and answersPOST /mcp initializewith200. The session then fails on Playwright's browser launch, because the sandbox has no Chromium build that matches, andmainfails the same way. So please give--httpa quick manual check.cryptography46 → 50 andpyjwt2.11 → 2.15 are transitive (viamcp/google-auth) and aren't used directly.Image.getdata().diff.pystill calls it, which is where the 11DeprecationWarnings come from. It is removed only in Pillow 14 (2027-10). feat: improvements for PyPI publishing and testing #13 already replaces it withtobytes(), which behaves the same on 10.x through 12.3, so the two PRs are consistent and will merge cleanly in either order.STRUCTURED_OUTPUT_SCHEMAis technically a public-name removal in a 0.x package. Nothing in the repo used it.What Rishi must do
auto-merge.yml, which enables auto-merge with your PAT, and merging is your call.main.🤖 Generated with Claude Code
https://claude.ai/code/session_0171XyyqTUH64gAi1AcerwjN