# Controlled Side Effects

Record: `arch:controlled-side-effects`
Kind: principle
Layer: [Atomic Boundary](https://banes-lab.com/records/layer/atomic-boundary.md)
Severity: recommended
Scope: function, module, boundary
Canonical: https://banes-lab.com/ontology#arch-controlled-side-effects

## Repair

- Refactored by: Move Side Effect to Boundary, Return Command/Event
- Detected by: side effects in domain/pure functions
- Violated by: mutation/network/persistence hidden in pure-looking code
- Measured by: side-effect boundary violations
- Enforced by: effect linting, layer rules

## requires

- [Effect Boundaries](https://banes-lab.com/records/lex/effect-boundaries.md)

## reinforces

- [Predictability](https://banes-lab.com/records/arch/predictability.md)
- [Testability](https://banes-lab.com/records/arch/testability.md)

## enables

- [Pure Core / Imperative Shell](https://banes-lab.com/records/lex/pure-core-imperative-shell.md)

## conflicts-with

- [Hidden Side Effects](https://banes-lab.com/records/lex/hidden-side-effects.md)
- [Action at a Distance](https://banes-lab.com/records/arch/action-at-a-distance.md)
- [Hidden Side Effect](https://banes-lab.com/records/arch/hidden-side-effect.md)

## tensions-with

- [Performance Optimization](https://banes-lab.com/records/lex/performance-optimization.md)

## tensions

- [Controlled Side Effects Performance Optimization](https://banes-lab.com/records/tension/controlled-side-effects-performance-optimization.md)
