Skip to content

v2.5.5 — release ritual + td_ingest_url ship

Latest

Choose a tag to compare

@dreamrec dreamrec released this 19 May 15:04
797960b

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 ULA fc00::/7, IPv6 link-local fe80::/10, the 172.16-31.x RFC1918 range with tight bounds-check.
  • No redirects. A custom _NoRedirectHandler aborts redirects so an attacker can't bait https://attacker.example.com/redirect?to=http://localhost past the host allowlist.
  • Per-request timeout via TDPILOT_INGEST_TIMEOUT env (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's input_schema.required keys must also appear in the MCP-side inputSchema.properties. Intentional translations (e.g. chat-pipe op_type → MCP node_type) are whitelisted via INTENTIONAL_ARG_TRANSLATIONS.
  • test_chat_pipe_schemas_have_consistent_structure — every chat-pipe schema entry must declare input_schema of 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.pycallbacks/_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 .tox hash 3dfaf709ff39a0be...
  • API .tox hash 821f8a6604e031f9...

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 by scripts/check_versions.py)
  • PR #56 (source) merged as 1ef8855; PR #57 (ritual) merged as 797960b. 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 by release-assets.yml)
  • tdpilot.mcpb — Claude Desktop one-click bundle (built + attached by release-assets.yml)

Generated with Claude Code.