anchor.diff:    void run(Narrator n) {}
   }
   
  -class PerformedAction {
  +class OffsetAction {
     final Duration offset;
     final Action action;
   
  -  PerformedAction(this.offset, this.action);
  -}
  +  OffsetAction(this.offset, this.action);
  +}
  
positive.code:     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) {}
  
    Future stop() async {
      if (_story == null) {
  
negative.code:   }
  
    List<String> saves() {}
  
    void _playToUi(Palette palette) {
      _narratorEvents = StreamController<Event>();
      _ui.play(Rx.merge([_narratorEvents.stream, palette.events]));
    }
  
    void _record(Palette palette, Version version) {
      _story.offsetActions.listen((action) {
        var serialized = palette.serializers.serialize(action.action);
        version.record(action.offset, serialized);
        _archive.save(version);
      });
    }
  }
  
  class Story {
    final String storyId;
    final PausableZone _pausableZone;
    final Palette _palette;
    final Stopwatch _stopwatch;
    final _offsetActions = StreamController<OffsetAction>();
  
    StreamSubscription _actionsSubscription;
  
    Story(this.storyId, Script script, this._palette, this._stopwatch,
        Stream<Action> actions, Duration Function() load)
        : _pausableZone = PausableZone(() => _stopwatch.elapsed) {
      _start(script, load, actions);
    }
  
    void _start(Script script, Duration Function() load, Stream<Action> actions) {
      var fastForwarder = FastForwarder(() => _pausableZone.offset);
  
      // TODO: move this?
      _palette.events.listen(
          (event) => print('event: ${fastForwarder.currentOffset} $event'));
  
      _pausableZone.run((c) {
        fastForwarder.runFastForwardable((ff) {
  