anchor.diff:      await stop();
   
       var palette = _clearPalette();
  -    var version = _archive.newVersion();
  -    _narratorEvents = StreamController<Event>();
  -    _ui.play(Rx.merge([_narratorEvents.stream, palette.events]));
  -
  -    _story = Story('1', _script, palette, _stopwatch, _ui.actions, version);
  -  }
  -
  -  Future load(String save) {}
  +    var version = Version('unnamed');
  +
  +    _playToUi(palette);
  +    _story = Story(
  +        '1', _script, palette, _stopwatch, _ui.actions, () => Duration.zero);
  +    _record(palette, version);
  +  }
  +
  +  Future continueFrom(String versionName) async {
  +    await stop();
  +
  +    var version = _archive[versionName];
  +
  +    if (version == null) {
  +      throw ArgumentError.value(
  +          versionName, 'versionName', 'not found in archive');
  +    }
  +
  +    var palette = _clearPalette();
  +    var replayedActions = StreamController<Action>();
  +    var actions = Rx.concat([replayedActions.stream, _ui.actions]);
  +
  +    _playToUi(palette);
  +
  +    _story = Story('1', _script, palette, _stopwatch, actions, () {
  +      // TODO: could publish a "loading" event somewhere so UI can react to all
  +      //  the rapid-fire events accordingly
  +      var record = version.actions;
  +      var lastOffset = Duration.zero;
  +
  +      for (var recorded in record) {
  +        Future.delayed(lastOffset = recorded.offset, () {
  +          var action =
  +              palette.serializers.deserialize(recorded.action) as Action;
  +          replayedActions.add(action);
  +        });
  +      }
  +
  +      Future.delayed(lastOffset, () => replayedActions.close());
  +
  +      return lastOffset;
  +    });
  +
  +    _record(palette, version);
  +  }
   
     Future stop() async {
       if (_story == null) {
  
positive.code:   void run(Narrator n) {}
  }
  
  class PerformedAction {
    final Duration offset;
    final Action action;
  
    PerformedAction(this.offset, this.action);
  }
  
negative.code:           print('action: $offset $action');
            action.perform(_palette[action.inkType]);
  
            // TODO: should this check be here?
            if (!ff.isFastForwarding) {
              _offsetActions.add(OffsetAction(offset, action));
            }
          });
  
          _stopwatch.start();
          script(_palette);
          var lastOffset = load();
  
          ff.fastForward(lastOffset);
        });
      });
    }
  
    Stream<OffsetAction> get offsetActions => _offsetActions.stream;
  
    void pause() {
      _pausableZone.pause();
  