```python
def clause_order(a: str, b: str) -> int:
    def parse_clause_mark(mark: str) -> int:
        if not isinstance(mark, str) or not mark:
            raise ValueError("Invalid mark")
        if mark == ".":
            return 0
        if not mark.isdigit() or mark[0] == "0":
            raise ValueError("Invalid mark")
        parts = mark.split(".")
        if len(parts) > 2:
            raise ValueError("Invalid mark")
        return int(parts[0]) * 10**len(parts[1]) if len(parts) == 2 else int(parts[0])

    for a_part, b_part in zip(parse_clause_mark(a), parse_clause_mark(b)):
        if a_part < b_part:
            return -1
        elif a_part > b_part:
            return 1
    return 0
```