# CyberSim Scenario Format v1.0 — Specification & Author Guide
## 1. Overview
The **CyberSim Scenario Format v1.0** is a declarative, portable, JSON-based format for authoring simulation scenarios in CyberSim OS. It enables scenario designers to construct complete cybersecurity training experiences without writing or modifying CyberSim OS code.
A scenario package defines:
- **Simulation identity & metadata** (title, description, duration, learner profile, target score)
- **Workplace context** (people, organizations, domains, department hierarchies)
- **Simulated objects** (emails, web pages, intranet sites, forms, documents, spreadsheets, files)
- **Scheduled & reactive events** (timed triggers, action-driven consequences, delays, repetitions)
- **Behavior vocabulary & actions** (app launches, notifications, alert generation, inbox deliveries)
- **Multi-axis behavioral evaluation** (scoring rules, pedagogical findings, after-action feedback)
---
## 2. Package Structure
A scenario is stored within a self-contained directory:
```
scenarios/my-scenario/
├── scenario.json # Main manifest & scenario definition (required)
├── assets/ # Local attachments & assets (optional)
└── README.md # Scenario author notes & changelog (optional)
```
For large scenarios, sub-collections can optionally be split across multiple files using `$ref:` references:
```json
{
"formatVersion": "1.0",
"id": "enterprise-phish-triage",
"people": "$ref:people.json",
"messages": "$ref:messages.json"
}
```
*Note: All referenced files must reside within the scenario directory tree. Paths with `..`, absolute paths, and external URL schemes are rejected by the loader.*
---
## 3. Top-Level Manifest Reference
| Property | Type | Required | Description |
|---|---|---|---|
| `formatVersion` | `string` | **Yes** | Must be `"1.0"`. |
| `id` | `string` | **Yes** | Unique identifier (lowercase alphanumeric and hyphens). |
| `version` | `string` | **Yes** | Semantic version of the scenario (e.g. `"1.0.0"`). |
| `title` | `string` | **Yes** | Human-readable title displayed in the launcher and AAR. |
| `description` | `string` | **Yes** | Overview of the simulation setting and primary challenges. |
| `durationSeconds`| `number` | **Yes** | Expected run time in seconds (e.g. `900`). |
| `mode` | `string` | **Yes** | Instruction mode: `"guided"`, `"practice"`, or `"assessment"`. |
| `entryEvent` | `string` | **Yes** | ID of the event executed at scenario start. |
| `passingScore` | `number` | **Yes** | Minimum score required to pass and earn a certificate (0–100). |
| `supportedLocales` | `array` | No | List of supported language codes (e.g. `["en", "es"]`). |
| `login` | `object` | No | Network login metadata: `{ networkName, networkDescription, networkIcon }`. |
| `engine` | `object` | No | Minimum engine version requirements (`{ "minimumVersion": "0.2.0" }`). |
| `learner` | `object` | No | Initial persona: `{ name, role, email, department }`. |
| `organizations` | `array` | No | List of simulated organizations & trusted domain lists. |
| `people` | `array` | No | Simulated personas and contact directory. |
| `objectives` | `array` | No | Visible shift objectives shown in Start Menu and UI. |
| `messages` | `array` | No | Simulated email messages (Inlook). |
| `pages` | `array` | No | Simulated web pages and browser targets (Navigator). |
| `files` | `array` | No | Virtual filesystem items (Documents, Downloads, Shared). |
| `notifications`| `array` | No | Pre-configured desktop toast notification templates. |
| `alerts` | `array` | No | Security Center alert definitions. |
| `events` | `array` | **Yes** | Declarative triggers and action lists. |
| `scoring` | `object` | **Yes** | Category declarations and rule definitions. |
| `findings` | `array` | No | Predefined pedagogical findings and deductions. |
| `feedback` | `array` | No | Performance-conditional after-action remarks. |
| `completion` | `object` | No | Finalization criteria and certificate issuance rules. |
---
## 4. Object Types
### 4.1 Organizations (`organizations[]`)
Defines trusted enterprise domains and third-party corporate entities.
```json
{
"id": "nexacore",
"name": "NexaCore Technologies",
"domains": ["nexacore.internal"],
"departments": ["Finance", "Information Security", "IT Helpdesk"],
"securityContacts": ["alex.rivera@nexacore.internal"]
}
```
### 4.2 People (`people[]`)
Defines characters and email identities.
```json
{
"id": "alex-rivera",
"name": "Alex Rivera",
"role": "Chief Information Security Officer",
"email": "alex.rivera@nexacore.internal",
"organization": "nexacore",
"department": "Information Security"
}
```
### 4.3 Messages (`messages[]`)
Defines email communications in Inlook.
```json
{
"id": "email_phish_pwreset",
"sender": "NexaCore IT Helpdesk",
"rfcSender": "support@nexac0re-portal.com",
"recipient": "jordan.taylor@nexacore.internal",
"subject": "URGENT: Password Verification Required",
"date": "09:05 AM",
"folder": "pending",
"unread": true,
"body": "Please confirm credentials at: https://intranet.nexacore.internal/sso",
"links": [
{
"displayText": "https://intranet.nexacore.internal/sso",
"actualUrl": "http://login-nexac0re-portal.com/auth/login"
}
],
"attachments": []
}
```
### 4.4 Pages (`pages[]`)
Defines intranet and external web destinations in Navigator. Form submissions are bound declaratively by ID.
```json
{
"url": "http://login-nexac0re-portal.com/auth/login",
"title": "NexaCore Identity SSO",
"isSecure": false,
"isPhishing": true,
"content": "
",
"forms": [
{
"id": "phish-login-form",
"onSubmit": {
"emitEvent": "NAV_FORM_SUBMITTED",
"target": "phish_login_form",
"response": {
"type": "pageContent",
"content": "Account Verification Complete
"
}
}
}
]
}
```
### 4.5 Files (`files[]`)
Virtual files accessible in the Files app and DocViewer.
```json
{
"id": "file_budget",
"name": "Q3_Budget_Forecast.xlsx",
"type": "spreadsheet",
"folder": "Documents",
"size": "48 KB",
"date": "2026-08-20",
"content": {
"title": "Q3 Budget Forecast",
"headers": ["Category", "Q1", "Q2", "Q3"],
"rows": [["Infrastructure", "$142k", "$155k", "$168k"]]
}
}
```
---
## 5. Event System & Behavior Vocabulary
Events are evaluated deterministically on each engine cycle.
```json
{
"id": "deliver-phish-email",
"when": { "elapsedSeconds": 30 },
"actions": [
{ "type": "mail.deliver", "message": "email_phish_pwreset" },
{ "type": "desktop.notify", "title": "Inlook Mail", "body": "New message received.", "type": "info" }
]
}
```
### 5.1 Condition Triggers (`when`)
- `{ "scenarioStart": true }` — Triggers on the initial simulation tick.
- `{ "elapsedSeconds": 45 }` — Triggers when `simSeconds >= 45`.
- `{ "actionOccurred": { "type": "EMAIL_OPENED", "target": "email_phish" } }` — Triggers on user action.
- `{ "stateEquals": { "object": "inlook", "key": "selected", "value": "email_1" } }` — Triggers on state match.
- `{ "all": [ condition1, condition2 ] }` — Logical AND.
- `{ "any": [ condition1, condition2 ] }` — Logical OR.
- `{ "not": condition }` — Logical NOT.
### 5.2 Behavior Vocabulary (Action Whitelist)
#### Desktop Actions
- `desktop.notify` — Toast alert (`{ title, body, type, timeout, icon }` or `{ notification: "notif_id" }`).
- `desktop.openApp` — Launch app (`{ app: "inlook" | "navigator" | "files" | "security_center" | "docviewer" }`).
- `desktop.focusApp` — Bring window to focus.
- `desktop.setBadge` — Update taskbar/tab badge counter.
- `desktop.endScenario` — Complete the session and launch AAR.
#### Mail Actions
- `mail.deliver` — Deliver message to Inlook inbox (`{ message: "msg_id" }`).
- `mail.updateMessage` — Update message attributes.
#### Navigator Actions
- `navigator.open` — Open browser to specified URL (`{ url: "http://..." }`).
- `navigator.redirect` — Redirect current browser tab.
#### Files Actions
- `files.create` — Dynamically inject file into virtual filesystem.
- `files.open` — Open document in DocViewer (`{ fileId: "file_id" }`).
#### Security Center Actions
- `security.addAlert` — Add security notification item (`{ alert: "alert_id" }` or inline object).
- `security.updateStatus` — Change dashboard threat state.
#### Evaluation Actions
- `evaluation.addFinding` — Record a pedagogical finding (`{ finding: "finding_id" }`).
- `evaluation.setState` — Set custom runtime state variable.
- `evaluation.completeObjective` — Mark a shift task completed (`{ objective: "obj_id" }`).
- `evaluation.awardPoints` — Adjust category points (`{ category: "cat_id", points: 10 }`).
---
## 6. Scoring & Findings Pipeline
Scoring is computed at the end of the shift or on-demand:
```json
{
"scoring": {
"categories": [
{ "id": "threat-detection", "label": "Threat Detection", "maxPoints": 20, "startingPoints": 0 },
{ "id": "safe-handling", "label": "Safe Handling", "maxPoints": 15, "startingPoints": 15 }
],
"rules": [
{
"id": "opened-phish-email",
"condition": { "actionOccurred": { "type": "EMAIL_OPENED", "target": "email_phish_pwreset" } },
"award": { "category": "threat-detection", "points": 10 },
"timeline": { "type": "positive", "text": "Identified and reviewed the password reset notice." }
},
{
"id": "submitted-phish-credentials",
"condition": { "actionOccurred": { "type": "NAV_FORM_SUBMITTED", "target": "phish_login_form" } },
"award": { "category": "safe-handling", "points": -10 },
"timeline": { "type": "critical", "text": "Entered password on untrusted external portal." },
"feedback": "CRITICAL: Never enter credentials into untrusted external sites."
}
]
}
}
```
---
## 7. Cryptographic Fingerprinting & Certificates
When a scenario is loaded, the engine computes a canonical SHA-256 hash across all evaluation-relevant elements (messages, pages, files, events, scoring rules, findings).
Upon completion with a passing score (`totalScore >= passingScore`), the learner may claim an exportable `*.cybercert` JSON record. The certificate embeds the scenario fingerprint and an integrity hash that can be verified offline via `verify.html`.
---
## 8. Authoring Diagnostics & Development Mode
To inspect and test scenarios during development, add `?dev=true` to the URL:
```
http://127.0.0.1:8080?scenario=scenarios/my-scenario/scenario.json&dev=true
```
The diagnostics overlay provides:
- Live structural & semantic validation errors
- Event trigger states and scheduled timers
- Current category score breakdowns and recorded findings
- Scenario SHA-256 fingerprint calculations
---
## 9. Scenario Localization & Personalization
### 9.1 Declaring Supported Locales & Login Presentation
Scenarios declare their supported language codes in `scenario.json`:
```json
{
"formatVersion": "1.0",
"id": "my-scenario",
"supportedLocales": ["en", "es"],
"login": {
"networkName": "ACME Corporate Network",
"networkDescription": "Simulated Corporate Workplace",
"networkIcon": "corporate"
}
}
```
### 9.2 Providing Scenario Translations (`locales/.json`)
Translations for scenario-specific content are stored within the scenario package under `locales/`:
```
scenarios/my-scenario/
├── scenario.json
└── locales/
├── en.json
└── es.json
```
The translation catalog can override text properties across messages, pages, files, notifications, alerts, findings, and feedback:
```json
{
"title": "Turno Operativo y Concientización",
"messages": {
"email_welcome": {
"sender": "Morgan Chen (Vicepresidente)",
"subject": "Bienvenido al equipo",
"body": "Hola {{learner.firstName}},\n\n¡Bienvenido!"
}
}
}
```
### 9.3 Learner Personalization Variables
The following template variables are available for dynamic interpolation across messages, documents, web pages, notifications, and feedback:
- `{{learner.firstName}}`: Learner's validated first name entered at login (HTML-escaped).
- `{{learner.name}}`: Learner's full name.
- `{{learner.email}}`: Learner's assigned workplace email address.
- `{{learner.role}}`: Learner's assigned workplace job title.
- `{{company.name}}`: Primary enterprise organization name.