v0.1.0-next.40
v0.1.0-next.40
Released: 2026-06-12
Headlined by the lazy dev-render epic (PR #1029): zfb dev now renders pages on request instead of rebuilding every page on each file-change tick. Edits mark routes stale; the first request to a stale route triggers the render, guarded by a tick-vs-request exclusion so request-time writes never race the pipeline. Lazy mode is the default, with ZFB_DEV_EAGER as the escape hatch.
Features
Lazy dev rendering ON by default: file-change ticks mark pages stale instead of re-rendering them; pages render on first request.
ZFB_DEV_EAGER=1restores the eager behavior (#1027, 1976098).Lazy render adapter — request-time SSG render via staleness claim + renderer mutex + unified write path (#1026, 0ef6e67), with the render-on-request hook install gated on the boot-resolved lazy switch (fb2586e).
Live reload in lazy mode: SSE Page events fire on stale-marking ticks, and the dev client's EventSource is base-prefix-aware (#1027, 18dce4c).
Staleness state machine with the lazy eager-vs-stale split (#1025, 4eb7e1b), plus a
pages_staleoutcome signal and StaleProbe pipeline seam (9dcdb6d).Request-time write API with tick-vs-request exclusion (#1024, 3f028a7), hardened to a guarded write that revalidates under exclusion (#1017, 0cb5405).
zfb-server render-on-request hook seam — trait + handle + dispatch leg (#1020, 8a6ea36) — and a URL→route reverse-lookup index on DevRouteTables (#1019, 1b8d502).
Bug Fixes
The lazy-render claim is revalidated under pipeline exclusion before the request-time write, closing a stale-write window (#1017, f2982c7).
The boot initial render stays eager in lazy mode, so the first page load never waits on a cold render (#1025, dfb567f).
reset_cachenow takes the tick-vs-request exclusion too (#1024, 3a1a388).zfb devannounces the actual bound port, making--port 0output parseable (#1018, 24a2952).
Other Changes
New
dev_serve_e2eregression net driving a realzfb devedit→serve cycle (#1018), lazy dev-render contract scenarios with aZFB_DEV_EAGERsession (#1027), and inherited lazy-render env stripped from spawned dev sessions (562f90d).Smoke tests gained a dev-mode edit→serve assertion (#1022) with a hardened wall-clock-deadline poll (7acee9c); orchestrator-layer tick-class matrix for lazy staleness (#1025).
WriteCache write/dedup component extracted from DevAssetPipeline (#1021); SSE test helpers promoted to test-utils (#1018).
docs: lazy dev rendering default + env switches on dev-mode-lifecycle, and the adapter dispatch-flow comment updated for the default flip (#1027).