15 — Removed / not shipped¶
This chapter is the tombstone register. It exists so v1 migrators and readers cross-checking against blog posts can find out, in one place, what's gone, what was proposed but not shipped, and what to use instead.
If a row says "(proposed earlier)," that means the surface was named in an early draft of the v2 spec and dropped before ship. The replacement is canonical; the proposed name never existed at run-time.
| Removed / not shipped | What to do instead | Reference |
|---|---|---|
dispatch-with (master) |
(dispatch event {:fx-overrides {...}}) |
MIGRATION M-4 |
dispatch-sync-with (master) |
(dispatch-sync event {:fx-overrides {...}}) |
MIGRATION M-4 |
dispatch-to (proposed earlier) |
(dispatch event {:frame :todo}) |
002 |
subscribe-to (proposed earlier) |
(subscribe query-v {:frame :todo}) |
002 |
frame-dispatcher / bound-dispatcher / bound-subscriber (proposed earlier) |
(rf/frame-handle) — the keystone operation bundle; captures the frame at creation time and is safe to call during render and from async callbacks. |
002 |
dispatcher |
(:dispatch (rf/frame-handle)) or the dispatch injected in a reg-view body. |
002 |
subscriber |
(:subscribe (rf/frame-handle)) or the subscribe injected in a reg-view body. |
002 |
bound-fn (CLJS macro) |
(rf/frame-handle) — the keystone operation bundle. (bound-fn was first renamed frame-bound-fn, then EP-0024 Open Issue #8 retiered the frame-bound-fn / frame-bound-fn* closures to internal — frame-handle, or an explicit {:frame …} opt, expresses the real use cases.) |
002 |
current-frame |
Renamed to current-frame-id — returns a frame-id keyword. |
002 |
get-frame-db |
Renamed to app-db-value — returns the app-db VALUE (a plain map), nil for an unregistered / destroyed frame. The container accessor is the internal re-frame.frame/app-db-container. |
002 |
enable-performance-api-tracing! (proposed earlier) |
Performance-API instrumentation is gated on the compile-time re-frame.performance/enabled? goog-define, not a runtime toggle. See 11 — Instrumentation. |
009 |
add-trace-listener / remove-trace-listener (proposed earlier) |
register-listener! / unregister-listener! |
009 |
register-trace-listener / unregister-trace-listener (no-bang, proposed earlier) |
Renamed to register-listener! / unregister-listener! — the bang form matches the side-effecting nature of listener registration. |
009 |
Bare [:my-view "args"] keyword-tagged hiccup |
Var form [my-view "args"] (canonical) or [(rf/view :my-view) "args"] for late-binding by id. |
004 |
h macro (proposed earlier) |
Removed. Use the Var form [my-view "args"] or [(rf/view :my-view) "args"]. |
004 |
reg-global-interceptor |
reg-frame :interceptors — frame-level is the canonical "global within this frame." For cross-frame observation, use register-listener!. |
MIGRATION M-17 |
clear-global-interceptor |
No replacement needed — re-register reg-frame with an updated :interceptors vector (absent-key semantics clear it). |
MIGRATION M-17 |
reg-sub-raw |
reg-sub for app-db reads; Pattern-AsyncEffect for non-app-db sources; state machines for lifecycle; the 006 adapter contract for bridging external reactivity. |
MIGRATION M-18 |
re-frame.alpha/reg |
The shipped per-kind registrars: reg-event / reg-sub / reg-fx / reg-cofx / reg-flow. (The v1 event trio reg-event-db / reg-event-fx / reg-event-ctx is not a v2 target — those are removed/withdrawn throwing stubs and migration inputs only, see the rows below and EP-0018; reg-event is the single event-registration form.) The re-frame.alpha namespace is dissolved. |
MIGRATION M-23 |
re-frame.alpha/sub |
Vector-form (rf/subscribe [::id arg]). |
MIGRATION M-23 |
re-frame.alpha/reg-sub-lifecycle and built-in lifecycle policies (:safe, :no-cache, :reactive, :forever) |
Sub-cache uses a single algorithm — synchronous ref-counting (dispose on derefer-count → 0). For specific edge cases, file a follow-up bead. | MIGRATION M-23 |
debug interceptor |
Trace surface (Spec 009) + 10x / re-frame-pair | MIGRATION M-21 |
trim-v interceptor |
Canonical map-payload call shape | MIGRATION M-21 |
on-changes interceptor |
Flows (Spec 013) | MIGRATION M-21 |
enrich interceptor |
Flows (derived state) / :schema (validation) / custom ->interceptor (escape hatch) |
MIGRATION M-21 |
after interceptor |
Registered fx (:fx [[:my-fx ...]]) for side-effects; custom ->interceptor for context-shaped work; vendor from v1 if the helper is wanted as a local utility |
MIGRATION M-21 |
inject-cofx / inject-cofx* (coeffect-delivery interceptors) |
Declare the facts a handler needs with :rf.cofx/requires registration metadata; the runtime supplies them. Register the supplier with value-returning reg-cofx. There is no interceptor that delivers a coeffect — see 01 — Core §reg-cofx and Guide — Effects and coeffects. |
EP-0017 |
reg-event positional interceptor vector middle slot |
Put the chain in registration metadata: (reg-event :id {:interceptors [i1 i2]} handler). If a call also has metadata, merge :interceptors into that map. |
MIGRATION M-70 |
reg-event-db |
Use reg-event (no alias). Destructure :db from the coeffects map and wrap the return in {:db …}: (reg-event id (fn [{:keys [db]} ev] {:db BODY})). A stale call raises the always-on hard error :rf.error/reg-event-db-removed naming reg-event. |
EP-0018 / MIGRATION M-73 |
reg-event-fx |
Use reg-event (no alias) — the identical shape under the bare name (coeffects in, effects out); just rename the call. A stale call raises :rf.error/reg-event-fx-removed. |
EP-0018 / MIGRATION M-73 |
reg-event-ctx |
Demoted to a framework-internal primitive. Express application full-context work as a registered interceptor (reg-interceptor with :before / :after, referenced by id from a reg-event registration's :interceptors chain — EP-0022). A stale public call raises :rf.error/reg-event-ctx-removed naming reg-interceptor. |
EP-0018 / MIGRATION M-73 |
with-overrides (v1 macro name) |
Renamed to with-fx-overrides. |
MIGRATION M-50 |
add-marks / set-marks (imperative app-db path-marks) |
Declare durable app-db classification on the frame: reg-frame :sensitive / :large {:app-db [...]} path maps. The underlying re-frame.marks/* fns remain internal/test helpers only. |
EP-0015 / 015 |
redact-interceptor (positional payload-scrub interceptor) |
Classify transient payloads on the registration: reg-event-* :sensitive / :large metadata. Projection happens centrally at egress, not via interceptor placement. |
EP-0015 §7 / 015 |
Schema-attached :sensitive? / :large? as the app-db classification route |
app-db classification is frame-owned (above). Per-slot :sensitive? / :large? Malli props remain the route for owner-local schema'd data — machine :data, resource data/params, HTTP :decode bodies. |
EP-0015 §8 / 015 |
:rf.privacy/show-sensitive? / set-show-sensitive! (process-global on/off privacy toggle) |
There is no process-global toggle. On-box visibility is a named :rf.egress/* profile per (tool, frame) — :rf.egress/local-redacted (default, fail-closed) / :rf.egress/local-raw (trusted-local opt-in). |
EP-0015 issue 7 / 015 |
Why these went¶
A few one-line rationales for the larger cuts:
- The frame-affordance surface (
dispatcher,subscriber,bound-fn, and — under EP-0024 — theframe-bound-fn/frame-bound-fn*closures) — the multi-frame surface had accreted ~8 affordances that were mostly patches around one root cause: ambient frame lookup doesn't survive async boundaries. The redesign collapses them so you choose by INTENT, not mechanism — hold a frame's ops as a value viaframe-handle(the one public carry primitive), scope withwith-frame/with-new-frame/frame-provider, override per-call with{:frame …}.dispatcher/subscriberfolded into(:dispatch (rf/frame-handle))/(:subscribe (rf/frame-handle));bound-fnwas renamedframe-bound-fn, and EP-0024 Open Issue #8 then retieredframe-bound-fn/frame-bound-fn*to internal (:tier :implementation) sinceframe-handleexpresses the real use cases. Full design: Spec 002 §The multi-frame surface. reg-global-interceptor— the v1 surface conflated "global" (process-wide) and "global within this frame" (frame-wide). The frame-wide answer isreg-frame :interceptors; the process-wide answer isregister-listener!(observation, not mutation). Splitting the two ended the confusion.reg-sub-raw— the v1 escape hatch covered four distinct use cases (app-db reads, async sources, lifecycle, external reactivity). Each now has its own surface —reg-sub, Pattern-AsyncEffect, state machines, the adapter contract — and the escape hatch isn't necessary.re-frame.alpha— the alpha namespace was an experiment to unify registration / dispatch under genericreg/sub/disverbs. The unification didn't pay for itself — the per-kind macros read better at the call site and survive better in the linter — and the alpha namespace is dissolved. No APIs in this reference live outsidere-frame.core(with the documented per-namespace exceptions).- The five v1 interceptors (
debug,trim-v,on-changes,enrich,after) — each was either trivially->interceptor-able (so didn't earn its own surface), or replaced by a richer mechanism (flows, schemas, the trace surface). inject-cofx/inject-cofx*— EP-0017 made coeffect delivery a declared contract, not an interceptor side-channel. A handler lists the world facts it consumes in:rf.cofx/requires, suppliers are value-returningreg-cofxfns, and the runtime grades/records facts by id. Injecting a coeffect through the interceptor vector hid the dependency fromhandler-meta, the cofx graph, and the recordable-fact grading, so the interceptor form was removed. Full model: Guide — Effects and coeffects.- The pre-EP-0015 privacy surfaces (
add-marks/set-marks/redact-interceptor/ schema-attachedapp-dbmarks / the process-global:rf.privacy/show-sensitive?toggle) — five overlapping ways to express one fact. EP-0015 collapsed them to one model: classification is declarative and local to the owner (frame config for durableapp-db; per-slot schema props for owner-local schema'd data; registration metadata for transient payloads), projection is centralized at trust boundaries (project-egress+ the closed:rf.egress/*profile enum), and sinks consume already-projected records. The full teaching is Guide ch.23.
See also¶
- MIGRATION.md — the AI-driven migration spec, with one rule per row above.
- 01 — Core — the surfaces that replaced the removed ones.