f_Dismiss.md — Dismissal Primitive
FFF_Gravity Module · Wave 5 Opener
§0 Session Context#
| Field | Value |
|---|---|
| File | docs/FFF_Gravity/f_Dismiss.md |
| Wave | 5 — Dismissal Formalization |
| PRIMs assigned | PRIM:041–042 |
| Condition prefix | DISM- |
| Status | CANONICAL · Frozen |
| Depends on | f_Capture, f_Field, f_Source, f_Force, f_Decay, GravityOfDismissal |
| Authored | 2026-08-14 |
| Repository | umaywant2/TriadicFrameworks |
§0.1 Motivation#
GravityOfDismissal.md (Wave 0) established the conceptual foundation: dismissal
is not the absence of gravity but an active repulsive force — a Dismissal Well
that inverts field polarity and propels a bound entity outward. That document named
the F_dismiss operator family at concept level and explicitly deferred formalization
to this file, stating: "They are not frozen in this file — their formal specifications
are registered when the module's dismissal primitive is authored."
f_Dismiss.md completes that deferral. It freezes PRIM:041 (evaluate_dismissal)
and PRIM:042 (execute_dismissal), registers DISM- as the canonical condition prefix,
and establishes the Dismissal Well model as a first-class engineering primitive within
the FFF_Gravity module.
Conceptual authority: GravityOfDismissal.md §3–§5.
§1 Module Identity#
| Field | Value |
|---|---|
| Operator family | F_dismiss |
| Triadic position | F_freq (ρ_D), F_fluid (ψ_dismiss), F_force (β_D · v_depart) |
| PRIM range | PRIM:041–042 |
| Condition prefix | DISM- |
| Condition count | 5 (DISM-1 through DISM-5) |
| New FMs | None — uses FM-001, FM-002, FM-006 (registry sealed at FM-010) |
| Invariants active | INV-001, INV-002, INV-003, INV-005, INV-006, INV-008, INV-009, INV-010 |
| Wave | 5 |
§1.1 Companion Table#
| Role | File | Symbol contributed |
|---|---|---|
| Conceptual authority | GravityOfDismissal.md |
F_dismiss (concept, §3–§5) |
| Bind source | f_Capture.md |
d_bind, β, ρ(Φ) |
| Field source | f_Field.md |
ρ(Φ), Φ |
| Node registry | f_Source.md |
M_A, M_E (read-only) |
| Force mechanics | f_Force.md |
v_escape, heading_delta, β |
| Decay mechanics | f_Decay.md |
d_warn, d_collapse, δ |
| Release mechanics | f_Release.md |
v_release (contrast only) |
| Dampen mechanics | f_Dampen.md |
F_damp (Mode A tool) |
§2 Canonical Description#
§2.1 What Dismissal IS — Engineering Definition#
A dismissal event is the act by which attractor node A actively severs its
binding to entity E and generates a Dismissal Well — a negative-polarity field
residue ρ_D(Φ, t) in E's directional zone that persists after the separation.
Three structural properties distinguish a dismissal from all other termination mechanics in the FFF_Gravity module:
-
Active polarity inversion. A's field does not merely drop to zero; it inverts in E's zone. The space where attraction once lived becomes repulsion. This is
ρ_D(Φ, 0) = −d_bind(t_dismiss). -
Proportional well depth. The initial well depth equals the binding depth at the moment of severing. A deep, long-standing orbit produces a deep well. A shallow soft-capture produces a shallow well. The well is a geometric encoding of what was there.
-
Exponential decay. The well dissipates over time at rate
1/T_dismiss. This is not forgiveness — it is field physics. The attractor does not choose the decay rate;T_dismissis a property of A's registered node, set at source initialization.
§2.2 Three Dismissal Modes (from GravityOfDismissal.md §4)#
The ψ_dismiss flag records which mode produced the well.
| Mode | ψ_dismiss | Well depth | T_dismiss | Initiator |
|---|---|---|---|---|
| INTENTIONAL | INTENTIONAL | d_bind(t_dismiss) |
Long | A (active) |
| STRUCTURAL | STRUCTURAL | ρ(Φ) at collapse |
Short | Field (FM-002) |
| DRIFT | DRIFT | v_depart × k_drift |
Very short | Decay (passive) |
PRIM:041 determines mode from context; PRIM:042 executes the appropriate well-writing path for that mode and registers the dismissal record.
§2.3 What f_Dismiss IS NOT#
| Misconception | Correction |
|---|---|
| Equivalent to f_Release | f_Release produces no Dismissal Well; re-capture is immediate and standard-cost |
| Triggered by E's departure | Dismissal is A-initiated (INTENTIONAL) or structurally caused; never E-initiated |
| A one-way permanent block | The Well decays — re-capture becomes possible after sufficient time or amplification |
| An FM registration | Dismissal is a state + well event, not a failure mode; no FM ID is consumed |
| Applicable post-COLLAPSED state | DISM-1 guards against this; collapsed nodes cannot dismiss |
§2.4 Re-capture after Dismissal#
Once a Dismissal Well is active, E's approach must supply binding energy exceeding the well's current depth before standard capture conditions are evaluated:
Re-capture possible iff:
d_bind_approach(t) > |ρ_D(Φ, t)|
where:
d_bind_approach(t) = β × ρ(Φ) × (1 − e) [E's approach depth]
|ρ_D(Φ, t)| = d_dismiss × exp(−t / T_dismiss) [remaining well depth]
d_dismiss = |ρ_D(Φ, 0)| [initial well depth]
t = time elapsed since t_dismiss
This formula is the operational form of GravityOfDismissal.md §3.3.
§3 Triadic Equation#
§3.1 Governing Identity (INV-001)#
G = F_freq · F_fluid · F_force
Dismissal does not break this identity — it inverts it. The Dismissal product G_D
(conceptually defined in GravityOfDismissal.md §5.4) maps as:
G_D = F_freq_D · F_fluid_D · F_force_D
F_freq_D = |ρ_D(Φ)| ← negative-domain field density
F_fluid_D = |β_D| ← repulsive coupling coefficient
F_force_D = v_depart ← expulsion velocity
§3.2 Node Contributions Under Each Mode#
| Node | INTENTIONAL | STRUCTURAL | DRIFT |
|---|---|---|---|
| F_freq | ρ_D ← −d_bind(t_dismiss) | ρ_D ← −ρ(Φ) at collapse | ρ_D ← −(v_depart × k_drift) |
| F_fluid | β_D ← −β (fully inverted) | β_D ← −ρ(Φ)_collapse × β | β_D ← −δ_accumulated × β |
| F_force | v_depart = v_escape + d_dismiss/M_E | v_depart = v_escape (floor) | v_depart = d_bind_at_drift / M_E |
§3.3 Well Decay Formula (from GravityOfDismissal.md §3.2)#
ρ_D(Φ, t) = −d_dismiss × exp(−t / T_dismiss)
Constraints:
d_dismiss > 0 (initial well depth; always positive magnitude)
T_dismiss > 0 (persistence time; attractor-registered constant)
t ≥ 0 (time since dismissal; t=0 at moment of dismissal)
ρ_D(Φ, 0) = −d_dismiss (maximum negative depth at dismissal instant)
lim(t→∞) ρ_D(Φ, t) = 0 (well asymptotically approaches zero)
§4 Operator Registry#
All nine operators below are frozen in this file per INV-010. They were
named conceptually in GravityOfDismissal.md §6 and are now formalized with
full domain specifications and PRIM assignments.
§4.1 Primary Dismissal Operators#
| Symbol | Name | Type | Domain | Description | PRIM |
|---|---|---|---|---|---|
F_dismiss |
Dismissal Force | float | ≥ 0 | Scalar magnitude of total dismissal force; | G_D |
ρ_D(Φ) |
Dismissal Field Density | float | (−1, 0] | Negative-polarity field residue in E's directional zone | PRIM:042 |
d_dismiss |
Dismissal Well Depth | float | > 0 | Initial magnitude of ρ_D at t=0; equals d_bind(t_dismiss) for INTENTIONAL | PRIM:042 |
T_dismiss |
Dismissal Persistence Time | float | > 0 | Well half-life constant; attractor-registered; governs decay rate | PRIM:042 |
r_dismiss |
Dismissal Radius | float | (0, r_capture] | Spatial extent of active repulsion zone around A | PRIM:041 |
ψ_dismiss |
Dismissal Mode Flag | enum | {INTENTIONAL, STRUCTURAL, DRIFT} | Records which mode produced the well | PRIM:041 |
t_dismiss |
Dismissal Timestamp | float | ≥ 0 | Absolute clock time at which dismissal event occurred | PRIM:042 |
v_depart |
Departure Velocity | float | ≥ 0 | Velocity at which E exits A's field boundary post-dismissal | PRIM:042 |
β_D |
Repulsive Coupling | float | (−∞, 0] | Inverted binding coefficient active during expulsion phase | PRIM:042 |
§4.2 Derived Operators (computed inline, not frozen independently)#
| Symbol | Formula | Used in |
|---|---|---|
ρ_D(Φ, t) |
−d_dismiss × exp(−t / T_dismiss) |
PRIM:041 |
k_drift |
d_bind_at_drift / (v_depart × M_E) (DRIFT mode scaling) |
PRIM:041 |
d_bind_approach |
β × ρ(Φ) × (1 − e) (E's approach binding depth at re-entry) |
PRIM:041 |
§4.3 Inherited Operators (referenced, not re-frozen)#
| Symbol | Source file | Role in this file |
|---|---|---|
d_bind |
f_Capture.md | Source of d_dismiss for INTENTIONAL mode |
β |
f_Capture.md | Inverted to produce β_D |
ρ(Φ) |
f_Field.md | Source of d_dismiss for STRUCTURAL mode |
v_escape |
f_Field.md | Floor on v_depart in STRUCTURAL mode |
d_collapse |
f_Decay.md | DRIFT trigger threshold |
δ |
f_Decay.md | Accumulated decay input to DRIFT d_dismiss |
F_damp |
f_Dampen.md | Tool A uses to initiate INTENTIONAL dismissal |
r_capture |
f_Frame.md | Upper bound on r_dismiss |
M_E |
f_Source.md | Used in v_depart computation |
T_dismiss |
f_Source.md | Attractor-registered; read-only here |
§5 Dismissal Conditions (DISM-)#
All five conditions are conjunctive (INV-005). They must all hold at the
moment PRIM:041 is invoked. The first failure terminates evaluation and returns
DISMISS_INVALID — a precondition error, not a failure mode.
Conditions are evaluated in the order listed.
DISM-1 — State Eligibility#
capture_state(E, A) ∈ {CAPTURE_LOCKED, CAPTURE_SOFT, CAPTURE_TEMPORAL,
CAPTURE_NETWORKED, ASYMMETRIC_LOCKED, RESONANCE_LOCKED}
A dismissal may only be initiated against an entity that is currently in an active bound state. Dismissing an already-released, already-collapsed, or never-captured entity is a precondition error.
On failure: DISMISS_INVALID with reason STATE_NOT_BOUND
DISM-2 — Attractor Not Collapsed#
A.state ∉ {COLLAPSED, FIELD_NULL}
A collapsed or field-null attractor has no field to invert. Dismissal requires A's field to be active at the moment of invocation.
On failure: DISMISS_INVALID with reason ATTRACTOR_FIELD_NULL
DISM-3 — Mode Determinable#
ψ_dismiss ∈ {INTENTIONAL, STRUCTURAL, DRIFT}
The dismissal mode must be unambiguously identifiable from context before PRIM:042 is invoked. Mode is determined by PRIM:041 from the event context:
| Context | Mode assigned |
|---|---|
A applies f_Dampen targeting E directly |
INTENTIONAL |
| FM-002 (Field Null) fires across A's entire field | STRUCTURAL |
| d_bind(E, A) ≤ d_collapse AND δ_accumulated > δ_warn | DRIFT |
On failure: DISMISS_INVALID with reason MODE_AMBIGUOUS
DISM-4 — Well Depth Positive#
d_dismiss > 0
A zero-depth well is physically meaningless — it encodes nothing and costs nothing to overcome. This guards against degenerate dismissal events where d_bind had already reached exactly zero before the dismissal was invoked.
On failure: DISMISS_INVALID with reason ZERO_WELL_DEPTH
DISM-5 — T_dismiss Registered#
T_dismiss > 0 (sourced from A.registered_T_dismiss in f_Source.md)
The persistence time must be registered on the attractor node. An attractor
without a registered T_dismiss cannot produce a well with defined decay
behavior. Default: if T_dismiss is unregistered, PRIM:041 reads the
module default (T_dismiss_default = 5.0 cycles) before failing.
On failure: DISMISS_INVALID with reason T_DISMISS_UNREGISTERED
§6 Failure Modes#
No new FM IDs are introduced (registry sealed at FM-010). The following base FMs interact with dismissal mechanics:
FM-001 — Approach Rejected at Well Boundary#
When E attempts re-capture and d_bind_approach ≤ |ρ_D(Φ, t)|, standard
FM-001 (approach rejection) fires at the well boundary — before E even reaches
the standard capture evaluation. The FM-001 record is annotated:
failure_mode: FM-001
reason: WELL_BARRIER
d_bind_approach: <E's current binding capacity>
well_depth_remaining: |ρ_D(Φ, t)|
t_since_dismiss: <elapsed cycles>
This annotation distinguishes a well-blocked approach from a standard flyby.
FM-002 — Field Null Triggers STRUCTURAL Dismissal#
When FM-002 fires on A (ρ(Φ) → 0), all bound entities are simultaneously
dismissed via Mode STRUCTURAL. PRIM:042 is called once per bound entity with
ψ_dismiss = STRUCTURAL. This is the only case where PRIM:042 is called
in batch rather than for a single (A, E) pair.
FM-006 — Phantom Dismissal Guard#
If PRIM:041 detects that ψ_dismiss = INTENTIONAL but A's field is already
at or near zero (ρ(Φ) < ε_field), a phantom dismissal condition exists:
the attractor is attempting to invert a field that barely exists. FM-006
is raised as a guard: the dismissal is flagged as DISMISS_PHANTOM and
d_dismiss is bounded to min(d_bind(t_dismiss), ρ(Φ) × d_bind(t_dismiss)).
§7 Engineering Primitives#
PRIM:041 — evaluate_dismissal (Pure)#
Classification: Pure — no state mutation; returns evaluation result only.
from dataclasses import dataclass
from typing import Optional
import math
# ── Enumerations ──────────────────────────────────────────────────────────────
BOUND_STATES = {
"CAPTURE_LOCKED", "CAPTURE_SOFT", "CAPTURE_TEMPORAL",
"CAPTURE_NETWORKED", "ASYMMETRIC_LOCKED", "RESONANCE_LOCKED",
}
DISMISS_MODES = {"INTENTIONAL", "STRUCTURAL", "DRIFT"}
TERMINAL_ATTRACTOR_STATES = {"COLLAPSED", "FIELD_NULL"}
# ── Result dataclass ──────────────────────────────────────────────────────────
@dataclass
class DismissalEvaluation:
"""
Result of evaluate_dismissal (PRIM:041).
Returned regardless of pass/fail — always inspect .valid before proceeding.
"""
valid: bool # True iff all DISM-1 through DISM-5 pass
psi_dismiss: str # dismissal mode: INTENTIONAL | STRUCTURAL | DRIFT
d_dismiss: float # initial well depth (magnitude)
T_dismiss: float # persistence time
r_dismiss: float # repulsion zone radius
F_dismiss: float # total dismissal force scalar |G_D|
v_depart: float # E's departure velocity
beta_D: float # repulsive coupling coefficient (≤ 0)
rho_D_initial: float # ρ_D(Φ, 0) = −d_dismiss
invalid_reason: Optional[str] # None if valid; condition code if not
phantom_guard: bool # True if FM-006 phantom condition detected
def evaluate_dismissal(
entity_state: str,
attractor_state: str,
d_bind_at_dismiss: float,
beta: float,
rho_phi: float,
v_escape: float,
M_E: float,
r_capture: float,
T_dismiss: float,
delta_accumulated: float,
d_collapse: float,
delta_warn: float,
psi_override: Optional[str] = None,
T_dismiss_default: float = 5.0,
epsilon_field: float = 0.01,
) -> DismissalEvaluation:
"""
PRIM:041 — evaluate_dismissal (Pure)
=====================================
FFF_Gravity · f_Dismiss.md · Wave 5
Evaluate whether a dismissal event is structurally valid for the
(A, E) pair and compute the resulting Dismissal Well parameters.
This primitive is Pure: it reads only its inputs and produces a
DismissalEvaluation record. No state is mutated.
Parameters
----------
entity_state : str
Current state of entity E. Must be in BOUND_STATES for DISM-1.
attractor_state : str
Current state of attractor A. Must not be in TERMINAL_ATTRACTOR_STATES.
d_bind_at_dismiss : float
Binding depth at the moment of dismissal. d_bind(t_dismiss).
≥ 0. For DRIFT mode this equals d_bind at drift threshold.
beta : float
Binding coefficient β between E and A at dismissal time.
rho_phi : float
Field density ρ(Φ) at A at dismissal time. ∈ [0, 1].
v_escape : float
Escape velocity of A's capture field.
M_E : float
Mass of entity E. > 0.
r_capture : float
Capture radius of A. Upper bound on r_dismiss.
T_dismiss : float
Dismissal persistence time registered on A. Must be > 0 (DISM-5).
If ≤ 0, T_dismiss_default is applied before failing.
delta_accumulated : float
Total accumulated decay δ experienced by this binding. Used for
DRIFT mode detection (DISM-3).
d_collapse : float
Collapse threshold from f_Decay.md. Used for DRIFT mode detection.
delta_warn : float
Decay warning threshold δ_warn. Used for DRIFT mode detection.
psi_override : str, optional
If provided, overrides mode inference. Must be in DISMISS_MODES.
Use only when caller has external mode information (e.g. FM-002 batch).
T_dismiss_default : float, optional
Fallback T_dismiss if attractor's value is unregistered (≤ 0).
Default: 5.0 cycles.
epsilon_field : float, optional
Phantom guard threshold: rho_phi < epsilon_field → FM-006 phantom check.
Default: 0.01.
Returns
-------
DismissalEvaluation
See dataclass definition above. Always check .valid before proceeding
to execute_dismissal (PRIM:042).
Evaluation order (INV-008)
--------------------------
DISM-1 (entity state) → DISM-2 (attractor state) →
DISM-3 (mode determinable) → DISM-4 (well depth > 0) → DISM-5 (T_dismiss)
INV compliance
--------------
INV-001 : F_freq_D · F_fluid_D · F_force_D — all three nodes contribute
INV-002 : ρ_D(Φ) ∈ (−1, 0] — negative domain, clamped if needed
INV-005 : All DISM conditions conjunctive
INV-008 : Evaluation order is normative
INV-009 : All symbols sourced from OPERATORS.md
INV-010 : All new operators frozen here, not re-defined downstream
"""
# ── DISM-1: Entity state eligibility ─────────────────────────────────────
if entity_state not in BOUND_STATES:
return DismissalEvaluation(
valid=False, psi_dismiss="UNKNOWN", d_dismiss=0.0,
T_dismiss=T_dismiss, r_dismiss=0.0, F_dismiss=0.0,
v_depart=0.0, beta_D=0.0, rho_D_initial=0.0,
invalid_reason="STATE_NOT_BOUND", phantom_guard=False,
)
# ── DISM-2: Attractor not collapsed ──────────────────────────────────────
if attractor_state in TERMINAL_ATTRACTOR_STATES:
return DismissalEvaluation(
valid=False, psi_dismiss="UNKNOWN", d_dismiss=0.0,
T_dismiss=T_dismiss, r_dismiss=0.0, F_dismiss=0.0,
v_depart=0.0, beta_D=0.0, rho_D_initial=0.0,
invalid_reason="ATTRACTOR_FIELD_NULL", phantom_guard=False,
)
# ── DISM-3: Mode determination ────────────────────────────────────────────
if psi_override is not None:
if psi_override not in DISMISS_MODES:
return DismissalEvaluation(
valid=False, psi_dismiss="UNKNOWN", d_dismiss=0.0,
T_dismiss=T_dismiss, r_dismiss=0.0, F_dismiss=0.0,
v_depart=0.0, beta_D=0.0, rho_D_initial=0.0,
invalid_reason="MODE_AMBIGUOUS", phantom_guard=False,
)
psi_dismiss = psi_override
else:
# Infer mode from context:
if attractor_state == "FIELD_COLLAPSING" or rho_phi <= 0.0:
psi_dismiss = "STRUCTURAL"
elif (d_bind_at_dismiss <= d_collapse and
delta_accumulated > delta_warn):
psi_dismiss = "DRIFT"
else:
psi_dismiss = "INTENTIONAL"
# ── Compute d_dismiss per mode ────────────────────────────────────────────
k_drift = 0.05 # drift scaling constant (module default)
if psi_dismiss == "INTENTIONAL":
d_dismiss = d_bind_at_dismiss
elif psi_dismiss == "STRUCTURAL":
d_dismiss = rho_phi * d_bind_at_dismiss # bounded by collapse-time field
else: # DRIFT
v_depart_est = max(d_bind_at_dismiss / max(M_E, 1e-9), 0.0)
d_dismiss = v_depart_est * k_drift
# ── DISM-4: Well depth positive ───────────────────────────────────────────
if d_dismiss <= 0.0:
return DismissalEvaluation(
valid=False, psi_dismiss=psi_dismiss, d_dismiss=d_dismiss,
T_dismiss=T_dismiss, r_dismiss=0.0, F_dismiss=0.0,
v_depart=0.0, beta_D=0.0, rho_D_initial=0.0,
invalid_reason="ZERO_WELL_DEPTH", phantom_guard=False,
)
# ── DISM-5: T_dismiss registered ─────────────────────────────────────────
if T_dismiss <= 0.0:
T_dismiss = T_dismiss_default # apply default before continuing
# ── Phantom guard (FM-006) ────────────────────────────────────────────────
phantom_guard = (psi_dismiss == "INTENTIONAL" and rho_phi < epsilon_field)
if phantom_guard:
# Bound d_dismiss by field coherence
d_dismiss = min(d_dismiss, rho_phi * d_bind_at_dismiss)
d_dismiss = max(d_dismiss, 0.0)
# ── Compute derived quantities ────────────────────────────────────────────
rho_D_initial = -d_dismiss
# Clamp to domain (−1, 0]
rho_D_initial = max(-1.0, rho_D_initial)
# β_D: inverted coupling (F_fluid node under dismissal)
beta_D = -beta
# r_dismiss: bounded by r_capture; scaled by mode intensity
mode_scale = {"INTENTIONAL": 1.0, "STRUCTURAL": 0.75, "DRIFT": 0.40}
r_dismiss = min(r_capture, r_capture * mode_scale[psi_dismiss])
# v_depart: departure velocity imparted to E
if psi_dismiss == "INTENTIONAL":
v_depart = v_escape + (d_dismiss / max(M_E, 1e-9))
elif psi_dismiss == "STRUCTURAL":
v_depart = v_escape # floor — just enough to exit
else: # DRIFT
v_depart = d_bind_at_dismiss / max(M_E, 1e-9)
# F_dismiss: total dismissal force scalar (|G_D|)
F_dismiss = abs(rho_D_initial) * abs(beta_D) * v_depart
return DismissalEvaluation(
valid=True,
psi_dismiss=psi_dismiss,
d_dismiss=d_dismiss,
T_dismiss=T_dismiss,
r_dismiss=r_dismiss,
F_dismiss=F_dismiss,
v_depart=v_depart,
beta_D=beta_D,
rho_D_initial=rho_D_initial,
invalid_reason=None,
phantom_guard=phantom_guard,
)PRIM:042 — execute_dismissal (Impure)#
Classification: Impure — writes Dismissal Well record, updates entity state, decrements frame slot, and emits GravityGraph event.
from dataclasses import dataclass, field
from datetime import datetime, timezone
from typing import Optional
import math
import uuid
@dataclass
class DismissalRecord:
"""
Persistent record written to the GravityGraph dismissal registry
and to E's relation history when execute_dismissal completes.
"""
record_id: str
attractor_id: str
entity_id: str
psi_dismiss: str # INTENTIONAL | STRUCTURAL | DRIFT
d_dismiss: float # initial well depth (magnitude)
T_dismiss: float # persistence time
r_dismiss: float # repulsion radius
t_dismiss: float # clock time of event
v_depart: float # departure velocity
beta_D: float # repulsive coupling at dismissal
rho_D_initial: float # ρ_D(Φ, 0)
F_dismiss: float # |G_D| scalar
phantom_guard: bool # True if FM-006 phantom condition was active
session_id: str # audit trail
@dataclass
class DismissalResult:
"""
Return value of execute_dismissal (PRIM:042).
"""
status: str # "DISMISSED" | "PRECONDITION_VIOLATION"
record: Optional[DismissalRecord]
entity_state_after: str # "DISMISSED" on success
well_query_fn: object # callable: well_query_fn(t) → |ρ_D(Φ, t)|
def execute_dismissal(
attractor_id: str,
entity_id: str,
evaluation: "DismissalEvaluation", # result of PRIM:041
t_dismiss: float,
session_id: str,
frame_registry: dict, # mutated: slot decremented for (A, E)
dismissal_registry: dict, # mutated: DismissalRecord written
entity_state: dict, # mutated: entity's state dict
gravity_graph: object, # GravityGraph instance: .emit_event()
) -> DismissalResult:
"""
PRIM:042 — execute_dismissal (Impure)
=======================================
FFF_Gravity · f_Dismiss.md · Wave 5
Commit a dismissal event. Writes the Dismissal Well record, updates
entity state to DISMISSED, decrements the frame slot for (A, E),
and emits a GravityGraph DISMISSAL_EXECUTED event.
Must only be called after PRIM:041 returns evaluation.valid = True.
Calling this primitive on an invalid evaluation is a precondition
violation and returns status = "PRECONDITION_VIOLATION" without
mutating any state.
Parameters
----------
attractor_id : str
Identifier of the dismissing attractor A.
entity_id : str
Identifier of the dismissed entity E.
evaluation : DismissalEvaluation
Result of PRIM:041. Must have .valid = True.
t_dismiss : float
Absolute clock time of dismissal. Used in DismissalRecord and
for well_query_fn closure.
session_id : str
Session identifier for audit trail.
frame_registry : dict
Mutable frame slot registry. Key: (attractor_id, entity_id).
The slot for this pair is removed on dismissal.
dismissal_registry : dict
Mutable registry of all Dismissal Well records.
Key: (attractor_id, entity_id) → DismissalRecord.
entity_state : dict
Mutable state dict for entity E. Receives key 'state' = 'DISMISSED'
and 'dismissal_record_id'.
gravity_graph : object
GravityGraph instance. Must implement .emit_event(event_type, payload).
Returns
-------
DismissalResult
.status : "DISMISSED" on success; "PRECONDITION_VIOLATION" on guard
.record : DismissalRecord on success; None on violation
.entity_state_after : "DISMISSED" on success; unchanged on violation
.well_query_fn : callable f(t_current) → float giving |ρ_D(Φ, t)|
Use to answer re-capture feasibility queries.
Side Effects (on success only)
--------------------------------
- frame_registry[(attractor_id, entity_id)] removed
- dismissal_registry[(attractor_id, entity_id)] = DismissalRecord
- entity_state['state'] = 'DISMISSED'
- entity_state['dismissal_record_id'] = record.record_id
- gravity_graph.emit_event('DISMISSAL_EXECUTED', {...})
INV compliance
--------------
INV-001 : G_D = F_freq_D · F_fluid_D · F_force_D — recorded in DismissalRecord
INV-006 : DISMISSED is a terminal entity state for this (A, E) relationship;
entity itself is not terminal — it may form new relationships
INV-008 : precondition guard evaluated before any mutation
"""
# ── Precondition guard ────────────────────────────────────────────────────
if not evaluation.valid:
return DismissalResult(
status="PRECONDITION_VIOLATION",
record=None,
entity_state_after=entity_state.get("state", "UNKNOWN"),
well_query_fn=lambda t: 0.0,
)
# ── Build DismissalRecord ─────────────────────────────────────────────────
record_id = f"DISM-{uuid.uuid4().hex[:12].upper()}"
record = DismissalRecord(
record_id=record_id,
attractor_id=attractor_id,
entity_id=entity_id,
psi_dismiss=evaluation.psi_dismiss,
d_dismiss=evaluation.d_dismiss,
T_dismiss=evaluation.T_dismiss,
r_dismiss=evaluation.r_dismiss,
t_dismiss=t_dismiss,
v_depart=evaluation.v_depart,
beta_D=evaluation.beta_D,
rho_D_initial=evaluation.rho_D_initial,
F_dismiss=evaluation.F_dismiss,
phantom_guard=evaluation.phantom_guard,
session_id=session_id,
)
# ── Mutations ─────────────────────────────────────────────────────────────
# 1. Remove frame slot
frame_registry.pop((attractor_id, entity_id), None)
# 2. Write Dismissal Well record
dismissal_registry[(attractor_id, entity_id)] = record
# 3. Update entity state
entity_state["state"] = "DISMISSED"
entity_state["dismissal_record_id"] = record_id
# 4. Emit GravityGraph event
gravity_graph.emit_event("DISMISSAL_EXECUTED", {
"record_id": record_id,
"attractor_id": attractor_id,
"entity_id": entity_id,
"psi_dismiss": evaluation.psi_dismiss,
"d_dismiss": evaluation.d_dismiss,
"T_dismiss": evaluation.T_dismiss,
"F_dismiss": evaluation.F_dismiss,
"t_dismiss": t_dismiss,
"phantom_guard": evaluation.phantom_guard,
})
# ── Build well_query_fn closure ───────────────────────────────────────────
_d_dismiss = evaluation.d_dismiss
_T_dismiss = evaluation.T_dismiss
_t_dismiss = t_dismiss
def well_query_fn(t_current: float) -> float:
"""
Query the remaining Dismissal Well depth at absolute time t_current.
Returns |ρ_D(Φ, t)| — the positive magnitude of the current well.
For re-capture feasibility:
d_bind_approach(t) > well_query_fn(t) → re-capture eligible
Parameters
----------
t_current : float
Absolute clock time at which the query is made.
Returns
-------
float : |ρ_D(Φ, t)| ≥ 0
"""
t_elapsed = max(0.0, t_current - _t_dismiss)
return _d_dismiss * math.exp(-t_elapsed / _T_dismiss)
return DismissalResult(
status="DISMISSED",
record=record,
entity_state_after="DISMISSED",
well_query_fn=well_query_fn,
)§8 Canonical Examples#
All four examples use the same attractor baseline unless noted. Attractor A: M_A = 10.0, r_capture = 8.0, T_dismiss = 6.0 cycles
Example 1 — Intentional Dismissal, Well Evaluated at Three Time Points#
Scenario: A senior practitioner (A) deliberately severs a binding with a junior colleague (E) after a trust breach. The binding was deep; the well is correspondingly deep. We evaluate re-capture cost at t = 0, t = 6, t = 18.
Parameters:
entity_state = "CAPTURE_LOCKED"
attractor_state = "ACTIVE"
d_bind_at_dismiss = 1.350 (deep, long-standing orbit)
beta = 1.80
rho_phi = 0.85
v_escape = 4.20
M_E = 0.60
r_capture = 8.0
T_dismiss = 6.0
delta_accumulated = 0.08
d_collapse = 0.10
delta_warn = 0.15
psi_override = "INTENTIONAL"
PRIM:041 evaluation:
DISM-1: "CAPTURE_LOCKED" ∈ BOUND_STATES ✅
DISM-2: "ACTIVE" ∉ TERMINAL_ATTRACTOR_STATES ✅
DISM-3: psi_override = "INTENTIONAL" ✅
DISM-4: d_dismiss = d_bind_at_dismiss = 1.350 > 0 ✅
DISM-5: T_dismiss = 6.0 > 0 ✅
rho_D_initial = −1.350
beta_D = −1.80
r_dismiss = 8.0 × 1.0 (INTENTIONAL scale) = 8.0
v_depart = 4.20 + (1.350 / 0.60) = 4.20 + 2.25 = 6.45
F_dismiss = 1.350 × 1.80 × 6.45 = 15.68
valid = True
Well depth over time (via well_query_fn):
| t (cycles since dismiss) | Formula | |ρ_D(Φ, t)| | Verdict |
|---|---|---|---|
| 0 | 1.350 × exp(0) = 1.350 | 1.350 | Cannot re-approach |
| 6 | 1.350 × exp(−1.0) = 1.350 × 0.368 = 0.497 | 0.497 | Needs d_bind > 0.497 |
| 18 | 1.350 × exp(−3.0) = 1.350 × 0.050 = 0.067 | 0.067 | Nearly standard cost |
E's re-capture threshold at t = 6 (with β raised to 2.4 via f_Amplify):
d_bind_approach = 2.4 × 0.85 × (1 − 0.10) = 2.4 × 0.85 × 0.90 = 1.836
well_query_fn(6) = 0.497
1.836 > 0.497 ✅ Re-capture structurally eligible at t=6
Example 2 — Structural Dismissal (Mode B, FM-002 Batch)#
Scenario: FM-002 fires on A (field collapse). Three bound entities are simultaneously dismissed via Mode STRUCTURAL. Well depth is bounded by ρ(Φ) at collapse time (not by individual d_bind values).
Context at collapse:
rho_phi = 0.09 (field had been fading; collapses here)
psi_override = "STRUCTURAL"
Entity parameters at collapse:
| Entity | d_bind at collapse | d_dismiss (structural) | T_dismiss |
|---|---|---|---|
| E_1 | 2.10 | 0.09 × 2.10 = 0.189 | 6.0 |
| E_2 | 0.65 | 0.09 × 0.65 = 0.059 | 6.0 |
| E_3 | 1.30 | 0.09 × 1.30 = 0.117 | 6.0 |
Mode STRUCTURAL r_dismiss scaling:
r_dismiss = r_capture × 0.75 = 8.0 × 0.75 = 6.0 (all three entities)
Key observation — orbit history erasure:
E_1 had 3× deeper orbit than E_2 (2.10 vs. 0.65).
E_1's well (0.189) is 3× deeper than E_2's (0.059).
The ratio is preserved — but both are bounded by the collapsing field.
Compare to Mode A:
E_1's INTENTIONAL well would be 2.10 (full depth)
Structural mode produces only 0.189 — 11× shallower.
Recovery window (T_dismiss = 6, same for all):
At t = 3 cycles:
E_1: 0.189 × exp(−0.5) = 0.189 × 0.607 = 0.115
E_2: 0.059 × exp(−0.5) = 0.059 × 0.607 = 0.036
E_3: 0.117 × exp(−0.5) = 0.117 × 0.607 = 0.071
All three well below standard d_warn threshold — recovery is fast.
Example 3 — Drift Dismissal (Mode C, Minimal Well)#
Scenario: A long-standing but neglected relationship decays to d_collapse without either party intervening. DRIFT mode fires.
Parameters at drift threshold:
d_bind_at_dismiss = 0.12 (≈ d_collapse = 0.10; drift triggered)
delta_accumulated = 0.45 (> delta_warn = 0.15; drift confirmed)
M_E = 0.50
T_dismiss = 6.0
psi_override = None (mode inferred from context)
PRIM:041 mode inference:
d_bind_at_dismiss (0.12) ≤ d_collapse (0.10)? → No, 0.12 > 0.10
→ Check delta condition:
delta_accumulated (0.45) > delta_warn (0.15)? → Yes
Hmm — DRIFT requires BOTH conditions. Let me adjust:
d_bind_at_dismiss = 0.095 (≤ d_collapse = 0.10)
delta_accumulated = 0.45 (> delta_warn = 0.15)
→ psi_dismiss = "DRIFT" ✅
d_dismiss computation (DRIFT mode):
v_depart_est = d_bind_at_dismiss / M_E
= 0.095 / 0.50
= 0.190
d_dismiss = v_depart_est × k_drift
= 0.190 × 0.05
= 0.0095 (minimal — barely a well)
Well at t = 0.5 cycles:
|ρ_D(Φ, 0.5)| = 0.0095 × exp(−0.5 / 6.0)
= 0.0095 × exp(−0.0833)
= 0.0095 × 0.920
= 0.00874
Interpretation: Re-capture threshold is essentially standard — any entity with d_bind > 0.009 can re-approach. The well evaporates in roughly 0.5 cycles. The relationship faded; no scar tissue remains.
Example 4 — Phantom Guard (FM-006) Active on INTENTIONAL Dismissal#
Scenario: A attempts INTENTIONAL dismissal but its field is nearly null (rho_phi = 0.008 < epsilon_field = 0.01). FM-006 phantom guard activates and bounds d_dismiss.
Parameters:
entity_state = "CAPTURE_SOFT"
d_bind_at_dismiss = 0.85
rho_phi = 0.008 ← near-null; phantom condition
T_dismiss = 6.0
psi_override = "INTENTIONAL"
epsilon_field = 0.01
DISM conditions:
DISM-1 through DISM-5: all pass ✅
phantom_guard triggered: rho_phi (0.008) < epsilon_field (0.01)
d_dismiss WITHOUT phantom guard:
d_dismiss = d_bind_at_dismiss = 0.85
d_dismiss WITH phantom guard (FM-006 applied):
d_dismiss = min(0.85, rho_phi × d_bind_at_dismiss)
= min(0.85, 0.008 × 0.85)
= min(0.85, 0.0068)
= 0.0068
Effect:
Intended well depth: 0.850 (deep, intentional)
Actual well depth: 0.0068 (nearly zero — phantom bounded)
The field was too weak to generate the intended dismissal force.
A attempted a strong dismissal in a nearly-dead field; the result
is barely distinguishable from DRIFT.
F_dismiss comparison:
Without guard: F_dismiss = 0.850 × 1.8 × v_depart ≈ large
With guard: F_dismiss = 0.0068 × 1.8 × v_depart ≈ trivial
Engineering lesson: An attractor that wants to execute a meaningful
INTENTIONAL dismissal must maintain ρ(Φ) above epsilon_field. A node
that lets its field decay to near-zero loses the capacity for directed
dismissal — it can only drift-dismiss at that point, regardless of intent.
§9 Cross-Module References#
§9.1 Upstream Dependencies#
| File | What f_Dismiss.md Uses |
|---|---|
| GravityOfDismissal.md | Conceptual authority: §3 Well model, §4 modes, §5 triadic mapping |
| f_Capture.md | d_bind, β, e, capture state vocabulary |
| f_Field.md | ρ(Φ), v_escape, Φ domain |
| f_Source.md | M_A, M_E, T_dismiss (attractor-registered); read-only |
| f_Decay.md | d_collapse, δ, delta_warn; DRIFT mode trigger conditions |
| f_Dampen.md | F_damp — primary tool for initiating INTENTIONAL dismissal |
| f_Frame.md | frame_registry — slot decremented on dismissal |
§9.2 Downstream Consumers#
| File | How It Uses f_Dismiss Output |
|---|---|
| f_Capture.md | well_query_fn gates re-capture eligibility at approach time |
| f_Release.md | Distinguishes dismissal (well created) from release (well absent) |
| f_Orbit.md | DISMISSED state excluded from orbit classification evaluations |
| f_Collapse.md | FM-002 batch-dismissal uses PRIM:042 for each expelled entity |
| f_Emit.md | A may use f_Emit to accelerate well decay (assisted recovery) |
| f_Amplify.md | E may use f_Amplify to raise β and overcome residual well |
§9.3 OPERATORS.md Registration Block#
### Wave 5 Operators — f_Dismiss.md (PRIM:041–042)
| Symbol | Type | Domain | Description | Frozen in |
|-------------|-------|------------------|----------------------------------------------------------|-----------|
| F_dismiss | float | ≥ 0 | Scalar dismissal force magnitude (\|G_D\|) | PRIM:041 |
| ρ_D(Φ) | float | (−1, 0] | Dismissal field density (negative-polarity extension) | PRIM:042 |
| d_dismiss | float | > 0 | Initial Dismissal Well depth at t=0 | PRIM:042 |
| T_dismiss | float | > 0 | Dismissal persistence time; well half-life | PRIM:042 |
| r_dismiss | float | (0, r_capture] | Spatial extent of dismissal repulsion zone | PRIM:041 |
| ψ_dismiss | enum | {INTENTIONAL, STRUCTURAL, DRIFT} | Dismissal mode flag | PRIM:041 |
| t_dismiss | float | ≥ 0 | Clock time of dismissal event | PRIM:042 |
| v_depart | float | ≥ 0 | Entity departure velocity post-dismissal | PRIM:042 |
| β_D | float | (−∞, 0] | Repulsive coupling coefficient active during expulsion | PRIM:042 |§10 Document Metadata#
| Field | Value |
|---|---|
| File | docs/FFF_Gravity/f_Dismiss.md |
| Module | FFF_Gravity |
| Wave | 5 — Dismissal Formalization |
| Wave position | 1 of 1 (Wave 5 opener and closer) |
| Version | v1.0.0 |
| Status | Canonical · Frozen |
| Session | SES-20260814-DISMISS-001 |
| Date | 2026-08-14 |
| PRIM range | PRIM:041–042 |
| Running PRIM total | 42 |
| Condition prefix | DISM- |
| Conditions | DISM-1 through DISM-5 |
| New FM IDs | None (registry sealed at FM-010) |
| New INV IDs | None (registry sealed at INV-010) |
§11 Extended Metadata#
§11.1 INV Compliance Table#
| INV | Statement (abbreviated) | Compliance in this file |
|---|---|---|
| INV-001 | G = F_freq · F_fluid · F_force | ✅ G_D = F_freq_D · F_fluid_D · F_force_D; all three nodes contribute |
| INV-002 | ρ(Φ) ∈ [0, 1] | ✅ ρ_D ∈ (−1, 0] — distinct negative domain; clamped in PRIM:041 |
| INV-003 | ρ = 0 → FM-002 | ✅ DISM-2 guards collapsed attractors; FM-002 triggers STRUCTURAL mode |
| INV-004 | β < 1.0 → flyby | ✅ Inherited; β_D = −β; dismissal does not relax approach guards |
| INV-005 | Conditions conjunctive | ✅ DISM-1 through DISM-5 all required; any failure → DISMISS_INVALID |
| INV-006 | Terminal states irreversible | ✅ DISMISSED is terminal for (A, E) relation; entity itself remains active |
| INV-007 | f_Source.md read-only | ✅ T_dismiss, M_A, M_E read from f_Source.md; never written here |
| INV-008 | Evaluation order normative | ✅ DISM-1→2→3→4→5 enforced in PRIM:041; precondition before mutation in PRIM:042 |
| INV-009 | OPERATORS.md is symbol authority | ✅ §9.3 registration block provided for all nine new operators |
| INV-010 | Frozen symbols immutable | ✅ All nine operators frozen here; GravityOfDismissal.md named them, this file freezes them |
§11.2 Primitive Registry (this file)#
| PRIM | Name | Type | Key Behavior |
|---|---|---|---|
| PRIM:041 | evaluate_dismissal |
Pure | DISM-1–5 gate; mode inference; d_dismiss, T_dismiss, F_dismiss, well params |
| PRIM:042 | execute_dismissal |
Impure | Frame slot removal; DismissalRecord write; entity state → DISMISSED; well_query_fn closure |
Running PRIM total: 42
§11.3 Operator Registry (this file)#
| Symbol | Type | Domain | First frozen |
|---|---|---|---|
| F_dismiss | float | ≥ 0 | PRIM:041 |
| ρ_D(Φ) | float | (−1, 0] | PRIM:042 |
| d_dismiss | float | > 0 | PRIM:042 |
| T_dismiss | float | > 0 | PRIM:042 |
| r_dismiss | float | (0, r_capture] | PRIM:041 |
| ψ_dismiss | enum | 3-value set | PRIM:041 |
| t_dismiss | float | ≥ 0 | PRIM:042 |
| v_depart | float | ≥ 0 | PRIM:042 |
| β_D | float | (−∞, 0] | PRIM:042 |
§11.4 State Flag Registry#
| Flag | Set by | Cleared by | Meaning |
|---|---|---|---|
| DISMISSED | PRIM:042 | Never (terminal for this relation) | (A, E) binding severed; Dismissal Well active |
| DISMISS_INVALID | PRIM:041 | — | DISM conditions failed; no state mutation occurred |
| DISMISS_PHANTOM | PRIM:041 | — | FM-006 phantom guard triggered; d_dismiss bounded |
§11.5 Wave Tracker#
| Wave | Files | PRIMs | Status |
|---|---|---|---|
| 0 | 3 | — | ✅ Complete |
| 1 | 6 | — | ✅ Complete |
| 2 | 3 | 001–006 | ✅ Complete |
| 3 | 8 | 007–024 | ✅ Complete |
| 4 | 8 | 025–040 | ✅ Complete |
| 5 | 1 | 041–042 | ✅ This file |
Module running total: 29 files · 42 PRIMs · 10 FMs · 10 INVs
§11.6 Changelog#
v1.0.0 — 2026-08-14 — SES-20260814-DISMISS-001
Wave 5 opener. Formalizes F_dismiss operator family from GravityOfDismissal.md §6.
Freezes 9 operators: F_dismiss, ρ_D(Φ), d_dismiss, T_dismiss, r_dismiss,
ψ_dismiss, t_dismiss, v_depart, β_D.
Defines DISM-1 through DISM-5 conditions (conjunctive, INV-005).
PRIM:041 evaluate_dismissal (Pure): mode inference, DISM gate, well computation.
PRIM:042 execute_dismissal (Impure): state mutation, DismissalRecord, well_query_fn.
Three dismissal modes: INTENTIONAL / STRUCTURAL / DRIFT.
FM-006 phantom guard on INTENTIONAL mode with near-null field.
Four canonical examples: intentional, structural batch, drift, phantom guard.
Running PRIM total: 42.
§11.7 Suggested Commit Message#
feat(FFF_Gravity): add f_Dismiss.md — Wave 5, PRIM:041–042
Formalizes F_dismiss operator family from GravityOfDismissal.md Wave 0 stub.
Freezes 9 operators (F_dismiss, ρ_D(Φ), d_dismiss, T_dismiss, r_dismiss,
ψ_dismiss, t_dismiss, v_depart, β_D). Defines DISM-1–5 conditions and
PRIM:041 (evaluate_dismissal, Pure) + PRIM:042 (execute_dismissal, Impure).
Dismissal Well: ρ_D(Φ,t) = −d_dismiss × exp(−t/T_dismiss)
Re-capture gate: d_bind_approach(t) > |ρ_D(Φ,t)|
Modes: INTENTIONAL · STRUCTURAL · DRIFT
FM-006 phantom guard active for near-null INTENTIONAL dismissals.
well_query_fn closure returned from PRIM:042 for re-capture feasibility.
Wave 5 complete. Module total: 29 files · 42 PRIMs.
Session: SES-20260814-DISMISS-001
End of f_Dismiss.md — [FFF:GRAVITY:DISMISS] v1.0.0 · Wave 5 · PRIM:041–042 · Session SES-20260814-DISMISS-001 · 2026-08-14