CaNaMED — Scenario Authoring Tool

Offline editor for content packs (CASE + SCORING + PENALTIES + DECISIONS)

← Back to the platform  ·  Write in English — that is the language learners read.

How to use this tool
  1. Fill in the form below, in English. The platform shows case content to learners in English only; the French and Japanese help is a hover dictionary that glosses the English words you write, so there is nothing to translate here.
  2. Use the Add row buttons to grow the history / exam / labs / prompts / scoring / penalties / decisions lists. Use the × on each row to remove.
  3. The Live JSON preview updates as you type. Click Validate to check ids are unique and the synthesis prerequisites resolve.
  4. Click Copy JSON snippet to copy a window.CANAMED_SCENARIOS["your-id"] = { … } block, ready to paste into case-content.js. Or Download .json for a standalone file. Load JSON round-trips an existing scenario back into the form for editing.
1. Scenario metadata

A section is one of three things. PBL workup is reveal-and-reason on a clinical case. Roleplay is a conversation with private role briefs and an observer. Branched is a clean one-decision-at-a-time fork: the team votes, locks in, sees what happens, then the case moves on. Each authors ONE section — a session is composed by picking sections on the create form, so a scenario no longer has to bundle a workup and a roleplay together.

Lowercase, hyphenated. Used as the database key; cannot collide with existing scenarios in case-content.js.

This is the name a facilitator sees for the section in the create-form picker, and the one students see on its stage. The format above decides which of these you fill in — one scenario authors one section.

Also run a branched decision case

Optional, and independent of the format above: a scenario may ALSO reference an existing branched case, which then runs as its own stage after this section. A branched module can never be inferred, so ticking it always writes an explicit modules list plus the branchedRef below.

Branch tree

Each node is one decision shown on its own. For every choice, write what happens next (the consequence) and where the case goes — pick another node under Then →, or leave it as ends the case. Add the nodes first, then wire the Then → targets. The first node nothing points to is the start. English only.

2. CASE.history — questions the team can ask the patient

Each row is a clickable button (q) revealing the patient’s answer (a). Order matters: index 0 is shown first. Indices are referenced by synthPrereqs and PENALTIES.item below as history:N.

3. CASE.exam — physical examination items

Same shape as history. Referenced as exam:N.

4. CASE.labs — investigations & clinical synthesis

Tick the key box on exactly one row — that is the gated synthesis item. Its index becomes synthId = "labs:N" below. Referenced as labs:N.

5. CASE.prompts — discussion questions revealed after synthesis
6. Synthesis gate

Auto-populated from the lab row whose key checkbox is ticked. You can override manually if needed.

The items that must be revealed before the synthesis unlocks. Each must resolve to an existing history:N, exam:N or labs:N.

7. SCORING.moduleA — concept families for stage 1

For each family pick EITHER any keyword stems (English only; comma-separated) OR tick cohorts for the “named two partner universities” family. If both are filled, cohorts wins.

8. SCORING.moduleA_questions — LLM chat consultation scoring

Points earned for good history-taking questions typed into the Module A patient chat. Same shape as moduleA families — any stems match the learner’s typed question. Leave empty if the scenario has no chat scoring.

9. SCORING.moduleA_question_penalties — chat deductions

Deductions for harmful or opioid-seeking prompts typed into the Module A patient chat (e.g. demanding a prescription on demand). Optional.

10. ROLEPLAY — the scene, the cast, the checklist and the timing

Each part below is optional, and leaving one blank is meaningful: the section keeps the shipped default for it. Fill in what makes your conversation different and leave the rest alone.

Cast

Each role gets a private brief only that person sees. Ids become DOM and database keys, so: lower-case, starting with a letter (physician, patient, observer). Reuse a default id to rename just that role; add none and the standard cast is used.

Observation framework

What the observer ticks off while watching. Pick one from the library or write your own steps — an antibiotic negotiation should not hand its observer a breaking-bad-news checklist.

Phases

The timetable, and which cards each phase shows. Add none to keep the shipped six phases. A card no phase names stays hidden throughout, so tick reflect somewhere if the team is meant to reach it.

Reference panels

The four panels behind the roleplay toolbar. Tick one to write it; leave all four unticked to keep the shipped panels. Ticking any means you control the set — the ones you leave unticked are then hidden, button and all.

11. SCORING.moduleB — concept families for stage 2
12. PENALTIES — deductions for revealing the wrong item

Each penalty fires when the team reveals the item referenced. item takes the form group:index, e.g. labs:4.

13. DECISIONS — team votes

Each decision belongs to module A or B, has a prompt, and 2+ options. Tick the correct option(s). penalty: 0 = wrong vote costs nothing (useful for low-stakes roleplays).

14. preTest — knowledge check before Module A (optional)

Multiple-choice questions shown after Welcome, before Module A. Optional — leave empty to hide the pre-test panel. Each question has a stem, 2+ options (tick the correct one[s]), and an explanation shown after answering.

15. postTest — knowledge check during Wrap-up (optional)

Same shape as the pre-test; shown during Wrap-up to measure knowledge gain. Optional.

16. characters — LLM chat roles (optional)

The Module A patient chat is driven by a character here. Add one with role: patient and write its persona (the system prompt: who they are, why they’re here, how they behave). Leave empty to fall back to a neutral patient synthesised from the case history. The server prepends an un-overridable safety guard.

Preview

Validate checks structure; Preview shows how the scenario reads. To play-test it end-to-end: use Copy JSON snippet (or Download .json), then on the platform choose Create a session → Custom scenario, paste it, and join your own session in a second browser tab.

Live JSON preview

Updated on every change. The Copy button wraps this in window.CANAMED_SCENARIOS["id"] = { … };.