Skip to content

v0.9.1 - Conforming Migration Release

Choose a tag to compare

@HuiJun HuiJun released this 30 Sep 16:25
· 6371 commits to develop since this release
b9de3b0

OpenSysML 0.9.1

0.9.1 is a patch release on 0.9.0: 125 pull requests merged to develop in the day after the
executable-migration release, folded into one changelog section, and nothing that changes what a
valid model means. Most of it is the SysML v1 migration read against the OMG pilot validator and
against Cameo's own diagrams — the output that 0.9.0 wrote in OpenSysML's extended notation, or
with references the v2 accessibility rules do not admit, now validates clean under the reference
implementation, and a migrated Cameo diagram keeps its layout, colours, notes and pasted pictures
from the .mdzip alone, no MTIP export needed. Around that: the RDF and API JSON interchange
write the normative shapes for triggers, flow ends, payloads, messages and verifications; the
ApplyEdits authoring surface covers most of the grammar's body members; the runtime reads a
parameter's multiplicity as §7.6.3 says; two lints; FMI models import and run; the commands build
for WebAssembly; and every client — Python, Node, Java, Rust, Go, plus new Julia and MATLAB
clients — is published from the core tag at the core version.

Full detail per change is in CHANGELOG.md § 0.9.1.

The wire is additive (buf breaking against the 0.9.0 api/proto passes; the new fields and
RPC options are optional), no CLI flag, REPL command or import path is removed, and every
model 0.9.0 accepted is accepted, with the diagnostic differences listed under Upgrading.

Upgrading

  • Every client releases with the binaries. v0.9.1 publishes, from the one tag: opensysml
    0.9.1 to PyPI, @openmbee/opensysml 0.9.1 and its five @openmbee/opensysml-sysml-grpc-<os>-<cpu>
    packages to npm, org.openmbee:opensysml:0.9.1 (and opensysml-parent) to Maven Central, the
    opensysml 0.9.1 crate to crates.io, and github.com/Open-MBEE/OpenSysML/client/opensysml@v0.9.1
    for Go through the module proxy. The Java artifact is opensysml, not opensysml-client
    (nothing was ever published under the old name; the module directory and package names are
    unchanged). The client-node-v*, opensysml-java-v* and opensysml-rust-v* tag lines are gone,
    and the VS Code, SysON and Cameo editor manifests carry the core version too.
  • Files given together are separate documents. sysml -validate a.sysml b.sysml, -satisfy,
    -e and %load used to join their files into one buffer; each file is now its own workspace
    document, as the editor and the corpus gates read it. A root-level import in one file no longer
    serves the others, and two files declaring package A are two root namespaces rather than a
    duplicate-member error — the same behaviour as the language server. -convert of several files
    now writes one graph, with cross-document references linked (#653).
  • Diagnostics that moved. A bare in x : T; parameter is optional under §7.6.3 (an explicit
    [1] stays required); a kind-less usage (x : Integer;) is a ReferenceUsage, as the export
    already wrote it; part def X :> A :> B; and other malformed relationship clauses are rejected
    (#615); a connection typed by an allocation def or interface def is accepted (#630); a
    part typed only by non-part definitions, a connector end or annotation value naming a
    definition, and a trigger naming a usage are now reported, as the pilot reports them; then
    / else written after a non-action member, and a comment where no member may start, are
    nonstandard-notation warnings (errors under -strict); a root package named like a standard
    library package gets a library-root-name warning. Diagnostic ranges end at the last token of
    what they report rather than at the next token.
  • Migration output changed shape. Deferred signals are written in standard SysML v2 in both
    modes (defer no longer appears in migration output); this.<feature> inside a behavior
    definition became an in ref context : <Block>; parameter, or the behavior an action usage of
    the block; a top-level package named like a library root is written as <name>Model; and
    -strict refuses every construct whose only v2 form is an OpenSysML extension. Goldens pinned on
    0.9.0 migration output will move.
  • Interchange output states more subjects. Turtle and API JSON write transition triggers as
    triggerAction structure, flow ends as FlowEnds, payloads as PayloadFeatures, message ends as
    EventOccurrenceUsages, verify as a RequirementVerificationMembership (not a satisfy), a
    dependency's prefix metadata as an Annotation, source positions on every declared element, and
    same-named members with distinct positional identities. Graphs written by 0.9.0 still read.

SysML v1 migration

  • Output the reference implementation accepts. Reception methods read the payload through the
    accept that holds it; an «Allocate» between definitions is an allocation def; a stereotype tag
    naming a definition is the element cast to its metaclass; a decision's else branch follows the
    decide; a block's activity that reads the block's features is an action usage of the block, or
    a definition taking context; parameter multiplicities, ordered/nonunique, context-parameter
    order and shadowed names are kept or qualified; «Probability» reads reach the property they name.
    The OpenSysML libraries themselves (DocumentQueries, MOSA, OOSEM, Simulation) now validate
    clean under the pilot too.
  • Diagrams from the stream. sysml Project.mdzip -convert sysml reads each diagram's own
    MagicDraw symbols — frame, geometry, routes, fill/pen/text colours, fonts, notes, hidden symbols
    — and writes them as DiagramLayout Canvas, Layout, Route, Style, Note and Picture
    metadata; pasted images are decoded and written under images/. -render-style cameo then draws
    the DOT form as Cameo draws it (frame tab, gradient fills, compartments, pseudo-state symbols,
    pins on the action border, trigger [guard] / effect labels), and a migrated document publishes
    to PDF with those figures at their stated positions.
  • Documents. Cameo instance/generic tables migrate with their rows, tree modes, exclusions,
    column widths, stereotype-tag columns and saved filters; a DocGen Image of a table embeds the
    table; a view conforming to no viewpoint shows what MDK shows; 2022x collaborator paragraphs are
    read and placed at their anchors; a view's own documentation opens its section; View Editor image
    paragraphs and attachments become Image blocks.
  • -compare-results over a large model runs in bounded memory (the TMT reproduction killed at
    8 GiB completes under 3 GiB, same numbers), and the writer is twice as fast.

Diagrams and documents

  • DiagramLayout::Style, Note and Picture are library metadata any view can carry; a
    document's diagram form is chosen per diagram (positioned views as Graphviz, the rest Mermaid);
    the three graph forms draw the same nodes for a positioned view; routed edges end in arrowheads
    at both stated ends; notes, labels and pseudo-states are placed where the diagram put them.
  • Documents gain an Image block, -doc-number-figures, member-path columns
    (stat.runs), multi-valued cells, Tree, WhereText, columnWidths and columnLabels; wide
    tables fit their PDF pages; -render-documents writes every document it can and exits 3 when
    one could not be rendered.

Authoring, runtime and verification

  • ApplyEdits now authors connections, allocations and flows, transitions, behavior
    parameters, action-body sequencing and nested statements, perform usages, constraint bodies and
    assertions, state entry/do/exit, imports, metadata prefixes and usages, verify
    memberships, comments, notes and documentation — each behind a capability the clients preflight —
    and a batch resolves its references against the whole batch.
  • Runtime. Parameters take their §7.6.3 effective multiplicity; nested usages implicitly
    subset subparts/subactions/…; a nested chain redefinition (attribute :>> mid.leaf.value)
    applies at every level (an extension, warned); this in a behavior definition is the run's own
    occurrence; a performed action's unbound input ends that performance, not its performer's
    creation; chained writes through a one-element collection reach it.
  • Verification asks holds and satisfiable, not only evaluate (question= in Python,
    Asking(...) in Go, VerifyOptions.asking(...) in Java), with witnesses, undecided reasons and
    a rounding-sound proof rule.
  • External tools. Manifests compose the command line (invocation) and read the reply in JSON,
    CSV, key–value lines or exit code (reply); tools answer sequences; ToolExecution works on a
    calc def; -tool-dry-run/%tool preview an invocation; runs record the tools they reached.
    FMI models (1.0–3.0) import as calcs and run through pip install opensysml[fmi]'s reference
    runner, with units as ISQ types.
  • Lints undeclared-signal and port-type-mismatch; a workspace holds closed documents as
    interface records and hydrates them on demand; a batch of files is analysed on a worker pool
    (the 34-file stress constellation in 9.2 s against 22.0 s).

Clients and integrations

  • Julia (client/julia/OpenSysML) and MATLAB/Octave (client/matlab) clients over the
    Connect-JSON surface, each with a conformance runner.
  • Python parse_sources for multi-document models; ExecuteState/ExecuteAction on a performer
    report the performer's attributes; queries expose satisfiedRequirement/satisfyingFeature and
    identify unnamed declarations by their export identity.
  • The commands build and run for wasip1 and js (make build-wasm, docs/reference/wasm.md);
    no artifact ships yet.

Performance

Occurrences of one shape share derived defaults and verdicts (the 12 800-satellite fleet's 2 412
satisfaction checks: 8.84 s / 23.4 GiB → 4.59 s / 7.2 GiB; one summed attribute over every
occurrence 42.7 s → 3.85 s); a view with many exposes no longer stalls (#636) and cyclic public
imports analyse in polynomial time (#633); ParseSources over many documents is linear;
the API JSON writer takes half the time; satisfying requirements allocates less than 0.9.0 and is
within 11% of its time. The Apollo 11 model still loads, resolves and validates in 0.27 s.

Packaging

  • Linux amd64/arm64, macOS amd64/arm64 and Windows amd64 archives, sysml-grpc binaries with
    .sha256 sidecars, SHA256SUMS.txt and its cosign bundle, the Python wheel and sdist are built
    by the release workflow from tag v0.9.1. New: the release carries signed SLSA provenance
    (provenance.intoto.json + .bundle, verified with cosign verify-blob-attestation).
  • The release workflow can be rehearsed on a branch (release_rehearsal) with every check live and
    the irreversible steps skipped; this release was rehearsed twice before tagging.
  • macOS binaries are not Developer ID signed or notarized;
    macos-distribution.md
    gives the workarounds.

Verification

The pre-tag gate of docs/project/releasing.md on the release commit (Go 1.25, Linux amd64):
gofmt -l . empty, go build ./... and go vet ./... clean, go test -count=1 ./... all
packages ok with the OMG training corpus, the three pilot corpora, the pilot library XMI and the
PSSM suite required, the standard-library conformance gate, make conformance (149 passed, 1
skipped), the Python client's 1237 tests, Node 149, Java mvn verify, Rust cargo test and
cargo package, buf breaking against the 0.9.0 api/proto with no breaking change, and the
documentation id, link and figure checks and python3 scripts/changelog.py check clean. An
end-to-end shakedown of the built binaries, the REPL debuggers, TTL round-trip, document
rendering, XMI migration in both modes, the gRPC service and the four clients preceded the cut.
Every change in the range merged through the pull-request CI on develop and, for the release
branch, through the full pull-request CI against main and two green release rehearsals.