anchor.diff:  let newManager maxDOP : actor<Manager> =
     let sw = System.Diagnostics.Stopwatch.StartNew()
     actor.Start(fun self ->
  -    let rec loop workers maxWorkers doneWorkers =
  +    let rec loop workers maxWorkers doneWorkers replyChannel =
         async {
           let! msg = self.Receive ()
           match msg with
           | Manager.Initialize (suites) ->
             //build a worker per suite/test combo and give them their work
             let workers = suites |> List.map (fun suite -> suite.Tests |> List.map (fun test -> newWorker self test)) |> List.concat |> List.rev
  -          return! loop workers workers.Length 0
  -        | Manager.Start ->
  +          return! loop workers workers.Length 0 replyChannel
  +        | Manager.Start(replyChannel) ->
             //kick off the initial X workers
             self.Post(Manager.Run maxDOP)
  -          return! loop workers maxWorkers doneWorkers
  +          return! loop workers maxWorkers doneWorkers (Some replyChannel)
           | Manager.Run(count) ->
             if count = 0 then
  -            return! loop workers maxWorkers doneWorkers
  +            return! loop workers maxWorkers doneWorkers replyChannel
             else
               match workers with
  -            | [] -> return! loop [] maxWorkers doneWorkers
  +            | [] -> return! loop [] maxWorkers doneWorkers replyChannel
               | head :: tail ->
                 head.Post(Worker.Run)
                 self.Post(Manager.Run(count - 1))
  -              return! loop tail maxWorkers doneWorkers
  +              return! loop tail maxWorkers doneWorkers replyChannel
           | Manager.WorkerDone ->
             self.Post(Manager.Run(1))
             let doneWorkers = doneWorkers + 1
             if doneWorkers = maxWorkers then
  -            reporter.Post(Reporter.RunOver(int sw.Elapsed.TotalMinutes, int sw.Elapsed.TotalSeconds))
  +            let failed = reporter.PostAndReply(fun replyChannel -> Reporter.RunOver(int sw.Elapsed.TotalMinutes, int sw.Elapsed.TotalSeconds, replyChannel))
  +            replyChannel.Value.Reply failed
               return ()
             else
  -            return! loop workers maxWorkers doneWorkers
  +            return! loop workers maxWorkers doneWorkers replyChannel
         }
  -    loop [] 0 0)
  +    loop [] 0 0 None)
   
   let run maxDOP =
     // suites list is in reverse order and have to be reversed before running the tests
     suites <- List.rev suites
     let manager = newManager maxDOP
     manager.Post(Manager.Initialize(suites))
  -  manager.Post(Manager.Start)
  +  manager.PostAndReply(fun replyChannel -> Manager.Start replyChannel)
   
   //demo
   context "Test Context"
  
positive.code:   | Todo of id:Guid
    | Pass of id:Guid
    | Fail of id:Guid * ex:Exception
    | RunOver of minutes:int * seconds:int
  
  let colorWriteReset color message =
    Console.ForegroundColor <- color
  
negative.code:     ctx.printfn "A guid %A" (ng()))
  
  let maxDOP = 30
  let failedTest = run maxDOP
  printfn "final failed count %A" failedTest
  