Skip to content

v0.8.1 - Migration Repair Release

Latest

Choose a tag to compare

@HuiJun HuiJun released this 17 Sep 05:22
· 1650 commits to develop since this release
e0ea346

OpenSysML 0.8.1

0.8.1 is a patch release on 0.8.0: the fixes that landed on develop in the days after the
engines release, and nothing that changes what a model means. Most of it is the SysML v1
migration read against real tool exports — the current TMT observatory model now migrates to
notation with no analysis errors, down from a hundred, and keeps the structure of its instance
trees — alongside the VS Code extension building and testing on Windows, a diagram that opens
with a keystroke, the smt engine honouring the timeout it was given, and a Mermaid rendering
that follows its declared direction inside every container. Every build of the three binaries is
now statically linked, not only the release job's.

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

No import path moves, no CLI flag, REPL command, RPC or wire field is added, removed or
renamed, and the clients keep their names, versions and contents.
Every model 0.8.0 accepted
is accepted with the same diagnostics, with the one library-internal exception under Upgrading.

Upgrading

  • A transition's accept trigger payload is a member of the transition. The parameter an
    accept trigger declares (transition t first a accept p : Payload then b;) was catalogued in a
    scope of its own with no owner and no qualified name, so the one such parameter in the standard
    library was the last named library element whose normative id differed from the pilot's XMI.
    It now lives in the transition's own scope beside the effect and body members: t::p names it,
    the guard, effect and body reach it as before, and any other reference to it reports Must be an accessible feature, as the pilot does.
  • A Linux sysml-grpc built with make build or make install no longer needs glibc 2.34.
    CGO_ENABLED=0 moved from the release scripts into the Makefile, so every build is static; a
    dynamically linked binary now fails the build (make static-check) instead of shipping.
  • Golden execution traces, .expected.json files and -json report shapes are unchanged.
    The migration's output changes only where 0.8.0 wrote notation that did not analyse cleanly.

SysML v1 migration

  • Opaque expressions written in v2 syntax are copied when — and only when — they resolve. A
    body expression's own parameters and members ({ in v; v > limit }) are read as its own, so
    only the names it reaches for beyond itself are checked for visibility, in nested bodies,
    nested constraints and multiplicity bounds alike. A feature chain on a body-local name is checked
    against the type the name is declared with ({ in v : Pt; v.missing } is left as a comment; an
    untyped v.x too, since there is nothing to check x against), and a qualified name rooted in a
    standard-library package — ScalarValues::Integer, ISQ::mass — is checked against the bundled
    library, which a v2 model reaches without importing it. A body declaring a member kind the check
    does not read is left unmapped rather than copied unchecked.
  • The migration reads past the UML metaclass where the tool's own encoding hides the v2 form.
    A Signal is an item def and properties typed by one are item / ref item; a constraint
    block's parameters are public in attributes (in ref parts when typed by a block) whether the
    tool stores them as Properties or, as MagicDraw does under «ConstraintParameter», as Ports; a
    private feature a connector, slot, redefinition or subset reaches from outside is written public
    with a note naming what reached it, as is a private packaged element v2 would put out of reach of
    the packages importing it. Types referenced by href into the SysML or UML primitive library
    resolve from plain and dotted fragments and from MagicDraw's referentPath, and the tool
    library's float, double, int, long, short, byte and boolean are written as the
    matching scalar and reported as approximations.
  • Instances and slots are written as individuals. An instance of a block is an individual part def and of a constraint block an individual constraint def, typed by the block alone; a
    slot of a part, item or constraint property redefines or subsets it under the individual, and a
    slot that contradicts its feature — more values than the multiplicity allows, a repeated value of
    a unique feature, an empty slot of a feature of multiplicity 1 or more, a feature of a classifier
    the instance is not written to specialize — is left as a comment with that note rather than
    written as a redefinition bound to the wrong thing or to nothing. An instance of a value type is
    an attribute typed by it; a default naming an instance of a block types the usage by that
    individual.
  • Typed-in numbers of any size are kept. "9223372036854775808" for an Integer and
    "1e400" for a Real are written as those values instead of being left as comments for
    exceeding a machine word or a double. A real literal on an Integer feature and a numeric string
    on a scalar feature take the feature's scalar; a literal on a value type or enumeration with no
    scalar base is not bound.
  • A nested connector end's propertyPath given as one whitespace-separated attribute is split
    into its ids; an undirected part or item property of an interface block is a ref; a
    specializing block's property named like an inherited one redefines it when both are the same
    kind of usage and is reported when they are not.

VS Code

  • The extension builds and tests on Windows. tools/test.mjs derived its src/ and out/
    directories from a file URL's pathname, which on Windows carries a leading slash before the
    drive letter, so npm test and npm run package failed with ENOENT … scandir 'C:\C:\…\src'.
    The paths now come from fileURLToPath.
  • The diagram opens with a keystroke or a click. SysML: Open Diagram is bound to
    Alt+D (Option+D on macOS) and
    Ctrl+Shift+V (Cmd+Shift+V),
    active in a .sysml or .kerml editor and in the diagram panel itself, where the same key
    returns to the source. The command sits in the editor's title bar and right-click menu and in
    the Explorer's menu for model files, which opens the file and its diagram side by side;
    SysML: Export Diagram joins it there. Without a server that can draw, the commands say so
    instead of greying out.
  • A diagram drawn from an older sysml-lsp no longer labels a typed usage undefined. The
    panel fills in what a server predating the node type field omits — a node's type, name
    and detail, an edge's label, absent lists — before drawing, so such a usage reads engine,
    «part», Engine, and an unnamed element leads with its kind alone.

Engines, rendering and libraries

  • -check-timeout (%check-bounds timeout=) is the smt engine's solver clock as well as the
    plan's.
    Each solver query runs under the check's timeout in place of OPENSYSML_SMT_TIMEOUT,
    so a check told it may run for 2m is no longer left not covered by a query the solver's own
    10 s default cut short; the solver bound the result names is the clock the query ran under.
  • Every Mermaid flowchart subgraph states the flowchart's direction. An action rendering
    declared flowchart TD drew its containers' contents left to right, and a direction BT or
    RL was lost inside every container; each subgraph, nested ones included, now opens on the
    flow's direction. A tree draws containment as edges and is unchanged.
  • A library copy whose root package states only a short name is read as the library. A copy
    opening with standard library package <Occurrences> { fell through to user-document analysis
    and its elements took derived ids; the notation-side check now uses the name the symbol table
    registers the package under, as the graph-side check already did.
  • The landing page's four refereed-comparison cards lay out in one row of four on wide
    screens, two rows of two below that width and a single column on phones, instead of three and
    one.

Packaging

  • Linux amd64/arm64, macOS amd64/arm64 and Windows amd64 archives, sysml-grpc binaries with
    .sha256 sidecars, SHA256SUMS.txt and its cosign bundle are built by the release workflow from
    tag v0.8.1; opensysml-0.8.1-windows-amd64.msi installs sysml, sysml-lsp and sysml-grpc
    on PATH with Z3 as an optional feature. make static-check verifies the Linux binaries are
    statically linked, and the release and pull-request pipelines run it.
  • macOS binaries are not Developer ID signed or notarized, so a browser download trips Gatekeeper;
    macos-distribution.md
    gives the workarounds. Windows binaries are Authenticode signed through SignPath Foundation
    only once the signing request for this tag is approved.
  • The Python client stays at opensysml 0.5.0 (tag opensysml-v0.5.0); this release adds no
    wire field or RPC, so nothing on the client side changes. A client release is published
    separately.

Verification

The pre-tag gate of docs/project/releasing.md on the release commit (Go 1.25.0, Linux amd64):
gofmt -l . empty, go build ./... and go vet ./... clean, make lint, go test -race -count=1 ./... all 82 packages ok with the OMG training corpus and the three pilot corpora
required (OPENSYSML_REQUIRE_TRAINING_CORPUS=1 OPENSYSML_REQUIRE_PILOT_CORPORA=1) and no
corpus expectation moved, the SMT suite run against Z3, the documentation id, link and figure
checks, python3 scripts/changelog.py check and go run ./cmd/doc-counts -check clean, and the
VS Code extension's build and 110 tests green. 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 SonarCloud's quality gate.