Hm, arbitrary buffer depth... can we avoid a buffered chan by using a "currently processing" sentinel? E.g.

```
var processing chan bool
for { select {
    case <-processing: // when processing is nil, this case never fires
        processing = nil // processing complete

    case <-t:
        if processing != nil {
            continue // already processing from last tick
        }
        processing = make(chan bool)
        go func(m map[keyMember]bool) {
            defer close(processing)
            // do work
        }(r.repairs) // copy current state of the map
        r.repairs = map[keyMember]bool{} // reset map

    case incoming := <-r.addRepairs:
        // now we're free to add to r.repairs
        // and addRepairs need not be buffered
} }
```