```python
from typing import List, Dict

def run_press(jobs: List[List[str, int]], budget: int) -> Dict[str, int]:
    if not isinstance(jobs, list) or not all(isinstance(job, list) for job in jobs):
        raise ValueError("jobs must be a non-empty list of two-item lists")
    if not all(isinstance(job, list) for job in jobs):
        raise ValueError("jobs must be a non-empty list of two-item lists")
    if not all(isinstance(job[0], str) for job in jobs):
        raise ValueError("job names must be non-empty strings")
    if not all(isinstance(job[1], int) and job[1] > 0 for job in jobs):
        raise ValueError("job pages must be positive whole numbers")
    if not isinstance(budget, int) or budget < 0:
        raise ValueError("budget must be a non-negative whole number")

    printed = []
    waiting = []
    pages = 0

    for job in jobs:
        name, pages = job
        if pages <= budget:
            printed.append(name)
            budget -= pages
            pages += pages
        else:
            waiting.append(name)

    return {
        "printed": printed,
        "waiting": waiting,
        "pages": pages
    }
```