Skip to content

Enhancement Proposals (EPs)

Design proposals for re-frame2 which follow the Python Enhancement Proposal model. The project goal is to drive the coding work using detailed specifications (which are just really good prompts), and these EPs are an example of such prompts.

The EP process itself — types, status lifecycle, durability rules, and the EP-worthiness bar — is normative in EP-0009. This README is only the index and summary.

Authoring a new EP

Copy EP-template.md to EP-NNNN-<slug>.md, fill it in, and add an index row below. The template encodes the active-process rules so a new EP follows them by construction: Status: is a controlled lifecycle (not free text), Type: is standards-track or process, and graduation is per-type — standards-track into spec/, process into its named normative home (which may be the active EP itself). The full process — including the EP-worthiness bar and the document conventions — is normative in EP-0009. scripts/check_ep_status_sync.py is the mechanical gate (status/Type grammar + README/header sync).

Index

EP Title Status Summary
EP-0001 Frame App/Runtime Partitions final A frame owns two durable partitions — user-owned app-db (:db) and framework-owned runtime-db (:rf.db/runtime) — committed coherently by one cascade, removing the footgun where a fresh :db return clobbers runtime state.
EP-0002 Explicit Frame Target Resolution final Remove the ambient :rf/default fallback; frame-scoped operations resolve their target from explicit frame context, and missing context fails instead of touching the wrong frame.
EP-0003 Resource Queries final An optional day8/re-frame2-resources artefact for declarative server-state — the re-frame2 answer to TanStack Query / RTK Query / SWR — with resource identity, caching, invalidation, a frame work-ledger substrate, lifecycle/GC, and route + SSR preload. HTTP-only scope graduated to the normative spec/016-Resources.md; GraphQL deferred.
EP-0004 Parametric Subscription Inputs final Restore v1's two-function reg-sub shape via input functions that return a vector of query vectors, keeping :<- as static-input sugar and dependencies pure, inspectable, JVM-runnable, and Xray-visible.
EP-0005 Machine :data Schema final Rename reg-machine's :schema key to :data-schema for the machine's :data context, close the schema→marks redaction bridge, switch machines-viz to declared-over-inferred Context shape, and document XState v5 parity.
EP-0006 Runtime Subsystem Contract final Name the five-clause shape every :rf.runtime/* child already implements — reserved sub-tree, write authority, read API, projection policy, teardown contract — as a gradeable contract (the durable-state analogue of Managed-Effects), with a grading table for the existing subsystems and a graduation checklist for EP-0003's. Graduated into spec/Runtime-Subsystems.md; the two derived rules ported there too.
EP-0007 One Name Per Fact active The naming rulebook — one canonical spelling per fact per layer, no stable accepted synonyms, cross-layer vocabulary distinctions recorded as rules — plus the finite sweep of current instances (frame stamp, partition prefixes, work-ledger identities, redirect synonyms, reg-*/register-*, the :schema family).
EP-0008 Production Observability Channels final Name the three failure-category channels (causal / diagnostic / always-on error) and the promotion criterion for production-survivable failures; audit the error catalogue against it and fix the gaps. Graduated into spec/009-Instrumentation.md (channel contract + catalogue channel column). Frame-teardown failures — previously production-silent — promote to a single always-on :rf.error/frame-teardown-failed report (Open Issue 1, ruled); implementation tracked in the errata ledger.
EP-0009 The EP Process active The PEP-1 analogue: EP types (standards-track / process), status/type grammar, the full status lifecycle (incl. rejected / withdrawn / deferred / superseded-by — all kept), the durability rules, the errata-ledger pattern, and the EP-worthiness bar.
EP-0010 Causal World Inputs final Make replay determinism literal by requiring time, randomness, UUIDs, and other host facts that affect durable frame-state to arrive on causal envelopes or explicit coeffects, while keeping ambient reads for diagnostics and host-transient scheduling. Core slice graduated into spec/002-Frames.md §Recordable coeffects (the envelope field :rf.world/inputs was later renamed to :rf.cofx by EP-0017); remaining wave steps tracked in the EP's errata ledger.
EP-0011 Uniform Async Reply Envelope final Define one normalized continuation/reply shape for managed asynchronous effects so HTTP, resources, timers, routing, and machines can share work-ledger correlation, stale suppression, cancellation, tracing, and causal completion metadata. Canonical contract graduated to spec/Managed-Effects.md §Property 9; all four shipped async families lower onto the one re-frame.reply substrate and the inheritance claim is conformance-proven by a test-only managed-timer probe. Two non-blocking follow-ups (rf2-lohbfg, rf2-mdjzs0) tracked in the implementation-errata ledger.
EP-0012 Path Optics And Canonical Forms final Define one lightweight :rf/path vocabulary, canonical EDN identity for params/scopes/work ids, and routing parse/print round-trip laws so path and identity semantics stop being redefined per subsystem.
EP-0013 App Values And Runtime Realms superseded-by EP-0023 Define the long-term architecture where app programs are composable values installed into runtime realms that own registrar, adapter, capabilities, and host-transient subsystem state, with today's global reg-* calls retained as default-realm sugar. The realm container (D1) and the app-value projection/construction/install surface (D2) shipped and graduated into spec/Runtime-Subsystems.md §Runtime realms; a v1 constructed realm is a static-install + query-isolated container. EP-0023 partially supersedes the public app/realm surface (the image -> frame -> event stream model); EP-0013's isolation decisions and realm machinery are retained as the internal installation substrate, and the live-resolution invariant is realized at the frame boundary.
EP-0014 Derivation And Process Algebra final Name the common model behind subscriptions, runtime subscriptions, flows, resources, and machine selectors as declared inputs, output, storage, evaluation, and lifecycle, while keeping existing APIs as source forms.
EP-0015 Frame-Owned Egress Policy final Define one public model for sensitive/large classification, trust-boundary projection, and observability sink policy: frame-owned durable policy, registration-owned transient policy, centralized projection, and projected sinks.
EP-0016 Resource Mutation Completion, Scoped Invalidation Targets, And Named Scope Resolution final Complete the RealWorld-exposed Spec 016 gaps: mutation reply continuations, mixed-scope invalidation, named scope resolvers, populate-as-authoritative-load, map-form exact targets, and managed-HTTP request-decoration doctrine while deferring optimistic rollback.
EP-0017 Recordable Coeffects final Unify the coeffect surface around "durable state folds facts, never reads": rename :rf.world/inputs to a flat :rf.cofx, add :rf.cofx/requires declared-only delivery for both coeffect grades, remove inject-cofx, make reg-cofx a value-returning graded registrar (app-owned generators, provided boundary facts, :rf/time-ms as the one framework registration), and enforce strict replay/test modes.
EP-0018 One Event Registration Surface final Collapse the three public event forms to one — reg-event (= today's reg-event-fx, coeffects in / effects out): remove reg-event-db, demote reg-event-ctx to framework-internal (full-context work moves to interceptors), closing the EP-0017 hole where a db handler cannot declare coeffects. Seven design decisions ruled; sequenced behind EP-0017.
EP-0019 Optimistic Mutation Rollback For Resources final The optimistic-write follow-on EP-0016 issue 9 defers: a registration-level :optimistic forward plan (the twin of :patches) applied before the server confirms, with a runtime-recorded snapshot inverse + per-entry revision token, a deterministic commit/rollback/reconcile settle protocol, conflict-aware :on-conflict :invalidate (defer to the read path, the divergence from TanStack/SWR's unconditional restore), tag-addressed :optimistic-tags for cross-view consistency, and the reserved instance/trace slots filled. Graduated into spec/016-Resources.md §Optimistic mutations. Closes the most visible TanStack/RTK/SWR parity gap.
EP-0020 Active-Owner Polling For Resource Revalidation final Add a declarative :poll-interval-ms resource policy that revalidates an active-owner entry on a fixed interval — owner-driven (not component-driven), pausing on owner release and hidden tab — reusing the landed stale/GC advisory-timer substrate and the focus/reconnect scan-and-refetch core. Graduated into spec/016-Resources.md §Polling; completes the deferred polling slice of Spec 016.
EP-0021 Infinite Resources And Load-More Feeds final Add a first-class infinite-resource / load-more primitive to Spec 016 (the reserved :infinite key): one scoped entry per feed with pages accumulated as the ordered durable value, a pure :next-page-param derivation (nil = terminal), a causal :rf.resource/load-more event, and a merged-list + page-metadata subscription family. Aligns to TanStack useInfiniteQuery / SWR useSWRInfinite with three re-frame2 divergences (runtime-owned cursor, single nil terminal, fail-closed scoped feed identity). Graduated into spec/016-Resources.md; seven open questions + the :request signature resolved (see EP Resolved Decisions).
EP-0022 Registered Interceptors final Make interceptors first-class registered program facts after EP-0018: application interceptors are authored with reg-interceptor, event/frame chains carry serializable refs only, overrides match exact refs, frame metadata remains the frame-local global mechanism, and :rf.interceptor/path is the sole standard interceptor because it is coupled to app-db commit no-op semantics. unwrap migrates to handler destructuring or project registration.
EP-0023 Images And Frame-Loaded Instruction Sets final Replace the public EP-0013 app/realm teaching surface with image-loaded frames: rf/image selects registration sets, frames run sealed image generations, namespace provenance enables same-id examples without clobbering, and public operations target the frame while realms remain internal installation machinery. Graduated 2026-06-16; partially supersedes EP-0013.
EP-0024 Unified Frame Identity And Lifecycle final Finish the post-EP-0023 frame collapse: one live frame value, one registry, one public frame-target grammar, explicit UI-owned lifecycle, and named generation reads if registrar tooling needs them.