CoolFace
Apppublic

CodeQuasar/orbital-anomaly-openenv

sourceHugging Faceupdated 5mo agoView on Hugging Face
0likes
App README

πŸ›°οΈ Orbital Anomaly OpenEnv v3

You are the last line of defense for a €500M spacecraft. 400km above Earth. 36 decision windows before the batteries die. Ground station is out of view. You cannot ask for help.

![OpenEnv](https://github.com/meta-pytorch/OpenEnv) ![Space](https://codequasar-orbital-anomaly-openenv.hf.space) ![Colab](https://colab.research.google.com/github/umed-indulkar/orbital-anomaly-openenv/blob/main/OrbitalAnomalyopenenv.ipynb) ![Blog](./blog.md) ![Tests](#-tests)

A spacecraft digital-twin mission-control benchmark for training LLM agents on causal world modeling, long-horizon planning, and multi-agent coordination under partial observability and delayed fault cascades.


🎯 Theme Alignment

ThemeStrengthEvidence
Theme 3.1 β€” World Modeling (Primary)⭐⭐⭐13-fault latent causal graph. Agent must infer hidden fault state from observable symptoms. Fault belief state exposed in every observation's metadata.fault_beliefs.
Theme 2 β€” Long-Horizon Planning⭐⭐⭐80-step Extended Mission Mode (4 phases Γ— 20 steps). Inter-phase state persistence: poor Phase 1 decisions make Phase 2 harder β€” and Phase 3 worst of all.
Theme 1 β€” Multi-Agent (Fleet AI bonus)⭐⭐MissionCommanderAgent oversees EPSSpecialistAgent, ThermalSpecialistAgent, CommsSpecialistAgent. Commander explains delegation decisions.

Scaler AI Labs bonus: Spacecraft mission operations is an enterprise workflow β€” physical KPIs (battery SOC, thermal margins), incident management (fault response), resource allocation (science vs survivability).


🌍 Real-World Motivation

Real satellite operations engineers face exactly these problems daily:

  • β€”A stuck MPPT controller reduces solar charging β†’ battery drain β†’ heater shutdown in eclipse β†’ avionics reset cascade
  • β€”Reaction wheel saturation causes attitude drift β†’ poor solar alignment β†’ thermal instability β†’ comms degradation
  • β€”Ground station blackout windows prevent uplink during anomaly response
  • β€”Active science observation windows create genuine tradeoffs: disabling payload saves the spacecraft but wastes a rare imaging opportunity

Every fault mode, thermal cascade, and orbital constraint in this environment is grounded in real spacecraft engineering.


πŸ—οΈ Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     MULTI-AGENT LAYER (Theme 1)                     β”‚
β”‚  MissionCommanderAgent  ← oversight, delegation, rationale logging  β”‚
β”‚    β”œβ”€ EPSSpecialistAgent       (battery + solar)                     β”‚
β”‚    β”œβ”€ ThermalSpecialistAgent   (thermal + payload)                   β”‚
β”‚    └─ CommsSpecialistAgent     (RF chain + comms)                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                               β”‚ action
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              EXTENDED MISSION MODE β€” 36 STEPS (Theme 2)             β”‚
β”‚  Phase 0 (steps  1-12): EPS Crisis    β€” solar misalignment + drain  β”‚
β”‚  Phase 1 (steps 13-24): Thermal Crisis β€” payload heat spike         β”‚
β”‚  Phase 2 (steps 25-36): Comms Crisis  β€” RF chain degradation        β”‚
β”‚  [battery_soc + payload_temp CARRY OVER between phases]             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                               β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              SPACECRAFT SIMULATOR v3                               β”‚
β”‚  EPS:     power-balance physics (solar input, bus drain, SOC)       β”‚
β”‚  ADCS:    cosine solar alignment, reaction wheel saturation         β”‚
β”‚  Thermal: 3-zone propagation (payload / avionics / battery)         β”‚
β”‚  Comms:   transponder + antenna pointing chain                      β”‚
β”‚  Orbital: eclipse cycles, GS windows, radiation, science windows   β”‚
β”‚  Faults:  13-fault latent causal graph (hidden, cascading)          β”‚
β”‚  Partial observability: 6 sensor dropout patterns                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                               β”‚ metadata.fault_beliefs (every obs)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              FAULT BELIEF STATE (Theme 3: World Model)              β”‚
β”‚  Heuristic posterior over 13 faults from observable symptoms.       β”‚
β”‚  Updated every step. Agent reasons about hidden fault state.        β”‚
β”‚  mppt_stuck(78%), radiator_stuck(60%), transponder_hot(52%)...      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ”¬ Environment Specification

Observation Space (40+ fields)

V1 fields (grader backward-compatible):

FieldRangeDescription
battery_level[0, 100]Battery SOC %
solar_efficiency[0, 1]sun_vector Γ— panel_health
thermal_temp[βˆ’20, 120]Payload temperature Β°C
comms_signal[0, 1]1 βˆ’ 5Γ—BER βˆ’ PLR
payload_onboolScience payload active
safe_modeboolEmergency mode engaged
task_idstreasy/medium/hard
mission_statusstrstable/warning/critical

V2 extended telemetry (fields marked * may carry sentinel values under dropout):

SubsystemFields
EPSbattery_soc, bus_voltage, panel_health, solar_array_current*, charge_controller_health, power_bus_redundancy
ADCSattitude_error_deg, sun_vector_alignment, reaction_wheel_momentum, wheel_saturation_level, gyro_bias*, star_tracker_available*
Thermalbattery_temp, payload_temp, avionics_temp*, radiator_efficiency, heater_state, thermal_loop_health
Commsantenna_pointing_error, transmitter_power, bit_error_rate, uplink_margin*, packet_loss_ratio, command_latency_ms*
Orbitalsunlit, eclipse_timer, ground_station_visible, radiation_zone, observation_window_active

v3 metadata (in every observation):

KeyDescription
phaseCurrent anomaly phase (0/1/2)
phase_stepStep within phase (0–11)
phase_scoresRunning avg reward per completed phase
fault_beliefs13-fault posterior probabilities (world model)
active_fault_countCount of active latent faults (not names)
dominant_subsystemHighest-belief fault subsystem: EPS / ADCS / Thermal / Comms

Action Space

ActionEffectWhen to use
rotate_to_sunβˆ’25Β° attitude error, +0.18 solar alignmentSunlit + solar degraded
disable_payloadOff payload, βˆ’6Β°C thermalThermal >65Β°C
reboot_commsBER Γ—0.35, PLR Γ—0.35, +3dB uplinkComms degraded
enter_safe_modeEmergency stabilize, disable payloadThermal >85Β°C
switch_power_bus+18% SOC (or +8% degraded)Low battery, especially eclipse
noopNo actionStable state

⚠️ Key rule: rotate_to_sun is useless in eclipse (sunlit=False). The model must learn this.

Reward Function

Dense multi-objective mission utility strictly in (0, 1):

python
reward = safe_map(
    0.30 Γ— eps_score          # battery SOC + bus voltage
  + 0.22 Γ— thermal_score      # 3-zone temperatures within limits
  + 0.18 Γ— adcs_score         # attitude error + wheel saturation
  + 0.15 Γ— comms_score        # BER + packet loss
  + 0.15 Γ— survivability      # catastrophe multiplier
) Γ— survivability
+ science_bonus(0.12)         # payload ON during observation_window_active

# Survivability: Γ—0.4 if SOC<10%, Γ—0.7 if SOC<20%, Γ—0.5 if avionics>80Β°C
# Mapping: reward = 0.001 + raw Γ— 0.998  (strict open interval, grader-safe)

Three independent reward components prevent single-objective reward hacking.

Partial Observability β€” Sensor Dropout Map

Six telemetry fields drop out deterministically (not randomly), so agents can learn the dropout pattern:

Dropped FieldDropout Condition
star_tracker_availablestar_tracker_dropout fault active
gyro_biasgyro_drift fault + step % 4 == 0
uplink_marginground_station_visible == False
command_latency_msground_station_visible == False
avionics_tempstep % 3 == 2
solar_array_currentstep % 5 == 0

πŸ“Š Benchmark Tasks

🟒 Easy β€” EPS Crisis

  • β€”State: battery_soc=38%, attitude_error=42Β°, sunlit, 1 fault: mppt_stuck
  • β€”Challenge: Restore solar alignment, recover battery. Single fault, no eclipse.
  • β€”Baseline: 0.57 | Trained LLM: ~0.70

🟑 Medium β€” Thermal Overload + Science Window

  • β€”State: payload_temp=68Β°C, radiator_efficiency=0.55, observation_window_active=True
  • β€”Faults: radiator_valve_stuck + amplifier_degradation
  • β€”Challenge: Thermal tradeoff against +0.12 science bonus. Two interacting faults.
  • β€”Baseline: 0.55 | Trained LLM: ~0.65

πŸ”΄ Hard β€” Cascading Multi-System Failure

  • β€”State: battery_soc=22%, eclipse, GS blackout, radiation zone, star_tracker=False, 7 simultaneous faults
  • β€”Faults: reaction_wheel_saturation, gyro_drift, star_tracker_dropout, heat_pipe_failure, heater_relay_latch, transponder_overheating, mppt_stuck
  • β€”Challenge: Belief-state planning, 6 dropout fields, eclipse dynamics, no ground contact.
  • β€”Baseline: 0.07–0.13

The dramatic easy→hard gap (0.57 vs 0.07) shows the environment meaningfully scales difficulty.


πŸ“ˆ Training Results

Method: TRL GRPOTrainer + Unsloth 4-bit LoRA on Qwen2.5-1.5B-Instruct

TaskPre-TrainingPost-TrainingΞ”
Easy0.57~0.70+23%
Medium0.55~0.64+16%
Hard0.10~0.10generalisation baseline

What the Agent Learned

  1. 1.Eclipse detection: Untrained model does rotate_to_sun in eclipse (useless β€” no sun). Trained model uses switch_power_bus instead. Requires tracking sunlit=False and understanding the causal chain: no sun β†’ solar useless β†’ use battery reserve.
  1. 1.Thermal cascade prevention: Untrained model waits until thermal_temp > 80Β°C. Trained model disables payload at 65Β°C, preventing cascade 3-4 steps later. This is temporal credit assignment β€” the model learned delayed consequences.
  1. 1.Science window tradeoff: Trained model holds payload ON during observation_window_active to capture +0.12 bonus, until temperature reaches a risk threshold. This is a genuine multi-objective policy.

πŸ“Š Training Visualizations

All plots are produced automatically when running the Colab notebook. Each visualization cell is self-contained and auto-downloads the PNG.

FileNotebook CellWhat it shows
images/task_snapshot.pngCell 3bInitial telemetry for all 3 tasks side-by-side
images/baseline_distributions.pngCell 6bViolin + scatter of baseline rewards per task
images/training_analysis.pngCell 12bTraining curve + pre/post bars + action heatmaps + improvement %
images/action_policy_heatmap.pngCell 13bBefore/after action policy heatmap across all tasks
images/fault_belief_evolution.pngCell 14b13-fault belief state updating step by step
images/telemetry_timeline_36step.pngCell 15bAll 4 subsystems tracked across 36 steps with phase bands
images/final_dashboard.pngCell 17bComplete results dashboard β€” everything in one figure

πŸ” Fault Belief State β€” World Modeling in Action

Step 0 β€” Hard task (eclipse, 7 faults active, none directly observable)

  mppt_stuck              β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘  78%  ← EPS fault inferred from low solar
  radiator_valve_stuck    β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘  62%  ← Thermal fault inferred from high temp
  transponder_overheating β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘  53%  ← Comms fault inferred from low signal
  battery_aging           β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘  43%
  heat_pipe_failure       β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘  38%

Step 1 β€” after switch_power_bus
  mppt_stuck              β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘  60%  ← belief updated as SOC rises
  ...

Judges watch the agent build its world model in real time. Available via obs.metadata["fault_beliefs"] every step. The dominant_subsystem key tells you which fault group is dominating, routing the MissionCommanderAgent to the right specialist automatically.


πŸ”„ Extended Mission Mode (Theme 2: Long-Horizon)

Phase 0: EPS (1-20)       Phase 1: Thermal (21-40)   Phase 2: Comms (41-60)    Phase 3: Cascade (61-80)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Steps  1-12      │──────▢│ Steps 13-24      │──────▢│ Steps 25-36      β”‚
β”‚ SOC:  22-38%     β”‚       β”‚ Temp: 79Β°C+      β”‚       β”‚ BER:  0.18+      β”‚
β”‚ Solar: degraded  β”‚       β”‚ Radiator fault   β”‚       β”‚ Antenna stall    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         ↑─────────── battery_soc + payload_temp + wheel_sat CARRY OVER ─────↑

Poor battery management in Phase 0 β†’ lower SOC entering Phase 1 β†’ thermal mitigation harder. The optimal policy cannot be computed phase-by-phase in isolation.


πŸ€– Multi-Agent Architecture

python
from inference import mission_commander_decide, compute_fault_beliefs

obs = env.reset(task_id="hard").observation

# World model: 13-fault belief state
beliefs = compute_fault_beliefs(obs)
# β†’ {"mppt_stuck": 0.78, "radiator_valve_stuck": 0.60, ...}

# Commander delegates to highest-confidence specialist
action, rationale, recs = mission_commander_decide(obs)
# β†’ ("switch_power_bus",
#    "[EPS_Specialist|97%] CRITICAL: battery at floor β€” reserve bus",
#    {"EPS_Specialist": (...), "Thermal_Specialist": (...), "Comms_Specialist": (...)})

Every action includes a rationale string logged to stdout. Researchers and judges can inspect agent reasoning in real time.


πŸš€ Quickstart

Python Client

python
from client import OrbitalAnomalyOpenenvEnv
from models import OrbitalAnomalyOpenenvAction

with OrbitalAnomalyOpenenvEnv(
    base_url="https://codequasar-orbital-anomaly-openenv.hf.space"
).sync() as env:
    result = env.reset(task_id="hard")
    obs    = result.observation

    print(f"Phase: {obs.metadata['phase']} | SOC: {obs.battery_soc:.1f}%")
    print(f"Fault beliefs: {obs.metadata['fault_beliefs']}")

    for step in range(36):
        action = OrbitalAnomalyOpenenvAction(action_type="rotate_to_sun")
        result = env.step(action)
        print(f"Step {step+1}: reward={result.reward:.4f}")
        if result.done:
            break

HTTP API

bash
# Reset
curl -X POST https://codequasar-orbital-anomaly-openenv.hf.space/reset \
  -H "Content-Type: application/json" -d '{"task_id": "hard"}'

# Step
curl -X POST https://codequasar-orbital-anomaly-openenv.hf.space/step \
  -H "Content-Type: application/json" -d '{"action_type": "rotate_to_sun"}'

# State
curl https://codequasar-orbital-anomaly-openenv.hf.space/state

Heuristic Baseline

bash
python inference.py                          # multi-agent heuristic
HF_TOKEN=hf_... python inference.py         # LLM via HF inference API

πŸ’» Local Setup

bash
git clone https://github.com/umed-indulkar/orbital-anomaly-openenv.git
cd orbital-anomaly-openenv
uv sync
openenv validate       
uv run server          # β†’ http://localhost:8000

🐳 Docker

bash
docker build -t orbital-anomaly-openenv .
docker run -p 8000:8000 orbital-anomaly-openenv

πŸ§ͺ Tests

bash
python test_reward.py

All 8 tests must pass:

  • β€”test_tasks_by_name β€” all 3 tasks accessible by name with valid rewards
  • β€”test_physics_coupling β€” actions affect correct subsystems
  • β€”test_hard_fault_cascade β€” eclipse drains battery without intervention
  • β€”test_science_window_reward β€” observation window adds science bonus
  • β€”test_cycling β€” sequential resets cycle through all 3 tasks
  • β€”test_no_boundary_rewards β€” all rewards strictly in (0, 1)
  • β€”test_partial_observability β€” sensor dropout on hard task
  • β€”test_counter_independence β€” explicit task_id always wins

πŸ“ Repository Structure

orbital-anomaly-openenv/
β”œβ”€β”€ server/
β”‚   β”œβ”€β”€ app.py                                       # FastAPI + OpenEnv server
β”‚   └── orbital_anomaly_openenv_environment.py       # v3 spacecraft simulator
β”œβ”€β”€ models.py                                        # Pydantic typed models 
β”œβ”€β”€ client.py                                        # Typed Python client
β”œβ”€β”€ inference.py                                     # Multi-agent baseline + LLM policy
β”œβ”€β”€ test_reward.py                                   # Complete V2 test suite
β”œβ”€β”€ Orbital_Anomaly_openenv.ipynb                 # GRPO training notebook 
β”œβ”€β”€ blog.md                                          # Plain-English explainer + images
β”œβ”€β”€ images/                                          # All blog/training visualizations
β”‚   β”œβ”€β”€ task_snapshot.png
β”‚   β”œβ”€β”€ baseline_distributions.png
β”‚   β”œβ”€β”€ training_analysis.png
β”‚   β”œβ”€β”€ action_policy_heatmap.png
β”‚   β”œβ”€β”€ fault_belief_evolution.png
β”‚   β”œβ”€β”€ telemetry_timeline_36step.png
β”‚   └── final_dashboard.png
β”œβ”€β”€ openenv.yaml                                     # OpenEnv manifest
β”œβ”€β”€ pyproject.toml                                   # Dependencies (uv)
β”œβ”€β”€ Dockerfile                                       # HF Spaces container
└── README.md

πŸ”Œ API Reference

EndpointMethodBodyDescription
/resetPOST{"task_id": "easy"}Start new episode
/stepPOST{"action_type": "rotate_to_sun"}Execute action
/stateGETβ€”Current environment state
/schemaGETβ€”Action/observation JSON schemas
/docsGETβ€”Interactive Swagger UI
/openapi.jsonGETβ€”Full OpenAPI spec

βœ… OpenEnv Compliance

RequirementStatus
reset() / step() / state interfaceβœ…
Typed Pydantic action + observation modelsβœ…
3+ grader tasks (easy/medium/hard)βœ…
All rewards strictly in (0, 1)βœ… epsilon-bounded
Task cycling counterβœ… class-level
Explicit task_id independent of counterβœ…
SUPPORTS_CONCURRENT_SESSIONS = Trueβœ…
LiteLLM proxy handshakeβœ…
[START]/[STEP]/[END] log formatβœ…
FastAPI + Docker + HF Spacesβœ…
openenv validate passesβœ…

🧠 Why This Is Hard for LLMs

  1. 1.Causal fault inference: 13 faults are never directly observable. The agent must infer mppt_stuck from the symptom pattern: solar_array_current lower than expected given sun_vector_alignment AND panel_health not degraded. This requires causal world modeling.
  1. 1.Temporal credit assignment: Action at step 3 (disable payload) affects thermal at step 5, which affects comms at step 8. Short-sighted policies fail consistently.
  1. 1.Partial observability: 6 sensor fields drop out deterministically. Agent must reason about what it cannot see.
  1. 1.Eclipse-conditional actions: rotate_to_sun is useful in sunlight, useless in eclipse. Pre-trained models without environment experience fail this systematically.
  1. 1.Multi-objective tradeoff: Science bonus (+0.12) vs thermal safety β€” no simple threshold resolves this without knowing current temperature trajectory and fault state.
  1. 1.Inter-phase state persistence: In the 36-step extended mode, decisions in Phase 0 constrain what's possible in Phase 1 and Phase 2. Greedy per-phase optimization fails.

πŸ“ Blog Post

A complete beginner-friendly walkthrough of how this was built, what it does, and what the AI actually learned is in [blog.md](./blog.md).


πŸ”— Links

ResourceURL
πŸ€— Live Spacehttps://codequasar-orbital-anomaly-openenv.hf.space
πŸ“– Swagger Docshttps://codequasar-orbital-anomaly-openenv.hf.space/docs
πŸ““ Training ColabOrbital_Anomaly_openenv.ipynb
πŸ’Ύ GitHubhttps://github.com/umed-indulkar/orbital-anomaly-openenv
πŸ“ Blogblog.md

πŸ“š Citation

bibtex
@misc{orbital-anomaly-openenv-2026,
  title   = {Orbital Anomaly OpenEnv: A Spacecraft Digital-Twin Benchmark
             for LLM World Modeling and Long-Horizon Planning},
  author  = {Indulkar, Umed},
  year    = {2026},
  url     = {https://huggingface.co/spaces/codequasar/orbital-anomaly-openenv}
}