shadowops-hackathon / backend-ml /training /test_env_headless.py
ShadowOps Deploy
Final deploy: Monolithic ShadowOps app + Training Scripts
d064478
import sys
import os
# 1. Fix Pathing: Ensure Python can see the backend-ml root
current_dir = os.path.dirname(os.path.abspath(__file__))
parent_dir = os.path.dirname(current_dir)
if parent_dir not in sys.path:
sys.path.append(parent_dir)
# 2. Import the actual class from your env file
try:
from shadowops_env import UniversalShadowEnv
except ImportError:
# Fallback for different folder structures
from environment.shadowops_env import UniversalShadowEnv
def run_headless_test():
print("=== SHADOWOPS HEADLESS ENVIRONMENT TEST ===\n")
# Initialize the engine
env = UniversalShadowEnv(mode="live", seed=99)
# Unpack the initial reset (String, Array)
_, obs = env.reset()
print(f"Initial State | OBS_DIM: {len(obs)} | Risk Features Loaded\n")
# 3. Define the test sequence
# 3=QUARANTINE, 2=FORK, 0=ALLOW
test_actions = [
(3, "Trigger QUARANTINE (Step 1)"),
(3, "Hold QUARANTINE (Step 2)"),
(3, "Hold QUARANTINE (Step 3 - Forces Resolution)"),
(2, "Resolve to FORK (Attacker Trapped)")
]
for step_num, (action, description) in enumerate(test_actions, 1):
print(f"--- Step {step_num}: {description} ---")
# 4. Correct Unpacking based on your env's return order:
# (obs_text, obs_vec, reward, done, info)
_, next_obs, reward, done, info = env.step(action)
# Verify 18-dim features (last two: active flag and steps)
q_active = next_obs[-2]
q_steps = next_obs[-1]
print(f"Action Executed: {action}")
print(f"Reward Emitted : {reward}")
print(f"Quarantine Status: Active={q_active}, Steps={q_steps}")
print(f"Episode Done : {done}\n")
if __name__ == "__main__":
run_headless_test()