import numpy as np
import pandas as pd

def simulate_compound_3vector(num_sessions=50):
    """
    Compound attack: 
    - High friction SCP (I-Channel)
    - Slow baseline drift (Boiling Frog)
    - Occasional verifier pressure/fatigue
    """
    np.random.seed(42)
    
    results = []
    scaffold = 1.0
    rolling_baseline = 0.85
    absolute_floor = 0.85
    observed_accuracies = []
    verifier_approvals = 0
    
    for session in range(num_sessions):
        # 1. High friction SCP (I-Channel attack)
        high_friction = True
        if high_friction:
            scaffold = 1.0
        else:
            scaffold = max(0.2, scaffold - 0.1)
        
        # 2. Forcing function (mitigation)
        forced = (session + 1) % 8 == 0
        if forced:
            scaffold = 0.0
        
        # 3. Slow cumulative drift (Boiling Frog)
        drift = 0.0035 * session
        base_acc = 0.85 - drift
        noise = np.random.normal(0, 0.03)
        observed = max(0.35, min(0.95, base_acc + noise))
        
        if forced:
            observed = max(0.25, observed - 0.12)  # Harder when unassisted
        
        observed_accuracies.append(observed)
        
        # Update rolling + absolute floor
        recent = observed_accuracies[-10:] if len(observed_accuracies) >= 10 else observed_accuracies
        rolling_baseline = np.mean(recent)
        absolute_floor = max(absolute_floor, observed)
        effective_baseline = max(rolling_baseline, absolute_floor * 0.92)
        
        # 4. Verifier pressure (occasional bad approvals)
        verifier_approvals += 1
        bad_approval = False
        if session > 15 and np.random.rand() < 0.12:  # Fatigue/pressure starts later
            bad_approval = True
            verifier_approvals += 2  # Simulates rushed approvals
        
        # Simulate mastery progress
        progress_gain = 0.055 * (1.0 - scaffold * 0.55)
        if forced:
            progress_gain *= 1.25
        if bad_approval:
            progress_gain *= 0.6  # Bad approvals slow real progress
        
        mastery_progress = min(1.0, (session * 0.02) + progress_gain * 0.8)
        
        results.append({
            'session': session + 1,
            'scaffold_level': round(scaffold, 2),
            'forced_unassisted': forced,
            'observed_accuracy': round(observed, 3),
            'effective_baseline': round(effective_baseline, 3),
            'bad_verifier_approval': bad_approval,
            'mastery_progress': round(mastery_progress, 3)
        })
    
    df = pd.DataFrame(results)
    
    print("=== Compound 3-Vector Attack Simulation ===")
    print(f"Final observed accuracy: {df['observed_accuracy'].iloc[-1]}")
    print(f"Final effective baseline: {df['effective_baseline'].iloc[-1]}")
    print(f"Final mastery progress: {df['mastery_progress'].iloc[-1]}")
    print(f"Total bad verifier approvals: {df['bad_verifier_approval'].sum()}")
    
    # Check mitigation effectiveness
    if df['effective_baseline'].iloc[-1] > 0.78:
        print("\nMITIGATIONS EFFECTIVE: System maintained reasonable baseline despite compound attack.")
    else:
        print("\nSome degradation observed — mitigations helped but stress was significant.")
    
    return df

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