""" Micro-intervention templates for MindSphere Coach. Each intervention is a small, actionable step designed to be low-friction. Interventions are tagged with properties used by the empathy planner to predict user response. """ from __future__ import annotations from dataclasses import dataclass, field from typing import Dict, List, Optional import numpy as np @dataclass class Intervention: """A coaching micro-intervention.""" id: str target_skill: str description: str difficulty: float # 0-1 (0 = trivial, 1 = very hard) duration_minutes: float # Expected time to complete evaluative: float # 0-1 (how much it feels like being tested) structured: float # 0-1 (how structured/prescriptive) playful: float # 0-1 (fun/game-like quality) tags: List[str] = field(default_factory=list) def to_dict(self) -> Dict: return { "id": self.id, "target_skill": self.target_skill, "description": self.description, "difficulty": self.difficulty, "duration_minutes": self.duration_minutes, "evaluative": self.evaluative, "structured": self.structured, "playful": self.playful, } # Organized by target skill, with gentle/push pairs INTERVENTION_BANK: Dict[str, List[Intervention]] = { "focus": [ Intervention( id="focus_gentle_1", target_skill="focus", description="Set a timer for 2 minutes. Do one thing. When it rings, you're done.", difficulty=0.1, duration_minutes=2, evaluative=0.0, structured=0.8, playful=0.3, tags=["gentle", "micro"], ), Intervention( id="focus_push_1", target_skill="focus", description="Block all notifications and do a 25-minute deep work session on your most important task.", difficulty=0.6, duration_minutes=25, evaluative=0.2, structured=0.7, playful=0.1, tags=["push", "deep_work"], ), ], "follow_through": [ Intervention( id="ft_gentle_1", target_skill="follow_through", description="Pick one small thing you started this week but didn't finish. Spend 5 minutes on just that.", difficulty=0.2, duration_minutes=5, evaluative=0.1, structured=0.5, playful=0.2, tags=["gentle"], ), Intervention( id="ft_push_1", target_skill="follow_through", description="Write down the three steps to finish that project, then do the first one right now.", difficulty=0.5, duration_minutes=15, evaluative=0.3, structured=0.8, playful=0.1, tags=["push"], ), ], "social_courage": [ Intervention( id="sc_gentle_1", target_skill="social_courage", description="Think of one opinion you held back recently. Write it down — just for yourself.", difficulty=0.1, duration_minutes=2, evaluative=0.1, structured=0.3, playful=0.2, tags=["gentle", "reflective"], ), Intervention( id="sc_push_1", target_skill="social_courage", description="In your next conversation today, share one honest thought you'd normally keep to yourself.", difficulty=0.6, duration_minutes=5, evaluative=0.5, structured=0.3, playful=0.1, tags=["push", "social"], ), ], "emotional_reg": [ Intervention( id="er_gentle_1", target_skill="emotional_reg", description="Next time something annoys you, just notice the feeling and name it silently. That's it.", difficulty=0.1, duration_minutes=1, evaluative=0.0, structured=0.2, playful=0.2, tags=["gentle", "mindful"], ), Intervention( id="er_push_1", target_skill="emotional_reg", description="Keep a 'triggers log' for one day: note what triggered a strong reaction and what you did next.", difficulty=0.4, duration_minutes=10, evaluative=0.2, structured=0.7, playful=0.1, tags=["push", "tracking"], ), ], "systems_thinking": [ Intervention( id="st_gentle_1", target_skill="systems_thinking", description="Pick one recurring frustration. Ask 'why?' three times in a row. See where it leads.", difficulty=0.2, duration_minutes=3, evaluative=0.0, structured=0.4, playful=0.4, tags=["gentle", "inquiry"], ), Intervention( id="st_push_1", target_skill="systems_thinking", description="Draw a simple diagram of how your daily habits connect. Which ones cascade into others?", difficulty=0.5, duration_minutes=15, evaluative=0.2, structured=0.7, playful=0.3, tags=["push", "mapping"], ), ], "self_trust": [ Intervention( id="str_gentle_1", target_skill="self_trust", description="Think of one decision you made recently that turned out well. Acknowledge it to yourself.", difficulty=0.1, duration_minutes=1, evaluative=0.0, structured=0.2, playful=0.1, tags=["gentle", "reflective"], ), Intervention( id="str_push_1", target_skill="self_trust", description="Make one decision today without consulting anyone. Commit to it for 24 hours.", difficulty=0.5, duration_minutes=5, evaluative=0.4, structured=0.4, playful=0.1, tags=["push", "practice"], ), ], "task_clarity": [ Intervention( id="tc_gentle_1", target_skill="task_clarity", description="Pick your most important task for tomorrow. Write exactly what 'done' looks like in one sentence.", difficulty=0.2, duration_minutes=2, evaluative=0.1, structured=0.7, playful=0.1, tags=["gentle", "planning"], ), Intervention( id="tc_push_1", target_skill="task_clarity", description="For your current project, write a concrete checklist of every sub-task with clear completion criteria.", difficulty=0.5, duration_minutes=20, evaluative=0.3, structured=0.9, playful=0.0, tags=["push", "planning"], ), ], "consistency": [ Intervention( id="con_gentle_1", target_skill="consistency", description="Choose one tiny thing (30 seconds) to do every morning for the next 3 days. Just 3 days.", difficulty=0.1, duration_minutes=0.5, evaluative=0.0, structured=0.6, playful=0.3, tags=["gentle", "habit"], ), Intervention( id="con_push_1", target_skill="consistency", description="Commit to a 15-minute daily practice for one week. Track it with a visible streak counter.", difficulty=0.5, duration_minutes=15, evaluative=0.3, structured=0.8, playful=0.2, tags=["push", "habit"], ), ], } def get_interventions_for_skill( skill: str, variant: str = "gentle" ) -> List[Intervention]: """Get interventions for a skill, filtered by variant tag.""" interventions = INTERVENTION_BANK.get(skill, []) return [i for i in interventions if variant in i.tags] def get_gentle_push_pair(skill: str) -> tuple[Intervention, Intervention]: """Get a (gentle, push) pair for counterfactual display.""" gentle = get_interventions_for_skill(skill, "gentle") push = get_interventions_for_skill(skill, "push") return ( gentle[0] if gentle else INTERVENTION_BANK[skill][0], push[0] if push else INTERVENTION_BANK[skill][-1], )