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
Comprehensive code review and documentation overhaul. Two full review
cycles identified and fixed 40+ issues across math, architecture, domain
correctness, and documentation.
Bug fixes:
- AnalyzeSwerveTool.poseDistance always returned zero (flat struct layout)
- MoI R² used inconsistent torque formula between OLS and residual loops
- time_correlate included NaN/Infinity, used single-signal quality score
- CSV export struct columns didn't match header ordering
- 2024 Crescendo auto amp scoring was 5 instead of 2
- HTTP SSE committed 200 before executor acceptance check
- Cross-correlation center lag could cause ArrayIndexOutOfBounds
- DataQuality gaps changed from count-based to duration-based ratio
- TbaClient.apiKey not volatile for HTTP thread visibility
VS Code extension:
- Generates .mcp.json on activation for Claude Code compatibility
- Passes settings as both CLI args and env vars
- Auto-detects WPILib IDE JDK (matches season)
- Added extension icon
- New buildExtension Gradle task (package without installing)
Documentation:
- README restructured: Installation first, split detailed docs into
vscode-extension/README.md, doc/STANDALONE.md, doc/DEVELOPMENT.md
- AI model capability caveats added across all docs
- TOOLS.md confidence levels fixed (moderate→medium, added insufficient)
- Default team number set to 2363
Stress tests:
- Synthesize defaults when no config file present
- SLF4J logging reduced to warn, JUnit tree output, console forwarding
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+56-1Lines changed: 56 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,6 +5,61 @@ All notable changes to wpilog-mcp will be documented in this file.
5
5
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
8
+
## [0.8.2] - 2026-03-26
9
+
10
+
### Added
11
+
-**YAML configuration support** — `ConfigLoader` now parses `servers.yaml` with 3-layer defaults merging (top-level defaults, per-server overrides, environment variable interpolation).
12
+
-**VS Code extension** — `wpilog-analyzer` extension with `McpServerDefinitionProvider` registration and `.mcp.json` generation for Claude Code compatibility. Auto-detects WPILib IDE JDK, log directory, and bundled JAR. Extension icon added.
13
+
-**VS Code extension `.mcp.json` generation** — Extension writes `.mcp.json` on activation with all settings (log directory, team number, TBA key) so Claude Code can discover the server.
14
+
-**Standalone installer scripts** — `install.ps1` (Windows) and `install.sh` (macOS/Linux) for one-line installation outside VS Code.
15
+
-**CI/CD workflows** — GitHub Actions for build, test, and release automation.
16
+
-**`buildExtension` Gradle task** — Builds the server JAR, compiles TypeScript, and packages the `.vsix` without installing. Complements `bundleExtension` (JAR only) and `installExtension` (build + install).
17
+
-**Stress test default configuration** — Stress tests now synthesize defaults (`~/riologs`, team 2363, TBA from `TBA_API_KEY` env var) when no config file is present. No `servers.yaml` entry required.
18
+
19
+
### Fixed
20
+
-**`AnalyzeSwerveTool.poseDistance` always returned zero** — Odometry drift analysis now handles flat struct layout (`{x, y}`) from Pose decoders, not just nested `{translation: {x, y}}`.
21
+
-**MoI R² computation used inconsistent torque formula** — Residual loop now uses the same torque sign convention as the OLS fit.
22
+
-**`time_correlate` included NaN/Infinity values** — Filter now requires `Double.isFinite()`. Uses worst-of-two quality scores.
23
+
-**`FrcDomainTools.extractTranslation` only handled nested layout** — Now supports both nested `{translation: {x, y}}` and flat `{x, y}` from struct decoders.
24
+
-**CSV export struct column mismatch** — Explicit field ordering for Pose2d, Pose3d, SwerveModuleState matches header row. Generic structs use deterministic alphabetical ordering.
25
+
-**2024 Crescendo auto amp scoring** — Corrected from 5 to 2 points per game manual.
26
+
-**TBA quarterfinal match key** — Added explicit `qf` comp level handling.
27
+
-**HTTP SSE response committed before executor check** — Moved `sendResponseHeaders(200)` inside the executor task so `RejectedExecutionException` returns 503.
28
+
-**LogManager shutdown lifecycle** — `shutdownNow()` + `awaitTermination()` prevents resource leaks. Disk cache shutdown waits for sync executor.
29
+
-**Cross-correlation center lag guard** — Returns `FAILED` when center lag exceeds array bounds, preventing `ArrayIndexOutOfBoundsException`.
30
+
-**`DataQuality` gap detection** — Changed from count-based to duration-based gap ratio for confidence level calculation.
31
+
-**DS timeline linear scan** — Replaced with binary search (`findFirstIndexAtOrAfter`) for teleop deferred emit.
32
+
-**Vision quality fallback** — Falls back to pose entry quality when no target entries found.
33
+
-**Overshoot detection absolute minimum** — Added `Math.01` minimum threshold to prevent false positives near zero setpoints.
34
+
-**Median calculation for even-length arrays** — Now averages two middle elements.
35
+
-**Battery voltage off-by-one** — Changed `voltageValues.size() - 10` to `voltageValues.size() - 1`.
36
+
-**`TbaClient.apiKey` not volatile** — Added `volatile` for safe publication to HTTP handler threads.
37
+
-**`health_check` misleading field name** — Renamed `cache_memory_mb` to `jvm_heap_used_mb` to accurately reflect that it measures total JVM heap, not cache-specific memory.
38
+
-**Main.java help text** — Changed stale `servers.json` reference to `servers.yaml`.
39
+
-**CHANGELOG gap threshold** — Corrected "3x-median" to "5x-median" to match code.
40
+
-**Launcher scripts hardcoded WPILib year** — Now dynamically scan for latest installed year.
41
+
-**Unix launcher missing JAVA_HOME fallback** — Added between WPILib scan and bare `java`.
42
+
-**CI extension compile restricted to Ubuntu** — Removed `if: matrix.os == 'ubuntu-latest'` from Node.js/extension steps.
43
+
-**`ExportTools` missing parameter validation** — `export_csv` now uses `getRequiredString()` for the `name` parameter.
44
+
-**Correlation guidance language** — Softened wording for moderate correlations.
45
+
-**CHANGELOG `WPILOG_BIND`** — Corrected to `WPILOG_HTTP_BIND`.
46
+
47
+
### Changed
48
+
-**Documentation restructured** — README slimmed to focus on installation and features. Detailed docs split into `vscode-extension/README.md` (extension settings, upgrading, uninstalling), `doc/STANDALONE.md` (standalone install, configuration, Docker), and `doc/DEVELOPMENT.md` (building, project structure, contributing).
49
+
-**Installation section leads README** — VS Code extension and standalone install presented as two equal paths with links to dedicated docs. Notes that both can coexist independently.
50
+
-**AI model capability caveats** — Added notes across documentation that analysis quality depends on the AI model used.
51
+
-**Default team number** — Changed from 0 to 2363 in generated config templates, extension defaults, and stress test fallbacks.
52
+
-**TOOLS.md confidence levels** — Fixed "moderate" to "medium", added missing "insufficient" level, corrected `servers.json` to `servers.yaml`.
53
+
-**`analyze_can_bus` categorization** — Moved from Robot Analysis to FRC Domain in README tool table to match code module.
54
+
-**Stress test output** — SLF4J logging reduced from `debug` to `warn`, JUnit output uses compact `tree` mode, stdout/stderr forwarded to console.
55
+
56
+
## [0.8.1] - 2026-03-24
57
+
58
+
### Added
59
+
-**Configurable HTTP bind address** — New `bind` config field / `-bind` CLI flag / `WPILOG_HTTP_BIND` env var controls which network interface the HTTP transport listens on.
60
+
-**Configurable endpoint path** — New `endpoint` config field allows customizing the HTTP endpoint path.
61
+
-**Origin allowlist** — New `origins` config field restricts CORS access to a configurable list of allowed origins.
62
+
8
63
## [0.8.0] - 2026-03-24
9
64
10
65
### Added
@@ -208,7 +263,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
208
263
209
264
#### LLM Epistemological Guardrails
210
265
-**Trojan Horse tool descriptions (§6.1)** — All 20 analytical tools now embed interpretation guidance in their MCP `description()` strings. Five guidance constants in `ToolUtils` (`GUIDANCE_UNIVERSAL`, `GUIDANCE_STATISTICAL`, `GUIDANCE_POWER`, `GUIDANCE_MECHANISM`, `GUIDANCE_MATCH_ANALYSIS`) provide consistent, category-appropriate caveats about single-match limitations, sample size uncertainty, correlation-vs-causation, and alternative explanations. Informational tools (`list_entries`, `read_entry`, etc.) are unchanged.
211
-
-**Data quality metadata (§6.5)** — New `DataQuality` record computes quality metrics from any `List<TimestampedValue>`: sample count, time span, gap count/max (adaptive 3x-median threshold), NaN/Infinity count, effective sample rate, timing jitter, and a composite quality score (0.0–1.0). `ResponseBuilder.addDataQuality()` serializes these into a `data_quality` JSON object and auto-warns when score < 0.5. Integrated into `get_statistics` as reference implementation.
266
+
-**Data quality metadata (§6.5)** — New `DataQuality` record computes quality metrics from any `List<TimestampedValue>`: sample count, time span, gap count/max (adaptive 5x-median threshold), NaN/Infinity count, effective sample rate, timing jitter, and a composite quality score (0.0–1.0). `ResponseBuilder.addDataQuality()` serializes these into a `data_quality` JSON object and auto-warns when score < 0.5. Integrated into `get_statistics` as reference implementation.
212
267
-**Output contextual framing (§6.2)** — New `AnalysisDirectives` class generates `server_analysis_directives` in tool responses. `fromQuality(DataQuality)` factory auto-generates guidance from detected issues (low sample count, gaps, NaN, short time span). Builder methods `addGuidance()`, `addFollowup()`, and `addSingleMatchCaveat()` allow tool-specific enrichment. `ResponseBuilder.addDirectives()` serializes into `confidence_level`, `sample_context`, `interpretation_guidance[]`, and `suggested_followup[]` fields.
0 commit comments