# Decision Rules

## When `model` Is Required

Create `model` when the feature includes any of the following:

- feature-specific types
- static page metadata
- mock datasets
- validation rules
- data normalization or shaping rules

If the feature has only pure presentational JSX and no feature-owned data, `model` can be omitted.

## When `controller` Is Required

Create `controller` only when the feature has meaningful behavior, such as:

- local UI state with transitions
- orchestration across multiple view elements
- event handlers that are more than trivial prop pass-through
- feature-level derived state

Do not create `controller` for static placeholder pages.

## When `services` Is Required

Create `services` only when the feature needs:

- API calls
- persistence boundaries
- adapters to other systems
- async orchestration that should not live in the view
- mocked integrations used to demonstrate or preserve a real boundary, such as authentication

Do not create `services` as an empty placeholder.

## Avoiding a Second Source of Truth

- Keep exactly one real implementation for each feature responsibility.
- If `src/pages` contains route wrappers, those wrappers must delegate immediately to `src/features`.
- If a legacy file must remain temporarily, reduce it to a thin reexport or wrapper only.
- Never keep business logic in both `src/pages` and `src/features`.
- Never split route composition and feature implementation across multiple competing files.
