F# WebAssembly demonstrations

Problems that are hard for the right reasons.

These are not counters or todo lists. Every interactive decision below is made by this site’s F# reference engine, running as WebAssembly behind the real Limen kernel. The browser still owns rendering and I/O. The application owns legality, evidence, authority, and what happens next.

Challenge 01

Release gate + ambiguous deployment.

Evidence → capability → approval → effect → reconciliation.

Can this release legally move?

Not started
TestsUnverified
SecurityUnverified
ApprovalNot approved
DeploymentNot started

The success and network-failure buttons use real Limen HTTP effects. The timeout-after-dispatch button deliberately injects an already-classified OutcomeUnknown into the F# state machine so this safety case is deterministic on a static GitHub Pages site. Limen's transport-level timeout classification is covered separately by kernel tests. The F# application then removes deploy capability and creates the reconciliation obligation.

Challenge 02

Make stale evidence arrive last.

A race condition without timers, so you can control the order yourself.

Overlapping policy checks

0 stale discarded

Latest requestnone
Accepted resultnone
Stale discarded0

In callback-shaped code, response A often wins simply because it runs last. Here the engine knows which correlation is current. Delivering A after B has started records the stale arrival but cannot mutate the accepted policy result. The check is pure F# state transition logic; no DOM timing rule is involved.

Challenge 03

Where does this decision belong?

Twelve cases chosen to be ambiguous if the boundary is not understood.

Task 1 of 12

0 of 0 so far

Two answers deliberately say Protocol change. That is part of the discipline: when Limen does not expose a capability, application code does not get to reach around the boundary with a convenient document.querySelector or clipboard read. The missing capability must become an explicit architecture decision.

Trace

The engine can explain what changed.

Newest first. This is projected application state, not a hidden kernel log.

Cross-boundary decisions

0 recorded

What these exercises prove

The boundary survives nontrivial state.

None of the examples requires Limen to learn release vocabulary, policy semantics, retry rules, or quiz answers. The browser side remains generic while the engine — F# on this site — becomes as complicated as the domain requires.

Inspect the self-hosting architecture →

  1. 01
    Legal actions are projected capabilities, not reconstructed by the DOM.
  2. 02
    Stale evidence is rejected using explicit correlation state.
  3. 03
    OutcomeUnknown creates reconciliation work instead of a blind retry.
  4. 04
    Unsupported browser authority becomes a protocol decision, not an escape hatch.