---
name: pure-core-logic
description: "Applies “Business logic is a pure core” as a repeatable product-quality gate. Use during architecture work when rules live in pure functions; i/o stays at the edges; state machines are explicit."
---

# Business logic is a pure core

Apply this skill during **Architecture** work. It supports Any stack.

Rules live in pure functions; I/O stays at the edges; state machines are explicit.

## Instructions

Isolate business rules into a pure core: functions and modules that import no network, database, or framework code — I/O lives at the edges and calls in. Model state as an explicit machine: enumerate the states and legal transitions, and make illegal states unrepresentable in the types rather than guarded by scattered ifs. Represent money as integer minor units with a currency, never floats; keep time in UTC and apply timezones only at the display edge. Enumerate domain edge cases (zero, negative, expired, concurrent, duplicate) in types and tests. The proof of a pure core: it runs in a plain test runner with no mocks. If testing a rule requires a server, the rule is in the wrong place.

## Detect the problem

- Business rules inside route handlers
- Boolean flags standing in for states
- Float math touching money

## Hold the gate

Do not declare this phase complete until every item passes:

- [ ] Business rules live in pure modules with zero imports of network/DB/framework
- [ ] State is an explicit machine: states and transitions enumerated, illegal states unrepresentable
- [ ] Money is integer minor units + currency; time is UTC with zones only at display
- [ ] Domain edge cases are enumerated in types/tests, not tribal knowledge
- [ ] The core runs and is testable with no server, no browser, no mocks

## Verify the result

Run the core's tests with networking disabled — all must pass.
