Environment

Onus is a language plus an environment. The language is the smaller half.

The bet is that trusting model-written code is not solved by a language alone. It takes nine parts, each of which owns one thing and reduces one burden on the person reviewing. Solid boxes are built; dashed ones are specified but not built; dotted ones are intentions.

zones — per-module strictness; nothing at a higher zone rests on a claim from a lower one (specified)task intaketickets → tasksthe loopowns bodieslanguage + compilerthe only checkerthe ledgerproved · checked · assumedregistryinterfaces, versionedtelemetryproduction → repair taskstargetsJavaScript · native · wasmreview toolcomputes nothingdecisions and contract edits return to the loop as taskssolid: built · dashed: specified, not built · dotted: intended, not specified
PartOwnsReducesStatus, 2026-09-05
Language and compilerevery claim: types, contracts, effects, capabilities, pathsreview to reading interfacesbuilt; being rewritten in Onus
The loopfunction bodiesprompting to writing a taskbuilt
The ledgerwhat each obligation rests on“what am I trusting” to a listbuilt
Review toolrendering the ledger; decisionsreading diffs to reading claimsbuilt; promotion not yet
Zonesstrictness per module; promotionone standard for the whole codebase to one per modulespecified, not built
TargetsJavaScript, native, WebAssembly from one lowering“does it behave the same” to a differential testbuilt; WebAssembly untested
Task intaketickets and production failures becoming taskstriagenot specified
Telemetrywhich checked obligations fire, and how oftenguessing which contracts to tightennot specified
Registrypublished interface documents, versionedtrusting a dependency by reading its codenot specified

Language and compiler. The specification is the contract between the person and the model: pure by default, every effect in the signature, every obligation in one of three states. The compiler is the only checker; there is no linter and no warning level. It exists in TypeScript, and is being rewritten in Onus stage by stage, each stage differential-tested against the TypeScript compiler over the whole fixture suite until the last stage reaches a fixed point.

The loop. The loop turns a task into a change. It assembles the model’s context from compiler output, never from source; runs generate, check, classify until green; and never edits a claim. If a contract cannot be met, it stops and proposes. It is the only part of the environment that talks to a model.

The ledger. Every obligation, its location, its state, and what discharged it; every assume with its justification and whether it has been verified against reality, and when; every capability’s construction site and the configuration it depends on. The ledger is what the reviewer reads instead of the code. Its shape is the path report and the interface document, and it gains a field whenever a new kind of trust is introduced.

Review tool. A static page over the ledger: path view, interface view, ledger view, diff view, counterexample view. It computes nothing. Decisions made in it — approve, reject, accept a proposal, tighten a contract — are meant to flow back to the loop as tasks; in v0 they do not yet, and promotion (drafting the declaration that enforces a convention the reviewer spotted) is unbuilt.

Zones. Every module is draft, hardened or critical; nothing at a higher zone may depend on a claim from a lower one; promotion is earned by regenerating the module’s bodies from its interfaces and finding nothing missing. Specified in change log 3; the manifest, the dependency rule and the hardened modifier are the next compiler work after the rewrite.

Targets. One lowering, two emitters: JavaScript, and native code through LLVM. Every proved obligation emits nothing; every checked one emits a compare-and-branch. onus test --target all runs the examples on both and reports disagreement as a diagnostic. WebAssembly goes through the same LLVM path and is written but untested for want of a toolchain. See §19.

Task intake. Not yet specified. The intent: a ticket — a described defect or feature — becomes a ticket task, whose first output is a proposal for the interface change; only after a person accepts it does an implement task follow. Production failures arrive the same way, through telemetry.

Telemetry. Not yet specified. The intent: the runtime’s panic carries an obligation id and the values involved; telemetry forwards these as repair tasks whose counterexample is the production values, pinned as an example before any body changes. Checked obligations that are hit often and never fail are reported as candidates for proving.

Registry. Not yet specified. The intent: a dependency is trusted by its published interface document, not its source; the registry holds those documents versioned, and the compiler refuses a compatible-version bump that weakens a contract or widens an effect set.

What we haven’t built

As of 2026-09-05: