```python
from typing import *
from collections import *

def trace_relay(links: dict, start: str) -> list:
    """
    Trace the relay of night watches in a harbour's posts.

    Args:
        links (dict): A mapping where keys are post names and values are the next post name.
        start (str): The starting post from which to begin tracing.

    Returns:
        list: A list of post names visited, in order, starting with start.

    Raises:
        ValueError: If the links argument is not a dictionary, if start is not a valid key,
                   if any handoff does not exist in links, or if the watch comes back to a visited post.
    """
    if not isinstance(links, dict):
        raise ValueError("links must be a dictionary")
    
    if start not in links:
        raise ValueError(f"start '{start}' is not a valid post name")

    visited = set()
    path = [start]

    current_post = start
    while True:
        next_post = links.get(current_post)
        if next_post is None or next_post == "":
            if current_post in visited:
                raise ValueError("the watch comes back to a visited post")
            break

        if next_post in visited:
            raise ValueError(f"an unknown post is reached: {next_post}")

        visited.add(current_post)
        path.append(next_post)
        current_post = next_post

    return path
```