The Mass/Size Mismatch

The moon’s transit-timing variations weigh the unseen companion dynamically — this is the primary mass channel; radial velocity would corroborate it but is not yet within reach. Transit photometry sizes whatever crosses the star. For a normal planet, mass and size agree. Here they cannot: the mass is a planet’s, but the only thing that ever transits is a moon — and the body that carries the mass never transits at all, even though the moon’s small orbit carries it across the stellar disk at every non-grazing moon transit.

The one geometry that could hide the primary — a grazing outer orbit, whose primary misses the disk while the moon still transits — is computed rather than assumed. Marginalizing the two-body sky geometry over the survey model’s declared priors, that configuration carries 2.7% of the prior mass given only that the moon transits at least once, and less than 2.8×10−6 once a regular full-chord series (≥90% of the predicted epochs) is required. That is a prior-predictive miss probability under the declared conditioning — not a frequentist coverage statement, and not a posterior probability that the primary is small: the geometry-averaged completeness of the primary-transit search is better than 1 − 2.8×10−6.

Code
from lastmoon.physics import constants as c
from lastmoon.physics.orbits import orbital_velocity
from lastmoon.physics.signatures import mass_size_mismatch, transit_depth

# Reflex (RV) semi-amplitude of a Sun-like star from an Earth-mass companion at 1 AU
k_rv = orbital_velocity(c.AU, c.M_SUN) * (c.M_EARTH / c.M_SUN)
depth_moon_sun = transit_depth(c.LUNAR_RADIUS, c.R_SUN)
depth_earth_sun = transit_depth(c.R_EARTH, c.R_SUN)
mismatch = mass_size_mismatch(c.M_EARTH, c.LUNAR_RADIUS)
print(f"RV semi-amplitude (Earth-mass at 1 AU, Sun-like star): {k_rv*100:.1f} cm/s")
print(f"Transit depth if the EARTH transited: {depth_earth_sun*1e6:.0f} ppm")
print(f"Transit depth actually observed (Moon-sized): {depth_moon_sun*1e6:.1f} ppm")
print(f"Mass/size mismatch factor: {mismatch:.1f}x")
RV semi-amplitude (Earth-mass at 1 AU, Sun-like star): 8.9 cm/s
Transit depth if the EARTH transited: 84 ppm
Transit depth actually observed (Moon-sized): 6.2 ppm
Mass/size mismatch factor: 3.7x

The dynamical mass predicts a rocky body 3.7× larger in radius than anything that transits. That ratio is a proxy: the transiting radius belongs to the moon, not to the body carrying the mass. The constraint that actually bounds the primary is the absence of its own transit:

Code
from lastmoon.physics.signatures import (
    primary_density_lower_bound_kg_m3,
    primary_radius_upper_limit_m,
)
from lastmoon.survey.instruments import JWST

r_star = 0.3 * c.R_SUN
delta_lim = 3.0 * JWST.floor_ppm * 1e-6  # single-visit 3-sigma at the 20 ppm floor
r_p_max = primary_radius_upper_limit_m(r_star, delta_lim)
rho_p_min = primary_density_lower_bound_kg_m3(c.M_EARTH, r_star, delta_lim)
print(f"Earth-radius primary transit depth at 0.3 R_sun: {transit_depth(c.R_EARTH, r_star)*1e6:.0f} ppm")
print(f"Non-detection at {delta_lim*1e6:.0f} ppm bounds the primary radius to < {r_p_max/1e3:.0f} km")
print(f"Earth-mass primary inside that radius: density > {rho_p_min/1e3:.0f} g/cm^3")
Earth-radius primary transit depth at 0.3 R_sun: 934 ppm
Non-detection at 60 ppm bounds the primary radius to < 1617 km
Earth-mass primary inside that radius: density > 337 g/cm^3

Around an M-dwarf the same geometry is far more favourable:

Code
import matplotlib.pyplot as plt

from lastmoon.figures.style import apply_style

apply_style()
r_mdwarf = 0.3 * c.R_SUN
cases = ["Sun-like\nexpected", "Sun-like\nobserved", "M-dwarf\nexpected", "M-dwarf\nobserved"]
depths_ppm = [
    transit_depth(c.R_EARTH, c.R_SUN) * 1e6,
    transit_depth(c.LUNAR_RADIUS, c.R_SUN) * 1e6,
    transit_depth(c.R_EARTH, r_mdwarf) * 1e6,
    transit_depth(c.LUNAR_RADIUS, r_mdwarf) * 1e6,
]
fig, ax = plt.subplots()
ax.bar(cases, depths_ppm)
ax.set_yscale("log")
ax.set_ylabel("transit depth (ppm)")
fig
Figure 1: Expected vs observed transit depth (TTV is the primary mass channel; RV corroborates when in reach).
NoteWhat this means for the paper

The mass-size mismatch is flagged first by the TTV (the leading dynamical channel), and corroborated when — and if — RV reaches the required precision. The primary’s density bound comes from its absent transit (an Earth-radius primary would show a ~930 ppm event at 0.3 R☉; its non-detection at 60 ppm gives R_p ≲ 1617 km and ρ_p ≳ 337 g/cm³ at the Earth-mass branch). The moon-radius proxy (~272 g/cm³) coincides numerically only because R_p,max happens to sit near the Moon’s radius. The bound tightens for the smallest stars, where the same depth limit corresponds to a smaller radius — exactly where small-star surveys look. The paper’s mock survey quantifies which instruments can reach both channels.

WarningIdealizations

Circular edge-on orbits; the terrestrial mass-radius relation R ∝ M^0.27 for the “expected” rocky radius; no limb darkening or noise.