Skip to documentation
ReferenceImplementation

Implementation

Suite implementation profile

The exact representation accepted by the current application.

The application accepts JSON scenario objects with five top-level domains. The schema defines their types and required values; runtime validation also checks references and graph semantics.

The field tables below are generated from the same schema used by Builder, AI authoring, and server validation.

Profile fields

Requiredness is relative to the containing object. Optional groups can be omitted; their required children apply when the group is provided. The scenario schema supplies these fields, Builder controls, AI schemas, and structural validation. The runtime adds graph and execution checks.

Download the authoring specification

PathShapePresenceConstraints / editor
metadataobjectRequired—
metadata.titlestringRequired160 characters
metadata.descriptionstringRequired8000 characters · textarea
metadata.authorstringRequired160 characters
metadata.diagnosisstringOptional1000 characters · diagnosis
metadata.specialtystringOptional1000 characters · specialty
metadata.levelstringOptional1000 characters · level
metadata.durationMinutesnumberOptionalmin 1 · max 1440 · min
patientsobjectRequired—
patients.namestringRequired160 characters
patients.contextstringRequired8000 characters · textarea
patients.photoobjectOptionalpatient-photo
patients.photo.dataUrlstringRequired12582912 characters
patients.photo.descriptionstringRequired1000 characters
patients.demographicsobjectOptionaldemographics
patients.demographics.agenumberOptionalmin 0 · max 150 · years
patients.demographics.weightKgnumberOptionalmin 0 · max 1000 · kg
patients.demographics.heightCmnumberOptionalmin 0 · max 400 · cm
patients.demographics.genderstringOptional160 characters · gender
patients.demographics.heightUnitstringOptional—
patients.demographics.weightUnitstringOptional—
patients.historyobjectOptional—
patients.history.chiefComplaintstringOptional8000 characters
patients.history.presentIllnessstringOptional8000 characters · textarea
patients.history.medicalarrayOptional64 items
patients.history.medical.*stringOptional1000 characters
patients.history.surgicalarrayOptional64 items
patients.history.surgical.*stringOptional1000 characters
patients.history.medicationsarrayOptional64 items
patients.history.medications.*stringOptional1000 characters
patients.history.allergiesarrayOptional64 items · allergies
patients.history.allergies.*unionOptional—
patients.history.allergies.*.substancestringOptional1000 characters
patients.history.allergies.*.reactionstringOptional1000 characters
patients.history.allergies.*.severitystringOptional—
patients.history.familystringOptional8000 characters · textarea
patients.history.socialstringOptional8000 characters · textarea
patients.history.rosobjectOptionalros
patients.examinationobjectOptionalexamination
patients.monitorobjectOptionalmonitor
patients.monitor.rhythmstringOptional—
patients.monitor.pulsePresentbooleanOptional—
patients.monitor.connectionsobjectOptional—
patients.monitor.connections.ecgbooleanOptional—
patients.monitor.connections.bloodPressurebooleanOptional—
patients.monitor.connections.spo2booleanOptional—
patients.monitor.connections.respirationbooleanOptional—
patients.monitor.connections.temperaturebooleanOptional—
patients.monitor.connections.capnographybooleanOptional—
patients.monitor.connections.arterialPressurebooleanOptional—
patients.vitalsobjectOptional—
patients.vitals.hrnumberOptionalmin 0 · max 1000 · beats/min
patients.vitals.sbpnumberOptionalmin 0 · max 1000 · mmHg
patients.vitals.dbpnumberOptionalmin 0 · max 1000 · mmHg
patients.vitals.rrnumberOptionalmin 0 · max 1000 · breaths/min
patients.vitals.spo2numberOptionalmin 0 · max 100 · %
patients.vitals.temperaturenumberOptionalmin 0 · max 1000 · Cel
patients.vitals.etco2numberOptionalmin 0 · max 1000 · mmHg
patients.vitals.artSbpnumberOptionalmin 0 · max 1000 · mmHg
patients.vitals.artDbpnumberOptionalmin 0 · max 1000 · mmHg
environmentobjectRequired—
environment.settingstringRequired2000 characters · textarea
environment.requirementsarrayRequired32 items
environment.requirements.*stringOptional240 characters
environment.equipmentarrayOptional64 items
environment.equipment.*stringOptional1000 characters
environment.actorsarrayOptional32 items
environment.actors.*objectOptional—
environment.actors.*.idstringRequired128 characters
environment.actors.*.namestringRequired160 characters
environment.actors.*.rolestringRequired1000 characters
environment.actors.*.briefstringRequired8000 characters · textarea
environment.actors.*.demographicsobjectOptional—
environment.actors.*.demographics.agenumberOptionalmin 0 · max 150 · years
environment.actors.*.demographics.genderstringOptional160 characters · gender
environment.patientSceneobjectOptionalscene
environment.patientScene.modelUrlstringRequired2000 characters
environment.patientScene.attributionstringRequired2000 characters
environment.patientScene.markersarrayRequired128 items
environment.patientScene.markers.*objectOptional—
environment.patientScene.markers.*.actionIdstringRequired128 characters
environment.patientScene.markers.*.positionstringRequired160 characters
environment.patientScene.markers.*.normalstringRequired160 characters
educationobjectRequired—
education.objectivesarrayRequired32 items · objectives
education.objectives.*unionOptional—
education.objectives.*.idstringOptional128 characters
education.objectives.*.statementstringOptional1000 characters
education.objectives.*.acgmeCompetenciesarrayOptional6 items
education.objectives.*.acgmeCompetencies.*stringOptional—
education.debriefstringRequired12000 characters · markdown
education.audiencestringOptional8000 characters
education.prerequisitesstringOptional8000 characters · markdown
education.prerequisiteDocumentsarrayOptional8 items · prerequisite-documents
education.prerequisiteDocuments.*objectOptional—
education.prerequisiteDocuments.*.idstringRequired128 characters
education.prerequisiteDocuments.*.namestringRequired255 characters
education.prerequisiteDocuments.*.dataUrlstringRequired6990668 characters
education.rationalestringOptional8000 characters · textarea
education.assessmentarrayOptional64 items · assessment
education.assessment.*objectOptional—
education.assessment.*.objectiveIdstringOptional128 characters
education.assessment.*.idstringRequired128 characters
education.assessment.*.labelstringRequired1000 characters
education.assessment.*.actionIdstringRequired128 characters
education.assessment.*.objectIdstringOptional128 characters
education.assessment.*.objectIdsarrayOptional1000 items
education.assessment.*.objectIds.*stringOptional128 characters
education.assessment.*.pointsnumberRequiredmin 1 · max 100
education.assessment.*.withinSecondsnumberOptionalmin 0 · max 86400 · s
education.assessment.*.feedbackstringRequired8000 characters · textarea
education.assessment.*.learningUrlstringOptional2000 characters
eventsobjectRequired—
events.statesarrayRequired128 items · graph
events.states.*objectOptional—
events.states.*.idstringRequired128 characters
events.states.*.titlestringRequired240 characters
events.states.*.kindstringRequired—
events.states.*.learnerNotestringRequired8000 characters · textarea
events.states.*.tutorNotestringRequired8000 characters · textarea
events.states.*.vitalsobjectOptional—
events.states.*.vitals.hrnumberOptionalmin 0 · max 1000 · beats/min
events.states.*.vitals.sbpnumberOptionalmin 0 · max 1000 · mmHg
events.states.*.vitals.dbpnumberOptionalmin 0 · max 1000 · mmHg
events.states.*.vitals.rrnumberOptionalmin 0 · max 1000 · breaths/min
events.states.*.vitals.spo2numberOptionalmin 0 · max 100 · %
events.states.*.vitals.temperaturenumberOptionalmin 0 · max 1000 · Cel
events.states.*.vitals.etco2numberOptionalmin 0 · max 1000 · mmHg
events.states.*.vitals.artSbpnumberOptionalmin 0 · max 1000 · mmHg
events.states.*.vitals.artDbpnumberOptionalmin 0 · max 1000 · mmHg
events.states.*.vitalTrendSecondsnumberOptionalmin 0 · max 86400 · s
events.states.*.monitorobjectOptionalmonitor
events.states.*.monitor.rhythmstringOptional—
events.states.*.monitor.pulsePresentbooleanOptional—
events.states.*.monitor.connectionsobjectOptional—
events.states.*.monitor.connections.ecgbooleanOptional—
events.states.*.monitor.connections.bloodPressurebooleanOptional—
events.states.*.monitor.connections.spo2booleanOptional—
events.states.*.monitor.connections.respirationbooleanOptional—
events.states.*.monitor.connections.temperaturebooleanOptional—
events.states.*.monitor.connections.capnographybooleanOptional—
events.states.*.monitor.connections.arterialPressurebooleanOptional—
events.states.*.keybooleanOptional—
events.states.*.resourceTriggerobjectOptional—
events.states.*.resourceTrigger.modestringRequired—
events.states.*.resourceTrigger.objectIdsarrayRequired1000 items
events.states.*.resourceTrigger.objectIds.*stringOptional128 characters
events.actionsarrayRequired512 items
events.actions.*objectOptional—
events.actions.*.idstringRequired128 characters
events.actions.*.labelstringRequired1000 characters
events.actions.*.descriptionstringOptional6000 characters · textarea
events.actions.*.fromstringRequired128 characters
events.actions.*.tostringRequired128 characters
events.actions.*.triggerstringOptional—
events.actions.*.delaySecondsnumberOptionalmin 0 · max 86400 · s
events.actions.*.objectIdstringOptional128 characters
events.actions.*.completionCriteriastringOptional6000 characters · textarea
events.actions.*.completionobjectOptional—
events.actions.*.completion.modestringRequired—
events.actions.*.completion.objectIdsarrayRequired1000 items
events.actions.*.completion.objectIds.*stringOptional128 characters
events.actions.*.cancelOnActionIdsarrayOptional1000 items
events.actions.*.cancelOnActionIds.*stringOptional128 characters
events.actions.*.effectsobjectOptional—
events.actions.*.effects.hrnumberOptionalmin 0 · max 1000 · beats/min
events.actions.*.effects.sbpnumberOptionalmin 0 · max 1000 · mmHg
events.actions.*.effects.dbpnumberOptionalmin 0 · max 1000 · mmHg
events.actions.*.effects.rrnumberOptionalmin 0 · max 1000 · breaths/min
events.actions.*.effects.spo2numberOptionalmin 0 · max 100 · %
events.actions.*.effects.temperaturenumberOptionalmin 0 · max 1000 · Cel
events.actions.*.effects.etco2numberOptionalmin 0 · max 1000 · mmHg
events.actions.*.effects.artSbpnumberOptionalmin 0 · max 1000 · mmHg
events.actions.*.effects.artDbpnumberOptionalmin 0 · max 1000 · mmHg
events.objectsarrayOptional2048 items · resources
events.objects.*objectOptional—
events.objects.*.idstringRequired128 characters
events.objects.*.typestringRequired—
events.objects.*.namestringRequired240 characters
events.objects.*.diagnosticCategorystringOptional—
events.objects.*.descriptionstringOptional8000 characters · textarea
events.objects.*.resultstringOptional12000 characters · textarea
events.objects.*.labResultsarrayOptional64 items
events.objects.*.labResults.*objectOptional—
events.objects.*.labResults.*.namestringRequired120 characters
events.objects.*.labResults.*.valuestringRequired80 characters
events.objects.*.labResults.*.unitstringRequired80 characters
events.objects.*.imageobjectOptional—
events.objects.*.image.dataUrlstringRequired12582912 characters
events.objects.*.image.descriptionstringRequired1000 characters
events.objects.*.releaseOnStateIdstringOptional128 characters
events.objects.*.delaySecondsnumberOptionalmin 0 · max 86400 · s
events.objects.*.effectsobjectOptional—
events.objects.*.effects.hrnumberOptionalmin 0 · max 1000 · beats/min
events.objects.*.effects.sbpnumberOptionalmin 0 · max 1000 · mmHg
events.objects.*.effects.dbpnumberOptionalmin 0 · max 1000 · mmHg
events.objects.*.effects.rrnumberOptionalmin 0 · max 1000 · breaths/min
events.objects.*.effects.spo2numberOptionalmin 0 · max 100 · %
events.objects.*.effects.temperaturenumberOptionalmin 0 · max 1000 · Cel
events.objects.*.effects.etco2numberOptionalmin 0 · max 1000 · mmHg
events.objects.*.effects.artSbpnumberOptionalmin 0 · max 1000 · mmHg
events.objects.*.effects.artDbpnumberOptionalmin 0 · max 1000 · mmHg
events.objects.*.advanceToStateIdstringOptional128 characters
events.objects.*.effectPercentobjectOptional—
events.objects.*.effectPercent.hrnumberOptionalmin -100 · max 1000
events.objects.*.effectPercent.sbpnumberOptionalmin -100 · max 1000
events.objects.*.effectPercent.dbpnumberOptionalmin -100 · max 1000
events.objects.*.effectPercent.rrnumberOptionalmin -100 · max 1000
events.objects.*.effectPercent.spo2numberOptionalmin -100 · max 1000
events.objects.*.effectPercent.temperaturenumberOptionalmin -100 · max 1000
events.objects.*.effectPercent.etco2numberOptionalmin -100 · max 1000
events.objects.*.effectPercent.artSbpnumberOptionalmin -100 · max 1000
events.objects.*.effectPercent.artDbpnumberOptionalmin -100 · max 1000
events.objects.*.monitorConnectionobjectOptional—
events.objects.*.monitorConnection.channelstringRequired—
events.objects.*.monitorConnection.connectedbooleanRequired—
events.objects.*.orthostaticResponseobjectOptional—
events.objects.*.orthostaticResponse.systolicDropnumberRequiredmin 0 · max 100 · mmHg
events.objects.*.orthostaticResponse.diastolicDropnumberRequiredmin 0 · max 100 · mmHg
events.objects.*.medicationResponsestringOptional—
events.objects.*.sourcestringOptional2000 characters

A complete scenario

Suite implementation profile · Fictional authored example

scenario-example.jsonJSON
{
  "metadata": {
    "title": "A clear handoff",
    "description": "Fictional team communication practice with a delayed result and two approaches to clarifying the situation.",
    "author": "u-sim example team",
    "diagnosis": "Communication rehearsal",
    "specialty": "Simulation education",
    "level": "Intermediate",
    "durationMinutes": 10
  },
  "patients": {
    "name": "Alex Morgan (fictional)",
    "context": "A fictional adult is awaiting handoff. The incoming team needs a shared understanding of the situation and who will follow up an outstanding result.",
    "demographics": {
      "age": 40,
      "gender": "Not specified",
      "weightKg": 70,
      "heightCm": 170
    },
    "history": {
      "chiefComplaint": "Awaiting a team handoff",
      "presentIllness": "The current care summary is incomplete in this fictional exercise.",
      "medical": [
        "No additional history authored"
      ],
      "surgical": [],
      "medications": [],
      "allergies": [
        {
          "substance": "Example substance",
          "reaction": "Authored rash",
          "severity": "mild"
        }
      ],
      "family": "Not part of this exercise",
      "social": "Fictional training context",
      "ros": {
        "general": "No additional symptoms authored"
      }
    },
    "examination": {
      "general": "Comfortable and speaking with the team"
    },
    "monitor": {
      "connections": {}
    },
    "vitals": {
      "hr": 80,
      "sbp": 120,
      "dbp": 75,
      "rr": 16,
      "spo2": 98,
      "temperature": 37,
      "etco2": 35
    }
  },
  "environment": {
    "setting": "A simulated handoff space",
    "requirements": [
      "Facilitator brief reviewed",
      "Learner roles assigned"
    ],
    "equipment": [
      "Handoff note"
    ],
    "actors": [
      {
        "id": "outgoing-team",
        "name": "Outgoing colleague",
        "role": "Facilitator",
        "brief": "Reveal missing context when the learner asks a focused question."
      }
    ]
  },
  "education": {
    "objectives": [
      "Clarify missing information",
      "Agree on ownership of the next step"
    ],
    "debrief": "How did you establish a shared understanding? Who took responsibility for the outstanding result?",
    "audience": "Interprofessional learners",
    "prerequisites": "Familiarity with a local handoff framework",
    "rationale": "Practice explicit communication and follow-up ownership."
  },
  "events": {
    "states": [
      {
        "id": "baseline",
        "title": "Receive the handoff",
        "kind": "baseline",
        "key": true,
        "learnerNote": "The outgoing colleague is ready. How will you establish the shared picture?",
        "tutorNote": "Offer incomplete context, then respond to the learner’s approach."
      },
      {
        "id": "assessment",
        "title": "Clarify the context",
        "kind": "triggered",
        "key": true,
        "learnerNote": "You have clarified the missing information. Agree on the next step.",
        "tutorNote": "Ask the learner to make ownership explicit."
      },
      {
        "id": "waiting",
        "title": "Await the update",
        "kind": "triggered",
        "learnerNote": "A result is pending. Agree who will review it while the simulated clock advances.",
        "tutorNote": "Advance simulated time to allow the update."
      },
      {
        "id": "update",
        "title": "The update arrives",
        "kind": "scheduled",
        "learnerNote": "The pending update is available. Confirm who will communicate the result.",
        "tutorNote": "Ask for a closed-loop confirmation.",
        "vitals": {
          "hr": 82
        }
      },
      {
        "id": "conclusion",
        "title": "Handoff complete",
        "kind": "conclusion",
        "key": true,
        "learnerNote": "The team has confirmed the situation and the next step. Pause for reflection.",
        "tutorNote": "Use the debrief prompts to compare both approaches."
      }
    ],
    "actions": [
      {
        "id": "clarify",
        "label": "Ask for missing context",
        "from": "baseline",
        "to": "assessment"
      },
      {
        "id": "review",
        "label": "Review the summary and pending result",
        "from": "baseline",
        "to": "waiting",
        "objectId": "handoff-result"
      },
      {
        "id": "update-due",
        "label": "Receive the scheduled update",
        "from": "waiting",
        "to": "update",
        "trigger": "scheduled",
        "delaySeconds": 30
      },
      {
        "id": "confirm",
        "label": "Confirm responsibilities with a read-back",
        "from": "assessment",
        "to": "conclusion"
      },
      {
        "id": "close",
        "label": "Confirm who will communicate the result",
        "from": "update",
        "to": "conclusion"
      }
    ],
    "objects": [
      {
        "id": "handoff-result",
        "type": "information",
        "name": "Pending handoff update",
        "description": "A fictional delayed update used to rehearse follow-up ownership.",
        "result": "The requested handoff information is now available. Confirm that the incoming colleague has received it.",
        "delaySeconds": 30,
        "source": "Authored fictional documentation example"
      }
    ]
  }
}

This is a raw scenario object. Package envelopes add publication and format metadata around it. The structural schema does not replace reference, timing, or publication validation.