Inexpressible failure, expressible intent

Every failure mode a substrate leaves expressible costs you twice: once when it fires, and every day in the code you write to route around it. The routing is text, and the text crowds out the program.
Make the failure inexpressible, and the intent becomes expressible. What the mine field vacates, meaning occupies.
A program's intent has a shape — a customer holds orders, an order knows its customer, an editor reaches back to its workspace. A graph. The notation's one job is to trace that graph at full fidelity. For fifteen years, JavaScript modules couldn't — and the reason had nothing to do with any program's meaning.
The evaluation-order constraint
It appears in no program's intent. No specification ever contained the sentence "and module B must finish evaluating before module A." The loader's bookkeeping imposed it anyway — a mine field laid by ordinary export of ordinary classes, where a reference that is meaningful in the domain is fatal in the text, depending on which file the bundler happened to walk first.
The failure was expressible, so every team wrote code whose only purpose was to not express it:
- barrel files with load-order rituals in the README
forwardRef(() => OrderService)— a wrapper whose entire meaning is "please read this later"- entities holding
workspaceIdinstead of the workspace, plus the selector layer that re-joins what the reference already joined - flattened stores, because a flat bag of state cannot form the cycles the domain formed naturally
init()methods and DI ceremonies sequencing what the language wouldn't
None of that code expresses intent. All of it expresses fear — the routing around a failure mode the substrate left open. And notice what the routing does to the shape: the domain's graph gets flattened, its edges replaced by IDs and lookups, its cycles banned by lint. The program still works — but the text no longer holds the domain's shape. It holds the loader's.
The reversal
The fix is not discipline — discipline is more routing. The fix is to make the failure inexpressible. In the namespace convention, every cross-module reference is late — getter bodies, method bodies, first access — so no read can occur while the graph is still loading. Not "is avoided." Cannot occur. The mine field isn't cleared; the geometry that made mines possible is gone — measured at 372 files with a deeply cyclic domain graph.
And here is the part that goes past safety: when the failure becomes unwritable, the routing code doesn't get cleaned up. It becomes meaningless — there is nothing left for it to route around. What remains is the direct notation:
// the domain sentence, written as the domain thinks it
workspaceSet.active.editor.selectLine(42);versus the same intent written in fear:
const workspace = workspaceStore.byId(activeWorkspaceId.value);
const editor = editorStore.byId(workspace?.editorId ?? '');
if (editor) editorActions.selectLine(editor.id, 42);The second version is not worse engineering. It was correct engineering for a substrate where the first version could throw depending on import order. Change the substrate and the second version loses its reason to exist — every line of it was distance between intent and text, paid to a constraint that had nothing to do with either.
Every shape, writable
Here is the part that matters more than any cleanliness: with the mine field gone, there is no shape the domain can have that the text cannot trace. Mutual references — writable. Cycles at any depth — writable, because the hazard was per-edge and every edge is now late. A five-hop navigation crossing two modules in one expression — writable, and reactive along the whole path. The whole-program consequence is that the application becomes one connected graph — entities holding entities, stores referencing stores, expression uninterrupted by seams that exist only because a loader once needed them.
That is the real return. Not tidier files — restored expressive range: the set of writable programs grows back until it matches the set of thinkable ones. You stop designing around what the substrate punishes and design only around what the domain requires — which is the only constraint that was ever legitimately yours.
The same logic runs through every piece of the standard: unbound this made inexpressible, so the wrapper-closure era ends; forked singletons made inexpressible, so defensive DI ceremony ends; initialization races made inexpressible, so init() rituals end. Each removal doesn't just delete a bug class. It deletes the prose that feared it — and widens what the remaining prose can say. The code that results is shorter and flatter as a side effect; the point is that it is complete: for the first time, the text contains the whole shape of the program and nothing else.
Expression at full fidelity: the text traces every edge the domain has, and nothing alien interrupts the tracing.
That is the field, not the rules, seen from the expression side: reshape the space so the degenerate moves don't exist, and what remains isn't a restricted language — it is a larger one, because every shape you could think was already in the domain, and now it is in the text.
Comments