Sysprose — Feature-Parity Matrix vs. Modern Tools
Generated: 2026-07-03
This document places the pure-browser SysML v2 modeling tool side-by-side with the
two reference classes of modern SysML tool: the incumbent commercial desktop
modeler (SysML v1 today with a v2 track) and the OMG-aligned open-source web
modeler. Each row is a capability that a modern SysML modeling tool
is expected to provide. The This tool column is a candid Yes / Partial /
— self-assessment, and the final column cites the actual test(s) that
exercise it (unit U, integration I, conformance C, server S, interop X,
end-to-end E). Test names match test/** and the verdict tables in
docs/TEST-REPORT.md.
Legend — Yes: capability present and (for us) test-covered; Partial: a representative subset is present / a facet is missing; —: not implemented; Not compared: no comparison with that reference tool was made, so no parity is claimed.
1. Modeling workspace & navigation
| Capability | Commercial desktop tool | Open-source web tool | This tool | Covered by test(s) |
|---|---|---|---|---|
| Model explorer / containment tree | Yes | Yes | Yes | E explorer-crud, E explorer-interactions (expand/collapse, create, rename, delete-cascade, reparent); U core.model (containment index) |
| Multi-view workspace / view tabs | Yes | Yes | Yes | E view-switching (all 17 tb-view-*); E diagram-create-connect |
| Per-metaclass tree type icons | Yes | Yes | Yes | iconFor() renders a category glyph per row (Explorer.tsx); E gui-navigation asserts .tree-icon |
| Explorer search / filter + hide-library + focus + breadcrumb | Yes | Yes | Yes | E gui-explorer (search + count, library toggle, ◎ focus/scope-to-subtree), E gui-navigation (breadcrumb path); selection-reveal keeps the two parallel trees in sync |
| Element search / query navigation | Yes | Yes | Yes (via API console) | E api-console2 (query → tabulated rows), U api.query/api.query2 |
| Cloud file storage | — | Yes (vendor) | Yes (optional: the user's own Google Drive, drive.file scope, on a deployment that configures it) |
E drive (against faked Google services: sign-in, Save to Drive as / Save / both keys, Recent, ?drive= links and the Picker grant, resource keys, conflicts by content checksum and each resolution, token renewal, view-only and trashed files, offline, a model JSON file opened unattached, a link whose open fails and Try again, sign-out revocation, guards); U drive (config, links, REST gateway, sign-in boundary, Picker, the Drive ▾ panel and strip); U store.reducers (google drive); U branding (the CSP admits exactly the hosts the feature contacts). Real Google is to be checked by hand, not in CI — not yet run (docs/TEST-REPORT.md §6 item 8) |
2. Graphical diagrams (view kinds)
| Capability | Commercial desktop tool | Open-source web tool | This tool | Covered by test(s) |
|---|---|---|---|---|
| BDD / General (definitions view) | Yes | Yes | Yes | U diagram.build; I pipeline.diagram; E view-switching (view-general), E palette-per-view (general) |
| IBD / Interconnection | Yes | Yes | Yes | U diagram.build (nested parts, boundary ports, connections); E diagram-create-connect, E palette-per-view (interconnection) |
| Activity / Action flow | Yes | Yes | Yes | U diagram.build (actions + control nodes + successions); E view-switching (view-action), E palette-per-view (action) |
| State machine | Yes | Yes | Yes | U diagram.build (states + labelled transitions); E view-switching (view-state), E palette-per-view (state) |
| Sequence | Yes | Partial | Yes | U diagram.sequence (lifelines/messages/scoping); E view-switching (view-sequence → sequence-view SVG) |
| Requirement | Yes | Yes | Yes | U diagram.build (req + satisfier + satisfy edge); E view-switching (view-requirement), E palette-per-view (requirement) |
| Parametric | Yes | Partial | Yes | U diagram.parametric (constraint nodes, params, bind edges); E view-switching (view-parametric), E palette-per-view (parametric); E solve (tb-solve numeric solve + MoE results in Problems) |
| Use-case / Case | Yes | Yes | Yes | U diagram.case; E diagram-views3 (21-view-case), E palette-per-view (case) |
| Package / Tree | Yes | Yes | Yes | U diagram.build; I pipeline.diagram; E view-switching (view-tree), E palette-per-view (tree) |
| Allocation (matrix) | Yes | Partial | Yes | U diagram.matrix (rows×cols from Allocation/Satisfy); E view-switching (view-allocation → matrix-view) |
| Grid / table view | Yes | Yes | Yes | U diagram.grid; E diagram-views3 (grid-view rows/headers + row-select) |
| Geometry / spatial | Yes (3D/geometry module) | Partial | Yes | U diagram.geometry3d (pure buildGeometryScene: shapes from attrs.shape/library-shape typing, explicit vs. deterministic-3D-grid positions, sizes, colours, containment parentId, library exclusion, bounds); E geometry3d (real Three.js/WebGL <canvas> render + raycast click, 0 console errors); E view-switching/E diagram-views2 (view-geometry → geometry-3d). Real 3D WebGL view (Three.js, lazily code-split into a separate chunk) — was a 2D placement projection |
| Diagram auto-layout | Yes | Yes | Yes | U diagram.layout/diagram.layout2; I pipeline.diagram (all graph views); E toolbar-lifecycle (tb-layout) |
| Graphical model-interchange (standard file format) | Yes (native) | Yes (native) | Partial | OMG has not standardized a graphical interchange format for v2, but the modeler exports every laid-out diagram as a de-facto vector interchange: SVG (tb-export-svg → pure svgFromDiagram over the store's laid-out graph — each node in its SysML shape + «keyword»/name, each edge clipped to the shape borders with per-kind markers) and PNG (tb-export-png, browser canvas rasterisation of that SVG); U diagram.svg-export |
3. Authoring gestures
| Capability | Commercial desktop tool | Open-source web tool | This tool | Covered by test(s) |
|---|---|---|---|---|
| Palette-based element creation (per view) | Yes | Yes | Yes | E palette-per-view (node tool creates PartUsage/ActionUsage/StateUsage/RequirementUsage/ConstraintUsage/UseCaseUsage/Package across 9 views) |
| Connection drawing (click-to-connect) | Yes | Yes | Yes | E palette-per-view (edge tool wires Specialization/ConnectionUsage/Succession/TransitionUsage/Satisfy/BindingConnector/Include); E diagram-edges (edges render) |
| Tree context create / delete | Yes | Yes | Yes | E explorer-crud, E explorer-interactions (tree-add, tree-delete, metaclass picker) |
| Drag-drop tree reparent | Yes | Yes | Yes | E explorer-interactions (HTML5 dragstart/dragover/drop reparents in the model); U core.model (cycle-guard) |
| Manual node move (drag on canvas) | Yes | Yes | Yes | E diagram-node-drag (mouse drag persists position via onNodeDragStop); saved with the browser project, never in its text, and put back by Open ▾, through an apply of text too: E persistence-reload (a box moved by hand is saved with the project…), U store.reducers (boxes moved by hand — kept with the project in this browser, never in its text) |
| Inline rename (dblclick, Enter/Escape) | Yes | Yes | Yes | E explorer-interactions (dblclick→Enter commits; Escape cancels); E text-sync |
| Properties / specification editing | Yes | Yes | Yes | E properties-all-fields (name, shortName, type, value, multiplicity, direction, reqId, text, trigger, guard, effect, doc); E properties |
| Undo / redo | Yes | Yes | Yes | E undo-redo; E keyboard-shortcuts (Ctrl/⌘+Z, +Y, +Shift+Z) |
| Keyboard shortcuts | Yes | Yes | Yes | Undo/redo/save, delete, duplicate, copy/paste, view digits 1–6 and / to search, all wired in src/ui/commands.ts:198-310 (E keyboard-shortcuts, E gui-keyboard); listed for a reader in USER-GUIDE.md Appendix B, and U user-guide fails on a shortcut LABELLED but not handled |
| Real-time multi-user collaboration | Partial (server product) | Yes (live web sessions) | Yes | Yjs CRDT co-editing + live presence: E collab (two browser contexts, same room, auto-connect → element created in one converges into the other's model + Explorer, and a remote selection lights up a peer-coloured highlight; roster shows ≥2 participants, 0 console errors); U collab.binding (deterministic Model↔Y.Doc CRDT convergence: add/update/remove/reparent/attrs, offline-then-merge). Open rooms (academic use, no auth); browser client = WebsocketProvider + y-indexeddb + awareness, relayed by the Node-only npm run collab server |
4. Textual notation
| Capability | Commercial desktop tool | Open-source web tool | This tool | Covered by test(s) |
|---|---|---|---|---|
| Textual SysML v2 notation editor | Partial | Yes | Yes | E text-sync, E panels-problems-text (text-editor, text-apply, dirty status) |
| Text → model parse | Partial | Yes | Yes | E panels-problems-text (Apply adds part def Gearbox); U langium.grammar, U text.parser |
| Model → text serialize (live regen) | Partial | Yes | Yes | E text-sync, E panels-problems-text (rename regenerates text); U text.roundtrip |
| Bidirectional sync + round-trip stability | Partial | Yes | Yes | I pipeline.roundtrip; C roundtrip (all standard models); C corpus (100% real-corpus parse, 0-error) |
| Grammar coverage vs. OMG BNF | n/a | Substantial | Substantial | scripts/grammar-coverage.ts (94/94, 100% of corpus); Langium default parser |
5. Analysis, validation & execution
| Capability | Commercial desktop tool | Open-source web tool | This tool | Covered by test(s) |
|---|---|---|---|---|
| Model validation + navigable diagnostics | Yes | Yes | Yes | E validation, E panels-problems-text (Validate → problem-row → selects element); U validation.rules (27 rules, 87 cases) |
| Constraint / requirement checking | Yes | Partial | Yes | E simulate-check / E toolbar-lifecycle (tb-check → constraint-check rows); U semantics.constraints |
| Behavioral simulation / execution | Yes (simulation toolkit) | Partial | Yes (fuller) | Deepened token-flow engine: composite/call sub-behaviors (recursive, depth-bounded, enter/exit + result params), object/item-flow data passing between pins, hierarchical state machines (composite entry/exit cascade, history resume), orthogonal regions with completion join, and timed after(n) transitions on a discrete clock; unified executeBehavior. Now driven from an interactive simulation panel (step / play-pause / seek a trace, inject events, live active-state highlight on the state diagram, plus a per-sample value plot). E simulate, E execution, E gui-simulation (tb-simulate composite trace + produced data + stepper UI), E simulate-check; U simulate, U semantics.execute/execute-full/execution-full; I execution.integration, I semantics-exec.integration |
| Parametric / equation solving | Yes | Partial | Yes | Numeric constraint solver + MoE evaluation + optimization, now with inequality + feasibility constraints (U semantics.solver, U semantics.solver-ineq, I analysis.integration, E solve — tb-solve solves the chain, propagates bindings, converges coupled systems, evaluates MoEs, optimizes over bounded variables subject to inequality constraints, and reports feasibility + violated constraints); gatherInequalities normalises comparison bodies (<,<=,>,>=) to g(x)<=0, solveFeasible finds a penalty-minimising feasible point, checkConstraintsNumeric flags violations for the Check/Problems surface; a design freedom the equations leave open (a null direction of their Jacobian at the solved point) is reported as free, never published as a value or judged at the point the solve stopped at, and solveFeasible says whether its answer is decided; the solver is unit-aware — relations are scaled to SI behind four gates that compare DIMENSIONS (so a length against a duration is refused, not answered), values stay in their declared unit, slack carries its SI unit, a scaled relation is solved and judged relative to its own SI magnitude, and a body's [unit] literals are lowered instead of dropped, so a relation either agrees with the validation surface or is reported unknown on both (U semantics.solver-units — a unit-aware, number-level agreement suite: solved values, slack + unit, convergence, feasibility; I uav-example runs the shipped example through both surfaces); constraint evaluation + report (U semantics.expr, U semantics.constraints) |
| Unit / quantity / dimensional analysis | Yes | Partial | Yes | E properties-all-fields (prop-dimension, prop-unit-convert kg→t = 1.5); U semantics.units, I units.integration |
| Verification checks run from the diagram's palette | Not compared | Not compared | Partial | The palette's Checks section lists, per view, the commands that fit it, each with Run and Copy command (the same check for a terminal). The model checks run in the page against the model on screen and land in the Checks tab: a finding selects its element, a result goes stale after an edit, and contracts and obligations narrow to the selection as --element does and say when they cover the whole model; reach and check-behaviour walk a state machine in a background worker with a Cancel. The five solver-backed checks (verify, consistency, bounds, refine, fault-tree) give their command and not here, never a verdict, because z3 needs a cross-origin-isolated page, which the GitHub Pages deployment cannot give. E palette-checks (a model check runs here, lands in the Checks tab and goes stale on an edit; a finding selects its element; a solver check offers its command instead of a verdict it cannot give; every view has a palette; a state-machine check runs in a worker and Cancel ends it); U checks-registry (every entry names a real CLI subcommand and its copied command is the one it runs; a check that throws becomes a finding, never a pass; a solver check is never reported as passed on a page that cannot run one; the worker gives the answer the page gives) |
| Reachability marks on the state diagram | Not compared | Not compared | Yes (State view) | After Reachability runs, the State view puts the walk's findings on the diagram: one badge per state (unreachable, not decided, not walked, withheld, no way out, trap, choice, in a fixed precedence) and dead or undecided on a transition, with a status panel (behaviour-marks) that counts them and the answers the walk withheld, and a Marks section in the legend. Marks are painted only for a result of the current model, on the State view; an edit (the panel then says the model changed), Hide marks and an open witness each hide them. E palette-checks (nothing is marked before Run; the marks show findings, withheld, not-decided and not-walked beside the simulation glow); U checks-registry (the state-view marks and the status panel: the mark precedence, a dead transition and an undecided guard marked on the edge itself, nothing painted on a stale revision, off the State view or with the marks hidden) |
| Witness stepper: the run behind a behaviour verdict, stepped on the state diagram | Not compared | Not compared | Yes (State view) | A fail or covered result of Behaviour properties lists its witness as steps in the Checks tab. A click on a step, or Prev / Next, switches to the State view and paints that step of the checker's walk (the current state, its stack and the states already passed), and hides the reachability marks and the simulation highlight until Close. A step is the run the walk found, never a simulation, and the panel says so; stepping starts no simulation session, leaves a running one where it was, and does not move the selection. E palette-checks (witness steps paint the state view and leave a live simulation and the selection alone; a failing property shows its every run? line and its witness steps); U checks-registry (the witness stepper: a witness compacts to the terminal's trace rows, a cover the walk saw whole has none, the steps render as buttons with Prev / Next / Close and never select, and the witness path never constructs a SimulationSession) |
The last three rows (the palette's checks, the reachability marks and the witness stepper) describe this tool's own surface. Their two comparison columns say "Not compared": no comparison with another tool was made, and none is implied.
6. Libraries, data & interoperability
| Capability | Commercial desktop tool | Open-source web tool | This tool | Covered by test(s) |
|---|---|---|---|---|
| Standard model libraries (KerML/ISQ/SI…) | Yes | Yes | Yes (full) | U library.load, I full-library.load/full-library.resolve (38,761 elements / 98 packages) |
Import .sysml textual |
Partial | Yes | Yes | E import-export (import replaces model); U persistence.io |
Export .sysml textual |
Partial | Yes | Yes | E toolbar-lifecycle, E import-export (tb-export-sysml → package VehicleModel; the Text view's text, without the merged standard library, imported back to the same model); I persist-api.persistence |
| Native model JSON import/export | Yes (project files) | Yes | Yes | E toolbar-lifecycle (tb-export-json + import round-trip); U persistence.io |
| OMG element-graph JSON (API interchange) | Yes (API) | Yes (API) | Yes | E toolbar-lifecycle (tb-export-api-json); U persistence.io (idempotent, OMG shape); C roundtrip; I persist-api.persistence (the full library re-imported, its 268 aliases included) |
| JSON-Schema validation of interchange | Partial | Partial | Yes | C scorecard (docs/CONFORMANCE.md): api-json validates against OMG element-graph schema |
| FMI 3.0 interop + co-simulation (fmi-standard.org) | Yes (with physics FMUs) | — | Yes (browser-native subset) | Export a block → FMI 3.0 modelDescription.xml / STORED .fmu (E gui-fmi-export, U fmi-export); import an external engine's modelDescription/.fmu → SysML block (E gui-fmi-import, U fmi-import); a fixed-step Jacobi co-simulation master couples FMU instances on one clock — a SysML block runs as an FMU via the parametric solver, alongside analytic FMUs, with a WASM fmi3 FMU as the documented plug-in point (U fmi-cosim, 21 cases). No native/physics FMU execution (a browser can't run a .fmu's native binary) |
7. API, services & versioning
| Capability | Commercial desktop tool | Open-source web tool | This tool | Covered by test(s) |
|---|---|---|---|---|
| Programmable API / automation SDK | Yes (Open API/macros) | Yes (Java services) | Yes | E api-console/api-console2 (window.sysml live SDK); U api.sdk; I persist-api.sdk |
| In-app data-analysis console | Partial | Partial | Yes | E api-console2 (api-query/api-run, api-metrics, api-satisfaction, api-whereused) |
| Query language (operators, paging, orderBy) | Yes | Yes | Yes | U api.query/api.query2 (operators, matches, cursor/offset paging, orderBy) |
| REST API server (OMG API & Services) | Yes (pilot) | Yes | Yes | S api-server (live HTTP/Express); C api-contract (10/10 endpoints vs OpenAPI 3.1.1) |
| OpenAPI contract conformance | Partial | Partial | Yes | C api-contract (22 checks) |
| OSLC PSM (catalog / query / shapes) | Yes (plugins) | Partial | Yes | U api.oslc; S oslc-rdf/oslc-shapes; C oslc-conformance (Turtle/RDF-XML/JSON-LD + ResourceShape) |
| Interop with OMG pilot reference API | Yes | Yes | Partial | X self-roundtrip (self round-trip over HTTP); live pilot read 300 elements + write a Package (docs/CONFORMANCE.md §6). Representative, not full-model migration |
| Versioning: projects/branches/tags/commits | Partial (server product) | Partial | Yes | U api.versioning, U api.rest2 (branches/tags/commits/history); E api-console2 (commit advances head, lists ids) |
| Commit diff | Yes | Partial | Yes | U api.versioning (added/removed/changed) |
| 3-way merge / branch merge | Yes | Partial | Yes | In-UI Versions tab drives the engine: E merge (commit → branch → divergent edit → conflicting edit → merge with theirs produces a merge commit + reports the per-element conflict; manual reports conflicts and produces no commit); U api.versioning (3-way merge over common ancestor, ours/theirs/manual, change-change/change-remove conflicts) |
| Concurrent-writer serialization | Yes (server) | Yes (server) | Yes | S concurrency/concurrency-full |
8. Deployment posture (context)
| Capability | Commercial desktop tool | Open-source web tool | This tool | Notes |
|---|---|---|---|---|
| Runs fully in-browser, offline, static-hostable | — (desktop) | — (server-backed) | Yes | Entire engine/API/persistence is client-side; the optional Drive feature talks to Google's APIs from the browser, with no server of ours; E2E runs against a static vite preview build with no app server |
| Optional networked REST/OSLC server | Yes | Yes | Yes | src/server Express adapter, exercised under test/server |
Summary — where we stand vs. the modern tools
At parity (Yes, test-covered): model explorer with full CRUD + drag-reparent;
17 diagram view kinds with auto-layout; palette element creation and
click-to-connect across 9 views; manual node drag; properties/specification
editing of every field; undo/redo; textual notation with live bidirectional sync
(Langium, 100% corpus parse); 27-rule validation with navigable diagnostics;
constraint checking, behavioral (action + state) simulation driven from an
interactive stepper/playback panel (step, play-pause, seek, inject events,
live active-state highlight + value plot), a numeric
parametric constraint solver with measure-of-effectiveness evaluation,
inequality + feasibility constraints, and constrained gradient-free
optimization (tb-solve), and an FMI 3.0 interface (export/import
modelDescription/.fmu + an in-browser fixed-step co-simulation master);
full standard
libraries (38.8k elements) with unit/dimensional conversion; .sysml / model-JSON
/ OMG element-graph import & export; a programmable SDK + in-app analytics
console; a networked REST server validated against OpenAPI 3.1 plus an OSLC
PSM; and Git-like project/branch/tag/commit versioning with diff and an in-UI
3-way branch merge (Versions tab: commit, branch, switch, and merge with
ours/theirs/manual conflict resolution); and real-time multi-user
collaboration (Yjs CRDT co-editing + live presence: a Collaborate toolbar
control joins an open room, mirrors the live model through a Y.Doc, and shows
remote peers with per-peer colours + remote-selection highlights — E collab
two-context convergence, U collab.binding deterministic CRDT merge). On
offline, static-hostable, pure-browser deployment we exceed both
reference tools (the commercial one is desktop; the open-source one is server-backed).
Present here, not compared: the palette's Checks, which run the model checks in the page,
with reachability marks and a witness stepper on the State view (E palette-checks,
U checks-registry). No comparison with the two reference tools was made, so no parity is claimed.
Partial (candid): the geometry view is now a real interactive 3D WebGL scene
(Three.js: orbit/zoom, per-part solids, raycast selection), though it renders
primitive solids (box/sphere/cylinder) from model attributes/shape typings rather
than full CAD B-rep geometry (commercial tools integrate a richer CAD kernel);
behavioral execution now covers composite/call actions,
object/item-flow data passing, and hierarchical/orthogonal/timed state machines
(a fuller subset, still not a whole commercial simulation toolkit); FMI co-simulation
is present as a fixed-step Jacobi master over the parametric solver and analytic
FMUs, but cannot execute a real .fmu's native/physics binary in the browser —
that plugs in only via a WASM-compiled fmi3 FMU behind the Fmi3Instance interface;
pilot-API interop is a representative exchange
(read 300 real elements + write a Package), not a full-model migration;
and, of the palette's checks, the five solver-backed ones (verify, consistency, bounds, refine,
fault-tree) give the command to run and not here, never a verdict, because z3 needs a
cross-origin-isolated page, which the GitHub Pages deployment cannot give.
Not implemented (—): a standardized graphical diagram-interchange file
format (none exists for OMG v2) — though diagrams now export as de-facto SVG
and PNG vector/raster interchange (tb-export-svg/tb-export-png). Real-time multi-user collaboration — previously
the headline gap — is now implemented (Yjs CRDT + live presence, open rooms
for academic use). The remaining gap is the honest one, mirrored in
docs/TEST-REPORT.md §6.