The Reactivity Contract

You do not have to learn how WildflowerJS keeps the page current. You declare state, bindings, and methods. The framework schedules every update, so there is no update loop to run and no re-render model to learn.

Other frameworks put their update machinery in your code. A component file imports it by name, as useState, ref, signal, or effect, and you add those calls to every file you write. A WildflowerJS file imports nothing.

An edge is a place where the internal machinery shows through. A write does not repaint, a computed goes stale, the browser strips a template before the framework sees it, or a read costs a hundred times what it looks like. Every abstraction has edges. When you hit one, you have to understand the machinery behind the page after all.

Every reactive framework has edges, and the well-documented ones list them as rules for hooks, reactivity caveat pages, and lists of what not to destructure. Those pages teach the machinery because in those frameworks the machinery is part of the API you write all day. WildflowerJS keeps the machinery out of the API. You never import a signal, wrap a ref, or declare a dependency, so the edges come down to a list short enough to enumerate and track, and that list is the contract.

We keep an internal ledger of every edge we know of, 54 today. Each edge has a status, and the release gate enforces it. A new edge cannot land without a status, and every status has to cite a test or a documentation page that exists, or the build fails.

The machinery-exposure score

The contract covers the edges we know about. It cannot cover the ones we missed, so we also measure. We ask an AI model that has never seen WildflowerJS to build complete apps from the public documentation, then scan every generated file for framework timing calls, re-render workarounds, hand-rolled update loops, observers watching framework output, and manual dirty flags. The 2026-07-17 run scored 0 across 100 generated apps. None of the generated files contained any of them. The 2026-09-13 run against 1.5.1 scored 2 across 57 generated apps: one simulation task drove its own frame loop in two of its three builds. The documentation change that followed removed it in every rerun. We measure again every release.