v2.3.7
Pre-release
Pre-release
AI Efficiency Optimizations
- Tool list −20 % — the
tools/listevery turn carries shrank from 33.2 to 26.7 kB (single-window surface); per-calltimeoutMsnotes collapsed to one line, rationale moved to the skill; a 30 kB budget and 700-char/description cap are asserted in the transport test. serial.enabledsetting — off drops the tenserial_*tools from the list entirely.get_debug_instructionsby topic — ~2 kB overview + one section on request instead of one 21 kB block.- Compact motion state — step/continue/pause/
wait_for_stopreturn location, frame ids, top 5 frames and the breakpoint list only when it changed; full snapshot only at session start. - Capped listings — variables: 40 per scope, 200 chars per value (uncapped with
variableNames); call stack: 20 frames, workspace-relative paths; threads: 32;read_memorydefaults to hex. - Lighter recovery — after a motion timeout, PC and LR are read instead of all 23 core registers.
diagnose_fault— one call replaces the ~6-call HardFault loop (fault registers as one 24-byte read, stacked frame, top frames, address resolution, ranked hypotheses with the next call).lookup_peripheral/lookup_register— SVD answers with no session and no target access; unknown names get suggestions instead of the full name list.cmsis_actiontarget check/switch — every result names the target it ran on andtargetswitches/verifies it, removing the wrong-target build → confused-investigation round trips.- Measurement built in — per-call telemetry (bytes in/out, ms, outcome), the
cmsis-developer-assistant://statsresource, theget_session_statustrailer and optional JSONL export; the eval-scenario runner scores an agent's run against tool-call, turn and time budgets.
[2.3.7] - 2026-08-25
Added
cmsis_actionchecks and switches the target — the tool used to act on whatever target-type the CMSIS Solution panel happened to have selected, and its result never said which; on a board + FVP or HE/HP solution a build or flash could go to the wrong context unnoticed. Every result now names the target it ran on (✅ CMSIS 'build' succeeded on HP@debug …),get_device_inforeports the panel'sCMSIS target:, and the new optionaltargetinput (MPS3orHP@debug, the csolution's own names) selects one: a differing target is switched — the selection is written to.vscode/cmsis.jsonand the solution re-activated, the mechanism the extension (1.70) itself uses since it exposes no command for it — and verified throughcmsis-csolution.getActiveTargetSetbefore anything runs. An undeclared target is refused with the declared list, an unverifiable switch with what was written and what the extension still reports, and a switch under a live debug session with a pointer tostop_debugging. The build topic and thecmsis-debug-liveskill say when to passtarget; the transport test drives the refusal, switch and no-op paths against a stubbed extension.- Agent evaluation scenarios —
npm run eval:scenario -- <id>runs a real Copilot CLI session against a planted bug and reports what it cost: tool calls by name with argument and result bytes, reasoning turns, wall time, the server's per-tool byte totals (from thecmsis-developer-assistant://statsresource, diffed around the run), and a verdict from the final answer against the expected root cause plus tool-call, turn and time budgets; infrastructure failures are reported as such, not as agent failures. Ships the BSP Blinky example for the Corstone-300 FVP as the fixture (test/eval/fixtures/corstone-blinky, with the FVP shim for Docker on macOS) and five deterministic scenarios (divide by zero, undefined instruction through a corrupted function pointer, MSPLIM stack overflow, unaligned access, an LED off-by-one with no fault). Opt-in only — it needs an authenticated Copilot CLI, a VS Code window on the work directory and an FVP or board; the pure logic (scenario validation, event aggregation, verdict, mcp-config edit) is unit-tested.scripts/test-skill-trigger.tsshares the Copilot CLI helpers. diagnose_fault— one call replaces the six-call HardFault loop: the decoded fault registers (read as one 24-byte SCS block), the stacked exception frame located through EXC_RETURN (PSP or MSP, basic or FP-extended) with the PC of the faulting instruction and its caller, the top frames, the faulting address resolved against the SVD or the Cortex-M system map (an unclockedI2C1.CR1, a null pointer plus offset, SRAM), and up to three ranked hypotheses each with the next tool call — unclocked peripheral, null pointer, wild pointer, imprecise write, stack overflow (with MSPLIM/PSPLIM when the core has them), corrupted function pointer, missing Thumb bit, unaligned access, divide by zero, FPU off, bad VTOR. Every section after the fault registers degrades to a note instead of failing the call; with no fault flag set it returns a short stop context.get_fault_infonow also namesSTKOF(Armv8-M stack limit) andDEBUGEVT, and its text is otherwise unchanged. Four long tool descriptions were shortened to keep the tool list within its byte budget.
[2.3.6] - 2026-08-24
Added
lookup_peripheralandlookup_register— answer SVD questions without a debug session and without touching the target: the peripheral list, a peripheral's register map (offsets, absolute addresses, access), which peripheral and register sit at an address (turn a BFAR intoI2C1.CR1), and one register's bit fields with their enumerated values (which bit is the clock enable). The SVD is resolved from an explicitsvdFile, the active session,out/**/*.cbuild-run.yml(pnamepicks the core) or a single workspace.svd, and the failure text lists what was tried. Unknown names get suggestions instead of the full name list —read_peripheral_registernow does the same and points atlookup_peripheral. The parser readsaddressBlocks,enumeratedValuesanddimregister arrays, and no longer borrows a field'saccessfor its register.cmsis-developer-assistant.serial.enabled(default on) — off leaves the tenserial_*tools out of the MCP tool list, which every agent turn carries. Fixed per server instance (window reload), so the tool list a client sees never changes between turns.
Changed
- Smaller tool results. Step, continue, pause and
wait_for_stopnow return a compact state: the location and frame ids, the top 5 frames with the rest counted, and the breakpoint list only when it changed since the last snapshot (a count otherwise) — the full snapshot still comes back when a session starts.read_memorydefaults tohex(ascii/bothon request).get_call_stackprints workspace-relative paths and collapses frames beyond 20 unlesslevelsis given;get_threadslists up to 32 tasks. Variable listings withoutvariableNamesare capped at 40 variables per scope and 200 characters per value, with a footer saying how many were left out and how to widen; withvariableNamesnothing is capped. The recovery section after a motion timeout reads PC and LR instead of all 23 core registers. Tool descriptions state the caps. - Smaller tool list. The serialized
tools/listevery client receives atinitialize— and re-sends to the model on every turn — shrank by a fifth (33.2 → 26.7 kB for the single-window surface): the per-calltimeoutMsnote is one short line per tool with the rationale once in the server instructions, and thestart_debugging,cmsis_action,reset,add_breakpoint,add_logpoint,flashandget_debug_instructionsdescriptions carry the trigger and the one caveat an agent needs at call time; the reasoning moved to thecmsis-debug-liveskill and theget_debug_instructionstopics (buildfor the result line and long builds,breakpoints,inspectionfor reset methods). The transport test now asserts a byte budget for the tool list and a 700-character cap per description. get_debug_instructionstakes atopic— the guide for harnesses that do not load skills (GitHub Copilot Chat) no longer arrives as one 21 KB block. Withouttopicthe tool returns a ~2 KB overview (the critical steps, the debugger-first rule) plus the list of topics;session,build,breakpoints,inspection,faultsandtroubleshootingreturn one section each. The guide itself was restructured around those topics (marker comments a Markdown reader never sees), gained afaultssection (EXC_RETURN, the stacked frame, resolving BFAR, the usual cause per flag) and abuildsection (cmsis_action result line, long builds, flash, attach), and its inherited root-cause examples aboutgetUserById(),parseFloat()and payment forms were replaced by Cortex-M ones (stale D-cache after DMA, an unclocked peripheral, a watchdog fed from a blocking task, a staleSystemCoreClock). The full guide stays available as thecmsis-developer-assistant://docs/debug_instructionsresource; shipped docs are now read once per server instance.
[2.3.5] - 2026-08-24
Added
- Per-tool call telemetry — every MCP tool call is measured at the server boundary: argument and result bytes, wall time and outcome (
ok/timeout/error).get_session_statusnow ends with a two-line summary for the session, the newcmsis-developer-assistant://statsresource returns the per-tool totals as JSON (session and server instance, plus the last 50 samples) so a test driver can diff it around a run, one INFO line per call goes to the output channel, and the newcmsis-developer-assistant.telemetry.jsonlPathsetting (default off) appends one JSON line per call to a file — names and sizes only, never arguments or results.test/realboard/run.tswrites the statistics into its report. Groundwork for measuring the response-size work and for agent evaluation runs.
Also attached: cmsis-pack-docs-0.1.1.vsix — the experimental CMSIS Pack Docs extension (page-cited search over the DFP/BSP reference manuals and datasheets of the current csolution target, via its own MCP server), built to be merged into the Assistant later.
Pre-release (odd minor). Full changelog: https://github.com/MatthiasHertelArm/CMSIS-Developer-Assistant/blob/v2.3.7/CHANGELOG.md — the upstream PR for 2.3.5–2.3.7 follows.