# Preconditions

> A rule or precondition that must hold on an operation's input and state before the operation runs.

Record: `architecture: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#architecture-preconditions

Listed in [Architecture principles](https://banes-lab.com/api/records/architecture.md), after [Semantic Contracts](https://banes-lab.com/records/architecture/semantic-contracts.md) and before [Postconditions](https://banes-lab.com/records/architecture/postconditions.md).

## 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/lexicon/validation-rules.md), [static analysis](https://banes-lab.com/records/reasoning/technique-static-analysis.md)

## Requires

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

## Reinforces

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

## Enables

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

## Conflicts with

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

## In tension with

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

## Tensions

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

## Severity

- [mandatory](https://banes-lab.com/records/vocabulary/severity-mandatory.md)

## Category

- [Contracts / Interfaces / Compatibility](https://banes-lab.com/records/architecture-category/contracts-interfaces-compatibility.md)

## Required by

- [Liskov Substitution Principle](https://banes-lab.com/records/architecture/liskov-substitution.md)

## Linked from

- [Contracts / Interfaces / Compatibility](https://banes-lab.com/ontology/principles/architecture-category-contracts-interfaces-compatibility.md)
- [Correctness / Determinism / Verification](https://banes-lab.com/ontology/principles/architecture-category-correctness-determinism-verification.md)
- [SOLID / Object-Oriented Design](https://banes-lab.com/ontology/principles/architecture-category-solid-object-oriented-design.md)
- [Error Handling / Resilience](https://banes-lab.com/ontology/principles/architecture-category-error-handling-resilience.md)
- [Security / Privacy / Compliance / Governance](https://banes-lab.com/ontology/principles/architecture-category-security-privacy-compliance-governance.md)
- [Contracts / Interfaces / Compatibility](https://banes-lab.com/ontology/lexicon/lexicon-category-contracts-interfaces-compatibility.md)
- [SOLID / Object-Oriented Design](https://banes-lab.com/ontology/lexicon/lexicon-category-solid-object-oriented-design.md)
- [Severity levels](https://banes-lab.com/ontology/schema/the-vocabulary-severity.md)
- [The resolutions](https://banes-lab.com/ontology/schema/the-resolutions.md)
