# Structure and State

Use this guide to choose repo shape, environment segmentation, and state boundaries.

## Boundary model

Define boundaries by three factors:

1. Change cadence (what changes together)
2. Blast radius (what can fail together)
3. Ownership (who approves and supports it)

If those differ, split stacks.

## Root module patterns

- `service-root`: one business service and its direct dependencies.
- `platform-root`: shared platform primitives (network, identity, observability).
- `bootstrap-root`: backend/state prerequisites and foundational security controls.

Avoid monolithic roots that mix all three.

## Environment isolation options

1. Separate root directories per environment.
2. Workspace-per-environment with strict policy and access control.
3. Separate repositories when regulatory or ownership requirements demand hard isolation.

Pick one and document why.

## State backend baseline

- remote backend only for collaborative environments
- lock protection for every apply path
- encryption at rest and in transit
- narrow IAM on state and lock stores
- versioned backup and restore test at least once
- load `references/conditional/backend-state-safety.md` for backend-specific locking, access, and migration guardrails

## Cross-stack dependencies

Preferred order:

1. explicit module outputs passed in the same root
2. published interface artifacts (preferred at scale)
3. `terraform_remote_state` as last-resort coupling

If `terraform_remote_state` is used, version and ownership of the producer stack must be explicit.

## Apply safety gates

Minimum gates:

- `fmt` and `validate`
- lint and security scan
- policy checks
- reviewed plan
- approved apply

## Change safety for state evolution

- Use `moved` blocks for renames and address changes.
- For imports, document source of truth and verify idempotency before apply.
- For manual state operations, require peer review and rollback notes.
