# Preconditions

Record: `arch:preconditions`
Kind: constraint
Layer: [Contracts Core](https://banes-lab.com/records/layer/contracts-core.md)
Severity: mandatory
Scope: function, method, API
Canonical: https://banes-lab.com/ontology#arch-preconditions

## Repair

- Refactored by: Add Guard Clause, Add Validator
- Detected by: missing validation before state transition
- Violated by: accepting invalid state/input
- Measured by: invalid-input handling coverage
- Enforced by: [validation rules](https://banes-lab.com/records/lex/validation-rules.md), [static analysis](https://banes-lab.com/records/reason/technique-static-analysis.md)

## requires

- [Input Validation](https://banes-lab.com/records/arch/input-validation.md)

## reinforces

- [Design by Contract](https://banes-lab.com/records/arch/design-by-contract.md)
- [Fail Fast](https://banes-lab.com/records/arch/fail-fast.md)

## enables

- [Correctness](https://banes-lab.com/records/arch/correctness.md)

## conflicts-with

- [Implicit Assumptions](https://banes-lab.com/records/lex/implicit-assumptions.md)

## tensions-with

- [Permissive APIs](https://banes-lab.com/records/lex/permissive-apis.md)

## tensions

- [Preconditions Permissive APIs](https://banes-lab.com/records/tension/permissive-apis-preconditions.md)

## referenced-by

- [Design by Contract](https://banes-lab.com/records/arch/design-by-contract.md)
- [Fail Fast](https://banes-lab.com/records/arch/fail-fast.md)
- [Liskov Substitution Principle (LSP)](https://banes-lab.com/records/arch/liskov-substitution.md)
