```python
def new_cache(limit: int) -> dict:
    """Create a new recency cache with the given limit."""
    if not isinstance(limit, int) or limit <= 0:
        raise ValueError("Limit must be a positive integer.")
    return {
        "limit": limit,
        "keys": [],
        "store": {}
    }

def cache_write(cache: dict, key: str, value: int) -> list:
    """Write a value under a key in the cache."""
    if not isinstance(key, str) or not key:
        raise ValueError("Key must be a non-empty string.")
    
    if key in cache["store"]:
        # Replace the existing value and move to most recently touched
        cache["store"][key] = value
        cache["keys"].remove(key)
        cache["keys"].append(key)
    else:
        # Add the new key to most recently touched
        cache["store"][key] = value
        cache["keys"].append(key)
        
        # If the cache exceeds the limit, drop the least recently touched key
        if len(cache["keys"]) > cache["limit"]:
            spilled_key = cache["keys"].pop(0)
            del cache["store"][spilled_key]
    
    return [spilled_key] if spilled_key else []

def cache_read(cache: dict, key: str) -> int:
    """Read a value under a key from the cache."""
    if not isinstance(key, str) or not key:
        raise ValueError("Key must be a non-empty string.")
    
    if key not in cache["store"]:
        raise KeyError("Key not found in cache.")
    
    # Move the key to most recently touched
    cache["keys"].remove(key)
    cache["keys"].append(key)
    
    return cache["store"][key]
```