Skip to content

v0.11.0 - Model Context Protocol and Interchange Release

Latest

Choose a tag to compare

@HuiJun HuiJun released this 24 Oct 06:59
· 930 commits to develop since this release
ddf4df0

OpenSysML 0.11.0

0.11.0 is a minor release of OpenSysML MDK — the Runtime Environment and Development Kit for SysML v2 and KerML 1.1, the second generation of OpenMBEE's Model Development Kit — cut from develop at 9b18517 onto main. It carries everything that landed on develop after 0.10.0: 299 changelog fragments folded into 77 additions, 75 changes and 184 fixes. Three threads run through it: coding agents get OpenSysML as tools (sysml-mcp, a Model Context Protocol server, published to npm and the MCP Registry); models travel as the OMG specifies (project interchange archives, the standard library and metaclass vocabulary as RDF and API JSON, the SysML v1 migrator writing the v1-to-v2 mapping's shapes); and name resolution follows KerML 7.2.5.4 on hidden imports and no longer slows with the number of lookups. Full detail per change is in CHANGELOG.md § 0.11.0. The patch release 0.10.1 carried the compatible fixes of this period; what changes the meaning of a 0.10 model, command, golden or migration output is listed under Upgrading.

The wire is unchanged: buf breaking of the tag's api/proto against the 0.10.1 schema reports nothing (the service gained fields and the sysml-mcp tools, nothing was removed or retyped), and every client at 0.11.0 pins this release's service digests. TypeFeaturing::owningFeatureOfType is now answered in the API JSON and -self-check-package surfaces; it was mapped in an unreachable case and never resolved.

Upgrading

The two sysml builds are named after the two halves of the kit. The default build is the DK build; the build without the optional and developer-only groups, formerly "production", is the RE build: -tags sysml_prod → -tags sysml_re, make build-prod/build-wasm-prod → make build-re/build-wasm-re, writing bin/re/sysml and bin/wasm/{js,wasip1}/re/sysml.wasm. The binary is sysml in both; what each links is unchanged. The project, README and site say OpenSysML MDK where they said REDK; nothing you install or call changes (module path, opensysml package and registry names, binaries, assets, OPENSYSML_*); the Cameo plugin is OpenSysML MDK for Cameo.

A hidden import is not inherited. An imported membership that KerML 7.2.5.4 hides — colliding with another import's name or with an owned name — is no membership of the importing namespace: a type specializing it no longer inherits the hidden member, a qualified name does not reach it, and a name reached through two imports is unresolved, with a hint naming the imports that hide it. The performance record notes the Annex A SimpleVehicleModel now reports 20 such references that 0.10.1 resolved by taking the first match.

Renderings draw the notation's required elements by default. A view drew every element it could; it now draws what the SysML v2 notation requires plus port symbols, compartments and the «keyword» line, and names the optional ones to ask for (parameter-symbols, edge-labels, multiplicities, typings, qualifiers, all) on -render-show, %render show=, a document diagram's show, the LSP's and gRPC's show, or as show… attributes of a rendering. An abstract element is drawn «abstract part def»; a connection def typed by drawn definitions is a line, not a box.

SysML v1 migration writes the OMG mapping's shapes. An anonymous association is a connection def named after its end types (marked MigrationMetadata::SynthesizedName) with one usage typed by it; a connector that only carried item flows is written as its flows; a block operation is the block's composite action <op> { … } usage that every call chains to; a root uml:Model is package <ModelName> { … }; stereotypes without a v2 form are @MigrationMetadata::AppliedStereotype markers (comments under -strict); a use case's actor association is an actor parameter; instance specifications are package-level usages and links connections; Cameo requirement tables and matrices are reconstructed from their scope. Diffs against 0.10 migration output are expected on each.

Values and runs. A calculation's result and a performed action's parameter hold the shape their effective multiplicity gives them on every surface: return : Real answers [0.75] where it answered 0.75 (it redefines Performances::Evaluation::result [0..*]); an explicit [1] is a scalar. istype, @, hastype and as judge an object by every type it inherits through the feature holding it. An exploration that met an unenumerated choice point is incomplete after N runs (ExplorationStatus.unenumerated). A verification case a part def owns runs once per object (VerificationVerdict.instance_id) and is inconclusive with none. Positional arguments skip actor parameters.

Diagnostics that are new or moved. analysis case def/verification case def and analysis case <name> are nonstandard-notation (errors under -strict); every end of a connection, interface, allocation or flow definition must be a usage (SysML v2.1 Beta 2); -strict makes indistinguishable memberships errors (sysml -validate -strict exits non-zero on part def A; part def A;); a concern def, requirement or case whose first member is a stakeholder/actor with no subject is Subject must be first parameter.; a constructor argument that binds a = value is reported as overriding it; redefinition-not-end follows KerML 1.1 Beta 2's end-conformance rule. Every diagnostic now carries a stable kebab-case code (internal/check/codes), and docs/project/spec-compliance.md claims Faithful only for SysML/KerML semantics, rows against extension libraries carrying their own status.

API JSON and Turtle. Every non-derived boolean of an element's metaclass is written explicitly (false fields appear), isComposite is stated on every feature, an absent single-valued property is null and an absent multi-valued one [], an unresolved reference is omitted (kept in a sysx:mappingValues sidecar), and the Membership a FeatureReferenceExpression, chain, invocation or MetadataAccessExpression owns is an ownedMembership. sysml-mcp -http on a non-loopback address is refused (exit 2) without -token-file, -token or OPENSYSML_MCP_TOKEN, and every tool stays inside -root.

Model Context Protocol

sysml-mcp serves the language server's workspace, the one-shot runtime service (parse, symbol, evaluate, …, one tool per RPC) and persistent REPL sessions (session_load, session_submit, session_run, …) to OpenCode, Claude Code, Cursor, Codex, VS Code, Gemini and Devin over stdio or Streamable HTTP (-http ADDR, bearer-token authorization). npx -y @openmbee/sysml-mcp runs it with nothing preinstalled; sysml-mcp -print-config <host> [-print-config-npx] writes the host's configuration block; one catalog names every tool, its group and the RPC behind it; the conformance runner and llm-bench drive the suite through it.

Execution, verification and analysis

Use cases execute; every Kernel Semantic Library member of an object reads; the n performances of a [n] usage in a loop or if body are sibling tokens explore enumerates and check proves, and an accept there parks the body instead of deadlocking; the order-dependence marker follows the data, so a value computed from an order-dependent one prints with the same marker; a metadata annotation inside a body annotates it and is no step; nested action usages typed by state-space dynamics or tool-performed actions run as the standalone usage does. sysml -validate -format sarif|junit|json with -baseline writes the run for code scanning and CI, and the composite action Open-MBEE/OpenSysML@v0.11.0 runs it in a workflow.

Notation, rendering and diagrams

Element filters and classifications test the Type a name resolves to through its specialization closure, not spellings; then <target>; outside a body, a frame, filter or accept out of place are reported; -render-lines splines|ortho|polyline routes DOT and PlantUML edges; the VS Code diagram panel gains zoom, pan, Fit/1:1 and an opensysml.diagram.routing setting that sends unrouted edges through its libavoid router; sysml-wasm and @openmbee/opensysml-wasm serve RenderView.

Interchange and SysML v1 migration

Project interchange archives (.kpar) are read wherever a project directory is, and installed dependency projects named by a .project.json are found under .sysand/lib and the library roots; sysml -stdlib -convert ttl|api-json converts the bundled standard library under its normative ids and sysml -metaclass-graph writes the metaclass hierarchy as an RDF vocabulary; pilot-apijson-diff scores every derive* constraint against the pinned pilot with no derivation disagreeing; TestFlexoInterop measures what the RDF export survives in a real Flexo MMS stack. The migrator reconstructs Cameo requirement tables and refine matrices from their owning scope (Cameo stores no content for them); the SysON plugin gains document generation.

Clients, editors and packaging scripts

The Go, Rust, Python, Java, Julia and MATLAB clients take the new run options (advance, seed, draws, clock_step, tool_dry_run, probe, lint selection, depth, show) and read VerificationVerdict.instance_id, RenderedDocument.file_name and the unenumerated fields; the Java client generates its protobuf classes at build time; python -m opensysml.generate takes a multi-file model and --package. install.sh/install.ps1, Homebrew, Scoop and the MSI install sysml-mcp from its own archive; install.sh --version nightly no longer refuses its own download. A new guide chapter, Modeling product lines and variability, walks the OMG vehicle family from superset model to %configure.

Performance

docs/project/performance-release-0.11.0-vs-0.10.1.md measures the release against v0.10.1 under benchstat (six rounds, quiet re-runs, every allocation movement bisected to its merge, and the final cut 9b18517 re-probed row by row). Parsing, lexing, indexing, formatting, the library index, graph lowering and the whole binary are at parity (0.10–0.30 s on 3 254–12 086 declarations and the 28-file Apollo 11 model, resident set 3–8 MiB higher, sysml 47.60 → 51.04 MiB). The executor is back at 0.10.1 to the allocation after the fixes the measurement motivated (IntegerArithmeticLoop 9 072, NewRootFrame 36; AssignmentLoopStep 7 328 → 8 531 is what remains of a cut-point regression its fix recovered most of), and Instantiate/FeaturesOf end below 0.10.1 (2.51M → 2.22M, 4.13M → 2.26M allocs/op) with BatchSatisfy at parity. Carried as the cost of correctness changes, named per row: ConvertAPIJSON 25.26M → 32.65M allocs/op (+29%) and 6.5 → 11.2 s at 32 satellites — isComposite, the derived properties the API JSON now carries (#1232, the one time movement in the final cut), and every boolean written explicitly (#1420, +2.5% allocations); ImportValues +12–18%; Analyze/synthetic +9%; the stress Satisfy/32/FleetSatisfy/32 +20–24%; and the language server's ReferencesCold 44.6k → 124.7k allocs/op, the one design cost (every wildcard import enumerated once per cold query), while RenameWarm allocates less than 0.10.1 (13.5k → 4.9k). The migrator's DocGen.mdzip command line is 0.94 → 1.56 s with 26% more of the archive migrated. Beyond the record: a chain of 200 re-exporting documents analyses in 15–20 s where it took about 270 s.

Packaging

Linux amd64/arm64, macOS amd64/arm64 and Windows amd64 archives of sysml, sysml-lsp, sysml-grpc, sysml-jupyter-kernel and — new — sysml-mcp, sysml-grpc binaries with .sha256 sidecars, SHA256SUMS.txt with its cosign bundle and SLSA provenance, the Python wheel and sdist, the Jupyter kernel wheels, the combined WebAssembly module, and the npm, crates.io and Maven packages are built by the release workflow from tag v0.11.0; the wheel, sdist, crate, npm tarballs and jar pin this release's service digests. Published: opensysml 0.11.0 and jupyter-opensysml-kernel 0.11.0 on PyPI; @openmbee/opensysml 0.11.0 and @openmbee/opensysml-wasm 0.11.0 on npm; opensysml 0.11.0 on crates.io; org.openmbee:opensysml 0.11.0 on Maven Central (the publish plugin is pinned to 0.12.0, which accepts the Central Portal's warnings field that made the 0.10.1 job report a failure after Central had published; the 0.11.0 job uploaded the deployment and then hit CircleCI's 10-minute no-output limit while the plugin waited silently for Central, which published it at 07:22 UTC inside that wait). First-time channels: @openmbee/sysml-mcp on npm with its five platform packages (@openmbee/sysml-mcp-{darwin-arm64,darwin-x64,linux-arm64,linux-x64,win32-x64}), so npx @openmbee/sysml-mcp runs the server without an install; the openmbee/opensysml container image on Docker Hub (0.11.0 and latest, linux/amd64 and linux/arm64, sysml-grpc as entrypoint on port 50051 with /health on 8081, sysml and sysml-lsp beside it); and the MCP Registry listing org.opensysml/sysml-mcp, published by the MCP Registry workflow once the npm version is live. curl -fsSL https://opensysml.org/install.sh | sh and irm https://opensysml.org/install.ps1 | iex install the matching release on any supported platform (--tools / -Tools take sysml-mcp).

macOS binaries are not Developer ID signed or notarized; macos-distribution.md gives the workarounds. Windows binaries and the MSI are unsigned — the Release Windows (SignPath) workflow built them, but SignPath signing is not configured for this repository (no SIGNPATH_API_TOKEN secret or organization/project/policy variables), so its signing steps were skipped; SmartScreen warns on first launch.

Verification

The pre-tag gate of docs/project/releasing.md on the release head (Go 1.25, Linux amd64, npm 11.17): gofmt -l . empty, go build ./..., go vet ./..., make lint (staticcheck + gosec) clean, the full -race suite with the OMG training corpus, the three pilot corpora, the specification examples, the pilot library XMI and the PSSM suite required (120 packages ok), the tools module, TestStdlibConformance, the hygiene suite (client manifests, lockfiles and the MCP runner manifest agree on 0.11.0; the shared digest table pins every recorded release), buf breaking against the 0.10.1 schema with no finding, changelog.py check, the documentation id and link checks, mkdocs build --strict, and the WebAssembly gate within its size budgets. The CircleCI release rehearsal (pipeline 4750 on 6762f75, the release head before the docs-only performance-record merge) passed 22 of 22 jobs end to end — the Go suites, the four client suites, binaries, Python and Jupyter distributions, release artifacts, the GitHub release, Docker Hub, digest pin, PyPI ×2 / npm / crates.io / Maven publish rehearsals and the zero-config smoke, every publish step confirming it was skipped under the stand-in tag. The release pull request ran the full-tier pull-request CI against main on its final head: 27 checks passed, 2 skipped (the PDF toolchain). Tag pipeline 4757 on ddf4df0 passed every job except Publish opensysml to Maven Central, which timed out after Central had accepted the deployment (see Packaging). SonarCloud: main passes the quality gate (new-code coverage 79.1%, overall 86.3%, no bug, vulnerability or unreviewed hotspot) and so does develop (81.2% / 86.9%); the three githubactions:S8543 findings on the npm install steps of the client/node workflows are resolved as false positives — npm ci cannot install a lockfile that names platform packages a tag has not published yet, and npm install followed by git diff --exit-code package-lock.json is the check that detects their publication. Every change in the range merged through the pull-request CI.