This guide walks you through defining a quantum machine model and serializing it to JSON. For a
complete schema reference see theoretical/* source files.
- Go 1.22 or later.
- A clear understanding of the business process you want to model.
- Unique identifiers for your machine, universes, and realities (letters, numbers,
_,-).
- Draft the machine metadata: pick
id,canonicalName,version, and machine-level constants. - List universes: each encapsulates a flow. Decide whether it has an
initialreality. - Describe realities: choose the
type, observers, and transitions reacting to events. - Wire transitions: define targets, optional conditions, and synchronous/asynchronous logic.
- Register executors: connect actions, observers, invokes, and conditions via registries.
- Serialize and ship: load JSON into Go using
statepro.DeserializeQuantumMachineFromBinaryand create a runtime withstatepro.NewQuantumMachine.
graph TD
A[Quantum Machine] --> B[id, initials, universes]
A --> C[Universal Constants]
B --> D[Universe 1]
B --> E[Universe 2]
D --> F[id, initial, realities]
D --> G[Constants]
F --> H[Reality A]
F --> I[Reality B]
H --> J[type, on, always]
H --> K[Entry/Exit Actions]
J --> L[Transitions]
L --> M[targets, actions, invokes]
| Element | Location | Key Fields |
|---|---|---|
| Machine | root | id, canonicalName, version, initials, universes, universalConstants |
| Universe | universes.<key> |
id, canonicalName, version, initial, realities, metadata |
| Reality | universes.<key>.realities.<key> |
type, always, on, observers, entryActions, exitActions |
| Transition | always[] or on.<event>[] |
targets, type, conditions, actions, invokes |
| Executor reference | actions[], invokes[], observers[], conditions[] |
src, args, description |
| Universal constants | machine or universe level | entryActions, exitActions, invokesOnTransition, etc. |
Referential rules:
- Transition targets must reference existing universes or realities.
- References use
U:<universe>orU:<universe>:<reality>for cross-universe jumps. - Reality IDs must be unique within their universe.
The snippet below shows selected fragments from example/sm/state_machine.json. Comments explain
what each section does (remove them in real JSON files).
Highlights:
- The machine starts a single universe (
admission-in-waiting-confirmation). - The
CONFIRMEDfinal reality spawns additional universes via itsalwaystransition. - Observers in
admission-waiting-processeswait until all required events accumulate before notifying another universe. - Universal constants ensure every entry and transition logs information without duplicating logic.
- Use
SerializeQuantumMachineToMap/SerializeQuantumMachineToBinaryto serialize structs you build in code. - Call
statepro.NewQuantumMachineto ensure the model is structurally correct; this validates references and required fields. - Write unit tests that load your JSON and attempt to initialize the runtime with representative contexts and events.
raw, _ := os.ReadFile("state_machine.json")
model, _ := statepro.DeserializeQuantumMachineFromBinary(raw)
qm, _ := statepro.NewQuantumMachine(model)
ctx := context.Background()
machineCtx := &AdmissionCtx{Active: true}
_ = qm.Init(ctx, machineCtx) // or qm.InitWithEvent(...)
handled, err := qm.SendEvent(ctx, statepro.NewEventBuilder("confirm").Build())
if err != nil {
// handle runtime errors from actions/conditions
}
if !handled {
// the event did not match any active reality
}- Dive into concepts for an exhaustive description of each field.
- Learn how the runtime interprets your JSON in runtime.md.
- Register custom behaviour using the contracts described in instrumentation.md.
{ "id": "admission", "canonicalName": "admission-machine", "version": "0.1.0", "initials": ["U:admission-in-waiting-confirmation"], "universes": { "admission-in-waiting-confirmation": { "id": "admission-in-waiting-confirmation", "canonicalName": "admission-in-waiting-confirmation", "version": "0.1.0", "initial": "CREATED", "realities": { "CREATED": { "type": "transition", "always": [ { "targets": ["WAITING_CONFIRMATION"] } ] }, "WAITING_CONFIRMATION": { "type": "transition", "on": { "confirm": [ { "targets": ["CONFIRMED"] } ], "reject": [ { "targets": ["U:admission-rejected"] } ] } }, "CONFIRMED": { "type": "final", "always": [ { "targets": [ "U:admission-form-process", "U:admission-contract-process" ] } ] } } }, "admission-waiting-processes": { "id": "admission-waiting-processes", "version": "0.1.0", "realities": { "WAITING_PROCESSES": { "type": "final", "observers": [ { "src": "builtin:observer:containsAllEvents", "args": {"p1": "fill-form", "p2": "sign"} } ], "always": [ { "targets": [ "U:admission-contract-process:SIGNING_ENROLLMENT_CONTRACT" ] } ] } } } }, "universalConstants": { "entryActions": [ {"src": "builtin:action:logBasicInfo"} ], "actionsOnTransition": [ {"src": "builtin:action:logArgs"} ] } }