```python
def clause_order(a: str, b: str) -> int:
    def parse_mark(mark: str) -> tuple:
        if not isinstance(mark, str) or not mark:
            raise ValueError("Mark must be a non-empty string.")
        
        parts = mark.split('.')
        if len(parts) > 1:
            for part in parts:
                if not part.isdigit() or (part.startswith('0') and len(part) > 1):
                    raise ValueError("Mark contains invalid characters or leading zeros.")
        
        return tuple(int(part) for part in parts)

    try:
        a_parts, b_parts = parse_mark(a), parse_mark(b)
    except ValueError as e:
        raise ValueError(f"Invalid mark: {e}")

    min_length = min(len(a_parts), len(b_parts))
    for i in range(min_length):
        if a_parts[i] < b_parts[i]:
            return -1
        elif a_parts[i] > b_parts[i]:
            return 1

    if len(a_parts) < len(b_parts):
        return -1
    elif len(a_parts) > len(b_parts):
        return 1

    return 0
```