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
| Path | Shape | Presence | Constraints / editor |
|---|---|---|---|
metadata | object | Required | — |
metadata.title | string | Required | 160 characters |
metadata.description | string | Required | 8000 characters · textarea |
metadata.author | string | Required | 160 characters |
metadata.diagnosis | string | Optional | 1000 characters · diagnosis |
metadata.specialty | string | Optional | 1000 characters · specialty |
metadata.level | string | Optional | 1000 characters · level |
metadata.durationMinutes | number | Optional | min 1 · max 1440 · min |
patients | object | Required | — |
patients.name | string | Required | 160 characters |
patients.context | string | Required | 8000 characters · textarea |
patients.photo | object | Optional | patient-photo |
patients.photo.dataUrl | string | Required | 12582912 characters |
patients.photo.description | string | Required | 1000 characters |
patients.demographics | object | Optional | demographics |
patients.demographics.age | number | Optional | min 0 · max 150 · years |
patients.demographics.weightKg | number | Optional | min 0 · max 1000 · kg |
patients.demographics.heightCm | number | Optional | min 0 · max 400 · cm |
patients.demographics.gender | string | Optional | 160 characters · gender |
patients.demographics.heightUnit | string | Optional | — |
patients.demographics.weightUnit | string | Optional | — |
patients.history | object | Optional | — |
patients.history.chiefComplaint | string | Optional | 8000 characters |
patients.history.presentIllness | string | Optional | 8000 characters · textarea |
patients.history.medical | array | Optional | 64 items |
patients.history.medical.* | string | Optional | 1000 characters |
patients.history.surgical | array | Optional | 64 items |
patients.history.surgical.* | string | Optional | 1000 characters |
patients.history.medications | array | Optional | 64 items |
patients.history.medications.* | string | Optional | 1000 characters |
patients.history.allergies | array | Optional | 64 items · allergies |
patients.history.allergies.* | union | Optional | — |
patients.history.allergies.*.substance | string | Optional | 1000 characters |
patients.history.allergies.*.reaction | string | Optional | 1000 characters |
patients.history.allergies.*.severity | string | Optional | — |
patients.history.family | string | Optional | 8000 characters · textarea |
patients.history.social | string | Optional | 8000 characters · textarea |
patients.history.ros | object | Optional | ros |
patients.examination | object | Optional | examination |
patients.monitor | object | Optional | monitor |
patients.monitor.rhythm | string | Optional | — |
patients.monitor.pulsePresent | boolean | Optional | — |
patients.monitor.connections | object | Optional | — |
patients.monitor.connections.ecg | boolean | Optional | — |
patients.monitor.connections.bloodPressure | boolean | Optional | — |
patients.monitor.connections.spo2 | boolean | Optional | — |
patients.monitor.connections.respiration | boolean | Optional | — |
patients.monitor.connections.temperature | boolean | Optional | — |
patients.monitor.connections.capnography | boolean | Optional | — |
patients.monitor.connections.arterialPressure | boolean | Optional | — |
patients.vitals | object | Optional | — |
patients.vitals.hr | number | Optional | min 0 · max 1000 · beats/min |
patients.vitals.sbp | number | Optional | min 0 · max 1000 · mmHg |
patients.vitals.dbp | number | Optional | min 0 · max 1000 · mmHg |
patients.vitals.rr | number | Optional | min 0 · max 1000 · breaths/min |
patients.vitals.spo2 | number | Optional | min 0 · max 100 · % |
patients.vitals.temperature | number | Optional | min 0 · max 1000 · Cel |
patients.vitals.etco2 | number | Optional | min 0 · max 1000 · mmHg |
patients.vitals.artSbp | number | Optional | min 0 · max 1000 · mmHg |
patients.vitals.artDbp | number | Optional | min 0 · max 1000 · mmHg |
environment | object | Required | — |
environment.setting | string | Required | 2000 characters · textarea |
environment.requirements | array | Required | 32 items |
environment.requirements.* | string | Optional | 240 characters |
environment.equipment | array | Optional | 64 items |
environment.equipment.* | string | Optional | 1000 characters |
environment.actors | array | Optional | 32 items |
environment.actors.* | object | Optional | — |
environment.actors.*.id | string | Required | 128 characters |
environment.actors.*.name | string | Required | 160 characters |
environment.actors.*.role | string | Required | 1000 characters |
environment.actors.*.brief | string | Required | 8000 characters · textarea |
environment.actors.*.demographics | object | Optional | — |
environment.actors.*.demographics.age | number | Optional | min 0 · max 150 · years |
environment.actors.*.demographics.gender | string | Optional | 160 characters · gender |
environment.patientScene | object | Optional | scene |
environment.patientScene.modelUrl | string | Required | 2000 characters |
environment.patientScene.attribution | string | Required | 2000 characters |
environment.patientScene.markers | array | Required | 128 items |
environment.patientScene.markers.* | object | Optional | — |
environment.patientScene.markers.*.actionId | string | Required | 128 characters |
environment.patientScene.markers.*.position | string | Required | 160 characters |
environment.patientScene.markers.*.normal | string | Required | 160 characters |
education | object | Required | — |
education.objectives | array | Required | 32 items · objectives |
education.objectives.* | union | Optional | — |
education.objectives.*.id | string | Optional | 128 characters |
education.objectives.*.statement | string | Optional | 1000 characters |
education.objectives.*.acgmeCompetencies | array | Optional | 6 items |
education.objectives.*.acgmeCompetencies.* | string | Optional | — |
education.debrief | string | Required | 12000 characters · markdown |
education.audience | string | Optional | 8000 characters |
education.prerequisites | string | Optional | 8000 characters · markdown |
education.prerequisiteDocuments | array | Optional | 8 items · prerequisite-documents |
education.prerequisiteDocuments.* | object | Optional | — |
education.prerequisiteDocuments.*.id | string | Required | 128 characters |
education.prerequisiteDocuments.*.name | string | Required | 255 characters |
education.prerequisiteDocuments.*.dataUrl | string | Required | 6990668 characters |
education.rationale | string | Optional | 8000 characters · textarea |
education.assessment | array | Optional | 64 items · assessment |
education.assessment.* | object | Optional | — |
education.assessment.*.objectiveId | string | Optional | 128 characters |
education.assessment.*.id | string | Required | 128 characters |
education.assessment.*.label | string | Required | 1000 characters |
education.assessment.*.actionId | string | Required | 128 characters |
education.assessment.*.objectId | string | Optional | 128 characters |
education.assessment.*.objectIds | array | Optional | 1000 items |
education.assessment.*.objectIds.* | string | Optional | 128 characters |
education.assessment.*.points | number | Required | min 1 · max 100 |
education.assessment.*.withinSeconds | number | Optional | min 0 · max 86400 · s |
education.assessment.*.feedback | string | Required | 8000 characters · textarea |
education.assessment.*.learningUrl | string | Optional | 2000 characters |
events | object | Required | — |
events.states | array | Required | 128 items · graph |
events.states.* | object | Optional | — |
events.states.*.id | string | Required | 128 characters |
events.states.*.title | string | Required | 240 characters |
events.states.*.kind | string | Required | — |
events.states.*.learnerNote | string | Required | 8000 characters · textarea |
events.states.*.tutorNote | string | Required | 8000 characters · textarea |
events.states.*.vitals | object | Optional | — |
events.states.*.vitals.hr | number | Optional | min 0 · max 1000 · beats/min |
events.states.*.vitals.sbp | number | Optional | min 0 · max 1000 · mmHg |
events.states.*.vitals.dbp | number | Optional | min 0 · max 1000 · mmHg |
events.states.*.vitals.rr | number | Optional | min 0 · max 1000 · breaths/min |
events.states.*.vitals.spo2 | number | Optional | min 0 · max 100 · % |
events.states.*.vitals.temperature | number | Optional | min 0 · max 1000 · Cel |
events.states.*.vitals.etco2 | number | Optional | min 0 · max 1000 · mmHg |
events.states.*.vitals.artSbp | number | Optional | min 0 · max 1000 · mmHg |
events.states.*.vitals.artDbp | number | Optional | min 0 · max 1000 · mmHg |
events.states.*.vitalTrendSeconds | number | Optional | min 0 · max 86400 · s |
events.states.*.monitor | object | Optional | monitor |
events.states.*.monitor.rhythm | string | Optional | — |
events.states.*.monitor.pulsePresent | boolean | Optional | — |
events.states.*.monitor.connections | object | Optional | — |
events.states.*.monitor.connections.ecg | boolean | Optional | — |
events.states.*.monitor.connections.bloodPressure | boolean | Optional | — |
events.states.*.monitor.connections.spo2 | boolean | Optional | — |
events.states.*.monitor.connections.respiration | boolean | Optional | — |
events.states.*.monitor.connections.temperature | boolean | Optional | — |
events.states.*.monitor.connections.capnography | boolean | Optional | — |
events.states.*.monitor.connections.arterialPressure | boolean | Optional | — |
events.states.*.key | boolean | Optional | — |
events.states.*.resourceTrigger | object | Optional | — |
events.states.*.resourceTrigger.mode | string | Required | — |
events.states.*.resourceTrigger.objectIds | array | Required | 1000 items |
events.states.*.resourceTrigger.objectIds.* | string | Optional | 128 characters |
events.actions | array | Required | 512 items |
events.actions.* | object | Optional | — |
events.actions.*.id | string | Required | 128 characters |
events.actions.*.label | string | Required | 1000 characters |
events.actions.*.description | string | Optional | 6000 characters · textarea |
events.actions.*.from | string | Required | 128 characters |
events.actions.*.to | string | Required | 128 characters |
events.actions.*.trigger | string | Optional | — |
events.actions.*.delaySeconds | number | Optional | min 0 · max 86400 · s |
events.actions.*.objectId | string | Optional | 128 characters |
events.actions.*.completionCriteria | string | Optional | 6000 characters · textarea |
events.actions.*.completion | object | Optional | — |
events.actions.*.completion.mode | string | Required | — |
events.actions.*.completion.objectIds | array | Required | 1000 items |
events.actions.*.completion.objectIds.* | string | Optional | 128 characters |
events.actions.*.cancelOnActionIds | array | Optional | 1000 items |
events.actions.*.cancelOnActionIds.* | string | Optional | 128 characters |
events.actions.*.effects | object | Optional | — |
events.actions.*.effects.hr | number | Optional | min 0 · max 1000 · beats/min |
events.actions.*.effects.sbp | number | Optional | min 0 · max 1000 · mmHg |
events.actions.*.effects.dbp | number | Optional | min 0 · max 1000 · mmHg |
events.actions.*.effects.rr | number | Optional | min 0 · max 1000 · breaths/min |
events.actions.*.effects.spo2 | number | Optional | min 0 · max 100 · % |
events.actions.*.effects.temperature | number | Optional | min 0 · max 1000 · Cel |
events.actions.*.effects.etco2 | number | Optional | min 0 · max 1000 · mmHg |
events.actions.*.effects.artSbp | number | Optional | min 0 · max 1000 · mmHg |
events.actions.*.effects.artDbp | number | Optional | min 0 · max 1000 · mmHg |
events.objects | array | Optional | 2048 items · resources |
events.objects.* | object | Optional | — |
events.objects.*.id | string | Required | 128 characters |
events.objects.*.type | string | Required | — |
events.objects.*.name | string | Required | 240 characters |
events.objects.*.diagnosticCategory | string | Optional | — |
events.objects.*.description | string | Optional | 8000 characters · textarea |
events.objects.*.result | string | Optional | 12000 characters · textarea |
events.objects.*.labResults | array | Optional | 64 items |
events.objects.*.labResults.* | object | Optional | — |
events.objects.*.labResults.*.name | string | Required | 120 characters |
events.objects.*.labResults.*.value | string | Required | 80 characters |
events.objects.*.labResults.*.unit | string | Required | 80 characters |
events.objects.*.image | object | Optional | — |
events.objects.*.image.dataUrl | string | Required | 12582912 characters |
events.objects.*.image.description | string | Required | 1000 characters |
events.objects.*.releaseOnStateId | string | Optional | 128 characters |
events.objects.*.delaySeconds | number | Optional | min 0 · max 86400 · s |
events.objects.*.effects | object | Optional | — |
events.objects.*.effects.hr | number | Optional | min 0 · max 1000 · beats/min |
events.objects.*.effects.sbp | number | Optional | min 0 · max 1000 · mmHg |
events.objects.*.effects.dbp | number | Optional | min 0 · max 1000 · mmHg |
events.objects.*.effects.rr | number | Optional | min 0 · max 1000 · breaths/min |
events.objects.*.effects.spo2 | number | Optional | min 0 · max 100 · % |
events.objects.*.effects.temperature | number | Optional | min 0 · max 1000 · Cel |
events.objects.*.effects.etco2 | number | Optional | min 0 · max 1000 · mmHg |
events.objects.*.effects.artSbp | number | Optional | min 0 · max 1000 · mmHg |
events.objects.*.effects.artDbp | number | Optional | min 0 · max 1000 · mmHg |
events.objects.*.advanceToStateId | string | Optional | 128 characters |
events.objects.*.effectPercent | object | Optional | — |
events.objects.*.effectPercent.hr | number | Optional | min -100 · max 1000 |
events.objects.*.effectPercent.sbp | number | Optional | min -100 · max 1000 |
events.objects.*.effectPercent.dbp | number | Optional | min -100 · max 1000 |
events.objects.*.effectPercent.rr | number | Optional | min -100 · max 1000 |
events.objects.*.effectPercent.spo2 | number | Optional | min -100 · max 1000 |
events.objects.*.effectPercent.temperature | number | Optional | min -100 · max 1000 |
events.objects.*.effectPercent.etco2 | number | Optional | min -100 · max 1000 |
events.objects.*.effectPercent.artSbp | number | Optional | min -100 · max 1000 |
events.objects.*.effectPercent.artDbp | number | Optional | min -100 · max 1000 |
events.objects.*.monitorConnection | object | Optional | — |
events.objects.*.monitorConnection.channel | string | Required | — |
events.objects.*.monitorConnection.connected | boolean | Required | — |
events.objects.*.orthostaticResponse | object | Optional | — |
events.objects.*.orthostaticResponse.systolicDrop | number | Required | min 0 · max 100 · mmHg |
events.objects.*.orthostaticResponse.diastolicDrop | number | Required | min 0 · max 100 · mmHg |
events.objects.*.medicationResponse | string | Optional | — |
events.objects.*.source | string | Optional | 2000 characters |
A complete scenario
Suite implementation profile · Fictional authored example
{
"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.