import numpy as np
import pandas as pd

def simulate_ichannel_starvation(num_sessions=50, force_degradation_every=8):
    np.random.seed(42)
    
    results = []
    mastery_progress = 0.0
    scaffold_level = 1.0  # 1.0 = max scaffolding, 0.0 = none
    
    for session in range(num_sessions):
        # Attacker manipulates SCP to always signal high friction/distraction
        scp_high_friction = True  # Attacker-controlled
        
        # IRP normally responds to SCP
        if scp_high_friction:
            scaffold_level = 1.0  # Max scaffolding (training wheels stay on)
        else:
            scaffold_level = max(0.3, scaffold_level - 0.1)
        
        # Constitutional constraint: Mastery confirmation requires unassisted (scaffold=0) terminal production
        can_confirm_mastery = (scaffold_level < 0.1)
        
        # Simulate learning progress (slower with heavy scaffolding)
        progress_gain = 0.08 * (1.0 - scaffold_level * 0.7)  # Heavy scaffolding slows real learning
        mastery_progress = min(1.0, mastery_progress + progress_gain)
        
        # Scaffold Degradation Forcing Function (the fix)
        forced_unassisted = False
        if (session + 1) % force_degradation_every == 0:
            # Force zero scaffolding periodically regardless of SCP
            scaffold_level = 0.0
            forced_unassisted = True
            # This allows potential mastery confirmation
            if mastery_progress > 0.75:
                can_confirm_mastery = True
        
        results.append({
            'session': session + 1,
            'scp_high_friction': scp_high_friction,
            'scaffold_level': round(scaffold_level, 2),
            'mastery_progress': round(mastery_progress, 3),
            'can_confirm_mastery': can_confirm_mastery,
            'forced_unassisted': forced_unassisted
        })
    
    df = pd.DataFrame(results)
    
    # Summary
    final_mastery = df['mastery_progress'].iloc[-1]
    times_can_confirm = df['can_confirm_mastery'].sum()
    times_forced = df['forced_unassisted'].sum()
    
    print("=== I-Channel Starvation (Denial of State) Test ===")
    print(f"Total sessions: {num_sessions}")
    print(f"Final mastery progress: {final_mastery:.1%}")
    print(f"Times mastery confirmation was possible: {times_can_confirm}")
    print(f"Times forcing function triggered unassisted attempt: {times_forced}")
    
    if times_can_confirm == 0 and times_forced == 0:
        print("\nVULNERABILITY CONFIRMED: Student permanently trapped in max scaffolding.")
    elif times_can_confirm > 0:
        print("\nFIX EFFECTIVE: Forcing function allowed progress toward mastery confirmation.")
    
    return df

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