anchor.diff:  
     final _replies = new StreamController<Reply>.broadcast(sync: true);
   
  +  /// Lazily initialized scope which all replies share, making them mutually
  +  /// exclusive by default.
  +  // TODO: Support non mutually exclusive replies?
  +  _CountScope _replyUses;
  +
     Speech(this._markup, this._scope, this._speaker, this._target);
   
     Reply addReply(String markup, {Scope scope: const Always()}) {
  -    var reply = new Reply(this, markup, scope);
  +    if (_replyUses == null) {
  +      // TODO parameterize max?
  +      _replyUses = new _CountScope(1);
  +    }
  +    var reply = new Reply(this, markup, _replyUses, scope);
       reply.availability.onEnter.listen((_) => _replies.add(reply));
       return reply;
     }
  
positive.code: }
  
  class UseReplyAction implements Interaction {
    final Reply _reply;
  
    UseReplyAction(this._reply);
  
    // TODO: implement moduleName
    @override
    String get moduleName => null;
  
    // TODO: implement name
    @override
    String get name => null;
  
    // TODO: implement parameters
    @override
    Map<String, dynamic> get parameters => {
          'speech': {'markup': _reply.speech._markup},
          'markup': _reply._markup
  
negative.code:   }
  
    // TODO: figure out default
    Speech add(String markup, {String speaker, String target, Scope scope}) {
      var speech = new Speech(markup, scope, speaker, target);
      speech._scope.onEnter.listen((_) => _dialog.add(speech));
      if (scope.isEntered) {
  