sysand add hugoormo/sysmlv2-sandbox
A SysMLv2 sandbox based on Eve Online. Eve Online sets the backstage for experimenting with SysMLv2 with support of AI (Large Language Models) given the extensive freely open documentation available and the possibility to experience first hand the systems to be modelled. Experience in the game, even limited to a basic tutorial, is needed to understand the models. The game is Free-to-Play at eveonline.com.
This package is the approved baseline of a larger modeling effort. You do not edit it: you build your own project on top of it, as a contributor to a large programme builds on the released main branch.
The model follows one thread from a business goal down to the products that are bought off the shelf: a mining corporation needs its pilots to earn a competitive income; that need is broken down into the mining rate of a Venture-class mining frigate, then into its mining lasers, its yield enhancer, its ship controller and processor, and its power subsystem, until every branch ends in a component or a commercial off-the-shelf (COTS) product.
On the way the model shows:
The model is structured by the Recursive Architecture Wave Pattern (RAWP), by Hugo Ormo: the same blackbox → graybox → whitebox wave repeats at every level, and each level hands its children their needs.
The RAWP Framework is copied into Framework/ and tailored: the operational level does not use UAF, so it is built from the same kind of files as the other levels.
Level 0 - MiningOperations/MiningOperations_LifeCycleConcepts.sysml: why the operation exists and what makes it profitable.Level 0 - MiningOperations/MiningOperations_Requirements.sysml and _AnalysisCases.sysml: the pilot income requirement and how it is split into budgets.Level 0 - MiningOperations/MiningOperations_Configuration.sysml: the operation's context, which your project extends.Level 1 - Systems/MiningFrigate/MiningFrigate_Configuration.sysml: the frigate's blackbox, graybox, and whitebox, and its released configurations.Level 2 - Subsystems/MiningLaser: a subsystem realized by COTS products, with their states.Level 2 - Subsystems/ShipController: a designed leaf with its own behavior.Level 2 - Subsystems/PowerSubsystem and its components in Level 3 - Components: a subsystem decomposed one level further._VerificationCases files: how each requirement is verified.Today every mining frigate warps back and forth to a refinery to unload its ore. The ConOps captures that loss only as an assumption: the logisticsEfficiency of the operation (the time the frigates lose to hauling) is a scenario value.
Your task is to design a transport ship that collects the ore in the belt, so the frigates keep mining. That is a new solution on the existing set-up:
Treat it as exploratory work that a change control board (CCB) would review: once approved, it would become a new doctrine of the corporation.
You need sysand and the Syside CLI.
mkdir transport-ship && cd transport-ship
sysand init --publisher <your-name> --name transport-ship
sysand add hugoormo/sysmlv2-sandbox "^1.0.0"
The version constraint ^1.0.0 pins your project to the 1.x baseline: it accepts any 1.x release and never a 2.0.0, which may change the baseline in ways your model must follow. sysand-lock.toml records the exact version you use.
sysand add installs the sandbox under .sysand/lib/, where you can read it. Do not edit it there: your work goes in your own files.
Create your files in the same folder and package scheme as the sandbox:
Level 0 - HaulingOperations/HaulingOperations_Configuration.sysml
Level 1 - Systems/TransportShip/TransportShip_Taxonomy.sysml
Level 1 - Systems/TransportShip/TransportShip_Configuration.sysml
Your packages share one namespace with the sandbox's, so never reuse a sandbox package name (e.g. do not create your own MiningOperations_Configuration).
The transport ship is a new L1 system: a taxonomy collection and a context with its blackbox.
package TransportShip_Taxonomy {
doc
/* The vocabulary of the transport ship. */
abstract part transportShips subsets MySystemOntology::systems [0..*] {
doc
/* The transport ships that haul ore from the mining frigates to the refinery. */
}
}
package TransportShip_Configuration {
doc
/* The transport ship is described in this package. */
private import MyFramework::MyFrameworkSystemArchitecture::**;
part def TransportShipContext {
doc
/* Context of the transport ship. */
#BlackBox part transportShip_bb subsets TransportShip_Taxonomy::transportShips [1] {
doc
/* The transport ship as a whole. */
}
}
}
You cannot change MiningOperationsContext, but you can specialize it.
Your context inherits everything the sandbox has (the frigate, the pilot, the asteroid belt, the requirements, the whitebox integration) and adds the transport ship:
it mounts the ship's context, adds the ship to the graybox, and carries it into the whitebox.
package HaulingOperations_Configuration {
doc
/* The mining operation extended with a transport ship that hauls the ore. */
private import MyFramework::MyFrameworkSystemArchitecture::**;
part def HaulingOperationsContext specializes MiningOperations_Configuration::MiningOperationsContext {
doc
/* The mining operation of the sandbox, extended with a transport ship. */
part transportShipContext defined by TransportShip_Configuration::TransportShipContext [1] {
doc
/* The mounted L1 configuration of the transport ship. */
}
#GrayBox part miningOperation_gb redefines miningOperation_gb {
doc
/* The mining operation decomposed into its constituents, now including the
* transport ship.
*/
part transportShip subsets transportShipContext.transportShip_bb [1] {
doc
/* The transport ship that hauls the ore. */
}
}
#WhiteBox part miningOperation_wb redefines miningOperation_wb subsets miningOperation_gb {
doc
/* The integration of the mining operation, now including the transport ship. */
part transportShip redefines HaulingOperationsContext::miningOperation_gb::transportShip {
doc
/* The transport ship's contract. */
}
}
}
}
Two details matter:
subsets miningOperation_gb, which inside your context is your redefined graybox.sysand only knows the files you include. Include each new file once, then check your project together with the sandbox:
sysand include "Level 1 - Systems/TransportShip/TransportShip_Taxonomy.sysml"
sysand include "Level 1 - Systems/TransportShip/TransportShip_Configuration.sysml"
sysand include "Level 0 - HaulingOperations/HaulingOperations_Configuration.sysml"
sysand sources | tr '\n' '\0' | xargs -0 syside check
If syside check reports "No files found", it has checked nothing: a file is not included yet.
From here, follow the wave the sandbox shows, level by level:
HaulingOperations_LifeCycleConcepts.logisticsEfficiency assumption into the transport ship's contribution, and show the effect on the pilot's income.Level 1 - Systems/TransportShip and below.HaulingOperationsContext), as the sandbox's MiningOperationsConfigurations does, and verify it.Values the sandbox binds with = are commitments of the baseline and cannot be redefined. Values it gives with default are assumptions you may redefine in your own context. The assumptions are the operating conditions of the two nominal scenarios, lowSecNominalScenario and highSecNominalScenario in MiningOperations_AnalysisCases::MiningOperationsAnalysisContext, logisticsEfficiency among them. A redefinition in your own analysis context is a new scenario, not a change to the baseline:
part def HaulingAnalysisContext specializes MiningOperations_AnalysisCases::MiningOperationsAnalysisContext {
attribute redefines lowSecNominalScenario {
attribute redefines logisticsEfficiency = 1.0;
}
}
These are the conventions the sandbox follows, and your project should follow them too.
The normative text is the Framework itself: each section names the Framework rules it follows (search Framework/Framework.sysml for the rule name).
| Folder | Holds |
|---|---|
Framework/ |
The tailored RAWP Framework and Ontology, the COTS library, and the two standards (ImperialStandard, CapsuleStandard). |
Level 0 - MiningOperations/ |
The mining operation: life cycle concepts (ConOps, OpsCon), stakeholders and concerns, the operational requirement, analyses, the doctrines. |
Level 1 - Systems/ |
The systems that take part in the operation: the mining frigate (system of interest) and the mining pilot. |
Level 2 - Subsystems/ |
The frigate's subsystems: mining laser, mining yield enhancer, ship controller, ship processor, power subsystem. |
Level 3 - Components/ |
The components of the decomposed subsystems: mining computation unit, capacitor, power generator, power grid. |
Each element has its own folder, and each file in it holds one package named <Element>_<Kind>:
| File kind | Content |
|---|---|
_Taxonomy |
The element's vocabulary: definitions (part, item, port, interface, connection, attribute defs) and the abstract collections its usages subset. |
_Requirements |
A requirement container def holding the element's requirement chain. |
_UseCases |
The - Needs use case (what the element must do at its boundary) and, for a decomposed element, the - Design use case (how its constituents do it). |
_Behavior |
Leaf behavior only: the actions a leaf performs and the states it exhibits. |
_Configuration |
The element's context part def with its _bb, _gb, and _wb, and its released configurations where alternatives coexist. |
_AnalysisCases |
Allocation, evaluation, and trade-study analyses. |
_VerificationCases |
Verification case defs and the identified verification cases. |
_StakeholdersViews, _LifeCycleConcepts |
Stakeholders, concerns, viewpoints, views; ConOps and OpsCon (Level 0). |
An element has only the files it needs: a leaf has a _Behavior file, and a decomposed element has none.
Framework rules: localTaxonomyOwnershipRule, foundationLayeringRule, attributeDeclarationPlacementRule.
_Taxonomy packages, the Framework, the COTS library, and the standards.
The other part defs are contexts: each element's context and its configurations collection in _Configuration, and the analysis context in _AnalysisCases._Requirements, use case defs in _UseCases and _LifeCycleConcepts, action defs in _Behavior, analysis and verification defs in _AnalysisCases and _VerificationCases.subsets or redefines other usages.
Structure is not built by specializing part defs, with one exception: a contributor extends a released context it cannot edit by specializing it, as in step 4 of the task.part powerGeneratorContext defined by PowerGenerator_Configuration::PowerGeneratorContext [1]).
Abstract collections in a package (e.g. abstract part transportShips) are allowed.specializes, subsets, redefines, references, and defined by in full.
The shortcut operators :>, :>>, ::>, and : are not used in the model, because they hide which relationship is meant.
The Framework copy keeps RAWP's original notation in a few places.subsets comes before of.private import Pkg::**;) go at the top of the package.
A single-element import goes in the innermost namespace that uses it (e.g. inside the requirement that nests #Need requirements).Every element's context holds three views of the element, each subsetting the previous one:
| Usage | Tag | States |
|---|---|---|
<element>_bb |
#BlackBox |
The boundary: capability settings, the - Needs use case, and satisfy of the element's transformed requirements. |
<element>_gb |
#GrayBox |
The logical architecture: constituents that subset each child's _bb, the - Design use case, graybox connections between action parameters (no ports), budgets committed from the derived requirement, and satisfy of the derived requirements. |
<element>_wb |
#WhiteBox |
The integration: constituents redefined (and subsetting the child's _wb where the child is decomposed), connections extended with interfaces and ports, and port items bound to leaf parameters. |
A child need on the parent's graybox becomes the child's transformed requirement on its blackbox: the wave repeats at every level until the leaves. Every constituent the graybox introduces receives a vertical need, either a budget or a functional need.
Framework rules: recursiveClosureRule, grayboxDecompositionRule, parentGrayboxToChildBlackboxRule, whiteboxMountingTunnelingRule, whiteboxValuePlacementRule, immutableValueCommitmentRule.
variation/variant notation.MiningFrigateConfigurations), each redefining only the replaceable feature.Framework rule: configurationReplacementRule.
- Needs use case of the _bb and the - Design use case of the _gb, which includes the constituents' - Needs use cases._Behavior package. The leaf's _bb performs it (perform action … references …).exhibit state), never performed, and it belongs to the part whose condition it reflects.
States take item parameters, not ports, and the whitebox binds the port items to those parameters.Framework rules: delegatedBehaviorExecutionRule, blackboxBehavioralRealizationRule, useCaseIntentTraceabilityRule.
bind statements are written port item left, parameter right (bind <connection>.<interface>.<port>.<item> = <leaf action>.<parameter>;).
The parameter's type specializes the port item's type.Framework rules: bindVersusFlowSemanticsRule, exchangeContractRequirementRule, bottomUpExchangeRealizationRule, COTSConnectorBoundaryRule.
Each element's requirements are one requirement container def (PowerSubsystemRequirements) with one usage of it.
A chain keeps one stem across levels, suffixed by the element and the step:
| Name | Meaning |
|---|---|
<stem>Operational |
The operational requirement (Level 0 only). |
<stem><Element> |
The transformed requirement on the element's blackbox. |
<stem><Element>Derived |
The derived requirement on the element's graybox. |
<stem><Constituent>Need |
A child need nested in the derived requirement, tagged #Need. |
<stem><Element>Req, <stem><Element>DerivedReq |
The satisfy usages on _bb and _gb/_wb. |
Example: pilotProfitabilityPowerSubsystem → pilotProfitabilityPowerSubsystemDerived → pilotProfitabilityPowerGeneratorNeed → pilotProfitabilityPowerGenerator.
Each requirement statement carries a short name <'REQ-nnnn'> and each verification case usage a short name <'VC-nnnn'>: one sequence per prefix across the model, never reused, encoding nothing. The sandbox uses REQ-0001 to REQ-0043 and VC-0001 to VC-0014; start your own numbering above them.
Acceptance criteria belong to the requirement. Requirement values come from the requirement chain or an analysis, never from a configuration.
Framework rules: requirementNamingRule, identificationRule, concernFramingRule, lifeCycleConceptRule, standardComplianceOverlayRule.
AllocationSelectionAnalysis, EvaluationAnalysis, TradeStudyAnalysis).
An analysis case has a single return and no out features.
A specialized analysis redefines every inherited input explicitly, in order, before adding its own.satisfy usage on the element's whitebox subject, measuring into the features the requirement constrains.
Its objective constraints only add evidential checks.Framework rules: analysisValuePlacementRule, verificationSubjectAndObjectiveRule, verificationMethodRule, realizedContributionMeasurementRule, referenceModeVerdictRule, illustrativeContentRule, projectAdoptionRule.
<Element>_ViewpointsAndViews package in its _StakeholdersViews file. The off-the-shelf mining laser and mining yield enhancer have none: the frigate's views cover them.<Element>GenericViews applies the Framework's purpose views (MyFramework::MyFrameworkViews) to the element: requirements traceability, the box views, interface control, compliance, verification planning and more. Each view exposes a whole scope of the element (its requirements, its context, or its whitebox) and leaves the selection to the Framework's filter; no view lists elements by hand. A view with nothing to show for its element, such as the graybox views of a leaf, says so in its doc.<Element>ConcernDrivenViews holds a view per concern a stakeholder of that element originates. The view declares its viewpoint inside itself and frames the concern.Framework rules: genericViewpointRule, concernDrivenViewRule, viewLayeringRule.
ImperialStandard regulates how modules are fitted to a ship (slots, the module control channel, the capacitor channel, the power grid capacity).
CapsuleStandard regulates the handoff between pilot and ship.
An element complies by subsetting the standard's category and exchanging the standard's items. Each compliance claim is verified by the owner of what it inspects.MyCOTSLibrary holds one package per product. Several products of one kind share a product-family package (e.g. MiningLaserCOTSProductFamily) that declares the supplier's resources, behavior, and states once; each product package sets only its values.doc /* … */ describes the element as it is in the model: purpose, rationale, and meaning.
It never describes the model's history ("formerly", "no longer", "in a later step").comment <name>ModelerComment about <element> locale "en_US" /* … */, so they stay part of the model and can be found.// is used only to mark the end of a package (} // package PowerGrid_Behavior).A clean syside check proves that the model is well-formed, not that its values close.
Evaluate the values that matter (budgets, closures, verification observations) with the syside Python API.
The values are illustrative, chosen so that the chain closes; they are not game data and are not evidence about real products.
The model is evaluated statically. The behavior of the exhibited states over time (e.g. the capacitor running empty during a cycle) is modeled but not verified; that would need simulation.
Syside's evaluator does not carry a redefined assumption into the analyses that use it: it evaluates the nested analysis in the sandbox's definition, so the income stays as in the baseline. The model's meaning is correct. To see the effect in evaluated values, also redefine, empty, each nested usage down to the connections that use the value:
part def HaulingAnalysisContext specializes MiningOperations_AnalysisCases::MiningOperationsAnalysisContext {
attribute redefines lowSecNominalScenario {
attribute redefines logisticsEfficiency = 1.0;
}
analysis redefines lowSecPilotProfitabilityAllocationAnalysis {
use case redefines operationsConcept {
connection redefines oreExtraction;
connection redefines pilotIncome;
}
}
}
Only the mining thread is designed down to components. Protection and drone defense enter the operation only as rates in the ConOps; navigation, drone control, scanners, and target locking are not modeled as subsystems.
The sandbox is licensed under the MIT License (see LICENSES/MIT.txt). Framework/Framework.sysml and Framework/Ontology.sysml are adapted from RAWP by Hugo Ormo, licensed CC-BY-4.0 (see LICENSES/CC-BY-4.0.txt); the rawpTailoringProvenance comment in Framework.sysml names the source commit and the tailoring.
Do not upload copyrighted EVE Online assets (images, sounds, etc.) in work built on the sandbox.
Hugo Ormo is an engineer who studied at ETSEIB in Barcelona. He is a certified GfSE Level A, approved trainer by the GfSE and has been preparing candidates for the GfSE certification levels B and C since 2022. Voluntarily, he leads the UAF working group of GfSE and is a member of the UAF working group of OMG.
This project is a fan-made educational initiative using EVE Online as a thematic inspiration. EVE Online and all related trademarks are the property of CCP Games. This project is not affiliated with, endorsed by, or sponsored by CCP Games.