docs: public Vec close(Futures fs) {
      // Compute #chunks
      int nchunk = _espc.length;
      DKV.remove(chunkKey(nchunk),fs); // remove potential trailing key
      while( nchunk > 0 && _espc[nchunk-1] == 0 ) {
        nchunk--;
        DKV.remove(chunkKey(nchunk),fs); // remove potential trailing key
      }
      boolean hasNumber = false, hasEnum = false, hasTime=false, hasUUID=false;
      for( int i = 0; i < nchunk; ++i ) {
        if( (_chunkTypes[i] & TIME  ) != 0 ) { hasNumber = true; hasTime=true; }
        if( (_chunkTypes[i] & NUMBER) != 0 )   hasNumber = true;
        if( (_chunkTypes[i] & ENUM  ) != 0 )   hasEnum   = true;
        if( (_chunkTypes[i] & UUID  ) != 0 )   hasUUID   = true;
      }
      // number wins, we need to go through the enum chunks and declare them all
      // NAs (chunk is considered enum iff it has only enums + possibly some nas)
      if( hasNumber && hasEnum ) {
        for(int i = 0; i < nchunk; ++i)
          if(_chunkTypes[i] == ENUM)
            DKV.put(chunkKey(i), new C0DChunk(Double.NaN, (int)_espc[i]),fs);
      }
      // UUID wins over enum & number
      if( hasUUID && (hasEnum || hasNumber) ) {
        hasEnum=hasNumber=false;
        for(int i = 0; i < nchunk; ++i)
          if((_chunkTypes[i] & UUID)==0)
            DKV.put(chunkKey(i), new C0DChunk(Double.NaN, (int)_espc[i]),fs);
      }
  
      // Make sure time is consistent
      int t = -1;
      if( hasTime ) {
        // Find common time parse, and all zeros - or inconsistent time parse
        for( int i=0; i<_timCnt.length; i++ )
          if( _timCnt[i] != 0 )
            if( t== -1 ) t=i;     // common time parse
            else t = -2;          // inconsistent parse
        if( t < 0 )               // blow off time parse
          for(int i = 0; i < nchunk; ++i)
            if(_chunkTypes[i] == TIME)
              DKV.put(chunkKey(i), new C0DChunk(Double.NaN, (int)_espc[i]),fs);
  
      }
      assert t<0 || _domain == null;
  
      // Compute elems-per-chunk.
      // Roll-up elem counts, so espc[i] is the starting element# of chunk i.
      long espc[] = new long[nchunk+1]; // Shorter array
      long x=0;                   // Total row count so far
      for( int i=0; i<nchunk; i++ ) {
        espc[i] = x;              // Start elem# for chunk i
        x += _espc[i];            // Raise total elem count
      }
      espc[nchunk]=x;             // Total element count in last
      // Replacement plain Vec for AppendableVec.
      Vec vec = new Vec(_key, espc, _domain, hasUUID, (byte)t);
      DKV.put(_key,vec,fs);       // Inject the header
      return vec;
    }