Skip to content

SysML v2 textual export (structural slice) — feasibility spike + lossy ledger #89

Description

@rsthornton

Summary

Feasibility spike for a one-way BERT JSON → SysML v2 textual (.sysml) export of the structural slice. The structural spine maps cleanly and the export is weekend-scale; the fields that don't map are exactly BERT's systems-science commitments, and that lossy boundary is itself the deliverable (a concrete K≅2 "one lens among many" artifact).

Scope guard (important): this is a one-way structural export to textual notation, explicitly NOT SysML v2 conformance, round-trip, or the Systems Modeling API JSON. Full conformance is a multi-year standards-chasing treadmill and is out of scope. The win is a credential + a forcing function, not live tool interop (the SysML v2 consuming ecosystem is still ~2027–2028 per DoD/CIMdata).

Mapping (verified against assets/models/examples/llm.json)

BERT (actual field) SysML v2 Clean?
System (S0 / C0.x) part def + part
Boundary (B0) the part enclosure (implicit)
Interface Import/Export port (in/out)
interface.protocol port type / attribute
Interaction type=Flow flow connection + typed item
substance.type Energy/Material/Message item def
complexity: Multiset(N) part[N] multiplicity
Source/Sink ExternalEntity parts in enclosing context
interface processors (parent_interface != null) fold into the port (not real components)
complexity.adaptable/evolveable ⚠️ metadata
usability Resource/Product/Waste/Disruption ⚠️ metadata
boundary.porosity, perceptive_fuzziness ⚠️ metadata
member_autonomy, time_constant ⚠️ metadata
archetype + agent (kind/agency_capacity/primitives) ⚠️ metadata/profile
Interaction type=Force (influence-without-transfer) — (item flows move things) ❌ real gap

Spike

  • Emitter: tools/bert-sysml/bert2sysml.py (~150 lines Python — proof of shape; a production emitter would be Rust beside tools/bert-typedb/).
  • Sample output: tools/bert-sysml/llm.sysml.example (49 lines from llm.json).
  • Architecture is a tree-walk over the flat systems[] + interactions[] list — the same shape as the bert-typedb transpiler.

The emitter does not silently drop the unrepresentable fields. It emits them as a // [BERT-only] ledger inline and in a trailing block, so every export self-documents its lossy boundary.

Why the lossy column matters

The ⚠️/❌ rows — Force, usability/conservation, archetype, member_autonomy, time_constant, boundary porosity — are precisely the Mobus/systems-science layer that distinguishes BERT from MBSE tooling. The auto-generated [BERT-only] ledger is the K≅2 argument made concrete and reproducible: SysML's part/port/flow is one lens; here is what that lens structurally cannot see, produced automatically from any model rather than asserted.

Open / next

  • Decide whether to promote the spike to a Rust emitter in tools/ (mirrors bert-typedb).
  • Run against relationship-dyad.json to exercise the Agent-model ledger and against a Force/Multiset model.
  • Decide the home for unrepresentable semantics: inline metadata vs. a small SysML v2 profile vs. accept-as-lossy.
  • Validate emitted .sysml against a real parser (e.g. paste into a local SysON instance) before claiming syntactic validity.

Theory thread (tracked in strategy, not here): is KerML's kernel the same invariant K≅2 latched onto, seen from the MBSE side? See strategy/bert-world-models-positioning.md.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions