Aver is a statically typed language designed for AI to write and humans to review. It has a bytecode VM for running code, a Rust backend for deployment, a WASM backend for browser and embedded targets, and Lean proof export for pure logic and classified effectful laws.
An AI reviewer's opinion of generated code gets cheaper every year. A certificate checked by the Lean kernel keeps its price. Aver source carries proof obligations, and a compiled wasm-gc artifact can ship with a sidecar certificate bound to its exact bytes. The Lean kernel signs off on those guarantees, so they do not rest on someone having looked at the code once. Generated code already arrives faster than anyone can read it, and the certificate is what stays useful when spot-checks can no longer keep up.
Readability comes second, and it still matters. The risky part of AI-written code is usually missing intent, much more often than bad syntax. Aver makes that intent explicit and machine-readable:
- effects are part of the function signature
- decisions live next to the code they explain
- pure behavior lives in colocated
verifyblocks - selected effectful behavior can be verified with explicit stubs and trace assertions
- effectful runs can be recorded and replayed deterministically
The toolchain (run / verify / check / audit / why / context / compile / bench / proof / replay) is documented in docs/cli.md. The backends have their own pages: docs/bench.md, docs/transpilation.md, docs/lean.md, docs/effects.md, docs/wasip2.md and docs/rust.md. Compiled wasm-gc modules and wasip2 components can carry a machine-checkable certificate of what their exports compute; see docs/certification.md.
Aver is optimized for AI to generate code that humans can inspect, constrain, test and ship. Typing it by hand all day is not the goal.
Prompting an LLM to write Aver? Run aver agent-connect in your project. The language guide and the toolchain guide ship inside the binary, so every install already has them. The command writes them out as .claude/skills/aver/SKILL.md and .claude/skills/aver-tooling/SKILL.md and points a marked section of your AGENTS.md at them. It touches nothing else. aver agent-connect --global puts the same two skills in ~/.claude/skills/ instead, and aver agent-connect --print writes the language guide to stdout for an agent that wants a single file. There is no blessed workflow; keep whatever prompt or harness you already use. If you would rather link than install, the same curated guide is the repo-root llms.txt and averlang.dev/llms.txt. It covers the .av extension, single-line match arms, qualified constructors, classified effects, verify block shapes, and the other rules models tend to get wrong on the first try. A longer reference cut is llms-full.txt.
Website: averlang.dev
Browser playground: averlang.dev/playground
The Aver Manifesto makes the longer argument, and Common Pushback collects questions and objections. intent-trace is an empirical benchmark that compares Aver's legibility against Python variants across 108 AI-reviewed code changes.
docker build -t aver-one-command . && docker run --rm aver-one-commandThis builds aver and aver-cert, runs examples/core/hello.av, checks one Lean law, and smoke-checks a small artifact certificate. See docs/quickstart.md.
cargo install aver-lang --features wasm
cargo install aver-certThe wasm feature enables wasm-gc compilation and --certify. Leave it out only if you need nothing beyond the VM and the Rust backend. Install with --features wasm,wasip2 if you also want the WASI 0.2 target shown below. aver-lang installs the compiler as aver.
aver-cert installs the independent certificate verifier that aver cert uses. Keep both executables in the same directory or on PATH. The verifier has its own public version line, starting at 0.1.0 and separate from the aver-lang version, and it checks certificates with the pinned Lean 4.34 toolchain. Verification needs a standard Elan installation. The verifier resolves the canonical Elan executable directly and does not look up its trusted Lake, Lean or leanchecker processes through PATH.
Then try it with a tiny file:
cat > hello.av <<'EOF'
module Hello
intent =
"Tiny intro module."
exposes [greet]
fn greet(name: String) -> String
? "Greets a user."
"Hello, {name}"
fn runCli() -> Unit
? "Starts the CLI."
"Prints one rendered response."
! [Args.get, Console.print]
Console.print("todo")
verify greet
greet("Aver") => "Hello, Aver"
fn main() -> Unit
! [Console.print]
Console.print(greet("Aver"))
EOF
aver run hello.av
aver run hello.av --self-host
aver verify hello.av
aver verify hello.av --json
aver check hello.av
aver check hello.av --json
aver capabilities hello.av
aver capabilities hello.av --json
aver audit hello.av
aver audit hello.av --json
aver why hello.av
aver context hello.av
aver shape hello.av
aver compile hello.av -o out/
(cd out && cargo run)aver run, verify, check and replay use the bytecode VM by default. The old --vm flag has been removed.
Unit is Aver's "no meaningful value" type. It is roughly void and shows up as () in diagnostics. main often returns Unit, but it can also return Result<Unit, String>, and aver run treats Result.Err(...) from main as a process failure.
git clone https://github.com/jasisz/aver
cd aver
cargo install --path . --features wasm --force
cargo install --path aver-cert --force
aver run examples/core/calculator.av
aver run examples/core/calculator.av --self-host
aver verify examples/core/calculator.av
aver check examples/core/calculator.av
aver audit examples/core/calculator.av
aver why examples/core/calculator.av
aver context examples/core/calculator.av
aver compile examples/core/calculator.av -o out/
(cd out && cargo run)
aver proof examples/formal/law_auto.av -o proof/
(cd proof && lake build)
aver run examples/services/console_demo.av --record recordings/
aver run examples/core/calculator.av -e 'safeDivide(10, 2)' --record recordings/
aver run examples/services/console_demo.av --wasm-gc --record recordings/
aver replay recordings/ --test --diff
aver replay recordings/ --test --check-args
aver replay recordings/ --test --json
aver replay recordings/rec-…json --wasm-gcRecordings are byte-compatible across the VM, self-host and wasm-gc backends. A trace written by any one of them replays cleanly under any of the three.
Requires: Rust stable toolchain.
For editor integration:
cargo install aver-lspThen install the VS Code extension Aver.aver-lang, or have your editor start the aver-lsp binary directly. editors/README.md has setup notes for VS Code, Sublime Text and manual LSP configuration.
module Payments
intent =
"Processes transactions with an explicit audit trail."
exposes [charge]
decision UseResultNotExceptions
date = "2024-01-15"
reason =
"Invisible exceptions lose money at runtime."
"Callers must handle failure — Result forces that at the call site."
chosen = "Result"
rejected = ["Exceptions", "Nullable"]
impacts = [charge]
fn charge(account: String, amount: Int) -> Result<String, String>
? "Charges account. Returns txn ID or a human-readable error."
match amount
0 -> Result.Err("Cannot charge zero")
_ -> Result.Ok("txn-{account}-{amount}")
verify charge
charge("alice", 100) => Result.Ok("txn-alice-100")
charge("bob", 0) => Result.Err("Cannot charge zero")
No if/else. No loops. No exceptions. No nulls. No implicit side effects.
Aver is opinionated on purpose. Each of these omissions is a design choice:
- no
if/else: branching goes throughmatch, which dispatches directly on literals ("verack" ->,253 ->), constructors, lists and tuples as well as booleans - no
for/while: iteration is recursion or explicit list operations - no exceptions: failure is
Result - no
null: absence isOption - no closures: functions are top-level and explicit
- no async/await, streams or channels:
(a, b)?!declares independent computations and the runtime handles the rest. See docs/independence.md - no hidden state behind effects:
Disk.writedoes not affect a laterDisk.read. If state matters, it lives in pure user data (see below)
Each omission removes a kind of implicit behavior that AI generates easily and humans find tedious to audit.
For the fuller language rationale, see docs/language.md.
Prove the model, not the world.
Aver splits programs into two layers:
- Pure core: explicit data, explicit state transitions, laws. Read-after-write consistency, ordering and accumulation are properties of your data structures (a
FileStore, aPaymentLedger, aWorkflowState), proven byverifyover pure functions. - Effect shell:
Disk.*,Time.*,Process.*,Tcp.*,Http.*,Env.*. These are one-shot calls to the world. Oracle stubs are explicit functions of branch and call index. AnEnv.setdoes not change a laterEnv.get, a firstTime.nowdoes not constrain the next, and aDisk.writedoes not seed a laterDisk.read. Capability-owned laws may still relate observations.Process.stopRequesteddoes this: it can only go from false to true.
This is deliberate. Real wall clocks are not monotonic (NTP, leap, suspend, VM clock skew). Filesystems are not transactional. Aver does not give external services nicer laws than the platform actually promises, because that would prove guarantees the OS never gave.
If a property depends on memory across effect calls, model the state in pure user code. The shell stays thin.
Runnable patterns: examples/formal/file_store_pure_core.av + examples/formal/file_store_shell.av, examples/formal/clock_as_data.av. Background: docs/oracle.md.
LLMs can produce function bodies quickly. They are much worse at preserving the information reviewers actually need:
- what a function is allowed to do
- why a design was chosen
- what behavior must keep holding after a refactor
- what a new human or model needs to understand the codebase without reading everything
Traditional languages usually push that into comments, external docs, stale tests, or team memory. Aver makes those concerns part of the language and tooling.
The intended workflow: AI writes Aver, humans review contracts and intent, the bytecode VM runs the code during development, and deployment goes through Rust code generation or WASM compilation.
I discussed Aver on Happy Path Programming #120 with Bruce Eckel and James Ward. We talked about why Aver optimizes for the reviewer and not the generator, why effects, intent, verify blocks and decisions belong in the language itself, and what "AI-native" should mean when a human still has to trust the generated code.
Watch / listen: https://www.youtube.com/watch?v=D_mPxGtSzbQ
aver run hello.avAll commands use the bytecode VM. For VM internals, see docs/vm.md.
# Native WebAssembly GC + tail-call output for browsers / Workers
aver compile hello.av --target wasm-gc
# Run through embedded wasmtime (uses the same wasm-gc emit path)
aver run hello.av --wasm-gc
# Carry that Wasmtime host with the program; the destination needs no Aver
aver compile hello.av --target wasm-gc --pack wasmtime -o out/
./out/aver-wasmtime-host some-arg
# Diagnose a particular deployment stage (default remains zero-JIT AOT)
./out/aver-wasmtime-host --artifact canonical -- some-arg
./out/aver-wasmtime-host --artifact optimized -- some-arg
# WASI 0.2 / Component Model output (wasmtime, Spin, NGINX Unit, etc.)
aver compile hello.av --target wasip2
# Run a wasip2 component through embedded wasmtime + wasi
aver run hello.av --wasip2 -- some-arg--target wasm-gc is the default modern target (Chrome 119+ / Firefox 120+ / Safari 18.2+ / wasmtime 25+ / Node 22+ / Workers). --target wasip2 is its counterpart for the Component Model. The pre-2024 NaN-boxed wasm32 backend (--target wasm + --bridge) was dropped in 0.18. See docs/effects.md and docs/wasip2.md for the supported deployment surfaces.
The Wasmtime pack is a native directory bundle. It contains the canonical wasm-gc module, an optional distinct Binaryen result, its matching precompiled Wasmtime image, a manifest, and a stripped aver-wasmtime-host executable with the engine and the project's configured providers linked in. Only the build machine needs Aver, Cargo and provider sources. The destination loads the AOT image without running Cranelift. --certify --optimize keeps three stages on purpose: the certificate binds <name>.wasm, deployment uses <name>.optimized.wasm, and Wasmtime executes <name>.cwasm. See docs/wasmtime-pack.md. The bundled host defaults to .cwasm. For differential diagnosis it can explicitly JIT either portable stage with --artifact canonical|optimized. It never falls back automatically.
Custom capabilities whose whole contract uses only Unit, Bool, Float and String compile to typed wasip2 component imports. They are host-bound. An external Component Model host may provide the generated interface directly, or aver run app.av --wasip2 can adapt the same Rust ProviderBinding that the project's aver.toml binds for the VM. Without such a binding, aver run --wasip2 reports the missing import before component linking.
aver compile hello.av # generates Rust/Cargo project
aver compile hello.av --policy embed # bake aver.toml into binary
aver compile hello.av --policy runtime # load aver.toml at runtimeSee docs/rust.md for the generated code model.
Generated Rust can also be linked with native custom capability providers. The generated library accepts the same aver_rt::provider::ProviderBinding that an embedded VM uses. A versioned [providers] section in aver.toml can name an explicit Cargo package/path and a zero-argument binding factory. aver compile then emits the dependency and the stock-binary bootstrap, and Cargo resolves the package during the generated build.
The same manifest is part of what a program means on every backend. When a program reaches a bound capability, aver run, aver verify and aver audit build a thin cached Rust host once (the first build names the packages it links) and run the ordinary bytecode VM inside it with those bindings in-process. Project-wide verify/audit installs only the bindings each module needs, so independent modules still run and are not mislabeled as type errors. For a WIT-lowerable contract, aver run app.av --wasip2 uses the same host package and binding behind the generated Component Model import. aver run app.av --wasm-gc uses the same binding behind the contract-derived raw wasm-gc ABI, including compound values, packed Bytes and opaque provider resources. --self-host still has no provider host and refuses such a program. A project without [providers] never invokes Cargo. Its generated artifacts stay host-bound, and embedders can install bindings through the library API.
aver run hello.av --self-hostThis runs the program through the Aver interpreter written in Aver, which is compiled to Rust and cached on demand. See self_hosted/README.md.
fn processPayment(amount: Int) -> Result<String, String>
? "Validates and records the charge. Pure — no network, no disk."
match amount
0 -> Result.Err("Cannot charge zero")
_ -> Result.Ok("txn-{amount}")
fn fetchExchangeRate(currency: String) -> Result<Http.Response, String>
? "Fetches live rate from the ECB feed."
! [Http.get]
Http.get("https://api.ecb.europa.eu/rates/{currency}")
Effects such as Http.get, Disk.readText, and Console.print are part of the signature. A missing declaration is a type error. The runtime also enforces the same boundary as a backstop.
Effects can be granular or namespace-wide:
! [Http.get]allows onlyHttp.get! [Http]covers allHttp.*effects
aver check suggests narrowing a broad namespace effect when a function only needs a smaller subset.
Runtime policy in aver.toml can narrow the allowed destinations further:
[effects.Http]
hosts = ["api.example.com", "*.internal.corp"]
[effects.Disk]
paths = ["./data/**"]
[effects.Env]
keys = ["APP_*", "PUBLIC_*"]
[effects.Tcp]
connect_timeout_secs = 5
request_idle_timeout_secs = 30
max_connections = 256Disk paths accept concrete subtrees, ./** for the project-relative subtree, and /** for the filesystem root. Loading aver.toml rejects bare **, empty entries, unsupported glob spellings and ..-rooted entries. The CLI reference has the full grammar and explains the limitation that matching is string-only.
These are two separate controls:
- code answers: what kind of I/O is allowed?
- policy answers: which concrete destinations are allowed?
The three Tcp values configure the standard capability provider. They do not grant additional effects. The two deadlines apply to connection establishment and to one-shot request calls. Reads and writes on persistent sessions have no deadline, by design. max_connections is a single shared bound covering established connections, accepted connections and in-flight dials.
Generated Rust can use the same scoped runtime machinery when you compile with --with-replay; see docs/rust.md.
decision UseResultNotExceptions
date = "2024-01-15"
reason =
"Invisible exceptions lose money at runtime."
"Callers must handle failure — Result forces that at the call site."
chosen = "Result"
rejected = ["Exceptions", "Nullable"]
impacts = [charge, refund, settle]
author = "team"
decision blocks are part of the language syntax and sit next to the code they explain.
Query only the decision history for a module graph:
aver context decisions/architecture.av --decisions-onlyimpacts, chosen, and rejected accept either validated symbols or quoted semantic labels.
aver context examples/core/calculator.avAver walks the dependency graph and emits a compact context summary: module intent, public signatures, effect declarations, verify samples and decisions. It exports the contract-level view that another human or LLM needs first, instead of dumping the whole source tree.
By default, aver context uses --depth auto --budget 10kb with priority scoring: elements with more verify coverage, spec references and decisions are included first. --depth N and --depth unlimited bypass that budget. Long verify examples are skipped so they do not bloat the artifact.
Use --focus <symbol> to build context around one function. Its callees, types, verify blocks and decisions get priority within the budget:
aver context examples/data/json.av --focus fromStringThe token budget becomes a way to navigate. Another human or model can start with a small architecture map, zoom into the modules that matter, or focus on one function's dependency cone.
If you want a larger export for a medium project, raise the budget explicitly:
aver context projects/workflow_engine/main.av \
--module-root projects/workflow_engine \
--json \
--budget 24kb \
--output projects/workflow_engine/CONTEXT.jsonWhen --output is used, Aver also prints a short selection summary to stdout, for example:
mode auto, included depth 2, used 22622b, budget 24kb, truncated, next depth 3 would use 40739b
JSON output embeds the same selection metadata, so you can see whether the export stopped because of the budget.
Example shape:
## Module: Calculator
> Safe calculator demonstrating Result types, match expressions, and co-located verification.
### `safeDivide(a: Int, b: Int) -> Result<Int, String>`
> Safe integer division. Returns Err when divisor is zero.
verify: `safeDivide(10, 2)` → `Result.Ok(5)`
## Decisions
### NoExceptions (2024-01-15)
**Chosen:** Result — **Rejected:** Exceptions, Nullableverify charge
charge("alice", 100) => Result.Ok("txn-alice-100")
charge("bob", 0) => Result.Err("Cannot charge zero")
charge("x", -1) => Result.Ok("txn-x--1")
verify blocks stay next to the function they cover. aver check treats a missing verify block on a pure, non-trivial, non-main function as a contract error.
Regular verify:
verify add
add(1, 2) => 3
add(0, 0) => 0
Law verify:
verify add law commutative
given a: Int = -2..2
given b: Int = [-1, 0, 1]
add(a, b) => add(b, a)
verify ... law ... is deterministic and does no random sampling. Its cases are the cartesian product of explicit domains, capped at 10_000.
For the proof-oriented style where a law relates an implementation to a pure spec function, see docs/language.md and docs/lean.md.
Oracle laws for classified effects:
fn fairDie(path: BranchPath, n: Int, min: Int, max: Int) -> Result<Int, String>
? "Deterministic Random.int stub."
Result.Ok(4)
fn pickOne() -> Int
? "Rolls once."
! [Random.int]
Random.int(1, 6)
verify pickOne law usesOracle
given rnd: Random.int = [fairDie]
Result.Ok(pickOne()) => rnd(BranchPath.Root, 0, 1, 6)
verify <fn> law <name> is the proof-oriented Oracle form. aver proof lifts the effectful function to a pure function with explicit oracle parameters and can emit a universal theorem over that oracle. For runtime assertions over .result and .trace.*, such as trace.contains(Random.int(1, 6)), use the cases form verify <fn> trace. See docs/oracle.md for the full model.
Use deterministic replay for stateful, interactive, or external effectful code:
- run once against real services and record the effect trace
- replay offline with no real network, disk, or TCP calls
- use
--diffand--testto turn recordings into a regression suite
aver run examples/services/console_demo.av --record recordings/
aver replay recordings/rec-123.json --diff
aver replay recordings/ --test --diff
# Same flow under wasm-gc — recordings are interchangeable across the
# VM, self-host, and wasm-gc backends.
aver run examples/services/console_demo.av --wasm-gc --record recordings/
aver replay recordings/rec-123.json --wasm-gcUse Oracle laws when classified effects should become proof obligations over explicit stubs. Use verify <fn> trace when you need runtime assertions over .result or .trace.*. Use replay when the flow depends on ambient state, persistent TCP sessions, terminal modes, or server callbacks.
aver check file.av
aver run file.av
aver verify file.av
aver context file.av
aver compile file.av -o out/
aver compile file.av --target wasm-gc --certify -o out/
aver compile file.av --target wasip2 --certify -o out/
aver cert check out/file.wasm out/cert
aver cert verify out/file.wasm out/cert
aver cert verify out/file.component.wasm out/cert
aver cert explain out/file.wasm out/cert
The full per-command reference, including flags, replay, formatting, the REPL and the audit / why / proof / bench commands, is in docs/cli.md. check, verify and audit walk the whole program (the entry plus every module it reaches through depends [...]) and report per module. aver verify --wasm-gc runs the same cases through the wasm-gc backend as a cross-target check.
| Command | What it checks | Use as a gate? |
|---|---|---|
aver check |
Source contracts and static diagnostics | Source-quality gate |
aver verify |
Declared source examples | Regression gate |
aver cert check |
Fast certificate preflight using the built or trusted-cache .olean closure |
Development only (CHECKED) |
aver cert verify |
Exact artifact certificate with final fresh replay | Release/admission gate (CERTIFIED) |
aver-cert runs as an independent process. aver cert ... forwards to that binary, so no verifier is linked into the compiler. docs/certification.md describes the certificate package format and schema version 1.
Aver is small on purpose. The core model:
- immutable bindings only
matchinstead ofif/elseResultandOptioninstead of exceptions andnull- top-level functions only, with no closures
- explicit method-level effects
- module-based structure via
module,depends, andexposes - automatic tail-call optimization for eligible code
For the surface-language guide, see docs/language.md.
For constructor rules and edge cases, see docs/constructors.md.
For namespaces, effectful services, and the standard library, see docs/services.md.
Aver has three backend paths:
- VM-based workflow for
run,check,verify,replay, andcontext - Rust compilation for generating a native Cargo project with
aver compile - Lean proof export for pure core logic, Oracle-lifted classified effectful laws, and
verify/verify lawobligations withaver proof. Supported law shapes become real universal theorems. The rest stay as executable samples or checked-domain theorems and are never presented as proofs.
The VM and generated Rust share runtime behavior through aver-rt. List teardown, deep append -> match paths and string helpers such as String.slice live there on purpose, so one runtime fix improves both execution paths.
Typical Rust flow:
aver compile examples/core/calculator.av -o out/
cd out
cargo runTypical Lean flow:
aver proof examples/formal/law_auto.av --verify-mode auto -o out/
cd out
lake buildRust is the deployment backend. Lean is the proof backend: it handles verify cases via native_decide and supported verify law shapes via tactic strategies that the Lean kernel checks.
For backend-specific details, see:
- docs/rust.md for Cargo generation and deployment flow
- docs/lean.md for proof export, formal-verification path, and current Lean examples
- docs/oracle.md for Oracle laws, classified-effect stubs, and trace assertions
Shared examples under examples/ resolve from --module-root examples. They are grouped by role:
core/for language and syntax toursdata/for pure data structures and parsersformal/for Lean-oriented proof examplesmodules/for import and module-root examplesservices/for effectful adapter demosapps/for small multi-file applications under the shared examples rootgames/for interactive terminal games (Snake, Tetris, Braille Doom)
Standalone multi-file showcase projects live under projects/ and use their own local module roots.
Repository layout rule:
- files under
examples/share one root:--module-root examples - each folder under
projects/is its own root, for example--module-root projects/workflow_engine
Typical commands:
aver check examples/modules/app.av --module-root examples
aver check projects/workflow_engine/main.av --module-root projects/workflow_engine
aver check projects/payment_ops/main.av --module-root projects/payment_opsCurated shared examples:
| File | Demonstrates |
|---|---|
core/hello.av |
Functions, string interpolation, verify |
core/calculator.av |
Result types, match, decision blocks |
core/shapes.av |
Sum types, qualified constructors (Shape.Circle), match on variants |
data/fibonacci.av |
Tail recursion, records, decision blocks |
formal/law_auto.av |
Lean proof export, verify law, conservative universal auto-proofs plus sampled/domain fallback |
formal/spec_laws.av |
Implementation-vs-spec laws (verify foo law fooSpec) and Lean spec theorems for supported shapes |
formal/oracle_trace.av |
Oracle laws and trace assertions for classified effects with explicit stubs |
apps/mission_control.av |
Command parser, pure state machine, effectful shell |
games/wumpus.av |
Hunt the Wumpus: cave exploration, match-driven control flow |
modules/app.av |
Module imports via depends [Data.Fibonacci] |
services/console_demo.av |
Console service and replay-friendly effectful flow |
services/http_demo.av |
HTTP service with sub-effects: Http.get, Http.post |
services/weather.av |
End-to-end service: HttpServer + Http + Tcp |
apps/notepad/app.av |
Multi-file HTTP app under the shared examples module root |
games/snake.av |
Terminal Snake: immutable state, TCO game loop, Terminal service |
games/tetris/main.av |
Modular Tetris: sum types, 2D grid, collision, line clearing (4 modules, 66 verify cases) |
games/checkers/main.av |
Checkers with alpha-beta AI: cursor UI, forced capture, decision trace (5 modules, 144 verify cases) |
games/doom/main.av |
Braille Doom: raycasting FPS with Unicode Braille rendering, procedural levels, 3 enemy types with AI, shooting, wall textures (7 modules) |
core/test_errors.av |
Intentional aver check failures: type errors + verify/decision/effect diagnostics |
Standalone projects:
| File | Demonstrates |
|---|---|
projects/workflow_engine/main.av |
Explicit app/domain/infra flow, event replay, derived events, verify-driven orchestration |
projects/payment_ops/main.av |
Dirty payment backoffice flow: provider normalization, replay, settlement reconcile, manual-review cases, audit trail |
self_hosted/main.av |
Full self-hosted interpreter: lexer, parser, resolver, evaluator. All 55 examples pass. Compiles to native via aver compile and powers aver run --self-host. |
See examples/ and projects/ for the full set. For repository self-documentation via decision exports, see decisions/architecture.av.
| Document | Contents |
|---|---|
| docs/language.md | Surface-language guide: syntax, semantics, modules, and deliberate omissions |
| docs/formatting.md | Formatter behavior and guarantees |
| docs/constructors.md | Constructor rules and parsing contract |
| editors/README.md | VS Code + LSP setup and Sublime Text support |
| docs/services.md | Full API reference for all namespaces (signatures, effects, notes) |
| docs/oracle.md | Oracle: effectful laws, trace assertions, and proof export for classified effects |
| docs/vm.md | Bytecode VM design note: execution model, NanValue, opcodes, effects |
| docs/types.md | Key data types (compiler, AST, runtime) |
| docs/extending.md | How to add keywords, namespace functions, expression types |
| docs/transpilation.md | Overview of aver compile and aver proof |
| docs/rust.md | Rust backend: deployment-oriented Cargo generation |
| docs/effects.md | Effect support across the VM, wasm-gc, and wasip2 targets |
| docs/wasip2.md | WASI 0.2 / Component Model target and host compatibility |
| docs/lean.md | Lean backend: proof export and formal-verification path |
| docs/certification.md | Artifact behavioral certificates: commands, guarantees, admitted families, and limits |
| docs/certification-architecture.md | Certificate data flow, checker ownership, and trust boundary |
| docs/certificate-format.md | Normative certificate format reference for independent verifier reimplementors, with the trust inventory and the versioning and freeze policy |
| docs/independence.md | Independent products: the semantic model behind ?! and ! |
| docs/research.md | Narrow related work for effects, Oracle, independent products, and proof targets |
| docs/pushback.md | Common pushback: questions, objections and answers |
| docs/decisions.md | Decision export generated via aver context --decisions-only |