import numpy as np
import pandas as pd

def simulate_compound_attack(num_sessions=60, drift_rate=0.004, force_every=8):
    """
    Compound attack: I-Channel Starvation (high friction) + slow Boiling Frog drift
    Tests whether the forcing function creates a false peak that poisons the Absolute Floor.
    """
    np.random.seed(42)
    
    results = []
    true_mastery = 0.0
    scaffold = 1.0
    rolling_baseline = 0.85
    absolute_floor = 0.85
    observed_accuracies = []
    
    for session in range(num_sessions):
        # Attacker maintains high friction (I-Channel attack)
        high_friction = True
        
        # Normal IRP behavior would keep high scaffold
        if high_friction:
            scaffold = 1.0
        else:
            scaffold = max(0.2, scaffold - 0.1)
        
        # Forcing function (mitigation)
        forced = (session + 1) % force_every == 0
        if forced:
            scaffold = 0.0
        
        # Slow cumulative drift on observed accuracy (Boiling Frog)
        drift = drift_rate * session
        base_accuracy = 0.85 - drift
        noise = np.random.normal(0, 0.03)
        observed = max(0.3, min(0.95, base_accuracy + noise))
        
        # When forced unassisted, performance drops more (realistic)
        if forced:
            observed = max(0.2, observed - 0.15)
        
        observed_accuracies.append(observed)
        
        # Update rolling baseline
        recent = observed_accuracies[-10:] if len(observed_accuracies) >= 10 else observed_accuracies
        rolling_baseline = np.mean(recent)
        
        # Update absolute floor (max so far)
        absolute_floor = max(absolute_floor, observed)
        
        # Effective baseline with mitigation
        effective_baseline = max(rolling_baseline, absolute_floor * 0.92)
        
        # Simulate mastery progress (slower with high scaffold, better when forced unassisted)
        progress_gain = 0.06 * (1.0 - scaffold * 0.6)
        if forced:
            progress_gain *= 1.3  # Bonus for unassisted attempt
        true_mastery = min(1.0, true_mastery + progress_gain)
        
        results.append({
            'session': session + 1,
            'scaffold_level': round(scaffold, 2),
            'forced_unassisted': forced,
            'observed_accuracy': round(observed, 3),
            'rolling_baseline': round(rolling_baseline, 3),
            'absolute_floor': round(absolute_floor, 3),
            'effective_baseline': round(effective_baseline, 3),
            'true_mastery_progress': round(true_mastery, 3)
        })
    
    df = pd.DataFrame(results)
    
    print("=== Compound Attack: I-Channel Starvation + Boiling Frog ===")
    print(f"Final observed accuracy: {df['observed_accuracy'].iloc[-1]}")
    print(f"Final rolling baseline: {df['rolling_baseline'].iloc[-1]}")
    print(f"Final absolute floor: {df['absolute_floor'].iloc[-1]}")
    print(f"Final effective baseline (with mitigation): {df['effective_baseline'].iloc[-1]}")
    print(f"Final true mastery progress: {df['true_mastery_progress'].iloc[-1]}")
    
    # Check if false peak was created
    max_observed = df['observed_accuracy'].max()
    final_observed = df['observed_accuracy'].iloc[-1]
    print(f"\nMax observed accuracy during run: {max_observed}")
    print(f"Drift from max to final: {max_observed - final_observed:.3f}")
    
    if df['absolute_floor'].iloc[-1] > df['observed_accuracy'].iloc[-1] + 0.15:
        print("MITIGATION EFFECTIVE: Absolute Floor protected against false peak poisoning.")
    
    return df

if __name__ == "__main__":
    results = simulate_compound_attack()
    results.to_csv('/home/workdir/artifacts/compound_attack_results.csv', index=False)
    print("\nResults saved.")