# Determinism and validation

Given equal inputs, every Lifecycle Kit function returns equal output. Random
selection, time, storage, browser APIs, and rendering engines are intentionally
outside the package boundary.


## Input validation {#input-validation}


Every exported function that accepts structured input validates its boundary.
That means malformed quantities, impossible fractions, and invalid geometry
fail early with an actionable error instead of yielding a downstream `NaN`.

Units are documented on the exported symbols in the [generated API reference](https://jonbogaty.com/lifecycle-kit/api/readme/index.md).
In common use, temperatures are kelvin, scaling-law masses are kilograms, and
fractions such as tissue, exposure, and material properties are in `0..1`.


## Reproducible application code {#reproducible-application-code}


If an application needs randomness, select or generate its seed outside
Lifecycle Kit and pass the resulting values as regular inputs. Persist those
inputs with the application state. This keeps simulation replay, tests, and
parallel generation predictable.


## Output-size limits {#output-size-limits}


The form rules defend their own allocation boundaries. `repeat` rejects counts
above 10,000, and `branch` rejects recursion that would emit more than 10,000
copies (or descend beyond 64 levels). Treat those named `RangeError`s as a
request to constrain the caller's design, not as a value to retry blindly.
