q.add_query Ferret::Search::TermQuery.new(:message_id, id), :should
       q.add_query Ferret::Search::TermQuery.new(:refs, id), :should
 
+      ## load_killed is true so that we can abort if any message in
+      ## the thread has the killed label.
       q = build_query :qobj => q, :load_killed => true
 
       num_queries += 1
     end
     if killed
       Redwood::log "thread for #{m.id} is killed, ignoring"
+      false
     else
       Redwood::log "ran #{num_queries} queries to build thread of #{messages.size + 1} messages for #{m.id}: #{m.subj}" if num_queries > 0
       messages.each { |mid, builder| yield mid, builder }
+      true
     end
   end
 
 
 class LabelSearchResultsMode < ThreadIndexMode
   def initialize labels
     @labels = labels
-    super [], { :labels => @labels }
+    opts = { :labels => @labels }
+    opts[:load_killed] = true if labels.include? :killed
+    opts[:load_deleted] = true if labels.include? :deleted
+    opts[:load_spam] = true if labels.include? :spam
+    super [], opts
   end
 
   def is_relevant? m; @labels.all? { |l| m.has_label? l }; end
 
 
   ## load in (at most) num number of threads from the index
   def load_n_threads num, opts={}
+    Redwood::log "xx each_id_by_date #{opts.inspect}"
     @index.each_id_by_date opts do |mid, builder|
       break if size >= num
       next if contains_id? mid
 
       m = builder.call
-      load_thread_for_message m, :load_killed => opts[:load_killed]
+      load_thread_for_message m, :load_killed => opts[:load_killed], :load_deleted => opts[:load_deleted], :load_spam => opts[:load_spam]
       yield size if block_given?
     end
   end
 
   ## loads in all messages needed to thread m
+  ## may do nothing if m's thread is killed
   def load_thread_for_message m, opts={}
-    @index.each_message_in_thread_for m, opts.merge({:limit => 100}) do |mid, builder|
+    good = @index.each_message_in_thread_for m, opts do |mid, builder|
+      Redwood::log "  > got #{mid}"
       next if contains_id? mid
       add_message builder.call
     end
+    add_message m if good
   end
 
   ## merges in a pre-loaded thread