```python
def mask_from_prefix(prefix: int) -> str:
    if not isinstance(prefix, int) or prefix < 0 or prefix > 32:
        raise ValueError("Prefix must be an integer from 0 to 32")
    
    mask = [255] * (prefix // 8)
    if prefix % 8:
        mask.append(256 - 2**(8 - prefix % 8))
    mask.extend([0] * ((4 - len(mask)) % 4))
    
    return '.'.join(map(str, mask))

def prefix_from_mask(mask: str) -> int:
    if not isinstance(mask, str):
        raise ValueError("Mask must be a string")
    
    octets = mask.split('.')
    if len(octets) != 4:
        raise ValueError("Mask must have exactly four dot-separated fields")
    
    if any(not field.isdigit() or (field[0] == '0' and field > '0') for field in octets):
        raise ValueError("Fields must be decimal digits with no leading zero except '0'")
    
    mask_int = 0
    for i, octet in enumerate(octets):
        octet_int = int(octet)
        if octet_int < 0 or octet_int > 255:
            raise ValueError("Octets must be between 0 and 255")
        
        if i == 0:
            mask_int = (octet_int & 0xFF) << 24
        elif i == 1:
            mask_int |= (octet_int & 0xFF) << 16
        elif i == 2:
            mask_int |= (octet_int & 0xFF) << 8
        else:
            mask_int |= octet_int & 0xFF
    
    leading_ones = bin(mask_int).count('1')
    
    # Check for broken ones
    if any(bit != '1' and mask_int >> i & 1 == 1 for i in range(32)):
        raise ValueError("Mask must be a continuous run of 1s followed by 0s")
    
    return leading_ones
```