You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Remove lat_spec schema workaround after ToolRegistry releases union fix #165
PR #164 added a downstream workaround in registry._trim_wire_schema because ToolRegistry 0.18.1 drops branches from heterogeneous union schemas. Keep that workaround until the upstream defect is fixed and released, then adopt the fixed ToolRegistry release and remove our compatibility code.
Confirm run_analysis and plot_dataset serve lat_spec as number | array<number> without local schema repair.
Confirm a JSON array such as [-60, 60] passes through execute_tool_calls validation.
Remove _UNTYPED_UNION_SCHEMAS, _type_untyped_unions(), and its call from _trim_wire_schema.
Retain or adapt the regression tests so the wire contract remains pinned to real registry execution.
Re-measure and lower the schema payload budgets if removing the workaround changes their size.
Blocking condition
Do not remove the workaround merely because the upstream issue or PR is merged. Wait until a ToolRegistry release containing the fix is available and the end-to-end tests pass against that released version.
toolregistry 0.19.0 is out (2026-10-23) and does contain Oaklight/ToolRegistry#269. #193 takes it. Walking the checklist:
Upgrade the minimum toolregistry version — floor is now >=0.19.0, with toolregistry-server>=0.7.0 beside it.
Refresh uv.lock and package metadata.
Confirm run_analysis and plot_dataset serve lat_spec as number | array<number> — they do.
Confirm a JSON array such as [-60, 60] passes validation — the existing wire tests cover this and pass.
Remove _UNTYPED_UNION_SCHEMAS / _type_untyped_unions — not done, see below.
Retain the regression tests against real registry execution.
Re-measure the payload budgets.
Why the workaround stays
The fix works, but it is not sufficient for this parameter. lat_spec is annotated tuple | float | list[Any] | None, and tuple and list both render as array, so 0.19 emits:
The array branch twice, with untyped items. Valid JSON Schema, and a client would work from it, but it is a duplicated branch in a payload we budget and it drops the item type we know.
So the helper changed role rather than going away: it used to fill an absent type, and now replaces a poor rendering with the canonical one. Net effect on the served spec is negative — 36271 → 36143 bytes — because the duplicate goes away.
Two ways to actually close this:
Narrow the annotation to float | list[float] | None and drop tuple. JSON has no tuple, so no MCP client could ever send one; the only caller who can is Python. That would likely make upstream's rendering correct and the helper genuinely dead.
Ask upstream to de-duplicate identical anyOf branches.
(1) is ours to do and is probably the right follow-up. Leaving this open and re-scoped to that.
Separately, worth knowing: toolregistry-server 0.7.0 began inferring tool annotations, and marked manage_session and resume_workflowreadOnlyHint=True — both change state. #193 makes our ratings authoritative and clears inferred hints on tools we left unrated.
Activity
rajeeja commentedon Oct 23, 2026
toolregistry 0.19.0 is out (2026-10-23) and does contain Oaklight/ToolRegistry#269. #193 takes it. Walking the checklist:
toolregistryversion — floor is now>=0.19.0, withtoolregistry-server>=0.7.0beside it.uv.lockand package metadata.run_analysisandplot_datasetservelat_specasnumber | array<number>— they do.[-60, 60]passes validation — the existing wire tests cover this and pass._UNTYPED_UNION_SCHEMAS/_type_untyped_unions— not done, see below.Why the workaround stays
The fix works, but it is not sufficient for this parameter.
lat_specis annotatedtuple | float | list[Any] | None, andtupleandlistboth render asarray, so 0.19 emits:The array branch twice, with untyped items. Valid JSON Schema, and a client would work from it, but it is a duplicated branch in a payload we budget and it drops the item type we know.
So the helper changed role rather than going away: it used to fill an absent
type, and now replaces a poor rendering with the canonical one. Net effect on the served spec is negative — 36271 → 36143 bytes — because the duplicate goes away.Two ways to actually close this:
float | list[float] | Noneand droptuple. JSON has no tuple, so no MCP client could ever send one; the only caller who can is Python. That would likely make upstream's rendering correct and the helper genuinely dead.anyOfbranches.(1) is ours to do and is probably the right follow-up. Leaving this open and re-scoped to that.
Separately, worth knowing: toolregistry-server 0.7.0 began inferring tool annotations, and marked
manage_sessionandresume_workflowreadOnlyHint=True— both change state. #193 makes our ratings authoritative and clears inferred hints on tools we left unrated.