{
  "constraints_id": "evv_aa_position_constraints_v1",
  "applies_to_pack_ids": [
    "evv_aa_strength_offseason_v1",
    "evv_aa_strength_inseason_a_v1",
    "evv_aa_strength_inseason_b_v1"
  ],
  "positions": [
    "pitcher",
    "catcher",
    "position_player"
  ],
  "rules": [
    {
      "id": "pitcher_reduce_overhead_pressing",
      "applies_to": {
        "position": "pitcher",
        "throwing_load": [
          "high",
          "unknown"
        ]
      },
      "action": {
        "type": "swap_or_reduce",
        "targets": [
          {
            "match_name_contains": [
              "OH Press",
              "Overhead"
            ],
            "category": "strength"
          }
        ],
        "replacement_suggestions": [
          "Landmine Press",
          "Incline DB Bench (Neutral)",
          "Push-Up Variations"
        ],
        "volume_adjustment": {
          "reduce_sets_by": 1
        }
      },
      "notes": "Keep shoulders fresh when pitching volume is high."
    },
    {
      "id": "pitcher_limit_high_intent_sprints_post_outing",
      "applies_to": {
        "position": "pitcher",
        "days_since_pitching": {
          "max": 1
        }
      },
      "action": {
        "type": "modify_session",
        "targets": [
          {
            "category": "sprint"
          }
        ],
        "modification": {
          "reduce_sets_by": 2,
          "convert_to": "tempo_mechanics_drills"
        },
        "suggestions": [
          "A-March",
          "A-Skip (short)",
          "Wall drills"
        ]
      },
      "notes": "Prioritize recovery + mechanics the day after an outing."
    },
    {
      "id": "catcher_knee_volume_management",
      "applies_to": {
        "position": "catcher",
        "knee_soreness": true
      },
      "action": {
        "type": "swap_or_reduce",
        "targets": [
          {
            "match_name_contains": [
              "Lunge",
              "Squat"
            ],
            "category": [
              "strength",
              "lunge"
            ]
          }
        ],
        "replacement_suggestions": [
          "Trap Bar Deadlift (lighter)",
          "Hip Hinge Variations",
          "Split Squat ISO"
        ],
        "volume_adjustment": {
          "reduce_sets_by": 1
        }
      },
      "notes": "Catchers accumulate knee volume; manage when sore."
    }
  ],
  "notes_incomplete": "Needs your final app-side detection signals (position selection, throwing load, days since pitching)."
}