v0.1.1: Fix Release
A fix release. Every change corrects something 0.1.0 got wrong about a valid model, so a model
0.1.0 rejected or misread may analyze differently here. Nothing was renamed and no interface
changed.
Install: go install github.com/Open-MBEE/OpenSysML/cmd/sysml@v0.1.1, or take a platform archive
below. The Python client opensysml is released separately.
The OMG training corpus reports no errors
- Every definition body inherits the features of the library definition its kind implies. Only
behavior definitions had an implicit base, sosnapshot sale = start;inside apart def
reportedunresolved reference: starteven thoughItems::Itemdeclaresstartanddoneand
Parts::Partredefines both. Two corpus files previously recorded as "bugs in the OMG files" —
Time Slice and Snapshot Example and Individuals and Time Slices — were never buggy; the
corpus baseline now lists no files at 100/100 clean. - A member that reuses an inherited feature's name is now reported instead of shadowing
silently:part def C { part start; }conflicts withParts::Part::start. Redefine it to keep
the name —part start :>> Parts::Part::start;. - A qualified redefinition of an inherited library feature is accepted.
snapshot start :>> Parts::Part::start;was rejected as "not an inherited member" when the
supertype came back from the index cache. Redefining a feature the owner does not inherit is
still reported. - A definition may specialize a definition of a comparable kind.
individual item def Alice :> Personwas refused becausePersonis apart def; specialization now follows the definition
taxonomy. Disjoint kinds — a part definition and an attribute definition — are still refused. - A transition may leave the entry action of the state that declares it.
entry action begin { } transition begin then off;reported the action as "not a state or pseudostate"; it now
designates the machine's initial state and executes as such, and is rendered in a view that
exposes it. Only that bare completion shape designates a start — a triggered or guarded
transition out of an entry action, a transition into one, and a name reaching another state's
entry action or a junction are reported rather than accepted with the trigger, guard or effect
dropped. - A metadata usage ends at its own
;or body.@M part def Car;was read as an annotation
plus an undiagnosed declaration;#M part def Car;is the prefix spelling. A metadata usage
member also names a type, so@Securty;reports an unresolved reference instead of going
unchecked, and@M;now parses in a namespace, a body and a state body. - A value part accepts every operator the grammar allows —
= expr,:= expr,
default expr,default = expr,default := expr— wherever a usage, parameter, result or
subject binds a value. - The REPL prints a syntax warning once, not once per deferred analysis.
A rendering read at a terminal
sysml -renderwrites the text form at a terminal and the machine-readable form of the kind
rendered — Mermaid for a diagram, Markdown for a table — into a file or a pipe.
sysml m.sysml -render Views::tableshowed a Markdown table on screen.> table.md,| tool,
-o table.mdand-render-formare unchanged.- The text form is ASCII. The rendering header and connection edges used an em dash, which an
ASCII-only terminal showed as a replacement character. - A text table is written to fit the terminal, wrapping an over-wide cell rather than
truncating it or overflowing the window, and narrowing no column below 8 characters. A table
written to a file or a pipe keeps every column as wide as its widest cell, so a saved artifact
does not depend on the window it came from.
RDF conversion (experimental)
RDF stays experimental: expressions are still carried as source text, ownership is collapsed rather
than materialized as membership elements, and no round trip against a triplestore has been run yet.
Two changes land here.
- Element IRIs now carry a reversible encoded id instead of the raw qualified name.
Demo::Vehicleis written asurn:sysmlv2:element:Demo__Vehicle:::becomes__,_itself
escapes to_5f, and any other byte outside[A-Za-z0-9-]becomes_plus two hex digits, so
the id is unique, reversible and inside the[a-zA-Z0-9_-]+character set that a SysML v2 API
service requires of an element id. Element identity is read from thesysml:qualifiedName
literal rather than reconstructed from the IRI, so a.ttlwritten by 0.1.0 still reads back —
but a graph re-exported from 0.1.1 has different subject IRIs, and anything matching those IRIs
by string needs updating. - A reference to an element the graph does not describe is reported with a typed diagnostic
instead of crashing the converter. - A metadata usage member is refused with a typed diagnostic rather than written as an
annotation on a different element.
Documentation and internal quality gates
docs/is published as a documentation site built with MkDocs, with the build run in strict
mode in CI so a broken link or a missing page fails the check rather than shipping.- The generated SysML OWL ontology table is checked into the tree, with a domain/range gate
over the exported graphs, derived from the Open-MBEE SysML v2 RDF ontology's 411 property
declarations. It ships with a committed inventory of the graph shapes that do not yet conform,
so the remaining work is recorded rather than hidden. - Static analysis runs on every build through SonarCloud, scoped to hand-written source with
coverage wired in. The one vulnerability it reported is fixed: the ontology table generator no
longer resolvesgitthroughPATH, reading the checkout's Git metadata directly instead
(loose refs,packed-refs, detached HEAD, worktrees, and SHA-1 or SHA-256 object ids). The
generated table is byte-identical, so no recorded commit id changed.