```ts
export function tileRenders(requests: [number, string][], freshFor: number, size: number): [number, string][] {
  if (!Number.isInteger(freshFor) || freshFor <= 0) {
    throw new Error('freshFor must be a positive whole number');
  }
  if (!Number.isInteger(size) || size <= 0) {
    throw new Error('size must be a positive whole number');
  }

  const cache: { [tile: string]: [number, string] } = {};
  const renders: [number, string][] = [];

  for (const [tick, tile] of requests) {
    if (cache[tile] && tick >= cache[tile][0] && tick < cache[tile][0] + freshFor) {
      renders.push([tick, tile]);
    } else {
      while (Object.keys(cache).length >= size) {
        const oldestTile = Object.keys(cache).sort((a, b) => {
          if (cache[a][0] === cache[b][0]) {
            return a.localeCompare(b);
          }
          return cache[a][0] - cache[b][0];
        })[0];
        delete cache[oldestTile];
      }
      cache[tile] = [tick, tile];
      renders.push([tick, tile]);
    }
  }

  return renders;
}
```