```python
from typing import List


def best_harvest(yields: List[int]) -> int:
    """Return the maximum total yield by selecting non-consecutive days."""
    if not isinstance(yields, list):
        raise ValueError("Input must be a list.")
    for i, y in enumerate(yields):
        if not isinstance(y, int):
            raise ValueError(f"Element at index {i} is not an integer.")
        if y < 0:
            raise ValueError(f"Element at index {i} is negative.")

    if not yields:
        return 0

    n = len(yields)
    if n == 1:
        return yields[0]

    # dp[i] = max harvest from first i+1 days (0-indexed, inclusive)
    dp = [0] * n
    dp[0] = yields[0]
    dp[1] = max(yields[0], yields[1])

    for i in range(2, n):
        dp[i] = max(dp[i - 1], dp[i - 2] + yields[i])

    return dp[-1]
```

**Verification against edge cases:**

| Input | Expected | Result |
|-------|----------|--------|
| `[]` | 0 | 0 ✓ |
| `[5]` | 5 | 5 ✓ |
| `[5, 1, 1, 5]` | 10 | 10 ✓ |
| `[1, 2, 3, 4, 5]` | 9 (1+3+5) | 9 ✓ |
| `[10, 10, 10]` | 20 (0+2) | 20 ✓ |
| `[0, 0, 0]` | 0 | 0 ✓ |
| `[5, 1, 5]` | 10 | 10 ✓ |

**Greedy failure case:** `[5, 1, 1, 5]` — greedy day-by-day would pick day 0 (5), skip day 1, pick day 2 (1), skip day 3, yielding 6. The DP correctly picks days 0 and 3 for 10.