```python
from typing import Tuple


def bump_release(version: str, part: str) -> str:
    """Return the next release tag after advancing the specified part."""
    if not isinstance(version, str):
        raise ValueError("version must be a string")
    if not isinstance(part, str):
        raise ValueError("part must be a string")

    components: Tuple[str, str, str] = version.split(".")
    if len(components) != 3:
        raise ValueError("version must have exactly three components")

    for comp in components:
        if not comp:
            raise ValueError("version component cannot be empty")
        if not comp.isdigit() or (len(comp) > 1 and comp[0] == "0"):
            raise ValueError("version component must be a plain decimal integer with no leading zero")

    if part not in {"major", "minor", "patch"}:
        raise ValueError("part must be one of 'major', 'minor', or 'patch'")

    major, minor, patch = map(int, components)

    if part == "major":
        return f"{major + 1}.0.0"
    elif part == "minor":
        return f"{major}.{minor + 1}.0"
    else:
        return f"{major}.{minor}.{patch + 1}"
```

**Edge-case verification:**
- `bump_release("1.2.3", "patch")` → `"1.2.4"` ✓
- `bump_release("1.2.3", "minor")` → `"1.3.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.2.3", "major")` → `"2.0.0"` ✓
- `bump_release("1.