Modules here are named by speed, not by subject: shell, slow, mid, fast, leaf. A tier tells you the clock a module lives on — how often it is allowed to run, and what it may touch. The heavy machinery (rotating plates, logical clocks) is deferred; the naming is not, because names outlive code.

Pipes

Client JS is written with Hack-style pipe operators and compiled by a local Babel plugin:

const pathOf = (href) =>
  href |> new URL(%, location) |> %.pathname |> normalizePath(%);

% is the topic, exactly once per step. See docs/style/js-mjs.md for the rules, and tools/pipes.test.mjs for the proof it compiles.

Tiers

Modules are named by tier, not by subject: root owns the run, mid owns the DOM, slow owns storage, leaf owns pure algebra. fast is reserved — nothing needs a hot loop yet, and an empty tier is ceremony. Dependencies point down the tiers only.