---
summary: "fix: find_* dataframe spillover survives reserved-word columns (end, order, etc.) via centralized sanitization; brapi_walk_pedigree now enforces its 1,000-node cap mid-traversal as a hard ceiling"
breaking: false
security: false
---

# 0.7.1 — 2026-06-01

## Added

- **`DataframeHandleSchema.columnLegend`** — optional `Record<string, string>` mapping each sanitized SQL column name back to its original upstream key (e.g. `end_` → `end`). Present only when one or more columns were renamed; absent otherwise. Surfaces in `brapi_dataframe_query`/`brapi_dataframe_describe` consumers so agents know which columns to reference in SQL. ([#37](https://github.com/cyanheads/brapi-mcp-server/issues/37))
- **`brapi_walk_pedigree` truncation warning** — emits a warning when the 1,000-node cap cuts a walk short; `truncated: true` propagates to the result. ([#17](https://github.com/cyanheads/brapi-mcp-server/issues/17))

## Fixed

- **`find_*` dataframe spillover** no longer throws `Canvas column name "end" is a reserved SQL keyword` when an upstream row carries a reserved word or invalid identifier shape. Sanitization is centralized in `CanvasBridge.registerDataframe` via `sanitizeRowColumns`, covering germplasm, studies, observations, locations, images, variables, variants, and any future `find_*` tool automatically. ([#37](https://github.com/cyanheads/brapi-mcp-server/issues/37))
- **`brapi_walk_pedigree` node cap** was enforced only at the start of each depth iteration; a single high-fan-out expansion could overshoot to ~4× the limit before the next check. The cap is now a hard per-registration ceiling enforced inside the expansion loop. ([#17](https://github.com/cyanheads/brapi-mcp-server/issues/17))
