Principles

These are the standing rules of the system’s design. Every page elsewhere is an application of them; when a proposed change makes the description below longer, the change is probably wrong.

The system, in full

  • Programs import modules; modules import other modules.
  • Programs and modules use endowments. An endowment is a name the shop may deny.
  • An executable is a list of things to run in order to start an actor — endowments and modules and such.
  • One mechanism branches module use on the target platform: a package’s own module arms.
  • mcode source files are cemented into Mach pools that hold constant shapes, text, bytecode, and numbers as stone.
  • Those are objects, just like any other object on an actor’s heap.

That is the whole runtime. Complexity beyond it needs a reason statable in a sentence.

Minimal C; everything that can be pit, is pit

C is the trusted computing base and the audit surface. Pit is safe by construction, because something bad can only happen where something holds a powerful endowment. So the C floor holds mechanics — the interpreter, the pool validator and mapper, the GC, the scheduler, the primitives pit cannot express — and pit holds every policy, every format writer, and every decision.

One writer per format; C reads, pit writes

C never writes what pit can write. C reads only what must be readable before any pit runs: the fixed cart header and the cart’s nota metadata. Every format C reads has exactly one writer, in pit, and the build exercises each C reader against that writer — every profile arm boots a fixture pool pressed by the emitter for that arm.

One lane

There is one execution payload: the Mach pool, mapped and run in place. mcode is the one portable form, and cementing is the one step between them, always for a named profile. A capability that would add a second way to carry or run code instead becomes a different profile handed to the same lane.

The tree carries one way to do each thing

Artifacts the system can regenerate are regenerated, not versioned around: when a format moves, its producers and consumers move together, and the committed artifacts are re-pressed. Every commit holds a source tree and boot artifacts that match, so any commit builds and boots — including cold, from the bootstrap floor.

Actors are the unit of shipping

A build’s capabilities are the actors and packages it carries. Shipping without a compiler means the cart carries no compiler fleet — the capability is absent, not disabled. Unused means absent holds at every scale: an actor that never mentions log has no logging on its heap; a cart that never compiles has no compiler in its store.

Files carry their own names

A module’s name is where it is: <package>/<file>. An endowment’s name is its filename in a package the shop draws endowments from. Listing the directory is reading the list, and the test for any resolution design: look at a file, see what it imports, find that thing immediately.

Erlang, not OTP

The core gives actors, isolation, message passing, and $couple — the lifetime binding where a coupled actor’s death takes you with it. Supervision strategies, restarts, heartbeats, and drain protocols are applications: a user writes an actor that does it. If an actor could be written to provide something, the core does not provide it.

The docs are the source of truth

docs/ — and the website generated from it — describes the target system, in positive voice: what the system does. Design decisions land here first, and code aligns to the page. Work-in-progress state lives in plans/ and is temporary by definition.