```python
def shift_civil_date(date: str, days: int) -> str:
    if not isinstance(days, int):
        raise ValueError("Day count must be an integer")
    
    parts = date.split('-')
    if len(parts) != 3 or not all(part.isdigit() for part in parts):
        raise ValueError("Date must be in 'YYYY-MM-DD' format")
    
    year, month, day = map(int, parts)
    if year < 1 or year > 9999 or month < 1 or month > 12:
        raise ValueError("Invalid year or month")
    
    if month == 2 and (day < 1 or day > 29):
        raise ValueError("February cannot have more than 29 days")
    elif month in {4, 6, 9, 11} and (day < 1 or day > 30):
        raise ValueError(f"{month} has only 30 days")
    elif day < 1 or day > 31:
        raise ValueError("Invalid day of the month")
    
    if abs(days) > 1_000_000:
        raise ValueError("Day count magnitude must be at most one million")
    
    months = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    
    while days < 0:
        year -= 1
        if year == 0:
            raise ValueError("Result falls before year 0001")
        months[2] = 29 if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0) else 28
        days += months[month]
        month = 12
    
    while days > 0:
        if day + days > months[month]:
            days -= (months[month] - day + 1)
            month += 1
            if month > 12:
                year += 1
                if year > 9999:
                    raise ValueError("Result falls after year 9999")
                months[2] = 29 if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0) else 28
                month = 1
            day = 1
        else:
            day += days
            break
    
    return f"{year:04d}-{month:02d}-{day:02d}"
```