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.
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.
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.