"""Live surface invariants plus an immutable historical compatibility floor.

The inventories below preserve previously admitted names, not an exact ceiling
on new APIs. Current exports are curated by each module's own __all__; additions
must satisfy the same binding, identity, and callable checks as existing APIs.
"""

from __future__ import annotations

import inspect

import moira
import moira.classical as classical
import moira.essentials as essentials
import moira.facade as facade
import moira.predictive as predictive
import moira.sky as sky
import moira.sky.bodies as sky_bodies
import moira.sky.eclipse as sky_eclipse
import moira.sky.events as sky_events
import moira.sky.frames as sky_frames
import moira.sky.galactic as sky_galactic
import moira.sky.observation as sky_observation
import moira.sky.occultation as sky_occultation
import moira.sky.position as sky_position
import moira.sky.time as sky_time
import moira.sky.visibility as sky_visibility
import moira.vedic as vedic
import pytest

from tests.tools.public_api_contract import (
    compatibility_errors,
    instance_method_errors,
    public_method_names,
    surface_contract_errors,
)


_EXPECTED_ROOT_PUBLIC_NAMES = {
    # VED-004/006 bounded composition admission.
    "MuhurtaSearchPolicy", "MuhurtaMomentScore", "MuhurtaSearchWindow",
    "MuhurtaSearchResult", "MuhurtaResourceError", "MuhurtaCoverageError",
    "muhurta_score_for_chart", "find_muhurta_windows",
    # Published dated-Gochar package cbb4abc; its static guard was not reconciled.
    "GocharaNatalBavMode", "GocharaDatePolicy", "DEFAULT_GOCHARA_DATE_POLICY",
    "GocharaBirthLocation", "GocharaDatedPosition", "GocharaEpoch",
    "GocharaDateResult", "GocharaResourceError", "GocharaCoverageError",
    "gochara_at", "gochara_for_datetimes",
    "LunarMonthSystem", "LunarMonthPolicy", "CalendarBoundary", "LunarMonthLabel",
    "LunarLunation", "LunarMonthProvenance", "LunarMonthResult", "lunar_month_at",

    "PanchangaSunriseDefinition", "DailyPanchangaPolicy", "PanchangaMoment",
    "PanchangaSolarDate", "PanchangaLimbInterval", "PanchangaLimbDay",
    "DailyPanchangaProvenance", "DailyPanchangaResult", "daily_panchanga",
    "ASHTOTTARI_NAKSHATRA_LORD",
    "ASHTOTTARI_SEQUENCE",
    "ASHTOTTARI_TOTAL",
    "ASHTOTTARI_YEARS",
    "AccidentalConditionClassification",
    "AccidentalConditionKind",
    "AccidentalDignityClassification",
    "AccidentalDignityCondition",
    "AccidentalDignityEvaluationTruth",
    "AccidentalDignityPolicy",
    "AccidentalDignityTruth",
    "AlternateDashaPeriod",
    "AlternateDashaSequenceProfile",
    "AlternatePeriodProfile",
    "AshtakavargaChartProfile",
    "AshtakavargaPolicy",
    "AshtakavargaResult",
    "AshtottariPolicy",
    "AspectData",
    "AspectDirection",
    "AspectMotionBranch",
    "AspectMotionOrbPolicy",
    "AspectMotionState",
    "AspectMotionStationaryReason",
    "AspectMotionWitness",
    "AspectPolicy",
    "Ayanamsa",
    "BATCH_PROGRESSION_TECHNIQUES",
    "BhinnashtakavargaResult",
    "Body",
    "BodyVoidWindow",
    "BodyVoidWindows",
    "BatchFailure",
    "COMET_NAIF",
    "CalendarDateTime",
    "CartesianPosition",
    "Chart",
    "ChartConditionProfile",
    "ChartDignityProfile",
    "CometData",
    "CompoundRelationship",
    "ConditionNetworkEdge",
    "ConditionNetworkNode",
    "ConditionNetworkProfile",
    "ConditionPolarity",
    "DeclinationAspect",
    "DeclinationAspectAnalysis",
    "DeclinationAspectKind",
    "DeclinationAspectMotionWitness",
    "DeclinationAspectPolicy",
    "DeclinationEquatorPolicy",
    "DeclinationHemispherePolicy",
    "DeclinationMotionState",
    "LongitudeAspectAnalysis",
    "OccultationGeographicPole",
    "OccultationPathBoundaryPoint",
    "OccultationPathBoundarySide",
    "OccultationPathBoundaryTrack",
    "OccultationPathPoint",
    "OccultationPathTopology",
    "OccultationPathTopologyKind",
    "OccultationPoleCrossing",
    "OccultationPoleCrossingPhase",
    "DEBILITATION_SIGN",
    "DETRIMENT",
    "DOMICILE",
    "DeltaTPolicy",
    "DerivedHouseCusps",
    "DignitiesService",
    "DignityComputationPolicy",
    "DignityNodeDoctrine",
    "DignityScoringMode",
    "DignityScoringPolicy",
    "DignityConditionProfile",
    "DignityTier",
    "DispositorLink",
    "DispositorshipChain",
    "DispositorshipChartConditionProfile",
    "DispositorshipComparisonBundle",
    "DispositorshipComparisonItem",
    "DispositorshipComputationPolicy",
    "DispositorshipConditionProfile",
    "DispositorshipConditionState",
    "DispositorshipNetworkEdge",
    "DispositorshipNetworkEdgeMode",
    "DispositorshipNetworkNode",
    "DispositorshipNetworkProfile",
    "DispositorshipOrderingPolicy",
    "DispositorshipProfile",
    "DispositorshipRulership",
    "DispositorshipRulershipPolicy",
    "DispositorshipSubjectPolicy",
    "DispositorshipSubjectSet",
    "DispositorshipSubsystemProfile",
    "DispositorshipTerminationKind",
    "DispositorshipTerminationPolicy",
    "DispositorshipUnsupportedSubjectPolicy",
    "DistanceExtremes",
    "EXALTATION",
    "EXALTATION_DEGREE",
    "EXALTATION_SIGN",
    "EssentialDignityClassification",
    "EssentialDignityDoctrine",
    "EssentialDignityKind",
    "EssentialDignityPolicy",
    "EssentialDignityTruth",
    "EgyptianBoundsDoctrine",
    "ExtinctionCoefficient",
    "FALL",
    "FamilyResonance",
    "GalacticAngles",
    "GalacticHouseBoundaryProfile",
    "GalacticHouseCusps",
    "GalacticHousePlacement",
    "GeneralVisibilityEvent",
    "HarmogramChartDomain",
    "HarmogramIntensityFamily",
    "HarmogramIntensityPolicy",
    "HarmogramPolicy",
    "HarmogramTraceFamily",
    "HarmonicDomain",
    "HalbHayzDoctrine",
    "HeliacalEventKind",
    "HouseBoundaryCurvePoint",
    "HouseBoundaryGeometry",
    "HouseBoundaryGeometryAvailability",
    "HouseBoundaryGeometryKind",
    "HouseBoundaryGeometrySet",
    "HouseCusps",
    "HouseSystem",
    "JaiminiChartProfile",
    "JaiminiKarakaResult",
    "JaiminiPolicy",
    "KARAKA_NAMES_7",
    "KARAKA_NAMES_8",
    "KARANA_NAMES",
    "KalaBala",
    "KarakaAssignment",
    "KarakaConditionProfile",
    "KarakaPair",
    "KarakaPlanetType",
    "KarakaRole",
    "KaranaType",
    "KeplerianElements",
    "LastAspect",
    "LightPollutionClass",
    "LightPollutionDerivationMode",
    "LunarCrescentDetails",
    "LunarCrescentVisibilityClass",
    "MEAN_DAILY_MOTION",
    "MuhurtaClassification",
    "MuhurtaPolicy",
    "MuhurtaScore",
    "MULATRIKONA_END",
    "MULATRIKONA_SIGN",
    "MULATRIKONA_START",
    "MercurySectModel",
    "MissingEphemerisKernelError",
    "Moira",
    "MoonlightPolicy",
    "MutualReceptionPolicy",
    "MutualReceptionTruth",
    "NAISARGIKA_BALA",
    "NATURAL_ENEMIES",
    "NATURAL_FRIENDS",
    "NATURAL_NEUTRALS",
    "NodeData",
    "NodesAndApsides",
    "OWN_SIGNS",
    "ObserverAid",
    "ObserverVisibilityEnvironment",
    "OrbitalNode",
    "PLANETARY_JOYS",
    "PREFERRED_GENDER",
    "PREFERRED_HEMISPHERE",
    "PanchangaElement",
    "PanchangaPolicy",
    "PanchangaProfile",
    "PanchangaResult",
    "ParticipatingRulerPolicy",
    "PlanetData",
    "PlanetHeliacalEvent",
    "PlanetPhenomena",
    "PlanetShadbala",
    "PlanetTimeSeries",
    "ChartBatchRequest",
    "ChartBatchResult",
    "EventBatchRequest",
    "EventBatchResult",
    "ReturnBatchRequest",
    "ReturnBatchResult",
    "ProgressionBatchRequest",
    "ProgressionBatchResult",
    "PlanetaryConditionProfile",
    "PlanetaryConditionState",
    "PlanetaryDignity",
    "PlanetaryReception",
    "PlanetaryRelationship",
    "PointSetHarmonicVectorPolicy",
    "ProximityEvent",
    "REKHA_TABLES",
    "REQUIRED_RUPAS",
    "ReceptionBasis",
    "ReceptionClassification",
    "ReceptionKind",
    "ReceptionMode",
    "RekhaTier",
    "ResonantAspect",
    "SECT",
    "SectClassification",
    "SectHayzPolicy",
    "SectStateKind",
    "SectTruth",
    "ShadbalaChartProfile",
    "ShadbalaConditionProfile",
    "ShadbalaPolicy",
    "ShadbalaResult",
    "ShadbalaTier",
    "SignStrengthProfile",
    "SkyPosition",
    "SolarConditionClassification",
    "SolarConditionKind",
    "SolarConditionPolicy",
    "SolarConditionTruth",
    "LunarEclipseVisibilityContactKind",
    "LunarEclipseVisibilityLimit",
    "LunarEclipseVisibilityMap",
    "LunarEclipseVisibilityPoint",
    "SolarEclipseFootprintBoundaryKind",
    "SolarEclipseFootprintContacts",
    "SolarEclipseFootprintPoint",
    "SolarEclipseFootprintTopology",
    "SolarEclipseLimitTrack",
    "SolarEclipsePenumbralContact",
    "SolarEclipsePenumbralContactKind",
    "SolarEclipseVisibilityFootprint",
    "SthanaBala",
    "TITHI_NAMES",
    "TithiConditionProfile",
    "TithiPaksha",
    "TriplicityAssignment",
    "TriplicityDoctrine",
    "TransitBatchRequest",
    "TransitBatchResult",
    "TriplicityElement",
    "UnsupportedSubjectHandling",
    "VARA_LORDS",
    "VARA_NAMES",
    "VaraLordType",
    "VedicDignityPolicy",
    "VedicDignityRank",
    "VedicDignityResult",
    "VisibilityAssessment",
    "VisibilityCriterionFamily",
    "VisibilityExtinctionModel",
    "VisibilityPolicy",
    "VisibilitySearchPolicy",
    "VisibilityTargetKind",
    "VisibilityTwilightModel",
    "VoidOfCourseWindow",
    "YOGA_NAMES",
    "YOGINI_PLANETS",
    "YOGINI_SEQUENCE",
    "YOGINI_TOTAL",
    "YOGINI_YEARS",
    "YogaClass",
    "YoginiPolicy",
    "__author__",
    "__version__",
    "all_comets_at",
    "all_nakshatras_at",
    "all_planetary_nodes",
    "almuten_figuris",
    "almuten_of_degree",
    "alternate_period_profile",
    "alternate_sequence_profile",
    "apparent_sidereal_time_at",
    "ashtakavarga",
    "ashtakavarga_chart_profile",
    "aspect_motion_witness",
    "aspects_from_longitudes",
    "declination_aspects_from_declinations",
    "declination_aspect_motion_witness",
    "ashtottari",
    "assign_galactic_house",
    "asteroid_family",
    "atmakaraka",
    "ayanamsa",
    "batch_charts",
    "batch_progressions",
    "batch_events",
    "batch_returns",
    "batch_transits",
    "bhinnashtakavarga",
    "body_galactic_house_position",
    "calculate_chart_condition_profile",
    "calculate_condition_network_profile",
    "calculate_condition_profiles",
    "calculate_dignities",
    "calculate_dispositorship",
    "calculate_dispositorship_chart_condition_profile",
    "calculate_dispositorship_condition_profiles",
    "calculate_dispositorship_network_profile",
    "calculate_dispositorship_subsystem_profile",
    "calculate_galactic_houses",
    "calculate_receptions",
    "calendar_datetime_from_jd",
    "calendar_from_jd",
    "chart_dignity_profile",
    "chesta_bala",
    "classify_muhurta",
    "comet_at",
    "compare_dispositorship",
    "datetime_from_jd",
    "delta_t",
    "delta_t_from_jd",
    "derived_houses",
    "describe_galactic_boundary",
    "dig_bala",
    "dignity_condition_profile",
    "distance_extremes_at",
    "drig_bala",
    "families_in_chart",
    "family_members",
    "find_phasis",
    "find_all_ingresses",
    "find_aspects",
    "find_declination_aspects",
    "find_resonant_aspects",
    "format_jd_utc",
    "geometric_node",
    "greenwich_mean_sidereal_time",
    "halb_required_hemisphere",
    "harmogram_trace",
    "hora_lord_at",
    "intensity_function_spectrum",
    "is_besieged",
    "is_day_chart",
    "is_in_halb",
    "is_in_hayz",
    "is_in_joy",
    "is_in_sect",
    "is_void_of_course",
    "jaimini_chart_profile",
    "jaimini_karakas",
    "jd_from_datetime",
    "julian_day",
    "kala_bala",
    "karaka_condition_profile",
    "karaka_pair",
    "list_ayanamsa_systems",
    "list_comets",
    "local_sidereal_time",
    "mutual_receptions",
    "nakshatra_of",
    "next_void_of_course",
    "nodes_and_apsides_at",
    "orbital_elements_at",
    "oriental_occidental",
    "panchanga_at",
    "panchanga_profile",
    "parts_from_zero_aries",
    "planet_acronychal_rising",
    "planet_acronychal_setting",
    "planet_heliacal_rising",
    "planet_heliacal_setting",
    "planet_phenomena_at",
    "planet_time_series",
    "planetary_node",
    "planetary_relationships",
    "point_set_harmonic_vector",
    "project_harmogram_strength",
    "proximity_events_in_range",
    "resonance_network",
    "safe_datetime_from_jd",
    "score_muhurta",
    "sect_light",
    "shadbala",
    "shadbala_chart_profile",
    "shadbala_condition_profile",
    "sidereal_to_tropical",
    "sign_strength_profile",
    "solar_condition_at",
    "solar_condition_events_in_range",
    "sthana_bala",
    "tithi_condition_profile",
    "transit_strength",
    "triplicity_assignment_for",
    "triplicity_score",
    "tropical_to_sidereal",
    "validate_alternate_dasha_output",
    "validate_ashtakavarga_output",
    "validate_dignity_output",
    "validate_jaimini_output",
    "validate_panchanga_output",
    "validate_shadbala_output",
    "vedic_dignity",
    "visibility_assessment",
    "visibility_tonight",
    "is_visible_tonight",
    "visibility_event",
    "visual_limiting_magnitude",
    "void_of_course_window",
    "void_periods_all_planets",
    "BATCH_EVENT_KINDS",
    "BATCH_RETURN_KINDS",
    "void_periods_in_range",
    "yogini_dasha",
    "zero_aries_parts_harmonic_vector",
}

# Explicit admissions added since the original frozen root-surface baseline.
# Keeping these names literal preserves drift detection for future changes.
_EXPECTED_ROOT_PUBLIC_NAMES.update({
    'D60Method', 'D60SignResult', 'd60_sign',
    'LUNAR_ECLIPTIC_DIRECTION_V1',
    'LunarEclipticDirectionPolicy',
    'LunarEclipticDirectionWitness',
    'LunarEclipticHemisphere',
    'LunarLatitudeMotion',
    'LunarNodeCrossingDirection',
    'LunarNodeCrossingRelation',
    'LunarNodeCrossingWitness',
    'lunar_ecliptic_direction_at',
    'ArgalaHouse',
    'ArgalaResult',
    'ArudhaPada',
    'ArudhaResult',
    'AstrodyneAspectFamily',
    'AstrodyneBodyConditionProfile',
    'AstrodyneBodyInput',
    'AstrodyneBodyKind',
    'AstrodyneChartAggregate',
    'AstrodyneChartResult',
    'AstrodyneDignityCondition',
    'AstrodyneHouseAggregate',
    'AstrodyneNetwork',
    'AstrodynePolicy',
    'AstrodyneRelationKind',
    'AstrodyneRelationSet',
    'AstrodyneSignAggregate',
    'AstrodyneSummaryEntry',
    'AstrodyneSummaryFamily',
    'AstrodyneSummaryProfile',
    'AvasthaChartResult',
    'AvasthaPolicy',
    'BaladiAvastha',
    'BhavaBala',
    'BhavaBalaResult',
    'ChandraBala',
    'CharaDashaPeriod',
    'CharaDashaResult',
    'CharaDashaComputation',
    'ChurchOfLightProgressedAstrodynesChart',
    'ChurchOfLightProgressionGeometry',
    'ChurchOfLightProgressionPolicy',
    'ChurchOfLightProgressionTimeTruth',
    'ChurchOfLightSymbolicDate',
    'DEFAULT_ASTRODYNE_POLICY',
    'DEFAULT_CHURCH_OF_LIGHT_PROGRESSION_POLICY',
    'DEFAULT_PROGRESSED_ASTRODYNE_POLICY',
    'DeeptadiAvastha',
    'GRAHAMANA',
    'JagradadiAvastha',
    'JaiminiExtendedPolicy',
    'KAKSHYA_LORDS',
    'KakshyaTransit',
    'KalavelaResult',
    'KalavelaUpagraha',
    'Karakamsa',
    'LajjitadiAvasthas',
    'LajjitadiState',
    'MODERN_DETRIMENT',
    'MODERN_DOMICILE',
    'PROGRESSED_ASTRODYNE_SOURCE_ANOMALIES',
    'PersonalMuhurtaScore',
    'PlanetAvasthas',
    'PlanetReductionBreakdown',
    'PlanetReductionStage',
    'ProgressedAccessoryAspectRelation',
    'ProgressedAstrodynePolicy',
    'ProgressedAstrodyneTerminal',
    'ProgressedAstrodyneTier',
    'ProgressedBaselineValue',
    'ProgressedBodyPlacement',
    'ProgressedCompoundDuration',
    'ProgressedCompoundInfluenceTruth',
    'ProgressedCompoundQuantity',
    'ProgressedContactMoment',
    'ProgressedContactQuery',
    'ProgressedContactSearchPolicy',
    'ProgressedContactSearchResult',
    'ProgressedContactWindow',
    'ProgressedDatedAspectTruth',
    'ProgressedInfluenceUnit',
    'ProgressedMajorAspectRelation',
    'ProgressedMutualReceptionAllocation',
    'ProgressedNatalBodyValue',
    'ProgressedNormalHoroscope',
    'ProgressedPracticalAggregate',
    'ProgressedPracticalHoroscope',
    'ProgressedReenforcementTruth',
    'ProgressedTerminalKind',
    'ProgressedTerminalLocation',
    'ProgressedTotalInfluenceTruth',
    'ProgressedVariableInfluenceTruth',
    'RASIMANA',
    'SADE_SATI_PHASES',
    'SadeSatiResult',
    'SadeSatiStatus',
    'SadeSatiWindow',
    'ShodhyaPinda',
    'SunBasedUpagrahas',
    'TARA_NAMES',
    'TaraBala',
    'UpagrahaPolicy',
    'YogaChartResult',
    'YogaCondition',
    'YogaPolicy',
    'YogaResult',
    'argala',
    'arudha_padas',
    'astrodynes_summary',
    'baladi_avastha',
    'benefic_malefic_classification',
    'bhava_bala',
    'bhava_dig_bala',
    'bhava_drishti_bala',
    'chandra_bala',
    'chandra_yogas',
    'chara_dasha',
    'church_of_light_progressed_astrodynes_chart',
    'church_of_light_progression_geometry',
    'dated_aspect_from_major_relation',
    'deeptadi_avastha',
    'dhana_yogas',
    'evaluate_accessory_progressed_relation',
    'evaluate_avasthas',
    'evaluate_major_progressed_relation',
    'evaluate_yogas',
    'integrate_progressed_influence',
    'jagradadi_avastha',
    'kakshya_transit',
    'kalavela_upagrahas',
    'karakamsa',
    'lajjitadi_avasthas',
    'nabhasa_yogas',
    'natal_astrodynes',
    'natal_astrodynes_from_geometry',
    'normal_progressed_horoscope',
    'pancha_mahapurusha_yogas',
    'personal_muhurta_score',
    'planet_reduction_breakdown_at',
    'practical_progressed_horoscope',
    'progressed_compound_total_influence',
    'progressed_dated_aspect',
    'progressed_total_influence',
    'raja_yogas',
    'rasi_aspects',
    'rasi_drishti_of',
    'reenforce_major_progressed_relation',
    'sade_sati_status',
    'sade_sati_windows',
    'search_progressed_contacts',
    'shodhya_pinda',
    'sun_based_upagrahas',
    'surya_yogas',
    'tara_bala',
    'validate_astrodynes_output',
    'RAMESEY_MOON_CONDITION_V1',
    'RameseyClauseWitness',
    'RameseyMeasurement',
    'RameseyMoonConditionEvaluation',
    'RameseyMoonConditionPolicy',
    'RameseyMoonConditionStatus',
    'RameseyRemedyApplicability',
    'RameseyRemedyClauseState',
    'RameseyRemedyFulfillment',
    'RameseyRemedyClauseWitness',
    'RameseyRemedyWitness',
    'RameseyRuleState',
    'RameseyRuleWitness',
    'evaluate_ramesey_moon_condition',
    'ramesey_moon_condition_at',
    'SAHL_MOON_CONDITION_V1',
    'SahlBurntPathVariant',
    'SahlClauseWitness',
    'SahlEighthRuleVariant',
    'SahlMeasurement',
    'SahlMoonConditionEvaluation',
    'SahlMoonConditionPolicy',
    'SahlMoonConditionStatus',
    'SahlRuleState',
    'SahlRuleWitness',
    'evaluate_sahl_moon_condition',
    'sahl_moon_condition_at',
    'DOROTHEUS_MOON_CONDITION_V1',
    'DorotheusClauseWitness',
    'DorotheusMeasurement',
    'DorotheusMoonConditionEvaluation',
    'DorotheusMoonConditionPolicy',
    'DorotheusMoonConditionStatus',
    'DorotheusRemedyApplicability',
    'DorotheusRemedyWitness',
    'DorotheusRuleState',
    'DorotheusRuleWitness',
    'evaluate_dorotheus_moon_condition',
    'dorotheus_moon_condition_at',
    'DOROTHEUS_ROOTED_CONTEXT_V1',
    'DorotheusMatter',
    'DorotheusFortificationTestimony',
    'DorotheusFortificationTestimonyState',
    'DorotheusMatterSignificatorWitness',
    'DorotheusPlacementWitness',
    'DorotheusRadicalityWitness',
    'DorotheusRootOutcomePattern',
    'DorotheusRootOutcomeWitness',
    'DorotheusRootedContextEvaluation',
    'DorotheusRootedContextPolicy',
    'DorotheusSignificatorCondition',
    'DorotheusSupplementaryIndicator',
    'DorotheusSupplementaryIndicatorState',
    'DorotheusStrengthState',
    'MoonConnection',
    'MoonPreviousEventWindowPolicy',
    'MoonFlowEventRole',
    'MoonAspectEvent',
    'MoonConnectionFlowPolicy',
    'MoonConnectionFlow',
    'moon_connection_flow_at',
    'WesternElectionClass',
    'dorotheus_rooted_context_at',
    'evaluate_dorotheus_rooted_context',
    'next_moon_connection',
    'DOROTHEUS_CONSTRUCTION_V1',
    'DorotheusAscensionalClass',
    'DorotheusConstructionClauseRole',
    'DorotheusConstructionClauseState',
    'DorotheusConstructionClauseWitness',
    'DorotheusConstructionEvaluation',
    'DorotheusConstructionPolicy',
    'DorotheusConstructionStatus',
    'DorotheusSignNatureWitness',
    'dorotheus_construction_at',
    'evaluate_dorotheus_construction',
    'DOROTHEUS_DEMOLITION_V1',
    'DOROTHEUS_BUYING_AND_SELLING_V1',
    'DOROTHEUS_LUNAR_PRICE_TIMING_V1',
    'DOROTHEUS_LAND_PURCHASE_V1',
    'DOROTHEUS_LEASING_V1',
    'DOROTHEUS_SHIP_ACQUISITION_V1',
    'DOROTHEUS_SHIP_CONSTRUCTION_V1',
    'DOROTHEUS_SHIP_LAUNCH_V1',
    'DOROTHEUS_LAND_TRAVEL_V1',
    'DOROTHEUS_SEA_TRAVEL_V1',
    'DOROTHEUS_PARTNERSHIP_V1',
    'DOROTHEUS_DEBT_AND_PAYMENT_V1',
    'DOROTHEUS_WRITING_A_WILL_V1',
    'DOROTHEUS_TRAVEL_V1',
    'DorotheusAngularPlaceWitness',
    'DorotheusMatterClauseRole',
    'DorotheusMatterClauseState',
    'DorotheusMatterClauseWitness',
    'DorotheusMatterProfileEvaluation',
    'DorotheusMatterProfileId',
    'DorotheusMatterProfilePolicy',
    'DorotheusMatterProfileStatus',
    'DorotheusSignNatureVariant',
    'dorotheus_matter_profile_at',
    'evaluate_dorotheus_matter_profile',
    'WesternElectionalProfileId',
    'WesternElectionalQualificationStatus',
    'WesternElectionalProfileParameter',
    'WesternElectionalProfileScanPolicy',
    'WesternElectionalStatusCount',
    'WesternElectionalSampleWitness',
    'WesternElectionalProfileWindow',
    'WesternElectionalProfileScan',
    'scan_western_electional_profile',
    'SAHL_LENDING_V1',
    'SAHL_INVESTMENT_V1',
    'SAHL_PURCHASE_V1',
    'SAHL_SALE_V1',
    'SAHL_BUILDING_V1',
    'SAHL_DEMOLITION_V1',
    'SAHL_LAND_V1',
    'SAHL_PLANTING_V1',
    'SAHL_SOWING_V1',
    'SAHL_BUSINESS_PARTNERSHIP_V1',
    'SAHL_WELLS_AND_RIVERS_V1',
    'SahlMatterClauseRole',
    'SahlMatterClauseState',
    'SahlMatterClauseWitness',
    'SahlMatterMeasurement',
    'SahlMatterProfileEvaluation',
    'SahlMatterProfileId',
    'SahlMatterProfilePolicy',
    'SahlMatterProfileStatus',
    'evaluate_sahl_matter_profile',
    'sahl_matter_profile_at',
    'ClassicalPerfectionEventKind',
    'ClassicalPerfectionState',
    'LillyPerfectionKind',
    'ClassicalBodyState',
    'ClassicalPerfectionEvent',
    'LillyPerfectionWitness',
    'LillyPerfectionPolicy',
    'ClassicalPerfectionAnalysis',
    'LILLY_1647_PERFECTION_V1',
    'classify_lilly_perfection_events',
    'lilly_perfection_at',
    'WesternElectionalJudgementDoctrine',
    'WesternElectionalJudgementState',
    'WesternElectionalComponentState',
    'WesternElectionalRequirementState',
    'WesternElectionalJudgementPolicy',
    'WesternElectionalJudgementSelection',
    'WesternElectionalComponentSummary',
    'WesternElectionalRequirementWitness',
    'WesternElectionalJudgementEvaluation',
    'WESTERN_ELECTIONAL_JUDGEMENT_V1',
    'assemble_western_electional_judgement',
    'western_electional_judgement_at',
    'WesternElectionalRankingContributionId',
    'WesternElectionalRankingCandidateState',
    'ElectionalRankingPolicy',
    'WesternElectionalRankingWeight',
    'WesternElectionalRankingContribution',
    'WesternElectionalRankedCandidate',
    'WesternElectionalExcludedCandidate',
    'WesternElectionalRankingEvaluation',
    'WESTERN_ELECTIONAL_RANKING_V1',
    'assemble_western_electional_ranking',
    'western_electional_ranking_at',
    'WesternElectionalWindowScanMode',
    'WesternElectionalBoundaryResolution',
    'WesternElectionalJudgementWindowPolicy',
    'WesternElectionalJudgementSignature',
    'WesternElectionalTransitionCause',
    'WesternElectionalCandidateEvent',
    'WesternElectionalWindowBoundary',
    'WesternElectionalJudgementWindow',
    'WesternElectionalJudgementWindowScan',
    'WESTERN_ELECTIONAL_JUDGEMENT_WINDOWS_V1',
    'scan_western_electional_judgement_windows',
})

_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "EclipseEpoch",
    "EclipseGeocentricBodyState",
    "LunarEclipseGlobalCircumstances",
    "LunarEclipseShadowState",
    "SolarEclipseCentralLineLimit",
    "SolarEclipseConjunction",
    "SolarEclipseConjunctionKind",
    "SolarEclipseGlobalCircumstances",
    "SolarEclipseGreatestSite",
    "SolarEclipseUmbralContact",
    "SolarEclipseUmbralContactKind",
    "SolarEclipseUmbralContacts",
    "SolarEclipseShadowFootprint",
    "SolarEclipseMapSample",
    "EclipseContourComponent",
    "EclipseContourLevel",
    "SolarEclipseCartography",
    "PanchaPakshiActivity",
    "PanchaPakshiAdmissionStatus",
    "PanchaPakshiAstronomicalPaksha",
    "PanchaPakshiAstronomicalPakshaInference",
    "PanchaPakshiAstronomicalPakshaInferencePolicy",
    "PanchaPakshiBird",
    "PanchaPakshiCivilTimeSookshmaRoutingPolicy",
    "PanchaPakshiCivilTimeSookshmaSelection",
    "PanchaPakshiCapability",
    "PanchaPakshiConflictWitness",
    "PanchaPakshiCurrentCellSelectionStatus",
    "PanchaPakshiDataError",
    "PanchaPakshiDirectedRelationship",
    "PanchaPakshiError",
    "PanchaPakshiFixedClockCell",
    "PanchaPakshiFixedClockCurrentCellSelection",
    "PanchaPakshiFixedClockCurrentCellSelectionPolicy",
    "PanchaPakshiFixedClockMaterialization",
    "PanchaPakshiFixedClockMaterializationPolicy",
    "PanchaPakshiFirstEatBirdMapping",
    "PanchaPakshiHalf",
    "PanchaPakshiInitialVowelIdentity",
    "PanchaPakshiLocalSolarContext",
    "PanchaPakshiLocalSolarContextPolicy",
    "PanchaPakshiMaterializedCellRelation",
    "PanchaPakshiNakshatraBirdMapping",
    "PanchaPakshiNatalMoonIdentity",
    "PanchaPakshiNatalMoonIdentityPolicy",
    "PanchaPakshiOmission",
    "PanchaPakshiPaduBirdMapping",
    "PanchaPakshiPaksha",
    "PanchaPakshiProfileDescriptor",
    "PanchaPakshiProfileInfo",
    "PanchaPakshiProvenance",
    "PanchaPakshiRelation",
    "PanchaPakshiSchedule",
    "PanchaPakshiScheduleCell",
    "PanchaPakshiSolarProportionalCell",
    "PanchaPakshiSolarProportionalCurrentCellSelection",
    "PanchaPakshiSolarProportionalCurrentCellSelectionPolicy",
    "PanchaPakshiSolarProportionalMaterialization",
    "PanchaPakshiSolarProportionalMaterializationPolicy",
    "PanchaPakshiSolarBoundaryRelation",
    "PanchaPakshiSource",
    "PanchaPakshiSourceLocator",
    "PanchaPakshiScheduleSookshmaCompositionPolicy",
    "PanchaPakshiScheduleSookshmaSelection",
    "PanchaPakshiSookshmaInterval",
    "PanchaPakshiSookshmaSelection",
    "PanchaPakshiSookshmaSelectorPolicy",
    "PanchaPakshiSookshmaSelectorPolicyId",
    "PanchaPakshiSookshmaTimingPolicyId",
    "PanchaPakshiUromarisiConstitutionStatus",
    "PanchaPakshiWeekday",
    "available_pancha_pakshi_profiles",
    "pancha_pakshi_astronomical_paksha_at",
    "pancha_pakshi_civil_time_sookshma_selection_at",
    "pancha_pakshi_directed_relationship",
    "pancha_pakshi_fixed_clock_current_cell_at",
    "pancha_pakshi_fixed_clock_materialization_at",
    "pancha_pakshi_first_eat_bird_mapping",
    "pancha_pakshi_identity_from_initial_vowel",
    "pancha_pakshi_local_solar_context_at",
    "pancha_pakshi_nakshatra_bird_mapping",
    "pancha_pakshi_natal_moon_identity_at",
    "pancha_pakshi_padu_bird_mapping",
    "pancha_pakshi_profile_info",
    "pancha_pakshi_schedule",
    "pancha_pakshi_schedule_sookshma_temporal_selection",
    "pancha_pakshi_sookshma_temporal_selection",
    "pancha_pakshi_solar_proportional_current_cell_at",
    "pancha_pakshi_solar_proportional_materialization_at",
    "pancha_pakshi_uromarisi_constitution_status",
})

_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "BesiegingDependencyCompletenessTruth",
    "BesiegingTruth",
    "DecennialSequenceAssemblyTruth",
    "DecennialSequenceBodyTruth",
    "DignityHorizonFrame",
    "EssentialDignityComponentTruth",
    "HellenisticAspectEvaluationStatus",
    "HellenisticDirectionTruth",
    "HellenisticOvercomingRelation",
    "HellenisticOvercomingTruth",
    "HellenisticSuperiorityTruth",
    "HorizonComputationMethod",
    "HorizonHemisphere",
    "HorizonTruth",
    "LotArcPolicy",
    "LotAstrologicalConditionTruth",
    "LotDependencyCompletenessTruth",
    "LotEvaluationStatus",
    "LotNotEvaluable",
    "LotsEvaluation",
    "MercuryPhaseTruth",
    "MonthlyProfectionInterval",
    "MonthlyProfectionIntervalPolicy",
    "PartDefinition",
    "PlanetarySolarPhaseKind",
    "PlanetarySolarPhaseTruth",
    "ProfectionAmbiguousTimePolicy",
    "ProfectionActivationBodyTruth",
    "ProfectionActivationStatus",
    "ProfectionActivationTruth",
    "ProfectionChronology",
    "ProfectionChronologyMethod",
    "ProfectionIntervalBoundarySemantics",
    "SectComponentKind",
    "SectComponentTruth",
    "SolarProximityBand",
    "SolarProximityTruth",
    "TimelordEvaluationStatus",
    "TruthEvaluationStatus",
    "ZRFortuneAngularityTruth",
    "besieging_truth",
    "decennial_sequence_truth",
    "evaluate_lots",
    "find_whole_sign_aspects",
    "hellenistic_superiority_truth",
    "overcoming",
    "planetary_solar_phase_truth",
    "profection_activation_truth",
    "profection_chronology",
    "solar_proximity_truth",
    "zr_fortune_angularity_truth",
})

_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "HELLENISTIC_CLASSICAL_PLANETS",
    "HELLENISTIC_PROFILE_LOTS",
    "HellenisticAspectProfile",
    "HellenisticChartProfile",
    "HellenisticDecennialSnapshot",
    "HellenisticLotProfile",
    "HellenisticObserverContext",
    "HellenisticPlanetProfile",
    "HellenisticPlanetaryJoyTruth",
    "HellenisticEssentialDignityComponentTruth",
    "HellenisticProfileComponent",
    "HellenisticProfileExclusion",
    "HellenisticProfileNotEvaluable",
    "HellenisticProfilePolicy",
    "HellenisticProfileProvenance",
    "HellenisticProfileStatus",
    "HellenisticZodiacalReleasingSnapshot",
    "hellenistic_chart_profile",
    "HellenisticNamedTwelfthPart",
    "HellenisticProfileOverlays",
    "HellenisticRevivalPolicy",
    "HellenisticSignPerMonthProfection",
    "HELLENISTIC_SUPPORTING_LOTS",
    "exaltation_lot_name",
    "select_supporting_hellenistic_lots",
    "TwelfthPartPosition",
    "twelfth_part_of",
    "HellenisticAdherenceTruth",
    "HellenisticAssembleCondition",
    "HellenisticPlanetOvercomingTruth",
    "HellenisticRayTruth",
    "HellenisticTestimonyTruth",
    "HellenisticTestimonyWitness",
    "assemble_hellenistic_condition",
    "HELLENISTIC_OVERLAY_CAVEATS",
    "HellenisticOverlayLabels",
    "ZRPeakGrade",
    "zr_peak_grade",
    "CircumambulationPeriod",
    "CircumambulationResult",
    "CircumambulationStatus",
    "CircumambulationTimeKey",
    "circumambulate",
    "TransmissionEdge",
    "TransmissionEndpointKind",
    "TransmissionGraph",
    "TransmissionKind",
    "TransmissionStatus",
    "valens_transmission_graph",
    "HellenisticOfficeCandidate",
    "HellenisticOfficeHunt",
    "HellenisticOfficeStatus",
    "hunt_hellenistic_offices",
})

_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "AtmosphericExtinctionAssessment",
    "PointSourceVisibilityThreshold",
    "TwilightSkyBrightnessAssessment",
    "atmospheric_extinction",
    "directional_twilight_sky_brightness",
    "point_source_visibility_threshold",
    "relative_optical_airmass",
})

# Explicit physical-visibility admissions landed before this snapshot was
# refreshed.  Keeping the complete literal set prevents either silent removal
# or accidental expansion of the public contract.
_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "PhysicalAtmosphereInput",
    "PhysicalAtmosphereReceipt",
    "PhysicalBackgroundComponentKind",
    "PhysicalBackgroundReceipt",
    "PhysicalBackgroundScope",
    "PhysicalBortleBackground",
    "PhysicalDirectionalBackground",
    "PhysicalEphemerisReceipt",
    "PhysicalEventSensitivityReceipt",
    "PhysicalEventSolverReceipt",
    "PhysicalEventTimeSemantics",
    "PhysicalHorizonProfile",
    "PhysicalHorizonReceipt",
    "PhysicalHorizonSample",
    "PhysicalModeledBackgroundComponent",
    "PhysicalObservationWindowReceipt",
    "PhysicalObserverProtocolReceipt",
    "PhysicalSqmBackground",
    "PhysicalTargetReceipt",
    "PhysicalThresholdReceipt",
    "PhysicalValidityDomainReceipt",
    "PhysicalVisibilityAssessment",
    "PhysicalVisibilityBoundarySource",
    "PhysicalVisibilityCrossingDirection",
    "PhysicalVisibilityErrorBudgetReceipt",
    "PhysicalVisibilityEventResult",
    "PhysicalVisibilityEvidenceState",
    "PhysicalVisibilityPhase",
    "PhysicalVisibilityPolicy",
    "PhysicalVisibilitySearchPolicy",
    "PhysicalVisibilityStatus",
    "VisibilityComponentReceipt",
    "VisibilityDataPackConfig",
    "VisibilityDataPackReceipt",
    "physical_visibility_assessment",
    "physical_visibility_event",
})

# Track A bounded-closure admissions: relationship transit targets, fixed-star
# and dynamic astrocartography, and relocated return composition.
_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "AstrocartographyCurvePointShift",
    "DynamicAstrocartographyLineTransition",
    "DynamicAstrocartographyMode",
    "DynamicAstrocartographyPosition",
    "DynamicAstrocartographySeries",
    "DynamicAstrocartographySeriesTruth",
    "DynamicAstrocartographySnapshot",
    "DynamicAstrocartographySnapshotTruth",
    "FixedStarAstrocartographyResult",
    "FixedStarAstrocartographySubject",
    "FixedStarAstrocartographyTruth",
    "RelationshipChartIdentity",
    "RelationshipChartKind",
    "RelationshipChartTargetSet",
    "RelationshipTargetKind",
    "RelationshipTransitEvent",
    "RelationshipTransitSearchResult",
    "RelationshipTransitSearchTruth",
    "RelationshipTransitTarget",
    "RelocatedReturnChart",
    "ReturnKind",
    "ReturnMomentTruth",
    "ReturnRelocationTruth",
    "ReturnSearchPolicyTruth",
    "find_composite_transits",
    "find_davison_transits",
    "find_relationship_transits",
    "fixed_star_astrocartography",
    "fixed_star_astrocartography_from_chart",
    "fixed_star_equatorial_subject",
    "relationship_chart_targets",
    "relocated_lunar_return",
    "relocated_planetary_return",
    "relocated_solar_return",
    "transiting_astrocartography",
})

# 6.9.9 standard heliacal phenomena (Ptolemy / Schoch names) and the
# phasis search, admitted alongside the existing planet_* heliacal wrappers.
_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "PhasisKindResult",
    "PhasisSearchResult",
    "STANDARD_HELIACAL_EVENT_KINDS",
    "heliacal_event_kind_applies",
    "phasis_events_near",
    "planet_cosmical_setting",
    "planet_evening_first",
    "planet_morning_last",
})

_EXPECTED_ROOT_ONLY_NAMES = {
    "ASHTOTTARI_NAKSHATRA_LORD",
    "ASHTOTTARI_SEQUENCE",
    "ASHTOTTARI_TOTAL",
    "ASHTOTTARI_YEARS",
    "AlternateDashaPeriod",
    "AlternateDashaSequenceProfile",
    "AlternatePeriodProfile",
    "AshtakavargaChartProfile",
    "AshtakavargaPolicy",
    "AshtakavargaResult",
    "AshtottariPolicy",
    "BhinnashtakavargaResult",
    "ChartDignityProfile",
    "CompoundRelationship",
    "DEBILITATION_SIGN",
    "DETRIMENT",
    "DOMICILE",
    "DignityConditionProfile",
    "DignityTier",
    "DispositorLink",
    "DispositorshipChain",
    "DispositorshipChartConditionProfile",
    "DispositorshipComparisonBundle",
    "DispositorshipComparisonItem",
    "DispositorshipComputationPolicy",
    "DispositorshipConditionProfile",
    "DispositorshipConditionState",
    "DispositorshipNetworkEdge",
    "DispositorshipNetworkEdgeMode",
    "DispositorshipNetworkNode",
    "DispositorshipNetworkProfile",
    "DispositorshipOrderingPolicy",
    "DispositorshipProfile",
    "DispositorshipRulership",
    "DispositorshipRulershipPolicy",
    "DispositorshipSubjectPolicy",
    "DispositorshipSubjectSet",
    "DispositorshipSubsystemProfile",
    "DispositorshipTerminationKind",
    "DispositorshipTerminationPolicy",
    "DispositorshipUnsupportedSubjectPolicy",
    "EXALTATION",
    "EXALTATION_DEGREE",
    "EXALTATION_SIGN",
    "FALL",
    "HarmogramChartDomain",
    "HarmogramIntensityFamily",
    "HarmogramIntensityPolicy",
    "HarmogramPolicy",
    "HarmogramTraceFamily",
    "HarmonicDomain",
    "HalbHayzDoctrine",
    "JaiminiChartProfile",
    "JaiminiKarakaResult",
    "JaiminiPolicy",
    "KARAKA_NAMES_7",
    "KARAKA_NAMES_8",
    "KARANA_NAMES",
    "KalaBala",
    "KarakaAssignment",
    "KarakaConditionProfile",
    "KarakaPair",
    "KarakaPlanetType",
    "KarakaRole",
    "KaranaType",
    "MEAN_DAILY_MOTION",
    "MULATRIKONA_END",
    "MULATRIKONA_SIGN",
    "MULATRIKONA_START",
    "NAISARGIKA_BALA",
    "NATURAL_ENEMIES",
    "NATURAL_FRIENDS",
    "NATURAL_NEUTRALS",
    "OWN_SIGNS",
    "PLANETARY_JOYS",
    "PREFERRED_GENDER",
    "PREFERRED_HEMISPHERE",
    "PanchangaElement",
    "PanchangaPolicy",
    "PanchangaProfile",
    "PanchangaResult",
    "ParticipatingRulerPolicy",
    "PlanetShadbala",
    "PlanetaryRelationship",
    "PointSetHarmonicVectorPolicy",
    "REKHA_TABLES",
    "REQUIRED_RUPAS",
    "RekhaTier",
    "SECT",
    "ShadbalaChartProfile",
    "ShadbalaConditionProfile",
    "ShadbalaPolicy",
    "ShadbalaResult",
    "ShadbalaTier",
    "SignStrengthProfile",
    "SthanaBala",
    "TITHI_NAMES",
    "TithiConditionProfile",
    "TithiPaksha",
    "TriplicityAssignment",
    "TriplicityDoctrine",
    "TriplicityElement",
    "UnsupportedSubjectHandling",
    "VARA_LORDS",
    "VARA_NAMES",
    "VaraLordType",
    "VedicDignityPolicy",
    "VedicDignityRank",
    "VedicDignityResult",
    "YOGA_NAMES",
    "YOGINI_PLANETS",
    "YOGINI_SEQUENCE",
    "YOGINI_TOTAL",
    "YOGINI_YEARS",
    "YogaClass",
    "YoginiPolicy",
    "__author__",
    "__version__",
    "alternate_period_profile",
    "alternate_sequence_profile",
    "ashtakavarga",
    "ashtakavarga_chart_profile",
    "ashtottari",
    "atmakaraka",
    "bhinnashtakavarga",
    "calculate_dispositorship",
    "calculate_dispositorship_chart_condition_profile",
    "calculate_dispositorship_condition_profiles",
    "calculate_dispositorship_network_profile",
    "calculate_dispositorship_subsystem_profile",
    "chart_dignity_profile",
    "chesta_bala",
    "compare_dispositorship",
    "dig_bala",
    "dignity_condition_profile",
    "drig_bala",
    "halb_required_hemisphere",
    "harmogram_trace",
    "hora_lord_at",
    "intensity_function_spectrum",
    "is_besieged",
    "is_in_halb",
    "is_in_joy",
    "jaimini_chart_profile",
    "jaimini_karakas",
    "kala_bala",
    "karaka_condition_profile",
    "karaka_pair",
    "oriental_occidental",
    "panchanga_at",
    "panchanga_profile",
    "parts_from_zero_aries",
    "planetary_relationships",
    "point_set_harmonic_vector",
    "project_harmogram_strength",
    "shadbala",
    "shadbala_chart_profile",
    "shadbala_condition_profile",
    "sign_strength_profile",
    "sthana_bala",
    "tithi_condition_profile",
    "transit_strength",
    "triplicity_assignment_for",
    "triplicity_score",
    "validate_alternate_dasha_output",
    "validate_ashtakavarga_output",
    "validate_dignity_output",
    "validate_jaimini_output",
    "validate_panchanga_output",
    "validate_shadbala_output",
    "vedic_dignity",
    "yogini_dasha",
    "zero_aries_parts_harmonic_vector",
}

_EXPECTED_MOIRA_METHODS = {
    "daily_panchanga",
    "lunar_month_at",
    "almuten_figuris",
    "almuten_of_degree",
    "antiscia",
    "ascendant_arc_directions",
    "aspect_transits",
    "aspects",
    "aspect_motion_witness",
    "aspects_from_longitudes",
    "declination_aspects_from_declinations",
    "declination_aspect_motion_witness",
    "astrocartography",
    "batch_charts",
    "batch_events",
    "batch_progressions",
    "batch_returns",
    "batch_transits",
    "calendar_from_jd",
    "chart",
    "close_approaches",
    "composite_chart",
    "composite_chart_reference_place",
    "configure_kernel_path",
    "conjunctions",
    "converse_duodenary_progression",
    "converse_minor_progression",
    "converse_naibod_in_longitude",
    "converse_naibod_in_right_ascension",
    "converse_planetary_arc_directions",
    "converse_progression",
    "converse_quotidian_lunar_progression",
    "converse_quotidian_solar_progression",
    "converse_solar_arc",
    "converse_solar_arc_ra",
    "converse_tertiary_ii_progression",
    "converse_tertiary_progression",
    "current_decennials",
    "daily_house_frame",
    "davison_chart",
    "davison_chart_corrected",
    "davison_chart_reference_place",
    "davison_chart_spherical_midpoint",
    "davison_chart_uncorrected",
    "decennials",
    "declination_transits",
    "dignities",
    "download_missing_kernels",
    "duodenary_progression",
    "eclipse",
    "eclipse_hits_in_range",
    "egyptian_date",
    "electional_windows",
    "firdaria",
    "fixed_star",
    "from_jd",
    "galactic_angles",
    "galactic_chart",
    "galactic_houses",
    "gauquelin_sectors",
    "geodetic",
    "geodetic_planet_equivalents",
    "get_kernel_status",
    "harmonic",
    "harmonic_transit_forecast",
    "heliacal_rising",
    "heliacal_rising_event",
    "heliacal_setting",
    "heliacal_setting_event",
    "heliocentric",
    "house_overlay",
    "houses",
    "ingresses",
    "is_kernel_available",
    "is_moon_void_of_course",
    "jd",
    "load_small_body_manifest",
    "local_space",
    "longevity",
    "lots",
    "lunar_mansions",
    "lunar_return",
    "midpoints",
    "midpoints_to_point",
    "minor_progression",
    "moon_phases",
    "moon_void_of_course",
    "multiple_star_components",
    "multiple_star_separation",
    "mutual_house_overlays",
    "mutual_receptions",
    "naibod_in_longitude",
    "naibod_in_right_ascension",
    "nakshatras",
    "next_conjunction",
    "next_ingress",
    "next_ingress_into",
    "occultations",
    "lunar_occultation_path_topology",
    "lunar_occultation_path_topology_at",
    "lunar_star_occultation_path_topology",
    "lunar_star_occultation_path_topology_at",
    "natal_aspect_transits",
    "parans",
    "patterns",
    "phase",
    "phenomena",
    "planet_return",
    "planetary_arc_directions",
    "planetary_hours",
    "planetary_node",
    "planetary_nodes",
    "planetocentric",
    "primary_directions",
    "profection",
    "progression",
    "proximity_events",
    "quotidian_lunar_progression",
    "quotidian_solar_progression",
    "received_light",
    "relocated_chart",
    "resonance",
    "retrograde_periods",
    "sidereal_chart",
    "sky_position",
    "solar_arc_directions",
    "solar_arc_directions_ra",
    "solar_condition_at",
    "solar_condition_events",
    "lunar_eclipse_visibility_map",
    "solar_eclipse_footprint",
    "solar_return",
    "solar_return_chart",
    "subplanetary_points",
    "visibility_tonight",
    "is_visible_tonight",
    "build_varshaphal_chart",
    "mudda_dasha",
    "varshaphal",
    "varshaphal_chart",
    "sothic_cycle",
    "sothic_cycle_result",
    "sothic_epoch_finder",
    "speculum",
    "ssb_chart",
    "stations",
    "synastry_aspects",
    "synodic_phase",
    "syzygy",
    "tertiary_ii_progression",
    "tertiary_progression",
    "transits",
    "twilight",
    "uranian",
    "variable_star_magnitude",
    "variable_star_maxima",
    "variable_star_minima",
    "variable_star_next_maximum",
    "variable_star_next_minimum",
    "variable_star_phase",
    "variable_star_quality",
    "vimshottari_dasha",
    "zodiacal_releasing",
}

# Explicit facade-method admissions added since the original frozen baseline.
_EXPECTED_MOIRA_METHODS.update({
    'lunar_global_circumstances',
    'solar_global_circumstances',
    'solar_eclipse_cartography',
    'lunar_ecliptic_direction_at',
    'lunar_orientation',
    'ashtakavarga',
    'moon_connection_flow_at',
    'primary_direction_condition',
    'primary_direction_relations',
    'primary_directions_network',
    'primary_directions_policy_preset',
    'primary_directions_profile',
    'dorotheus_rooted_context_at',
    'dorotheus_construction_at',
    'dorotheus_matter_profile_at',
    'western_electional_profile_windows',
    'ashtakavarga_for_chart',
    'ashtakavarga_profile',
    'ashtakavarga_sign_profile',
    'ashtakavarga_transit_strength',
    'astrodynes',
    'astrodynes_from_geometry',
    'ayanamsa',
    'bhava_bala',
    'bhava_bala_for_chart',
    'current_lord_of_orb',
    'huber_age_point',
    'huber_age_point_contacts',
    'huber_chart_intensity_profile',
    'huber_dynamic_intensity',
    'huber_house_zones',
    'huber_intensity_at',
    'integrate_progressed_astrodyne_influence',
    'jaimini_karakas',
    'jaimini_karakas_for_chart',
    'jaimini_pair',
    'jaimini_profile',
    'list_ayanamsa_systems',
    'lord_of_orb',
    'nine_parts',
    'normal_progressed_astrodynes',
    'panchanga',
    'panchanga_profile',
    'pancha_pakshi_profiles',
    'pancha_pakshi_astronomical_paksha',
    'pancha_pakshi_civil_time_sookshma_selection',
    'pancha_pakshi_nakshatra_bird_mapping',
    'pancha_pakshi_natal_moon_identity',
    'pancha_pakshi_first_eat_bird_mapping',
    'pancha_pakshi_padu_bird_mapping',
    'pancha_pakshi_profile_info',
    'pancha_pakshi_identity_from_initial_vowel',
    'pancha_pakshi_directed_relationship',
    'pancha_pakshi_schedule',
    'pancha_pakshi_schedule_sookshma_temporal_selection',
    'pancha_pakshi_sookshma_temporal_selection',
    'pancha_pakshi_local_solar_context',
    'pancha_pakshi_fixed_clock_materialization',
    'pancha_pakshi_fixed_clock_current_cell',
    'pancha_pakshi_solar_proportional_current_cell',
    'pancha_pakshi_solar_proportional_materialization',
    'pancha_pakshi_uromarisi_constitution_status',
    'practical_progressed_astrodynes',
    'progressed_astrodyne_accessory_relation',
    'progressed_astrodyne_compound_total_influence',
    'progressed_astrodyne_dated_aspect',
    'progressed_astrodyne_major_relation',
    'progressed_astrodyne_reenforcement',
    'progressed_astrodyne_total_influence',
    'progressed_astrodynes_chart',
    'progressed_astrodynes_geometry',
    'ramesey_moon_condition_at',
    'sahl_moon_condition_at',
    'sahl_matter_profile_at',
    'lilly_perfection_at',
    'western_electional_judgement_at',
    'western_electional_ranking_at',
    'western_electional_judgement_windows',
    'dorotheus_moon_condition_at',
    'search_progressed_astrodyne_contacts',
    'shadbala',
    'shadbala_condition',
    'shadbala_for_chart',
    'shadbala_network',
    'shadbala_profile',
    'shodashvarga',
    'shodashvarga_for_chart',
    'sidereal_to_tropical',
    'tropical_to_sidereal',
    'varga',
    'varga_for_chart',
    'varga_named',
    'd60_sign',
})

_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "CuspSpeed",
    "HouseDynamics",
    "LunarApparentGeometryError",
    "LunarObserver",
    "LunarOrientation",
    "LunarOrientationCoverageError",
    "LunarOrientationResourceError",
    "LunarOrientationResourceIdentityError",
    "LunarOrientationResourceMissingError",
    "LunarOrientationSource",
    "analytical_asc_speed",
    "analytical_mc_speed",
    "analytical_vertex_speed",
    "cusp_speeds_at",
    "house_dynamics_from_armc",
    "lunar_orientation_at",
})

_EXPECTED_MOIRA_METHODS.update({
    "house_dynamics",
    "primary_directions_timeline",
    "besieging_truth",
    "decennial_sequence_truth",
    "evaluate_lots",
    "hellenistic_superiority_truth",
    "planetary_solar_phase_truth",
    "profection_activation_truth",
    "profection_chronology",
    "solar_proximity_truth",
    "zr_fortune_angularity_truth",
    "hellenistic_chart_profile",
})

_EXPECTED_MOIRA_METHODS.update({
    "physical_visibility_assessment",
    "physical_visibility_event",
})

_EXPECTED_MOIRA_METHODS.update({
    "composite_transits",
    "davison_transits",
    "fixed_star_astrocartography",
    "relationship_chart_targets",
    "relationship_transits",
    "relocated_lunar_return",
    "relocated_planetary_return",
    "relocated_solar_return",
    "transiting_astrocartography",
})

_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "HoraryQuestionTimeBasis",
    "HorarySourceCalendar",
    "HoraryEvidenceProfile",
    "LILLY_1647_HORARY_V1",
    "horary_evidence_at",
})

_EXPECTED_MOIRA_METHODS.add("horary_evidence_at")

_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "MundaneEvaluationStatus",
    "MundaneEventType",
    "MundaneEventChartProfile",
    "MundaneProfileProvenance",
    "compose_mundane_event_chart_profile",
    "eclipse_receipt_from_event",
    "jupiter_saturn_sequence_from_series",
})

_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "DeepSkyClass",
    "DeepSkyObject",
    "DeepSkyPosition",
    "deep_sky_object",
    "deep_sky_at",
    "all_deep_sky_at",
    "list_deep_sky_objects",
    "find_deep_sky_objects",
    "COSMIC_REFERENCE_CATALOG_VERSION",
    "CosmicReferenceDefinition",
    "CosmicReferenceKind",
    "CosmicReferencePosition",
    "all_cosmic_references_at",
    "cosmic_reference_at",
    "cosmic_reference_definition",
    "list_cosmic_references",
})

_EXPECTED_MOIRA_METHODS.update({
    "assess_transit_cardinal_ingress",
    "assess_transit_primary_syzygy",
    "eclipse_receipt_from_event",
    "jupiter_saturn_sequence_from_series",
})

# Additive moira.stellium.v1 contract; legacy pattern exports remain unchanged.
_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "STELLIUM_CORE",
    "STELLIUM_SCHEMA_VERSION",
    "StelliumAnalysis",
    "StelliumAnalysisPolicy",
    "StelliumArc",
    "StelliumAssociation",
    "StelliumContext",
    "StelliumCoverage",
    "StelliumEvaluation",
    "StelliumGroup",
    "StelliumHouseContext",
    "StelliumHouseReceipt",
    "StelliumMatch",
    "StelliumSelection",
    "analyze_stelliums",
})
_EXPECTED_MOIRA_METHODS.add("analyze_stelliums")

# Additive orbital-core Stage 1 contract.
_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "OrbitShape",
    "OrbitalAmbiguousBodyError",
    "OrbitalBodyIdentity",
    "OrbitalBodyKind",
    "OrbitalBodyNotFoundError",
    "OrbitalBodyNotLoadedError",
    "OrbitalBodyNotSupportedError",
    "OrbitalCenter",
    "OrbitalCenterNotAllowedError",
    "OrbitalCoverageError",
    "OrbitalError",
    "OrbitalFrame",
    "OrbitalFrameUnavailableError",
    "OrbitalGravity",
    "OrbitalGravityModelError",
    "OrbitalInputError",
    "OrbitalKernelMissingError",
    "OrbitalLegacyBodyNotAllowedError",
    "OrbitalSingularityThresholds",
    "OrbitalSourceReceiptError",
    "OrbitalStateDegenerateError",
    "OrbitalStateSource",
    "OrbitalTimeBasisError",
    "OrbitalTimeConversion",
    "OsculatingElements",
    "OsculatingElementsProvenance",
    "UndefinedElement",
    "UndefinedElementReason",
    "osculating_elements",
})
_EXPECTED_MOIRA_METHODS.add("osculating_elements")

# Additive orbital-core Stage 2 contract.
_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "ApsidalDirection",
    "ApsidalPassageOutcome",
    "ApsidalPassageStatus",
    "ApsidalPassages",
    "ApsidalPassagesProvenance",
    "ApsidalRouteScheduleEntry",
    "ApsidalSeamContinuity",
    "ApsidalSegmentUsage",
    "OrbitalPassageUnavailableError",
    "OrbitalSearchError",
    "apsidal_passages",
})
_EXPECTED_MOIRA_METHODS.add("apsidal_passages")

# Additive orbital-core Stage 5 contract.
_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "OrbitClassCode",
    "OrbitClassBoundaryMargin",
    "OrbitClassPredicate",
    "OrbitClassResult",
    "OrbitalErrorReceipt",
    "OrbitClassBatchItem",
    "OrbitClassBatchResult",
    "orbit_class",
    "orbit_classes_at",
})
_EXPECTED_MOIRA_METHODS.add("orbit_class")
_EXPECTED_MOIRA_METHODS.add("orbit_classes_at")

# Existing facade-curated Varga products, now available at package root.
_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "VargaPoint",
    "calculate_varga",
    "navamsa",
    "saptamsa",
    "dashamansa",
    "dwadashamsa",
    "trimshamsa",
    "VIMSHOPAKA_GROUPS",
    "VARGA_VISHVA",
    "VimshopakaVargaEntry",
    "VimshopakaBala",
    "varga_sign_index",
    "vimshopaka_bala",
    "vimshopaka_all",
    "is_vargottama",
    "vargottama_planets",
})

# Additive Gochara snapshot constitutional public contract.
_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "GOCHARA_PROFILE", "GOCHARA_PLANETS", "GocharaVedhaStatus",
    "GocharaPosition", "GocharaVedhaWitness", "GocharaPlanetResult",
    "GocharaResult", "gochara_from_positions",
    "DEFAULT_GOCHARA_POLICY", "GocharaSourceProfile", "GocharaVedhaMode",
    "GocharaCompleteness", "GocharaBavMode", "GocharaAdmissionStatus",
    "GocharaDoctrineOption", "GocharaPolicy", "gochara_doctrine_options",
    "GocharaBaselineClass", "GocharaBavAvailability", "GocharaVedhaRelationClass",
    "GocharaLocalCondition", "GocharaLocalProfile", "GocharaChartSummary",
    "GocharaNetworkNode", "GocharaVedhaNetwork", "GocharaSubsystemProfile",
    "gochara_local_profiles", "gochara_subsystem_profile",
})

# Published VED-002 Sayanadi, VED-007 named windows, and VED-008 Shuddhi APIs.
_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "SayanadiPolicy", "SayanadiGhati", "SayanadiName", "SayanadiContext",
    "SayanadiTrace", "SayanadiAvastha", "SayanadiEffectProvenance",
    "sayanadi_avastha", "sayanadi_ghati_from_elapsed", "SayanadiBirthPolicy",
    "SayanadiSunriseBracket", "AvasthaBirthResult", "SayanadiCoverageError",
    "SayanadiResourceError", "avasthas_for_datetime",
    "NamedMuhurtaPolicy", "NamedMuhurtaAnchor", "NamedMuhurtaInterval",
    "NamedMuhurtaResult", "NamedMuhurtaDay", "named_muhurta_from_solar_times",
    "named_muhurta_for_date", "SpecialMuhurtaPolicy", "SpecialMuhurtaBoundary",
    "SpecialMuhurtaWindow", "SpecialMuhurtaResult", "SpecialMuhurtaSolarResult",
    "MuhurtaYogaMatch", "MuhurtaYogaSnapshot", "SpecialMuhurtaDay",
    "special_muhurta_from_solar_times", "muhurta_yogas_from_longitudes",
    "special_muhurta_for_date", "PanchangaShuddhiPolicy", "ShuddhiBoundary",
    "ShuddhiInterval", "PanchakaRahita", "ShuddhiCatalogueEntry",
    "ShuddhiCatalogue", "ShuddhiInputs", "ShuddhiValues", "ShuddhiFinding",
    "PanchangaShuddhiAssessment", "ShuddhiCell", "PanchangaShuddhiDay",
    "panchaka_rahita", "panchanga_shuddhi_catalogue",
    "panchanga_shuddhi_from_longitudes", "panchanga_shuddhi_for_date",
})
_EXPECTED_MOIRA_METHODS.update({
    "evaluate_avasthas", "sayanadi_avastha", "avasthas_for_datetime",
    "named_muhurta_from_solar_times", "named_muhurta_for_date",
    "special_muhurta_from_solar_times", "muhurta_yogas_from_longitudes",
    "special_muhurta_for_date", "panchanga_shuddhi_catalogue",
    "panchanga_shuddhi_from_longitudes", "panchanga_shuddhi_for_date",
})

# VED-009 finite source-selected dosha and Parihara admission.
_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "MuhurtaDoshaPolicy", "DoshaPhaseSpan", "MuhurtaDoshaInputs", "DoshaWitness",
    "DoshaPredicate", "PariharaEvidence", "MuhurtaDoshaFinding",
    "MuhurtaDoshaAssessment", "DoshaCatalogueEntry", "MuhurtaDoshaCatalogue",
    "MuhurtaDoshaCell", "MuhurtaDoshaDay", "muhurta_dosha_catalogue",
    "detect_muhurta_doshas", "muhurta_doshas_for_date",
})
_EXPECTED_MOIRA_METHODS.update({
    "muhurta_dosha_catalogue", "detect_muhurta_doshas", "muhurta_doshas_for_date",
})

# VED-010 source-selected Lagna composition.
_EXPECTED_ROOT_PUBLIC_NAMES.update({
    "MuhurtaLagnaPolicy", "LagnaPlanet", "LagnaRuleEvidence",
    "LagnaPlacementContribution", "LagnaPlacementScore", "LagnaRestriction",
    "MuhurtaLagnaAssessment", "MuhurtaLagnaSnapshot",
    "evaluate_muhurta_lagna_strength", "muhurta_lagna_catalogue",
    "muhurta_lagna_for_datetime",
})
_EXPECTED_MOIRA_METHODS.update({
    "muhurta_lagna_catalogue", "evaluate_muhurta_lagna_strength",
    "muhurta_lagna_for_datetime",
})

_EXPECTED_ESSENTIALS_PUBLIC_NAMES = set(essentials.__all__)
_EXPECTED_CLASSICAL_PUBLIC_NAMES = set(classical.__all__)
_EXPECTED_PREDICTIVE_PUBLIC_NAMES = set(predictive.__all__)
_EXPECTED_FACADE_PUBLIC_NAMES = set(facade.__all__)
_EXPECTED_VEDIC_PUBLIC_NAMES = set(vedic.__all__)
_EXPECTED_SKY_PUBLIC_NAMES = set(sky.__all__)
_EXPECTED_SKY_TIME_PUBLIC_NAMES = set(sky_time.__all__)
_EXPECTED_SKY_POSITION_PUBLIC_NAMES = set(sky_position.__all__)
_EXPECTED_SKY_FRAMES_PUBLIC_NAMES = set(sky_frames.__all__)
_EXPECTED_SKY_VISIBILITY_PUBLIC_NAMES = set(sky_visibility.__all__)
_EXPECTED_SKY_BODIES_PUBLIC_NAMES = set(sky_bodies.__all__)
_EXPECTED_SKY_OBSERVATION_PUBLIC_NAMES = set(sky_observation.__all__)
_EXPECTED_SKY_GALACTIC_PUBLIC_NAMES = set(sky_galactic.__all__)
_EXPECTED_SKY_EVENTS_PUBLIC_NAMES = set(sky_events.__all__)
_EXPECTED_SKY_ECLIPSE_PUBLIC_NAMES = set(sky_eclipse.__all__)
_EXPECTED_SKY_OCCULTATION_PUBLIC_NAMES = set(sky_occultation.__all__)


_EXPECTED_MOIRA_METHODS.update({
    "find_muhurta_windows", "muhurta_score_for_chart",
    "gochara_at", "gochara_for_datetimes",
})


# VA-01..11: explicit geometry, source evidence and bounded scan contracts.
_EXPECTED_ROOT_PUBLIC_NAMES.update({
    'ShadbalaContext', 'ShadbalaContextError', 'derive_shadbala_context',
    'SaptavargajaEntry', 'saptavargaja_breakdown', 'WarResolution',
    'SadeSatiBudgetError', 'DEFAULT_SADE_SATI_EVALUATIONS', 'MAX_SADE_SATI_EVALUATIONS',
})
_EXPECTED_MOIRA_METHODS.add('shadbala_context')

# VED-011 approved selected marriage API. This explicit additive declaration
# preserves every prior expectation; it is not generated from runtime exports.
_EXPECTED_ROOT_PUBLIC_NAMES.update({
    'MarriageApparitionContext', 'MarriageAvailability', 'MarriageDecision',
    'MarriageElectionAssessment', 'MarriageElectionCell', 'MarriageElectionEvidence',
    'MarriageElectionPolicy', 'MarriageElectionSnapshot', 'MarriageElectionWindows',
    'MarriageEvidencePart', 'MarriageException', 'MarriageExtent', 'MarriageFinding',
    'MarriageHistoricalLongitude', 'MarriageHistoricalSkyBand', 'MarriageHistoricalSkySpan',
    'MarriageIngress', 'MarriageIngressHistory', 'MarriageMeasure', 'MarriageMoon28Passage',
    'MarriageParticipant', 'MarriagePersonalContext', 'MarriagePlanet',
    'MarriageSearchBudgetError', 'MarriageSearchLimits', 'MarriageSearchReceipt',
    'MarriageSolarContext', 'MarriageStarHistory', 'MarriageStarPassage',
    'MarriageTimeDegrees', 'MarriageTimeSpan', 'MarriageVisibilityEvent',
    'MarriageVisibilitySample', 'MarriageWindowWitness', 'MarriageYogaEnding',
    'assess_marriage_election', 'marriage_election_catalogue',
    'marriage_election_for_datetime', 'marriage_election_windows',
    'marriage_planet_availability', 'marriage_time_degrees',
})
_EXPECTED_MOIRA_METHODS.update({
    'marriage_election_catalogue', 'assess_marriage_election',
    'marriage_election_for_datetime', 'marriage_election_windows',
})


# Preserve the original independently enumerated inventories verbatim. Do not
# regenerate these floors from runtime or append every newly admitted feature.
_ROOT_COMPATIBILITY_FLOOR = frozenset(_EXPECTED_ROOT_PUBLIC_NAMES)
_METHOD_COMPATIBILITY_FLOOR = frozenset(_EXPECTED_MOIRA_METHODS)


def test_root_public_surface_preserves_compatibility() -> None:
    errors = surface_contract_errors(
        moira, required=_ROOT_COMPATIBILITY_FLOOR, upstream=facade,
    )
    assert not errors, "\n".join(errors)


def test_root_surface_is_duplicate_free_and_bound() -> None:
    names = list(moira.__all__)
    assert len(names) == len(set(names)), "moira.__all__ contains duplicate names"
    missing = [name for name in names if not hasattr(moira, name)]
    assert not missing, f"moira.__all__ declares unbound names: {missing}"


@pytest.mark.parametrize(
    "name",
    (
        "PlanetReductionBreakdown",
        "PlanetReductionStage",
        "planet_reduction_breakdown_at",
    ),
)
def test_planet_reduction_root_and_facade_exports_share_identity(name: str) -> None:
    assert name in moira.__all__
    assert name in facade.__all__
    assert getattr(moira, name) is getattr(facade, name)


@pytest.mark.parametrize(
    "name",
    (
        "OccultationGeographicPole",
        "OccultationPathBoundaryPoint",
        "OccultationPathBoundarySide",
        "OccultationPathBoundaryTrack",
        "OccultationPathPoint",
        "OccultationPathTopology",
        "OccultationPathTopologyKind",
        "OccultationPoleCrossing",
        "OccultationPoleCrossingPhase",
    ),
)
def test_occultation_topology_type_exports_share_identity(name: str) -> None:
    assert getattr(moira, name) is getattr(facade, name)
    assert getattr(moira, name) is getattr(sky_occultation, name)


@pytest.mark.parametrize(
    "name",
    (
        "lunar_occultation_path_topology",
        "lunar_occultation_path_topology_at",
        "lunar_star_occultation_path_topology",
        "lunar_star_occultation_path_topology_at",
    ),
)
def test_occultation_topology_function_exports_and_facade_defaults(name: str) -> None:
    assert getattr(facade, name) is getattr(sky_occultation, name)
    assert "limb_profile_provider" not in inspect.signature(
        getattr(facade, name)
    ).parameters
    parameters = inspect.signature(getattr(facade.Moira, name)).parameters
    assert parameters["sample_count"].default == 65
    assert "limb_profile_provider" not in parameters


def test_root_star_import_matches_public_surface() -> None:
    namespace: dict[str, object] = {}
    exec("from moira import *", {}, namespace)

    declared = set(moira.__all__)
    missing = sorted(declared - set(namespace))
    extra = sorted(set(namespace) - declared)
    assert not missing, f"`from moira import *` missed public names: {missing}"
    assert not extra, f"`from moira import *` leaked unexpected names: {extra}"
    rebound = sorted(
        name for name in declared if namespace[name] is not getattr(moira, name)
    )
    assert not rebound, f"`from moira import *` changed public symbol identity: {rebound}"


def test_root_only_surface_snapshot_is_exact() -> None:
    actual = set(moira.__all__) - set(facade.__all__)
    assert not actual, (
        "moira root exports must now be fully covered by moira.facade.\n"
        f"Unexpected remaining root-only names: {sorted(actual)}"
    )


def test_moira_public_methods_preserve_compatibility() -> None:
    errors = compatibility_errors(
        _METHOD_COMPATIBILITY_FLOOR, public_method_names(facade.Moira), "Moira()",
    )
    assert not errors, "\n".join(errors)


def test_moira_instance_public_methods_are_callable() -> None:
    engine = facade.Moira()
    errors = instance_method_errors(engine, required=_METHOD_COMPATIBILITY_FLOOR)
    assert not errors, "\n".join(errors)
