---
summary: "Per-table TTL for DataCanvas; ctx.enrich.truncated() helper; canvas-consumer and capped-list-no-truncation lint rules; scaffold Dockerfile pre-creates writable data dirs."
breaking: false
security: false
agent-notes: |
  Two new warning-severity lint rules are active on upgrade and may surface new warnings in consumer devcheck runs:
  - `canvas-consumer-missing`: fires when a tool registers a canvas token in output but no `*_dataframe_query`-style consumer tool is found. Fix by adding a query tool, or suppress via `LintInput.canvasConsumers` (programmatic) or `MCP_LINT_CANVAS_CONSUMERS` (CSV env var; `false` disables entirely).
  - `capped-list-no-truncation`: fires when a tool has a cap-like input, an array output, and no `truncated`/`totalCount` disclosure in enrichment or output. Fix by adding `ctx.enrich.truncated(...)` or a `totalCount` field, or suppress via `LintInput.truncationAllowlist` (programmatic) or `MCP_LINT_TRUNCATION_ALLOWLIST` (CSV env var).
  Programmatic knobs take precedence over env vars.
  Six skills were updated in this release — re-sync via maintenance Phase A: api-mirror 1.0→1.1, api-canvas 1.4→1.5, api-linter 1.6→1.7, api-context 1.6→1.7, add-tool 2.13→2.14, design-mcp-server 2.17→2.18.
---

# 0.10.2 — 2026-06-10

## Added

- **`RegisterTableOptions.ttlMs`** — per-table TTL on `registerTable`; table expires after `ttlMs` ms and is dropped on the next sweep pass ([#140](https://github.com/cyanheads/mcp-ts-core/issues/140)).
- **`QueryOptions.ttlMs` with `registerAs`** — when a query result is materialized into a named table, `ttlMs` sets its TTL; the sweep drops expired tables before the canvas-level check.
- **`SpilloverOptions.ttlMs` passthrough** — spillover-created tables inherit `ttlMs` from the spillover options.
- **`TableInfo.expiresAt`** — ISO 8601 expiry field on table metadata; set only for TTL'd tables; surfaced via `describe()`.
- **Sliding TTL** — the per-table window slides on reads and writes against that table (`registerTable`, SQL references in `query()`, `export`); re-registering without `ttlMs` clears the prior TTL. Failed sweep drops are retried on the next pass.
- **`ctx.enrich.truncated({ shown, cap, ceiling?, guidance? })`** helper ([#197](https://github.com/cyanheads/mcp-ts-core/issues/197)) — writes `truncated`, `shown`, `cap`, `truncationCeiling?` enrichment values plus a `notice` (last-wins); eliminates boilerplate in cap-bounded list tools.
- **`canvas-consumer-missing` lint rule** (warning) ([#209](https://github.com/cyanheads/mcp-ts-core/issues/209)) — fires when a tool outputs a canvas token with no `*_dataframe_query`-style consumer in the definition set. Knobs: `LintInput.canvasConsumers` (array literal or `false`) / `MCP_LINT_CANVAS_CONSUMERS` (CSV; `false` disables). Programmatic knob wins.
- **`capped-list-no-truncation` lint rule** (warning) ([#197](https://github.com/cyanheads/mcp-ts-core/issues/197)) — fires when a tool has a cap-like input (`limit`/`per_page`/`page_size`/`max_results`/`max_items`, snake or camel), an array output, and no `truncated`/`totalCount` disclosure. Knobs: `LintInput.truncationAllowlist` (tool names) / `MCP_LINT_TRUNCATION_ALLOWLIST` (CSV). Programmatic knob wins.
- **Scaffold `Dockerfile` pre-creates writable data dirs** ([#199](https://github.com/cyanheads/mcp-ts-core/issues/199)) — `RUN mkdir -p /usr/src/app/.cache /usr/src/app/.mirror && chown -R bun:bun ...` before `USER bun`, so on-disk SQLite stores (`sqliteMirrorStore` catalog/mirror paths) open cleanly for the non-root runtime user.
- **`api-mirror` skill: "Shipping the mirror CLI in a production Docker image"** recipe ([#195](https://github.com/cyanheads/mcp-ts-core/issues/195)) — copy the mirror lifecycle scripts (plus the shared `_mirror-context.ts` shim) into the runtime stage and emit a runtime `tsconfig.json` mapping `@/*` to `./dist/*`, so `docker exec <container> bun run mirror:*` works in production. A commented reference block in the scaffold `Dockerfile` points at the recipe.
- **Skill updates**: api-mirror 1.0→1.1, api-canvas 1.4→1.5, api-linter 1.6→1.7, api-context 1.6→1.7, add-tool 2.13→2.14, design-mcp-server 2.17→2.18.

## Changed

- `hono` ^4.12.24 → ^4.12.25
- `@cloudflare/vitest-pool-workers` ^0.16.13 → ^0.16.14
- `@cloudflare/workers-types` 4.20260608.1 → 4.20260610.1
- `@supabase/supabase-js` ^2.108.0 → ^2.108.1
- `sanitize-html` ^2.17.4 → ^2.17.5
