Releases: wasomma/fpv-sim-mcp
Release list
0.3.0 — Tactical mode port (engine, mode input on the tools, tactical goldens)
The tactical-mode port: the engine now covers both of upstream's engagement
plans. Orbit-mode behavior is unchanged — the orbit fixtures regenerate
byte-identically (their _meta.source_commit pin advances to upstream
843a2c5, the commit that introduced tactical mode without touching orbit
behavior).
Added
- Tactical mode in the engine (
src/engine/tactical.tsplus a
mode: "orbit" | "tactical"argument onSimulation/runEngagement,
mirroring the browser'sresetSim(seed, mode)): the multi-FPV sortie
stream — per-seed launch plans and aim points, per-airframe EMCON keying,
the pilot-station launch scheduler with commit holds, the strike/hunter
FSM sharing the orbit attack run, and the sim's own STALEMATE end state
(outcome reasonpackages_expended). Both modes share every RNG draw
through emplacement; tactical results add the objective, per-airframe
package state, sortie tallies and the killer id. modeinput on the tools:run_engagement,sweep_seedsand
compare_configsacceptmode("orbit" default);TACTICAL.*overrides
(package size, pilot stations, reserve-or-retask, launch spacing,
objective geometry — including the booleanRESERVE_HUNTER) join the
validated parameter table andget_config_schema;describe_modelgains
atactical_modesection; sweeps over tactical results add per-side
strikes_delivereddistributions.- Second golden-fixture set (
test/fixtures/golden-seeds-tactical.json,
the six featured tactical seeds) with matching golden-master tests, and
tactical coverage in the fixture generator. Parity for the port was
additionally cross-checked against the vm-run original browser sim over
seeds 1–500: outcomes, event logs, fix floats and per-airframe positions
all match exactly, reproducing the documented 27% / 15% / 58% split.
Changed
- CI: the
upstream-driftgate now regenerates and compares BOTH fixture
sets, so a tactical-behavior change upstream (or an engine regression in
either mode) is caught the same way orbit drift always was.
Docs
- README, DESIGN_NOTES.md and the pinned
docs/upstream/DESIGN_NOTES.md
copy re-synced for the two-mode era (SNAPSHOT.mdpin:843a2c5).
0.2.3 — Per-PR parity gate (upstream-drift on every PR, required on main)
No engine or tool behavior changes; golden fixtures unchanged. CI and
docs only: the upstream-drift parity check now runs on every pull request
and is a required status check on main (paired with fpv-sim's new
parity workflow, so the two repos cannot diverge at merge time), and
describe_model / the pinned DESIGN_NOTES copy are corrected against the
code.
Docs
describe_modeltext (src/server/model.ts) corrected to match the
code, in step with upstream fpv-sim's DESIGN_NOTES.md fix (fpv-sim
PR #20):pathAttensamples 13 interior points and tops out near 3.9
(the cap of 6 is never reached); WLS weights floor range at 300 m; the
geometry-penalty cut angle is between the two strongest sensors'
bearings to the current estimate, not their mean LOBs; the terminal
search is an outward spiral, not an "expanding search" of unspecified
shape; and the determinism entry names every main-stream consumer
(including the display-only enemy-drone track noise) and the derived
terrain streams. Two engine comments (fix.ts,drone.ts) that had
inherited the upstream "mean bearings" / "expanding-square" wording are
corrected — comments only, no code change; goldens unchanged.docs/upstream/DESIGN_NOTES.mdre-synced to upstream74b161a
(SNAPSHOT.mdupdated; that pin is the design-notes copy, distinct
from the fixtures'_meta.source_commit).
Changed
- CI:
upstream-driftworkflow bumpedactions/checkoutand
actions/setup-nodefrom v4 to v5 (Node 24 action runtime), clearing
GitHub's Node 20 deprecation warning. The workflow still tests on
Node 20, the package's stated minimum; setup-node v5's automatic
package-manager caching does not engage becausepackage.jsonhas no
packageManagerfield. - CI:
upstream-driftnow also runs on every pull request and on push
tomain, so a PR whose engine no longer reproduces the committed
fixtures, or whose fixtures no longer match live upstream fpv-sim
main, shows a red check before it merges instead of failing the
weekly run afterwards. The weekly schedule and manual dispatch remain
for catching upstream movement while this repo is quiet. Paired with
fpv-sim's newparityworkflow (which regenerates these fixtures from
a PR'sindex.htmlon that side), divergence between the two repos
surfaces at merge time on whichever side changes. - CI: the
driftjob is now a required status check onmain
(repository ruleset "main: require upstream-drift", no bypass actors),
so a redupstream-driftrun blocks the merge outright rather than
merely flagging it. Repo setting, recorded here so it isn't invisible:
renaming the job requires updating the ruleset's required context.
0.2.2 — Dependency hygiene (npm audit fix)
No engine or tool behavior changes; golden fixtures unchanged. Dependency
hygiene only.
Security
npm audit fix(no--force): four transitive dependencies of
@modelcontextprotocol/sdkbumped within their existing semver ranges
to clear all reported advisories —hono4.12.31 → 4.13.2 (ReDoS in
CORS middleware, SSRmemo()cross-request retention, proxy-helper
Connectionheader handling, language-middleware complexity),
@hono/node-server1.19.14 → 1.19.17 (serve-staticpath traversal
on Windows),fast-uri3.1.4 → 3.1.5 (host confusion via backslash
authority),ip-address10.2.0 → 10.5.0 (leading-zero / CIDR /
IPv4-mapped misclassification enabling SSRF bypasses). None of these
code paths are exercised by this server (it usesnode:httpdirectly
and the SDK's Streamable HTTP transport, no CORS/static/proxy
middleware), so this is hygiene, not a fix for an exposure. SDK stays
at 1.29.0; no dependency ranges changed.npm auditis clean
afterwards.
0.2.1 — Version reporting fix + PolyForm relicense
No engine or tool behavior changes; golden fixtures unchanged.
Changed
- Relicensed from MIT to PolyForm Strict License 1.0.0
(LICENSE.md): the repository stays public to read and
use noncommercially, but is no longer open source — no modification,
redistribution, or commercial use. Copies obtained under MIT before
this change retain their MIT rights.
Fixed
- The version the server reports (MCP
initializehandshake,/healthz,
startup banner) is now read frompackage.jsoninstead of a hardcoded
constant insrc/server/build.ts, which had silently stayed at0.1.0
through the 0.2.0 release — so the hosted demo's/healthzcould not
confirm a redeploy.package-lock.jsonhad likewise never been bumped
past 0.1.0;npm versionnow keeps it in step. A new test
(test/version.test.ts) asserts the reported version equals
package.json's.
Docs
deploy/DEPLOY.md"Updating" now ends with a/healthzversion check —
the redeploy confirmation the fix above makes meaningful.- Release tags
v0.1.0andv0.2.0now exist (published 2026-08-16),
so the compare links below use tag form. The[0.2.0]range
previously ended one merge early (at PR #3 rather than the PR #4 merge
that carried the version bump); corrected.
0.2.0 — Drift detection + Node 20 fix
Added
- Upstream drift detection (
.github/workflows/upstream-drift.yml):
weekly CI that regenerates the golden fixtures from live fpv-simmain
and fails if engagement outcomes differ from the committed ones —
distinguishing engine regressions (npm test) from upstream
behavior changes (fixture comparison). Also warns when the pinned
design-notes snapshot falls behind upstream.
Fixed
npm testnow works on Node 20, the stated minimum: the test glob is
shell-expanded instead of relying onnode --testpattern expansion,
which only Node 21+ performs. Caught by the drift workflow's first CI
run.
Docs
- README example transcript: added a postscript correcting the agent's
closing guess that the 6-second launch stagger explained the residual
BLUFOR edge — a 2,000-pair study on this engine
(fpv-sim's MONTE_CARLO.md,
experiment E2c) found the stagger moves outcome rates by less than half
a point.
0.1.0 — Initial release
Added
- Initial release: headless TypeScript engine extracted from fpv-sim's
index.htmlwith float-exact behavior parity, proven by golden-master
fixtures generated from the original browser source running in a Node
vm(plus a real-browser cross-check). - MCP server with five read-only, deterministic tools (
run_engagement,
sweep_seeds,compare_configs,describe_model,get_config_schema)
and two documentation resources, with zod validation generated from the
same parameter table as the schema tool. - Stdio and Streamable HTTP transports, an MCP client demo
(npm run demo), a VPS deployment runbook (deploy/), and the
golden-fixture generator (scripts/generate-goldens.mjs). - Headless-only additions to the sim's semantics: guaranteed termination
(winner, both-drones-down, or 3600 s cap — the latter two reported as
first-classSTALEMATEoutcomes) and flag timestamps for aggregation.