Ownership Matrix¶
Type: Reference The single source for "where does X live?" — every contract surface in re-frame2 has exactly one canonical home; other docs may reference the surface, but those references are informational and must not redefine the contract. Use this matrix to navigate, and to detect drift if a definition ever appears in a non-owning doc.
Every contract surface in re-frame2 has exactly one canonical home. Most canonical homes live in the /spec tree — that is the language-agnostic pattern. A small, deliberate set of contract surfaces has an external canonical home outside /spec, sanctioned by README §Canonical homes outside /spec): a tool-shared contract whose home stays with the tool artefact (tools/<tool>/spec/), or a CLJS-reference binding of a pattern-level obligation that ships in the implementation tree (implementation/...). External-home rows are flagged in the table below; they are indexed from this matrix even though they live elsewhere.
Other docs may reference any surface, but those references are non-normative — they cite the canonical home rather than redefining the contract. The "Referenced in" column lists those informational mentions.
Host scope. The pattern itself is scoped to the eight in-scope JS-cross-compile hosts defined in 000 §The pattern. Companion-doc rows below describe pattern-level contracts; non-target server-side hosts (Python, Ruby, Rust, server-side Kotlin / Java / Swift) are out of scope as first-class implementation targets, and surfaces that look "host-specific" are scoped to those eight.
The Artefact column names the Maven artefact that ships the surface in the CLJS reference. Surfaces marked core (split pending: <bead>) are currently in day8/re-frame2 and will move to day8/re-frame2-<feature-id> under the named bead (the concrete id is in the Artefact cell of each such row). The packaging architecture (artefact tiers, naming, independence rule) is normative in Conventions §Packaging conventions.
| Contract surface | Canonical home spec | Artefact | Referenced in (informational) |
|---|---|---|---|
| Goals, hard constraints, host-profile matrix, identity primitive, minimal-core contract | 000-Vision | spec-only (no runtime artefact) | Principles, Implementor-Checklist, API |
Registration grammar (reg-* shape, metadata map, single superset metadata-map middle slot carrying :interceptors — the positional interceptor vector is retired per EP-0022) |
001-Registration | day8/re-frame2 (core) |
API, Spec-Schemas §:rf/registration-metadata, Construction-Prompts |
Registry kind taxonomy (the canonical kind keyword set) |
001-Registration | day8/re-frame2 (core) |
API, Spec-Schemas |
| Source-coordinate capture (macro-driven, CLJS reference) | 001-Registration | day8/re-frame2 (core) |
Tool-Pair, 009-Instrumentation (trace events carry coords) |
| Hot-reload semantics for registrations | 001-Registration | day8/re-frame2 (core) |
002-Frames (sub-cache invalidation) |
Registry query API (registrations, handler-meta, frame-ids, frame-meta — registrar contract) |
001-Registration | day8/re-frame2 (core) |
002-Frames §The public registrar query API (re-tabulates alongside frame-runtime queries), Tool-Pair, 007-Stories |
Frame-runtime queries (app-db-value, snapshot-of, sub-topology, sub-cache) |
002-Frames | day8/re-frame2 (core) |
Tool-Pair, 008-Testing |
| Frame model, identity, lifecycle, carried-frame target resolution (EP-0002) | 002-Frames | day8/re-frame2 (core) |
API, Spec-Schemas |
Event handlers — reg-event, the one public event-registration form (coeffects in, a closed effects-map out; the two-arg (coeffects, event) → effects-map contract; reg-event-db / reg-event-fx / reg-event-ctx collapsed to the single reg-event per EP-0018) |
002-Frames | day8/re-frame2 (core) |
001-Registration (:event kind + the retired event-registration names), API, Construction-Prompts CP-1, Pattern-AsyncEffect |
Dispatch envelope (dispatch, dispatch-sync, explicit-frame addressing, two-arg form) |
002-Frames | day8/re-frame2 (core) |
API, Tool-Pair |
subscribe (frame-bound and global forms; reg-sub registration surface) |
002-Frames | day8/re-frame2 (core) |
006-ReactiveSubstrate (the runtime cache & derivation graph the surface consumes), API, Construction-Prompts CP-2 |
| Subscription runtime — derivation graph, sub-cache, invalidation, change tracking, layer-1/2/3 semantics | 006-ReactiveSubstrate | day8/re-frame2 (core) |
002-Frames (registration & call-site surface), 008-Testing (compute-sub) |
Projection-equality pattern-contract — one physical frame-state container + two cached partition-projection reactions (app-db / runtime-db); the per-partition propagation rules (runtime-only / app-only / both commits) that fall out of make-derived-value's memoised equality |
006-ReactiveSubstrate §Frame-state container and partition projections | day8/re-frame2 (core) |
002-Frames (the two-partition frame contract states the split and defers the substrate mechanism here) |
subscribe-once (one-shot, non-reactive read; subscribe + deref + immediate unsubscribe) |
006-ReactiveSubstrate | day8/re-frame2 (core) |
API, 002-Frames (call-site surface), 008-Testing (compute-sub for the cache-bypassing pure equivalent) |
unsubscribe (explicit teardown; ref-count decrement; pairs with imperative subscribe) |
006-ReactiveSubstrate | day8/re-frame2 (core) |
API, 002-Frames (call-site surface) |
frame-provider name family (CLJS reference; the per-adapter React-context components — frame-provider is the UI-owned lifecycle boundary (create-on-mount / provide id / destroy-on-unmount, takes make-frame opts), frame-provider-existing is the SCOPE-only sibling that plumbs an already-created frame id to a subtree; per EP-0024) |
002-Frames | day8/re-frame2 (core) |
004-Views, 007-Stories |
Effect-map shape (closed top-level set #{:db :fx :rf.db/runtime} — :rf.db/runtime reserved, framework-authority only, per EP-0018) |
002-Frames | day8/re-frame2 (core) |
Spec-Schemas §:rf/effect-map, API |
Effects (reg-fx) |
002-Frames | day8/re-frame2 (core) |
API, Pattern-AsyncEffect, 011-SSR (:platforms) |
Coeffects — the reg-cofx registrar contract (value-returning supplier; the ambient / recordable grades, :recordable? true / :provided? true) and the :rf.cofx/requires declaration key (EP-0017) |
001-Registration §Coeffects (registrar contract + grades + :rf.cofx/requires) |
day8/re-frame2 (core) |
002-Frames §Recordable coeffects (the flat :rf.cofx envelope field + delivery), API, Spec-Schemas §:rf/cofx-meta / §:rf.cofx/requires, 011-SSR (:platforms) |
| Run-to-completion drain semantics | 002-Frames | day8/re-frame2 (core) |
005-StateMachines (drain interaction), 008-Testing (synchronous triggers) |
Registered interceptors — reg-interceptor / reg-interceptor* (the :interceptor registry kind: named full-context context -> context behaviour, referenced by id from event / frame :interceptors chains); the framework-standard [:rf.interceptor/path …] reference (EP-0022) |
001-Registration §Interceptors (registrar kind + descriptor + metadata) | day8/re-frame2 (core) |
002-Frames §Registered interceptors and the chain grammar (by-reference chains + overrides + standard :rf.interceptor/path), API, 009-Instrumentation |
Per-frame and per-call overrides (:fx-overrides, :interceptor-overrides, :interceptors) |
002-Frames | day8/re-frame2 (core) |
008-Testing, 007-Stories |
| Machines-as-event-handlers foundation hooks | 002-Frames | day8/re-frame2 (core) |
005-StateMachines (full grammar) |
View contract and reg-view (pure (state, props) → render-tree, Form-1/2/3) |
004-Views | day8/re-frame2 (core) |
API, 011-SSR, Construction-Prompts CP-4 |
State machine grammar and reg-machine (transition table, :always, :after, :spawn, :spawn-all, hierarchical states, :tags, :type :parallel + :regions, snapshot shape) |
005-StateMachines | day8/re-frame2-machines |
CP-5-MachineGuide, Pattern-NineStates, Pattern-WebSocket, Pattern-Boot, Pattern-LongRunningWork |
| Reactive substrate contract + reference adapters (Reagent default, plain-atom for JVM) | 006-ReactiveSubstrate | day8/re-frame2 (core) — substrate contract + plain-atom adapter; the Reagent adapter ships in day8/re-frame2-reagent |
008-Testing, 011-SSR |
UIx adapter (use-subscribe hook, flush-views! test flush, source-coord wrapping component, UIx-side frame-provider) |
006-ReactiveSubstrate | day8/re-frame2-uix |
API, Conventions (adapter shipping convention) |
Helix adapter (use-subscribe hook, flush-views! test flush, source-coord wrapping component, Helix-side frame-provider) |
006-ReactiveSubstrate | day8/re-frame2-helix |
API, Conventions (adapter shipping convention) |
Shared React frame Context (factored out so every React-shaped adapter consumes the same createContext object) |
002-Frames, 006-ReactiveSubstrate | day8/re-frame2 (core) — re-frame.adapter.context, CLJS-only; consumed by day8/re-frame2-reagent, day8/re-frame2-uix, and day8/re-frame2-helix |
API |
| Stories / Variants / Workspaces | 007-Stories | post-v1 | 008-Testing (portable-stories-as-tests) |
Testing infrastructure (fixtures, synchronous triggers, per-test stubs, headless evaluation, framework adapters, JVM-runnable suites; the two test-only namespaces ship in the same artefact as siblings split on the assertion axis per 008-Testing §Audience-split — re-frame.test-support is the runtime-state axis (registrar, frames, app-db, drain, in-flight requests): fixture machinery (snapshot-registrar, restore-registrar!, with-fresh-registrar, make-reset-runtime-fixture), event sequencing (dispatch-sequence), the assert-*-equals fn-family (assert-path-equals, assert-db-equals — mirrors the :rf.assert/* Story event-family), bounded-deadline polling (poll-until); re-frame.test-helpers is the view-tree axis (hiccup data, :data-testid selectors, attached handlers) — hiccup-walk finders (find-by-testid / find-all-by-testid / find-by-testid-prefix, find-by-attr / find-all-by-attr / find-by-attr-prefix), tree readers (expand-tree, attrs, children, text-content), handler reach (extract-handler, invoke-handler), single-frame e2e fixture trio (with-app-fixture, expect-text, wait-until), authoring helper (testid)) |
008-Testing | day8/re-frame2 (core) — re-frame.test-support and re-frame.test-helpers ship in the core artefact |
API, 007-Stories, 011-SSR (render-to-string as the HTML-string view-test sibling of hiccup-walk), conformance/ |
| Trace event model (envelope, ids, listener API) | 009-Instrumentation | day8/re-frame2 (core) |
Tool-Pair, API |
:rf.cascade/captured emit shape — focused-event-only per-epoch cascade-DAG aggregator; end-of-epoch emit via the :trace.cascade/capture-for-epoch! late-bind hook when the installed focus predicate matches |
009-Instrumentation §Trace event emission catalogue | day8/re-frame2 (core) |
Tool-Pair, 006-ReactiveSubstrate (memo skip interaction) |
Always-on event-emit substrate — register-listener! / unregister-listener! (the :events stream); one tight record per processed event ({:event :event-id :frame :time :outcome :elapsed-ms}); post-elision; survives goog.DEBUG=false and -Dre-frame.debug=false; per-listener exceptions isolated |
009-Instrumentation §What is available in production builds | day8/re-frame2 (core) |
API §Event-emit, Security §Production gates, Tool-Pair |
Always-on error-emit substrate — register-listener! / unregister-listener! (the :errors stream); union of three record shapes: the per-event error record ({:error :event :event-id :frame :time :exception :elapsed-ms}, fanned out by dispatch-on-error! per production-reachable per-event :rf.error/*), the frame-teardown report ({:error :rf.error/frame-teardown-failed :frame :hook-failures :reason :recovery :time}, one bounded record per destroy with failed cleanup hooks — EP-0008 promotion criterion), and the six EP-0008-promoted SSR non-event categories (ssr-render-failed / ssr-streaming-writer-failed / malformed-hydration-payload incl. a frameless :frame nil sub-path / ssr-head-resolution-failed / sanitised-on-projection / ssr-ring-error-view-failed) — the last two shapes ride the general dispatch-error-record! helper; listeners branch on (:error record) (the non-event arms carry no :event / :event-id); post-elision; survives goog.DEBUG=false and -Dre-frame.debug=false; per-listener exceptions isolated. Recovery is framework-owned (the per-category typed defaults); the per-frame :on-error recovery policy was removed |
009-Instrumentation §What is available in production builds | day8/re-frame2 (core) |
API §Error-emit, Security §Production gates, 013-Flows §Failure semantics (flow-eval-exception path) |
Error contract (structured trace events; framework-owned per-category recovery); the §Error event catalogue is the single source of truth for every :rf.error/*, :rf.warning/*, :rf.fx/*, :rf.cofx/*, :rf.ssr/*, :rf.epoch/*, :rf.http/*, :rf.frame/*, :rf.route.nav-token/* category — id · :op-type · trigger · default :recovery · :tags |
009-Instrumentation | day8/re-frame2 (core) |
API, all Specs that emit errors cite this section |
Schema attachment (:schema, reg-app-schema), validation timing, dev-vs-prod elision, validator-fn extension point |
010-Schemas | core (split pending → day8/re-frame2-schemas) |
001-Registration §Schema integration, Spec-Schemas |
SSR flow (server frame lifecycle, hydration payload, :rf/hydrate, hydration-mismatch detection) |
011-SSR | day8/re-frame2-ssr |
004-Views, 008-Testing, 012-Routing |
Streaming SSR (:rf/suspense-boundary hiccup marker, per-request continuations registry, per-subtree hydration deltas, chunk-ordering contract, inline-fallback failure semantics) |
011-SSR §Streaming SSR | day8/re-frame2-ssr (re-frame.ssr.streaming ns — primitive) + day8/re-frame2-ssr-ring (re-frame.ssr.ring.streaming ns — chunked-HTTP host adapter) |
011-SSR, API, Conventions (:rf/suspense-boundary reserved hiccup head) |
:platforms metadata on reg-fx/reg-cofx; pure hiccup → HTML emitter |
011-SSR | day8/re-frame2 (core) — :platforms metadata; the hiccup→HTML emitter ships in day8/re-frame2-ssr |
002-Frames, API |
Route grammar, :route sub, navigation events, route-not-found, navigation-blocking, fragments, scroll restoration |
012-Routing | day8/re-frame2-routing |
011-SSR, API |
Flows (reg-flow / :rf.fx/reg-flow / :rf.fx/clear-flow, computed-state declarations materialised into app-db) |
013-Flows | day8/re-frame2-flows |
API, Conventions (:rf.fx/* reserved) |
Managed HTTP requests (:rf.http/managed fx, args-map shape, decode pipeline, :accept normalisation, retry-with-backoff, abort surface, frame-aware reply addressing, eight-category :rf.http/* failure taxonomy, schema-reflection metadata, canned stubs, with-managed-request-stubs) |
014-HTTPRequests | day8/re-frame2-http — production fx surface in re-frame.http.managed; canned-stub fxs and the with-managed-request-stubs family of macros / fns in the sibling re-frame.http.test-support |
API, Spec-Schemas, Conventions (:rf.http/* reserved), Pattern-AsyncEffect, Pattern-RemoteData, Pattern-StaleDetection, 009-Instrumentation (:rf.http/retry-attempt trace) |
Data classification (EP-0025) — a hygiene helper (NOT security; fail-open). Durable app-db paths classified by four commit-plane effects (:sensitive / :large / :clear-sensitive / :clear-large, applied WITH the :db write) into a per-frame :rf.runtime/elision registry; transient payloads by :sensitive / :large registration metadata on reg-event / reg-fx / reg-cofx / reg-sub; subsystem instance data by projection-relative :sensitive / :large declarations on reg-machine / reg-resource / reg-mutation / reg-route, lowered per instance. :rf/redacted / :rf.size/large-elided display sentinels; sensitive-wins-over-large; NO propagation, NO value-match/taint, NO frame :sensitive annotation (both the :app-db durable block and the :http carrier block removed), NO durable-state schema-prop classification, NO imperative add-marks / set-marks API (all removed by EP-0025). The HTTP carrier capability rides the :rf.http/managed reg-fx registration (:carriers block — the transient-payload case); the frame :observability sink policy survives on the frame validate! seam. |
015-Data-Classification | day8/re-frame2 (core) — the re-frame.classification + re-frame.elision + re-frame.projection impl surface is core-owned and boot side-effect-required (never a separable artefact); the dev-only trace-projection surface is interop/debug-enabled?-gated and DCEs out of :advanced + goog.DEBUG=false CLJS bundles via goog.DEBUG, while the reg-time validate-classification! validator, the commit-plane effect applier (re-frame.elision/apply-classification-effects), and the redact-event-by-registration egress redactor are always-on and survive production |
001-Registration (registration metadata-map shape), 002-Frames (the four commit-plane effects + event-arg shape), 005-StateMachines (machine projection-relative :data declaration, lowered per actor), 006-ReactiveSubstrate (registration-owned sub-output classification — no propagation), 009-Instrumentation (trace-bus emission of sentinels), 010-Schemas (schemas validate + drive validation-failure-trace redaction only — not durable app-db classification), 013-Flows (flow output classification, :source :flow), Conventions (reserved commit-plane effects + sentinel keywords + :rf.runtime/elision), Security (pattern-level privacy posture this Spec grounds), tools/mcp-base/spec/sensitive.md, tools/mcp-base/spec/elision.md (cross-MCP wire-elision walker consumers) |
Resources — declarative server-state (HTTP-only): reg-resource / clear-resource, resource identity [cache-scope resource-id canonical-params], fail-closed scope policy (no silent global default), active owners vs causes (per-kind release authority), the compact lifecycle FSM + :refresh-error status semantics, the :rf.resource/* events/subs/accessors, the :rf.runtime/resources cache + neutral :rf.runtime/work-ledger runtime subsystems, dedupe / stale-reply suppression / GC, route :resources, SSR preload/hydration, and restore/replay reconciliation. Mutations (reg-mutation / clear-mutation / :rf.mutation/execute, instance-keyed) and the EP-0016 action-wave surfaces: call-site :reply-to mutation continuations (D1), per-target scoped invalidation descriptors (D2), populate-as-authoritative-load + :refetch-populated? (R1), map-form exact targets (R2), and request-decoration doctrine via the Spec 014 seam (R3). The named normative home of EP-0003 (HTTP-only scope), EP-0016 (mutation completion / scoped invalidation / named scope resolvers), and EP-0019 (optimistic mutation rollback — :optimistic / :optimistic-tags / :on-conflict + the commit/rollback/reconcile settle protocol); GraphQL deferred |
016-Resources | day8/re-frame2-resources (post-v1 optional artefact) |
EP-0003, EP-0016, 014-HTTPRequests (:rf.http/managed transport + interceptor decoration seam), 012-Routing (:resources accepted-key extension + route-resource :scope resolver refs), 011-SSR (project-runtime-db projection), Runtime-Subsystems (the five-clause graduation), Conventions (:rf.resource/* / :rf.mutation/* / :rf.scope/* / :rf.work/* reserved, :rf.runtime/resources + :rf.runtime/work-ledger + :rf.runtime/mutations runtime-db keys), Pattern-RemoteData, 009-Instrumentation (:rf.resource/* / :rf.mutation/* trace families + error categories land with the implementation slice), EP-0011 (the reply envelope the mutation :reply-to map lowers onto), EP-0019 (optimistic mutation rollback) |
Named resource-scope resolvers — reg-resource-scope / clear-resource-scope (the :resource-scope registrar kind), the {:inputs … :resolve …} declared-input grammar, the [:db <rf-path>] input source (whole-db fn = tooling-marked explicit-cost sugar; [:runtime path] reserved, not shipped), the {:from-db <id>} use-site reference (fail-closed on nil), and the resolve-resource-scope resolver helper (not an effect, but emits :rf.resource/scope-resolved dev trace — not a pure data helper). EP-0016 Decision 3 |
016-Resources §Named resource-scope resolvers | day8/re-frame2-resources (post-v1 optional artefact) |
EP-0016, EP-0012 ([:db <rf-path>] is a concrete :rf/path; the forward-compatible named-declaration shape), EP-0014 (the reserved [:runtime path] input source), 001-Registration (the :resource-scope registrar kind), API (facade classification), Conventions (:rf.scope/* reserved + the {:from-db} reference form) |
Runtime shapes (Malli, CLJS reference) — :rf/effect-map, :rf/registration-metadata, :rf/hydration-payload, :rf/trace-event, etc. |
the per-Spec owner of each shape; Spec-Schemas is the projection (collected EDN forms) — non-canonical | per-surface (matches the owning Spec's row) | every Spec that owns a shape |
| API signatures (consolidated) | the per-Spec owner of each surface; API is the projection — non-canonical | per-surface (matches the owning Spec's row) | per-Spec owners |
| Migration rules (re-frame v1.x → re-frame2, CLJS reference) | MIGRATION | spec-only (no runtime artefact) | per-Spec owners (contract content); Migration owns the rules |
| Pair-tool runtime contract (inspect, dispatch, hot-swap, time-travel, fx-stub, source-map) | Tool-Pair | core for the inspect / dispatch / hot-swap / fx-stub / source-map slices (which ride the registrar / dispatch / trace surfaces in day8/re-frame2); the time-travel slice — the re-frame.epoch namespace, :rf/epoch-record ring buffer, register-epoch-listener! / unregister-epoch-listener! listener API, restore-epoch! rewind, and the :rf.epoch/* trace ops — ships in day8/re-frame2-epoch |
001-Registration, 009-Instrumentation |
Cross-MCP shared primitives (:rf.mcp/* + :rf.size/* wire-marker keys + JSON-RPC error codes; spec/009 §Privacy default-suppress filter; :rf.size/large-elided walker; arg coercion; path-keyed structural diff; overflow-marker payload builder; token-budget cap pipeline) — external canonical home (per README §Canonical homes outside /spec; tool-shared contract, ships with the artefact). Indexed by tools/mcp-base/spec/README.md, with per-namespace contracts in: vocab.md, sensitive.md, elision.md, args.md, diff-encode.md, overflow.md, cap.md. |
tools/mcp-base/spec/ (external: tool-shared, downstream of /spec; per-namespace docs indexed above) |
day8/re-frame2-mcp-base — consumed by tools/re-frame2-pair-mcp/ and tools/story-mcp/ |
Tool-Pair, 009-Instrumentation (§Privacy filter, :rf.size/large-elided) |
| Security posture, threat model, behavioural MUSTs, pragmatic stance, decisions log — language-agnostic pattern-level coordination layer naming what is defended, where the defense's contract lives, and why the call was made. Threat model + scope, the eight categories (input validation, XSS, CRLF, privacy, DoS, MCP authority, editor URI allowlist, file-path boundaries, production gates), the catalogue references into Conventions.md / 009 / 010 / 011 / 014, the four-proposition pragmatic stance, and the 38-decision bead log. The mirror to this matrix — Security names what is defended; Ownership names where the defense's contract lives. | Security | spec-only (no runtime artefact) | Conventions, Principles, per-spec owners of each named defense (009 / 010 / 011 / 014 / Tool-Pair / API / Implementor-Checklist / 007-Stories) |
CLJS-reference security specifics — named functions (re-frame.core/elide-wire-value, re-frame.interop/debug-enabled?), numeric defaults (:rf.http/max-decoded-keys 10000, :timeout-ms 30000, drain-depth ceiling, :rf.size/threshold-bytes 16384), JVM-vs-CLJS stub semantics, the exact :rf.error/* keywords each safety check emits, and the full 38-bead audit trail — external canonical home (per README §Canonical homes outside /spec; CLJS-reference binding of the pattern-level MUSTs in Security.md; split executed by (A).3 (a)) |
implementation/SECURITY.md (external: CLJS-reference binding, downstream of /spec) |
spec-only (no runtime artefact); the named functions ship in the artefacts named on their respective rows above | Security (pattern-level companion); per-spec owners of each named fn / numeric default |
Reserved-namespace policy, reserved fx-ids and app-db keys |
Conventions | spec-only (no runtime artefact) | every Spec that uses a reserved id cites the Conventions list |
Runtime-subsystem contract — the five clauses (subtree, write authority, read API, projection/elision policy, teardown) every :rf.runtime/* child of the runtime-db partition satisfies; the grading table for the shipped children (the four v1 subsystems machines / routing / elision / ssr, plus EP-0003's graduated resource trio resources / work-ledger / mutations — the resource-trio rows are mirrored from 016 §Runtime-subsystem graduation, their canonical home) and the plugin/extension seam (a 3rd-party :rf.runtime/<lib> is a new graded instance). The durable-state analogue of Managed-Effects. Names the shape; the reserved keys are owned by Conventions, the per-clause mechanisms by 002 |
Runtime-Subsystems | spec-only (no runtime artefact) — the per-clause mechanisms ship on their owning rows (machines / routing / SSR / core) | Conventions §Reserved runtime-db keys, 002-Frames §Write authority / §Durable vs transient / §Destroy, 005-StateMachines, 011-SSR, 012-Routing, Managed-Effects |
Operational-environment ownership — the non-durable layer beside the durable runtime subsystems, split across two owners: the process owns the singletons every frame shares (the registrar, the installed adapter selection, the capability map, the live frame registry); each frame owns its host-transient subsystem state (keyed per-frame, released on destroy-frame!) and its teardown bookkeeping. Includes adapter ownership = process selection + render-root instances; capability maps + late-bind-as-bridge; host-transient subsystem state + its grading column (complements the EP-0006 durable five-clause contract). The non-durable sibling of the five-clause runtime-subsystem contract. The public composition model is image → frame → event stream (rf/image + rf/make-frame); a frame is addressed by its id alone, and resolution is process-global. (The EP-0013 runtime-realm container that previously owned this whole layer was retired — the multi-realm substrate collapsed to a single default and was removed, afdlyr / rf2-70owfr; the realm/app/module constructors left the facade under EP-0023.) |
Runtime-Subsystems §The operational environment | spec-only (no runtime artefact) — the process/frame ownership ships on day8/re-frame2 |
EP-0023 (the image → frame → event stream public model), EP-0024 (the one-frame-value teardown backbone), EP-0006 (the durable five-clause contract this complements), 002-Frames §Frame addressing, Spec-Schemas §:rf/host-transient-descriptor, 006-ReactiveSubstrate (the adapter contract, ownership unchanged), 001-Registration (the process-global registrar), Conventions §Reserved namespaces (:rf.capability/*), EP-0013 (historical: the retired realm-container model) |
Derivation/process algebra — the common vocabulary every declared fact/process over the frame fold lowers to: fact, derivation, process, declared input, output, the four-class storage axis (:ephemeral / :app-db / :runtime-db / :host-transient) + the separate :authority remote axis, the seven-policy evaluation axis (:on-demand / :after-event / :on-reply / :on-route / :on-transition / :scheduled / :manual), lifecycle/owner, materialized vs ephemeral output, the node/edge graph model, the static/live + don't-execute rules, the named-resolver enrichment, and the whole-value law (delta law semantic-only in slice-1). The derivation/process analogue of Managed-Effects (effects) and Runtime-Subsystems (durable state). Slice-1: vocabulary + internal registration metadata only — no public authoring primitive or stable graph-accessor name (deferred per EP-0014 issue-1). The named normative home of EP-0014 |
Derivations | spec-only (no runtime artefact) — the per-member registration metadata ships on its owning rows (subs / flows / resources / routing / machines) | EP-0014, 006-ReactiveSubstrate (subscriptions = the first derivation instance; cites the whole-value law), 013-Flows (flows = materialized :after-event derivations), 016-Resources (resources = processes; :authority :remote + :storage :runtime-db), 012-Routing (route facts), 005-StateMachines (machines = processes; selectors = derivations), Spec-Schemas §:rf/derivation-node, Managed-Effects, Runtime-Subsystems, EP-0006 (storage-class ↔ projection-tier alignment), EP-0012 (node identity), EP-0013 (the relocation seam), EP-0015 (redaction metadata) |
| Construction-prompt scaffolding templates | Construction-Prompts | spec-only (no runtime artefact) | per-Spec owners (contract content); Construction-Prompts owns the scaffolding shape |
| Conformance fixtures (canonical interactions and expected emissions, in EDN) | conformance/ | spec-only (no runtime artefact) | per-Spec owners (contract content); conformance owns the fixture corpus |
Xray event-spine architecture — the 4-layer chrome (ribbon · event list · tab bar · detail panel), the spine sub :rf.xray/focus collapsing two-axis selection into single-axis, the 6-tab inventory (Event / App-db / Views / Trace / Machines / Routing — the Issues tab was removed per Option (c); issues surface inline in the Epoch panel + the L2 event-row pink-wash + the always-on issues ribbon signal), the IN/OUT filter pills + edit popup, the Settings modal popup, the Causality popover (c-key transient overlay), the frame-observation isolation invariants (I1–I4) with browser-feature test gate, and the data-classification rendering contract that consumes spec/015 — external canonical home (per README §Canonical homes outside /spec; tool-shared contract, ships with the Xray artefact tree under tools/xray/spec/). |
tools/xray/spec/018-Event-Spine.md (external: tool-spec, downstream of /spec) |
day8/re-frame2-xray (the Xray tool artefact) |
tools/xray/spec/000-Vision.md (6-tab inventory), tools/xray/spec/007-UX-IA.md (typography + colour tokens + keyboard map), tools/xray/spec/003-Machine-Inspector.md (Machines tab content), tools/xray/spec/012-Views.md (Views tab content), tools/xray/spec/016-Auxiliary-Panels.md (per-tab content), tools/xray/spec/017-Test-Coverage-Matrix.md (test gates) |
Drift rule: if a contract surface acquires a second normative definition (a redefinition rather than a citation), that is a corpus bug. File it as a spec-review bead and resolve by collapsing back to the listed owner.