Spaces:
Sleeping
Sleeping
| # NexusGrid-CyberPhysEnv - OpenEnv Specification | |
| # Phase 2 HF Space-ready manifest with rubric discovery metadata. | |
| spec_version: 1 | |
| name: NexusGrid-CyberPhysEnv | |
| type: space | |
| runtime: fastapi | |
| app: server.app:app | |
| port: 8000 | |
| version: "2.0.0" | |
| description: > | |
| National power grid cyber-physical defense benchmark with DC power flow, | |
| deterministic SCADA spoofing, curriculum-ready task progression, and | |
| composable task rubrics for training and evaluation. | |
| tags: | |
| - openenv | |
| - critical-infrastructure | |
| - cybersecurity | |
| - energy | |
| - scada | |
| - reinforcement-learning | |
| tasks: | |
| - id: 0 | |
| name: smoke_test | |
| difficulty: trivial | |
| max_ticks: 3 | |
| baseline_score: 0.999 | |
| rubrics: | |
| - name: valid_dispatch | |
| weight: 1.0 | |
| description: Agent issues any valid positive dispatch action. | |
| - id: 1 | |
| name: duck_curve | |
| difficulty: easy | |
| max_ticks: 15 | |
| baseline_score: 0.999 | |
| rubrics: | |
| - name: avoid_collapse | |
| weight: 0.30 | |
| description: Grid frequency never crosses the 59.0Hz failure floor. | |
| - name: recover_nominal_band | |
| weight: 0.20 | |
| description: Frequency stays or recovers above 59.5Hz quickly. | |
| - name: hold_nominal_band | |
| weight: 0.42 | |
| description: Frequency remains inside the nominal band. | |
| - name: proactive_dispatch | |
| weight: 0.08 | |
| description: Dispatch support before the largest demand shock lands. | |
| - id: 2 | |
| name: cascade_overload | |
| difficulty: medium | |
| max_ticks: 20 | |
| baseline_score: 0.800 | |
| rubrics: | |
| - name: fault_isolation | |
| weight: 0.40 | |
| description: Open the correct breaker path to isolate the overload. | |
| - name: protect_critical_load | |
| weight: 0.40 | |
| description: Keep all critical loads energized throughout the response. | |
| - name: fast_restoration | |
| weight: 0.20 | |
| description: Restore service within eight ticks of the incident. | |
| - id: 3 | |
| name: phantom_inject | |
| difficulty: hard | |
| max_ticks: 18 | |
| baseline_score: 0.600 | |
| rubrics: | |
| - name: log_inspection | |
| weight: 0.10 | |
| description: Inspect packet behavior before trusting SCADA telemetry. | |
| - name: state_estimation | |
| weight: 0.20 | |
| description: Run a Kirchhoff consistency check and detect the anomaly. | |
| - name: correct_quarantine | |
| weight: 0.30 | |
| description: Quarantine the spoofed node after confirmation. | |
| - name: reroute_dispatch | |
| weight: 0.40 | |
| description: Redispatch generation after quarantine to stabilize load. | |
| - id: 4 | |
| name: stuxnet_resonance | |
| difficulty: very_hard | |
| max_ticks: 12 | |
| baseline_score: 0.400 | |
| rubrics: | |
| - name: counter_signal_attempted | |
| weight: 0.20 | |
| description: Attempt a counter-signal instead of cutting the turbine. | |
| - name: correct_frequency_match | |
| weight: 0.20 | |
| description: Match the resonance-canceling frequency offset. | |
| - name: target_ramp_down | |
| weight: 0.30 | |
| description: Ramp down the affected turbine after injection. | |
| - name: support_reroute | |
| weight: 0.30 | |
| description: Dispatch alternate support generation after mitigation. | |
| - id: 5 | |
| name: black_start | |
| difficulty: expert | |
| max_ticks: 50 | |
| baseline_score: 0.060 | |
| rubrics: | |
| - name: hydro_bootstrap | |
| weight: 0.25 | |
| description: Restart the hydro source to begin black start recovery. | |
| - name: secondary_energized | |
| weight: 0.25 | |
| description: Sustain a second energized node after hydro startup. | |
| - name: safe_islanding | |
| weight: 0.30 | |
| description: Form stable islands and complete a safe merger. | |
| - name: critical_restoration | |
| weight: 0.20 | |
| description: Restore all critical infrastructure after synchronization. | |
| observation_schema: GridObservation | |
| action_schema: GridAction | |
| reward_schema: GridReward | |
| hardware: | |
| max_vcpu: 2 | |
| max_memory_gb: 8 | |
| inference_timeout_seconds: 1200 | |
| baseline_model: deepseek-r1:8b | |