{
    "comment": "Sandman v5. Attention deficit model \u2014 cognitive harm accumulates, recovers slowly.",
    "attention_model": {
        "base_impact_rate": 0.003,
        "recovery_rate": 0.0005,
        "sleep_recovery_multiplier": 2.0,
        "sleep_hours": [
            0,
            7
        ],
        "time_multipliers": [
            {
                "start": "06:00",
                "end": "18:00",
                "rate": 1.0
            },
            {
                "start": "18:00",
                "end": "22:00",
                "rate": 1.2
            },
            {
                "start": "22:00",
                "end": "22:30",
                "rate": 0.3,
                "no_actions": true,
                "comment": "Golden period \u2014 mom's news"
            },
            {
                "start": "22:30",
                "end": "00:00",
                "rate": 1.8
            },
            {
                "start": "00:00",
                "end": "02:00",
                "rate": 2.5
            },
            {
                "start": "02:00",
                "end": "06:00",
                "rate": 3.0
            }
        ],
        "action_threshold": 0.15
    },
    "interval": {
        "min_seconds": 20,
        "max_seconds": 480
    },
    "opsec": {
        "skip_probability": 0.2,
        "daily_personality": true,
        "max_actions_per_session": 0,
        "comment": "0 = unlimited"
    },
    "actions": {
        "volume_drop_big": {
            "description": "Drop volume by 5-15.",
            "weight": 20,
            "min_deficit": 0.15,
            "params": {
                "drop_min": 5,
                "drop_max": 15
            }
        },
        "volume_cap": {
            "description": "Cap volume below current for 5-15 minutes; subtly drifts it back down each time dad turns it up. Every fight-back extends the cap window by 90-180s, capped at 30 min total.",
            "weight": 18,
            "min_deficit": 0.3,
            "params": {
                "cap_drop_min": 5,
                "cap_drop_max": 12,
                "duration_min_s": 300,
                "duration_max_s": 900,
                "extend_per_fightback_min_s": 90,
                "extend_per_fightback_max_s": 180,
                "max_total_s": 1800
            }
        },
        "audio_stutter": {
            "description": "Rapid mute/unmute. Duration scales with deficit (10-60s).",
            "weight": 10,
            "min_deficit": 0.15,
            "params": {
                "duration_min_s": 10,
                "duration_max_s": 60
            }
        },
        "full_mute": {
            "description": "Mute the TV completely.",
            "weight": 25,
            "min_deficit": 0.3,
            "params": {}
        },
        "overlay_controls": {
            "description": "Bring up video player controls overlay.",
            "weight": 20,
            "min_deficit": 0.25,
            "params": {}
        },
        "pause_long": {
            "description": "Pause for 10-30 seconds.",
            "weight": 15,
            "min_deficit": 0.3,
            "params": {
                "pause_min_s": 10,
                "pause_max_s": 30
            }
        },
        "home": {
            "description": "Press Home. Kicks out of app.",
            "weight": 15,
            "min_deficit": 0.5,
            "params": {}
        },
        "back_spam": {
            "description": "Press Back 3-5 times rapidly.",
            "weight": 10,
            "min_deficit": 0.5,
            "params": {
                "presses_min": 3,
                "presses_max": 5
            }
        },
        "audio_blip": {
            "description": "Single short audio dropout (200-500ms).",
            "weight": 12,
            "min_deficit": 0.15,
            "params": {
                "duration_min_ms": 200,
                "duration_max_ms": 500
            }
        },
        "audio_fade": {
            "description": "Drop volume to near-silent briefly, then restore.",
            "weight": 8,
            "min_deficit": 0.25,
            "params": {
                "duration_min_ms": 800,
                "duration_max_ms": 2000
            }
        },
        "pause_play": {
            "description": "Brief pause (2-7s), then auto-resume.",
            "weight": 15,
            "min_deficit": 0.15,
            "params": {
                "pause_min_s": 2,
                "pause_max_s": 7
            }
        },
        "throttle": {
            "description": "Throttle TV bandwidth. Scales with deficit.",
            "weight": 8,
            "min_deficit": 0.5,
            "params": {
                "bandwidth_min_kbps": 200,
                "bandwidth_max_kbps": 800,
                "duration_s_min": 1800,
                "duration_s_max": 3600
            }
        },
        "screensaver": {
            "description": "Home+Back triggers screensaver. Looks natural, dad must press button to resume.",
            "weight": 12,
            "min_deficit": 0.4,
            "params": {}
        },
        "app_switch": {
            "description": "Switch to a random different app. Netflix\u2192YouTube, YouTube\u2192Netflix, etc.",
            "weight": 10,
            "min_deficit": 0.55,
            "params": {}
        },
        "navigate_random": {
            "description": "Random chaotic button presses.",
            "weight": 8,
            "min_deficit": 0.7,
            "params": {}
        },
        "rewind": {
            "description": "Press Rewind 3 times.",
            "weight": 10,
            "min_deficit": 0.3,
            "params": {}
        },
        "fast_forward": {
            "description": "Press FastForward 3 times.",
            "weight": 10,
            "min_deficit": 0.3,
            "params": {}
        },
        "sound_knock": {
            "description": "Play 2 knocks on speaker.",
            "weight": 4,
            "min_deficit": 0.5,
            "params": {
                "file": "knock_2.mp3"
            },
            "permissible_hours": {
                "enabled": true,
                "start": "22:30",
                "end": "08:00"
            }
        },
        "sound_cough": {
            "description": "Play a single cough on speaker.",
            "weight": 3,
            "min_deficit": 0.5,
            "params": {
                "file": "cough_single.mp3"
            },
            "permissible_hours": {
                "enabled": true,
                "start": "22:30",
                "end": "08:00"
            }
        },
        "sound_tongue": {
            "description": "Play tongue click on speaker.",
            "weight": 3,
            "min_deficit": 0.5,
            "params": {
                "file": "tongue_click.mp3"
            },
            "permissible_hours": {
                "enabled": true,
                "start": "22:30",
                "end": "08:00"
            }
        },
        "sound_exhale_loud": {
            "description": "Play loud exhale on speaker.",
            "weight": 2,
            "min_deficit": 0.6,
            "params": {
                "file": "exhale_loud.mp3",
                "volume": 0.85
            },
            "permissible_hours": {
                "enabled": true,
                "start": "22:30",
                "end": "08:00"
            }
        },
        "sound_exhale_soft": {
            "description": "Play soft exhale on speaker.",
            "weight": 2,
            "min_deficit": 0.55,
            "params": {
                "file": "exhale_soft.mp3",
                "volume": 0.5
            },
            "permissible_hours": {
                "enabled": true,
                "start": "22:30",
                "end": "08:00"
            }
        },
        "sound_deep_throat": {
            "description": "Play deep throat clear on speaker.",
            "weight": 3,
            "min_deficit": 0.55,
            "params": {
                "file": "custom_20to22.mp3"
            },
            "permissible_hours": {
                "enabled": true,
                "start": "22:30",
                "end": "08:00"
            }
        },
        "flicker_toilet_light": {
            "description": "Flash kitchen toilet light. Duration scales with deficit.",
            "weight": 4,
            "min_deficit": 0.7,
            "params": {},
            "permissible_hours": {
                "enabled": true,
                "start": "22:30",
                "end": "08:00"
            }
        },
        "flicker_tv_light": {
            "description": "Flash TV track light. Duration scales with deficit.",
            "weight": 2,
            "min_deficit": 0.85,
            "params": {},
            "permissible_hours": {
                "enabled": true,
                "start": "22:30",
                "end": "08:00"
            }
        },
        "flicker_laundry_light": {
            "description": "Flash laundry area light. Duration scales with deficit.",
            "weight": 3,
            "min_deficit": 0.7,
            "params": {},
            "permissible_hours": {
                "enabled": true,
                "start": "22:30",
                "end": "08:00"
            }
        },
        "flicker_kitchen_light": {
            "description": "Flash kitchen cove LED. Duration scales with deficit.",
            "weight": 3,
            "min_deficit": 0.7,
            "params": {},
            "permissible_hours": {
                "enabled": true,
                "start": "22:30",
                "end": "08:00"
            }
        },
        "power_off": {
            "description": "Turn off the TV.",
            "weight": 8,
            "min_deficit": 0.9,
            "params": {}
        },
        "youtube_ad_break": {
            "description": "Ongoing fake-ad-break campaign via YouTube Lounge. Once started, keeps inserting one boring SG ad every N seconds; interval shrinks as deficit rises (5min @ 0.25 \u2192 10s @ 1.0). Stops when deficit drops, TV exits YouTube, or max duration hit.",
            "weight": 25,
            "min_deficit": 0.25,
            "params": {
                "force_n_ads": 0,
                "interval_min_s": 10,
                "interval_max_s": 300,
                "max_campaign_duration_s": 1800,
                "min_deficit_continue": 0.2,
                "max_retry_per_ad": 4,
                "ad_length_floor_s": 6,
                "ad_length_ceil_s": 90,
                "buffering_pulse_kbps": 100,
                "buffering_pulse_s": 4
            }
        }
    },
    "volume": {
        "min_volume": 0
    },
    "fight_back": {
        "cooldown_seconds": 600,
        "max_before_cooldown": 5
    },
    "watchdog": {
        "poll_interval_min_s": 3,
        "poll_interval_max_s": 6,
        "correction_delay_min_s": 8,
        "correction_delay_max_s": 20
    }
}