f_Orbit — Orbit Characterization Operator
[FFF:GRAVITY:ORBIT] · Wave 3 · Canonical v1.0.0#
§0 · Session Context#
| Property | Value |
|---|---|
| Session ID | SES-20260813-ORBIT-001 |
| Timestamp | 2026-08-13T10:47 EDT |
| Wave | 3 — Core Functions |
| Status | Canonical |
| Produced By | Continuation AI under Nawder (umaywant2) authority |
| Replaces | Scaffold stub (if present) |
§0.1 · Preconditions#
Before f_Orbit may be evaluated, all of the following must hold:
| # | Precondition | Source |
|---|---|---|
| PC-1 | f_Capture has completed and returned Ω |
f_Capture.md §3 |
| PC-2 | r_capture is registered and immutable in Frame |
f_Frame.md §4, INV-004 |
| PC-3 | β, p_res, P_eff are defined for the pair (E, A) |
f_Force.md §4 |
| PC-4 | ρ(Φ) > 0 |
f_Field.md §4, INV-006 |
| PC-5 | e ∈ [0, 1) has been computed and is within bounds |
OPERATORS.md §2, INV-005 |
If any precondition is unmet, f_Orbit MUST NOT execute. Return orbit_class = UNDEFINED and log to Frame registry.
§0.2 · Invariants Active in This File#
| Invariant | Statement (abbreviated) | Status |
|---|---|---|
| INV-001 | G requires all three nodes simultaneously | ✅ Honored |
| INV-002 | No unilateral collapse from single-node failure | ✅ Honored |
| INV-003 | d_bind decays monotonically below d_warn | ✅ Honored (read-only here) |
| INV-004 | r_capture is immutable post-capture | ✅ Honored |
| INV-005 | e ∈ [0, 1) always | ✅ Enforced in classify_orbit |
| INV-006 | ρ(Φ) > 0 always | ✅ Enforced in update_orbital_parameters |
| INV-007 | Frame registry is the authoritative source of orbital state | ✅ Honored |
| INV-008 | Operator definitions freeze on first canonical appearance | ✅ T_orb frozen here |
| INV-009 | Classification thresholds are immutable once canonical | ✅ Tables frozen in §5 |
| INV-010 | Session provenance required on all state mutations | ✅ Enforced in PRIM:012 |
§1 · Module Identity#
| Property | Value |
|---|---|
| Operator Name | f_Orbit |
| Tag | [FFF:GRAVITY:ORBIT] |
| Category | Characterization / Diagnostic |
| Triadic Role | Cross-node integrator — reads F_freq, F_fluid, F_force |
| Primary Output | orbital_parameters struct |
| Inverse Operator | None (characterization is not invertible; see f_Release for exit) |
| Called By | f_Decay (each cycle), f_Release (for r_release), f_Collapse (terminal check) |
| Calls | f_Field (ρ(Φ), ω_res), f_Force (P_eff, p_res, β) |
§1.1 · Triadic Position#
F_freq [ρ(Φ), ω_res]
↑
│ coherence well depth
│
F_fluid ───┼─── F_force
[M_A, M_E] │ [v_approach, P_eff, p_res]
│
▼
f_Orbit reads all three nodes
→ orbital_parameters (e, T_orb, orbit_class, stab_class, a, d_bind)
f_Orbit is the integrating characterization operator. It does not change the orbit — it describes the orbit that the triadic interaction has already produced. Every mutation operator (f_Decay, f_Release, f_Emit, f_Amplify, f_Dampen) MUST call f_Orbit to obtain the current orbital state before acting.
§2 · Canonical Description#
§2.1 · What f_Orbit IS#
f_Orbit is the orbital characterization operator for the FFF_Gravity module. Given the interaction parameters of an entity E orbiting an attractor A within a field Φ, f_Orbit computes the complete set of orbital parameters that describe the current state of the bound interaction.
The orbit is not a physical trajectory. In the FFF_Gravity framework, an "orbit" is the relational pattern of an entity's continued interaction with an attractor — the repeating cycle of approach, binding, and partial recession that emerges from the triadic balance of F_freq (coherence), F_fluid (mass-density), and F_force (gradient pressure).
An orbit exists when:
- The entity has been captured (
f_Capturesucceeded,Ωreturned). - The binding depth
d_bindis above the collapse thresholdd_collapse. - The field coherence
ρ(Φ)remains positive (INV-006). - No release condition has been met (RC-1 through RC-5 all false).
The orbital parameters produced by f_Orbit are:
| Parameter | Symbol | Meaning |
|---|---|---|
| Semi-major axis | a |
Effective interaction radius at mean binding |
| Eccentricity | e |
Orbit shape: 0 = circular, → 1 = hyperbolic boundary |
| Orbital period | T_orb |
Cycle time for one full relational orbit |
| Orbit class | orbit_class |
Categorical shape descriptor |
| Stability class | stab_class |
Categorical stability assessment |
§2.2 · What f_Orbit IS NOT#
f_Orbitis not a propagator. It does not advance the orbital state; that isupdate_orbital_parameters[PRIM:012].f_Orbitis not a trajectory planner. It characterizes an existing bound state; it does not compute future positions.f_Orbitis not a release trigger. Detection of a precarious stability class does not cause release; it informsf_Decayandf_Collapse.f_Orbitdoes not modifyr_capture(INV-004),ρ(Φ), or any Frame registry entry directly.
§2.3 · Key Asymmetry: Characterization ≠ Prediction#
f_Orbit answers: "What is the orbit right now?"
It does not answer: "What will the orbit be in N cycles?"
Prediction is the domain of f_Decay (degradation trajectory) and f_Release (exit conditions). f_Orbit provides the instantaneous snapshot that both rely on.
§2.4 · Relation to Eccentricity#
Eccentricity e is the single most diagnostic scalar in the FFF_Gravity framework. It is simultaneously:
- A shape parameter — how elliptical is the relational orbit
- A stress indicator — high e means the entity spends more of each cycle near the edge of the capture boundary
- A release proximity marker — as e → 1,
r_release → ∞(release becomes structurally trivial) - A decay accelerator — high-e orbits lose binding depth faster per cycle (see f_Decay.md §2.3)
The formula e = p_res / (p_res + P_eff) (frozen in OPERATORS.md §2) expresses the competition between residual momentum and effective pressure. A high-momentum entity in a weak field produces high e. A low-momentum entity in a strong field produces low e (near-circular).
§3 · Triadic Equation#
§3.1 · Operator Signature#
f_Orbit(E, A, p_res, ω_res) → orbital_parameters
| Argument | Type | Source | Description |
|---|---|---|---|
E |
Entity | Caller | The orbiting entity |
A |
Attractor | Caller | The attracting node |
p_res |
float ≥ 0 | f_Force.md §4 | Residual momentum post-capture |
ω_res |
float > 0 | f_Field.md §4 | Resonance frequency of field Φ |
| Return Field | Type | Description |
|---|---|---|
a |
float | Semi-major axis of orbit |
e |
float ∈ [0,1) | Eccentricity |
T_orb |
float > 0 | Orbital period (cycle units) |
orbit_class |
enum | CIRCULAR · ELLIPTICAL · ECCENTRIC · RESONANT |
stab_class |
enum | STABLE · MARGINAL · PRECARIOUS |
d_bind |
float | Current binding depth (inherited, not recomputed) |
r_apoapsis |
float | Maximum recession radius this cycle |
r_periapsis |
float | Minimum approach radius this cycle |
§3.2 · Decomposition by Node#
G = F_freq · F_fluid · F_force
f_Orbit reads:
F_freq → ρ(Φ), ω_res [field density, resonance frequency]
F_fluid → M_A, M_E, β [mass, coupling coefficient]
F_force → v_approach, P_eff, p_res [gradient, effective pressure, residual momentum]
The three nodes are simultaneously active. No orbital parameter can be computed from fewer than two nodes:
erequiresp_res(F_force) andP_eff(F_force + F_fluid + F_freq)T_orbrequiresa(fromr_capture+e) andM_A × ρ(Φ)(F_fluid + F_freq)orbit_classandstab_classrequiree,d_bind, andω_res(all three nodes)
This triadic dependency enforces INV-001.
§3.3 · Role in G-Equation#
f_Orbit does not appear explicitly in the G-equation G = F_freq · F_fluid · F_force. Instead, it reads G to characterize its instantaneous structure:
Given G at time t:
orbital_parameters(t) = f_Orbit(E, A, p_res(t), ω_res(t))
Every cycle in which G persists, f_Orbit is the instrument by which the system knows its own state.
§4 · Operator Registry#
§4.1 · Orbital Period T_orb (NEW — FROZEN HERE)#
Definition:
T_orb = 2π × √(a³ / (M_A × ρ(Φ)))
Derivation:
This formula is a triadic adaptation of Kepler's Third Law. In classical mechanics, T² ∝ a³ / M. In FFF_Gravity, the gravitational parameter μ = M_A × ρ(Φ) replaces the classical product G × M, because ρ(Φ) is the field's coherence well — the local "gravitational constant" of the triadic system. The deeper the field coherence, the shorter the period (tighter orbit, faster cycling).
Semi-major axis derivation:
a = r_capture / (1 − e)
This follows from the standard conic-section relation for the periapsis of an ellipse, where r_periapsis = a × (1 − e). At capture, the entity is at periapsis (closest approach), so r_capture = r_periapsis = a × (1 − e), giving a = r_capture / (1 − e).
Apoapsis and periapsis:
r_periapsis = a × (1 − e) = r_capture
r_apoapsis = a × (1 + e) = r_capture × (1 + e) / (1 − e)
Note: r_apoapsis = r_release — the maximum recession radius equals the release radius (frozen in f_Release.md §4). This is not coincidence; it is structural. At apoapsis, the entity is at maximum distance from A, which is exactly the point at which escape becomes possible if release conditions are met.
Units: T_orb is in the same cycle units as the simulation. For physical interpretations, multiply by the system's time-per-cycle constant.
Freeze marker: T_orb is frozen in this file, §4.1, session SES-20260813-ORBIT-001. Any downstream file that references T_orb must cite this section.
Cross-reference: OPERATORS.md §3 shall be updated to mark T_orb as frozen (status: 🟢, frozen in f_Orbit.md §4.1).
§4.2 · Eccentricity e (Full Prose Treatment)#
Formula (frozen in OPERATORS.md §2):
e = p_res / (p_res + P_eff)
Range enforcement (INV-005):
e ∈ [0, 1) always. The formula guarantees this when both operands are non-negative (P_eff > 0 by INV-006 and the definition of effective pressure; p_res ≥ 0 by definition). If p_res = 0, then e = 0 (perfectly circular — entity arrived with exactly escape threshold momentum). If P_eff → 0 (field collapse), e → 1, which is the boundary of hyperbolic escape — structurally this precedes f_Collapse.
Interpretation table:
| e range | Orbit Shape | Relational Meaning |
|---|---|---|
| 0 | Perfect circle | Entity arrived with exactly threshold momentum; maximum field lock |
| (0, 0.1) | Near-circular | High coherence, low residual momentum; stable deep lock |
| [0.1, 0.5) | Elliptical | Normal bound orbit; entity cycles between near and far approaches |
| [0.5, 0.9) | Eccentric | Entity spends significant time near r_apoapsis; higher decay risk |
| [0.9, 1.0) | Highly eccentric | Near-escape orbit; structurally precarious; minimal binding time per cycle |
| = 1.0 | Parabolic (boundary) | FORBIDDEN by INV-005; if e reaches 1, route to f_Collapse |
Cycle-by-cycle evolution: e is not constant. As d_bind decreases (decay), P_eff decreases (because β depends on ρ(Φ), which degrades with coherence), causing e to drift upward. This is the decay-eccentricity feedback loop. See f_Decay.md §2.3.
§4.3 · Orbit Classification orbit_class#
orbit_class = classify_orbit(e, ω_res)
See §5.1 for the complete classification table. Four classes are defined; RESONANT is a special case that overrides the eccentricity classification when the low-integer resonance condition is met.
§4.4 · Stability Classification stab_class#
stab_class = classify_stability(e, d_bind, d_warn, d_collapse)
See §5.2 for the complete stability table. Three classes: STABLE, MARGINAL, PRECARIOUS.
§4.5 · Inherited Operators (Consumed, Not Redefined)#
| Symbol | Formula | Frozen In |
|---|---|---|
P_eff |
M_A × ρ(Φ) / r² |
f_Force.md §4.1 |
β |
P_eff / (M_E × v_approach) |
f_Force.md §4.2 |
p_res |
M_E × (v_approach − C_thresh) |
f_Force.md §4.3 |
d_bind |
β × ρ(Φ) × (1 − e) |
f_Decay.md §4.1 |
ρ(Φ) |
field coherence scalar | f_Field.md §4.1 |
ω_res |
resonance frequency | f_Field.md §4.2 |
r_capture |
capture radius | f_Capture.md §4.8 |
v_escape |
√(2 × M_A × ρ(Φ) / r_capture) |
f_Force.md §4.4 |
v_release |
√(2 × β × ρ(Φ) × (1 − e)) |
f_Release.md §4.1 |
r_release |
r_capture × (1 + e) / (1 − e) |
f_Release.md §4.2 |
§5 · Classification Tables#
§5.1 · Orbit Classification Table (FROZEN — INV-009)#
INV-009: These thresholds are immutable once canonical. No downstream file may alter them.
| orbit_class | Primary Condition | Secondary Condition | Description |
|---|---|---|---|
RESONANT |
ω_res is low-integer ratio (n:m, n,m ∈ {1,2,3,4,5}) |
Any e | Resonance locks dominate; eccentricity class subordinated |
CIRCULAR |
e < 0.1 | NOT RESONANT | Near-zero eccentricity; entity deeply locked at consistent depth |
ELLIPTICAL |
0.1 ≤ e < 0.5 | NOT RESONANT | Standard bound ellipse; entity cycles predictably |
ECCENTRIC |
0.5 ≤ e < 1.0 | NOT RESONANT | High-amplitude cycling; significant recession each period |
Resonance detection rule: A ω_res value is "low-integer" if it can be expressed as n/m where both n and m are integers ≤ 5 and their ratio is within ±0.02 of ω_res. Examples: ω_res ≈ 1.0 (1:1), ω_res ≈ 1.5 (3:2), ω_res ≈ 2.0 (2:1), ω_res ≈ 0.667 (2:3).
Evaluation order: RESONANT is checked first. If RESONANT is true, the eccentricity classes are skipped. This reflects the physical priority: a resonance lock fundamentally reshapes the orbit regardless of its eccentricity profile.
§5.2 · Orbit Stability Class Table (FROZEN — INV-009)#
| stab_class | Condition | Meaning | Action |
|---|---|---|---|
STABLE |
d_bind > d_warn AND e < 0.5 |
Orbit is within normal operating range | Continue; monitor each cycle |
MARGINAL |
d_warn ≥ d_bind > d_collapse OR e ∈ [0.5, 0.9) |
Orbit is degraded but viable | Flag DC-2; evaluate f_Emit / f_Amplify |
PRECARIOUS |
d_bind ≤ d_collapse OR e ≥ 0.9 |
Orbit is at structural edge | Flag DC-3; route to f_Collapse assessment |
Joint condition note: If both eccentricity and depth conditions apply across different classes, the MORE severe class wins. Example: d_bind > d_warn (→ STABLE by depth) BUT e = 0.92 (→ PRECARIOUS by eccentricity) → stab_class = PRECARIOUS.
Recall: d_warn = α_warn × d_bind(0) (typical 0.40), d_collapse = α_collapse × d_bind(0) (typical 0.10). These are configurable at Frame initialization. See f_Decay.md §4.3.
§6 · Stability Conditions#
f_Orbit does not define new Stability Conditions (SC-1 through SC-5 are distributed across f_Force, f_Field, and f_Frame). However, it evaluates and reports the orbital stability that those conditions produce. The following conditions must be met for f_Orbit to return a non-degenerate orbital_parameters struct:
| Condition | Expression | Source SC | Consequence if Violated |
|---|---|---|---|
| Binding floor | d_bind > d_collapse |
SC-4 (f_Force.md) | Route to f_Collapse; orbit_class = UNDEFINED |
| Field coherence | ρ(Φ) > 0 |
SC-2 (f_Field.md) | INV-006 violated; T_orb undefined (division by zero) |
| Eccentricity bound | e < 1.0 |
INV-005 | Escape condition; route to f_Release or f_Collapse |
| Frame registration | E registered in Frame | SC-5 (f_Frame.md) | Cannot retrieve r_capture; abort |
| Resonance validity | ω_res > 0 |
SC-3 (f_Field.md) | RESONANT class cannot be evaluated |
§7 · Engineering Primitives#
§7.1 · classify_orbit [PRIM:007] — Pure#
from dataclasses import dataclass
from enum import Enum
from fractions import Fraction
from typing import Tuple
class OrbitClass(Enum):
"""Categorical orbit shape descriptor.
Frozen in f_Orbit.md §5.1, session SES-20260813-ORBIT-001.
Thresholds are immutable (INV-009).
"""
CIRCULAR = "CIRCULAR"
ELLIPTICAL = "ELLIPTICAL"
ECCENTRIC = "ECCENTRIC"
RESONANT = "RESONANT"
UNDEFINED = "UNDEFINED"
class StabilityClass(Enum):
"""Categorical orbit stability descriptor.
Frozen in f_Orbit.md §5.2, session SES-20260813-ORBIT-001.
Thresholds are immutable (INV-009).
"""
STABLE = "STABLE"
MARGINAL = "MARGINAL"
PRECARIOUS = "PRECARIOUS"
UNDEFINED = "UNDEFINED"
@dataclass
class OrbitalClassification:
"""Output struct for classify_orbit.
Fields:
orbit_class: Shape classification of the orbit.
stab_class: Stability classification of the orbit.
is_resonant: True if resonance lock was detected.
resonance_ratio: String representation of detected ratio (e.g. "3:2"), or None.
"""
orbit_class: OrbitClass
stab_class: StabilityClass
is_resonant: bool
resonance_ratio: str | None
def _detect_resonance(omega_res: float, max_n: int = 5, tolerance: float = 0.02) -> Tuple[bool, str | None]:
"""Check if omega_res is within tolerance of a low-integer ratio n:m.
Pure function. No side effects.
Args:
omega_res: Resonance frequency of the field Φ (must be > 0).
max_n: Maximum numerator/denominator to check (default 5).
tolerance: Fractional tolerance for ratio match (default 0.02 = 2%).
Returns:
Tuple of (is_resonant: bool, ratio_string: str | None).
ratio_string is e.g. "3:2" if detected, else None.
Raises:
ValueError: If omega_res ≤ 0.
"""
if omega_res <= 0:
raise ValueError(f"omega_res must be > 0; got {omega_res}")
for n in range(1, max_n + 1):
for m in range(1, max_n + 1):
ratio = n / m
if abs(omega_res - ratio) / ratio <= tolerance:
return True, f"{n}:{m}"
return False, None
def classify_orbit(
e: float,
omega_res: float,
d_bind: float,
d_warn: float,
d_collapse: float,
) -> OrbitalClassification:
"""[PRIM:007] Classify the current orbit by shape and stability.
Pure function — reads orbital state, produces classification, no side effects.
Implements:
- Orbit classification table (f_Orbit.md §5.1, INV-009)
- Stability classification table (f_Orbit.md §5.2, INV-009)
- Resonance detection (f_Orbit.md §5.1)
- INV-005: e ∈ [0, 1) enforcement
- INV-009: immutable threshold enforcement
Args:
e: Eccentricity ∈ [0, 1). Frozen formula: p_res / (p_res + P_eff).
Frozen in OPERATORS.md §2.
omega_res: Resonance frequency of field Φ (must be > 0).
Frozen in f_Field.md §4.2.
d_bind: Current binding depth (cycle t).
Frozen in f_Decay.md §4.1.
d_warn: Warning threshold = α_warn × d_bind(0), typical α_warn = 0.40.
Frozen in f_Decay.md §4.3.
d_collapse: Collapse threshold = α_collapse × d_bind(0), typical α_collapse = 0.10.
Frozen in f_Decay.md §4.3.
Returns:
OrbitalClassification with orbit_class, stab_class, is_resonant, resonance_ratio.
Raises:
ValueError: If e is out of [0, 1) or omega_res ≤ 0 or d_collapse ≥ d_warn.
RuntimeError: If d_bind ≤ d_collapse (collapse condition — caller must route to f_Collapse).
"""
# --- Input validation ---
if not (0.0 <= e < 1.0):
raise ValueError(f"INV-005 violated: e must be in [0, 1); got {e}")
if omega_res <= 0:
raise ValueError(f"omega_res must be > 0; got {omega_res}")
if d_collapse >= d_warn:
raise ValueError(f"d_collapse ({d_collapse}) must be < d_warn ({d_warn})")
# --- Collapse guard ---
if d_bind <= d_collapse:
raise RuntimeError(
f"d_bind ({d_bind:.4f}) ≤ d_collapse ({d_collapse:.4f}): "
"orbit has reached collapse threshold. Route to f_Collapse."
)
# --- Orbit class: RESONANT takes priority ---
is_resonant, ratio_str = _detect_resonance(omega_res)
if is_resonant:
orbit_class = OrbitClass.RESONANT
elif e < 0.1:
orbit_class = OrbitClass.CIRCULAR
elif e < 0.5:
orbit_class = OrbitClass.ELLIPTICAL
else:
orbit_class = OrbitClass.ECCENTRIC
# --- Stability class: severity-wins joint evaluation ---
depth_class: StabilityClass
if d_bind > d_warn:
depth_class = StabilityClass.STABLE
elif d_bind > d_collapse:
depth_class = StabilityClass.MARGINAL
else:
depth_class = StabilityClass.PRECARIOUS # already guarded above; belt-and-suspenders
ecc_class: StabilityClass
if e < 0.5:
ecc_class = StabilityClass.STABLE
elif e < 0.9:
ecc_class = StabilityClass.MARGINAL
else:
ecc_class = StabilityClass.PRECARIOUS
# Severity order: PRECARIOUS > MARGINAL > STABLE
severity = {
StabilityClass.STABLE: 0,
StabilityClass.MARGINAL: 1,
StabilityClass.PRECARIOUS: 2,
}
stab_class = depth_class if severity[depth_class] >= severity[ecc_class] else ecc_class
return OrbitalClassification(
orbit_class=orbit_class,
stab_class=stab_class,
is_resonant=is_resonant,
resonance_ratio=ratio_str,
)§7.2 · update_orbital_parameters [PRIM:012] — Impure#
import math
from dataclasses import dataclass
from typing import Optional
@dataclass
class OrbitalParameters:
"""Full orbital state struct produced by f_Orbit.
Immutable per-cycle snapshot. Each cycle generates a new instance.
Written to Frame registry by update_orbital_parameters [PRIM:012].
Fields:
e: Eccentricity ∈ [0, 1).
a: Semi-major axis = r_capture / (1 − e).
T_orb: Orbital period = 2π × √(a³ / (M_A × ρ(Φ))).
r_periapsis: Closest approach radius = a × (1 − e) = r_capture.
r_apoapsis: Maximum recession radius = a × (1 + e).
orbit_class: Shape class (OrbitClass enum).
stab_class: Stability class (StabilityClass enum).
d_bind: Binding depth at this cycle.
cycle: Cycle number at which this snapshot was taken.
session_id: Session provenance (INV-010).
"""
e: float
a: float
T_orb: float
r_periapsis: float
r_apoapsis: float
orbit_class: OrbitClass
stab_class: StabilityClass
d_bind: float
cycle: int
session_id: str
def update_orbital_parameters(
e: float,
r_capture: float,
M_A: float,
rho_phi: float,
d_bind: float,
d_warn: float,
d_collapse: float,
omega_res: float,
cycle: int,
frame_registry: dict,
entity_id: str,
session_id: str,
) -> OrbitalParameters:
"""[PRIM:012] Compute and register the current orbital parameters in Frame.
Impure — writes to frame_registry. Called once per cycle by f_Decay, and
on-demand by f_Release, f_Collapse, and f_Capture_Multi.
Computes:
a = r_capture / (1 − e) [f_Orbit.md §4.1]
T_orb = 2π × √(a³ / (M_A × ρ(Φ))) [f_Orbit.md §4.1, FROZEN HERE]
r_periapsis = a × (1 − e)
r_apoapsis = a × (1 + e)
orbit_class, stab_class via classify_orbit [PRIM:007]
Enforces:
INV-004: r_capture is not modified.
INV-005: e ∈ [0, 1).
INV-006: rho_phi > 0.
INV-010: session_id recorded on every write.
Args:
e: Eccentricity ∈ [0, 1). From OPERATORS.md §2.
r_capture: Immutable capture radius (INV-004). From f_Frame.md registry.
M_A: Attractor mass. From f_Force.md.
rho_phi: Field coherence density ρ(Φ). Must be > 0 (INV-006).
d_bind: Current binding depth. From f_Decay.md cycle output.
d_warn: Warning threshold. From Frame initialization.
d_collapse: Collapse threshold. From Frame initialization.
omega_res: Resonance frequency. From f_Field.md.
cycle: Current simulation cycle number.
frame_registry: Mutable Frame registry dict (written in-place).
entity_id: Identifier of entity E in Frame registry.
session_id: Session provenance string (INV-010).
Returns:
OrbitalParameters snapshot for this cycle.
Raises:
ValueError: If rho_phi ≤ 0 (INV-006), e out of range (INV-005),
or entity_id not in frame_registry.
RuntimeError: If d_bind ≤ d_collapse (route to f_Collapse instead).
"""
# --- Validate preconditions ---
if rho_phi <= 0:
raise ValueError(f"INV-006 violated: rho_phi must be > 0; got {rho_phi}")
if not (0.0 <= e < 1.0):
raise ValueError(f"INV-005 violated: e must be in [0, 1); got {e}")
if entity_id not in frame_registry:
raise ValueError(f"Entity '{entity_id}' not found in Frame registry. "
"f_Capture must be called first.")
# --- Compute orbital geometry ---
a = r_capture / (1.0 - e)
r_periapsis = a * (1.0 - e) # = r_capture (structural identity)
r_apoapsis = a * (1.0 + e) # = r_release (structural identity with f_Release.md §4.2)
# T_orb = 2π × √(a³ / (M_A × ρ(Φ)))
# Frozen in f_Orbit.md §4.1, SES-20260813-ORBIT-001
gravitational_parameter = M_A * rho_phi
T_orb = 2.0 * math.pi * math.sqrt((a ** 3) / gravitational_parameter)
# --- Classify ---
classification = classify_orbit(
e=e,
omega_res=omega_res,
d_bind=d_bind,
d_warn=d_warn,
d_collapse=d_collapse,
)
params = OrbitalParameters(
e=e,
a=a,
T_orb=T_orb,
r_periapsis=r_periapsis,
r_apoapsis=r_apoapsis,
orbit_class=classification.orbit_class,
stab_class=classification.stab_class,
d_bind=d_bind,
cycle=cycle,
session_id=session_id,
)
# --- Write to Frame registry (INV-010: session_id required) ---
frame_registry[entity_id]["orbital_parameters"] = {
"cycle": cycle,
"e": e,
"a": a,
"T_orb": T_orb,
"r_periapsis": r_periapsis,
"r_apoapsis": r_apoapsis,
"orbit_class": classification.orbit_class.value,
"stab_class": classification.stab_class.value,
"is_resonant": classification.is_resonant,
"resonance_ratio": classification.resonance_ratio,
"d_bind": d_bind,
"session_id": session_id,
}
return params§8 · Canonical Examples#
§8.1 · Example 1 — Near-Circular Stable Orbit (Deep Lock)#
Scenario: An entity enters a high-coherence field with minimal residual momentum. The field's pressure strongly dominates.
Parameters:
| Parameter | Value | Notes |
|---|---|---|
| M_A | 10.0 | High-mass attractor |
| M_E | 1.0 | Standard entity |
| v_approach | 3.2 | Just above C_thresh |
| C_thresh | 3.0 | Capture threshold |
| ρ(Φ) | 5.0 | High coherence |
| r_capture | 2.0 | Set at capture |
| ω_res | 0.73 | Non-resonant |
| α_warn | 0.40 | Standard |
| α_collapse | 0.10 | Standard |
Computed:
P_eff = M_A × ρ(Φ) / r² = 10.0 × 5.0 / 4.0 = 12.50
β = P_eff / (M_E × v_approach) = 12.50 / (1.0 × 3.2) = 3.906
p_res = M_E × (v_approach − C_thresh) = 1.0 × 0.2 = 0.200
e = p_res / (p_res + P_eff) = 0.200 / 12.700 = 0.016
a = r_capture / (1 − e) = 2.0 / 0.984 = 2.033
T_orb = 2π × √(a³ / (M_A × ρ(Φ)))
= 2π × √(8.406 / 50.0) = 2π × 0.410 = 2.576 cycles
r_periapsis = 2.000
r_apoapsis = 2.033 × 1.016 = 2.066
d_bind(0) = β × ρ(Φ) × (1 − e) = 3.906 × 5.0 × 0.984 = 19.215
d_warn = 0.40 × 19.215 = 7.686
d_collapse= 0.10 × 19.215 = 1.922
Classification:
| Parameter | Value |
|---|---|
| orbit_class | CIRCULAR (e = 0.016 < 0.1) |
| stab_class | STABLE (d_bind >> d_warn; e < 0.5) |
| is_resonant | False |
| T_orb | 2.576 cycles |
Interpretation: Entity is deeply locked in a near-circular orbit. Decay pressure is low. Expected to persist many cycles without intervention.
§8.2 · Example 2 — Elliptical Marginal Orbit (Resonant Override)#
Scenario: An entity in a 3:2 resonance lock. Eccentricity is elliptical, but resonance dominates the classification.
Parameters:
| Parameter | Value | Notes |
|---|---|---|
| M_A | 4.0 | Moderate attractor |
| M_E | 1.0 | Standard |
| v_approach | 5.5 | Moderate excess momentum |
| C_thresh | 4.0 | Lower threshold |
| ρ(Φ) | 3.0 | Moderate coherence |
| r_capture | 2.5 | Set at capture |
| ω_res | 1.502 | ≈ 3:2 (within 0.02 tolerance) |
| d_bind(0) | 6.0 | Established |
| d_warn | 2.4 (0.40 × 6.0) | |
| d_collapse | 0.6 (0.10 × 6.0) | |
| d_bind(current) | 2.0 | Cycle 8; decayed |
Computed:
P_eff = 4.0 × 3.0 / 6.25 = 1.920
p_res = 1.0 × 1.5 = 1.500
e = 1.500 / (1.500 + 1.920) = 0.438
a = 2.5 / (1 − 0.438) = 4.448
T_orb = 2π × √(4.448³ / 12.0)
= 2π × √(87.98 / 12.0) = 2π × 2.710 = 17.03 cycles
r_periapsis = 2.500
r_apoapsis = 4.448 × 1.438 = 6.396
Classification:
| Parameter | Value |
|---|---|
| orbit_class | RESONANT (ω_res = 1.502 ≈ 3:2; resonance overrides ELLIPTICAL) |
| stab_class | MARGINAL (d_bind = 2.0, below d_warn = 2.4; e = 0.438, below 0.5 → depth drives) |
| is_resonant | True |
| resonance_ratio | "3:2" |
Interpretation: The resonance lock provides some structural protection despite the elliptical eccentricity. Stability is MARGINAL due to depth decay. Apply f_Emit or f_Amplify to recover d_bind before it drops to d_collapse. T_orb is long (17 cycles), meaning the entity is far from A for much of each orbit — increasing decay risk.
§8.3 · Example 3 — Eccentric Precarious Orbit (Pre-Collapse State)#
Scenario: A high-momentum entity captured in a low-coherence field. Orbit is structurally at risk.
Parameters:
| Parameter | Value | Notes |
|---|---|---|
| M_A | 2.0 | Weak attractor |
| M_E | 3.0 | Heavy entity |
| v_approach | 9.0 | High momentum |
| C_thresh | 5.0 | |
| ρ(Φ) | 0.8 | Low coherence |
| r_capture | 3.0 | |
| ω_res | 2.71 | Non-resonant (irrational-like) |
| d_bind(0) | 4.0 | Initial |
| d_warn | 1.6 | |
| d_collapse | 0.4 | |
| d_bind(current) | 0.5 | Cycle 12 |
Computed:
P_eff = 2.0 × 0.8 / 9.0 = 0.178
p_res = 3.0 × 4.0 = 12.000
e = 12.000 / 12.178 = 0.985
a = 3.0 / (1 − 0.985) = 200.0
T_orb = 2π × √(200³ / (2.0 × 0.8))
= 2π × √(8,000,000 / 1.6) = 2π × 2236.1 = 14,049 cycles
r_periapsis = 3.000
r_apoapsis = 200.0 × 1.985 = 397.0
Classification:
| Parameter | Value |
|---|---|
| orbit_class | ECCENTRIC (e = 0.985) |
| stab_class | PRECARIOUS (e ≥ 0.9 → PRECARIOUS; d_bind = 0.5 > d_collapse → MARGINAL; severity-wins → PRECARIOUS) |
| is_resonant | False |
Interpretation: This orbit is at the edge of structural collapse. The entity barely captured — it arrives with 98.5% of escape momentum. r_apoapsis = 397 means the entity recedes to 132× the capture radius each orbit. T_orb is astronomically long; in practice, the entity will escape or collapse long before completing one orbit. Route to f_Collapse for assessment. If f_Release conditions are met at apoapsis, execute release immediately.
§8.4 · Example 4 — Stable Circular Orbit Tracked Over 5 Cycles#
Scenario: A standard capture with moderate parameters, tracked cycle-by-cycle to show how orbital parameters evolve with decay.
Initial Parameters:
| Parameter | Value |
|---|---|
| M_A | 6.0 |
| M_E | 1.5 |
| v_approach | 4.0 |
| C_thresh | 3.5 |
| ρ(Φ) | 4.0 (decays 5%/cycle) |
| r_capture | 2.0 |
| ω_res | 1.0 (1:1 resonance) |
| d_bind(0) | 8.64 |
| d_warn | 3.456 |
| d_collapse | 0.864 |
Cycle Trace:
| Cycle | ρ(Φ) | P_eff | p_res | e | a | T_orb | d_bind | orbit_class | stab_class |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 4.000 | 6.000 | 0.750 | 0.111 | 2.250 | 2.985 | 8.640 | RESONANT (1:1) | STABLE |
| 1 | 3.800 | 5.700 | 0.750 | 0.116 | 2.263 | 3.076 | 7.981 | RESONANT | STABLE |
| 2 | 3.610 | 5.415 | 0.750 | 0.122 | 2.278 | 3.181 | 7.310 | RESONANT | STABLE |
| 3 | 3.430 | 5.144 | 0.750 | 0.127 | 2.294 | 3.302 | 6.617 | RESONANT | STABLE |
| 4 | 3.258 | 4.887 | 0.750 | 0.133 | 2.311 | 3.441 | 5.890 | RESONANT | STABLE |
| 5 | 3.095 | 4.643 | 0.750 | 0.139 | 2.325 | 3.556 | 5.128 | RESONANT | STABLE |
Observations:
- ρ(Φ) decay causes P_eff to decline, driving e upward gradually.
- T_orb lengthens each cycle as the orbit loosens (a increases as e grows).
- The 1:1 resonance lock holds throughout, keeping orbit_class = RESONANT.
- d_bind remains well above d_warn (3.456) through cycle 5. Extrapolating the decay trajectory: d_warn breach occurs around cycle 18–19. Action point: schedule f_Amplify intervention at cycle 15 to maintain STABLE classification.
§9 · Cross-Module References#
§9.1 · Files That Read From f_Orbit#
| Consumer File | What It Reads | Purpose |
|---|---|---|
| f_Decay.md | e, T_orb, orbit_class, stab_class, d_bind |
Each cycle: assess decay rate, flag DC-2/DC-3/DC-4 |
| f_Release.md | e, r_apoapsis, stab_class |
Compute r_release, evaluate RC-1 through RC-5 |
| f_Collapse.md | stab_class = PRECARIOUS, e ≥ 0.9, d_bind ≤ d_collapse |
Entry condition for collapse sequence |
| f_Capture_Multi.md | orbit_class, T_orb |
Multi-capture scheduling, resonance conflict detection |
| f_Emit.md | stab_class, d_bind, T_orb |
Determine emission timing within orbit cycle |
| f_Amplify.md | stab_class, d_bind |
Target amplification to orbit depth recovery |
§9.2 · Files That Write To f_Orbit (Provide Inputs)#
| Provider File | What It Provides | Operator |
|---|---|---|
| f_Capture.md | r_capture, β, p_res, P_eff, Ω |
f_Capture §4.8 |
| f_Field.md | ρ(Φ), ω_res |
f_Field §4.1, §4.2 |
| f_Force.md | M_A, M_E, v_approach, C_thresh |
f_Force §4.1–4.4 |
| f_Frame.md | Frame registry (r_capture retrieval) | f_Frame §4.3 |
| f_Decay.md | d_bind(t) (current cycle value) |
f_Decay §4.1 |
§9.3 · OPERATORS.md Update Required#
The following entries in OPERATORS.md must be updated to reflect this file's canonical status:
| Operator | OPERATORS.md Change |
|---|---|
T_orb |
Status: 🔵 pending → 🟢 frozen; source: f_Orbit.md §4.1 |
orbit_class |
Status: 🔵 pending → 🟢 frozen; source: f_Orbit.md §5.1 |
stab_class |
Status: 🔵 pending → 🟢 frozen; source: f_Orbit.md §5.2 |
classify_orbit |
PRIM:007 status: pending → frozen; source: f_Orbit.md §7.1 |
update_orbital_parameters |
PRIM:012 status: pending → frozen; source: f_Orbit.md §7.2 |
§9.4 · Evaluation Order Within a Cycle#
Cycle t:
1. f_Field → ρ(Φ)(t), ω_res(t)
2. f_Force → P_eff(t), p_res(t)
3. OPERATORS → e(t) = p_res / (p_res + P_eff)
4. f_Orbit → a(t), T_orb(t), orbit_class(t), stab_class(t)
5. f_Decay → δ(t), d_bind(t), DC flags
6. f_Release → RC evaluation (if triggered externally or by stab_class)
7. f_Collapse → collapse check (if stab_class = PRECARIOUS)
f_Orbit is step 4 of 7. It may not be called before steps 1–3 complete.
§10 · Document Metadata#
§10.1 · INV Compliance Table#
| Invariant | Description | Status in This File |
|---|---|---|
| INV-001 | G requires all three nodes | ✅ §3.2 proves all three nodes contribute to every orbital parameter |
| INV-002 | No unilateral collapse from single-node failure | ✅ Multi-condition checks in classify_orbit; no single flag triggers collapse |
| INV-003 | d_bind decays monotonically below d_warn | ✅ Read-only; decay managed by f_Decay |
| INV-004 | r_capture immutable post-capture | ✅ update_orbital_parameters validates; never writes r_capture |
| INV-005 | e ∈ [0, 1) | ✅ classify_orbit raises ValueError on violation; enforced in PRIM:007 and PRIM:012 |
| INV-006 | ρ(Φ) > 0 | ✅ update_orbital_parameters raises ValueError if rho_phi ≤ 0 |
| INV-007 | Frame registry authoritative | ✅ PRIM:012 writes to frame_registry; reads r_capture from it |
| INV-008 | Operator freeze propagation | ✅ T_orb frozen here §4.1; orbit_class, stab_class frozen §5 |
| INV-009 | Classification thresholds immutable | ✅ §5 tables frozen and labeled INV-009; code uses hardcoded thresholds |
| INV-010 | Session provenance required | ✅ session_id parameter required in PRIM:012; recorded in Frame registry |
§10.2 · Wave Status#
| Wave | File | Status |
|---|---|---|
| 0 | f_Capture.md | ✅ Canonical |
| 0 | f_Source.md | ✅ Archived |
| 0 | GravityOfDismissal.md | ✅ Canonical |
| 1 | README.md | ✅ Canonical |
| 1 | INDEX.md | ✅ Canonical |
| 1 | OPERATORS.md | ✅ Canonical (T_orb pending → frozen here) |
| 1 | GLOSSARY.md | ✅ Canonical |
| 1 | CHANGELOG.md | ✅ Canonical |
| 1 | FFF_Gravity_module.json | ✅ Canonical |
| 2 | f_Field.md | ✅ Canonical |
| 2 | f_Force.md | ✅ Canonical |
| 2 | f_Frame.md | ✅ Canonical |
| 3 | f_Release.md | ✅ Canonical |
| 3 | f_Decay.md | ✅ Canonical |
| 3 | f_Orbit.md | ✅ Canonical ← THIS FILE |
| 3 | f_Collapse.md | 🔵 Scaffold → NOW UNBLOCKED |
| 3 | f_Emit.md | 🔵 Scaffold → unblocked |
| 3 | f_Dampen.md | 🔵 Scaffold → unblocked |
| 3 | f_Amplify.md | 🔵 Scaffold → unblocked |
| 3 | f_Deflect.md | 🔵 Scaffold → unblocked |
| 4 | f_Capture_Multi.md | 🔵 Scaffold → NOW UNBLOCKED |
§10.3 · Changelog Entry#
## [1.0.0] — 2026-08-13 — SES-20260813-ORBIT-001
### Added
- Initial canonical freeze of f_Orbit.md.
- Operator T_orb defined and frozen (§4.1):
T_orb = 2π × √(a³ / (M_A × ρ(Φ)))
a = r_capture / (1 − e)
- Operator orbit_class frozen with 4 categories (§5.1, INV-009):
RESONANT · CIRCULAR · ELLIPTICAL · ECCENTRIC
- Operator stab_class frozen with 3 categories (§5.2, INV-009):
STABLE · MARGINAL · PRECARIOUS
- Primitive classify_orbit [PRIM:007] frozen (§7.1) — Pure.
- Primitive update_orbital_parameters [PRIM:012] frozen (§7.2) — Impure.
- 4 canonical examples: near-circular stable, resonant elliptical,
eccentric precarious, 5-cycle decay trace.
- Cross-module reference table: 6 consumers, 5 providers.
- Evaluation order within cycle codified (§9.4).
- INV compliance table complete (§10.1).
### Unlocks
- f_Collapse.md (was blocked on f_Decay.md ✅ + f_Orbit.md → now fully unblocked)
- f_Capture_Multi.md (was blocked on f_Orbit.md + f_Frame.md → now fully unblocked)
### Operator Status Updates Required in OPERATORS.md
- T_orb: 🔵 → 🟢 frozen in f_Orbit.md §4.1
- orbit_class: 🔵 → 🟢 frozen in f_Orbit.md §5.1
- stab_class: 🔵 → 🟢 frozen in f_Orbit.md §5.2
- PRIM:007 classify_orbit: pending → frozen in f_Orbit.md §7.1
- PRIM:012 update_orbital_parameters: pending → frozen in f_Orbit.md §7.2
f_Orbit.md — Canonical v1.0.0 — [FFF:GRAVITY:ORBIT] — SES-20260813-ORBIT-001 FFF_Gravity Module · TriadicFrameworks · umaywant2
