anchor.diff:  }
   
   class DialogUi {
  -  final Dialogs _dialogs;
  +  final Dialog _dialogs;
     final Sink<Interaction> _interactions;
   
     DialogUi(this._dialogs, this._interactions);
   
  -  Stream<UiDialog> get onAdd =>
  -      _dialogs._onAddDialog.map((d) => new UiDialog(d, _interactions));
  +  Stream<UiSpeech> get onAdd =>
  +      _dialogs._onAddDialog.map((d) => new UiSpeech(d, _interactions));
   }
   
  -class UiDialog {
  -  final Dialog _dialog;
  +class UiSpeech {
  +  final Speech _dialog;
     final Sink<Interaction> _interactions;
   
  -  UiDialog(this._dialog, this._interactions);
  +  UiSpeech(this._dialog, this._interactions);
   
  -  Stream<UiDialog> get onRemove => _dialog._onRemove.map((_) => this);
  +  Stream<UiSpeech> get onRemove => _dialog._onRemove.map((_) => this);
     Stream<UiReply> get onReplyAvailable =>
         _dialog._onReplyAvailable.map((r) => new UiReply(r, _interactions));
   }
  
positive.code: 
  import 'package:august/august.dart';
  
  class Dialogs {
    final _dialogs = new StreamController<Dialog>.broadcast(sync: true);
  
    // TODO: figure out defaults
    Dialog narrate(String markup, {Scope scope}) {
      var narration = new Dialog(markup, scope, '', '');
      narration._scope.onEnter.listen((_) => _dialogs.add(narration));
      return narration;
    }
  
    // TODO: figure out default
    Dialog add(String markup,
        {String speaker: '', String target: '', Scope scope}) {
      var dialog = new Dialog(markup, scope, speaker, target);
      dialog._scope.onEnter.listen((_) => _dialogs.add(dialog));
      return dialog;
    }
  
    Voice voice({String name: ''}) => new Voice(name, this);
  
    Stream<Dialog> get _onAddDialog => _dialogs.stream;
  }
  
  class Voice {
    String name;
  
    final Dialogs _dialogs;
  
    Voice(this.name, this._dialogs);
  
    Dialog say(String markup, {String target, Scope scope}) =>
        _dialogs.add(markup, speaker: name, target: target, scope: scope);
  }
  
  class Dialog {
    final String _markup;
    final Scope _scope;
    final String _speaker;
  
negative.code: 
    final _replies = new StreamController<Reply>.broadcast(sync: true);
  
    Speech(this._markup, this._scope, this._speaker, this._target);
  
    Reply addReply(String markup, {Scope scope: const Always()}) {
      var reply = new Reply(this, markup, scope);
  