Repository navigation
Nightly snapshot 2026-10-31 (nightly-20261031-d16ca71e0)
Pre-releaseDevelopment snapshot of develop, not a release. Built 2026-10-31 from d16ca71, 1617 commits after v0.11.0 (compare), by this workflow run. Every binary reports nightly-20261031-d16ca71e0.
The snapshot is published twice: as nightly-20261031-d16ca71e0, which is kept for 14 days, and as the moving alias nightly, which the next night's snapshot replaces. It is never the latest release; Homebrew and the Windows installer follow the stable line only. The sysml-wasm.wasm module, the browser REPL sysml-prod.wasm.gz and the matching wasm_exec.js are available in its assets. The snapshot page explains what it is, how to verify it and what to expect from it; the install guide covers the stable releases.
The Python and Node clients built from the same commit are published as development versions that no default install picks up: pip install opensysml==0.11.1.dev20261031 and npm install @openmbee/opensysml@0.11.1-nightly.20261031.gd16ca71e0 (the nightly dist-tag). Each starts this snapshot's sysml-grpc: the wheel pins the digests of the nightly-20261031-d16ca71e0 assets, and the npm platform packages carry the binaries.
The Jupyter kernel built from it is pip install jupyter-opensysml-kernel==0.11.1.dev20261031, whose platform wheels bundle this snapshot's sysml-jupyter-kernel and whose sdist downloads it by the same pinned digests.
opensysml-sysml.vsix is the VS Code extension built from the same commit: code --install-extension opensysml-sysml.vsix, with a snapshot's sysml-lsp on your PATH or named by opensysml.server.path.
Verify a download against the signed manifest:
sha256sum -c --ignore-missing SHA256SUMS.txt
cosign verify-blob SHA256SUMS.txt --bundle SHA256SUMS.txt.bundle \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity https://github.com/Open-MBEE/OpenSysML/.github/workflows/nightly.yml@refs/heads/developUnreleased changes in this snapshot
One line per entry; the full text is under changes/unreleased/ and CHANGELOG.md at this commit.
Added
- The Apache Airflow provider is documented alongside the other surfaces: a README feature entry and status row, a reference page (
docs/reference/airflow-provider.md) mapping its assets, operators, sensors, requirement gates andSysMLActionDagto the service calls behind them, and entries in the downloads page and the client-choice list. - Add an optional, checksum-verified APE reference model migration regression covering generated syntax, nested requirement references, report identities, and attached images.
- API JSON export can provide a separate standard-library name table without adding library elements as roots, with an opt-in legacy ownerless-stub mode for existing consumers.
- Document prose can be written as AsciiDoc: a KerML textual representation
rep language "asciidoc" /* … */inside aDocumentorSectionexpands in place into content blocks, and one inside apart : Paragraphyields that paragraph, alongside the Markdown form. -doc-form asciidocrenders a document as AsciiDoc from the compiled document tree —=/==headings by level, block anchors and<<anchor,text>>cross references,link:macros,_emphasis_,*strong*,`code`andstem:[…]runs under a:stem: latexmathheader,|===tables with[cols]percentages fromcolumnWidthsand spanning group rows,*/.lists,term::definitions,[stem]formula blocks,image::macros and diagram sources in[source,<form>]listings, every model string escaped so it cannot open AsciiDoc structure — and-render-documents -doc-form asciidocwrites a set of.adocfiles whose cross-document references arexref:macros.- Java client:
ConversionOptions.withIncludeLibraryStubsrestores the pre-0.11.0 library stubs in api-json (gated on theconvert_library_stubscapability) and aConversioncarries itslibraryReferences;Model.renderViewtakescompartmentsandModel.importDatatakesimportAs(Model.IMPORT_AS_VALUES), the request options the other clients already expose. - Julia client:
convert_*takeid_form(ID_FORM_QUALIFIEDorID_FORM_UUID) andinclude_library_stubs(gated on theconvert_library_stubscapability) and aConversioncarries itslibrary_references;render_viewtakescompartments, eachRenderNodenaming itscompartment;import_datatakesimport_as; and anUNAUTHENTICATEDstatus arrives asAuthenticationError. - MATLAB client:
converttakesidForm('qualified'or'uuid') andincludeLibraryStubs(gated on theconvert_library_stubscapability) and aConversioncarries itslibraryReferences;renderViewtakescompartments, each node naming itscompartment;importDatatakesimportAs; and anUNAUTHENTICATEDstatus raisesopensysml:connect:unauthenticated. - Node client:
converttakesidForm("qualified"or"uuid", the spelling of derived ids in a graph), an OSLCqueryis preflighted on the service'soslc_querycapability (exported asCAPABILITY_OSLC_QUERY), and anUNAUTHENTICATEDstatus arrives as the newAuthenticationError. - Documentation: a client feature-parity page (
docs/reference/client-parity.md) comparing the Python, Node, Java, Rust, Julia and MATLAB clients option by option, each cell linked to its proving test, with the open gaps and their estimates. - Python client:
converttakesid_form(ID_FORM_QUALIFIEDorID_FORM_UUID) andinclude_library_stubs, andquerytakesoslc— OSLC Query 3.0 text evaluated in place of the standard's Query — on bothConnectionandModel, each gated on the service'sconvert_library_stubsandoslc_querycapabilities; aConversioncarries thelibrary_references(LibraryReference) an api-json conversion names beside its elements. - Rust client:
ConvertOptions.include_library_stubsrestores the pre-0.11.0 library stubs in API JSON (gated on theconvert_library_stubscapability), aConversioncarries itslibrary_references(LibraryReference), andDataImportOptions.import_asnames what each imported row is made into. - Execution-conformance instance fixtures can pin, beside each validation verdict, the verification cases run about the requirement it asserts — the
verificationslist of avalidation.verdictsentry names each case, the object it ran on, its verdict kind and the objective verdicts of the same run — so one fixture holds a satisfaction verdict and the verification verdict-validateprints with it. - CI audits every dependency tree for known vulnerabilities and fails on a finding.
DocumentQueries::Differ(left, right, key, column): a keyed value comparison of two projected tables — one row (key,left,right) per key value on both sides whosecolumncells differ.- Markdown and AsciiDoc document bodies read model values into the prose:
[label](sysml:value:<target>)andsysml:value[<target>, label]plan a value run that resolves the feature as asysml:reference does and renders it as the same feature renders in aSpanColumncell — quantities with their unit, strings, booleans, enumeration literals, multi-valued features joined — reading the session's object when it holds the chain's root. - Whole-document markup bodies: a Markdown or AsciiDoc
repin aDocumentorSectionmay now carry headings (#…######,==…), which openSections nested by level in place among the sibling parts, so one body can write a whole document outline. - The
drawiorendering form routes every edge the model leaves unrouted before it writes the file, with the libavoid orthogonal router the VS Code diagram panel draws with, run in-process from its WebAssembly build and checked point for point against the panel: each edge's ends are written as its anchors on the two cells and its bends as waypoints, around the boxes and to the ports of the view, inside the container the edge belongs to, and a statedRouteis kept as written. - A
drawiorendering form writes a view as an uncompressed diagrams.net (draw.io) file that draw.io desktop, diagrams.net and the VS Code draw.io extension open and edit: tree, interconnection, state, action, case, mixed, requirement, definition and package renderings, with the §8.2.3 notation's node and edge glyphs, nested parts and regions as container children, ports on the border, stated positions, routes, colours and fonts, notes and pictures, and every cell tagged with the element's qualified name and declaration for later tooling. sysml -import-diagram, the LSPopensysml/importDiagramrequest, the MCPimport_diagramtool and the VS Code Import Diagram command read three more kinds of edit back from a draw.io file: an element renamed by retyping its cell's text (applied as a rename, so its declaration and every reference move, through the path aLayoutof the cell takes), a note whose text was edited, and a picture whose image source was changed to a file the model can name.- A draw.io file the
drawiorendering form wrote and a user edited in draw.io is imported back asDiagramLayoutmetadata (Layout,Route,Style,Canvas,Note,Picture) through the model editor, bysysml -import-diagram <file> [-view <name>] [-dry-run], the LSP requestopensysml/importDiagram, the MCP toolimport_diagramand the VS Code command Import layout from draw.io…; only cells that differ from a fresh export are written, and cells the model cannot carry are reported. - The editors guide (
docs/guide/08-editors.md) gains a Helix, Neovim and Zed section pointing at the tree-sitter-sysml grammars and query files, with the Helixlanguages.tomldeclaration that pairs them withsysml-lsp. - The in-browser engine (
sysml-engine) honoursadvanceonExecuteStateandExecuteActionassysml-grpcdoes, running a state machine or an action for a simulated duration, through one runtime implementation both share; the homepage hero gains a "Mission phases on the clock" scene that runsMissionSequence::MissionPhaseson the engine for 400,000 s (or 800,000 s) and animates the trace it records, clock instants included. ExecuteActiontakestraceandevents: the run's trace comes back asDocumentEventrecords of each token step, wait, accept, send, decision, assignment and the completion (capabilityaction_trace, in the wasm module too), and the events are posted to the performer in turn as the run waits, as the REPL's%senddoes; every client passes both options.- Go client
client/opensysml:WithIDForm(IDFormQualified,IDFormUUID) andWithLibraryStubsconversion options, with theLibraryReferencesan API JSON conversion names;WithBaseModelonParseDocuments, filling the model'sAffecteddocument names (gated onparse_sources_affected); andImportAs(ImportAsValues) onImportData— the request options the other clients already expose. sysml-grpcflags-host,-token-file,-token,-allow-unauthenticated,-allow-insecure-token-transportand theOPENSYSML_GRPC_TOKENvariable, with the same meanings the first four have onsysml-mcp; the bearer-token and loopback rules the two commands share live in one package,internal/frontend/guard.- The Python (
token=,AuthenticationError), Node and browser (token), Java (ConnectionOptions.token), Rust (Connection::external_with_token), Go (opensysml.WithToken), Julia (external(…; token)) and MATLAB (external(…, 'token', …)) clients send a bearer token on every call, defaulting to$OPENSYSML_GRPC_TOKEN; each is tested against a token-protected service. - Renderings mark a usage inherited by the owner it is drawn or listed under — through typing, subclassification or subsetting — with the graphical notation's
^before its name (SysML v2.1 §8.2.3.6): node heads, compartment rows, pinned ports and folded membership-edge labels in the text, Mermaid, DOT, PlantUML and D2 forms and on the VS Code canvas; a redefinition the owner declares reads bare. - Java client:
ConversionOptionstakeswithCompact,withOmitDerived,withKeepDerivedandwithIncludeCheckDiagnostics(gated on theconvert_compactandconvert_check_diagnosticscapabilities), the check's diagnostics arriving inConversion.diagnostics()with their severities;ParseOptions.withBaseModelHashrelatesparseSourcesto a previous model andModel.affected()names the documents whose results may differ (gated onparse_sources_affected). sysml -run-query … -jsonreports the query's table as data undertable: the projectedcolumnsin order and onerowsentry per row with itselementandcells(per column, the values the cell holds as the prompt prints them — empty for an empty cell, several for a collection; an element without a name is spelled by itselementId), beside the row and column counts invalues.- Julia client: every
convert_*takescompact,omit_derived,keep_derivedandinclude_check_diagnostics(gated on theconvert_compactandconvert_check_diagnosticscapabilities), the check's diagnostics arriving in theConversion'sdiagnosticswith their severities;parse_sourcestakesbase_model_hashandaffected(model)names the documents whose results may differ (gated onparse_sources_affected). - A
library packagetwo documents of the workspace declare — two copies of the standard library under the editor's folder or theOPENSYSML_LIBRARY_PATHtree, a copy of a standard library file beside the bundled one, a user library vendored twice — is reported once per workspace as thelibrary-declared-twicewarning, on the copy references do not resolve to, naming the one they do: on the command line, at the prompt, in the editor's problems list, over gRPC/Connect and through the MCP server. - A loop an action body reaches is a
LoopActionperformance of the run, held under the performing action'sloops(Actions.sysmlloops : LoopAction[0..*] :> subactions), and every iteration performs the loop's body as an occurrence held under the loop'sbody(LoopAction::body,ControlPerformances.kermlLoopPerformance::body), typed by the body action the loop declares (loop action body { … }) with its nested actions as the body's subperformances; both begin and end with the loop and the iteration, sosubperformances,suboccurrences,enclosedPerformances,timeEnclosedOccurrencesandthisread them,loops#(1).bodyis[]before the first iteration and never refused, and a loop nested in a body is held under that iteration's body. - Document prose can be written as Markdown: a `rep language "markdown" /* ...
:>> text = "..."is the spelling the manual and examples now use for a paragraph's text;attribute redefines text = "..."stays equivalent.- MATLAB/Octave client:
opensysml.convert,Model.convertandModel.savetakecompact,omitDerived,keepDerivedandincludeCheckDiagnostics(gated on theconvert_compactandconvert_check_diagnosticscapabilities), the check's diagnostics arriving in theConversion'sdiagnosticswith their severities;parseSourcestakesbaseModelHashandModel.affectednames the documents whose results may differ (gated onparse_sources_affected). - Magic MDK: Export as SysML v2… on the Magic MDK context menu writes the project as SysML v2 text.
elementIdof an owning membership: a query'sowningRelationship,owningMembership,ownedRelationshipandownedMembershipcells spell each membership by the id the conversion writes for it — the member's id with the_omsuffix, or the entry/exit/do member that owns the action it performs — in the REPL, CLI (-jsontables), gRPC and rendered documents; the identity reader mints them as the writer does, including which members get none (imports, entry/exit/do members, filters, a one-endedfirst, a dependency's prefix metadata).- The pilot-rejection corpus and the type-tier tests pin that a
messagetyped by an item definition (message m : Note from a.emit to b.receive;) is rejected withA flow usage must be typed by flow definitions., in every spelling of the declaration, exactly as theflowform is: a message declaration is an abstract flow usage (SysML v2.1 Beta 2 §8.4.12.2), andmessage m of Notenames the payload type rather than a typing. sysml -metamodel-tablewrites the pinned pilot metamodel's table as JSON — every metaclass with its parents and abstractness, every property with its defining class, kind, range, bounds, order, derivation, redefinitions, subsettings and opposite, every enumeration, and the pilot tag, commit and metamodel date — so generators outside this module (the QVTS reflection queries in Open-MBEE/qvts) follow the same table the API-JSON and RDF writers do.- A mixed rendering draws the membership of every member nested in its owner's node as an edge from the owner to the member, with the glyph the graphical notation gives that membership: the feature membership's diamond for a usage — filled for a composite usage, hollow for a referential one, with the usage's multiplicity at its end — the owned membership's circle-plus for a nested package, definition or other member that is no feature, and the keyword glyph of a membership drawn as a relationship of its own (
require,assume,assert,frame,event, a portion), so no kind is drawn twice and none is left without its glyph. - The nightly snapshot builds the Cameo plugin (
Magic_MDK_<core>-<tag>.zip, around the night's ownsysml-grpcbinaries, checked against the night's manifest) and the SysON MDK backend jar and frontend tarball at the night's commit, and keeps them as the run'scameo-pluginandsyson-pluginworkflow artifacts for the snapshot's 14 days;BinaryStager --from <dir>(-Dopensysml.binaries) stages already-verified binaries in place of a release download. - Node client:
connection.converttakescompact,omitDerived,keepDerivedandincludeCheckDiagnostics(gated on theconvert_compactandconvert_check_diagnosticscapabilities), the check's diagnostics arriving inConversion.diagnosticswith their severities;connection.parseSourcestakesbaseModelHashand theModelnames the documents whose results may differ inaffected(gated onparse_sources_affected). - The relationship glyphs of the SysML v2 graphical notation (§8.2.3) whose ends a rendering draws are now edges of their own kind in the DOT, PlantUML, Mermaid, D2 and text forms and the VS Code diagram panel: a
succession flow(dashed, filled head, «succession flow») is told from a flow in action and interconnection renderings; a required, assumed or asserted constraint, a framed concern and an event occurrence are «require», «assume», «assert», «frame» and «event» edges with an open head; a timeslice or snapshot carries the three-quarter circle at its occurrence; a::>reference subsetting its hollow triangle and dots, labelledreferences; a package'saliasof a drawn package the hollow circle of an unowned membership; and a view usage'sexposestatements dashed «expose» edges to the drawn elements, suffixed*/**as imports are. - The MCP server's npm runner is also published as
@openmbee/opensysml-mcp, the name the other OpenSysML npm packages share:npx -y @openmbee/opensysml-mcpstarts the same server asnpx -y @openmbee/sysml-mcp, from the same@openmbee/sysml-mcp-<os>-<cpu>platform packages at the same version, through anopensysml-mcpcommand besidesysml-mcp. docs/project/performance-release-0.12.0-vs-0.11.0.mdrecords the release-gate measurement of 0.12.0 against 0.11.0 in three columns — 0.11.0 as released (go1.25.11), 0.11.0 rebuilt with go1.27.3, and the candidate, first before and then after its performance fixes, with every merge up to the release head accounted for — so that the toolchain change and the source changes are told apart: every benchmark on each,benchstatover six rounds, whole-binary timings on generated and real models, the stress constellation, the export element-ID rows #1699 fixed, and the merge each regression traces to, with the fix pull request each motivated listed as it lands.- A plain
lib/directory beside a project's.project.jsonis now a well-known library directory, read like.sysand/lib: OpenSysML reads what any package manager that follows KerML 10.3 project interchange installs (sysand today) underlib/or.sysand/libbeside.project.json; it does not fetch. - Python client:
Connection.converttakescompact,omit_derived,keep_derivedandinclude_check_diagnostics(gated on theconvert_compactandconvert_check_diagnosticscapabilities), the check's diagnostics arriving in the result'sdiagnosticswith their severities;Connection.parse_sourcestakesbase_model_hashand theModelnames the documents whose results may differ inaffected(gated onparse_sources_affected). - Python client:
Model.convert,Model.to_api_json,Model.saveand the module-levelopensysml.converttake thecompact,omit_derived,keep_derivedandinclude_check_diagnosticsoptionsConnection.converttakes, gated the same way on the service'sconvert_compactandconvert_check_diagnosticscapabilities, so a loaded model writes its compact API JSON without dropping to its connection. ProjectandWhereFeatureread any property the SysML metamodel gives an element's metaclass (isComposite,isPortion,direction,ownedRelationship, …), through the reflective evaluator, beside the model's own features;elementIdis the id a conversion of the model writes, in the REPL and CLI as in the gRPC query service.- A failed document query carries the QVTS outcome record behind its message:
queryexec.Error.Outcome, apathError(Failure{step, expected, frontier}per failing element) or amodelError(Finding{step, element, constraint, observed}), field for field withlean/QVTS/Outcome.lean. - Reflective reads (
Project,WhereFeature,[@…]filters, metaobjects) now answerElement::aliasIds(none: no notation sets it) andElement::isImpliedIncluded(false) on every element,RequirementDefinition/Usage::reqId(its declared short name),Invariant::isNegated(assert not),Type::isSufficienton a connector end, and, on a declared connector as a Relationship,isImplied(false),ownedRelatedElementandowningRelatedElement(none). - The query surfaces (REPL,
sysml -run-query, gRPC, documents) spell the relationships an element owns byelementIdas the RDF conversion writes them, where they had none: the relationship element of each head clause (: T→_ft0, a definition's:> D→_sc0, a usage's →_sp0,subsets→_ss0,redefines→_rd0,referencesand an end-formsubsets→_rs), a bound connector end's reference subsetting (_prs), an import, and the Annotation of a dependency's prefix metadata (_an). scripts/release-downloads.pyprints the download counts of every GitHub release at once — per release with its date and asset count, per asset under each release (--assets), or totalled per asset name across all releases (--by-asset) — with--stableto leave out the nightlies,--jsonfor another tool, and--trafficfor the clones and views of the last fourteen days that GitHub's traffic API reports to a token with push access.- The release SBOMs now cover every asset class: the WebAssembly modules (
sysml-wasm.wasm,sysml-prod.wasm.gz), written byscripts/release-sbom.pyfrom the module information Go embeds in them, whichgo version -mand syft cannot read from this format; the npm tarballsopenmbee-opensysml-<x.y.z>.tgz,openmbee-sysml-mcp-<x.y.z>.tgzandopenmbee-opensysml-mcp-<x.y.z>.tgz, now packed by abuild-npm-packagejob before the manifest so that tarballs and SBOMs are lines ofSHA256SUMS.txtandpublish-npmpublishes bytes the signed manifest lists, each SBOM describing the packed manifest with its dependencies resolved through the lockfile; and the Windows installer, whoseopensysml-<x.y.z>-windows-amd64.msi.spdx.jsonis derived from its inputs — the Go executables and the bundled Z3 release declared frompackaging/msi/z3.pinwith its version and digests — and listed inSHA256SUMS-windows-msi.txt(and, signed, inSHA256SUMS-windows-signed.txt). - Every release now publishes an SPDX 2.3 JSON software bill of materials per asset,
<asset>.spdx.json, for each archive, wheel, sdist,sysml-grpcandsysml-jupyter-kernelbinary. - Stable
v*releases are announced in the maintainers' Slack channel after the GitHub release is published. - The REPL chapter explains what a
= …result line shows —add(2, 2)answers[4]where2 + 2answers4— as the values the result feature holds in its effective multiplicity, with the square brackets as display notation for a sequence rather than KerML syntax and thereturn : Integer[1]spelling that prints one value bare; the Jupyter and command-line chapters point to it. - The temporal members of occurrences answer from what a run produced.
- Rust client:
ConvertOptionstakescompact,omit_derived,keep_derivedandinclude_check_diagnostics(gated on theconvert_compactandconvert_check_diagnosticscapabilities), the check's diagnostics arriving inConversion::diagnosticswith their severities;SourcesOptions::base_model_hashrelatesparse_sourcesto a previous model andModel::affectednames the documents whose results may differ (gated onparse_sources_affected). - Rust client:
Model::convert_withandModel::save_withtake a&ConvertOptions, so a held model is written withid_form,include_library_stubs(gated on theconvert_library_stubscapability) anddocumentsasConnection::convertwrites it;Model::convertandModel::savekeep their signatures and defaults. - The security policy is published where users look.
- A security policy,
SECURITY.md, says how to report a vulnerability privately, who responds, the acknowledgement, triage and fix deadlines (critical within 14 days, high and medium within 60), the coordinated-disclosure terms, how automated and AI-assisted reports are handled, which versions receive fixes, and how to verify a release's signed checksum manifest and provenance. - The self-model gained a second document written in AsciiDoc,
OpenSysMLAsciiDoc::MarkupNote(examples/self-model/asciidoc/markup.sysml): threerep language "asciidoc"bodies withsysml:value[…]runs read from the model,<<xref>>cross-references, a heading-opened section and the markup-parser table as a query. - The
smtengine encodes a feature valued by an expression over other features (attribute y : Integer = x + 1) as the interpreter computes it, at every read over the current values: each state defines the feature by its expression and every read within a move substitutes it, through features so valued in turn, so guards, loop conditions, properties, assumptions and results all see the derived value. - The solver asserts a derived declared value — an expression over other features of the same element,
attribute volume : VolumeValue = height * width * length;— as the defining equation of its variable, where it used to fix the value the evaluator derived or, when a feature it reads held nothing, leave the value free of its operands (so%solve Box::Crate::fitssynthesised avolumewith no relation toheight,widthandlength). - Conformance fixture
state_action_default_performancespins that a state'sentryAction,doActionandexitActioneach hold one performance whether or not the state declares anentry,doorexitaction —States::StateActionredefinesStatePerformance'sentry[1],do[1]andexit[1]steps (KerML 1.0 §9.2.11.1), so an undeclared one is a default performance, not an empty value — beside the library's genuinely optional[0..1]features (incomingTransitionTrigger,accepted, a view'sviewRendering), which hold nothing;docs/project/spec-compliance.mdgains the row. scripts/check-upstream-drift.sh, run weekly by theUpstream driftworkflow, reports when the pilot implementation or the SysML-v2-Release repository publishes a release newer thanscripts/pilot-pin.shpins, when the pinned tag stops resolving to the pinned commit, whether the newest release changed the specification PDFs the compliance map's clause numbers read, and when an OMG specification page lists a SysML or KerML version it has not recorded.WhereTypetakesexact = trueto keep only the elements whose own metaclass is named — neither its subclasses nor the model's own types — as a reflective walk over the metamodel needs (DocumentQueriesfrom the Extensions Library pin that declares it).- The REPL session resolves an import or qualified reference whose first segment nothing declares against a workspace root: the
.sysml/.kermlfile under it declaring that root namespace loads as%loadwould, in the same submission, and%eval/%calcdo the same for the names they are given.
Changed
- The semantics package calls
symbols.AnnotatesOthersdirectly instead of through a private alias of it; no behaviour changes. ast.Inspectreads a struct type's node-bearing fields once per type instead of describing every field of every struct it visits, and no longer descends into fields that can hold no node (keywords, flags, spans).- Calculation definitions and usages are drawn with the action (behaviour) rendering, as action definitions and usages are:
%viz A::addand a view exposing a calc default to it,#action:accepts a calc, and its directed parameters are the node's pins, an unnamedreturnparameter the pin namedresult— where the TREE kind drewin xandreturn : Integeras attributes and the action kind drew nothing. - The Mermaid, D2 and PlantUML action and mixed renderings list an action's or calculation's parameter pins that no edge reaches in a
parameterscompartment of the node (in x,in y,out result, typed when typings are shown), as the tree form lists them, instead of leaving them out and naming them in apin(s) not drawnnotice; the Jupyter kernel's%viz A::addMermaid diagram therefore shows a calculation's parameters. - The runtime resolves the declarations a feature chain's segments name once per model and base feature instead of on every evaluation, and noting them for a chain no longer allocates a restore closure.
- The race-enabled test suite runs as ten CircleCI shards instead of six.
- The CircleCI
build-testworkflow ondevelopandmainfinishes sooner and no longer queues behind the pipelines it supersedes. - The compliance map's validation rows and the constraint manifest are keyed to the constraint names of the pinned KerML 1.1 Beta 2 and SysML v2.1 Beta 2 texts: the manifest's
specificationsblock pins the Beta 2 PDFs the release ships, each row cites the Beta 2 name first and the pilot validator's name second where they differ, a check the Beta 2 text does not state is marked a pilot-only check, and rows forvalidateAttributeDefinitionFeatures,validateAttributeUsageFeaturesandvalidateControlNodeIsCompositerecord them as satisfied by construction from the notation. conditionTextininternal/exec/runtimecarries its own doc comment again, instead of leaving it stranded abovequalifiedNameText.sysml model.sysml -convert sysml(and-convert kerml, and the notation-migrate sysmlwrites) lays the statements of the notation out: a new line after the{of a body and after each;in it, the}on a line of its own, nesting indented — so a model generated on one line comes back one statement per line.- Dependabot no longer proposes
@testing-library/reactupdates for the SysON frontend: 12.1.5 narrowed its peer range to React 17 while the frontend pins React 18, so the grouped npm update failednpm ci; the React-18 major is taken by hand. - Dependabot no longer offers
@types/vscodebumps for the VS Code extension:vsce packagerefuses a typing newer than the extension'sengines.vscodefloor (^1.86.0), so the devDependency stays at the floor and moves with it. - Dependabot opens at most one grouped minor/patch pull request per ecosystem a week and no longer offers major versions; a maintainer takes each major by hand.
scripts/download-doc-pdf-toolchain.shretries each download (pandoc, Graphviz, PlantUML, D2) three times before giving up, as the other download scripts do, so a transient upstream error such as the502GitLab returned for the Graphviz packages no longer fails the PDF toolchain job outright.- The document planner's markup-section outline compares section paths with
slices.Equaland names the open-heading record it keeps while scanning bodies once, with no change in behaviour. - The downloads page lists
sysml-mcp: its per-platform release archive in the individual-tools table, the@openmbee/sysml-mcpnpm package and the MCP Registry entry under package managers, the--toolsoption of the install script, and that the Homebrew formula, the Windows MSI and the nightly carry it too. - Pull requests are opened ready for review, so the full CI tier runs from the first push; the quick tier is an opt-in for work-in-progress, taken by opening the pull request as a draft, which has to be marked ready before it is considered.
- The REPL's
witnessLineandsameNameforwarders toanalysis.WitnessLineandsimresults.SameName, and the metamodel evaluator'scontainsSymbol, which no production code called, are removed; their tests callanalysis.WitnessLine,simresults.SameNameandslices.Containsdirectly. - The RDF writer's bookkeeping of the relationship ids it writes for a declaration (
writtenRelationshipsininternal/translate/export) is split into one helper per source of relationships — anendfeature'sreferences, a dependency's prefix metadata, the head's clauses and a bound end's reference subsetting — with no change to the ids written or to the writer's speed. - The vendored extension libraries are re-pinned to the upstream commit that makes Open-MBEE/OpenSysML-Extensions-Library a KerML 10.3 project interchange;
scripts/sync-extension-libraries.shnow vendors its.project.json,.meta.jsonandLICENSEintointernal/workspace/libs/extensions-project/, and a gate holds every vendored unit to the recorded SHA-256 checksum and indexed root namespace, so the bundled copy is provably the published project. - The conformance record now states why a bare concrete
flow def X;is reported as relating fewer than two elements while a flow definition whose two ends are inherited (flow def F :> Flows::Message;) is clean, and why the end-must-be-a-usage rules for flow and connection definitions examine inherited ends: KerML derives an association's related types from every end feature it owns or inherits, and SysML types each of those ends as a usage. - Bumped
connectrpc.com/connectto 1.21.1 andconnectrpc.com/grpcreflectto 1.3.1 in the root andtools/modules (the Go bumps of Dependabot PR #1639, which conflicts with develop); no API changes for the gRPC/Connect front end. - The language server now speaks through go.lsp.dev 1.0 (
jsonrpc2,protocolanduri1.0.1). sysml-grpcbinds loopback by default:-port 50051alone now serveslocalhost:50051, reachable only from the same machine, and the health server binds the same host.- Every
sysml-grpccall is logged on one line atINFOwith the peer address, method, protocol, status code, duration and whether it was authenticated, on both transports; a refused call is logged atWARNwith the peer. - The
source.StringValueandsource.StringTexthelpers are now called directly where string literals are read or written: the private one-line aliasesunquote(in the solver, the semantics engine and the symbol-facts frontend) andstringLiteral(in the SysML v1 migrator) are gone, andsemantics.SimpleSymbolNameholds the body its unexported twinsimpleSymbolNameforwarded to. - The homepage hero lists the Saturn V mass roll-up as a table instead of drawing every stage and engine as nested boxes: one row per part, indented as the composition nests, with the model's
massandpropellantMassbeside atotalMasscolumn that stays empty until Run has the engine evaluate the roll-up and fill it from the engines up; the instrument-unit variants show the undetermined roll-up, and the engine's reason, in the cells themselves. - The landing page's mass table lights its roll-up levels from one timeline — each level scheduled at its offset from the start, the last held for a step — instead of waiting between levels, and its source editor loads the published model in one asynchronous step; what the page shows is unchanged.
- One helper takes the last segment of a qualified name.
- The Cameo plugin is Magic MDK and the SysON plugin is SysON MDK.
- Magic MDK declares and enforces its compatibility floor.
- The pull-request workflow runs on merge-queue commits.
mermaidArrowtakes only the edge kind, which is all it reads, and lists each arrow once; Mermaid output is unchanged for every edge kind.- Node client:
save(model, path, options)takes theidFormandincludeLibraryStubsoptionsconverttakes, as itsSaveOptions, and hands them toModel.convertunchanged, with the same refusals and capability gates. - The
@openmbee/opensysmlnpm client requires Node 22.22.2 or later (engines.node >=22.22.2); Node 20 is no longer supported. - A part usage typed only by an item definition (
item def I; part p : I;) is no longer reported aspart-usage-part-definition, and that diagnostic code is withdrawn. - Each run of an action in a Monte Carlo, sweep or exploration no longer re-lowers the action and rebuilds its feature index.
- The pinned OMG pilot implementation is now release
2026-09(jupyter-sysml-kernel0.63.0) - An alias member without a name parses.
- The tag's
pin-release-digestsjob now opens a second pull request,hotfix/pin-vX.Y.Zagainstmain, besidechore/pin-vX.Y.Zagainstdevelop:main's head is the tagged commit and cannot carry its own pin, so without it everybuild-testrun onmain— and its SonarCloud scan — failed the hygiene suite until the next release. - The release's
opensysmlandjupyter-opensysml-kernelpackages are uploaded to PyPI by a GitHub Actions workflow,release-pypi.yml, with trusted publishing, so every file carries a PEP 740 attestation like the nightly snapshots' do. - Python client: the module-level
opensysml.converttakes theid_form(ID_FORM_QUALIFIEDorID_FORM_UUID) andinclude_library_stubsoptionsConnection.convertandModel.converttake, gated the same way on the service'sconvert_library_stubscapability. - Diagnostics spell a written qualified name through one method.
ProjectandWhereFeaturereading a feature an element row lacks now fail with amissing-featureerror naming the element and the features it does have (Target,Property,Candidates), instead of leaving the cell empty, and carry the QVTS outcome record (Feature(<name>)step, the element and its features as frontier); a property no row carries staysunknown-property.- A document query's
Namednow tells a name no element carries from one several elements carry, instead of refusing both asnames no single element. record.ShortNamenow holds the last-segment logic itself instead of forwarding to an unexportedshortName; an orphaned doc comment in the same file was removed.- The REPL calls
nsmerge.MemberNamedirectly instead of through a private forwarding alias; no behaviour change. - The compliance map states the representative-object policy for a feature that states and inherits no multiplicity: the specification bounds the number of values a feature may hold (KerML 1.1 §7.4.12, §7.4.5.2; SysML v2 §7.6.3) and leaves open what a representative instance materializes for a valueless feature, so OpenSysML materializes one representative object for such a feature, none for a declared
[0..*], and judges no count against the defaulted feature; recorded as a tool decision. - A SysML v1 Requirement Diagram is now migrated as a view rendered
Views::asTreeDiagram, drawing the requirements, their nested requirements and the satisfy, derive, refine and verify relationships shown, where it fell toViews::asTextualNotation. - The REPL's dependency search collects the root namespaces a submission imports or references only when the submission left a reference unresolved, instead of walking every submission's text twice.
- Every occurrence that began has its start shot, so reads that answered the static shape alone now answer the run:
start/startShoton an instantiated object is a snapshot object rather than<undetermined>,snapshots,timeSlices,portions,timeEnclosedOccurrences,spaceTimeEnclosedOccurrencesandspaceEnclosedOccurrenceslist the shots that happened (a time slice takes all of the occurrence's space, so a shot is space-enclosed too) and are open until the occurrence ends,successorsis undetermined until it ends, andpredecessorslists what ended before it began;Clocks::TimeOf/DurationOfreturn bare numbers where they returned quantities of seconds. - A shot carries the values its occurrence held at that instant: an ended occurrence's end shot reads its values, and a start shot reads the values nothing assigned since the start; one assigned since is undetermined on the start shot, saying the value then was not recorded.
- A message a state machine takes only to drop it (no transition accepts it) leaves its
Transfers::Transferunended; asend … tofrom a performed action lists the transfer under that performance'soutgoingTransfersas aviasend does. - The runtime answers the subsetting walks a feature read repeats once per model — the relationships a feature declares of one kind, the features of a type they name, and whether a feature subsets another through any chain — and reading the subsetters an object holds no longer copies the list when the object holds every one.
- The self-model's architecture document (
examples/self-model/document.sysml) writes its prose as Markdown bodies whose figures — tier and pass counts, budget defaults, command counts, the MCP server's groups, path and token variable, the AsciiDoc converter variable — aresysml:value:runs read from the model instead of retyped text; its budget-exhaustion caption now counts the eight budgets the runtime declares. - The hand-written membership and index helpers (
contains,containsElement,containsSymbol,containsFit,containsInstance,containsFeatureValue,indexOfSymbol,joins,containsColumn,indexOfAPIJSONProperty,containsInt,containsString,Query.declares,containsWord,appendUnique,lastName) in the migrator, the runtime, the solver, the analysis framework, the document planner, the API JSON writer, the semantics package and the tools module are gone; their call sites useslices.Contains,slices.ContainsFunc,slices.Indexandsymbols.LastSegmentdirectly. - The solver's single-value assumption bookkeeping (
assumeOneandmergeAssumedininternal/exec/solve) tests membership withslices.ContainsFuncinstead of hand-written loops; no behaviour changes. docs/project/spec-compliance.mdcites clause numbers from the specification editions the pilot pin ships (SysML v2.1 Beta 2, KerML 1.1 Beta 2) and says so up front; stale implementation paths, test names and line-number references were re-pointed at the current tree, table rows with an unescaped|inside a code span render as one row again, and the duplicated view-rendering bullet is gone.- The same document now states what the implementation does where its rows had drifted: calculation purity, the implicit
[1..1]of SysML v2 §7.6.3 against the KerML0..*default, nested subrequirements,x + null,excludingAtpast the end, the APIQueryoperators andorderByare recorded as approximate with the clause each falls short of; the bare-importvisibility row is faithful; duplicated connector and view-rendering rows, an empty "Decisions to Reassess" table, quotations the Beta 2 text does not contain and internal work-item references are gone. - The sorted-unique helpers of the REPL comparison, the Xpect referee, the LLM fidelity bench and the grammar census are gone.
- The grammar census exports
StripModelSourcedirectly instead of forwarding to an unexported twin. suggest.EditDistancetakes its three-way minimum from the builtinmin- The sysml-mcp toolkit counts UTF-16 units with the standard library.
- A typing spelled
typed byin a.sysmlfile is reported askerml-notation. - The symbol builder maps a usage kind to its
SymbolKindthrough the single exportedUsageSymbolKind; the unexported duplicateusageSymbolKindis gone. - A usage the model itself declares with an open multiplicity now reads closed over the model, by the rule the library collections already follow (KerML 1.0 §7.3.2.2, §7.4.11, §7.4.12): a lower bound of 0 that nothing declared meets is met by no value, so
part wheels : Wheel[0..*];,item cargo : Box[0..4];,ref part spares : Wheel[*];,part spare : Wheel[0..1];,attribute tags : String[0..*];andpart nested : Wheel[0..*] { part hub; }read as the empty sequence on a package-level usage (car.wheels), bare or qualified (Probe::wheels), and in a constraint or calc (size(wheels) == 0istrue), exactly as onnew Car(), instead of<undetermined>.
Fixed
- Writing api-json builds one index of the graph's subjects, metaclasses, incoming memberships and owner positions per write, shared by the metamodel evaluator, the mapping-name pass and the writer's name index.
- Writing api-json no longer rereads the names of every earlier member of a namespace for each member's
qualifiedName: each namespace's member names are read once, so a namespace's qualified names cost time linear in its member count rather than quadratic. pilot-apijson-diffnow scores a property the pinned pilot exports differently from one JVM to the next in its ownpilot-nondeterministicscorecard column, declared with evidence intools/referee/apijson/nondeterminism.goand written into the baseline, instead of letting-checkfail on a value that moves with the JVM;FeatureChainExpression.featuringTypeis the first declared row (three expressions in the pilot'sServerSequenceModelOutsideexample gain or lose a reference to an element the pilot never exports).- Use Asciidoctor.js 4.1.1 for
rep language "asciidoc"bodies, clearing GHSA-g3hv-75wg-m249 from the converter's dependency tree; 4.x has no runtime dependencies. - An attribute a state or action definition declares over its own occurrence features —
size(entryAction),size(en),size(subperformances), a nestedpart fresh— reads the performance's features: the exhibited machine's or performed action's own, not the exhibiting part's same-named feature nor an object of the bare declaration. - The runtime's binding walks allocate only where a binding can be found: a feature read that climbs to its owners spells out the feature path only while an owner declares a binding, the witness draw builds its pool index on the first candidate, the sibling subsetters' set is made on the first value, and a body is scanned for declared features without listing its members first.
- The RDF and API JSON exports state an expression body parameter's
isVariable/mayTimeVaryas the metamodel derives them (its owning type is the Expression, an Occurrence); the parameter's symbol is looked up by name on the body it declares, so the pair was never stated. - A feature valued by an expression (
attribute y : Integer = x + 1), computed as it is read, now carries the order-dependence marks of what its expression reads at that moment, through features so valued in turn, and a write computed from it (assign z := y + 10) stands on those choice points as a write fromxwould. - The SMT engine (
-engine smt) refuses an action declaring a feature valued by an expression over other features instead of encoding it as the value it held at the start, which proved results the run does not reach. - A redefining feature that declares no value (
attribute :>> y;overattribute y : Integer = x + 1) is bound as the feature it redefines is: its value followsxas it is read, where it was evaluated once as the performance started, and it carries the marks of what the inherited expression reads. sysml -bundlearchives what the project's.meta.jsonrecords: the two manifests plus exactly the files itschecksumkeys andindextargets name, with a recorded file missing from the tree an error naming it; a directory without a.meta.jsonis archived as KerML 10.3 describes — the project file and the model files — so a repository's README, scripts,__pycache__, editor backups and version-control metadata no longer travel in the archive.- A tree rendering (
-render '#tree:…',%viz, the Jupyter kernel's default) drew the directed parameters of a calculation, action or constraint definition or usage —in x,out y,return— asattributemembers with membership edges, and an anonymousreturnas a bareattribute. - A cast at the head of a feature chain is judged for conformance.
- The query surfaces spell each feature-chain clause of a head (
subsets a.b, a.b,redefines a.b, a.b) by the elementId of its own subsetting or redefinition, as the RDF conversion materializes one relationship per chain Feature it owns; the identity reader had keyed chains by their text and reported the first clause's id for every repetition. - A pull request that changes only the committed baselines or figure pages under
docs/project/now runs the Go test shards. - The CircleCI
Go static checksjob ondevelopis no longer killed at theCheck Go dependencies for known vulnerabilitiesstep. - The compact API JSON form (
api-json-compact/1) lists a key inreferenceKeysonly when every value under it is a reference or a collection of references. - The
not representednotice of amost(COMPMOST) orports(COMPTREE) compartment folding no longer counts the members a folded row has from its type as "left undrawn": they belong to the type, which is drawn or reachable from the row. - A constraint that declares no condition — a bare
constraint def Empty;, a usage typed by it, or a negated constraint stating only assumptions — is now reported as no value (ErrNoValue), the error an unbound calc result reads as, instead of the distinctno condition to evaluateverdict. elementIdis now read for the end features a head binds (connect a to b,bind,flow,succession), which the conversion writes as end features of their own; queries and document tables over such ends no longer find the cell empty.make coverage-shard SHARD=toolsno longer fills the disk.- A «Refine», «Satisfy», «Verify», «DeriveReqt», «Allocate» or plain dependency, or a connector, drawn on a SysML v1 activity, state machine, block definition or internal block diagram now keeps its line: the migrator routes it on the
ActionFlowView,StateTransitionView, tree or interconnection view the diagram is written as whenever the view shows both of its ends (SysML v2 graphical notation 8.2.3.3 draws a dependency between any two shown element nodes), where it was reportednot drawn; the action, state and tree renderings draw such exposed relationships as dashed open-arrow edges with their keyword, following theirRoute, and draw an exposed end that is no node of the graph as a plain box. - A loaded file's qualified names are followed to the files beside and below it as its imports are: a file that names a root namespace only by qualified name (
view v : SYSMODViews::ProjectView, with no import ofSYSMODViews) now loads the file declaring that namespace too, so two library packages that import each other resolve when a model naming only one of them is loaded (sysml -validate Consumer.sysmlwithprivate import SYSMOD::*;reportedSYSMODViews::ProjectViewand three more unresolved; naming the project directory, which loads every file, did not). - A
#derivation connectionwhose original or derived requirement itself carries the@originalor@derivemetadata (RequirementDerivation::OriginalRequirementMetadata, legal on a requirement usage) now states its derivation: a body end's reference to a requirement tagged that way is its participant, and only the library's ownDerivationConnections::originalRequirements/derivedRequirementsan end subsets are read as role statements. - Deriving a feature's value marks what it stands on over the memoized footprint of its expression without copying the footprint's reads to hold them via the object's feature.
- Name resolution now memoizes a derived short name whose naming feature cannot be resolved (a
:>>redefinition no general offers a target for), as it already did for one it can: every unqualified lookup through the scope asked each such member again, re-running the failed redefinition lookup once per member per lookup. - The example walkthroughs under
examples/again show what the pinned binaries print: a calculation or analysis result held in its effective multiplicity (fuelUsed = [120.0],= [6432.955324716369 [SI::'m/s']]), the(N independent)choice-point counts and theorder-dependentmarker on a value a schedule decides, the current Mermaid frontmatter and one-line container titles, the%featureslisting of a completed state machine, the instance IDs a session allocates, and the figures of the check engine,-render-alland the stdlib conformance gate. - Documentation: the verdicts demo's held-rover transcripts show the verification case
marginCheckfailing with the satisfaction it verifies after the drive (fourFindingsrows,verification = "fail", the report'sviolatedrow), as the build has answered since a verification case a part definition owns runs over the held object. - Documentation: the views demo's Mermaid action rendering shows the renderer's current output — dashed successions, the
parameterscompartment in the action titles and the title margin it reserves. - Documentation: the external-tool demo's dry run prints the real-valued arguments the model binds (
250.0,290.0). - The project records again point at the code they describe: paths that moved in the
internal/core→internal/{syntax,semantic,check,workspace}layering (pilot-differential.md,pilot-rejection.md,pilot-xpect.md,pilot-corpora.md,adjudications.md,omg-issues.md,spec-pilot-gap-register.md,diagram-layout-annotations.md,spec-compliance.md), thetools/cmd/pilot-exec-diffreferee, the Apollo 11 corpus the release performance reports measured (airbus/apollo-11-sysml-v2at6e9c93f, not a download script that does not exist), and the feature counts of the Calculations (16) and Actions (21) lists inspec-compliance.md. - Documentation: the CLI reference lists
-layout <file>under-migrateand-library-references <file>and-include-library-stubsunder-convert api-json, the REPL reference lists%occurrence <name>, and the service-transports capability table namesconvert_library_references,convert_library_stubs,render_document_asciidocandorder_dependence, asGetServerInfoanswers. - Documentation: the architecture page's Tier 6 (analysis and verification drivers) is marked landed, with the REPL, CLI and gRPC entry points that exist, in place of the planned
%run/%verify. - Documentation: the spec-compliance table names the bundle determinism test by its current name,
TestBundleIsDeterministicAndUnbundleReproducesTheRecordedFiles. - Documentation: the view-rendering-forms page's switch example subsets
Views::asInterconnectionDiagramfrom a rendering usage, the shape the checker accepts and the renderer reads, in place of a rendering definition specializing a usage. - The handbook and reference pages again show what the pinned binaries print: the runtime-showcase analysis in
README.mdholds its results in their effective multiplicity (margin = [70.65198768706614 [SI::'m/s']]), REPL diagnostics carry their code (error[unresolved]:,error[syntax]:,error[binding-connector-type-conformance]:), a%rendertree, Mermaid, DOT, PlantUML and D2 rendering names elements unqualified without their declared types, a state-machine session prints itsUse %events …andUse %step …hints, its choice-point count and theorder-dependentmarker on a value a schedule decides, and the Java dependency snippet names the current0.11.0artifact on Maven Central. - The
drawiorendering form lays unplaced nodes, and the members inside a container, out with a corridor between neighbours that the edge router can use: twice its clearance, the two half port squares, and one nudging lane (50 px instead of 40), so two parts with ports on their facing sides route instead of being left for draw.io to route under a notice. - The
drawiorendering form no longer falls back silently when the router finds no path for an edge: the file carries a notice naming the edge and its cells, and an end at a port still leaves through the port's face. - The duplicate-library check of #1462 keeps only the first declaration of each library package name until a second is met, instead of a list per name.
- A query reading
elementIdno longer converts the loaded model to RDF for the ids: they are minted from the writer's identity tables, the ids the graph would carry, so a model with large query files beside it answers in milliseconds rather than seconds and gigabytes; the REPL and CLI open one such reader per set of loaded documents and reuse it across the queries run over them. - An evaluation context is 152 bytes instead of 184: the chain being evaluated is noted by its last segment, its length and a pointer to the memoized declarations where #1514 carried two slice headers, and the open-inputs flag of #1461 shares a word with the behavior-body flag.
SequenceFunctions::excludingAtfollows its library body.name-conflictno longer warns when the only memberships colliding under one name are those a view'sexposes bring (view v { expose a::**; expose b::**; }with apin bothaandb): a view exposes each expose's own memberships, so bothpare exposed and rendered.- A
connection,interfaceorallocationusage a package declares (connection outer : Link connect sys.x to sys.y;) now counts inall Linkand reads as one Link with its ends attached (outer.a == sys.x), as the same usage nested in a part already did; a usage stating[0..*]denotes none, one stating[2]two connectors each attached, and two such usages abindjoins share one connector with its ends whichever is read first. - A package-level
actionorstateusage now denotes one representative performance, as a package-levelpartorconnectiondoes: a bare read ofP::ais that object rather than<undetermined>,all Actcounts it beside the nested performances, a stated[0..*]denotes none and a fixed[2]two. - Tree and definition renderings draw a feature membership as the graphical notation does: from the owner to the usage's node, with a filled diamond at the owner for a composite usage and a hollow one for a non-composite usage — a
ref, an attribute, a port nested in a part, an end, a directed or an enumeration usage — as the model derivesisComposite, and the usage's typing as adefinitionedge of its own from the usage to its definition. - A feature value whose type is unrelated to the feature's own type is now reported as the
bound-feature-typeswarning at the feature, as the pilot reports it:attribute def R :> Real; attribute a : R = 5;warns, since Integer andRspecialize neither the other, where the value was judged againstRealand passed. - An object's feature values are keyed by the feature, not by its name: for
part def Both :> A2, A1 { attribute b :>> A1::a = 3.0; }the nameaon an object ofBothis the survivingA2::aand reads its own value (2.0), in either order of the generals and whether a definition or a usage owns the redefinition, whileb, andaread as anA1((bd as A1).a, aref : A1), read3.0. - The formatter no longer indents a line that begins with
:>>,:>or another operator one level deeper than its body when the statement above it ended;:>> mass = v.mass;written on its own line now sits at the body's level like the statements around it. -convert sysmlnow lays a succession chain out one statement per line:action a; then action b; then action c;written on one line becomes three,thenleading each successor.- The frontier a failed
Namedquery records (-run-query,-json'schecks[].outcome,%run-query, the gRPCQueryOutcomedetail) lists the namespace's owned members only: an alias declared there was listed as a member of metaclassMembership, which no element has; its name is still offered as a spelling for a typo. - gRPC
VerifyConstraint,VerifyRequirementandRunAnalysisnaming nosubject_symbol_idnow evaluate over the objectsInstantiateholds for the model, asVerifySatisfactionalready did and as the REPL's checks are about the objects a session holds: a verification case a definition owns runs once per held object of the definition and itsverification_verdictsname each object, a constraint or requirement a definition owns is checked on the held object carrying it (ambiguous over several), and a case a definition owns runs as a feature of the held object of that definition. - A
RunAnalysisrun of a verification case over the held population that would pass the held-objects bound isRESOURCE_EXHAUSTEDtoo, and aRunAnalysistool dry run over the population undoes the preview's writes and puts the runtime's tool runner back, as the REPL's preview does. - The hygiene test that holds
client/release-digests.jsonto every release the changelog records no longer fails a checkout of the tagged release commit itself —mainafter a release — whose pin can only land ondevelopafterwards; a commit past the tag without the pin still fails as before. - Every performance the run creates carries the implicit specializations of its kind (KerML §7.3.4).
- A
ref use casewritten in a body is a reference usage. - A state's
entryAction/doAction/exitActionstays resolvable beside theentry/do/exitaction that redefines it. - A state's
entryandexitactions are subperformances of the state, not itssubactions. - A
send … viaa port over a connector inherited from a general part def now reaches the part a specializationredefinesfor the connector's end (part def Sys :> Top { part redefines b : B2; }), instead of a freshly materialized part of the general type that nothing else holds. - A usage linked to an installed project by elimination — its IRI spells a repository path whose last segment is not the project's name — is now a warning on the consumer's
.project.jsonnaming the project taken and the publisher/name the resource should end with, judged by-warnings-as-errorslike the ambiguity warning; before, the fallback was silent. - A project interchange archive holding the project's folder rather than its contents, as the OMG library releases are laid out, is read as the project in that folder, and an index entry naming no member no longer refuses the archive: both are warnings on the archive's path, and the units are found by what they declare.
- A project installed as a sub-package of a repository (
pkg:git/<host>/<path>#packages/gears) is read through its own installation alone: the usage's fragment names the sub-package (gearsunder the repository's owner) rather than the repository's project, and a directory below an installed project — or a member directory of an installed archive — that holds a.project.jsonof its own is a project of its own, not among the parent's files — whether the project or a file in it is named, in the language server's workspace, and in-bundle, which leaves the nested tree out of the parent's archive. - A feature that declares no multiplicity and inherits none now has the usual default
0..*(KerML 1.1 §7.4.12, §7.4.5.2; SysML v2 §7.6.3) instead of an assumed1..1, so a KerML feature such asclass C { feature x : Real = (1.0, 2.0); }, or a SysML attribute owned by a package, holds a default value of any count. - The library index cache (
~/.cache/sysml-ls/libs) no longer serves one build's records to another build of the same commit. - A library loaded from
OPENSYSML_LIBRARY_PATHthat holds two copies of a file now reports the same diagnostics on a warm start as on a cold one. - A declaration instantiated twice (
%instantiate test::btwice, gRPCInstantiatetwice) leaves two live objects of its definition, and subjectless verification and checks now see both instead of the newest alone. sysml -validateno longer fails over a model whoserep language "asciidoc"bodies need a converter the host lacks: a missing markup converter is now the warningdocument-plan-markup-tool-missingat the document's first such body, naming the converter looked for, whetherOPENSYSML_ASCIIDOCTORnamed it or it was the default looked up onPATH, and the remedy, and the rest of the document is still validated with those bodies unchecked (-warnings-as-errorsmakes it a failure).- The release workflow's
publish-mavenjob no longer goes red while Maven Central is still publishing an uploaded deployment. Usage::mayTimeVary(and so a usage'sisVariable) is derived over the usage's effectiveisComposite: a performed action or exhibited state, referential by the notation (perform,exhibit), may vary in time as the specification derives (SysML v2.1 §8.3.6.4deriveUsageMayTimeVary); the reflective read answeredfalsefor them.- The MCP server reference and the release procedure no longer say that the GitHub MCP Registry and VS Code's Browse MCP Servers list
sysml-mcpby virtue of its official MCP Registry entry: the GitHub registry is a curated selection of the official one that onboards a server on request, so the pages say so and configure VS Code by hand untilorg.opensysml/sysml-mcpis onboarded there. - A project interchange archive (
.kpar) whose.meta.jsonrecords a checksum of algorithmNONE, or with an empty value, as sysand writes for a member it did not digest (MBSE4U'ssysmod-sysmlv2releases), now reads: such a checksum records no digest and is neither verified nor refused. - Patch GHSA-g3hv-75wg-m249 by resolving the production minimatch dependency to 11.0.1 in the VS Code extension under
vscode-languageclientand in the Node client under@tufjs/models. - The RDF and API JSON exports state
isVariable/mayTimeVaryfor the usages a declaration implies — a connector's end features, a transition's link and trigger parameters, a trigger's payload and receiver parameters, a satisfy's subject, a flow end's feature — asderiveUsageMayTimeVaryreads them from their owning type (a connection or action yes, a succession or binding no), andUsage::mayTimeVaryderives for a requirement'ssubjectparameter. - The
missing-featureerror's "did you mean" offers the features nearest to the missing segment by edit distance; it listed the first three alphabetically, so an element with four or more features could be told to try a name unlike the one the query spelt. - A document query's
Named, and the type namesWhereTypeandWhereMetadatatake, now read a qualified name as the notation and the element's ownqualifiedNamespell it, a segment no basic name spells quoted:Named(qualifiedName = "Vehicle::'Spare Parts'::Pad")names the element rather than failing asVehicle has no member 'Spare Parts' — did you mean Spare Parts?. - A feature read at namespace level (
sysml -e P::xs, a bare expression or%evalin the REPL, gRPCEvaluate) now holds its value in the feature's effective multiplicity, as the same feature read on an object already did: a[0..*]attribute valued= 4reads[4]on both, where the model-level read printed the bare4. - A
connection,interfaceorallocationusage nested in a part with a stated multiplicity (connection pair : Link[2] connect x to y;) now holds that many connectors, each with its ends attached to the features theconnectclause names (sys.pair#(1).a === sys.x,size(sys.pair) == 2),[0..*]none, andall Linkcounts them, as the same usage declared at package level already did. - The relationship edges of the DOT, PlantUML, Mermaid, D2 and VS Code canvas writers now follow the glyphs of the SysML v2 graphical notation (§8.2.3) rather than UML habits: a typing is a solid hollow triangle with two dots at its base (
--:|>), a redefinition a hollow triangle with a bar (--||>), a subsetting a plain hollow triangle with nosubsetstext, an owned membership a circle-plus at the namespace, a flow a solid arrow with a filled head, an action succession a dashed arrow with an open head (the Pilot draws it solid), a state transition solid with an open head, a binding labelled=, and satisfy, verify, allocate, include, perform and exhibit solid open arrows labelled«satisfy»,«verify»,«allocate»,«include»,«perform»and«exhibit»; an import reads«import»,«import»*or«import»**. - Binary
+and-written with an empty second operand (1 + null,3 - (),x - yfor ayholding no value) now evaluate as the invocation KerML 1.1 §8.4.4.9.6 makes them,'+'(1, null)and'-'(3, ()): the library declaresyas[0..1], so the operator is the unary sign (1,-3), as the function form already answered. - A value reached through a part (
sensor.rawwritten by racing branches,sensor.scaled = raw * 10, a value read from either after the join) is now reportedorder-dependentwhere-schedule exploreproves more than one outcome: the result surface read what a part's object holds under a fresh run, losing the run's marks, and an object's feature valued by an expression recorded nothing of what it read; the place is the part's, so two parts of one definition hold two values of its feature andleft.rawracing leavesright.rawbare. - A binding connector whose multiplicities link fewer values than its ends hold —
binding [1] bind [0..1] tf.edges = [0..1] tfeinShapeItems::Box,binding [1] bind [0..*] base.edges = [0..*] beinShapeItems::Cylinder, or a user model'sbinding [1] bind [0..1] left = [0..1] rightbetween two collections — identifies some value of one end with some value of the other (KerML 1.0 §7.4.6, §8.3.4.5.2) and determines neither, so reading a bound feature no longer fails with "binding end cannot be resolved": the feature holds what its own declaration states, and the collections it subsets read through it (Box.tfe,Box.tflv,Box.vertices,Cylinder.be,Cylinder.edges). - Reading
subparts,subitemsorsuboccurrencesof atimesliceorsnapshotpart nested in a part no longer fails withoccurrence lifetime does not admit the change: … as a portion of itself. - Clients:
- The pull-request workflow's protobuf breaking-change check compares the schema against the pull request's merge base with its base branch (a merge group's
base_sha), not the base branch's tip, so a field another pull request adds toapi/proto/sysml.protoafter a branch was cut no longer fails that branch as a deleted field until it merges the base branch. - A
CompositeConstraintwith a single member is refused as malformed, as the standard'sconstraint : Constraint [2..*]requires, by the service and by every client translator. Project/WhereFeatureon a feature several element rows lack report every such element in the QVTS record (one path failure each) and name the others in the message, instead of stopping at the first.- The
ambiguousNamefinding ofNamednames the namespace that owns the duplicated members, as the QVTS reference semantics do, not the duplicated name. Query.orderBysorts the matched elements by the listed properties in order of precedence, ascending and stable with declaration order as the final tie-break, on the RPC, the MCPquerytool and every client; an unknown property is refused asselectandwhererefuse one.- The API & Services
QueryRPC now accepts all sevenPrimitiveConstraintoperators of §7.1.4:<=,>=,in(membership of the property's value in a list) andinstanceOf(the element's metaclass conforms to a named metaclass, so aPartUsageis an instance ofUsage,FeatureandElement) join=,<and>insysml.proto, the executor and every client translator, which refuse a malformed operand shape before sending. - Writing api-json parses each ordered-collection annotation with a fixed couple of allocations per member: a reference, string, number or boolean member spelled the way the annotation writer spells it is read without a JSON decoder, and any other spelling still goes through the decoder.
- RDF import: a conjugated port with an explicit
subsets,redefinesorreferencesclause (port p : ~Pd subsets Parts::Part::ownedPorts;) now reads back from Turtle and the API element form. - The RDF export states a usage's
isVariableandmayTimeVaryas the metamodel derives them (Usage::mayTimeVaryredefinesFeature::isVariable;deriveUsageMayTimeVary), the value the reflective read already answered; it wrote neither, so an RDF consumer readfalsefor every usage. - A feature chain evaluated at runtime (
-e, a feature value, a condition) resolves each member in the namespace of the feature before it, as the static read does: a feature a redefinition removed from that namespace (KerML §7.3.4.5, §8.3.3.1.10) isunresolved reference: u has no member subj: U::s redefines itinstead of reading the value under the redefined name. - The static read of a member chain no longer resolves, through the usage's type, a name the usage's own redefinition removed:
a.xforpart a : A { attribute y :>> x; }isunresolved member: x, asa::xandb.xfor a definition owning the redefinition already were;attribute :>> x = 1;keeps the name it takes. - The runtime's memo of the features a feature's relationships name, per owner type (#1626), no longer records the features that declare no relationship of the kind asked for, which were most of its entries and grew with every type an instantiation touched.
scripts/release-announce.py --snippetnow accepts only files under the directory the script is run from: the path is canonicalized first (..and symlinks resolved) and one that lands outside the working directory fails with an error naming it, instead of being read from anywhere on the machine.- A submission's parse trees are let go once its files are accepted, instead of being held through the analysis for the root namespaces an unresolved reference would be looked up by (#1441); a reference left unresolved parses the text again.
- The release browser REPL module is the RE build again.
- The first rendering of a document a workspace holds as its interface record (a warm record cache, as
sysml-mcp'srender_viewand the LSPopensysml/renderrequest read one) was empty —the view exposes everything under …, and there is nothing there— until aviewscall parsed the document. - A requirement check is
allTrue(assumptions()) implies allTrue(constraints())(Requirements::RequirementConstraintCheck::result), as the value read ofresult, the subrequirement check and the solver already judged it: a subject failing anassume constraintsatisfies the requirement whatever itsrequire constraints read, instead of being reported as violating them. - The files beside a loaded file are searched for the root namespaces the analysis actually left unresolved, not for every root the file names: a qualified name an import already answers (
import Lib::*;thenInner::Thing, withLib::Inner) no longer loads an unrelated sibling declaring a rootInner, and the files loaded for a reference are read for their own unresolved references in turn (a qualified name leading to a file whose import leads to a third). editors/vscode/tools/route-goldens.mjs, which re-records the libavoid parity goldens, now writes only inside the repository checkout: the default output directory and the libavoid module are found from the tool's own location rather than the working directory, and an output-directory argument is canonicalized (..and symlinks, dangling ones included, resolved through its deepest existing ancestor) and refused with an error naming where it resolves when that is outside the checkout, before any directory is created; each golden file is checked the same way before it is written, so a symlinked golden cannot redirect the write outside the checkout.- The
byoperand of a satisfy usage is a feature reference or feature chain (SysML.xtextSatisfactionReferenceExpression), and one written as a wider expression (satisfy requirement sr : R1 by sub#(1);,by (a, b),by parts->first(),by self.items#(2),by new Sub()) is now reported once, where the chain ends, with the usage closing at its;so the members after it parse undisturbed, instead of a cascade of three diagnostics about the declaration, a metadata prefix and a body member; abysubject the next line's member follows is still reported as the missing;it is, while an operator opening the next line (by a/+ b;) extends the operand and is reported once as the expression it makes. - A satisfy usage declared without
byinside a part or part definition (part craft : Lander { satisfy requirement touchdown : Touchdown; }) takes the owning object as the requirement's subject (SysML v2 §7.21.4): reading itsresult(craft.touchdown.result,Requirements.sysmlRequirementCheck::result) now evaluates the requirement's conditions on that object and agrees with-satisfy, and reading the subject itself (craft.touchdown.lander.verticalSpeed) answers about that object, where both read<undetermined>; an owner the subject's type or multiplicity refuses leaves the subject unbound, and theresultread reports the refusal as the check does. %satisfy,-satisfyand the gRPCVerifySatisfactionsweep over a definition'ssatisfy r;now label each object they decide by the indexed path%validateand-validate=print for it —satisfy costReq holds (on test::fleet.cheap[1] ID: 2)rather than(on test::fleet.cheap ID: 2)— the runtime spelling a carrier's path once, as the validation walk spells the object it reaches; the gRPC satisfy verdict carries it asinstance_path.- The constraint solver now reads a feature's multiplicity as the model computes it: a stated, redefinition-inherited or implicit
[1..1](SysML v2 §7.6.3) multiplicity that admits several values refuses the read as before, and a feature that declares and inherits none, which the usual default0..*governs (KerML 1.1 §7.4.12, §7.4.5.2), is read as one value under an assumption the query records (Query.AssumedOne) and%check,%solve,%explain,%configureand%optimizeprint, instead of being taken for exactly one value silently. %configure,%check,%solve,%explain,%optimizeand thesmtengine no longer refuse a definition or part with… = a undetermined (declared by the model): value cannot be fixed for solving: a undetermined has no literal in the term languagewhen an attribute's declared value is an expression over features nothing gives a value to (attribute volume : VolumeValue = height * width * length;withheight,widthandlengthunset).scripts/release-announce.pyvalidates--snippetby raising from the path helper and reporting the usage error frommain, so the containment check is recognised as a sanitizer by static analysis (pythonsecurity:S8707); a snippet under the working directory (also through a symlink) is still read and one resolving outside it is still refused.- The
Implementationcolumn ofdocs/project/spec-compliance.mdand the other compliance tables underdocs/project/cites the live Go declaration again: every identifier that had been deleted, renamed, re-cased or moved to another file now names its currentfile:function, andtests/hygienechecks the column against the parsed Go tree so it cannot drift silently. - Every surface names an object a subsetting usage materializes by that usage.
- A requirement usage nested in a requirement definition or usage is a subrequirement (SysML v2 §7.21.2): one of the container's required constraints, its value its own
assumptions implies constraints, bound to the container's subject when it declares no subject of its own and keeping one it declares, through any depth of nesting. - A subsetting feature that states no value of its own (
item tfe [2] :> edges;) now holds values of the feature it subsets when that feature holds values by its own declaration, as many as its lower bound asks, instead of objects made up for the bound that the subsetted feature never held (KerML 1.0 §7.3.4.4); a binding constraint on the subsetter picks the values its other end holds (§7.4.6), and a subsetted feature holding fewer values than the bound asks is the multiplicity violation the read already reports. - A succession written in a nested action, or in a
loop/while/fororifbody, is reported when an end names a feature the action does not feature — the enclosing definition's subject or part, or a node of the enclosing action (Must be an accessible feature (use dot notation for nesting), KerML 1.1 §8.3.4.5.3checkConnectorTypeFeaturing), as the OMG pilot reports it; such ends were silently accepted inside loop bodies and as the first end offirst x then y. thiswritten in a behavior body now denotes the context occurrence the member read.thisanswers: the object owning the performance for an action, state, calc or constraint a part owns (Objects.kermlownedPerformances::this default that,Parts.sysml"thethisreference of an ownedAction is always its owning Part"), the owner'sthisfor a subaction (Performances.kermlsubperformances::this default (that as Performance).this), and the performance itself only when no object owns it.this.<feature>written in a behavior definition resolves<feature>against the declared type ofthis(Occurrences.kermlOccurrence::this : Occurrence[1] default self), as the pilot does: a definition reading its own feature, or its enclosing part's, throughthis.is refused at analysis as an unresolved member — read the definition's own feature by name.- A behavior run reads by name what another performance wrote to a feature of its occurrence, and a feature a definition's body assigns after
thismaterialized the occurrence keeps the assigned value when read by name (the read re-derived the declared default). - A definition that redefines
thiswith a type (ref part :>> this : H;, the pilot-clean way to read a performer's features in a definition) is valued from the same context occurrence the member read answers, sothis.levelreads the performer'slevel; an object performing it that is noHis refused as "an object of Q" written to a feature typed byH. - The nonstandard-notation pass no longer walks every expression of a document looking for a
typed byon a body-expression parameter (#1478) when the document spells none: the parser counts the spellings and the pass sweeps only while one is unreported. - A calculation whose result parameter is never bound — a body with no result expression or
return, or one that runs to its end without returning — is now reported as no value (ErrNoValue), the same error anoutparameter the body never assigns reads as, instead of the distinctno result expression/calculation returned no valueerrors. - A usage whose resource is the ECMA-427 package URL a package manager writes for a repository —
pkg:generic/<name>?vcs_url=<vcs>+<transport>://<host>/<path>[@<version>][#<subpath>], the qualifier percent-encoded (pkg:generic/sysmod-sysmlv2?vcs_url=git%2Bhttps:%2F%2Fgithub.com%2FMBSE4U%2Fsysmod-sysmlv2%405.1.6) — now links the project installed underlib/exactly as thepkg:git/<host>/<path>[@<version>][#<subpath>]spelling does: the host and path, the@<version>and the#<subpath>are read from the decodedvcs_url, the bare<vcs>+<transport>://URL is read the same way, and a.gitsuffix on the repository path is not part of the name. - A usage that names no installed project by publisher and name is linked by elimination only when its resource spells where the project is kept rather than the project — a version-control package URL (
pkg:git/,pkg:svn/,pkg:hg/) or a plain URL; every otherpkg:<type>/<publisher>/<name>form is matched by name alone and stays unresolved when that project is not installed, where before it could fall back to the one unrelated installed project. - The nested features of a calc, constraint or state usage a part definition owns read through a feature chain as any usage's members do (KerML 1.0 §7.3.4.6, §7.4.9.3; SysML v2 §7.19.2, §7.20.2, §7.18.2):
rig.area.wandrig.area.scaleare the input the evaluation bound and the body local it left,rig.fits.limitandrig.fits.marginthe input and local of the check, in a body (attribute aw = area.w;), over a declared object (-e Probe::rig.area.w) and over a constructed one (new Rig().area.w) alike;rig.area,rig.area()andrig.fits.resultkeep reading as the computation and the verdict. usage-typingnow fires on a usage typed by a feature chain that resolves to a feature (part p : rig.wheel;), as it does on a usage typed by a feature by name: a usage's types are classifiers, nominally definitions (SysML v2 §8.3.6.4Usage::definition), so the chain's last feature is checked against the usage's kind rule and reported in the pilot's words (A usage must be typed by definitions.,An occurrence, item or part must be typed by occurrence definitions.and the per-kind siblings).- A usage's
versionConstraintis read as an npm-style semver range — exact,=/vprefix,<<=>>=,^,~,x/*wildcards, hyphen ranges, space/comma as AND,||as OR, pre-releases ordered as semver 2.0.0 and admitted only where the range names their release — and the highest installed version in the range is taken, on the publisher/name match and by elimination alike; before, only an exact version was understood, so a range never linked by elimination and on the name match the latest installed version was taken regardless. - A migrated use case diagram showing a requirement nested in another requirement exposes and lays it out by its qualified name (
'Test Requirements'::'MAPS Quality of turbulence'::'MAPS Spectrum Mean'), as anexposeand ametadata … aboutmust name a member; the feature chain written before ('Test Requirements'.'MAPS Quality of turbulence'.'MAPS Spectrum Mean') is a syntax error there, so a Cameo project with such a diagram failed to migrate withthe migrated notation could not be written: … expected ';' after expose statement. - The object materialized to stand in for the unspecified value of a value-typed feature (an unvalued
out result : Boolean[1]of a state definition a part exhibits, read when the machine starts) is dropped once the feature holds a value — by an assignment or an outside write, a binding resolving, a collection assigned whole, or under a redefining name — instead of staying registered as an object nothing holds (it stays while another feature or a live run's data still names it); a write landing on an occurrence feature now also reaches the data of every run over it (the state machine, a performed action or an action run directly, a snapshot restored included), and a journal rolling the write back restores that data with the stand-in, so a held image of the part round-trips the graph the run leaves, andInstanceCount/InstanceIDsno longer count the stand-in. - A variant usage no longer derives
Usage::mayTimeVary(and soisVariable) true: itsVariantMembershipis anOwningMembership, not aFeatureMembership, so it has no owning type (SysML v2.1 §8.3.6.4deriveUsageMayTimeVary); the RDF and API-JSON exports state the pair false for it, as the pilot does. - A verification verdict now carries the notes its answer rests on — the features a solver question reads as one value or object while only the default
0..*multiplicity governs them, and the object-holding features whose own assertions it does not state — on every surface: the gRPCVerdict.notes(verdict_notescapability), the MCP verify tools, and the Go, Python, Node, Rust, Java, Julia and MATLAB clients, worded as the REPL's solver commands print them. - A verification case a definition owns now runs once on every object of the definition a report is about, so the objects a multiplicity repeats (
part cheap : Definition [2], the members of a[0..*]collection, a part nested inside a repeated part) each get their own run and verdict on%requirement/-requirement,%satisfy/-satisfy,-validate -json, the gRPC verification reports and the documentverdictsquery; a definition'ssatisfywithoutbyis likewise decided once per repeated object. - The VS Code diagram panel's canvas now covers everything it draws: an edge label or arrowhead routed above, left or right of the outermost boxes —
«derive»and«satisfy»over the top row of a requirement view, say — is no longer cut off at the canvas's edge. - The VS Code diagram panel routes an edge between an owner and a member drawn inside it — the membership edges of a mixed rendering, a tree's structural usages — inside the owner's box: from the owner's header line, straight above the member where the row allows, to the member's border, through the lanes between the other members and never outside the owner; an edge between two siblings stays inside their container, and an edge that leaves a container crosses its border below the header, not through the header.
- A command whose process has no record cache root — no
$HOMEor$XDG_CACHE_HOME, or one outside what a WASI host preopened, as awasip1build run with only its model directory — now holds every file loaded quietly instead of warningrecord cache unavailable … Bad file numberon every run, and a custom standard library loads without itsstdlib symbol cache unavailablewarning too. - The VS Code diagram panel now draws a collapsed element as the CLI renders it: the ports on its boundary stay, with every edge that ends at them, and only what the element nests is folded away.
- A
DiagramLayout::Layoutwithcollapsed = trueabout a state or an action now folds its body in the state and action renderings of every form, as it already did in the tree and interconnection renderings: the nested states, actions and the transitions or flows between them are not drawn, and the element keeps itscollapsedtag. - The VS Code diagram panel keeps a
Layoutwith a statedwidthandheightas a fixed box: theportusages under it are drawn as pins on its border, each connector anchored at its pin, and an unplaced member the box has no room for is left undrawn with a notice, as a stated size leaves compartment rows unwritten in the rendered forms. - A behavior writing a feature it declares judges the count by the feature's effective multiplicity, as a write to an object's feature does:
attribute x : Real :> many;on an action or state definition now holds(3.0, 4.0)written by its own body (it inherits[0..*], KerML 1.1 §7.4.12) instead of refusing a second value against the representative one, while an attribute with the implicit[1..1](SysML v2 §7.6.3) and a stated bound still refuse a count outside it on every path.
Security
- Every dependency
govulncheck ./...,npm audit --omit=devandcargo auditreported as vulnerable and reachable is replaced. - Every Maven dependency osv-scanner reports as vulnerable in the Java client, the SysON plugin and the MDK plugin is replaced.
- Every third-party GitHub Action the workflows use is pinned to a commit SHA.
- The Java client verifies release signatures with
sigstore-java2.4.0 instead of 1.3.0, and the Apache HttpComponents it brings are held past their advisories.
Supported versions. Until 1.0.0, each release line is supported only until the next release. From 1.0.0 the previous minor release line is also supported for 90 days after its successor ships, so that a fix can be taken without a feature update. How to report a vulnerability, and what to expect, is in SECURITY.md.
Verify your download. Check SHA256SUMS.txt and its cosign signature before running anything: https://runtime.opensysml.org/guide/security/#verifying-a-release.