```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: [number, string][] = [];
    const renders: [number, string][] = [];

    for (const [tick, tile] of requests) {
        if (renders.some(r => r[0] >= tick && r[1] === tile)) {
            continue; // tile is still fresh
        }

        while (cache.length >= size) {
            const oldest = cache.shift();
            if (!oldest) break;
        }

        cache.push([tick, tile]);
        renders.push([tick, tile]);
    }

    return renders;
}
```