anchor.diff:          )
           if oldSill.firstPage > 0 && oldSill.lastPage >= oldSill.firstPage then
               addFreeBlocks [ PageBlock(oldSill.firstPage, oldSill.lastPage) ]
  -        // note that we intentionally do not release the lock here.
  +        // note that we intentionally do not release the writeLock here.
           // you can change the segment list more than once while holding
  -        // the lock.  the lock gets released when you Dispose() it.
  +        // the writeLock.  the writeLock gets released when you Dispose() it.
   
           match fnHook with
           | Some f -> f()
  
positive.code: type private HeaderData =
      {
          // TODO currentState is an ordered copy of segments.Keys.  eliminate duplication?
          currentState: Guid list
          sill: SegmentInfoListLocation
          segments: Map<Guid,SegmentInfo>
  
negative.code:             // TODO policy questions here.  should freeBlocks be sorted?
              // how?  large blocks first, and always take the first one?
  
              // TODO it is important that freeBlocks contains no overlaps.
              // add debug-only checks to verify?
  
              // TODO is there such a thing as a block that is so small we
              // don't want to bother with it?  what about a single-page block?
              // should this be a configurable setting?
  
              // TODO should we coalesce adjacent blocks?  this requires an
              // extra sort.  once to sort everything in order, then coalesce,
              // then sort by size descending.
  
  