```python
def hex_split(colour: str) -> list:
    """
    Splits a colour written as a hash followed by six hexadecimal digits into its three two-digit parts.
    
    Args:
    colour (str): The colour to split, starting with a hash and ending with six hexadecimal digits.
    
    Returns:
    list: A list containing the three two-digit parts of the colour.
    
    Raises:
    ValueError: If the input is not a valid colour format.
    """
    if not isinstance(colour, str) or not colour.startswith('#') or len(colour) != 7:
        raise ValueError("Invalid colour format. Must start with '#' and have exactly six hexadecimal digits.")
    
    return [colour[i:i+2] for i in range(1, 7, 2)]

def hex_join(parts: list) -> str:
    """
    Joins three two-digit parts into a colour written as a hash followed by six hexadecimal digits.
    
    Args:
    parts (list): A list containing three two-digit parts of the colour.
    
    Returns:
    str: The colour in the form of a hash followed by six hexadecimal digits.
    
    Raises:
    ValueError: If the input list does not contain exactly three elements.
    """
    if not isinstance(parts, list) or len(parts) != 3:
        raise ValueError("Input list must contain exactly three elements.")
    
    return '#' + ''.join(parts)
```