{
  "status": "specification",
  "formatVersion": "2.0",
  "scope": "Portable format parameter and behavior specification, including profile negotiation, namespaced extensions, vocabulary pinning, and package digest policy. Current Suite import support is documented separately. Examples are fragments and may reference entities defined in other fragments.",
  "referenceProfiles": [
    {
      "id": "usim:age-based-vitals",
      "version": "1.0.0",
      "context": "Awake, resting reference values; neonatal defaults assume completed postnatal transition. Not treatment targets.",
      "ageConversion": {
        "daysPerYear": 365.25,
        "monthsPerYear": 12
      },
      "units": {
        "hr": "beats/min",
        "sbp": "mmHg",
        "dbp": "mmHg",
        "rr": "breaths/min",
        "spo2": "%",
        "temperature": "Cel",
        "etco2": "mmHg"
      },
      "sources": [
        {
          "id": "pediatric",
          "url": "https://www.med.upenn.edu/pedsinpractice/duplicate-of-template-section-page/",
          "context": "Awake pediatric HR, RR, systolic and diastolic reference intervals."
        },
        {
          "id": "adult",
          "url": "https://medlineplus.gov/ency/article/002341.htm",
          "context": "Resting adult HR, RR, BP and temperature reference intervals."
        },
        {
          "id": "oxygen",
          "url": "https://medlineplus.gov/lab-tests/pulse-oximetry/",
          "context": "SpO2 reference interval."
        },
        {
          "id": "capnography",
          "url": "https://www.nm.org/-/media/northwestern/resources/for-medical-professionals/ems-education/capnography.pdf",
          "context": "EtCO2 reference interval."
        }
      ],
      "bands": [
        {
          "id": "neonate",
          "minYears": 0,
          "maxYears": 0.07665982203969883,
          "sourceId": "pediatric",
          "ranges": {
            "hr": [
              100,
              205
            ],
            "rr": [
              30,
              53
            ],
            "sbp": [
              67,
              84
            ],
            "dbp": [
              35,
              53
            ]
          }
        },
        {
          "id": "infant",
          "minYears": 0.07665982203969883,
          "maxYears": 1,
          "sourceId": "pediatric",
          "ranges": {
            "hr": [
              100,
              180
            ],
            "rr": [
              30,
              53
            ],
            "sbp": [
              72,
              104
            ],
            "dbp": [
              37,
              56
            ]
          }
        },
        {
          "id": "toddler",
          "minYears": 1,
          "maxYears": 3,
          "sourceId": "pediatric",
          "ranges": {
            "hr": [
              98,
              140
            ],
            "rr": [
              22,
              37
            ],
            "sbp": [
              86,
              106
            ],
            "dbp": [
              42,
              63
            ]
          }
        },
        {
          "id": "preschool",
          "minYears": 3,
          "maxYears": 6,
          "sourceId": "pediatric",
          "ranges": {
            "hr": [
              80,
              120
            ],
            "rr": [
              20,
              28
            ],
            "sbp": [
              89,
              112
            ],
            "dbp": [
              46,
              72
            ]
          }
        },
        {
          "id": "school-age",
          "minYears": 6,
          "maxYears": 12,
          "sourceId": "pediatric",
          "ranges": {
            "hr": [
              75,
              118
            ],
            "rr": [
              18,
              25
            ],
            "sbp": [
              97,
              115
            ],
            "dbp": [
              57,
              76
            ]
          }
        },
        {
          "id": "adolescent",
          "minYears": 12,
          "maxYears": 16,
          "sourceId": "pediatric",
          "ranges": {
            "hr": [
              60,
              100
            ],
            "rr": [
              12,
              20
            ],
            "sbp": [
              102,
              120
            ],
            "dbp": [
              61,
              80
            ]
          }
        },
        {
          "id": "older-adolescent-adult",
          "minYears": 16,
          "maxYears": null,
          "sourceId": "adult",
          "ranges": {
            "hr": [
              60,
              100
            ],
            "rr": [
              12,
              18
            ],
            "sbp": [
              90,
              120
            ],
            "dbp": [
              60,
              80
            ]
          }
        }
      ],
      "commonRanges": {
        "spo2": [
          95,
          100
        ],
        "temperature": [
          36.5,
          37.3
        ],
        "etco2": [
          35,
          45
        ]
      }
    }
  ],
  "authoringProfiles": [
    {
      "id": "usim:age-based-normal-findings",
      "version": "1.0.0",
      "ageUnit": "years",
      "selection": "infant: 0 <= age < 1; child: 1 <= age < 12; adolescent: 12 <= age < 18; adult: 18 <= age < 65; olderAdult: age >= 65; unspecified: missing or invalid age",
      "systems": {
        "ros": {
          "general": "Constitutional",
          "eyes": "Eyes",
          "ent": "Ears, nose and throat",
          "cardiovascular": "Cardiovascular",
          "respiratory": "Respiratory",
          "gastrointestinal": "Gastrointestinal",
          "genitourinary": "Genitourinary",
          "musculoskeletal": "Musculoskeletal",
          "skin": "Skin",
          "neurological": "Neurological",
          "psychiatric": "Psychiatric",
          "endocrine": "Endocrine",
          "hematologic": "Hematologic / lymphatic",
          "allergic": "Allergic / immunologic"
        },
        "examination": {
          "general": "General appearance",
          "head": "Head",
          "eyes": "Eyes",
          "ent": "Ears, nose and throat",
          "neck": "Neck",
          "cardiovascular": "Cardiovascular",
          "respiratory": "Respiratory",
          "abdomen": "Abdomen",
          "musculoskeletal": "Musculoskeletal",
          "extremities": "Extremities",
          "skin": "Skin",
          "neurological": "Neurological",
          "psychiatric": "Mental status"
        }
      },
      "templates": {
        "infant": {
          "ros": {
            "general": "No reported fever, reduced activity, or feeding concerns.",
            "eyes": "No reported eye redness, discharge, or visual concerns.",
            "ent": "No reported ear discomfort, nasal congestion, or swallowing difficulty.",
            "cardiovascular": "No reported cyanosis, fainting, or swelling.",
            "respiratory": "No reported cough, wheezing, apnea, or difficulty breathing.",
            "gastrointestinal": "No reported vomiting, diarrhea, constipation, or abdominal discomfort.",
            "genitourinary": "No reported urinary discomfort, blood in urine, or reduced urine output.",
            "musculoskeletal": "No reported limb swelling, reduced limb movement, or apparent discomfort with movement.",
            "skin": "No rash, itching, or new skin lesions.",
            "neurological": "No reported seizures, abnormal movements, or loss of developmental skills.",
            "psychiatric": "No reported unusual irritability, behavioral change, or sleep concerns.",
            "endocrine": "No reported growth concerns or unusual change in feeding or urine output.",
            "hematologic": "No unusual bruising, bleeding, or swollen glands.",
            "allergic": "No hives, allergic symptoms, or recurrent infections."
          },
          "examination": {
            "general": "Alert, well appearing, and consolable; no acute distress.",
            "head": "Normocephalic and atraumatic.",
            "eyes": "Pupils equal and reactive to light; conjunctivae clear.",
            "ent": "Moist mucous membranes; oropharynx without erythema or exudate.",
            "neck": "Supple without palpable lymphadenopathy.",
            "cardiovascular": "Regular rhythm; no murmur; peripheral perfusion normal.",
            "respiratory": "Unlabored breathing; clear breath sounds bilaterally.",
            "abdomen": "Soft, nondistended, and nontender.",
            "musculoskeletal": "No joint swelling or deformity; movement without limitation.",
            "extremities": "Warm and well perfused; no edema.",
            "skin": "Warm and dry; no rash.",
            "neurological": "Alert and interactive for age; tone and spontaneous movements symmetric.",
            "psychiatric": "Age-appropriate interaction and behavior."
          }
        },
        "child": {
          "ros": {
            "general": "No reported fever, reduced activity, or feeding concerns.",
            "eyes": "No reported eye redness, discharge, or visual concerns.",
            "ent": "No reported ear discomfort, nasal congestion, or swallowing difficulty.",
            "cardiovascular": "No reported cyanosis, fainting, or swelling.",
            "respiratory": "No reported cough, wheezing, apnea, or difficulty breathing.",
            "gastrointestinal": "No reported vomiting, diarrhea, constipation, or abdominal discomfort.",
            "genitourinary": "No reported urinary discomfort, blood in urine, or reduced urine output.",
            "musculoskeletal": "No muscle pain, joint pain, or joint swelling.",
            "skin": "No rash, itching, or new skin lesions.",
            "neurological": "No reported seizures, abnormal movements, or loss of developmental skills.",
            "psychiatric": "No reported unusual irritability, behavioral change, or sleep concerns.",
            "endocrine": "No heat or cold intolerance, excessive thirst, or excessive urination.",
            "hematologic": "No unusual bruising, bleeding, or swollen glands.",
            "allergic": "No hives, allergic symptoms, or recurrent infections."
          },
          "examination": {
            "general": "Alert, interactive, and comfortable; no acute distress.",
            "head": "Normocephalic and atraumatic.",
            "eyes": "Pupils equal and reactive to light; conjunctivae clear.",
            "ent": "Moist mucous membranes; oropharynx without erythema or exudate.",
            "neck": "Supple without palpable lymphadenopathy.",
            "cardiovascular": "Regular rhythm; no murmur; peripheral perfusion normal.",
            "respiratory": "Unlabored breathing; clear breath sounds bilaterally.",
            "abdomen": "Soft, nondistended, and nontender.",
            "musculoskeletal": "No joint swelling or deformity; movement without limitation.",
            "extremities": "Warm and well perfused; no edema.",
            "skin": "Warm and dry; no rash.",
            "neurological": "Alert and interactive for age; tone and spontaneous movements symmetric.",
            "psychiatric": "Age-appropriate interaction and behavior."
          }
        },
        "adolescent": {
          "ros": {
            "general": "No fever, fatigue, unintentional weight change, or growth concerns.",
            "eyes": "No eye pain, redness, or visual changes.",
            "ent": "No ear pain, nasal congestion, or sore throat.",
            "cardiovascular": "No chest pain, palpitations, or swelling.",
            "respiratory": "No cough, wheezing, or shortness of breath.",
            "gastrointestinal": "No abdominal pain, nausea, vomiting, or diarrhea.",
            "genitourinary": "No dysuria, hematuria, or change in urine output.",
            "musculoskeletal": "No muscle pain, joint pain, or joint swelling.",
            "skin": "No rash, itching, or new skin lesions.",
            "neurological": "No headache, dizziness, weakness, numbness, or seizures.",
            "psychiatric": "No mood, anxiety, or sleep concerns.",
            "endocrine": "No heat or cold intolerance, excessive thirst, or excessive urination.",
            "hematologic": "No unusual bruising, bleeding, or swollen glands.",
            "allergic": "No hives, allergic symptoms, or recurrent infections."
          },
          "examination": {
            "general": "Alert, comfortable, and in no acute distress.",
            "head": "Normocephalic and atraumatic.",
            "eyes": "Pupils equal and reactive to light; conjunctivae clear.",
            "ent": "Moist mucous membranes; oropharynx without erythema or exudate.",
            "neck": "Supple without palpable lymphadenopathy.",
            "cardiovascular": "Regular rhythm; no murmur; peripheral perfusion normal.",
            "respiratory": "Unlabored breathing; clear breath sounds bilaterally.",
            "abdomen": "Soft, nondistended, and nontender.",
            "musculoskeletal": "No joint swelling or deformity; movement without limitation.",
            "extremities": "Warm and well perfused; no edema.",
            "skin": "Warm and dry; no rash.",
            "neurological": "Alert; speech clear; strength and sensation symmetric.",
            "psychiatric": "Cooperative with appropriate affect."
          }
        },
        "adult": {
          "ros": {
            "general": "No fever, chills, fatigue, or unintentional weight change.",
            "eyes": "No eye pain, redness, or visual changes.",
            "ent": "No ear pain, nasal congestion, or sore throat.",
            "cardiovascular": "No chest pain, palpitations, or swelling.",
            "respiratory": "No cough, wheezing, or shortness of breath.",
            "gastrointestinal": "No abdominal pain, nausea, vomiting, or diarrhea.",
            "genitourinary": "No dysuria, hematuria, or change in urine output.",
            "musculoskeletal": "No muscle pain, joint pain, or joint swelling.",
            "skin": "No rash, itching, or new skin lesions.",
            "neurological": "No headache, dizziness, weakness, numbness, or seizures.",
            "psychiatric": "No mood, anxiety, or sleep concerns.",
            "endocrine": "No heat or cold intolerance, excessive thirst, or excessive urination.",
            "hematologic": "No unusual bruising, bleeding, or swollen glands.",
            "allergic": "No hives, allergic symptoms, or recurrent infections."
          },
          "examination": {
            "general": "Alert, comfortable, and in no acute distress.",
            "head": "Normocephalic and atraumatic.",
            "eyes": "Pupils equal and reactive to light; conjunctivae clear.",
            "ent": "Moist mucous membranes; oropharynx without erythema or exudate.",
            "neck": "Supple without palpable lymphadenopathy.",
            "cardiovascular": "Regular rhythm; no murmur; peripheral perfusion normal.",
            "respiratory": "Unlabored breathing; clear breath sounds bilaterally.",
            "abdomen": "Soft, nondistended, and nontender.",
            "musculoskeletal": "No joint swelling or deformity; movement without limitation.",
            "extremities": "Warm and well perfused; no edema.",
            "skin": "Warm and dry; no rash.",
            "neurological": "Alert; speech clear; strength and sensation symmetric.",
            "psychiatric": "Cooperative with appropriate affect."
          }
        },
        "olderAdult": {
          "ros": {
            "general": "No fever, chills, fatigue, or unintentional weight change.",
            "eyes": "No eye pain, redness, or visual changes.",
            "ent": "No ear pain, nasal congestion, or sore throat.",
            "cardiovascular": "No chest pain, palpitations, or swelling.",
            "respiratory": "No cough, wheezing, or shortness of breath.",
            "gastrointestinal": "No abdominal pain, nausea, vomiting, or diarrhea.",
            "genitourinary": "No dysuria, hematuria, or change in urine output.",
            "musculoskeletal": "No muscle pain, joint pain, or joint swelling.",
            "skin": "No rash, itching, or new skin lesions.",
            "neurological": "No headache, dizziness, focal weakness, numbness, falls, or new confusion.",
            "psychiatric": "No new mood, sleep, memory, or functional concerns.",
            "endocrine": "No heat or cold intolerance, excessive thirst, or excessive urination.",
            "hematologic": "No unusual bruising, bleeding, or swollen glands.",
            "allergic": "No hives, allergic symptoms, or recurrent infections."
          },
          "examination": {
            "general": "Alert, comfortable, and in no acute distress.",
            "head": "Normocephalic and atraumatic.",
            "eyes": "Pupils equal and reactive to light; conjunctivae clear.",
            "ent": "Moist mucous membranes; oropharynx without erythema or exudate.",
            "neck": "Supple without palpable lymphadenopathy.",
            "cardiovascular": "Regular rhythm; no murmur; peripheral perfusion normal.",
            "respiratory": "Unlabored breathing; clear breath sounds bilaterally.",
            "abdomen": "Soft, nondistended, and nontender.",
            "musculoskeletal": "No joint swelling or deformity; movement without limitation.",
            "extremities": "Warm and well perfused; no edema.",
            "skin": "Warm and dry; no rash.",
            "neurological": "Alert; speech clear; strength and sensation symmetric.",
            "psychiatric": "Attentive and cooperative; no apparent acute confusion."
          }
        },
        "unspecified": {
          "ros": {
            "general": "No symptoms reported.",
            "eyes": "No symptoms reported.",
            "ent": "No symptoms reported.",
            "cardiovascular": "No symptoms reported.",
            "respiratory": "No symptoms reported.",
            "gastrointestinal": "No symptoms reported.",
            "genitourinary": "No symptoms reported.",
            "musculoskeletal": "No symptoms reported.",
            "skin": "No symptoms reported.",
            "neurological": "No symptoms reported.",
            "psychiatric": "No symptoms reported.",
            "endocrine": "No symptoms reported.",
            "hematologic": "No symptoms reported.",
            "allergic": "No symptoms reported."
          },
          "examination": {
            "general": "No abnormal findings.",
            "head": "No abnormal findings.",
            "eyes": "No abnormal findings.",
            "ent": "No abnormal findings.",
            "neck": "No abnormal findings.",
            "cardiovascular": "No abnormal findings.",
            "respiratory": "No abnormal findings.",
            "abdomen": "No abnormal findings.",
            "musculoskeletal": "No abnormal findings.",
            "extremities": "No abnormal findings.",
            "skin": "No abnormal findings.",
            "neurological": "No abnormal findings.",
            "psychiatric": "No abnormal findings."
          }
        }
      },
      "policy": "Author-selected fictional teaching findings. Materialize explicit editable text; preserve existing values including blanks. Age changes do not rewrite authored findings. Missing fields remain unspecified. Intimate examinations are excluded."
    },
    {
      "id": "usim:unavailable-ros",
      "version": "1.0.0",
      "scope": "Whole review of systems; author-selected and age-independent.",
      "storagePath": "patients.history.ros[\"Unable to obtain\"]",
      "valueType": "string",
      "reasons": [
        {
          "label": "Reason not specified",
          "value": "Unable to obtain review of systems."
        },
        {
          "label": "Clinical condition / acuity",
          "value": "Unable to obtain review of systems due to clinical condition or acuity."
        },
        {
          "label": "Altered mental status",
          "value": "Unable to obtain review of systems due to altered mental status."
        },
        {
          "label": "Unconsciousness",
          "value": "Unable to obtain review of systems due to unconsciousness."
        },
        {
          "label": "Intubation / sedation",
          "value": "Unable to obtain review of systems due to intubation or sedation."
        },
        {
          "label": "Developmental limitations",
          "value": "Unable to obtain review of systems due to developmental limitations."
        },
        {
          "label": "Cognitive impairment",
          "value": "Unable to obtain review of systems due to cognitive impairment."
        },
        {
          "label": "Communication barrier",
          "value": "Unable to obtain review of systems due to a communication barrier."
        },
        {
          "label": "Patient declined",
          "value": "Unable to obtain review of systems due to the patient declining assessment."
        },
        {
          "label": "Collateral historian unavailable",
          "value": "Unable to obtain review of systems due to an unavailable collateral historian."
        },
        {
          "label": "Other limitation",
          "value": "Unable to obtain review of systems due to another limitation."
        }
      ],
      "policy": "Selecting Unable to obtain replaces the complete ROS record with this single entry, initially using Reason not specified. Store the selected reason's value, not its label. Preserve legacy custom reason strings on import. Default removes the unavailable entry and materializes age-specific normal findings. Removing the entry leaves ROS unspecified. Never infer inability from age, diagnosis, sedation, or an omitted ROS. This status is not a negative symptom finding.",
      "example": {
        "patients": {
          "history": {
            "ros": {
              "Unable to obtain": "Unable to obtain review of systems due to clinical condition or acuity."
            }
          }
        }
      }
    }
  ],
  "implementationAuthoring": {
    "format": "usim-authoring-specification",
    "formatVersion": "1.4.0",
    "profile": {
      "id": "usim:suite",
      "version": "3.1.0",
      "schemaId": "https://u-sim.app/schemas/suite/3.1.0/scenario.json"
    },
    "sections": [
      {
        "key": "metadata",
        "builderLabel": "Overview",
        "label": "Scenario details",
        "path": "metadata"
      },
      {
        "key": "patients",
        "builderLabel": "Patients",
        "label": "Patient",
        "path": "patients"
      },
      {
        "key": "environment",
        "builderLabel": "Environment",
        "label": "Setting & team",
        "path": "environment"
      },
      {
        "key": "education",
        "builderLabel": "Education",
        "label": "Learning",
        "path": "education"
      },
      {
        "key": "objects",
        "builderLabel": "Resources",
        "label": "Resources",
        "path": "events.objects"
      },
      {
        "key": "states",
        "builderLabel": "Events",
        "label": "States",
        "path": "events.states"
      },
      {
        "key": "actions",
        "builderLabel": "Interactions",
        "label": "Interactions",
        "path": "events.actions"
      }
    ],
    "builderSections": [
      {
        "key": "metadata",
        "builderLabel": "Overview",
        "label": "Overview",
        "path": "metadata",
        "id": "metadata"
      },
      {
        "key": "patients",
        "builderLabel": "Patients",
        "label": "Patients",
        "path": "patients",
        "id": "patients"
      },
      {
        "key": "environment",
        "builderLabel": "Environment",
        "label": "Environment",
        "path": "environment",
        "id": "environment"
      },
      {
        "key": "objects",
        "builderLabel": "Resources",
        "label": "Resources",
        "path": "events.objects",
        "id": "objects"
      },
      {
        "key": "states",
        "builderLabel": "Events",
        "label": "Events",
        "path": "events.states",
        "id": "events"
      },
      {
        "key": "education",
        "builderLabel": "Education",
        "label": "Education",
        "path": "education",
        "id": "education"
      }
    ],
    "schema": {
      "title": "u-sim Suite scenario",
      "additionalProperties": false,
      "x-usim": {
        "authoring": {}
      },
      "type": "object",
      "required": [
        "metadata",
        "patients",
        "environment",
        "education",
        "events"
      ],
      "properties": {
        "metadata": {
          "additionalProperties": false,
          "x-usim": {
            "authoring": {
              "columns": 3
            }
          },
          "type": "object",
          "required": [
            "title",
            "description",
            "author"
          ],
          "properties": {
            "title": {
              "title": "Title",
              "maxLength": 160,
              "x-usim": {
                "authoring": {
                  "span": "full"
                }
              },
              "type": "string",
              "description": "A concise case title that helps authors and learners identify this scenario."
            },
            "description": {
              "title": "Description",
              "maxLength": 8000,
              "x-usim": {
                "authoring": {
                  "editor": "textarea",
                  "span": "full"
                }
              },
              "type": "string",
              "description": "The scenario premise, scope, and intended learning activity."
            },
            "author": {
              "title": "Author",
              "maxLength": 160,
              "x-usim": {
                "authoring": {
                  "span": "full"
                }
              },
              "type": "string",
              "description": "The person or team credited with creating this scenario."
            },
            "diagnosis": {
              "title": "Diagnosis or case theme",
              "maxLength": 1000,
              "x-usim": {
                "authoring": {
                  "editor": "diagnosis",
                  "span": "full",
                  "group": "Scenario context"
                }
              },
              "type": "string",
              "description": "The main diagnosis or case theme that guides the scenario."
            },
            "specialty": {
              "title": "Specialty",
              "maxLength": 1000,
              "x-usim": {
                "authoring": {
                  "editor": "specialty",
                  "group": "Scenario context"
                }
              },
              "type": "string",
              "description": "The clinical specialty or specialties relevant to this scenario."
            },
            "level": {
              "title": "Learner level",
              "maxLength": 1000,
              "x-usim": {
                "authoring": {
                  "editor": "level",
                  "group": "Scenario context"
                }
              },
              "type": "string",
              "description": "The intended learner level and experience."
            },
            "durationMinutes": {
              "title": "Suggested duration · minutes",
              "minimum": 1,
              "maximum": 1440,
              "x-usim": {
                "unit": "min",
                "authoring": {
                  "group": "Scenario context"
                }
              },
              "type": "number",
              "description": "The suggested scenario duration in minutes; this does not control the simulation clock."
            }
          },
          "description": "Case identification, authorship, and the teaching context used to find and select this scenario."
        },
        "patients": {
          "additionalProperties": false,
          "x-usim": {
            "authoring": {}
          },
          "type": "object",
          "required": [
            "name",
            "context"
          ],
          "properties": {
            "name": {
              "title": "Patient name",
              "maxLength": 160,
              "x-usim": {
                "authoring": {}
              },
              "type": "string",
              "description": "The fictional patient's display name."
            },
            "context": {
              "title": "Patient context",
              "maxLength": 8000,
              "x-usim": {
                "authoring": {
                  "editor": "textarea"
                }
              },
              "type": "string",
              "description": "The patient's opening situation and the context available at the start of the scenario."
            },
            "photo": {
              "title": "Patient photo",
              "additionalProperties": false,
              "x-usim": {
                "authoring": {
                  "editor": "patient-photo",
                  "span": "full"
                }
              },
              "type": "object",
              "required": [
                "dataUrl",
                "description"
              ],
              "properties": {
                "dataUrl": {
                  "title": "Photo",
                  "maxLength": 12582912,
                  "x-usim": {
                    "authoring": {}
                  },
                  "type": "string",
                  "description": "The patient photo encoded as a data URL. Use the photo upload control to populate it."
                },
                "description": {
                  "title": "Photo description",
                  "maxLength": 1000,
                  "x-usim": {
                    "authoring": {}
                  },
                  "type": "string",
                  "description": "Describe the patient's appearance for readers who cannot see the photo."
                }
              },
              "description": "An optional embedded patient photo that travels with the scenario. Upload a PNG, JPEG, or WebP image."
            },
            "demographics": {
              "title": "Demographics",
              "additionalProperties": false,
              "x-usim": {
                "authoring": {
                  "editor": "demographics"
                }
              },
              "type": "object",
              "properties": {
                "age": {
                  "title": "Age · years",
                  "minimum": 0,
                  "maximum": 150,
                  "x-usim": {
                    "unit": "years",
                    "authoring": {
                      "slider": {
                        "minimum": 0,
                        "maximum": 150,
                        "step": 1
                      }
                    }
                  },
                  "type": "number",
                  "description": "Patient age in years. Use the patient narrative to clarify a young infant's age when needed."
                },
                "weightKg": {
                  "title": "Weight · kg",
                  "minimum": 0,
                  "maximum": 1000,
                  "x-usim": {
                    "unit": "kg",
                    "authoring": {
                      "slider": {
                        "minimum": 0,
                        "maximum": 300,
                        "step": 1,
                        "style": "ruler"
                      }
                    }
                  },
                  "type": "number",
                  "description": "Patient weight, stored in kilograms. The editor can also display pounds."
                },
                "heightCm": {
                  "title": "Height · cm",
                  "minimum": 0,
                  "maximum": 400,
                  "x-usim": {
                    "unit": "cm",
                    "authoring": {
                      "slider": {
                        "minimum": 0,
                        "maximum": 250,
                        "step": 1,
                        "style": "ruler"
                      }
                    }
                  },
                  "type": "number",
                  "description": "Patient height, stored in centimeters. The editor can also display feet and inches."
                },
                "gender": {
                  "title": "Gender",
                  "maxLength": 160,
                  "x-usim": {
                    "authoring": {
                      "editor": "gender"
                    }
                  },
                  "type": "string",
                  "description": "The patient's authored gender description."
                },
                "heightUnit": {
                  "type": "string",
                  "title": "Height display unit",
                  "enum": [
                    "cm",
                    "in",
                    "ft-in"
                  ],
                  "x-usim": {
                    "authoring": {
                      "hidden": true
                    }
                  },
                  "description": "Preferred height display unit in the scenario editor; the measurement remains stored in centimeters."
                },
                "weightUnit": {
                  "type": "string",
                  "title": "Weight display unit",
                  "enum": [
                    "kg",
                    "lb"
                  ],
                  "x-usim": {
                    "authoring": {
                      "hidden": true
                    }
                  },
                  "description": "Preferred weight display unit in the scenario editor; the measurement remains stored in kilograms."
                }
              },
              "description": "Patient age, gender, height, and weight used to describe the case."
            },
            "history": {
              "title": "History",
              "additionalProperties": false,
              "x-usim": {
                "authoring": {
                  "columns": 6
                }
              },
              "type": "object",
              "properties": {
                "chiefComplaint": {
                  "title": "Chief complaint",
                  "maxLength": 8000,
                  "x-usim": {
                    "authoring": {
                      "span": "full"
                    }
                  },
                  "type": "string",
                  "description": "The main symptom or concern prompting care, ideally in the patient's own words. This is the scenario title shown to learners."
                },
                "presentIllness": {
                  "title": "History of present illness",
                  "maxLength": 8000,
                  "x-usim": {
                    "authoring": {
                      "editor": "textarea",
                      "span": "full"
                    }
                  },
                  "type": "string",
                  "description": "Describe symptom onset, progression, associated symptoms, relevant negatives, and treatment before arrival."
                },
                "medical": {
                  "title": "Medical history / comorbidities",
                  "maxItems": 64,
                  "x-usim": {
                    "authoring": {
                      "addLabel": "Add item",
                      "span": 2
                    }
                  },
                  "type": "array",
                  "items": {
                    "title": "Item",
                    "maxLength": 1000,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "string",
                    "description": "One prior diagnosis or ongoing condition, with relevant severity or treatment."
                  },
                  "description": "Relevant diagnoses and comorbidities, one condition per entry. Include details that affect decisions in this case."
                },
                "surgical": {
                  "title": "Surgical history",
                  "maxItems": 64,
                  "x-usim": {
                    "authoring": {
                      "addLabel": "Add item",
                      "span": 2
                    }
                  },
                  "type": "array",
                  "items": {
                    "title": "Item",
                    "maxLength": 1000,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "string",
                    "description": "One previous operation or procedure, including its approximate date and relevant outcome."
                  },
                  "description": "Previous operations or procedures relevant to the case, with timing and complications when useful."
                },
                "medications": {
                  "title": "Home medications",
                  "maxItems": 64,
                  "x-usim": {
                    "authoring": {
                      "addLabel": "Add item",
                      "span": 2
                    }
                  },
                  "type": "array",
                  "items": {
                    "title": "Item",
                    "maxLength": 1000,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "string",
                    "description": "One home medication, using its generic name and relevant dose, route, and frequency."
                  },
                  "description": "Medications taken before this encounter. Include dose, route, frequency, and adherence when relevant."
                },
                "allergies": {
                  "title": "Allergies",
                  "maxItems": 64,
                  "x-usim": {
                    "authoring": {
                      "editor": "allergies",
                      "span": "full"
                    }
                  },
                  "type": "array",
                  "items": {
                    "anyOf": [
                      {
                        "maxLength": 1000,
                        "description": "A concise allergy history entry naming the substance and known reaction, or explicitly stating no known allergies or unknown history.",
                        "type": "string"
                      },
                      {
                        "additionalProperties": false,
                        "x-usim": {
                          "authoring": {}
                        },
                        "type": "object",
                        "required": [
                          "substance"
                        ],
                        "properties": {
                          "substance": {
                            "title": "Substance",
                            "maxLength": 1000,
                            "x-usim": {
                              "authoring": {}
                            },
                            "type": "string",
                            "description": "The medication, food, or other substance associated with the allergy."
                          },
                          "reaction": {
                            "title": "Reaction",
                            "maxLength": 1000,
                            "x-usim": {
                              "authoring": {}
                            },
                            "type": "string",
                            "description": "What happened after exposure, such as hives or wheezing. State when the reaction is unknown."
                          },
                          "severity": {
                            "type": "string",
                            "title": "Severity",
                            "enum": [
                              "mild",
                              "moderate",
                              "severe",
                              "unknown"
                            ],
                            "description": "The reported severity of the allergic reaction; choose unknown when it has not been established."
                          }
                        }
                      }
                    ],
                    "description": "One allergy as text or as a substance, reaction, and severity record."
                  },
                  "description": "Known allergies and reactions. Distinguish no known allergies from an unknown allergy history."
                },
                "family": {
                  "title": "Family history",
                  "maxLength": 8000,
                  "x-usim": {
                    "authoring": {
                      "editor": "textarea",
                      "span": 3
                    }
                  },
                  "type": "string",
                  "description": "Family conditions or inherited risks relevant to the presentation; include pertinent negative history."
                },
                "social": {
                  "title": "Social history",
                  "maxLength": 8000,
                  "x-usim": {
                    "authoring": {
                      "editor": "textarea",
                      "span": 3
                    }
                  },
                  "type": "string",
                  "description": "Living situation, supports, occupation, exposures, and substance use relevant to care."
                },
                "ros": {
                  "title": "Review of systems",
                  "maxProperties": 64,
                  "propertyNames": {
                    "maxLength": 100,
                    "not": {
                      "enum": [
                        "__proto__",
                        "constructor",
                        "prototype"
                      ]
                    }
                  },
                  "x-usim": {
                    "authoring": {
                      "editor": "ros",
                      "span": "full"
                    }
                  },
                  "type": "object",
                  "patternProperties": {
                    "^(.*)$": {
                      "maxLength": 4000,
                      "type": "string"
                    }
                  },
                  "description": "Symptoms reported by body system, including relevant positives and negatives. Record examination findings separately."
                }
              },
              "description": "The history available about this patient, including symptoms, background, medications, and allergies."
            },
            "examination": {
              "title": "Examination",
              "maxProperties": 64,
              "propertyNames": {
                "maxLength": 100,
                "not": {
                  "enum": [
                    "__proto__",
                    "constructor",
                    "prototype"
                  ]
                }
              },
              "x-usim": {
                "authoring": {
                  "editor": "examination",
                  "span": "full"
                }
              },
              "type": "object",
              "patternProperties": {
                "^(.*)$": {
                  "maxLength": 4000,
                  "type": "string"
                }
              },
              "description": "The physical examination findings available to the learner."
            },
            "monitor": {
              "title": "Monitor",
              "additionalProperties": false,
              "x-usim": {
                "authoring": {
                  "editor": "monitor"
                }
              },
              "type": "object",
              "properties": {
                "rhythm": {
                  "type": "string",
                  "title": "Monitor rhythm",
                  "enum": [
                    "sinus",
                    "sinus_tachycardia",
                    "sinus_bradycardia",
                    "atrial_fibrillation",
                    "atrial_flutter",
                    "svt",
                    "ventricular_tachycardia",
                    "torsades",
                    "ventricular_fibrillation",
                    "asystole",
                    "av_block_1",
                    "av_block_2_mobitz_1",
                    "av_block_2_mobitz_2",
                    "av_block_3",
                    "junctional",
                    "ventricular_paced"
                  ],
                  "description": "The ECG rhythm displayed on the monitor. Select the rhythm separately from whether the patient has a palpable pulse."
                },
                "pulsePresent": {
                  "title": "Pulse present",
                  "type": "boolean",
                  "description": "Whether a palpable pulse is present. Use this to distinguish perfusing and pulseless presentations of the displayed rhythm."
                },
                "connections": {
                  "title": "Monitor connections",
                  "additionalProperties": false,
                  "x-usim": {
                    "authoring": {}
                  },
                  "type": "object",
                  "properties": {
                    "ecg": {
                      "title": "ECG",
                      "type": "boolean",
                      "description": "ECG: connected exposes the available measurement; disconnected hides it without changing physiology."
                    },
                    "bloodPressure": {
                      "title": "Blood pressure cuff",
                      "type": "boolean",
                      "description": "Blood pressure cuff: connected exposes the available measurement; disconnected hides it without changing physiology."
                    },
                    "spo2": {
                      "title": "Pulse oximetry",
                      "type": "boolean",
                      "description": "Pulse oximetry: connected exposes the available measurement; disconnected hides it without changing physiology."
                    },
                    "respiration": {
                      "title": "Respiratory monitoring",
                      "type": "boolean",
                      "description": "Respiratory monitoring: connected exposes the available measurement; disconnected hides it without changing physiology."
                    },
                    "temperature": {
                      "title": "Temperature probe",
                      "type": "boolean",
                      "description": "Temperature probe: connected exposes the available measurement; disconnected hides it without changing physiology."
                    },
                    "capnography": {
                      "title": "Capnography",
                      "type": "boolean",
                      "description": "Capnography: connected exposes the available measurement; disconnected hides it without changing physiology."
                    },
                    "arterialPressure": {
                      "title": "Arterial pressure",
                      "type": "boolean",
                      "description": "Arterial pressure: connected exposes the available measurement; disconnected hides it without changing physiology."
                    }
                  },
                  "description": "Connected channels expose available measurements without changing physiology. An explicit empty patient connection map starts disconnected. Omitted event channels inherit their preceding connection. Omitting the patient connection map makes available channels connected."
                }
              },
              "description": "The monitor configuration used to present patient observations."
            },
            "vitals": {
              "title": "Vital signs",
              "additionalProperties": false,
              "x-usim": {
                "authoring": {
                  "columns": 3
                }
              },
              "type": "object",
              "properties": {
                "hr": {
                  "title": "Heart rate · bpm",
                  "minimum": 0,
                  "maximum": 1000,
                  "x-usim": {
                    "unit": "beats/min",
                    "referenceRange": {
                      "minimum": 60,
                      "maximum": 100,
                      "minimumAgeYears": 18,
                      "label": "Adult resting reference",
                      "source": "https://medlineplus.gov/ency/article/002341.htm"
                    },
                    "authoring": {
                      "slider": {
                        "minimum": 0,
                        "maximum": 250,
                        "step": 1
                      }
                    }
                  },
                  "type": "number",
                  "description": "Heart rate in beats per minute. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                },
                "sbp": {
                  "title": "Systolic BP · mmHg",
                  "minimum": 0,
                  "maximum": 1000,
                  "x-usim": {
                    "unit": "mmHg",
                    "referenceRange": {
                      "minimum": 90,
                      "maximum": 120,
                      "minimumAgeYears": 18,
                      "label": "Adult resting reference",
                      "source": "https://medlineplus.gov/ency/article/002341.htm"
                    },
                    "authoring": {
                      "slider": {
                        "minimum": 0,
                        "maximum": 300,
                        "step": 1
                      }
                    }
                  },
                  "type": "number",
                  "description": "Noninvasive systolic blood pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                },
                "dbp": {
                  "title": "Diastolic BP · mmHg",
                  "minimum": 0,
                  "maximum": 1000,
                  "x-usim": {
                    "unit": "mmHg",
                    "referenceRange": {
                      "minimum": 60,
                      "maximum": 80,
                      "minimumAgeYears": 18,
                      "label": "Adult resting reference",
                      "source": "https://medlineplus.gov/ency/article/002341.htm"
                    },
                    "authoring": {
                      "slider": {
                        "minimum": 0,
                        "maximum": 200,
                        "step": 1
                      }
                    }
                  },
                  "type": "number",
                  "description": "Noninvasive diastolic blood pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                },
                "rr": {
                  "title": "Respiratory rate · /min",
                  "minimum": 0,
                  "maximum": 1000,
                  "x-usim": {
                    "unit": "breaths/min",
                    "referenceRange": {
                      "minimum": 12,
                      "maximum": 18,
                      "minimumAgeYears": 18,
                      "label": "Adult resting reference",
                      "source": "https://medlineplus.gov/ency/article/002341.htm"
                    },
                    "authoring": {
                      "slider": {
                        "minimum": 0,
                        "maximum": 80,
                        "step": 1
                      }
                    }
                  },
                  "type": "number",
                  "description": "Respiratory rate in breaths per minute. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                },
                "spo2": {
                  "title": "Oxygen saturation · %",
                  "minimum": 0,
                  "maximum": 100,
                  "x-usim": {
                    "unit": "%",
                    "referenceRange": {
                      "minimum": 95,
                      "maximum": 100,
                      "minimumAgeYears": 18,
                      "label": "Adult resting reference",
                      "source": "https://www.fda.gov/consumers/consumer-updates/pulse-oximeter-basics"
                    },
                    "authoring": {
                      "slider": {
                        "minimum": 0,
                        "maximum": 100,
                        "step": 1
                      }
                    }
                  },
                  "type": "number",
                  "description": "Peripheral oxygen saturation as a percentage from 0 to 100. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                },
                "temperature": {
                  "title": "Temperature · °C",
                  "minimum": 0,
                  "maximum": 1000,
                  "x-usim": {
                    "unit": "Cel",
                    "referenceRange": {
                      "minimum": 36.5,
                      "maximum": 37.3,
                      "minimumAgeYears": 18,
                      "label": "Adult resting reference",
                      "source": "https://medlineplus.gov/ency/article/002341.htm"
                    },
                    "authoring": {
                      "slider": {
                        "minimum": 25,
                        "maximum": 45,
                        "step": 0.1
                      }
                    }
                  },
                  "type": "number",
                  "description": "Body temperature in degrees Celsius. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                },
                "etco2": {
                  "title": "End-tidal CO₂ · mmHg",
                  "minimum": 0,
                  "maximum": 1000,
                  "x-usim": {
                    "unit": "mmHg",
                    "authoring": {}
                  },
                  "type": "number",
                  "description": "End-tidal carbon dioxide pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                },
                "artSbp": {
                  "title": "Arterial systolic BP · mmHg",
                  "minimum": 0,
                  "maximum": 1000,
                  "x-usim": {
                    "unit": "mmHg",
                    "authoring": {}
                  },
                  "type": "number",
                  "description": "Invasive arterial systolic blood pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                },
                "artDbp": {
                  "title": "Arterial diastolic BP · mmHg",
                  "minimum": 0,
                  "maximum": 1000,
                  "x-usim": {
                    "unit": "mmHg",
                    "authoring": {}
                  },
                  "type": "number",
                  "description": "Invasive arterial diastolic blood pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                }
              },
              "description": "Absolute resulting measurements, never signed deltas. Omitted values are unspecified or inherited in an event context. Bounds are storage limits, not clinical reference intervals."
            }
          },
          "description": "The fictional patient's presentation, history, examination, and starting observations."
        },
        "environment": {
          "additionalProperties": false,
          "x-usim": {
            "authoring": {}
          },
          "type": "object",
          "required": [
            "setting",
            "requirements"
          ],
          "properties": {
            "setting": {
              "title": "Setting",
              "maxLength": 2000,
              "x-usim": {
                "authoring": {
                  "editor": "textarea"
                }
              },
              "type": "string",
              "description": "Where the scenario takes place and the relevant features of the care environment."
            },
            "requirements": {
              "title": "Preparation requirements",
              "maxItems": 32,
              "description": "Pre-session tasks for the simulation center, each with a concrete action and setup outcome. Equipment and supplies belong in equipment.",
              "x-usim": {
                "authoring": {
                  "addLabel": "Add requirement"
                }
              },
              "type": "array",
              "items": {
                "title": "Requirement",
                "maxLength": 240,
                "x-usim": {
                  "authoring": {}
                },
                "type": "string",
                "description": "One pre-session setup task with a concrete outcome, such as programming initial manikin observations or briefing an actor."
              }
            },
            "equipment": {
              "title": "Equipment",
              "maxItems": 64,
              "x-usim": {
                "authoring": {
                  "addLabel": "Add item"
                }
              },
              "type": "array",
              "items": {
                "title": "Item",
                "maxLength": 1000,
                "x-usim": {
                  "authoring": {}
                },
                "type": "string",
                "description": "One item of equipment or supplies needed for the session, with configuration or an acceptable substitute when useful."
              },
              "description": "The equipment and supplies needed to run the scenario."
            },
            "actors": {
              "title": "Scenario actors",
              "maxItems": 32,
              "x-usim": {
                "authoring": {
                  "addLabel": "Add actor"
                }
              },
              "type": "array",
              "items": {
                "title": "Actor",
                "additionalProperties": false,
                "x-usim": {
                  "authoring": {}
                },
                "type": "object",
                "required": [
                  "id",
                  "name",
                  "role",
                  "brief"
                ],
                "properties": {
                  "id": {
                    "title": "Identifier",
                    "minLength": 1,
                    "maxLength": 128,
                    "pattern": "\\S",
                    "x-usim": {
                      "authoring": {
                        "hidden": true
                      }
                    },
                    "type": "string",
                    "description": "A stable identifier used to reference this entry. Keep it unchanged when editing the entry's name or content."
                  },
                  "name": {
                    "title": "Actor name",
                    "maxLength": 160,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "string",
                    "description": "The character's name or role-player label used to identify this actor."
                  },
                  "role": {
                    "title": "Actor role",
                    "maxLength": 1000,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "string",
                    "description": "The character's relationship to the patient or care team, such as parent, bedside nurse, or consultant."
                  },
                  "brief": {
                    "title": "Actor brief",
                    "maxLength": 8000,
                    "x-usim": {
                      "authoring": {
                        "editor": "textarea"
                      }
                    },
                    "type": "string",
                    "description": "Tell the actor what they know, how to behave, what to disclose, and how to respond to likely learner actions."
                  },
                  "demographics": {
                    "title": "Voice demographics",
                    "additionalProperties": false,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "object",
                    "properties": {
                      "age": {
                        "title": "Age · years",
                        "minimum": 0,
                        "maximum": 150,
                        "x-usim": {
                          "unit": "years",
                          "authoring": {}
                        },
                        "type": "number",
                        "description": "The character's age in years, used to guide natural voice delivery without exaggeration."
                      },
                      "gender": {
                        "title": "Gender",
                        "maxLength": 160,
                        "x-usim": {
                          "authoring": {
                            "editor": "gender"
                          }
                        },
                        "type": "string",
                        "description": "The character's authored gender, used for default voice selection. Never inferred from their name or occupation."
                      }
                    },
                    "description": "Optional authored age and gender for voice casting. Omit unknown details; voice uses a neutral adult default."
                  }
                },
                "description": "One role-player's identity, role in the case, and instructions for responding to learners."
              },
              "description": "The people portraying scenario roles, with their names, roles, and briefing instructions."
            },
            "patientScene": {
              "title": "Patient scene",
              "additionalProperties": false,
              "x-usim": {
                "import": false,
                "authoring": {
                  "editor": "scene"
                }
              },
              "type": "object",
              "required": [
                "modelUrl",
                "attribution",
                "markers"
              ],
              "properties": {
                "modelUrl": {
                  "title": "Patient model URL",
                  "minLength": 1,
                  "maxLength": 2000,
                  "type": "string",
                  "description": "The URL of the patient model to load in the 3D scene. Use a model accessible to the simulation viewer."
                },
                "attribution": {
                  "title": "Model attribution",
                  "maxLength": 2000,
                  "x-usim": {
                    "authoring": {}
                  },
                  "type": "string",
                  "description": "Credit the model creator and record the source and license or permission to use it."
                },
                "markers": {
                  "maxItems": 128,
                  "type": "array",
                  "items": {
                    "additionalProperties": false,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "object",
                    "required": [
                      "actionId",
                      "position",
                      "normal"
                    ],
                    "properties": {
                      "actionId": {
                        "title": "Marker action",
                        "maxLength": 128,
                        "minLength": 1,
                        "pattern": "\\S",
                        "x-usim": {
                          "reference": {
                            "collection": "events.actions",
                            "label": "label",
                            "excludeScheduled": true
                          },
                          "authoring": {}
                        },
                        "type": "string",
                        "description": "The existing learner action to invoke when this hotspot is selected; scheduled transitions cannot be selected."
                      },
                      "position": {
                        "minLength": 1,
                        "maxLength": 160,
                        "pattern": "^-?\\d+(?:\\.\\d+)?(?:m)?\\s+-?\\d+(?:\\.\\d+)?(?:m)?\\s+-?\\d+(?:\\.\\d+)?(?:m)?$",
                        "type": "string",
                        "description": "Hotspot location as three space-separated model-space coordinates (x y z), for example 0m 1m 0m."
                      },
                      "normal": {
                        "minLength": 1,
                        "maxLength": 160,
                        "pattern": "^-?\\d+(?:\\.\\d+)?(?:m)?\\s+-?\\d+(?:\\.\\d+)?(?:m)?\\s+-?\\d+(?:\\.\\d+)?(?:m)?$",
                        "type": "string",
                        "description": "Hotspot surface direction as three space-separated vector components (x y z), for example 0 0 1."
                      }
                    },
                    "description": "One interaction hotspot with an action, a model-space position, and an outward-facing direction."
                  },
                  "description": "Clickable locations on the patient model, each linked to an existing learner interaction."
                }
              },
              "description": "The patient model and scene configuration shown during the simulation."
            }
          },
          "description": "The location, preparation, equipment, and people needed to deliver the simulation."
        },
        "education": {
          "additionalProperties": false,
          "x-usim": {
            "authoring": {}
          },
          "type": "object",
          "required": [
            "objectives",
            "debrief"
          ],
          "properties": {
            "objectives": {
              "title": "Learning objectives",
              "maxItems": 32,
              "x-usim": {
                "authoring": {
                  "editor": "objectives"
                }
              },
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "title": "Learning objective",
                    "maxLength": 1000,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "string"
                  },
                  {
                    "title": "Learning objective",
                    "additionalProperties": false,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "object",
                    "required": [
                      "id",
                      "statement"
                    ],
                    "properties": {
                      "id": {
                        "title": "Identifier",
                        "minLength": 1,
                        "maxLength": 128,
                        "pattern": "\\S",
                        "x-usim": {
                          "authoring": {
                            "hidden": true
                          }
                        },
                        "type": "string",
                        "description": "A stable objective identifier. Preserve it when editing or reordering the objective."
                      },
                      "statement": {
                        "title": "Learning objective",
                        "maxLength": 1000,
                        "x-usim": {
                          "authoring": {}
                        },
                        "type": "string",
                        "description": "An observable learning outcome, using an action verb such as recognize, assess, communicate, or initiate."
                      },
                      "acgmeCompetencies": {
                        "title": "ACGME core competencies",
                        "maxItems": 6,
                        "uniqueItems": true,
                        "type": "array",
                        "items": {
                          "type": "string",
                          "title": "ACGME core competency",
                          "enum": [
                            "PC",
                            "MK",
                            "PBLI",
                            "ICS",
                            "PROF",
                            "SBP"
                          ],
                          "description": "One of the six ACGME core domain codes: PC, MK, PBLI, ICS, PROF, or SBP. Each code may appear only once per objective."
                        },
                        "description": "Optional author-selected ACGME core competency codes. Omitted or empty means unmapped. This is not a Milestone level or a judgment of competence. Do not infer mappings from source text that does not explicitly supply them."
                      }
                    }
                  }
                ],
                "description": "One observable learning goal, using an action verb such as recognize, assess, communicate, or initiate."
              },
              "description": "The observable knowledge, skills, or behaviors learners should demonstrate."
            },
            "debrief": {
              "title": "Debrief prompts",
              "maxLength": 12000,
              "x-usim": {
                "authoring": {
                  "editor": "markdown"
                }
              },
              "type": "string",
              "description": "Prompts for facilitated reflection after the scenario. Formatting is stored as Markdown."
            },
            "audience": {
              "title": "Intended audience",
              "maxLength": 8000,
              "x-usim": {
                "authoring": {
                  "group": "Teaching context"
                }
              },
              "type": "string",
              "description": "Who the scenario is designed for, including profession, training stage, and team composition."
            },
            "prerequisites": {
              "title": "Prerequisites",
              "maxLength": 8000,
              "x-usim": {
                "authoring": {
                  "editor": "markdown",
                  "links": true,
                  "group": "Teaching context"
                }
              },
              "type": "string",
              "description": "Rich-text instructions stored as Markdown for knowledge, skills, modules, or preparation learners should complete before starting."
            },
            "prerequisiteDocuments": {
              "title": "Prerequisite documents",
              "maxItems": 8,
              "x-usim": {
                "import": false,
                "authoring": {
                  "editor": "prerequisite-documents",
                  "group": "Teaching context"
                }
              },
              "type": "array",
              "items": {
                "additionalProperties": false,
                "x-usim": {
                  "authoring": {}
                },
                "type": "object",
                "required": [
                  "id",
                  "name",
                  "dataUrl"
                ],
                "properties": {
                  "id": {
                    "title": "Identifier",
                    "minLength": 1,
                    "maxLength": 128,
                    "pattern": "\\S",
                    "x-usim": {
                      "authoring": {
                        "hidden": true
                      }
                    },
                    "type": "string",
                    "description": "Stable attachment identifier."
                  },
                  "name": {
                    "title": "Document name",
                    "maxLength": 255,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "string",
                    "description": "Original document filename, including its extension."
                  },
                  "dataUrl": {
                    "title": "Document",
                    "maxLength": 6990668,
                    "pattern": "^data:(application/pdf|application/vnd\\.openxmlformats-officedocument\\.wordprocessingml\\.document|application/vnd\\.openxmlformats-officedocument\\.presentationml\\.presentation|text/plain|text/markdown);base64,[A-Za-z0-9+/]*={0,2}$",
                    "type": "string",
                    "description": "Uploaded document bytes stored as a data URL so the material travels with the scenario."
                  }
                },
                "description": "One preparation document with an identifier, filename, and embedded file content."
              },
              "description": "Downloadable learning materials attached by the author for learners to complete before starting. This does not track completion."
            },
            "rationale": {
              "title": "Educational rationale",
              "maxLength": 8000,
              "x-usim": {
                "authoring": {
                  "editor": "textarea",
                  "group": "Teaching context"
                }
              },
              "type": "string",
              "description": "Explain why this case is educationally useful and how its decisions and challenges support the learning objectives."
            },
            "assessment": {
              "title": "Assessment & learning materials",
              "maxItems": 64,
              "x-usim": {
                "authoring": {
                  "editor": "assessment"
                }
              },
              "type": "array",
              "items": {
                "additionalProperties": false,
                "x-usim": {
                  "authoring": {}
                },
                "type": "object",
                "required": [
                  "id",
                  "label",
                  "actionId",
                  "points",
                  "feedback"
                ],
                "properties": {
                  "objectiveId": {
                    "title": "Learning objective",
                    "maxLength": 128,
                    "minLength": 1,
                    "pattern": "\\S",
                    "x-usim": {
                      "reference": {
                        "collection": "education.objectives",
                        "label": "statement",
                        "excludeScheduled": false
                      },
                      "authoring": {
                        "emptyLabel": "No linked objective"
                      }
                    },
                    "type": "string",
                    "description": "Optional link to the stable ID of a structured learning objective. Multiple criteria may support one objective. No link means unspecified, never a failed objective."
                  },
                  "id": {
                    "title": "Identifier",
                    "minLength": 1,
                    "maxLength": 128,
                    "pattern": "\\S",
                    "x-usim": {
                      "authoring": {
                        "hidden": true
                      }
                    },
                    "type": "string",
                    "description": "A stable identifier used to reference this entry. Keep it unchanged when editing the entry's name or content."
                  },
                  "label": {
                    "title": "Skill or objective",
                    "maxLength": 1000,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "string",
                    "minLength": 1,
                    "pattern": "\\S",
                    "description": "Name the observable skill or objective being assessed, such as recognizing deterioration."
                  },
                  "actionId": {
                    "title": "Required action",
                    "maxLength": 128,
                    "minLength": 1,
                    "pattern": "\\S",
                    "x-usim": {
                      "reference": {
                        "collection": "events.actions",
                        "label": "label",
                        "excludeScheduled": true
                      },
                      "authoring": {
                        "emptyLabel": "Choose an action"
                      }
                    },
                    "type": "string",
                    "description": "Select the learner action that earns credit for this criterion. Scheduled transitions cannot earn action credit."
                  },
                  "objectId": {
                    "title": "Equivalent resource",
                    "maxLength": 128,
                    "minLength": 1,
                    "pattern": "\\S",
                    "x-usim": {
                      "reference": {
                        "collection": "events.objects",
                        "label": "name",
                        "excludeScheduled": false
                      },
                      "authoring": {
                        "emptyLabel": "No equivalent resource"
                      }
                    },
                    "type": "string",
                    "description": "Single equivalent resource. Used when objectIds is omitted; the required action's linked resource is used when both are omitted."
                  },
                  "objectIds": {
                    "title": "Equivalent resources",
                    "minItems": 1,
                    "maxItems": 1000,
                    "uniqueItems": true,
                    "type": "array",
                    "items": {
                      "title": "Equivalent resource",
                      "maxLength": 128,
                      "minLength": 1,
                      "pattern": "\\S",
                      "x-usim": {
                        "reference": {
                          "collection": "events.objects",
                          "label": "name",
                          "excludeScheduled": false
                        },
                        "authoring": {}
                      },
                      "type": "string",
                      "description": "The identifier of a learner-requestable resource accepted as an alternative for this assessment criterion."
                    },
                    "description": "Alternative learner-requestable resources that earn credit for this criterion. Any selected request qualifies, using the earliest request time regardless of result delay. Points are awarded once. Omit to use objectId or the required action's linked resource when present."
                  },
                  "points": {
                    "title": "Points",
                    "minimum": 1,
                    "maximum": 100,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "number",
                    "description": "The weight of this criterion in the total score, from 1 to 100. Credit is awarded once when the criterion is met."
                  },
                  "withinSeconds": {
                    "title": "Deadline · seconds",
                    "minimum": 0,
                    "maximum": 86400,
                    "x-usim": {
                      "unit": "s",
                      "authoring": {}
                    },
                    "type": "number",
                    "description": "Latest qualifying action time in seconds from the start of the run, inclusive. Omit to assess the action without a deadline."
                  },
                  "feedback": {
                    "title": "Debrief guidance",
                    "maxLength": 8000,
                    "x-usim": {
                      "authoring": {
                        "editor": "textarea"
                      }
                    },
                    "type": "string",
                    "description": "Explain the expected behavior, why it matters, and what to discuss when the action is completed or missed."
                  },
                  "learningUrl": {
                    "title": "Learning material URL",
                    "maxLength": 2000,
                    "pattern": "^https://[^\\s]+$",
                    "type": "string",
                    "description": "An HTTPS link to learning material relevant to this criterion, such as a guideline or teaching resource."
                  }
                },
                "description": "One scored criterion linking an observable skill to a recorded action, with points and debrief feedback."
              },
              "description": "The authored criteria used to assess learner performance."
            }
          },
          "description": "Learning goals, learner preparation, assessment criteria, and guidance for reflection after the case."
        },
        "events": {
          "additionalProperties": false,
          "x-usim": {
            "authoring": {}
          },
          "type": "object",
          "required": [
            "states",
            "actions"
          ],
          "properties": {
            "states": {
              "title": "States",
              "maxItems": 128,
              "x-usim": {
                "authoring": {
                  "editor": "graph"
                }
              },
              "type": "array",
              "items": {
                "additionalProperties": false,
                "x-usim": {
                  "authoring": {}
                },
                "type": "object",
                "required": [
                  "id",
                  "title",
                  "kind",
                  "learnerNote",
                  "tutorNote"
                ],
                "properties": {
                  "id": {
                    "title": "Identifier",
                    "minLength": 1,
                    "maxLength": 128,
                    "pattern": "\\S",
                    "x-usim": {
                      "authoring": {
                        "hidden": true
                      }
                    },
                    "type": "string",
                    "description": "A stable identifier used to reference this entry. Keep it unchanged when editing the entry's name or content."
                  },
                  "title": {
                    "title": "State title",
                    "maxLength": 240,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "string",
                    "description": "A short name for this phase, such as Initial assessment or Worsening respiratory distress."
                  },
                  "kind": {
                    "type": "string",
                    "title": "State kind",
                    "enum": [
                      "baseline",
                      "triggered",
                      "scheduled",
                      "conclusion"
                    ],
                    "description": "Baseline starts the case; triggered and scheduled describe intermediate phases; conclusion ends the run. A scheduled phase still needs an incoming timed interaction."
                  },
                  "learnerNote": {
                    "title": "Learner prompt",
                    "maxLength": 8000,
                    "x-usim": {
                      "authoring": {
                        "editor": "textarea"
                      }
                    },
                    "type": "string",
                    "description": "Information presented to the learner at this phase: the patient's condition, new findings, or an immediate task. Keep tutor instructions and unrevealed answers in the tutor prompt."
                  },
                  "tutorNote": {
                    "title": "Tutor prompt",
                    "maxLength": 8000,
                    "x-usim": {
                      "authoring": {
                        "editor": "textarea"
                      }
                    },
                    "type": "string",
                    "description": "Guide the tutor through this phase: expected learner actions, cues to offer if learners struggle, and when and why to advance. Include relevant reasoning and facilitation instructions."
                  },
                  "vitals": {
                    "title": "Vital signs",
                    "additionalProperties": false,
                    "x-usim": {
                      "authoring": {
                        "columns": 3
                      }
                    },
                    "type": "object",
                    "properties": {
                      "hr": {
                        "title": "Heart rate · bpm",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "beats/min",
                          "referenceRange": {
                            "minimum": 60,
                            "maximum": 100,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://medlineplus.gov/ency/article/002341.htm"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 0,
                              "maximum": 250,
                              "step": 1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Heart rate in beats per minute. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "sbp": {
                        "title": "Systolic BP · mmHg",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "mmHg",
                          "referenceRange": {
                            "minimum": 90,
                            "maximum": 120,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://medlineplus.gov/ency/article/002341.htm"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 0,
                              "maximum": 300,
                              "step": 1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Noninvasive systolic blood pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "dbp": {
                        "title": "Diastolic BP · mmHg",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "mmHg",
                          "referenceRange": {
                            "minimum": 60,
                            "maximum": 80,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://medlineplus.gov/ency/article/002341.htm"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 0,
                              "maximum": 200,
                              "step": 1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Noninvasive diastolic blood pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "rr": {
                        "title": "Respiratory rate · /min",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "breaths/min",
                          "referenceRange": {
                            "minimum": 12,
                            "maximum": 18,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://medlineplus.gov/ency/article/002341.htm"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 0,
                              "maximum": 80,
                              "step": 1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Respiratory rate in breaths per minute. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "spo2": {
                        "title": "Oxygen saturation · %",
                        "minimum": 0,
                        "maximum": 100,
                        "x-usim": {
                          "unit": "%",
                          "referenceRange": {
                            "minimum": 95,
                            "maximum": 100,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://www.fda.gov/consumers/consumer-updates/pulse-oximeter-basics"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 0,
                              "maximum": 100,
                              "step": 1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Peripheral oxygen saturation as a percentage from 0 to 100. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "temperature": {
                        "title": "Temperature · °C",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "Cel",
                          "referenceRange": {
                            "minimum": 36.5,
                            "maximum": 37.3,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://medlineplus.gov/ency/article/002341.htm"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 25,
                              "maximum": 45,
                              "step": 0.1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Body temperature in degrees Celsius. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "etco2": {
                        "title": "End-tidal CO₂ · mmHg",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "mmHg",
                          "authoring": {}
                        },
                        "type": "number",
                        "description": "End-tidal carbon dioxide pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "artSbp": {
                        "title": "Arterial systolic BP · mmHg",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "mmHg",
                          "authoring": {}
                        },
                        "type": "number",
                        "description": "Invasive arterial systolic blood pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "artDbp": {
                        "title": "Arterial diastolic BP · mmHg",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "mmHg",
                          "authoring": {}
                        },
                        "type": "number",
                        "description": "Invasive arterial diastolic blood pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      }
                    },
                    "description": "Absolute resulting measurements, never signed deltas. Omitted values are unspecified or inherited in an event context. Bounds are storage limits, not clinical reference intervals."
                  },
                  "vitalTrendSeconds": {
                    "title": "Vital trend · seconds",
                    "minimum": 0,
                    "maximum": 86400,
                    "x-usim": {
                      "unit": "s",
                      "authoring": {}
                    },
                    "type": "number",
                    "description": "Seconds over which the current vital values move to this state’s authored targets. Zero or omitted applies the targets immediately. The trend follows simulation time and pauses with the run."
                  },
                  "monitor": {
                    "title": "Monitor",
                    "additionalProperties": false,
                    "x-usim": {
                      "authoring": {
                        "editor": "monitor"
                      }
                    },
                    "type": "object",
                    "properties": {
                      "rhythm": {
                        "type": "string",
                        "title": "Monitor rhythm",
                        "enum": [
                          "sinus",
                          "sinus_tachycardia",
                          "sinus_bradycardia",
                          "atrial_fibrillation",
                          "atrial_flutter",
                          "svt",
                          "ventricular_tachycardia",
                          "torsades",
                          "ventricular_fibrillation",
                          "asystole",
                          "av_block_1",
                          "av_block_2_mobitz_1",
                          "av_block_2_mobitz_2",
                          "av_block_3",
                          "junctional",
                          "ventricular_paced"
                        ],
                        "description": "The ECG rhythm displayed on the monitor. Select the rhythm separately from whether the patient has a palpable pulse."
                      },
                      "pulsePresent": {
                        "title": "Pulse present",
                        "type": "boolean",
                        "description": "Whether a palpable pulse is present. Use this to distinguish perfusing and pulseless presentations of the displayed rhythm."
                      },
                      "connections": {
                        "title": "Monitor connections",
                        "additionalProperties": false,
                        "x-usim": {
                          "authoring": {}
                        },
                        "type": "object",
                        "properties": {
                          "ecg": {
                            "title": "ECG",
                            "type": "boolean",
                            "description": "ECG: connected exposes the available measurement; disconnected hides it without changing physiology."
                          },
                          "bloodPressure": {
                            "title": "Blood pressure cuff",
                            "type": "boolean",
                            "description": "Blood pressure cuff: connected exposes the available measurement; disconnected hides it without changing physiology."
                          },
                          "spo2": {
                            "title": "Pulse oximetry",
                            "type": "boolean",
                            "description": "Pulse oximetry: connected exposes the available measurement; disconnected hides it without changing physiology."
                          },
                          "respiration": {
                            "title": "Respiratory monitoring",
                            "type": "boolean",
                            "description": "Respiratory monitoring: connected exposes the available measurement; disconnected hides it without changing physiology."
                          },
                          "temperature": {
                            "title": "Temperature probe",
                            "type": "boolean",
                            "description": "Temperature probe: connected exposes the available measurement; disconnected hides it without changing physiology."
                          },
                          "capnography": {
                            "title": "Capnography",
                            "type": "boolean",
                            "description": "Capnography: connected exposes the available measurement; disconnected hides it without changing physiology."
                          },
                          "arterialPressure": {
                            "title": "Arterial pressure",
                            "type": "boolean",
                            "description": "Arterial pressure: connected exposes the available measurement; disconnected hides it without changing physiology."
                          }
                        },
                        "description": "Connected channels expose available measurements without changing physiology. An explicit empty patient connection map starts disconnected. Omitted event channels inherit their preceding connection. Omitting the patient connection map makes available channels connected."
                      }
                    },
                    "description": "Monitor rhythm, pulse status, and channel connection overrides for this phase. Connection-only overrides preserve the preceding rhythm; omitted channels keep their preceding connection."
                  },
                  "key": {
                    "title": "Key state",
                    "type": "boolean",
                    "description": "Mark an educationally important phase. This does not award points or require every path to pass through the phase."
                  },
                  "resourceTrigger": {
                    "title": "Enter when resource results are available",
                    "additionalProperties": false,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "object",
                    "required": [
                      "mode",
                      "objectIds"
                    ],
                    "properties": {
                      "mode": {
                        "type": "string",
                        "title": "Results required",
                        "enum": [
                          "any",
                          "all"
                        ],
                        "description": "All waits for every selected resource result; any enters on the first selected result. Requests alone do not satisfy the rule until their response delays elapse."
                      },
                      "objectIds": {
                        "title": "Selected resources",
                        "minItems": 1,
                        "maxItems": 1000,
                        "uniqueItems": true,
                        "type": "array",
                        "items": {
                          "title": "Resource",
                          "maxLength": 128,
                          "minLength": 1,
                          "pattern": "\\S",
                          "x-usim": {
                            "reference": {
                              "collection": "events.objects",
                              "label": "name",
                              "excludeScheduled": false
                            },
                            "authoring": {}
                          },
                          "type": "string",
                          "description": "The identifier of a learner-requestable resource required by this event result trigger."
                        },
                        "description": "Scenario resources whose completed results trigger this event. Select learner-requestable resources without a separate resource destination event."
                      }
                    },
                    "description": "Enter this event once when selected learner-requested resource results become available. Incoming transitions remain alternative paths into the event."
                  }
                },
                "description": "One phase of the case, with learner information, tutor guidance, and any changed patient observations."
              },
              "description": "Patient phases in the scenario. Include exactly one baseline and at least one conclusion; connect phases with interactions."
            },
            "actions": {
              "title": "Interactions",
              "maxItems": 512,
              "x-usim": {
                "authoring": {
                  "addLabel": "Add interaction"
                }
              },
              "type": "array",
              "items": {
                "additionalProperties": false,
                "x-usim": {
                  "authoring": {}
                },
                "type": "object",
                "required": [
                  "id",
                  "label",
                  "from",
                  "to"
                ],
                "properties": {
                  "id": {
                    "title": "Identifier",
                    "minLength": 1,
                    "maxLength": 128,
                    "pattern": "\\S",
                    "x-usim": {
                      "authoring": {
                        "hidden": true
                      }
                    },
                    "type": "string",
                    "description": "A stable identifier used to reference this entry. Keep it unchanged when editing the entry's name or content."
                  },
                  "label": {
                    "title": "Interaction",
                    "maxLength": 1000,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "string",
                    "description": "Use a short, observable action or timed-event label: 2–6 words, at most 48 characters. Put conditions, clinical detail, and what happens in description, not in the label. Do not append the destination state; from/to already identify it."
                  },
                  "description": {
                    "title": "Description",
                    "maxLength": 6000,
                    "x-usim": {
                      "authoring": {
                        "editor": "textarea"
                      }
                    },
                    "type": "string",
                    "description": "Longer explanation of the action or timed event, its conditions, and what happens. Plain-language context only; executable behavior remains in the selected trigger, timing, resource references, and destination state. Text does not automatically detect learner behavior. Optional when the label provides sufficient context."
                  },
                  "from": {
                    "title": "From state",
                    "maxLength": 128,
                    "minLength": 1,
                    "pattern": "\\S",
                    "x-usim": {
                      "reference": {
                        "collection": "events.states",
                        "label": "title",
                        "excludeScheduled": false
                      },
                      "authoring": {}
                    },
                    "type": "string",
                    "description": "The phase in which this interaction is available or its scheduled timer begins."
                  },
                  "to": {
                    "title": "Leads to",
                    "maxLength": 128,
                    "minLength": 1,
                    "pattern": "\\S",
                    "x-usim": {
                      "reference": {
                        "collection": "events.states",
                        "label": "title",
                        "excludeScheduled": false
                      },
                      "authoring": {}
                    },
                    "type": "string",
                    "description": "The phase entered when this interaction occurs. Set scenario-specific vitals, rhythm, and patient information here; reusable treatment responses stay with resources. Destination vital signs override overlapping transition effects."
                  },
                  "trigger": {
                    "type": "string",
                    "title": "Trigger",
                    "enum": [
                      "action",
                      "scheduled"
                    ],
                    "description": "Action completes through AI interpretation of learner intent against its completion criterion, configured resource interactions, or explicit learner/facilitator confirmation. Scheduled runs automatically after its delay while the source phase remains active. Omitted means action."
                  },
                  "delaySeconds": {
                    "title": "Delay · seconds",
                    "minimum": 0,
                    "maximum": 86400,
                    "x-usim": {
                      "unit": "s",
                      "authoring": {
                        "visibleWhen": {
                          "property": "trigger",
                          "equals": "scheduled"
                        }
                      }
                    },
                    "type": "number",
                    "description": "For a scheduled interaction, seconds after the source event first occurs. Multiple timers run independently and survive other events. Each fires once per run; re-entry does not restart it. This does not delay manual actions."
                  },
                  "objectId": {
                    "title": "Linked resource",
                    "maxLength": 128,
                    "minLength": 1,
                    "pattern": "\\S",
                    "x-usim": {
                      "reference": {
                        "collection": "events.objects",
                        "label": "name",
                        "excludeScheduled": false
                      },
                      "authoring": {}
                    },
                    "type": "string",
                    "deprecated": true,
                    "description": "Requests a resource when this transition fires. Builder authors resource links on the state under Results."
                  },
                  "completionCriteria": {
                    "title": "When this action is complete",
                    "maxLength": 6000,
                    "x-usim": {
                      "authoring": {
                        "editor": "textarea"
                      }
                    },
                    "type": "string",
                    "description": "Describe the learner intent or behavior that fulfills this action. The AI interprets chat, conversation context, and simulator interactions against this criterion; equivalent wording is accepted. Distinguish an order from actual administration, and specify essential requirements. If omitted, the action label and description provide the criterion. Only available authored actions can advance the case; ambiguous intent requires clarification."
                  },
                  "completion": {
                    "title": "Action recognition",
                    "additionalProperties": false,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "object",
                    "required": [
                      "mode",
                      "objectIds"
                    ],
                    "properties": {
                      "mode": {
                        "type": "string",
                        "title": "Resources required",
                        "enum": [
                          "any",
                          "all"
                        ],
                        "description": "Choose whether any or all selected resource requests complete this action."
                      },
                      "objectIds": {
                        "title": "Recognize resource interactions",
                        "minItems": 1,
                        "maxItems": 1000,
                        "uniqueItems": true,
                        "type": "array",
                        "items": {
                          "title": "Resource",
                          "maxLength": 128,
                          "minLength": 1,
                          "pattern": "\\S",
                          "x-usim": {
                            "reference": {
                              "collection": "events.objects",
                              "label": "name",
                              "excludeScheduled": false
                            },
                            "authoring": {}
                          },
                          "type": "string",
                          "description": "A learner-requestable resource used to recognize the action."
                        },
                        "description": "Select the resources that define the learner activity, such as BMP and CBC for Order labs. Only learner-requestable resources qualify. Automatic state releases do not count."
                      }
                    },
                    "description": "Recognize this action from learner-requested resources while its source state is active. Any completes on the first selected request; all waits for all selected requests. Result delays do not delay action completion. Facilitators can confirm the same action directly. Confirming all requests every selected resource; confirming any does not guess which alternative was used. Omitted uses AI interpretation of completionCriteria (or label and description) or explicit confirmation."
                  },
                  "cancelOnActionIds": {
                    "title": "Cancel when action completes",
                    "maxItems": 1000,
                    "uniqueItems": true,
                    "type": "array",
                    "items": {
                      "title": "Completed action",
                      "maxLength": 128,
                      "minLength": 1,
                      "pattern": "\\S",
                      "x-usim": {
                        "reference": {
                          "collection": "events.actions",
                          "label": "label",
                          "excludeScheduled": false
                        },
                        "authoring": {}
                      },
                      "type": "string",
                      "description": "A learner action whose completion prevents this scheduled transition from firing."
                    },
                    "description": "For a scheduled transition, completion of any selected action cancels this timer for the rest of the run, including after state re-entry. The action may stay in its current state. Selected unfinished actions stay available while this timer is pending once their source event has occurred, even after another event becomes current. Future-source actions remain unavailable. Completing the action enters its destination; a self-loop stays in the current event. Conclusion states do not allow recovery. Cancellation does not undo a deterioration that already occurred. The timer starts when the source event first occurs and remains pending when other events occur. Ending the scenario cancels pending timers."
                  },
                  "effects": {
                    "title": "Vital signs",
                    "additionalProperties": false,
                    "x-usim": {
                      "authoring": {
                        "columns": 3
                      }
                    },
                    "type": "object",
                    "properties": {
                      "hr": {
                        "title": "Heart rate · bpm",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "beats/min",
                          "referenceRange": {
                            "minimum": 60,
                            "maximum": 100,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://medlineplus.gov/ency/article/002341.htm"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 0,
                              "maximum": 250,
                              "step": 1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Heart rate in beats per minute. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "sbp": {
                        "title": "Systolic BP · mmHg",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "mmHg",
                          "referenceRange": {
                            "minimum": 90,
                            "maximum": 120,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://medlineplus.gov/ency/article/002341.htm"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 0,
                              "maximum": 300,
                              "step": 1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Noninvasive systolic blood pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "dbp": {
                        "title": "Diastolic BP · mmHg",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "mmHg",
                          "referenceRange": {
                            "minimum": 60,
                            "maximum": 80,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://medlineplus.gov/ency/article/002341.htm"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 0,
                              "maximum": 200,
                              "step": 1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Noninvasive diastolic blood pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "rr": {
                        "title": "Respiratory rate · /min",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "breaths/min",
                          "referenceRange": {
                            "minimum": 12,
                            "maximum": 18,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://medlineplus.gov/ency/article/002341.htm"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 0,
                              "maximum": 80,
                              "step": 1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Respiratory rate in breaths per minute. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "spo2": {
                        "title": "Oxygen saturation · %",
                        "minimum": 0,
                        "maximum": 100,
                        "x-usim": {
                          "unit": "%",
                          "referenceRange": {
                            "minimum": 95,
                            "maximum": 100,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://www.fda.gov/consumers/consumer-updates/pulse-oximeter-basics"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 0,
                              "maximum": 100,
                              "step": 1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Peripheral oxygen saturation as a percentage from 0 to 100. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "temperature": {
                        "title": "Temperature · °C",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "Cel",
                          "referenceRange": {
                            "minimum": 36.5,
                            "maximum": 37.3,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://medlineplus.gov/ency/article/002341.htm"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 25,
                              "maximum": 45,
                              "step": 0.1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Body temperature in degrees Celsius. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "etco2": {
                        "title": "End-tidal CO₂ · mmHg",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "mmHg",
                          "authoring": {}
                        },
                        "type": "number",
                        "description": "End-tidal carbon dioxide pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "artSbp": {
                        "title": "Arterial systolic BP · mmHg",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "mmHg",
                          "authoring": {}
                        },
                        "type": "number",
                        "description": "Invasive arterial systolic blood pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "artDbp": {
                        "title": "Arterial diastolic BP · mmHg",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "mmHg",
                          "authoring": {}
                        },
                        "type": "number",
                        "description": "Invasive arterial diastolic blood pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      }
                    },
                    "description": "Vital values applied during the transition. Builder authors patient changes on destination state vitals.",
                    "deprecated": true
                  }
                },
                "description": "One transition from a source phase to a destination, including its explicit learner choice or timer. Author resource links and patient changes on the destination state."
              },
              "description": "Connections between phases, activated by a learner action or a timer measured from entry into the source phase."
            },
            "objects": {
              "title": "Resources",
              "maxItems": 2048,
              "x-usim": {
                "authoring": {
                  "editor": "resources"
                }
              },
              "type": "array",
              "items": {
                "additionalProperties": false,
                "x-usim": {
                  "authoring": {}
                },
                "type": "object",
                "required": [
                  "id",
                  "type",
                  "name"
                ],
                "properties": {
                  "id": {
                    "title": "Identifier",
                    "minLength": 1,
                    "maxLength": 128,
                    "pattern": "\\S",
                    "x-usim": {
                      "authoring": {
                        "hidden": true
                      }
                    },
                    "type": "string",
                    "description": "A stable identifier used to reference this entry. Keep it unchanged when editing the entry's name or content."
                  },
                  "type": {
                    "type": "string",
                    "title": "Resource type",
                    "enum": [
                      "medication",
                      "diagnostic",
                      "procedure",
                      "equipment",
                      "consultation",
                      "information"
                    ],
                    "description": "Categorize the resource for selection and display. Choosing a type alone does not define its physiologic effects."
                  },
                  "name": {
                    "title": "Resource name",
                    "maxLength": 240,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "string",
                    "description": "The name learners use to identify or request this resource. Include the dose or study details needed to distinguish similar choices."
                  },
                  "diagnosticCategory": {
                    "type": "string",
                    "title": "Diagnostic category",
                    "enum": [
                      "lab",
                      "imaging",
                      "physiologic"
                    ],
                    "description": "Required only for diagnostic resources: lab for specimen-based tests, imaging for images and reports, or physiologic for recordings and functional measurements such as ECG, EEG, and spirometry."
                  },
                  "description": {
                    "title": "Description shown to the learner",
                    "maxLength": 8000,
                    "x-usim": {
                      "authoring": {
                        "editor": "textarea"
                      }
                    },
                    "type": "string",
                    "description": "Optional context about the resource and why it is available. Leave blank when the name is sufficient. Put findings released after use in Learner result."
                  },
                  "result": {
                    "title": "Learner result",
                    "maxLength": 12000,
                    "x-usim": {
                      "authoring": {
                        "editor": "textarea"
                      }
                    },
                    "type": "string",
                    "description": "Information shown when the resource response is released, such as a report, consultation advice, or procedure outcome. If empty, the description is shown instead."
                  },
                  "labResults": {
                    "title": "Lab results",
                    "maxItems": 64,
                    "type": "array",
                    "items": {
                      "additionalProperties": false,
                      "x-usim": {
                        "authoring": {}
                      },
                      "type": "object",
                      "required": [
                        "name",
                        "value",
                        "unit"
                      ],
                      "properties": {
                        "name": {
                          "title": "Test",
                          "maxLength": 120,
                          "x-usim": {
                            "authoring": {}
                          },
                          "type": "string",
                          "description": "The test or analyte name, such as Hemoglobin."
                        },
                        "value": {
                          "title": "Value",
                          "maxLength": 80,
                          "x-usim": {
                            "authoring": {}
                          },
                          "type": "string",
                          "description": "The reported result as text, preserving decimals, inequalities, or qualitative values such as Negative."
                        },
                        "unit": {
                          "title": "Unit",
                          "maxLength": 80,
                          "x-usim": {
                            "authoring": {}
                          },
                          "type": "string",
                          "description": "The unit accompanying this result, such as g/dL or mmol/L. Leave empty for a unitless or qualitative result."
                        }
                      },
                      "description": "One laboratory measurement, with its test name, reported value, and unit."
                    },
                    "description": "Structured test results shown before the result notes. Supply the fictional case's values and units; missing results are not inferred."
                  },
                  "image": {
                    "title": "Image",
                    "additionalProperties": false,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "object",
                    "required": [
                      "dataUrl",
                      "description"
                    ],
                    "properties": {
                      "dataUrl": {
                        "title": "Image",
                        "maxLength": 12582912,
                        "x-usim": {
                          "authoring": {}
                        },
                        "type": "string",
                        "description": "The image encoded as a data URL so it travels with the scenario. Use the image upload control to populate it."
                      },
                      "description": {
                        "title": "Image description",
                        "maxLength": 1000,
                        "x-usim": {
                          "authoring": {}
                        },
                        "type": "string",
                        "description": "Describe the image and relevant visible findings for readers who cannot see it."
                      }
                    },
                    "description": "An embedded image released with this resource, with a text description of its content."
                  },
                  "releaseOnStateId": {
                    "title": "Release result",
                    "maxLength": 128,
                    "minLength": 1,
                    "pattern": "\\S",
                    "x-usim": {
                      "reference": {
                        "collection": "events.states",
                        "label": "title",
                        "excludeScheduled": false
                      },
                      "authoring": {
                        "emptyLabel": "When requested by the learner"
                      }
                    },
                    "type": "string",
                    "description": "Attach this result to a step. Diagnostics can also be requested individually; learner action completion does not deliver unrequested tests. Timed or facilitator event entry delivers linked results automatically. The response delay starts when the individual request or automatic delivery is recorded."
                  },
                  "delaySeconds": {
                    "title": "Response delay · seconds",
                    "minimum": 0,
                    "maximum": 86400,
                    "x-usim": {
                      "unit": "s",
                      "authoring": {}
                    },
                    "type": "number",
                    "description": "Seconds from the learner request or linked event until the response and its effects become available. Zero or omitted means immediate."
                  },
                  "effects": {
                    "title": "Vital signs",
                    "additionalProperties": false,
                    "x-usim": {
                      "authoring": {
                        "columns": 3
                      }
                    },
                    "type": "object",
                    "properties": {
                      "hr": {
                        "title": "Heart rate · bpm",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "beats/min",
                          "referenceRange": {
                            "minimum": 60,
                            "maximum": 100,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://medlineplus.gov/ency/article/002341.htm"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 0,
                              "maximum": 250,
                              "step": 1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Heart rate in beats per minute. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "sbp": {
                        "title": "Systolic BP · mmHg",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "mmHg",
                          "referenceRange": {
                            "minimum": 90,
                            "maximum": 120,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://medlineplus.gov/ency/article/002341.htm"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 0,
                              "maximum": 300,
                              "step": 1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Noninvasive systolic blood pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "dbp": {
                        "title": "Diastolic BP · mmHg",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "mmHg",
                          "referenceRange": {
                            "minimum": 60,
                            "maximum": 80,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://medlineplus.gov/ency/article/002341.htm"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 0,
                              "maximum": 200,
                              "step": 1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Noninvasive diastolic blood pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "rr": {
                        "title": "Respiratory rate · /min",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "breaths/min",
                          "referenceRange": {
                            "minimum": 12,
                            "maximum": 18,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://medlineplus.gov/ency/article/002341.htm"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 0,
                              "maximum": 80,
                              "step": 1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Respiratory rate in breaths per minute. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "spo2": {
                        "title": "Oxygen saturation · %",
                        "minimum": 0,
                        "maximum": 100,
                        "x-usim": {
                          "unit": "%",
                          "referenceRange": {
                            "minimum": 95,
                            "maximum": 100,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://www.fda.gov/consumers/consumer-updates/pulse-oximeter-basics"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 0,
                              "maximum": 100,
                              "step": 1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Peripheral oxygen saturation as a percentage from 0 to 100. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "temperature": {
                        "title": "Temperature · °C",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "Cel",
                          "referenceRange": {
                            "minimum": 36.5,
                            "maximum": 37.3,
                            "minimumAgeYears": 18,
                            "label": "Adult resting reference",
                            "source": "https://medlineplus.gov/ency/article/002341.htm"
                          },
                          "authoring": {
                            "slider": {
                              "minimum": 25,
                              "maximum": 45,
                              "step": 0.1
                            }
                          }
                        },
                        "type": "number",
                        "description": "Body temperature in degrees Celsius. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "etco2": {
                        "title": "End-tidal CO₂ · mmHg",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "mmHg",
                          "authoring": {}
                        },
                        "type": "number",
                        "description": "End-tidal carbon dioxide pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "artSbp": {
                        "title": "Arterial systolic BP · mmHg",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "mmHg",
                          "authoring": {}
                        },
                        "type": "number",
                        "description": "Invasive arterial systolic blood pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      },
                      "artDbp": {
                        "title": "Arterial diastolic BP · mmHg",
                        "minimum": 0,
                        "maximum": 1000,
                        "x-usim": {
                          "unit": "mmHg",
                          "authoring": {}
                        },
                        "type": "number",
                        "description": "Invasive arterial diastolic blood pressure in mmHg. Enter the resulting measurement, not an amount of change; omit to leave it unspecified or retain the previous value during a transition."
                      }
                    },
                    "description": "Absolute resulting measurements, never signed deltas. Omitted values are unspecified or inherited in an event context. Bounds are storage limits, not clinical reference intervals."
                  },
                  "advanceToStateId": {
                    "title": "Destination event",
                    "maxLength": 128,
                    "minLength": 1,
                    "pattern": "\\S",
                    "x-usim": {
                      "reference": {
                        "collection": "events.states",
                        "label": "title",
                        "excludeScheduled": false
                      },
                      "authoring": {}
                    },
                    "type": "string",
                    "description": "Enter this event when the resource response is released. Destination vitals replace resource effects; do not combine with effects or effectPercent."
                  },
                  "effectPercent": {
                    "additionalProperties": false,
                    "type": "object",
                    "properties": {
                      "hr": {
                        "minimum": -100,
                        "maximum": 1000,
                        "type": "number",
                        "description": "Percentage change to heart rate in beats per minute. Applied once when the resource response arrives: -20 reduces the current value by 20%; 20 increases it by 20%. Omit to leave unchanged."
                      },
                      "sbp": {
                        "minimum": -100,
                        "maximum": 1000,
                        "type": "number",
                        "description": "Percentage change to noninvasive systolic blood pressure in mmhg. Applied once when the resource response arrives: -20 reduces the current value by 20%; 20 increases it by 20%. Omit to leave unchanged."
                      },
                      "dbp": {
                        "minimum": -100,
                        "maximum": 1000,
                        "type": "number",
                        "description": "Percentage change to noninvasive diastolic blood pressure in mmhg. Applied once when the resource response arrives: -20 reduces the current value by 20%; 20 increases it by 20%. Omit to leave unchanged."
                      },
                      "rr": {
                        "minimum": -100,
                        "maximum": 1000,
                        "type": "number",
                        "description": "Percentage change to respiratory rate in breaths per minute. Applied once when the resource response arrives: -20 reduces the current value by 20%; 20 increases it by 20%. Omit to leave unchanged."
                      },
                      "spo2": {
                        "minimum": -100,
                        "maximum": 1000,
                        "type": "number",
                        "description": "Percentage change to peripheral oxygen saturation as a percentage from 0 to 100. Applied once when the resource response arrives: -20 reduces the current value by 20%; 20 increases it by 20%. Omit to leave unchanged."
                      },
                      "temperature": {
                        "minimum": -100,
                        "maximum": 1000,
                        "type": "number",
                        "description": "Percentage change to body temperature in degrees celsius. Applied once when the resource response arrives: -20 reduces the current value by 20%; 20 increases it by 20%. Omit to leave unchanged."
                      },
                      "etco2": {
                        "minimum": -100,
                        "maximum": 1000,
                        "type": "number",
                        "description": "Percentage change to end-tidal carbon dioxide pressure in mmhg. Applied once when the resource response arrives: -20 reduces the current value by 20%; 20 increases it by 20%. Omit to leave unchanged."
                      },
                      "artSbp": {
                        "minimum": -100,
                        "maximum": 1000,
                        "type": "number",
                        "description": "Percentage change to invasive arterial systolic blood pressure in mmhg. Applied once when the resource response arrives: -20 reduces the current value by 20%; 20 increases it by 20%. Omit to leave unchanged."
                      },
                      "artDbp": {
                        "minimum": -100,
                        "maximum": 1000,
                        "type": "number",
                        "description": "Percentage change to invasive arterial diastolic blood pressure in mmhg. Applied once when the resource response arrives: -20 reduces the current value by 20%; 20 increases it by 20%. Omit to leave unchanged."
                      }
                    },
                    "description": "Signed percentage changes applied once to current vitals at response time. Missing values stay unspecified. Mutually exclusive with effects and advanceToStateId."
                  },
                  "monitorConnection": {
                    "title": "Monitor connection",
                    "additionalProperties": false,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "object",
                    "required": [
                      "channel",
                      "connected"
                    ],
                    "properties": {
                      "channel": {
                        "type": "string",
                        "title": "Monitor channel",
                        "enum": [
                          "ecg",
                          "bloodPressure",
                          "spo2",
                          "respiration",
                          "temperature",
                          "capnography",
                          "arterialPressure",
                          "all",
                          "standard"
                        ],
                        "description": "The monitor channel controlled by this equipment resource; all controls every channel; standard controls ECG, SpO2, NIBP, temperature, and respiratory rate."
                      },
                      "connected": {
                        "title": "Connected",
                        "type": "boolean",
                        "description": "True connects this channel; false disconnects it."
                      }
                    },
                    "description": "Connect or disconnect an equipment channel when this resource response is released."
                  },
                  "orthostaticResponse": {
                    "title": "Orthostatic BP response",
                    "additionalProperties": false,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "object",
                    "required": [
                      "systolicDrop",
                      "diastolicDrop"
                    ],
                    "properties": {
                      "systolicDrop": {
                        "title": "Systolic drop · mmHg",
                        "minimum": 0,
                        "maximum": 100,
                        "x-usim": {
                          "unit": "mmHg",
                          "authoring": {}
                        },
                        "type": "number",
                        "description": "Subtract this many mmHg from the request-time resting systolic BP for the standing result."
                      },
                      "diastolicDrop": {
                        "title": "Diastolic drop · mmHg",
                        "minimum": 0,
                        "maximum": 100,
                        "x-usim": {
                          "unit": "mmHg",
                          "authoring": {}
                        },
                        "type": "number",
                        "description": "Subtract this many mmHg from the request-time resting diastolic BP for the standing result."
                      }
                    },
                    "description": "Report standing BP relative to current resting BP when requested, without changing resting physiology. An authored learner result takes precedence."
                  },
                  "medicationResponse": {
                    "type": "string",
                    "title": "Medication response preset",
                    "enum": [
                      "fluid-250-v1",
                      "fluid-500-v1",
                      "fluid-1000-v1",
                      "antipyretic-v1",
                      "pressor-v1",
                      "alpha-pressor-v1",
                      "epinephrine-v1",
                      "atropine-v1",
                      "rate-control-v1",
                      "beta-blocker-v1",
                      "vasodilator-v1",
                      "nitrate-v1",
                      "sedative-v1",
                      "propofol-sedation-v1",
                      "propofol-induction-v1",
                      "ketamine-analgesia-v1",
                      "ketamine-induction-v1",
                      "dexmedetomidine-v1"
                    ],
                    "description": "Versioned educational medication response, applied once to current vitals after the response delay. Requires a known patient age of at least 18 years. Do not combine with absolute, percentage or event responses. Exact changes are simulation assumptions; author condition-specific responses when needed."
                  },
                  "source": {
                    "title": "Source / attribution",
                    "maxLength": 2000,
                    "x-usim": {
                      "authoring": {}
                    },
                    "type": "string",
                    "description": "Credit the source of the resource content, including a citation or URL when available. Attribution alone does not verify clinical accuracy."
                  }
                },
                "allOf": [
                  {
                    "if": {
                      "properties": {
                        "monitorConnection": {}
                      },
                      "required": [
                        "monitorConnection"
                      ]
                    },
                    "then": {
                      "properties": {
                        "type": {
                          "const": "equipment"
                        }
                      }
                    }
                  },
                  {
                    "if": {
                      "properties": {
                        "orthostaticResponse": {}
                      },
                      "required": [
                        "orthostaticResponse"
                      ]
                    },
                    "then": {
                      "properties": {
                        "type": {
                          "const": "diagnostic"
                        },
                        "diagnosticCategory": {
                          "const": "physiologic"
                        }
                      },
                      "required": [
                        "diagnosticCategory"
                      ],
                      "not": {
                        "anyOf": [
                          {
                            "properties": {
                              "effects": {}
                            },
                            "required": [
                              "effects"
                            ]
                          },
                          {
                            "properties": {
                              "effectPercent": {}
                            },
                            "required": [
                              "effectPercent"
                            ]
                          },
                          {
                            "properties": {
                              "medicationResponse": {}
                            },
                            "required": [
                              "medicationResponse"
                            ]
                          }
                        ]
                      }
                    }
                  },
                  {
                    "if": {
                      "properties": {
                        "type": {
                          "const": "diagnostic"
                        }
                      },
                      "required": [
                        "type"
                      ]
                    },
                    "then": {
                      "properties": {
                        "diagnosticCategory": {}
                      },
                      "required": [
                        "diagnosticCategory"
                      ]
                    },
                    "else": {
                      "not": {
                        "properties": {
                          "diagnosticCategory": {}
                        },
                        "required": [
                          "diagnosticCategory"
                        ]
                      }
                    }
                  },
                  {
                    "if": {
                      "properties": {
                        "medicationResponse": {}
                      },
                      "required": [
                        "medicationResponse"
                      ]
                    },
                    "then": {
                      "properties": {
                        "type": {
                          "const": "medication"
                        }
                      },
                      "not": {
                        "anyOf": [
                          {
                            "properties": {
                              "effects": {}
                            },
                            "required": [
                              "effects"
                            ]
                          },
                          {
                            "properties": {
                              "effectPercent": {}
                            },
                            "required": [
                              "effectPercent"
                            ]
                          },
                          {
                            "properties": {
                              "advanceToStateId": {}
                            },
                            "required": [
                              "advanceToStateId"
                            ]
                          }
                        ]
                      }
                    }
                  }
                ],
                "description": "One resource with learner-facing information, release timing, and any authored response or patient changes."
              },
              "description": "Medications, tests, procedures, and other resources available in the case. Each resource can be used once per run; use separate entries for repeat doses or serial results."
            }
          },
          "description": "The patient phases, transitions, and requestable resources that define how the scenario progresses."
        }
      }
    }
  },
  "sections": [
    {
      "topic": "scenario-model",
      "change": "A scenario document identifies patients, observations, resources, and behavior.",
      "fields": [
        {
          "path": "format",
          "type": "literal \"usim-scenario\"",
          "requirement": "Required",
          "description": "Identifies this portable document; distinct from the existing usim-suite-scenario export envelope."
        },
        {
          "path": "formatVersion",
          "type": "literal \"2.0\"",
          "requirement": "Required",
          "description": "Identifies the document format used for validation."
        },
        {
          "path": "executionProfile",
          "type": "{ id: URI, version: string, requiredCapabilities: string[], optionalCapabilities: string[] }",
          "requirement": "Optional; execution requires it",
          "description": "Identifies the executable capability contract layered on the core vocabulary. A portable-core document may omit it, but an executor must establish a compatible profile before running the scenario."
        },
        {
          "path": "extensions",
          "type": "map<reverse-domain string, { version: string, required: boolean, data: object }>",
          "requirement": "Optional; default {}",
          "description": "Namespaced vendor or profile additions. The namespace is the lookup key; version and required status determine whether a consumer can safely ignore, preserve, or reject the extension."
        },
        {
          "path": "vocabularies[]",
          "type": "{ id: URI, version: string, kind: concept | value-type | unit | dimension | value-set, sha256: 64 lowercase hexadecimal characters, assetId?: Asset ID }",
          "requirement": "Optional; default []",
          "description": "Pins the concept, value-type, unit, or dimensional definitions used by the document. Definitions must be bundled or resolved by a trusted profile; execution never fetches an untrusted URL."
        },
        {
          "path": "scenarioId",
          "type": "ID",
          "requirement": "Required",
          "description": "Stable content identity. Publication revisions and delivery instances remain separate records."
        },
        {
          "path": "patients",
          "type": "Patient[]",
          "requirement": "Required; at least one",
          "description": "Explicit array permits multiple patients. Each patient owns an ID; observations and interventions reference that ID."
        },
        {
          "path": "observations",
          "type": "Observation[]",
          "requirement": "Required; may be empty",
          "description": "Authored symptoms, findings, and measurements with provenance, visibility, and availability."
        },
        {
          "path": "events.conditions",
          "type": "Condition[]",
          "requirement": "Required; may be empty",
          "description": "Named, bounded predicates referenced by actions, states, and cues."
        },
        {
          "path": "events.effects",
          "type": "Effect[]",
          "requirement": "Required; may be empty",
          "description": "Named, typed operations; no arbitrary script evaluation."
        },
        {
          "path": "assets",
          "type": "Asset[]",
          "requirement": "Required; may be empty",
          "description": "Portable media manifest referenced by diagnostics and role outputs."
        }
      ],
      "rules": [
        "This specification defines the portable format. Example blocks are document fragments, not Suite import packages. Current application support is documented in the Suite implementation profile.",
        "formatVersion identifies the core vocabulary; executionProfile identifies an executable capability contract. A consumer must compare required capabilities before execution. If executionProfile is omitted, the document remains portable core content but cannot claim executable profile conformance.",
        "Capability lists contain unique strings and are disjoint. Required capabilities gate execution; optional capabilities describe behavior a consumer may preserve or report as unsupported without pretending to execute it.",
        "ID means a case-sensitive string matching [a-z][a-z0-9-]{0,63}. Entity IDs are unique across the document; references must resolve to the expected entity type. Collection order has no behavioral meaning except where a field or rule explicitly declares order, including steps, cues, effect references, action outcomes, and composition overrides.",
        "Required fields must be present. Omitted optional values remain unspecified unless a field gives an explicit default. Reject null unless expressly permitted. Empty arrays mean no authored items, not an assessed negative. Times are finite simulated seconds; ISO dates describe content provenance only.",
        "Vocabulary entries are declarations, not permission to fetch arbitrary definitions. Verify the pinned digest against a bundled asset or a trusted profile resolution before using a concept, value type, unit, dimension, or value set.",
        "Reject unknown core fields. Vendor additions live under extensions, keyed by a reverse-domain namespace with declared version and required/optional status. A consumer unable to execute a required extension must reject the document; optional extensions must be preserved or reported as lossy on export. Extension data cannot add arbitrary script, network, filesystem, or random execution."
      ],
      "example": {
        "format": "usim-scenario",
        "formatVersion": "2.0",
        "executionProfile": {
          "id": "https://example.invalid/usim/profiles/portable-core",
          "version": "2.0",
          "requiredCapabilities": [],
          "optionalCapabilities": []
        },
        "extensions": {},
        "vocabularies": [],
        "scenarioId": "handoff-practice",
        "patients": [
          {
            "id": "patient-alex",
            "name": "Alex (fictional)"
          }
        ],
        "observations": [],
        "events": {
          "conditions": [],
          "effects": []
        },
        "assets": []
      }
    },
    {
      "topic": "metadata",
      "change": "Separate content identity, contributor credit, revision history, and clinical review.",
      "fields": [
        {
          "path": "metadata.title",
          "type": "string",
          "requirement": "Required",
          "description": "Human-readable case title; use a neutral title when a diagnosis would reveal the teaching point."
        },
        {
          "path": "metadata.summary",
          "type": "string",
          "requirement": "Required",
          "description": "Premise, audience, and scope of the exercise."
        },
        {
          "path": "metadata.contributors[]",
          "type": "{ id: ID, name: string, roles: string[], affiliation?: string }",
          "requirement": "Required; at least one",
          "description": "Structured attribution permits authors, reviewers, illustrators, and editors without importing account permissions."
        },
        {
          "path": "metadata.revision",
          "type": "positive integer",
          "requirement": "Required",
          "description": "Content revision counter within scenarioId; does not substitute for a package digest."
        },
        {
          "path": "metadata.license",
          "type": "{ identifier: string, textAssetId?: ID }",
          "requirement": "Required",
          "description": "Explicit reuse terms; custom terms may reference a packaged text asset."
        },
        {
          "path": "metadata.review",
          "type": "{ status: enum, reviewedAt?: ISO date, reviewerIds: ID[], sourceIds: ID[] }",
          "requirement": "Required",
          "description": "Status is draft, reviewed, or needs-review. Reviewed requires a date and at least one contributor and source reference; this records author assertions, not external certification."
        },
        {
          "path": "metadata.sources[]",
          "type": "{ id: ID, citation: string, url?: HTTPS URL, accessedAt?: ISO date }",
          "requirement": "Required; may be empty for an unreviewed draft",
          "description": "Named references support traceable clinical and educational content."
        }
      ],
      "rules": [
        "Changing clinical behavior after review changes status to needs-review in the authoring workflow. Review metadata never grants automatic publication approval.",
        "Contributor contact details are optional extensions rather than required portable fields. Use fictional patients and keep actual learners out of scenario content."
      ],
      "example": {
        "metadata": {
          "title": "A clear handoff",
          "summary": "Assign ownership of a pending update.",
          "revision": 1,
          "contributors": [
            {
              "id": "author-team",
              "name": "Example team",
              "roles": [
                "author"
              ]
            }
          ],
          "license": {
            "identifier": "All rights reserved"
          },
          "review": {
            "status": "draft",
            "reviewerIds": [],
            "sourceIds": []
          },
          "sources": []
        }
      }
    },
    {
      "topic": "demographics",
      "change": "Represent multiple fictional patients without ambiguous age units or demographic assumptions.",
      "fields": [
        {
          "path": "patients[].id",
          "type": "ID",
          "requirement": "Required",
          "description": "Stable target for observations, actions, medications, and devices."
        },
        {
          "path": "patients[].name",
          "type": "string",
          "requirement": "Required",
          "description": "Fictional display name; distinct from identity."
        },
        {
          "path": "patients[].demographics.age",
          "type": "{ value: nonnegative number, unit: days | months | years }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Explicit unit supports neonatal and pediatric scenarios. Do not infer an exact date of birth from age."
        },
        {
          "path": "patients[].demographics.gender",
          "type": "string",
          "requirement": "Optional; omitted means unspecified",
          "description": "Authored gender description as text."
        },
        {
          "path": "patients[].demographics.pronouns",
          "type": "string",
          "requirement": "Optional; omitted means unspecified",
          "description": "Optional actor and communication guidance."
        },
        {
          "path": "patients[].demographics.weight",
          "type": "{ value: positive number, unit: kg }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Authored weight with a fixed explicit unit; used by expressions only if an operation expressly references it."
        },
        {
          "path": "patients[].demographics.height",
          "type": "{ value: positive number, unit: cm }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Authored height; no automatic ideal-body-weight or physiology calculation."
        },
        {
          "path": "patients[].baselineFunction",
          "type": "string",
          "requirement": "Optional; omitted means unspecified",
          "description": "Usual mobility, communication, cognition, and support relevant to interpreting the case."
        }
      ],
      "rules": [
        "All patient-targeted behavior requires patientId even in single-patient scenarios. Names may repeat; IDs may not.",
        "Do not derive symptoms, physiology, or actor behavior solely from a demographic attribute. Any such relationship must be authored and reviewed explicitly."
      ],
      "example": {
        "patients": [
          {
            "id": "patient-alex",
            "name": "Alex (fictional)",
            "demographics": {
              "age": {
                "value": 40,
                "unit": "years"
              },
              "weight": {
                "value": 70,
                "unit": "kg"
              }
            },
            "baselineFunction": "Communicates independently."
          }
        ]
      }
    },
    {
      "topic": "history",
      "change": "Make patient information discoverable, with an explicit timeline and disclosure rules.",
      "fields": [
        {
          "path": "patients[].history[]",
          "type": "{ id: ID, category: enum, content: string, disclosure: Disclosure, occurredAtSeconds?: number, allergy?: Allergy }",
          "requirement": "Optional; default []",
          "description": "Separate entries for chief-complaint, present-illness, medical, surgical, medication, allergy, family, and social history."
        },
        {
          "path": "patients[].history[].allergy",
          "type": "{ substance: string, reaction?: string, severity?: mild | moderate | severe | unknown }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Structured allergy detail for category allergy only. Substance identifies the authored allergen; reaction describes the manifestation; severity describes that reaction, not future risk. Omitted reaction or severity remains unspecified."
        },
        {
          "path": "patients[].history[].occurredAtSeconds",
          "type": "finite number",
          "requirement": "Optional; omitted means unspecified",
          "description": "Time relative to scenario start; negative values describe pre-arrival events."
        },
        {
          "path": "patients[].history[].disclosure.audience",
          "type": "(learner | facilitator)[]",
          "requirement": "Required; nonempty",
          "description": "Authorized output audiences. UI hints do not replace output filtering."
        },
        {
          "path": "patients[].history[].disclosure.mode",
          "type": "initial | on-action | on-condition | facilitator",
          "requirement": "Required",
          "description": "Initial reveals at baseline; other modes require an action, condition, or facilitator release."
        },
        {
          "path": "patients[].history[].disclosure.actionId",
          "type": "Action ID",
          "requirement": "Required only for on-action",
          "description": "Successful completion of this action reveals the entry."
        },
        {
          "path": "patients[].history[].disclosure.conditionId",
          "type": "Condition ID",
          "requirement": "Required only for on-condition",
          "description": "Reveal when the condition first becomes true; reject unrelated trigger fields."
        }
      ],
      "rules": [
        "Disclosure is a shared structure for history, observations, and result interpretations. Once revealed, content stays available.",
        "Store unknown allergy status explicitly as content. An empty allergy category means no entry was authored, not no known allergies.",
        "The optional allergy object is permitted only on allergy history entries and follows the entry disclosure rules. Keep unknown status explicit; do not invent a substance for a no-known-allergy statement. Severity is mild, moderate, severe, or unknown; omission means unspecified."
      ],
      "example": {
        "patients": [
          {
            "id": "patient-alex",
            "history": [
              {
                "id": "history-summary",
                "category": "present-illness",
                "content": "An update is pending; no owner was assigned.",
                "occurredAtSeconds": -300,
                "disclosure": {
                  "audience": [
                    "learner",
                    "facilitator"
                  ],
                  "mode": "on-action",
                  "actionId": "ask-context"
                }
              }
            ]
          }
        ]
      }
    },
    {
      "topic": "physical-examination",
      "change": "Use observations for findings, with collection, availability, interpretation, and disclosure separated.",
      "fields": [
        {
          "path": "observations[].id",
          "type": "ID",
          "requirement": "Required",
          "description": "Stable finding or measurement identity; a repeat collection creates a new observation ID."
        },
        {
          "path": "observations[].patientId",
          "type": "Patient ID",
          "requirement": "Required",
          "description": "Patient to whom the observation belongs."
        },
        {
          "path": "observations[].code",
          "type": "string",
          "requirement": "Required",
          "description": "Namespaced concept, such as usim:general-appearance; codes do not imply external terminology certification."
        },
        {
          "path": "observations[].kind",
          "type": "symptom | finding | measurement",
          "requirement": "Required",
          "description": "Separates reported experience, observed findings, and measured values."
        },
        {
          "path": "observations[].status",
          "type": "known | unknown | not-assessed | pending | unavailable",
          "requirement": "Required",
          "description": "Known requires a value. Other statuses prohibit a value rather than using zero or an empty string as a sentinel."
        },
        {
          "path": "observations[].value",
          "type": "number | string | boolean",
          "requirement": "Required only when status is known",
          "description": "Type must match the registered concept. Qualitative findings can be text or explicit booleans."
        },
        {
          "path": "observations[].unit",
          "type": "string",
          "requirement": "Required for numeric measurements",
          "description": "Fixed by the concept definition; no inferred conversions."
        },
        {
          "path": "observations[].collectedAtSeconds",
          "type": "finite number",
          "requirement": "Optional; omitted means unspecified",
          "description": "Time of authored assessment or acquisition, possibly before baseline."
        },
        {
          "path": "observations[].availableAtSeconds",
          "type": "nonnegative number",
          "requirement": "Optional; omitted means unspecified",
          "description": "Earliest simulated time for release; disclosure conditions must also be satisfied."
        },
        {
          "path": "observations[].method",
          "type": "string",
          "requirement": "Optional; omitted means unspecified",
          "description": "Method, location, or equipment used to obtain the finding."
        },
        {
          "path": "observations[].disclosure",
          "type": "Disclosure",
          "requirement": "Required",
          "description": "Uses the audience and release rules defined under History."
        }
      ],
      "rules": [
        "Author-selected normal findings use usim:age-based-normal-findings@1.0.0 in authoringProfiles. Select by age in years: infant [0,1), child [1,12), adolescent [12,18), adult [18,65), older adult [65,infinity); missing or invalid age uses age-neutral text. Materialize selected text as explicit authored observations linked to the system. Preserve existing values, including blanks, unknown and not assessed. Age changes never rewrite saved findings. Omission never implies normal; do not inject templates during import or playback. Suite stores the selected strings in patients.history.ros and patients.examination.",
        "Pending results do not expose their future value in learner outputs. Underlying authored values and runtime release status must remain distinct.",
        "A numeric concept has one declared unit and value type in the profile. New concepts require definitions under extensions until standardized."
      ],
      "example": {
        "observations": [
          {
            "id": "obs-appearance",
            "patientId": "patient-alex",
            "code": "usim:general-appearance",
            "kind": "finding",
            "status": "known",
            "value": "Comfortable and speaking clearly",
            "collectedAtSeconds": 0,
            "disclosure": {
              "audience": [
                "learner",
                "facilitator"
              ],
              "mode": "on-action",
              "actionId": "examine-patient"
            }
          }
        ]
      }
    },
    {
      "topic": "review-of-systems",
      "change": "Represent present, absent, unknown, and unasked symptoms explicitly.",
      "fields": [
        {
          "path": "patients[].reviewOfSystems[]",
          "type": "{ system: string, observationIds: Observation ID[] }",
          "requirement": "Optional; default []",
          "description": "Groups symptom observations by authored system heading without duplicating their values."
        },
        {
          "path": "observations[].reportedByActorId",
          "type": "Actor ID",
          "requirement": "Optional; omitted means unspecified",
          "description": "Identifies the patient actor, relative, or colleague supplying the history."
        },
        {
          "path": "observations[].reliabilityNote",
          "type": "string",
          "requirement": "Optional; omitted means unspecified",
          "description": "Facilitator context on conflicting or incomplete history; visibility follows the observation's disclosure policy."
        }
      ],
      "tables": [
        {
          "title": "Unable to obtain ROS reasons (Suite authoring profile)",
          "description": "usim:unavailable-ros@1.0.0 stores the selected statement in patients.history.ros[\"Unable to obtain\"]. These are explicit author selections, never inferred negative findings.",
          "columns": [
            "Dropdown label",
            "Stored value"
          ],
          "rows": [
            [
              "Reason not specified",
              "Unable to obtain review of systems."
            ],
            [
              "Clinical condition / acuity",
              "Unable to obtain review of systems due to clinical condition or acuity."
            ],
            [
              "Altered mental status",
              "Unable to obtain review of systems due to altered mental status."
            ],
            [
              "Unconsciousness",
              "Unable to obtain review of systems due to unconsciousness."
            ],
            [
              "Intubation / sedation",
              "Unable to obtain review of systems due to intubation or sedation."
            ],
            [
              "Developmental limitations",
              "Unable to obtain review of systems due to developmental limitations."
            ],
            [
              "Cognitive impairment",
              "Unable to obtain review of systems due to cognitive impairment."
            ],
            [
              "Communication barrier",
              "Unable to obtain review of systems due to a communication barrier."
            ],
            [
              "Patient declined",
              "Unable to obtain review of systems due to the patient declining assessment."
            ],
            [
              "Collateral historian unavailable",
              "Unable to obtain review of systems due to an unavailable collateral historian."
            ],
            [
              "Other limitation",
              "Unable to obtain review of systems due to another limitation."
            ]
          ]
        }
      ],
      "rules": [
        "Suite offers Unable to obtain beside Default. Selecting it replaces the whole ROS record with a single \"Unable to obtain\" entry. Its reason dropdown stores the explicit statement from usim:unavailable-ros@1.0.0, initially Reason not specified. Existing custom reason strings remain valid and selectable. Default removes this entry and materializes age-specific normal findings; removing the entry leaves ROS unspecified. Import and playback must preserve the statement without inferring negative symptoms.",
        "Author-selected normal findings use usim:age-based-normal-findings@1.0.0 in authoringProfiles. Select by age in years: infant [0,1), child [1,12), adolescent [12,18), adult [18,65), older adult [65,infinity); missing or invalid age uses age-neutral text. Materialize selected text as explicit authored observations linked to the system. Preserve existing values, including blanks, unknown and not assessed. Age changes never rewrite saved findings. Omission never implies normal; do not inject templates during import or playback. Suite stores the selected strings in patients.history.ros and patients.examination.",
        "For a boolean symptom concept, known/false means explicitly absent and known/true means present. Not-assessed omits value. Unselected symptoms remain unspecified.",
        "Conflicting reports use separate observation IDs and reporters; the format does not silently select a true version."
      ],
      "example": {
        "patients": [
          {
            "id": "patient-alex",
            "reviewOfSystems": [
              {
                "system": "general",
                "observationIds": [
                  "obs-fatigue"
                ]
              }
            ]
          }
        ],
        "observations": [
          {
            "id": "obs-fatigue",
            "patientId": "patient-alex",
            "code": "usim:fatigue",
            "kind": "symptom",
            "status": "not-assessed",
            "disclosure": {
              "audience": [
                "facilitator"
              ],
              "mode": "initial"
            }
          }
        ]
      }
    },
    {
      "topic": "vital-signs",
      "change": "Define physiologic variables separately from measured observations and support authored trends.",
      "fields": [
        {
          "path": "patients[].variables[]",
          "type": "{ id: ID, concept: string, value: number, unit: string }",
          "requirement": "Optional; default []",
          "description": "Underlying authored numeric state. Measurements reference it explicitly rather than appearing automatically."
        },
        {
          "path": "observations[].variableId",
          "type": "Variable ID",
          "requirement": "Optional; omitted means unspecified",
          "description": "On collection, snapshot this variable's current value into a new measurement; later trends do not rewrite past results."
        },
        {
          "path": "events.effects[].durationSeconds",
          "type": "positive number",
          "requirement": "Required only for trend-variable",
          "description": "Duration of a linear authored change from current value to target. Instant changes use set-variable."
        },
        {
          "path": "events.effects[].interpolation",
          "type": "literal \"linear\"",
          "requirement": "Required only for trend-variable",
          "description": "The format supports one explicit interpolation rule; no inferred dose-response or disease model."
        },
        {
          "path": "resources[].diagnostic.orthostaticResponse",
          "type": "{ patientId: Patient ID, systolicVariableId: Variable ID, diastolicVariableId: Variable ID, systolicDrop: number, diastolicDrop: number }",
          "requirement": "Optional; physiologic diagnostics only",
          "description": "Baseline-relative standing BP at three minutes. Both drops are finite values from 0 to 100 mmHg; both variables belong to the named patient and use mmHg."
        }
      ],
      "tables": [
        {
          "title": "Normal ranges by age",
          "description": "Use the patient's age to choose a row. ‘Under’ excludes the upper age; the next row starts at that age. Values at either end of a vital-sign range are within range.",
          "columns": [
            "Age",
            "Group",
            "HR",
            "RR",
            "Systolic BP",
            "Diastolic BP"
          ],
          "rows": [
            [
              "Birth to under 28 days",
              "Newborn",
              "100–205",
              "30–53",
              "67–84",
              "35–53"
            ],
            [
              "28 days to under 1 year",
              "Infant",
              "100–180",
              "30–53",
              "72–104",
              "37–56"
            ],
            [
              "1 to under 3 years",
              "Toddler",
              "98–140",
              "22–37",
              "86–106",
              "42–63"
            ],
            [
              "3 to under 6 years",
              "Preschool",
              "80–120",
              "20–28",
              "89–112",
              "46–72"
            ],
            [
              "6 to under 12 years",
              "School age",
              "75–118",
              "18–25",
              "97–115",
              "57–76"
            ],
            [
              "12 to under 16 years",
              "Adolescent",
              "60–100",
              "12–20",
              "102–120",
              "61–80"
            ],
            [
              "16 years and older",
              "Older adolescent / adult",
              "60–100",
              "12–18",
              "90–120",
              "60–80"
            ]
          ]
        },
        {
          "title": "Ranges shared across ages",
          "description": "These defaults also require a known age. HR is in beats/min, RR in breaths/min, and blood pressure in mmHg.",
          "columns": [
            "Vital sign",
            "Normal range",
            "Unit"
          ],
          "rows": [
            [
              "Oxygen saturation (SpO2)",
              "95–100",
              "%"
            ],
            [
              "Temperature",
              "36.5–37.3",
              "°C"
            ],
            [
              "End-tidal CO2 (EtCO2)",
              "35–45",
              "mmHg"
            ]
          ]
        },
        {
          "title": "How a reading is interpreted",
          "columns": [
            "Priority",
            "Use",
            "Meaning"
          ],
          "rows": [
            [
              "1",
              "Authored flag",
              "An explicitly authored flag takes precedence, including none or not-interpreted."
            ],
            [
              "2",
              "Authored reference interval",
              "Use the scenario's own range. A text-only interval leaves numeric interpretation unspecified."
            ],
            [
              "3",
              "Age-based default",
              "If neither is supplied, use the patient's age and the tables above. Missing or invalid age leaves the reading uninterpreted."
            ]
          ]
        }
      ],
      "rules": [
        "Core vital concepts use hr (beats/min), sbp/dbp (mmHg), rr (breaths/min), spo2 (%), temperature (Cel), and etco2 (mmHg). Normal-value interpretation uses the usim:age-based-vitals profile published in referenceProfiles, shared by preview, PDF, and other consumers.",
        "Read age from the patient’s demographics.age in days, months, or years. For display, 28 days is approximately 0.077 years. Calculations use the exact conversion (days ÷ 365.25 or months ÷ 12), without rounding. Do not infer age from weight, title, or appearance.",
        "For a known numeric vital measurement: explicit observations[].flag takes precedence, then an authored observations[].referenceInterval, then the age-based default. A text-only authored interval suppresses automatic numeric interpretation. Validate authored intervals and unit agreement; never fall back to defaults after an invalid override. Compare strictly below low or above high; endpoints are within range. Derived flags are output interpretation, not mutations of authored values or flags. Defaults never infer critical severity.",
        "The default profile uses awake/resting values after postnatal transition, not physiologic limits or treatment targets. Changing a patient's age immediately changes the default range applied to both initial and event vitals; it never changes the actual authored values. Keep the profile version fixed for reproducible interpretation. Custom numeric concepts require an authored reference interval; no vital defaults apply to unrelated laboratory tests.",
        "orthostaticResponse requires the orthostatic-results execution capability. Snapshot both resting BP variables when the diagnostic is requested; compute standing systolic = baseline systolic minus systolicDrop and standing diastolic = baseline diastolic minus diastolicDrop. Persist that request-time snapshot through delayed release. This produces a result, not a set-variable effect: resting physiology is unchanged, and no heart-rate response is inferred.",
        "An authored nonblank result takes precedence over the computed orthostatic report. Missing baseline BP, nonpositive computed pressure, or computed systolic not greater than diastolic produces an unavailable result, never invented values. Invalid references, units, or drop parameters invalidate the document. Explicit learner disclosure still controls delivery; a disconnected monitor does not prevent a requested bedside measurement.",
        "The format supplies no default orthostatic drop. The included positive teaching resource authors systolicDrop 20 and diastolicDrop 10 mmHg; 130/80 therefore reports 110/70. Suite maps this payload to events.objects[].orthostaticResponse and its single patient's current sbp/dbp. Portable patient/variable references require an adapter; the Suite importer does not accept portable documents directly.",
        "A new set or trend targeting the same variable cancels its prior trend. Trend start value is the value at that simulated instant. Validate finite values and concept bounds; unit mismatch is an error."
      ],
      "example": {
        "executionProfile": {
          "id": "https://example.invalid/usim/profiles/positional-measurements",
          "version": "1.0.0",
          "requiredCapabilities": [
            "orthostatic-results"
          ],
          "optionalCapabilities": []
        },
        "resources": [
          {
            "id": "positive-orthostatics",
            "kind": "diagnostic",
            "name": "Positive orthostatic vital signs",
            "description": "Authored standing measurement relative to resting BP.",
            "sourceIds": [],
            "diagnostic": {
              "category": "physiologic",
              "resultIds": [],
              "orthostaticResponse": {
                "patientId": "patient-alex",
                "systolicVariableId": "var-sbp",
                "diastolicVariableId": "var-dbp",
                "systolicDrop": 20,
                "diastolicDrop": 10
              }
            }
          }
        ],
        "patients": [
          {
            "id": "patient-alex",
            "variables": [
              {
                "id": "var-hr",
                "concept": "usim:hr",
                "value": 80,
                "unit": "beats/min"
              },
              {
                "id": "var-sbp",
                "concept": "usim:sbp",
                "value": 130,
                "unit": "mmHg"
              },
              {
                "id": "var-dbp",
                "concept": "usim:dbp",
                "value": 80,
                "unit": "mmHg"
              }
            ]
          }
        ],
        "events": {
          "effects": [
            {
              "id": "effect-settle",
              "kind": "trend-variable",
              "targetId": "var-hr",
              "value": 76,
              "unit": "beats/min",
              "durationSeconds": 30,
              "interpolation": "linear"
            }
          ]
        }
      }
    },
    {
      "topic": "states",
      "change": "Give states explicit entry, exit, effects, and role-specific content; separate phases from concurrent conditions.",
      "fields": [
        {
          "path": "events.states[].id",
          "type": "ID",
          "requirement": "Required",
          "description": "Stable phase identity."
        },
        {
          "path": "events.states[].title",
          "type": "string",
          "requirement": "Required",
          "description": "Human-facing phase name, independent of identity."
        },
        {
          "path": "events.states[].kind",
          "type": "baseline | phase | conclusion",
          "requirement": "Required",
          "description": "Actions and schedules define how a phase is entered."
        },
        {
          "path": "events.states[].entryConditionId",
          "type": "Condition ID",
          "requirement": "Optional; omitted means unspecified",
          "description": "Guard checked immediately before entry. Failed manual transitions are rejected; scheduled failures are recorded and skipped."
        },
        {
          "path": "events.states[].onEnterEffectIds",
          "type": "Effect ID[]",
          "requirement": "Required; may be empty",
          "description": "Ordered operations applied after entry. Baseline effects run once when the scenario starts."
        },
        {
          "path": "events.states[].onExitEffectIds",
          "type": "Effect ID[]",
          "requirement": "Required; may be empty",
          "description": "Ordered operations applied when leaving this phase."
        },
        {
          "path": "events.states[].learnerBrief",
          "type": "string",
          "requirement": "Required",
          "description": "Information shown upon entering the phase; keep hidden rationale out of this field."
        },
        {
          "path": "events.states[].facilitatorBrief",
          "type": "string",
          "requirement": "Required",
          "description": "Expected observations, acceptable responses, cues, and operational guidance."
        },
        {
          "path": "events.states[].objectiveIds",
          "type": "Objective ID[]",
          "requirement": "Required; may be empty",
          "description": "Links the phase to an educational objective."
        },
        {
          "path": "events.states[].exitConditionId",
          "type": "Condition ID",
          "requirement": "Optional; omitted means unspecified",
          "description": "Must hold to leave the phase; does not cause a transition by itself."
        },
        {
          "path": "events.states[].endingId",
          "type": "Ending ID",
          "requirement": "Required only for conclusion",
          "description": "References the stopping outcome and debrief context."
        },
        {
          "path": "events.flags[]",
          "type": "{ id: ID, initialValue: boolean }",
          "requirement": "Required; may be empty",
          "description": "Concurrent facts such as ownership-agreed; flags coexist independently of the single active phase."
        }
      ],
      "rules": [
        "Exactly one baseline starts the scenario. At least one conclusion must be reachable. One phase is active at a time; concurrent clinical or team conditions are flags or variables, not competing active phases.",
        "Validate exit and destination entry guards against the pre-transition snapshot. Then apply exit effects, action completion effects, and entry effects in that order. A failed guard causes no partial effects.",
        "Conclusion freezes simulated progression and cancels pending schedules and unfinished actions; it is not a pass/fail score. Facilitator stop produces an interrupted run outside the scenario's normal ending logic."
      ],
      "example": {
        "events": {
          "flags": [
            {
              "id": "flag-owner-agreed",
              "initialValue": false
            }
          ],
          "states": [
            {
              "id": "state-clarifying",
              "title": "Clarify ownership",
              "kind": "phase",
              "onEnterEffectIds": [],
              "onExitEffectIds": [],
              "learnerBrief": "Who will follow up the pending update?",
              "facilitatorBrief": "Accept an explicit owner and read-back. If stalled, use the ownership cue.",
              "objectiveIds": [
                "objective-ownership"
              ],
              "exitConditionId": "condition-owner-agreed"
            }
          ]
        }
      }
    },
    {
      "topic": "actions",
      "change": "Allow actions to reveal information, perform work, or change a phase, with conditional outcomes and repeat-use rules.",
      "fields": [
        {
          "path": "events.actions[].id",
          "type": "ID",
          "requirement": "Required",
          "description": "Stable action identity for disclosure, observation, and assessment."
        },
        {
          "path": "events.actions[].kind",
          "type": "generic | medication-order | medication-administration",
          "requirement": "Required for specialized payloads; default generic when none is present",
          "description": "Discriminator for conditional action payloads. Specialized fields are prohibited unless kind selects the corresponding branch."
        },
        {
          "path": "events.actions[].label",
          "type": "string",
          "requirement": "Required",
          "description": "Use a short, observable action or timed-event label: 2–6 words, at most 48 characters. Put conditions, clinical detail, and what happens in description, not in the label. Do not append the destination state; from/to already identify it."
        },
        {
          "path": "events.actions[].description",
          "type": "string",
          "requirement": "Optional; omitted means unspecified",
          "description": "Longer explanation of the action or timed event, its conditions, and what happens. Plain-language context only; executable behavior remains in the selected trigger, timing, resource references, and destination state. Text does not automatically detect learner behavior. Optional when the label provides sufficient context."
        },
        {
          "path": "events.actions[].patientId",
          "type": "Patient ID",
          "requirement": "Optional; omitted means unspecified",
          "description": "Required when the action targets a patient; omit for team-only actions."
        },
        {
          "path": "events.actions[].availableInStateIds",
          "type": "State ID[]",
          "requirement": "Required; nonempty",
          "description": "Explicit phase availability; no implicit states.all default."
        },
        {
          "path": "events.actions[].conditionId",
          "type": "Condition ID",
          "requirement": "Optional; omitted means unspecified",
          "description": "Prerequisite evaluated at start and again at completion."
        },
        {
          "path": "events.actions[].durationSeconds",
          "type": "nonnegative number",
          "requirement": "Required; 0 is immediate",
          "description": "Simulated time between start and completion. Availability is evaluated at start."
        },
        {
          "path": "events.actions[].repeat",
          "type": "{ maxUses: positive integer, cooldownSeconds: nonnegative number }",
          "requirement": "Required",
          "description": "Completed uses count against maxUses; cooldown starts at completion. No implicit unlimited repeats."
        },
        {
          "path": "events.actions[].cancellable",
          "type": "boolean",
          "requirement": "Required",
          "description": "Whether an operator can cancel before completion; cancellation does not count as a completed use."
        },
        {
          "path": "events.actions[].onPhaseExit",
          "type": "cancel | continue",
          "requirement": "Required",
          "description": "Policy for unfinished work when another event changes phase. Conclusion always cancels."
        },
        {
          "path": "events.actions[].outcomes[]",
          "type": "{ id: ID, whenConditionId?: Condition ID, effectIds: Effect ID[], nextStateId?: State ID }",
          "requirement": "Required; at least one",
          "description": "Choose first matching outcome at completion. Exactly one final unconditional fallback is required. Omit nextStateId to stay in the phase."
        }
      ],
      "rules": [
        "Author scenario-specific patient changes on destination-state entry. A navigation transition selects when and where to move; it should not duplicate those patient changes. Reusable treatment responses may remain effects of the resource action.",
        "Action labels name learner activities. Suite completionCriteria is an optional plain-language criterion evaluated by the AI against learner intent, conversation, and simulator interactions; equivalent wording is accepted. If omitted, the label and description provide the criterion. The AI returns evidence-backed executions separately from ambiguous choices. Multiple explicit orders can be recorded in one atomic batch before evaluating authored transitions. Only currently available actions qualify, including selected timer-canceling actions whose source events have occurred; stale interpretations and competing state transitions are rejected. Fulfilled actions that converge on the same destination without transition effects may be recorded together; the destination is entered once. The AI cannot invent states or patient effects. Explicit facilitator confirmation remains available. Optional completion { mode: any | all, objectIds: Resource ID[] } adds direct resource recognition; automatic state releases do not count. Request completion remains distinct from delayed result availability.",
        "Suite pauses the simulation clock while the AI interprets a learner turn or new bedside interaction, so inference latency does not consume scenario time. Before committing, the runtime checks the source state and history length, records the complete requested resource batch, and then applies fulfilled authored actions. A failed batch saves no partial orders or state changes.",
        "Suite scheduled transitions may declare cancelOnActionIds: Action ID[]. Completion of any referenced learner action prevents the scheduled transition for the rest of that run, including after re-entry; self-loop actions can cancel deterioration without changing the current state or restarting its timer. Cancellation never reverses an event that already fired. While a timer is pending, selected unfinished actions remain available after their source event has occurred, even if another event is current. Future-source actions stay unavailable; completion still follows the selected action's destination, and a self-loop stays in the current event. Conclusion states do not allow this recovery. Scheduled delays are relative to the first occurrence of the source event and remain pending after other events occur. Each scheduled edge fires at most once per run. At a deadline, commands are processed in order: a completion saved before clock advancement cancels the pending transition; advancing the clock to the deadline first fires it.",
        "Suite facilitator confirmation requests every selected resource for an all-resource action if not already requested. For any-resource actions, confirmation records the observed activity without guessing which alternative was used; record the specific resource separately when results are needed. Automatic recognition does not request unchosen alternatives. Builder authors resource links only in the state inspector under Results → Configure resources, using releaseOnStateId to reveal a resource on state entry. Transitions expose no linked-resource picker or resource configuration sheet; Edit destination state opens the owning state inspector. action.objectId requests a resource during a transition. state.resourceTrigger enters a state when its requested results are available.",
        "Request and result availability are distinct events. In Suite, action.objectId requests a resource when the transition fires and does not postpone destination entry until results arrive. To enter a labs-resulted state, use state.resourceTrigger with explicit objectIds and mode any or all; evaluate after response delays elapse. Incoming transitions remain alternative paths, not guards on result availability.",
        "Suite transition effects apply during a transition. Destination-state vitals override overlapping transition values. Builder authors patient changes on the destination state. resourceTrigger and trigger belong to the application schema.",
        "Only one instance of the same action can be active at once; different actions may run concurrently. Failed completion prerequisites record an unsuccessful attempt without completion effects or a use count.",
        "An action with medicationOrder must declare kind medication-order; an action with administration must declare kind medication-administration. Generic actions reject specialized payloads, and kind-specific patient/resource references must agree rather than silently choosing a winner.",
        "For a continuing action, evaluate its outcome against the phase and values at completion. Check any requested transition guards before committing effects.",
        "outcomes[] is ordered. Preserve its declared order and choose the first matching outcome; exactly one final unconditional fallback must be last. A consumer must not sort, deduplicate, or treat outcome order as presentation-only.",
        "Outcomes are authored consequences, not clinical judgments calculated from free text. Dose, technique, and communication assessment need structured evidence or facilitator input."
      ],
      "example": {
        "events": {
          "actions": [
            {
              "id": "ask-context",
              "kind": "generic",
              "label": "Ask who will follow up",
              "description": "Clarify who will review the pending result and communicate it to the team.",
              "availableInStateIds": [
                "state-clarifying"
              ],
              "durationSeconds": 0,
              "repeat": {
                "maxUses": 2,
                "cooldownSeconds": 0
              },
              "cancellable": false,
              "onPhaseExit": "cancel",
              "outcomes": [
                {
                  "id": "outcome-context",
                  "effectIds": [
                    "effect-reveal-history"
                  ]
                }
              ]
            }
          ]
        }
      }
    },
    {
      "topic": "timing",
      "change": "Specify deterministic scheduled events, repetition, cancellation, and clock semantics.",
      "fields": [
        {
          "path": "events.schedules[].id",
          "type": "ID",
          "requirement": "Required",
          "description": "Named event allows explicit cancellation."
        },
        {
          "path": "events.schedules[].anchor",
          "type": "{ kind: scenario-start | state-entry | action-completion, refId?: ID }",
          "requirement": "Required",
          "description": "State/action anchors require the corresponding ID. Scenario-start prohibits refId."
        },
        {
          "path": "events.schedules[].delaySeconds",
          "type": "positive number",
          "requirement": "Required",
          "description": "Simulated offset from each occurrence of the anchor; zero-time effects belong in the originating event."
        },
        {
          "path": "events.schedules[].conditionId",
          "type": "Condition ID",
          "requirement": "Optional; omitted means unspecified",
          "description": "Evaluate when due. False skips that occurrence; it does not poll until true."
        },
        {
          "path": "events.schedules[].priority",
          "type": "integer",
          "requirement": "Required; lower executes first",
          "description": "Explicit ordering for simultaneous events. Equal priority uses schedule ID lexical order."
        },
        {
          "path": "events.schedules[].effectIds",
          "type": "Effect ID[]",
          "requirement": "Required; may be empty",
          "description": "Operations applied atomically if the due event and transition guards are valid."
        },
        {
          "path": "events.schedules[].nextStateId",
          "type": "State ID",
          "requirement": "Optional; omitted means unspecified",
          "description": "Optional phase transition; omit for a result or actor cue that does not move the main phase."
        },
        {
          "path": "events.schedules[].repeat",
          "type": "{ intervalSeconds: positive number, count: positive integer }",
          "requirement": "Optional; omission means one occurrence",
          "description": "Count includes the initial occurrence. Finite repetition prevents unbounded schedules."
        },
        {
          "path": "events.schedules[].onAnchorStateExit",
          "type": "cancel | continue",
          "requirement": "Required only for state-entry anchors",
          "description": "Cancel removes pending occurrences from that entry; re-entry creates a new schedule instance."
        }
      ],
      "rules": [
        "Time advances explicitly in simulated seconds, independent of wall time. At a timestamp: sample active trends, complete due actions ordered by action ID, then process schedules by priority and ID, then refresh disclosure conditions. Each operation sees prior committed operations at that instant.",
        "Every phase transition applies exit effects, originating event effects, then entry effects. Newly scheduled events must be strictly later. An operation targeting a canceled event is a recorded no-op. Repeated anchor occurrences have distinct runtime instance IDs.",
        "Reject cyclic instantaneous effect chains. A run engine must impose documented execution bounds and report a limit failure rather than silently skipping work."
      ],
      "example": {
        "events": {
          "schedules": [
            {
              "id": "schedule-update",
              "anchor": {
                "kind": "state-entry",
                "refId": "state-waiting"
              },
              "delaySeconds": 30,
              "priority": 10,
              "effectIds": [
                "effect-release-update"
              ],
              "onAnchorStateExit": "continue"
            }
          ]
        }
      }
    },
    {
      "topic": "objects",
      "change": "Resources define reusable content and explicit result delivery.",
      "fields": [
        {
          "path": "resources[]",
          "type": "{ id: ID, kind: enum, name: string, description: string, sourceIds: ID[] }",
          "requirement": "Required; may be empty",
          "description": "Kinds: medication, diagnostic, procedure, equipment, consultation, information. Type-specific payloads are defined in their domain chapters."
        },
        {
          "path": "events.actions[].resourceId",
          "type": "Resource ID",
          "requirement": "Optional; omitted means unspecified",
          "description": "Resource used by the action. Use count and repetition belong to the action rather than a global once-per-object rule."
        },
        {
          "path": "resources[].results[]",
          "type": "{ id: ID, content: string, observationIds: Observation ID[], assetIds: Asset ID[], disclosure: Disclosure }",
          "requirement": "Optional; default []",
          "description": "Named result combines authored report text, structured observations, media, and audience rules."
        },
        {
          "path": "resources[].results[].interpretation",
          "type": "{ learner?: string, facilitator: string }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Separate diagnostic or teaching explanation from the raw learner result."
        }
      ],
      "rules": [
        "Resource classification is stored in events.objects[].type. Diagnostic resources require diagnosticCategory: lab, imaging, or physiologic. Other resource types omit diagnosticCategory. Procedures include nursing and physician actions performed on the patient.",
        "Reusable resources describe content; requests, administrations, and result deliveries are runtime instances with unique IDs and timestamps.",
        "Use a schedule anchored to action completion for delayed release. No universal result delay also delays administration or every effect; timing must be expressed explicitly.",
        "A resource type does not grant access. Result availability and role filtering apply to exports, network payloads, and UI alike."
      ],
      "example": {
        "resources": [
          {
            "id": "resource-update",
            "kind": "information",
            "name": "Pending update",
            "description": "A fictional handoff update.",
            "sourceIds": [],
            "results": [
              {
                "id": "result-update",
                "content": "The update is ready; confirm the recipient.",
                "observationIds": [],
                "assetIds": [],
                "disclosure": {
                  "audience": [
                    "learner",
                    "facilitator"
                  ],
                  "mode": "facilitator"
                }
              }
            ]
          }
        ]
      }
    },
    {
      "topic": "medications",
      "change": "Separate a medication definition, order, administration, infusion, and authored response.",
      "fields": [
        {
          "path": "resources[].medication",
          "type": "{ ingredient: string, formulation: string, concentration?: QuantityRatio, allowedRoutes: string[] }",
          "requirement": "Required for medication resources",
          "description": "Reusable product definition. QuantityRatio is numerator Quantity / denominator Quantity; positive denominator is required."
        },
        {
          "path": "events.actions[].medicationOrder",
          "type": "{ resourceId: Medication ID, patientId: Patient ID, dose: Quantity, route: string, rate?: QuantityRatio }",
          "requirement": "Required for a medication-order action",
          "description": "Quantity is { value: positive number, unit: string }. Units are explicit; route must belong to allowedRoutes."
        },
        {
          "path": "events.actions[].administration",
          "type": "{ orderActionId: Action ID, mode: bolus | infusion-start | infusion-change | infusion-stop }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Administration is a separate observable action referencing an order, not an automatic consequence of writing it."
        },
        {
          "path": "events.actions[].administration.rate",
          "type": "QuantityRatio",
          "requirement": "Required for infusion-start/change; prohibited otherwise",
          "description": "Explicit amount per time or volume per time. No implicit unit conversion or pump calculation."
        }
      ],
      "rules": [
        "Infusion-change and infusion-stop require an active infusion for the same order and patient. Runtime administration records preserve authored amount, route, time, and operator evidence separately from the scenario definition.",
        "Validate dimensional compatibility of dose/concentration/rate. Reject incompatible or unrecognized units instead of guessing. Unit vocabulary and permitted conversions must be versioned before runtime adoption.",
        "Effects and schedules explicitly describe the scenario's response. This format does not prescribe treatment doses or claim a validated pharmacologic model."
      ],
      "example": {
        "resources": [
          {
            "id": "med-training-fluid",
            "kind": "medication",
            "name": "Fictional training fluid",
            "description": "Nonclinical authoring example, not a treatment instruction.",
            "sourceIds": [],
            "medication": {
              "ingredient": "Training fluid",
              "formulation": "simulation-only",
              "allowedRoutes": [
                "simulated-line"
              ]
            }
          }
        ]
      }
    },
    {
      "topic": "laboratory",
      "change": "Model orders, specimens, panels, analytes, and serial results separately.",
      "fields": [
        {
          "path": "resources[].diagnostic",
          "type": "{ category: lab | imaging | physiologic, specimen?: string, collectionInstructions?: string, resultIds: Result ID[] }",
          "requirement": "Required for diagnostic resources",
          "description": "A named request with explicit result references. Laboratory requests require an authored specimen description."
        },
        {
          "path": "resources[].results[].panelName",
          "type": "string",
          "requirement": "Optional; omitted means unspecified",
          "description": "Human-readable panel grouping; does not inject assumed analytes."
        },
        {
          "path": "observations[].referenceInterval",
          "type": "{ low?: number, high?: number, text?: string, unit?: string, context: string }",
          "requirement": "Optional; omitted means unspecified",
          "description": "At least one bound or text description; numeric bounds require the observation's unit and low must not exceed high. Context describes the authored population/method."
        },
        {
          "path": "observations[].flag",
          "type": "low | high | critical | none | not-interpreted",
          "requirement": "Optional; omitted means unspecified",
          "description": "Explicit authored flag, never inferred from a generic source default."
        },
        {
          "path": "resources[].results[].specimenStatus",
          "type": "adequate | inadequate | not-collected",
          "requirement": "Required for laboratory results",
          "description": "Allows rejected or unavailable specimens to drive a repeat-collection branch."
        }
      ],
      "rules": [
        "Results are numeric, qualitative text, or boolean observations according to the concept definition. Preserve decimals. Collection and release are distinct events.",
        "Laboratory panels are reusable catalog resources, not part of the format specification. Import selected panels as explicit authored observations, preserving values, units, and provenance. Missing results remain unspecified; never inject normal results during playback.",
        "Each repeated collection creates a runtime request/result instance; serial authored result templates have distinct IDs. Do not overwrite previous results or use numeric zero for pending results."
      ],
      "example": {
        "resources": [
          {
            "id": "test-training",
            "kind": "diagnostic",
            "name": "Training specimen",
            "description": "Fictional qualitative exercise.",
            "sourceIds": [],
            "diagnostic": {
              "category": "lab",
              "specimen": "Simulated sample",
              "resultIds": [
                "result-specimen"
              ]
            },
            "results": [
              {
                "id": "result-specimen",
                "content": "Specimen labeling incomplete; recollection requested.",
                "specimenStatus": "inadequate",
                "observationIds": [],
                "assetIds": [],
                "disclosure": {
                  "audience": [
                    "learner",
                    "facilitator"
                  ],
                  "mode": "facilitator"
                }
              }
            ]
          }
        ]
      }
    },
    {
      "topic": "imaging",
      "change": "Package portable media with acquisition context and separate interpretations.",
      "fields": [
        {
          "path": "assets[].id",
          "type": "ID",
          "requirement": "Required",
          "description": "Stable asset reference used by results and outputs."
        },
        {
          "path": "assets[].path",
          "type": "relative POSIX path",
          "requirement": "Required",
          "description": "Path under assets/ within the package. Reject absolute paths, .. segments, symlinks, duplicate paths, and external fetches."
        },
        {
          "path": "assets[].mediaType",
          "type": "MIME string",
          "requirement": "Required",
          "description": "Declared content type must match decoded asset type; unsupported active content is rejected."
        },
        {
          "path": "assets[].sha256",
          "type": "64 lowercase hexadecimal characters",
          "requirement": "Required",
          "description": "Digest verified against bytes before use; integrity does not prove safety or authorship."
        },
        {
          "path": "assets[].description",
          "type": "string",
          "requirement": "Required",
          "description": "Accessible description of the learner-visible content without hidden diagnostic explanation."
        },
        {
          "path": "assets[].license",
          "type": "string",
          "requirement": "Required",
          "description": "Reuse terms for this asset, with attribution in a separate field."
        },
        {
          "path": "assets[].attribution",
          "type": "string",
          "requirement": "Required",
          "description": "Creator and source credit."
        },
        {
          "path": "assets[].transcriptAssetId",
          "type": "Asset ID",
          "requirement": "Required for spoken audio/video",
          "description": "Packaged accessible transcript; role filtering matches the original media."
        },
        {
          "path": "resources[].diagnostic.acquisition",
          "type": "{ bodyRegion?: string, view?: string, technique?: string }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Study-specific context independent of report interpretation."
        }
      ],
      "rules": [
        "Package media locally for offline playback; external links can be citations but are not runtime asset dependencies. A package must fail validation when a required asset is missing or its hash is wrong.",
        "Results reference asset IDs and separate learner/facilitator interpretations. File names, alt text, and transcripts must be reviewed for unintended answer disclosure."
      ],
      "example": {
        "resources": [
          {
            "id": "study-example",
            "kind": "diagnostic",
            "name": "Example study",
            "description": "Illustrates media references only.",
            "sourceIds": [],
            "diagnostic": {
              "category": "imaging",
              "acquisition": {
                "view": "Authored view"
              },
              "resultIds": [
                "result-image"
              ]
            },
            "results": [
              {
                "id": "result-image",
                "content": "Review the supplied image.",
                "observationIds": [],
                "assetIds": [
                  "asset-study"
                ],
                "disclosure": {
                  "audience": [
                    "learner",
                    "facilitator"
                  ],
                  "mode": "facilitator"
                },
                "interpretation": {
                  "facilitator": "Explain how the finding affects the next decision."
                }
              }
            ]
          }
        ]
      }
    },
    {
      "topic": "ecg",
      "change": "Distinguish rhythm, ECG findings, acquisition settings, and a recording.",
      "fields": [
        {
          "path": "patients[].monitor.connections",
          "type": "{ ecg?: boolean, bloodPressure?: boolean, spo2?: boolean, respiration?: boolean, temperature?: boolean, capnography?: boolean, arterialPressure?: boolean }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Initial patient monitor connections. An explicit map starts every omitted channel disconnected; an empty map means all channels disconnected."
        },
        {
          "path": "resources[].equipment.monitorConnection",
          "type": "{ channel: MonitorChannel, connected: boolean }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Declares which channel this equipment connects or disconnects. The using action targets the patient through an explicit set-monitor-connection effect; importing the resource alone does not connect it."
        },
        {
          "path": "events.effects[].channel",
          "type": "ecg | bloodPressure | spo2 | respiration | temperature | capnography | arterialPressure",
          "requirement": "Required only for set-monitor-connection; prohibited for other effects",
          "description": "MonitorChannel identifies the affected patient measurement channel; targetId is a Patient ID and value is the connected boolean."
        },
        {
          "path": "resources[].diagnostic.ecg",
          "type": "{ leadConfiguration: string, paperSpeedMmPerSecond?: number, gainMmPerMv?: number, rhythmObservationId?: Observation ID, findingObservationIds: Observation ID[] }",
          "requirement": "Required for physiologic diagnostics that record an ECG",
          "description": "Acquisition context plus independent rhythm and morphology findings; all supplied scale numbers must be positive."
        },
        {
          "path": "resources[].diagnostic.ecg.recordingAssetId",
          "type": "Asset ID",
          "requirement": "Required",
          "description": "ECG image, signal, or video manifest entry with an accessible description."
        }
      ],
      "rules": [
        "Monitor fields and set-monitor-connection require the monitor-connections execution capability. A consumer lacking a required capability must reject execution, not silently expose readings. Unknown channel names and nonboolean connection values invalidate the document.",
        "Connections control availability, not physiology or rhythm. ECG gates hr; bloodPressure gates sbp/dbp; spo2 gates oxygen saturation; respiration gates rr; temperature gates temperature; capnography gates etco2; arterialPressure gates artSbp/artDbp. Connecting a channel with no authored measurement cannot invent a reading. Disconnection hides live and newly recorded readings; it does not erase earlier measurements or underlying variables.",
        "set-monitor-connection changes only its target patient's selected channel and persists until another effect changes it. Use onEnterEffectIds for event changes and action outcome effects for equipment use; schedule the effect with delayed result release when connection should occur at that time. A declared equipment.monitorConnection must agree with its using action's channel/value. Equipment status alone never implicitly enables every monitor channel.",
        "Portable omission leaves baseline connection state unspecified; an execution profile must define it before displaying measurements. Suite maps patients[].monitor.connections to patients.monitor.connections, set-monitor-connection entry effects to events.states[].monitor.connections, and equipment.monitorConnection to events.objects[].monitorConnection. Suite new drafts explicitly enable all monitor channels; omission in existing Suite files preserves available channels as connected. Omitted event channels inherit their preceding state. These mappings describe the execution contract, not an implemented portable importer.",
        "Do not force one mutually exclusive selection for rhythm and non-rhythm findings. Each finding is separately disclosed and attributed.",
        "This format packages authored recordings. Suite schematic monitor synthesis is separately specified in docs/monitor-rhythms.md (profile 1.0.0); portable extension binding is not yet implemented."
      ],
      "example": {
        "executionProfile": {
          "id": "https://example.invalid/usim/profiles/monitoring",
          "version": "1.0.0",
          "requiredCapabilities": [
            "monitor-connections"
          ],
          "optionalCapabilities": []
        },
        "patients": [
          {
            "id": "patient-alex",
            "monitor": {
              "connections": {}
            }
          }
        ],
        "events": {
          "effects": [
            {
              "id": "connect-ecg",
              "kind": "set-monitor-connection",
              "targetId": "patient-alex",
              "channel": "ecg",
              "value": true
            }
          ]
        },
        "resources": [
          {
            "id": "device-ecg-monitor",
            "kind": "equipment",
            "name": "ECG monitor",
            "description": "Connect with an authored action referencing connect-ecg.",
            "sourceIds": [],
            "equipment": {
              "type": "ecg-monitor",
              "status": "available",
              "monitorConnection": {
                "channel": "ecg",
                "connected": true
              }
            }
          },
          {
            "id": "ecg-example",
            "kind": "diagnostic",
            "name": "Authored ECG",
            "description": "Example structure, not a diagnostic case.",
            "sourceIds": [],
            "diagnostic": {
              "category": "physiologic",
              "resultIds": [],
              "ecg": {
                "leadConfiguration": "12-lead",
                "recordingAssetId": "asset-ecg",
                "findingObservationIds": []
              }
            }
          }
        ]
      }
    },
    {
      "topic": "ventilation",
      "change": "Separate airway state, ventilator settings, measured values, and alarms.",
      "fields": [
        {
          "path": "patients[].airway",
          "type": "{ status: natural | adjunct | intubated | surgical, deviceId?: Device ID }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Non-natural airway requires a device reference; presence does not imply correct placement or function."
        },
        {
          "path": "resources[].equipment.ventilation",
          "type": "{ mode: string, settings: Setting[], measurementIds: Observation ID[], alarms: Alarm[] }",
          "requirement": "Required for ventilator devices",
          "description": "Setting is { name: string, value: number, unit: string }; settings and observations remain distinct."
        },
        {
          "path": "resources[].equipment.ventilation.alarms[]",
          "type": "{ id: ID, conditionId: Condition ID, message: string, severity: advisory | urgent }",
          "requirement": "Required; may be empty",
          "description": "Authored alarm conditions and visible messages, evaluated from explicit conditions."
        }
      ],
      "rules": [
        "Declare a mode's allowed and required settings in a device profile; an unknown profile cannot execute. This format does not specify every ventilator manufacturer's modes.",
        "Setting units include tidal volume mL, set rate breaths/min, inspired oxygen fraction 0–1, and PEEP cmH2O."
      ],
      "example": {
        "patients": [
          {
            "id": "patient-alex",
            "airway": {
              "status": "natural"
            }
          }
        ],
        "resources": [
          {
            "id": "device-vent",
            "kind": "equipment",
            "name": "Training ventilator",
            "description": "Requires a mode profile before execution.",
            "sourceIds": [],
            "equipment": {
              "type": "ventilator",
              "status": "available",
              "ventilation": {
                "mode": "extension-profile-required",
                "settings": [],
                "measurementIds": [],
                "alarms": []
              }
            }
          }
        ]
      }
    },
    {
      "topic": "lines",
      "change": "Give devices identity, placement, function, and associated measurements.",
      "fields": [
        {
          "path": "resources[].equipment",
          "type": "{ type: string, status: available | connected | malfunctioning | removed, patientId?: Patient ID, site?: string, size?: string, measurementIds?: Observation ID[] }",
          "requirement": "Required for device resources",
          "description": "Covers vascular access, urinary/gastric tubes, invasive monitoring, and other authored devices."
        },
        {
          "path": "resources[].equipment.placement",
          "type": "{ placedAtSeconds?: number, confirmation: unknown | confirmed | incorrect, note?: string }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Separate placement time and authored confirmation from mere presence."
        },
        {
          "path": "resources[].equipment.capabilities",
          "type": "string[]",
          "requirement": "Optional; default []",
          "description": "Named capabilities referenced by procedure prerequisites or environment requirements."
        }
      ],
      "rules": [
        "Connected and malfunctioning patient devices require patientId. Measurements are observations with their own units and times; they are not automatically equivalent to noninvasive measurements.",
        "Removed devices remain in event history. A replacement is a different device instance, even when the same resource template is reused."
      ],
      "example": {
        "resources": [
          {
            "id": "device-line",
            "kind": "equipment",
            "name": "Simulated peripheral line",
            "description": "Baseline access for the exercise.",
            "sourceIds": [],
            "equipment": {
              "type": "peripheral-iv",
              "status": "connected",
              "patientId": "patient-alex",
              "site": "Authored site",
              "placement": {
                "confirmation": "unknown"
              },
              "capabilities": [
                "simulated-access"
              ]
            }
          }
        ]
      }
    },
    {
      "topic": "procedures",
      "change": "Specify preparation, observed performance, outcomes, and complications for procedures.",
      "fields": [
        {
          "path": "resources[].procedure",
          "type": "{ indication: string, requiredResourceIds: Resource ID[], steps: ProcedureStep[], outcomeActionId: Action ID }",
          "requirement": "Required for procedure resources",
          "description": "Preparation and performance content with an explicit action deciding the authored result."
        },
        {
          "path": "resources[].procedure.steps[]",
          "type": "{ id: ID, instruction: string, evidence: facilitator | action, actionId?: Action ID, critical: boolean }",
          "requirement": "Required; nonempty",
          "description": "Ordered observable steps. Action evidence requires actionId; facilitator evidence is recorded during the run."
        },
        {
          "path": "resources[].procedure.complications[]",
          "type": "{ id: ID, description: string, conditionId: Condition ID, effectIds: Effect ID[] }",
          "requirement": "Optional; default []",
          "description": "Conditional authored consequences evaluated once at procedure completion, in listed order."
        }
      ],
      "rules": [
        "A step marked critical is educational metadata, not automatic failure. The rubric defines its assessment consequence.",
        "Procedure completion requires explicit evidence. Timed passage or clicking an action alone must not be described as demonstrating manual technique."
      ],
      "example": {
        "resources": [
          {
            "id": "procedure-readback",
            "kind": "procedure",
            "name": "Structured read-back",
            "description": "Nonclinical procedural example.",
            "sourceIds": [],
            "procedure": {
              "indication": "Confirm shared responsibility.",
              "requiredResourceIds": [],
              "steps": [
                {
                  "id": "step-name-owner",
                  "instruction": "Name the person responsible for follow-up.",
                  "evidence": "facilitator",
                  "critical": true
                }
              ],
              "outcomeActionId": "confirm-readback",
              "complications": []
            }
          }
        ]
      }
    },
    {
      "topic": "environment",
      "change": "Add reproducible setup, actor behavior, communication exchanges, and reset instructions.",
      "fields": [
        {
          "path": "environment.setting",
          "type": "string",
          "requirement": "Required",
          "description": "Location, encounter context, and relevant environmental constraints."
        },
        {
          "path": "environment.teamRoles[]",
          "type": "{ id: ID, name: string, minCount: integer, maxCount: integer, brief: string }",
          "requirement": "Required; may be empty",
          "description": "Portable learner role requirements. Counts are nonnegative with maxCount ≥ minCount; actual assignments belong to delivery records."
        },
        {
          "path": "environment.requirements[]",
          "type": "{ id: ID, description: string, resourceIds: Resource ID[], substitutions: string[], required: boolean }",
          "requirement": "Required; may be empty",
          "description": "Operational preparation needs with acceptable alternatives."
        },
        {
          "path": "environment.actors[]",
          "type": "{ id: ID, name: string, role: string, opening: string, knowledge: string[], affect: string, cues: ActorCue[] }",
          "requirement": "Required; may be empty",
          "description": "Character brief defines what the actor knows, how they behave, and what they volunteer."
        },
        {
          "path": "environment.actors[].cues[]",
          "type": "{ id: ID, conditionId: Condition ID, line: string, delivery: facilitator | display, maxUses: positive integer }",
          "requirement": "Required; may be empty",
          "description": "Explicit trigger and repeat bound. Display sends authored text; facilitator means a prompt for a human actor."
        },
        {
          "path": "resources[].consultation",
          "type": "{ service: string, actorId: Actor ID, requestedInformation: string[], responseResultIds: Result ID[] }",
          "requirement": "Required for consultation resources",
          "description": "A structured exchange with authored requests and responses rather than a one-line result."
        },
        {
          "path": "environment.resetSteps",
          "type": "string[]",
          "requirement": "Required; may be empty",
          "description": "Ordered steps to restore equipment, media, supplies, and actor starting conditions."
        }
      ],
      "rules": [
        "Role descriptions are scenario content; named staff and room bookings remain Center records. Actor display cues are authored content, not autonomous dialogue generation.",
        "Before re-running, create a new runtime instance and perform reset steps; clearing an active phase alone does not restore consumed resources or observation history."
      ],
      "example": {
        "environment": {
          "setting": "Simulated handoff room",
          "teamRoles": [
            {
              "id": "role-receiver",
              "name": "Receiving colleague",
              "minCount": 1,
              "maxCount": 2,
              "brief": "Establish a shared next step."
            }
          ],
          "requirements": [],
          "actors": [
            {
              "id": "actor-outgoing",
              "name": "Outgoing colleague",
              "role": "Facilitator-played colleague",
              "opening": "There is an update still pending.",
              "knowledge": [
                "No follow-up owner was assigned."
              ],
              "affect": "Busy but cooperative",
              "cues": []
            }
          ],
          "resetSteps": [
            "Return the handoff note to its opening version."
          ]
        }
      }
    },
    {
      "topic": "education",
      "change": "Define the learning audience, preparation, observable objectives, assessment evidence, facilitation, and transfer to practice.",
      "fields": [
        {
          "path": "education.rationale",
          "type": "string",
          "requirement": "Optional; omitted means unspecified",
          "description": "Why this learning need warrants the exercise; describe intended learning without claiming demonstrated effectiveness."
        },
        {
          "path": "education.audience",
          "type": "{ professions: string[], learnerLevels: string[], prerequisites: string[] }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Authored audience and entry knowledge or skills. Use locally meaningful levels; an empty prerequisite list explicitly means none are authored."
        },
        {
          "path": "education.sessionPlan",
          "type": "{ modality: facilitated | self-directed | hybrid, participantCount: { min: positive integer, max: positive integer }, phases: SessionPhase[] }",
          "requirement": "Optional; omitted means unspecified",
          "description": "SessionPhase is { id: ID, kind: preparation | prebrief | scenario | debrief | follow-up, durationMinutes: positive number, guidance: string }. Phases are ordered; durations are planning estimates in wall-clock minutes, not simulated event deadlines."
        },
        {
          "path": "education.preparation[]",
          "type": "{ id: ID, audience: learner | facilitator, instructions: string, assetIds: Asset ID[] }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Preparation activities and packaged resources, with an explicit audience for each item. Instructions may use Markdown for formatted module directions and links; assetIds reference packaged learning documents. This describes preparation, not completion tracking or an enforced start gate. Suite implements the corresponding authoring surface as education.prerequisites and embedded education.prerequisiteDocuments in its application schema."
        },
        {
          "path": "education.objectives[].domain",
          "type": "knowledge | reasoning | technical-skill | communication | teamwork | professionalism | systems",
          "requirement": "Optional; omitted means unspecified",
          "description": "Optional classification for discovery; it does not select a scoring algorithm."
        },
        {
          "path": "education.objectives[].performance",
          "type": "{ context: string, expectedBehavior: string, successCriteria: string, scope: individual | team }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Observable behavior, conditions of performance, and acceptable standard. Team evidence cannot be attributed automatically to each individual."
        },
        {
          "path": "education.objectives[].curriculumMappings[]",
          "type": "{ framework: URI, version: string, code: string, label: string }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Curriculum or competency references; mappings are author assertions, not accreditation or equivalence. ACGME core competency mappings use framework https://www.acgme.org/programs-and-institutions/programs/common-program-requirements/, version core-competencies-2026-09, and codes PC, MK, PBLI, ICS, PROF, SBP. Specialty-specific Milestones require their own framework and version; do not infer levels from scenario scores."
        },
        {
          "path": "education.objectives[].learnerBrief",
          "type": "string",
          "requirement": "Optional; omitted means unspecified",
          "description": "Learner-facing statement of the task or objective. Facilitator success criteria may contain spoilers and are not included implicitly."
        },
        {
          "path": "education.rubrics[].observationGuide",
          "type": "{ opportunity: string, acceptableAlternatives: string[], limitations: string, calibration: string }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Define when evidence is available, alternative valid approaches, what the method cannot establish, and how raters align their judgments."
        },
        {
          "path": "education.assessmentPlan",
          "type": "{ purpose: practice | formative | summative, feedbackTiming: during | after | both, interpretation: string }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Intended use and limits of the evidence. Summative intent alone does not supply validation, a pass rule, or authority to make a credentialing decision."
        },
        {
          "path": "education.facilitation",
          "type": "{ cuePolicy: string, pauseAndResume: string, repeatPolicy: string, adaptations: string[] }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Guidance for assistance, interruption, deliberate practice, and access needs. Record actual adaptations separately in the delivery record."
        },
        {
          "path": "education.debriefPlan",
          "type": "{ approach: string, phases: DebriefPhase[], takeHomeMessages: string[] }",
          "requirement": "Optional; omitted means unspecified",
          "description": "DebriefPhase is { id: ID, title: string, promptIds: DebriefPrompt ID[] }. Phases and their prompt references are ordered; name a method only when the author intends that method."
        },
        {
          "path": "education.followUp[]",
          "type": "{ id: ID, objectiveIds: Objective ID[], activity: string, evidence: string, assetIds: Asset ID[] }",
          "requirement": "Optional; omitted means unspecified",
          "description": "Planned remediation, repeated practice, or transfer activity and what would demonstrate progress. Actual completion stays in learning records."
        },
        {
          "path": "education.objectives[]",
          "type": "{ id: ID, statement: string, evidenceActionIds: Action ID[], rubricIds: Rubric ID[] }",
          "requirement": "Required; nonempty",
          "description": "Observable outcome with explicit event evidence and assessment references."
        },
        {
          "path": "education.rubrics[]",
          "type": "{ id: ID, objectiveId: Objective ID, evidence: facilitator | event, levels: RubricLevel[] }",
          "requirement": "Required; may be empty",
          "description": "RubricLevel is { id: ID, label: string, description: string, score?: number }; describe observable performance before assigning any number."
        },
        {
          "path": "education.cues[]",
          "type": "{ id: ID, objectiveId: Objective ID, conditionId?: Condition ID, text: string, level: prompt | hint | direct, delivery: facilitator | display }",
          "requirement": "Required; may be empty",
          "description": "Ordered assistance ladder. Record cue ID, delivery time, and operator in the run, not the scenario."
        },
        {
          "path": "education.endings[]",
          "type": "{ id: ID, label: string, outcome: complete | incomplete | alternative, debriefPromptIds: ID[] }",
          "requirement": "Required; nonempty",
          "description": "Intentional endpoints distinguish task closure from assessment scores."
        },
        {
          "path": "education.debriefPrompts[]",
          "type": "{ id: ID, objectiveIds: Objective ID[], question: string, facilitatorRationale: string }",
          "requirement": "Required; nonempty",
          "description": "Targeted reflection connected to the experience and learning purpose."
        },
        {
          "path": "education.prebrief",
          "type": "string",
          "requirement": "Required",
          "description": "Learner-facing orientation covering roles, equipment limitations, help requests, confidentiality expectations, assessment purpose, and the right to pause. Do not promise confidentiality beyond local policy."
        },
        {
          "path": "education.stopConditions",
          "type": "string[]",
          "requirement": "Required; nonempty",
          "description": "Human-readable reasons for a facilitator to pause or stop; actual interruption and reason are runtime records."
        }
      ],
      "rules": [
        "All objective, rubric, cue, ending, debrief, and follow-up references resolve to their declared entity type. Reference lists contain no duplicates. Each rubric appears in its objective rubricIds, and each listed rubric points back to that same objective. Rubric levels are nonempty and have globally unique IDs.",
        "An objective may be ungraded: an empty rubricIds list declares no authored rating, not successful performance. Facilitator evidence may use an empty evidenceActionIds list. Event rubrics require at least one evidence action on their objective; multiple action references identify candidate evidence, not an implicit all/any success predicate.",
        "Rubric levels describe distinguishable observed performance. Their order and optional finite scores do not imply a selection algorithm. Not observed, not applicable, and interrupted are delivery-record statuses, not lowest-level ratings or zero scores. Missing evidence cannot silently become failure.",
        "Conditions make cues eligible, not delivered. Omitted conditionId means facilitator selection; display delivery requires a conditionId and an execution profile defining timing, repetition, and suppression. Preserve authored cue order, record assistance separately, and never infer an uncued attempt merely because no delivery record was captured.",
        "participantCount.min must not exceed max. A supplied sessionPlan or debriefPlan contains at least one phase. Follow-up objectiveIds and debrief prompt objectiveIds are nonempty. Phase IDs obey the document-wide ID rules. Planning phases do not schedule runtime events.",
        "Prebrief and objective learnerBrief are learner-facing. Preparation follows its declared audience. Rationale, performance criteria, rubrics, cue text before delivery, ending outcomes, debrief rationales, facilitation, and assessment interpretation are facilitator-only by default. Release debrief questions and follow-up activities through an explicit delivery view; includeIds never overrides audience restrictions.",
        "Interruption is separate from an authored ending and from an assessment result. A complete ending means the authored task closed; it does not establish that objectives were met. Repeated attempts retain separate evidence, assistance, and adaptation records rather than overwriting earlier performance.",
        "Keep learner identities, rater identities, selected levels, actual timing, feedback, recordings, and progress outside the portable scenario. Delivery records identify scenarioId and metadata.revision; comparisons must account for changes in objectives, rubric anchors, assistance, or adaptations.",
        "These fields define portable educational content. They do not add Suite Builder controls, execute rubric scoring, or validate educational outcomes. Consumers must report unsupported content and preserve it or explicitly report export loss; they must not silently flatten structured objectives into equivalent-looking scored criteria.",
        "Do not infer competence solely from a transition. Event evidence can establish that an action occurred; quality of communication or procedure performance may require facilitator judgment.",
        "Scores are optional per rubric level. No universal total, weights, pass threshold, or negative reward is implied; the assessment policy must define aggregation explicitly.",
        "Acceptable alternatives belong in rubric level descriptions and outcome branches. Cue-assisted completion remains distinguishable from independent performance."
      ],
      "example": {
        "education": {
          "rationale": "Practice explicit ownership of pending work during a handoff.",
          "audience": {
            "professions": [
              "Medicine",
              "Nursing"
            ],
            "learnerLevels": [
              "Early postgraduate"
            ],
            "prerequisites": [
              "Can deliver a concise patient handoff."
            ]
          },
          "sessionPlan": {
            "modality": "facilitated",
            "participantCount": {
              "min": 2,
              "max": 4
            },
            "phases": [
              {
                "id": "phase-prebrief",
                "kind": "prebrief",
                "durationMinutes": 5,
                "guidance": "Agree roles and how to request a pause."
              },
              {
                "id": "phase-practice",
                "kind": "scenario",
                "durationMinutes": 8,
                "guidance": "Exchange the fictional handoff."
              },
              {
                "id": "phase-reflect",
                "kind": "debrief",
                "durationMinutes": 10,
                "guidance": "Review evidence of accepted ownership."
              }
            ]
          },
          "preparation": [
            {
              "id": "prepare-handoff",
              "audience": "learner",
              "instructions": "Review the local handoff structure.",
              "assetIds": []
            }
          ],
          "assessmentPlan": {
            "purpose": "formative",
            "feedbackTiming": "after",
            "interpretation": "Use observed communication to plan practice; this exercise does not establish independent clinical competence."
          },
          "facilitation": {
            "cuePolicy": "Offer the ownership prompt if the team stalls; record its delivery.",
            "pauseAndResume": "Pause on request, clarify the concern, and agree whether to resume or stop.",
            "repeatPolicy": "Offer a fresh attempt after feedback; keep each attempt separate.",
            "adaptations": [
              "Offer a written handoff and accessible text resources."
            ]
          },
          "debriefPlan": {
            "approach": "Facilitated reflection",
            "phases": [
              {
                "id": "debrief-analysis",
                "title": "Examine ownership",
                "promptIds": [
                  "debrief-owner"
                ]
              }
            ],
            "takeHomeMessages": [
              "Naming an owner and confirming acceptance are separate steps."
            ]
          },
          "followUp": [
            {
              "id": "followup-handoff",
              "objectiveIds": [
                "objective-ownership"
              ],
              "activity": "Repeat with a different pending task.",
              "evidence": "Confirm an owner and acceptance without a prompt.",
              "assetIds": []
            }
          ],
          "objectives": [
            {
              "id": "objective-ownership",
              "statement": "Name a follow-up owner and confirm acceptance.",
              "domain": "communication",
              "performance": {
                "context": "At the end of the handoff",
                "expectedBehavior": "Name the owner and obtain explicit acceptance.",
                "successCriteria": "Both are observable without assistance.",
                "scope": "team"
              },
              "learnerBrief": "Agree responsibility for the pending update.",
              "evidenceActionIds": [
                "confirm-readback"
              ],
              "rubricIds": [
                "rubric-ownership"
              ]
            }
          ],
          "rubrics": [
            {
              "id": "rubric-ownership",
              "objectiveId": "objective-ownership",
              "evidence": "facilitator",
              "observationGuide": {
                "opportunity": "Observe the closing exchange.",
                "acceptableAlternatives": [
                  "Written acknowledgment when the exercise uses text communication."
                ],
                "limitations": "A logged action alone does not show the quality of the exchange.",
                "calibration": "Review examples of explicit versus implied acceptance before observing."
              },
              "levels": [
                {
                  "id": "level-incomplete",
                  "label": "Incomplete",
                  "description": "An opportunity was observed, but ownership or acceptance remained unspecified."
                },
                {
                  "id": "level-independent",
                  "label": "Independent",
                  "description": "Names an owner and obtains an explicit read-back without a cue."
                },
                {
                  "id": "level-assisted",
                  "label": "Assisted",
                  "description": "Confirms ownership after a facilitator prompt."
                }
              ]
            }
          ],
          "cues": [
            {
              "id": "cue-owner",
              "objectiveId": "objective-ownership",
              "text": "Who will take responsibility for the pending update?",
              "level": "prompt",
              "delivery": "facilitator"
            }
          ],
          "endings": [
            {
              "id": "ending-agreed",
              "label": "Follow-up agreed",
              "outcome": "complete",
              "debriefPromptIds": [
                "debrief-owner"
              ]
            }
          ],
          "debriefPrompts": [
            {
              "id": "debrief-owner",
              "objectiveIds": [
                "objective-ownership"
              ],
              "question": "How did you know responsibility was accepted?",
              "facilitatorRationale": "Distinguish naming a task from confirming ownership."
            }
          ],
          "prebrief": "Practice a fictional handoff. Ask the facilitator about simulation limitations.",
          "stopConditions": [
            "A participant requests a stop."
          ]
        }
      }
    },
    {
      "topic": "inheritance",
      "change": "Define bounded conditions/effects and reproducible library composition instead of executable script text.",
      "fields": [
        {
          "path": "events.effects[].kind",
          "type": "set-variable | trend-variable | reveal | set-flag | cancel-event | set-monitor-connection",
          "requirement": "Required",
          "description": "Closed operation vocabulary; each kind has its own required operands as defined in this section."
        },
        {
          "path": "events.conditions[]",
          "type": "{ id: ID, all: Predicate[] }",
          "requirement": "Required; may be empty",
          "description": "All predicates must be true; empty all is explicitly true. No recursive or executable expression text."
        },
        {
          "path": "events.conditions[].all[]",
          "type": "{ targetId: Variable ID | Flag ID, operator: eq | ne | lt | lte | gt | gte, value: number | boolean }",
          "requirement": "Required within a condition",
          "description": "Operand types must match the target. Boolean flags support only eq/ne; numeric comparisons use the variable's declared unit."
        },
        {
          "path": "events.effects[].id",
          "type": "ID",
          "requirement": "Required",
          "description": "Identity used by ordered effect references."
        },
        {
          "path": "events.effects[].targetId",
          "type": "ID",
          "requirement": "Required",
          "description": "set-variable/trend-variable target a variable; set-flag targets a flag; reveal targets a history entry, observation, or result; cancel-event targets a schedule; set-monitor-connection targets a patient."
        },
        {
          "path": "events.effects[].value",
          "type": "number | boolean",
          "requirement": "Required for variable/flag/monitor-connection effects; prohibited for reveal/cancel",
          "description": "Absolute replacement or trend target, never an implicit increment. Numeric variable effects require a matching unit field."
        },
        {
          "path": "events.effects[].unit",
          "type": "string",
          "requirement": "Required for numeric set-variable/trend-variable effects; prohibited for set-flag, reveal, cancel-event, and set-monitor-connection",
          "description": "Unit for a numeric variable target. It must match the target variable's declared unit; the format does not infer conversions."
        },
        {
          "path": "dependencies[]",
          "type": "{ id: ID, scenarioId: ID, revision: positive integer, sha256: string }",
          "requirement": "Optional; default []",
          "description": "Pinned library content; digest is 64 lowercase hex characters. Floating latest dependencies are prohibited."
        },
        {
          "path": "composition.overrides[]",
          "type": "{ targetId: ID, path: JSON Pointer, value: JSON value }",
          "requirement": "Optional; default []",
          "description": "Explicit overrides against a resolved dependency. Paths must exist; object/array values replace in full. No inferred deep merge."
        }
      ],
      "rules": [
        "Evaluate conditions against a frozen snapshot per operation. Unknown targets, wrong types, and unsupported operators invalidate the document. There is no network, filesystem, random, or arbitrary function execution.",
        "Each effect kind has a closed operand shape: set-variable and trend-variable target numeric variables and require value/unit; set-flag targets a flag and requires boolean value; reveal and cancel-event prohibit value and unit; set-monitor-connection requires a Patient ID target, channel, and boolean value, and prohibits unit, durationSeconds, and interpolation. Consumers reject kind-specific fields that do not match the declared kind.",
        "Effect ID arrays and action outcomes are ordered collections wherever this specification says operations or outcomes are ordered. Preserve their declared order; do not sort or deduplicate them during import or export.",
        "Resolve dependencies topologically, reject cycles, verify bytes against pinned digests, then apply overrides in declared order. Duplicate writes to the same target/path are errors; do not silently choose a winner.",
        "Exports for execution contain a fully resolved snapshot plus dependency provenance. Copy-versus-link is therefore settled at package creation; future library updates do not mutate an already exported scenario."
      ],
      "example": {
        "events": {
          "conditions": [
            {
              "id": "condition-owner-agreed",
              "all": [
                {
                  "targetId": "flag-owner-agreed",
                  "operator": "eq",
                  "value": true
                }
              ]
            }
          ],
          "effects": [
            {
              "id": "effect-owner-agreed",
              "kind": "set-flag",
              "targetId": "flag-owner-agreed",
              "value": true
            },
            {
              "id": "effect-reveal-history",
              "kind": "reveal",
              "targetId": "history-summary"
            }
          ]
        }
      }
    },
    {
      "topic": "outputs",
      "change": "Define a portable package and enforce role-specific information release in generated outputs.",
      "fields": [
        {
          "path": "package.manifest",
          "type": "{ documentPath: string, assetIds: Asset ID[], digest: string }",
          "requirement": "Required",
          "description": "Archive manifest points to scenario.json and its asset manifest. Digest is SHA-256 of the exact UTF-8 scenario.json bytes, not a claim of clinical correctness or semantic content identity."
        },
        {
          "path": "outputs.views[]",
          "type": "{ id: ID, audience: learner | facilitator, kind: brief | guide | event-map | checklist, includeIds: ID[] }",
          "requirement": "Optional; default []",
          "description": "Explicit content selection filtered by audience. Learner views exclude facilitator-only content even when named in includeIds."
        }
      ],
      "rules": [
        "A portable archive contains scenario.json, manifest.json, and assets/. Reject duplicate entry names and path traversal before extraction. Package mechanics remain distinct from content revision identity.",
        "Digest verification covers exactly the packaged UTF-8 bytes of scenario.json and is a package-integrity check. It must not be reused as semantic content identity.",
        "Static learner briefs include only initial learner-visible content. Run-time views additionally require satisfied disclosure and result availability. Hidden content must not be sent to the learner browser or embedded in its downloadable source.",
        "Actual learner identity, scores, cue delivery records, session dates, and event history stay outside scenario content. Outputs identify scenarioId and revision so the delivered view can be traced."
      ],
      "example": {
        "outputs": {
          "views": [
            {
              "id": "view-learner",
              "audience": "learner",
              "kind": "brief",
              "includeIds": [
                "history-opening"
              ]
            },
            {
              "id": "view-facilitator",
              "audience": "facilitator",
              "kind": "guide",
              "includeIds": [
                "state-clarifying",
                "objective-ownership"
              ]
            }
          ]
        }
      }
    }
  ]
}
