## TL;DR

The `default` in your `variable` block does not satisfy the `type` you declared. Terraform checks this at validate time, before any plan. Change the default to a value of the declared type (or loosen the type), then `terraform validate`.

## The error

```text
Error: Invalid default value for variable

  on variables.tf line 5, in variable "tags":
   5:   default = "none"

This default value is not compatible with the variable's type constraint:
map of string required.
```

## Steps to fix

1. Open the variable block the error names. Read the `type` line and the `default` line together.
   - Expected: you see the mismatch (string default vs `map(string)` type).
2. Decide which side is wrong. If callers pass maps, fix the default: `default = {}`. If the variable really is a string, fix the type: `type = string`.
   - Expected: default is a valid value of the declared type.
3. Run `terraform validate`.
   - Expected: `Success! The configuration is valid.`

## When to use this

- `terraform validate` fails with `Invalid default value for variable` right after you added or edited a variable's type or default.

## When NOT to use this

- `Invalid value for variable` (without "default") means a *caller-supplied* value failed validation, not the default. `Invalid function argument` is a function call problem.

## Compatibility

- Terraform 0.12+ type system; the check runs in `validate`, `plan`, and `apply` across all 1.x versions.

## Root cause

Variable defaults are validated against the type constraint when the configuration loads, independent of any input. A default that cannot convert to the declared type is a configuration bug, so Terraform fails fast instead of waiting for someone to omit the variable.

## Edge cases

- `default = null` is allowed for any type unless `nullable = false` is set.
- An empty tuple `[]` is not a valid `map(string)`; use `{}`.
- `any` as the type skips this check entirely, but you lose validation for caller-supplied values too.