---
summary: Issue-cleanup release — flat ZodError messages with structured issues, locale-aware format-parity, devcheck changelog guard, skill protocol refinements, and GitHub label + template scaffolding
breaking: false
---

# 0.7.0 — 2026-04-24

Batch of issue-cleanup work across error handling, linter resilience, devcheck tooling, release workflow guidance, and GitHub issue-management scaffolding. No runtime breaking changes — the ZodError message reshape is observable but nobody should have been parsing the raw JSON string.

## Added

- **Locale-aware digit-group separators in `format-parity` (#54)** — `sentinelAppears` in `src/linter/rules/format-parity-rules.ts` now retries numeric sentinel matching against text with common separators stripped (comma, period, underscore, apostrophe, right single quote, space variants including narrow no-break U+202F, Arabic thousands U+066C). Covers en-US, de-DE, fr-FR, de-CH. Compact, scientific, and other lossy transforms still fail by construction.
- **Structured `issues` on ZodError-derived `McpError.data` (#55)** — resource param validation, tool output validation, and user-thrown `ZodError` all populate `error.data.issues` with the full `ZodIssue[]`. For tools, the issues surface via `_meta.error.data.issues` alongside explicit `McpError.data`.
- **Secondary issue labels** — `regression`, `performance`, `security`, `breaking-change` created on the repo. `.github/ISSUE_TEMPLATE/` forms now auto-assign to `cyanheads` and list secondary labels inline; `templates/.github/ISSUE_TEMPLATE/` scaffolds the same guidance into new consumer servers with a commented-out assignees line.

## Changed

- **Flattened ZodError message shape (#55)** — `getErrorMessage(err)` in `src/utils/internal/error-handler/helpers.ts` detects `ZodError` and returns `<first-issue.message> at <path> (+N more)` instead of the raw serialized issue array. New exported helper `formatZodErrorMessage(err)` is the building block. Affects logs, `McpError.message`, and anything downstream that reads the message string — net cleaner across the board.
- **`classifyOnly` return signature extended (#55)** — added optional `data?: Record<string, unknown>` field. Backward-compatible addition (existing destructures without `data` continue to work). For `ZodError`, returns `{ code: ValidationError, message: <flat>, data: { issues } }`.
- **`ERROR_TYPE_MAPPINGS` now covers `ZodError`** — maps to `JsonRpcErrorCode.ValidationError` directly instead of falling through to message-pattern matching.
- **Auto-task tool error path cleaner on ZodError (#55)** — `runAutoTaskHandler` in `src/mcp-server/tools/tool-registration.ts` uses `getErrorMessage(error)` when storing the failed task result, so stored `content[].text` reads as prose for ZodError failures too.
- **`skills/maintenance/SKILL.md` default behavior (#56)** — bumped to v1.5. Step 4 (template review) replaces "cherry-pick / never auto-merge" with direct application of framework-authored updates; Step 6 splits into two tiers (framework changes default adopt; third-party changes default cost/benefit); Step 8 renames "Needs attention" → "Open decisions" with narrower scope.
- **`skills/api-linter/SKILL.md` `describe-on-fields` (#53)** — bumped to v1.1. Added recursion-rules table explicitly stating primitive array elements are skipped; flagged the `z.union([z.string(), z.array(z.string())])` asymmetry as the specific trap; softened "mechanical fix" framing.
- **`skills/release-and-publish/SKILL.md` failure protocol (#52)** — bumped to v2.1. Steps 3–6 now retry transient network failures (integrity check, ECONNRESET/EAI_AGAIN/ETIMEDOUT/ENOTFOUND, connection reset/refused, timeouts, HTTP 502/503/504) up to 2× with short backoff before halting. `docker builder prune -f` runs before retrying `buildx --push`. Idempotent-success signals (`version already exists`, `cannot publish duplicate version`) are treated as success and skipped.
- **`skills/report-issue-framework/SKILL.md` and `skills/report-issue-local/SKILL.md`** — both v1.3. Labels section restructured into primary (required, pick one) + secondary (optional, stackable); `docs` references fixed to `documentation`; CLI examples include `--assignee "@me"`; local skill includes a `gh label create` block for consumers whose repos lack the secondaries.

## Fixed

- **Changelog Sync devcheck step crashed on single-file `CHANGELOG.md` consumers (#51)** — `scripts/devcheck.ts` previously ran `build-changelog.ts` whenever either `changelog/` or `CHANGELOG.md` existed, but the script unconditionally `readdirSync`'d the directory and crashed with `ENOENT`. Guard now checks only for `changelog/` directory existence (the rollup is a derived artifact, not the driver). `scripts/build-changelog.ts main()` also early-exits when `CHANGELOG_DIR` is missing so direct invocation is robust.
- **Resource param validation no longer surfaces raw Zod JSON in `error.message` (#55)** — `resourceHandlerFactory.ts` catch block now destructures `data` from `ErrorHandler.classifyOnly` and passes it to the constructed `McpError`. Resource `error.message` reads as prose matching the tool path's shape; structured issues live in `error.data`.
