anchor.diff:    var dragonStandoff = await scenes.reentrant().enter();
     var sword = Sword();
   
  -  dialog.narrate('Something appears in the shadows...');
  +  dialog.narrate('A dragon stands before you!');
   
     await delay(seconds: 1);
   
  -  var attack = options.oneTime('Engage your curiosity and wait');
  -  var runAway = options.limitedUse('Run away', exclusiveWith: attack.uses);
  +  var attack = options.oneTime('Attack it!');
  +  var runAway = options.limitedUse('Run away!', exclusiveWith: attack.uses);
   
     attack.onUse.when(() {
       attackDragon(dragonStandoff, sword);
  
positive.code: void attackDragon(Scene dragonStandoff, Sword sword) async {
    await scenes.oneTime().enter();
  
    var beast = dialog.voice(name: '(mysterious beast)');
  
    dialog.narrate('It moves closer. By its size, it appears close, '
        'but you hear its purr, far away.');
  
    beast.say('Prrrrrr....');
  
    await delay(seconds: 6);
  
    dialog.narrate("You don't just hear the purr. A second later, you feel the "
        'walls shake at the rhythm of its rattle.');
  
    await delay(seconds: 6);
  
    dialog.narrate("Closer still. And louder. It's clearly massive now.");
  
    await delay(seconds: 6);
  
    dialog.narrate("A red and orange glow rises to the front of it: it's mouth. "
        'Illuminated from below, you see large, snake-like eyes narrow at you. '
        'It snorts a flame. You feel a rush of warm air towards you. A warning.');
  
    await delay(seconds: 10);
  
    dialog.add('(whispering to yourself) Are those whiskers?');
  
    await delay(seconds: 4);
  
    dialog.narrate("It's head rises. It's eyes do not leave you. "
        'As it does this, you feel the air behind you push you towards the '
        "creature. It's inhaling.");
  
    await delay(seconds: 10);
  
    dialog.narrate('The same glow begins rising again. Its eyes fill up with '
        'madness and delight and fire. Flame spews out with explosive force, as '
        'if its mouth were a door to a burning building, blast open.');
  
    var deflectWithSword = options.oneTime('Deflect the fire with your sword.');
    var deflectWithShield = options.oneTime('Deflect the fire with your shield.');
    var dash = options.oneTime('Dash toward the creature.');
  
    delay(seconds: 10).then((_) {
  
    });
  
    deflectWithSword.onUse.when(() async {
      dialog.narrate('You survive, but your sword has melted!',
  
negative.code:   // Need a persistence strategy
    var persistence = NoPersistence();
  
    var modules = {Options: options, Dialog: dialog};
    var events = Rx.merge([options.events, dialog.events]).asBroadcastStream();
  
    // Present the user interface(s) with HTML
    SimpleHtmlUi.install(querySelector('#example'), events)
        .actions
        .listen((action) {
      // TODO: intercept and save actions for replay
      action.run(modules[action.module]);
    });
  
    // TODO run so saved actions are replayed
  