v2.5.5 — release ritual + td_ingest_url ship (post-PR-#56)
Follow-up release that tags the source work from PR #56, which landed the td_ingest_url MCP tool + argument-shape parity tests on main with [skip-version-check] — the documented escape hatch in v2.5.4's tag-freshness CI gate. This release runs the standard ritual that was deferred.
🆕 td_ingest_url — v2.6.3 first slice
New MCP tool at src/td_mcp/registry/tools_ingest.py backed by src/td_mcp/web/ingest.py. Lets the agent fetch a public HTTPS page and pipe it through markitdown (optional [web] extras) so the resulting Markdown can be cited as context inline. The full v2.6.3 plan in docs/plans/v2.6_IMPLEMENTATION_PLAN.md was 3 days of work; this is the core fetch + sandbox slice (~½ day) — enough to be usable, with a follow-up required to expose the same tool through the chat-pipe surface.
Security model (minimal viable SSRF defense — not DNS-rebinding resistant; that's deferred to a v2.6.3 hardening follow-up):
- HTTPS only.
file://,http://,javascript:,data:,ftp://,gopher://rejected before any network call. - Loopback / RFC1918 / link-local literals rejected. Covers the cloud metadata service literal
169.254.169.254, IPv6 ULAfc00::/7, IPv6 link-localfe80::/10, the 172.16-31.x RFC1918 range with tight bounds-check. - No redirects. A custom
_NoRedirectHandleraborts redirects so an attacker can't baithttps://attacker.example.com/redirect?to=http://localhostpast the host allowlist. - Per-request timeout via
TDPILOT_INGEST_TIMEOUTenv (default 30 s). - Max response size cap via
TDPILOT_INGEST_MAX_BYTES(default 5 MB). - Identifying User-Agent so server logs can correlate.
Optional dep: pip install -e .[web] installs markitdown>=0.0.1. Without it, td_ingest_url returns a structured {"error": "web_extras_not_installed", "advice": ...} response — same pattern as td_ocr_image.
🧪 Argument-shape cross-runtime parity test
Closes the code-quality agent's "lower-frequency gap" finding from the 2026-05-19 fresh audit. The v2.5.4 schema↔handler name-parity tests catch drift in tool NAMES; v2.5.5 adds two new tests that catch drift in tool ARGUMENTS:
test_chat_pipe_required_args_exist_on_mcp_side— for each well-known shared tool (td_get_node_detail,td_create_node,td_set_params,td_get_content), the chat-pipe'sinput_schema.requiredkeys must also appear in the MCP-sideinputSchema.properties. Intentional translations (e.g. chat-pipeop_type→ MCPnode_type) are whitelisted viaINTENTIONAL_ARG_TRANSLATIONS.test_chat_pipe_schemas_have_consistent_structure— every chat-pipe schema entry must declareinput_schemaof type"object". Catches the bare{"name": "x"}regression class.
📊 Tool count: 109 → 110
EXPECTED_MIN_TOOL_COUNT in src/td_mcp/release_gates.py bumped to 110. mcp/manifest.json:surface.tool_count matches. tests/fixtures/tool_schemas.json snapshot regenerated to include td_ingest_url.
📝 Project CLAUDE.md — 7-file checklist → real 13-file checklist
The 2026-05-19 audit found that the project CLAUDE.md's "all 7 must match" version-bump checklist was stale — scripts/check_versions.py actually enforces 13 files (docs and skills carry user-visible version strings too). Updated with the real list + a note about the v1.8.3 / PR-#16 mcp_webserver_callbacks.py → callbacks/_header.py migration.
Both .tox files rebuilt against v2.5.5 API_VERSION
The source-only sweep (PR-#56) shipped to main with zero td_component/ changes and both .tox gates green. This release bumps td_component/callbacks/_header.py::API_VERSION from "2.5.4" to "2.5.5" — one byte change in a single file. That file is in the source list for both the MCP .tox (td_component/.tox-source-hash.json) and the API .tox (td_component/.tox-api-source-hash.json, where the callbacks/ package is bundled for the chat-pipe's MCP-server fallback), so the version bump trips both freshness gates. Both files rebuilt in TouchDesigner 2025.32820:
- MCP
.toxhash3dfaf709ff39a0be... - API
.toxhash821f8a6604e031f9...
Test totals
Source-only sweep: 2170 → 2205 passing (+35, +0 regressions; 4 skipped: 1 paddleocr E2E + 3 mock-eval scenarios pending fixture capture).
Operational
- All 13 version manifests synced at
2.5.5(validated byscripts/check_versions.py) - PR #56 (source) merged as
1ef8855; PR #57 (ritual) merged as797960b. Both PRs CI green.
Assets attached
tdpilot-dpsk4.tox— MCP-server-side .tox (drag into TD for the Claude Code CLI variant)tdpilot_API.tox— chat-pipe standalone .tox (drag into TD for the standalone browser-tab chat)tdpilot.plugin— Claude Code plugin ZIP (built + attached byrelease-assets.yml)tdpilot.mcpb— Claude Desktop one-click bundle (built + attached byrelease-assets.yml)
Generated with Claude Code.