Castles in the sandbox

The browser is the most ubiquitous runtime in history. It is also a sandbox by default. With WebGPU, the browser is now a portable accelerator runtime, which is exactly why deterministic boundaries matter when building castles.

But a sandbox is not a boundary on its own. The browser restricts capabilities, but it does not enforce our invariants. We need constraints, and a deterministic checker between intent and side effects, whether the intent is human or machine.

Thesis

For any workflow that a sandbox can contain, SaaS is shimware today and vaporware tomorrow. "Proofware" is now: formally verified boundaries with traceable rejection.

Pythons don't prefer sand

You can build castles in the sky and win the pitch: infinite backend, infinite trust, infinite rent. Or you can build them in the sandbox, where the castles are cheap to rebuild and the constraints outlast every one of them.

You lean into formal methods and formal verification. You want the rules to be part of the product, not a comment beside the code. Proof assistants like Lean 4 are one way to do that.

Maybe you run the tests and everything is green. Maybe you run them ten times because they are flaky. A proof closes the gap by guaranteeing a property holds for all inputs, not just the ones you or your agent decided to check.

Interface vs boundary

LLMs are great at inference, which makes them great at interface. They will decode your intent into something that looks right, and usually it is. An energy-based reasoning model (EBRM) takes that something and optimizes it until the checker agrees.

interface (LLM):   intent     -> candidate
reasoning (EBRM):  candidate  -> low-energy state
checker (proof):   state      -> accept | reject(trace)

The 4-color problem asks whether you can color every region on a map using at most four colors so that no two adjacent regions share the same color. Finding a coloring is hard (NP-hard, in fact!); verifying one is easy. This toy sandbox is an odd wheel: a hub plus a 15-region ring. The hub touches every ring region, which forces all four colors into play. The left panel generates a full candidate and hopes the checker accepts. The right panel scores the whole state and repairs conflicts until it converges.

Compare token-by-token decoding vs state scoring on a tight 4-color map. Run both and watch boundary rejections spike for the autoregressive path while the energy-based path repairs conflicts until it converges.

Boundary rule

If we treat model output as untrusted input, then every side effect flows through a deterministic checker that can accept or reject with a reason trail.

What the verifier sees

Shimware

Shimware ships and it works, but it wraps capabilities without moving the trust boundary. Most software falls somewhere on the spectrum from vaporware to proofware.

Term Value What it is
Vaporware zero announced and delayed into irrelevance
Vapidware (Nothingware) negative ships, but mostly filler
Shimware minuscule workflow wrapper; trust boundary unchanged
Proofware maximum formally verified boundaries; constraints enforced by a proof

A lot of modern tooling is shimware: glossy UI on top of remote execution. SaaS dashboards, collaborative design tools, agentic app makers. If the core is probabilistic, shimware just moves the uncertainty around.

Agentic coding tools differentiate like wine labels: enormous discourse about which is better, strong brand loyalty, and most users cannot tell them apart in a blind test.

SaaS is not dead as a billing model, but as an architecture for anything that can be generated and verified locally, it is shimware yesterday and vapidware today.

"Proof-by-definition": SaaS is shimware

Toy proof: once you pin down what you mean by shimware, you can say which layer you are shipping.

namespace Shimware

inductive Product where
  | saas
  | cli
  | localTool
  | boundary

def StrengthensInvariants : Product -> Prop
  | Product.boundary => True
  | _ => False

def IsShimware (p : Product) : Prop :=
  Not (StrengthensInvariants p)

theorem saas_is_shimware : IsShimware Product.saas := by
  simp [IsShimware, StrengthensInvariants]

end Shimware

The proof is trivial by design. If the definition says SaaS does not strengthen invariants, there is nothing left to prove. Either we start building at the boundary, or we keep iterating on the recursive excretion of pure vibe-slop.

The stack

If the browser is the sandbox and proofware is the product, the stack can use as few as three languages:

LLMs should dominate interface and EBRMs should rise wherever constraint satisfaction matters. Build the castles out of affiliate links and free trials if you want, as long as the sandbox is formally verified.