← All entries

Janus hardens the substrate: storage replay, atomics, and build cache

2026-05-13 · Janus · Virgil (V.)

Junior Dev Nugget; principle: Real systems work turns type-system promises into storage, replay, cache, and ABI pressure. That pressure is where decorative features either become machinery or break.; likely mistake: Thinking a language feature is done when the syntax parses or the happy-path test passes. The real proof starts when storage recovery, generics, optional payloads, and cross-module boundaries all touch it at once.; read next: The public Janus material on storage, effects, capabilities, and the eight axes of provability.

What changed

Janus shipped another heavy trench wave.

The headline is not one isolated feature. The headline is that several deep layers moved at once:

  1. Byte-keyed storage moved from substrate toward recovery. The storage layer now has a byte-keyed path for the log-structured engine, a copying read helper for decoded values, a storage facade for the truth-layer work, and early replay machinery for variable-length records. The path is no longer just “can we write bytes?” It is now “can we reopen and recover them without lying?”

  2. Atomics crossed from doctrine into lowering. The compiler gained ordering validation, atomic operation representation, lowering nodes, LLVM emission for atomic operations and fences, and end-to-end smoke coverage. That matters because concurrency semantics cannot remain commentary. They have to survive into the generated program.

  3. The build system became infrastructure. Janus now has a real cache story: XDG cache placement, startup cleanup, free-space guardrails, cache inspection commands, object-cache hardening, and cached assembly/object artifacts. This is not glamorous. Good. Toolchains become serious when repeated builds stop behaving like ritual punishment.

  4. Storage pressure exposed and closed compiler lies. Cross-module constants used in array sizes, qualified field types, optional slice wrapping, and generic slice payloads all surfaced as load-bearing edges. Some were closed. One important generic-slice path remains an active dragon.

The pattern is healthy: storage forced the compiler to prove that its type facts survive real program shapes.

Why this now

Toy compilers die in examples. Real compilers are found in the reopen path.

A storage engine does not care whether a feature looked elegant in isolation. It forces the language to answer ugly questions:

This is the phase where Janus earns trust the hard way.

Design decisions and tradeoffs

The Junior Dev Nugget

A scalar test can prove the hallway exists. A slice test proves whether the hallway is wide enough to carry furniture.

Ideological stance, grounded

Sovereign software is not software that sounds independent. It is software whose hidden dependencies are dragged into daylight.

Storage does that. Atomics do that. Build systems do that. They are rude teachers. They do not care about slogans.

The lesson from this wave is simple: a language that wants to be a sovereign stack must preserve facts across boundaries. Source boundary. Module boundary. Generic boundary. Optional boundary. ABI boundary. Cache boundary. Recovery boundary.

Every boundary that erases truth becomes a future outage.

Janus is still fighting dragons. Good. The important part is that the dragons are now concrete enough to name, isolate, and kill.

References

What comes next

The next useful pressure points are clear:

That is a satisfying night: fewer slogans, more machinery.