This document lists planned work — what we intend to change and notes on how to change it. It is deliberately limited to work to be done.
The work falls into three themes:
- Notation & view conformance — bring rendered output in line with SysML v2 graphical notation and finish the remaining view dynamics.
- Release & packaging — self-validation coverage, package validation, and licensing/attribution.
- Model query & analysis — further AI-analysis options beyond the completed dynamic
(ad-hoc) views and
exportverb features.
The drone gallery model already has one expose-narrowed view (BatterySubsystemView { expose Battery; }, documented in docs/gallery/README.md section 1b). This follow-up adds several
more expose/filter-narrowed views spotlighting one relationship kind each, instead of one
flat whole-workspace General View plus a single subsystem view:
- A power/data subsystem view (
expose PowerSubsystem;) showingconnectedges between ports. - A requirements-traceability view (
filter @Requirement;or anexposed requirement) showingallocateedges from requirements to parts. - A subsystem-boundary view showing cross-subsystem
dependencyedges without full implementation detail. - A variant/specialization view showing
subsetsalongside the existing redefinition example.
This also exercises --filter's metadata classification-test path (e.g. tagging parts with
@Critical/@Requirement metadata) rather than only the bracket/expose-subtree path the
gallery currently shows.
Scope: docs/gallery/models/01-drone-general.sysml (or a new model file), regenerated SVGs,
docs/gallery/README.md.
Fork/join/decision/merge control nodes and the compact action a1; then a2; succession idiom
already render correctly. Remaining gaps, each independently scoped:
- A true pentagon accept/send shape (needs a
DemaConsulting.Renderingpackage change; boxes currently use the ordinary rounded-rectangle shape with their own keyword label instead). - Swim-lanes via
LayoutBand. - Item-flow edge annotations (no item-flow/payload capture exists in the AST yet).
assignmentNode/terminateNode/ifNode/whileLoopNode/forLoopNodeAST support (still entirely unmodeled).- An
actionUsage-level (rather thanaction def-level) nestedactionBody—VisitActionUsagestill doesn't collect nested action-body children, so control nodes/ successions nested inside anaction x : T { ... }usage (as opposed to anaction def X { ... }body) remain invisible.
- Populate
LayoutActivationexecution bars; combined-fragment boxes (alt/opt/loop); async/reply message styling. - Sequence dynamic-view compatibility check (known limitation of
DynamicViewSynthesizer, the Core Rendering Internal subsystem behindrender --view-type <kind> --view-target <qualified-name>): its--view-type sequencepre-check accepts any target with at least one nestedmessageusage (the cheap, necessary-but-not-sufficient approximation of "at least one lifeline" — the AST has no dedicated lifeline node, so a full message-edge-walk validation was deliberately not implemented). A target with lifelines but zero resolvable messages passes this pre-check yet still renders the near-blank canonicalLayoutTreesentinel. Closing this gap requires either a full message-edge-walk validation inDynamicViewSynthesizeror surfacingSequenceViewLayoutStrategy's own lifeline-resolution result back to the synthesizer.
Scope: SequenceViewLayoutStrategy, renderer shape primitives (note). LayoutActivation
already defined.
Visual gate: sequence shows activation bars + a fragment.
InterconnectionViewLayoutStrategy now resolves a connection endpoint's full dotted reference
(e.g. board.cpu) for its port label, so a cross-boundary reference shows the true nested
target's name instead of discarding it. The connector line itself, however, still terminates at
the containing part's own box boundary rather than routing all the way into the nested container
to the inner part — genuine cross-boundary routing would require restructuring
LayOutInterior's per-level independent LayeredPlacement.Place calls into one connected nested
LayoutGraph/LayoutGraphNode.Children for the affected subtree, using the companion
DemaConsulting.Rendering package's boundary/delegation-port (HierarchyHandling.Recursive)
support end-to-end, instead of the strategy's current two-independent-layouts-stitched-together
recursion.
Scope: InterconnectionViewLayoutStrategy's LayOutInterior/CollectParts recursion;
possibly a new LayeredPlacement entry point that builds a genuinely nested LayoutGraph.
Visual gate: connect psu to board.cpu; renders a connector line that visually terminates on
the inner cpu box, not the board container's boundary.
Downstream projects run sysml2tools --validate in their own environment as tool-qualification
evidence, and the win/mac/linux integration-test matrix runs it per-OS. Validation.cs already
runs 9 tests following the SysML2Tools_{Capability}SelfTest naming convention: version, help,
lint, SVG render, PNG render, dynamic-view SVG/PNG render, dynamic-view filtered render, and
export — but every render test (SVG, PNG, and dynamic-view) exercises only the General View
(SelfTestModel's GeneralView). Add one SVG+PNG-validating test per remaining view kind so
SkiaSharp native assets and each view's layout strategy are exercised on every OS:
| Test | Proves |
|---|---|
SysML2Tools_RenderInterconnectionViewSelfTest |
ports/connectors → SVG + PNG |
SysML2Tools_RenderStateTransitionViewSelfTest |
states → SVG + PNG |
SysML2Tools_RenderActionFlowViewSelfTest |
layered actions → SVG + PNG |
SysML2Tools_RenderSequenceViewSelfTest |
lifelines → SVG + PNG |
SysML2Tools_RenderGridViewSelfTest |
matrix → SVG + PNG |
SysML2Tools_RenderBrowserViewSelfTest |
tree → SVG + PNG |
Validity is asserted (well-formed SVG root; PNG signature + non-zero dimensions), not exact
bytes, so the evidence is robust across environments. SelfTestModel will likely need extending
with the minimal constructs each view kind requires (ports/connectors, states, actions,
messages, etc.) alongside its existing part defs.
build.yaml already runs dotnet pack for all packages and installs the packed tool as part of
CI. It also runs FileAssert [package]-tagged size and zip-content assertions (.fileassert.yaml)
against the packed Tool .nupkg right after dotnet pack, guarding against the historical 435 MB
size bloat and verifying the main assembly/README are present with no stray native symbols. Still
open:
- Tool smoke test: install the packed tool from a local feed into a clean directory → run
--version, render a sample to both SVG and PNG (PNG proves SkiaSharp natives resolve), and--licenses. - Library-consumer smoke test: a throwaway project referencing each library package from the
local feed → restore → exercise parse→layout→render-to-SVG-in-memory and render-to-PNG (again
proving SkiaSharp natives for
.Pngconsumers).
- Licensing/attribution:
--licensesoutput covering Noto Sans (SIL OFL 1.1) and other OTS; per-package README notes incl. the SkiaSharp native-assets requirement forDemaConsulting.SysML2Tools.Pngconsumers. - Documentation: README and User Guide state that the Geometry View is not yet supported.
Finalise the layout-algorithm reference in
docs/and wire it into CI (build.yaml,.fileassert.yaml,.reviewmark.yaml). - Gallery & packaging: regenerate the gallery against the final notation and refresh
docs/gallery/README.md; set version metadata, package descriptions/icons/tags, and release notes (generated from commit messages via the build notes). - Publish: final full-suite validation; tag; publish the four NuGet packages; create the GitHub release with notes and gallery highlights. Publishing requires maintainer authorization (credentials, irreversible) — prepared to the edge of publish, then handed off.
SysML v2 is emerging as a substrate for AI-verified engineering: a machine-readable, semantically
resolved model of a system's structure, behavior, requirements, and traceability. An AI agent
changing or reviewing code could re-derive all of that by reading raw source — or it could ask
SysML2Tools targeted questions and get small, authoritative, token-cheap answers. This theme
extends SysML2Tools's model query and analysis capabilities beyond the existing query and
export commands, and the DemaConsulting.SysML2Tools.Core public Query library API.
Lower-priority options that further support AI analysis of a model; each is independently scoped and gated, and any may be pulled forward or dropped:
--format sarifforlint—SysmlDiagnosticis already structurally SARIF-compatible; emitting SARIF lets AI/CI toolchains consume lint findings through standard tooling.- Metrics / summary query — workspace-level counts and hotspots (most-depended-on elements, unverified requirements, orphan elements, cyclic specialization) to orient an AI before it starts, and to flag model-health issues in review.
diffof two workspaces — structural/semantic delta between two model revisions (added / removed / changed elements, edges, and requirement traces) so an AI reviewing a change sees the model-level impact of a PR, not just the text diff.- Machine-readable
--format jsoneverywhere — extend the shared formatter so every command (not justquery/export) can emit JSON, keeping the CLI uniformly scriptable.
Not planned yet; listed so the boundary is explicit:
- Geometry View — the 8th view: 2D spatial placement (3D projected to 2D) of items whose spatial coordinates are specified in the model via the SysML geometry/spatial library. Requires new semantic capability (extracting numeric attribute values, not just structure) and a coordinate convention plus test models that use it. Until it ships, the README and User Guide document it as not yet supported.
- 3D Geometry rendering (2D projection only, even once Geometry ships).
- Loadable theme files (YAML/JSON) — the
Themerecord is forward-compatible. - Nested state regions and other advanced behavioral notation.