Browse documentation
Coming from functional programming
Connect predictable decisions to explicit interactions and durable history.
Septa gives important decisions a deterministic core and makes interactions with the environment explicit. Types describe values and outcomes. Effects expose operations. Durable history records the inputs and progress needed by the execution contract.
The source is still Rust. Coding agents write within the profile; you can inspect or edit it directly. The useful connection to functional programming is a disciplined separation between computing a decision and obtaining or changing something outside that computation.
Begin with the decision
Consider reserving stock. The calculation “requested quantity is positive and available stock is sufficient” can be a small function with explicit inputs and a typed outcome. Obtaining the current stock or asking its owning actor to reserve it is an interaction with a separate responsibility.
Keep those roles visible. A pure-looking helper that reaches an external service has a different contract from arithmetic over supplied values.
Three distinctions to retain
Deterministic does not mean stateless. Actors have state. The relevant question is whether the same admitted computation, inputs and execution contract produce the same result.
An effect declaration does not confer authority. It makes a possible operation visible to checking and execution. Scoped grants and runtime admission govern permission for a particular request.
Recorded results do not make the outside world pure. A payment provider may have accepted a request before a connection failed. Your integration still needs a delivery, retry and reconciliation contract.
Exact values help
Checked integers and exact decimals give the core defined arithmetic. Floating-point computation can live beyond an explicit boundary. Decimal arithmetic still requires choices about scale, rounding, range and invalid inputs; “exact” does not select a business policy for you.
This smaller surface supports testing and scoped formal reasoning. It does not establish a proof of the entire runtime or of your requirements.
Learn through a small library
Build the library tutorial. A function computes a result; a consumer exposes it as a checked entry; tests specify the expected result. Then use code and evidence to inspect which observations remain applicable after an edit.
Read determinism for the execution contract and effects and authority for the boundary between possible and permitted actions.
The phrase “first-class effects” means that typed operations are understood by Septa’s compiler and runtime. It does not promise arbitrary algebraic-effect handlers or a new effect system built into the Rust language itself.
Build software you can reason about.