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 startedObligations
The dangerous case: the browser dispatched the request, then the timeout expired. “Failure” would be a false statement.
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 discardedIn 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 recordedUse any challenge above. Legal state changes appear here.
- → ·
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.
- 01Legal actions are projected capabilities, not reconstructed by the DOM.
- 02Stale evidence is rejected using explicit correlation state.
- 03OutcomeUnknown creates reconciliation work instead of a blind retry.
- 04Unsupported browser authority becomes a protocol decision, not an escape hatch.