{
 "schema": 1,
 "team": {
  "number": 3200,
  "name": "Raptacon"
 },
 "season": "2026-27",
 "commit": "8f377b38c95001c490ec6305addb57bf34188fc8",
 "generated_at": "2026-11-02T23:26:16+00:00",
 "trees": [
  {
   "id": "baseline",
   "name": "Baseline",
   "kind": "baseline",
   "badge": {
    "name": "Raptor",
    "description": "Tools, git, the team and every subteam - you're ready for a subteam tree."
   }
  },
  {
   "id": "commitment",
   "name": "Commitment",
   "kind": "commitment"
  },
  {
   "id": "core-knowledge",
   "name": "Core Knowledge",
   "kind": "core-knowledge",
   "requires": [
    "base-choose-track"
   ],
   "badge": {
    "name": "Core",
    "description": "You've learned what every subteam actually does - now specialize."
   }
  },
  {
   "id": "design",
   "name": "CAD/Design",
   "kind": "subteam",
   "requires": [
    "base-choose-track"
   ]
  },
  {
   "id": "electronics",
   "name": "Electronics",
   "kind": "subteam",
   "requires": [
    "base-choose-track"
   ]
  },
  {
   "id": "kanban",
   "name": "Kanban",
   "kind": "core"
  },
  {
   "id": "leds",
   "name": "LEDs & the Raptacon Arcade",
   "kind": "specialization",
   "parent_trees": [
    "electronics",
    "programming"
   ],
   "requires": [
    "elec-rsl-status-lights",
    "prog-state-machines"
   ],
   "badge": {
    "name": "Arcade Master",
    "description": "From one LED strip to a game you can challenge another team at."
   }
  },
  {
   "id": "manufacturing",
   "name": "Fabrication/Manufacturing",
   "kind": "subteam",
   "requires": [
    "base-choose-track"
   ]
  },
  {
   "id": "marketing",
   "name": "Marketing & Media",
   "kind": "subteam",
   "requires": [
    "base-choose-track"
   ]
  },
  {
   "id": "networking",
   "name": "Networking",
   "kind": "specialization",
   "parent_trees": [
    "electronics",
    "programming"
   ],
   "requires": [
    "elec-robot-tour",
    "prog-libraries-docs"
   ],
   "badge": {
    "name": "Network Wrangler",
    "description": "You can get any robot talking to any driver station - and keep it that way at an event."
   }
  },
  {
   "id": "onboarding",
   "name": "Onboarding",
   "kind": "onboarding",
   "badge": {
    "name": "Rookie",
    "description": "Signed up, paid, handbook signed, safety done - you're on the team."
   }
  },
  {
   "id": "outreach",
   "name": "Outreach",
   "kind": "subteam",
   "requires": [
    "base-choose-track"
   ]
  },
  {
   "id": "programming",
   "name": "Programming",
   "kind": "subteam",
   "requires": [
    "base-choose-track"
   ]
  },
  {
   "id": "strategy",
   "name": "Strategy/Scouting/Drive",
   "kind": "subteam",
   "requires": [
    "base-choose-track"
   ]
  },
  {
   "id": "tools",
   "name": "Tool Certifications",
   "kind": "certification",
   "parent_trees": [
    "manufacturing"
   ]
  }
 ],
 "tiers": [
  {
   "id": 0,
   "name": "Baseline",
   "verification": "mentor_signoff",
   "min_hours_default": 10
  },
  {
   "id": 1,
   "name": "Novice",
   "verification": "mentor_signoff",
   "supervision": "direct",
   "min_hours_default": 25
  },
  {
   "id": 2,
   "name": "Journeyman",
   "requires": [
    {
     "tree": "core-knowledge"
    }
   ],
   "verification": "practical_test",
   "supervision": "direct",
   "min_hours_default": 60
  },
  {
   "id": 3,
   "name": "Expert",
   "verification": "portfolio_review",
   "requires_taught_tier": 1,
   "min_hours_default": 150
  },
  {
   "id": 4,
   "name": "Master",
   "verification": "portfolio_review",
   "requires_taught_tier": 2,
   "min_hours_default": 300
  }
 ],
 "items": {
  "base-first-aid": {
   "name": "First aid basics",
   "description": "Know what to do when someone gets hurt in the shop: where the first aid kit, eyewash station, AED and fire extinguisher are; how to handle a minor cut and a burn (soldering irons, hot glue, hot motors); when to get an adult or call 911 and what address to give; and that every injury gets reported to a mentor, even small ones.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "safety-captain"
      },
      {
       "role": "safety-officer"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "onb-shop-orientation"
   ],
   "renews": "season",
   "visibility": "team",
   "section": "shop",
   "home_tree": "baseline",
   "trees": [
    "baseline"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "base-git": {
   "name": "Git basics",
   "description": "Clone a repo, make a branch, commit, push, open a pull request and respond to a review. Every subteam uses git - code, CAD exports, the website, and these skill trees.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "onb-github"
   ],
   "renews": "permanent",
   "visibility": "public",
   "section": "collaborate",
   "home_tree": "baseline",
   "trees": [
    "baseline"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "base-culture": {
   "name": "How Raptacon works",
   "description": "Gracious Professionalism and the Golden Rule; no bullying or harassment; phones only for team work during meetings; ask for something to do if you run out (or work on your skill tree); tell a mentor or lead before you leave; return tools to their places; Clean 15 at the end of every meeting; no knives or multitools. Talk it through with a mentor.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "role": "mentor"
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "section": "team",
   "home_tree": "baseline",
   "trees": [
    "baseline"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "base-robot-game": {
   "name": "The robot and the game",
   "description": "Walk through a Raptacon robot with a captain or mentor - drivetrain, the mechanisms, electronics, the code that drives it - and learn this season's game: how a match works, how points are scored, and the big rules.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "captain"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "season",
   "visibility": "public",
   "section": "team",
   "home_tree": "baseline",
   "trees": [
    "baseline"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "base-shadow-subteams": {
   "name": "Shadow every subteam",
   "description": "Spend a meeting with each of the six subteams and do real work with them. That subteam's lead or mentor marks you off.",
   "kind": "check",
   "verify": {
    "method": "signoff"
   },
   "parts": [
    {
     "id": "strategy",
     "name": "Strategy/Scouting/Drive",
     "by": {
      "any_of": [
       {
        "role": "subteam-lead",
        "tree": "strategy"
       },
       {
        "role": "subteam-mentor",
        "tree": "strategy"
       },
       {
        "role": "lead-mentor"
       }
      ]
     }
    },
    {
     "id": "design",
     "name": "CAD/Design",
     "by": {
      "any_of": [
       {
        "role": "subteam-lead",
        "tree": "design"
       },
       {
        "role": "subteam-mentor",
        "tree": "design"
       },
       {
        "role": "lead-mentor"
       }
      ]
     }
    },
    {
     "id": "manufacturing",
     "name": "Fabrication/Manufacturing",
     "by": {
      "any_of": [
       {
        "role": "subteam-lead",
        "tree": "manufacturing"
       },
       {
        "role": "subteam-mentor",
        "tree": "manufacturing"
       },
       {
        "role": "lead-mentor"
       }
      ]
     }
    },
    {
     "id": "electronics",
     "name": "Electronics",
     "by": {
      "any_of": [
       {
        "role": "subteam-lead",
        "tree": "electronics"
       },
       {
        "role": "subteam-mentor",
        "tree": "electronics"
       },
       {
        "role": "lead-mentor"
       }
      ]
     }
    },
    {
     "id": "programming",
     "name": "Programming",
     "by": {
      "any_of": [
       {
        "role": "subteam-lead",
        "tree": "programming"
       },
       {
        "role": "subteam-mentor",
        "tree": "programming"
       },
       {
        "role": "lead-mentor"
       }
      ]
     }
    },
    {
     "id": "marketing",
     "name": "Marketing",
     "by": {
      "any_of": [
       {
        "role": "subteam-lead",
        "tree": "marketing"
       },
       {
        "role": "subteam-mentor",
        "tree": "marketing"
       },
       {
        "role": "lead-mentor"
       }
      ]
     }
    }
   ],
   "renews": "season",
   "visibility": "public",
   "section": "track",
   "home_tree": "baseline",
   "trees": [
    "baseline"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "base-choose-track": {
   "name": "Choose your track",
   "description": "Pick a primary subteam and meet its lead - that's where your skill tree goes next. Not permanent: you can switch, or add a second subteam later.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "base-shadow-subteams"
   ],
   "renews": "season",
   "visibility": "public",
   "section": "track",
   "home_tree": "baseline",
   "trees": [
    "baseline"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "base-rickrolled": {
   "name": "Rickrolled",
   "description": "Found the easter egg hidden in the skill-tree repo.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "status": "hidden",
   "section": "collaborate",
   "home_tree": "baseline",
   "trees": [
    "baseline"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "hours-25": {
   "name": "25 hours",
   "kind": "hours",
   "target": 25,
   "verify": {
    "method": "auto",
    "source": {
     "tab": "CheckIns",
     "sum": "Duration (min)",
     "scope": "all-seasons"
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "section": "hours",
   "home_tree": "commitment",
   "trees": [
    "commitment"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "parent"
    },
    {
     "role": "mentor"
    },
    {
     "role": "volunteer"
    },
    {
     "role": "board"
    }
   ]
  },
  "hours-50": {
   "name": "50 hours",
   "kind": "hours",
   "target": 50,
   "verify": {
    "method": "auto",
    "source": {
     "tab": "CheckIns",
     "sum": "Duration (min)",
     "scope": "all-seasons"
    }
   },
   "requires": [
    "hours-25"
   ],
   "renews": "permanent",
   "visibility": "public",
   "section": "hours",
   "home_tree": "commitment",
   "trees": [
    "commitment"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "parent"
    },
    {
     "role": "mentor"
    },
    {
     "role": "volunteer"
    },
    {
     "role": "board"
    }
   ]
  },
  "hours-100": {
   "name": "100 hours",
   "kind": "hours",
   "target": 100,
   "verify": {
    "method": "auto",
    "source": {
     "tab": "CheckIns",
     "sum": "Duration (min)",
     "scope": "all-seasons"
    }
   },
   "requires": [
    "hours-50"
   ],
   "renews": "permanent",
   "visibility": "public",
   "section": "hours",
   "home_tree": "commitment",
   "trees": [
    "commitment"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "parent"
    },
    {
     "role": "mentor"
    },
    {
     "role": "volunteer"
    },
    {
     "role": "board"
    }
   ]
  },
  "hours-250": {
   "name": "250 hours",
   "kind": "hours",
   "target": 250,
   "verify": {
    "method": "auto",
    "source": {
     "tab": "CheckIns",
     "sum": "Duration (min)",
     "scope": "all-seasons"
    }
   },
   "requires": [
    "hours-100"
   ],
   "renews": "permanent",
   "visibility": "public",
   "section": "hours",
   "home_tree": "commitment",
   "trees": [
    "commitment"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "parent"
    },
    {
     "role": "mentor"
    },
    {
     "role": "volunteer"
    },
    {
     "role": "board"
    }
   ]
  },
  "hours-500": {
   "name": "500 hours",
   "kind": "hours",
   "target": 500,
   "verify": {
    "method": "auto",
    "source": {
     "tab": "CheckIns",
     "sum": "Duration (min)",
     "scope": "all-seasons"
    }
   },
   "requires": [
    "hours-250"
   ],
   "renews": "permanent",
   "visibility": "public",
   "section": "hours",
   "home_tree": "commitment",
   "trees": [
    "commitment"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "parent"
    },
    {
     "role": "mentor"
    },
    {
     "role": "volunteer"
    },
    {
     "role": "board"
    }
   ]
  },
  "des-cad-intro": {
   "name": "Intro to CAD",
   "description": "Onshape navigation and controls, planes, units and measurements, and the core definitions (sketch, part, feature, assembly).",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "design"
      },
      {
       "role": "subteam-mentor",
       "tree": "design"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "design",
   "trees": [
    "core-knowledge",
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-sketching": {
   "name": "Sketching",
   "description": "Make shapes several different ways, use relationships (constraints) and dimensions to fully define a sketch, use the sketch tools, and build clean profiles for features.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "design"
      },
      {
       "role": "subteam-mentor",
       "tree": "design"
      }
     ]
    }
   },
   "requires": [
    "des-cad-intro"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "design",
   "trees": [
    "core-knowledge",
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-basic-body-tools": {
   "name": "Basic body tools",
   "description": "Extrude (and its different types), cut, revolve, linear and circular patterns, offset, fillet and chamfer, and mirror.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "design"
      },
      {
       "role": "subteam-mentor",
       "tree": "design"
      }
     ]
    }
   },
   "requires": [
    "des-sketching"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-basic-assembly": {
   "name": "Basic assembly",
   "description": "Put parts together with simple mates. Practice by assembling a Lego model, then build with FRC parts: pull standard parts from MKCad and make FRC tubing with Julia's FeatureScripts (Tube Converter).",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "design"
      },
      {
       "role": "subteam-mentor",
       "tree": "design"
      }
     ]
    }
   },
   "requires": [
    "des-basic-body-tools"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-measure-real-part": {
   "name": "Measuring a real part",
   "description": "Measure an existing part with calipers and reproduce it accurately in CAD.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "design"
      },
      {
       "role": "subteam-mentor",
       "tree": "design"
      }
     ]
    }
   },
   "requires": [
    "des-basic-body-tools",
    "tool-hand-tools"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-model-from-drawing": {
   "name": "Drawing interpretation",
   "description": "Read a 2D drawing and model the part from it: different views, depth lines, positioning features, fillets and chamfers - and problem-solving when the drawing doesn't tell you everything.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "design"
      },
      {
       "role": "subteam-mentor",
       "tree": "design"
      }
     ]
    }
   },
   "requires": [
    "des-basic-body-tools"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-gusset-assessment": {
   "name": "Gusset assessment",
   "description": "The Novice gate: design a gusset to spec on your own - sketching, body tools and an assembly that uses it.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "design"
      },
      {
       "role": "subteam-mentor",
       "tree": "design"
      }
     ]
    }
   },
   "requires": [
    "des-sketching",
    "des-basic-body-tools",
    "des-basic-assembly"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-adv-sketch-tools": {
   "name": "Advanced sketch tools",
   "description": "Variables, convert (use) existing geometry, offset, and fix.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "design"
      },
      {
       "role": "subteam-mentor",
       "tree": "design"
      }
     ]
    }
   },
   "requires": [
    "des-gusset-assessment"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-adv-body-tools": {
   "name": "Advanced body tools",
   "description": "Sweeps, drafts, Booleans and ribs.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "design"
      },
      {
       "role": "subteam-mentor",
       "tree": "design"
      }
     ]
    }
   },
   "requires": [
    "des-gusset-assessment"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-adv-assemblies": {
   "name": "Advanced assemblies",
   "description": "Advanced and moving mates, larger MKCad assemblies, and tolerances - clearance vs. press fits and stack-up basics.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "design"
      },
      {
       "role": "subteam-mentor",
       "tree": "design"
      }
     ]
    }
   },
   "requires": [
    "des-gusset-assessment"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-master-sketch": {
   "name": "Master sketch (top-down) design",
   "description": "Put every important dimension - motor positions, roller locations, belt lengths, plate thicknesses, electronics placement - in one master sketch document, and derive it into each subsystem's document. A change in the master sketch flows to every subsystem, so parts from different subsystems still line up, and packaging problems show up in the sketch phase instead of after the CAD is built.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "design"
      },
      {
       "role": "subteam-mentor",
       "tree": "design"
      }
     ]
    }
   },
   "requires": [
    "des-adv-sketch-tools",
    "des-adv-assemblies"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-drawings-bom": {
   "name": "Drawings and BOM",
   "description": "Fab-ready drawings Manufacturing can build from - views, dimensions, a title block - and a bill of materials generated from the model.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "design"
      },
      {
       "role": "subteam-mentor",
       "tree": "design"
      }
     ]
    }
   },
   "requires": [
    "des-gusset-assessment"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-complex-parts": {
   "name": "Complex parts assessment",
   "description": "CSWA-style part challenges, done in Onshape: model the part, change the given dimensions, and report the mass - the mass proves the model is right.",
   "kind": "check",
   "verify": {
    "method": "signoff"
   },
   "parts": [
    {
     "id": "basic",
     "name": "Basic part: sketch, extrude, cut, modify key dimensions",
     "by": {
      "any_of": [
       {
        "role": "subteam-lead",
        "tree": "design"
       },
       {
        "role": "subteam-mentor",
        "tree": "design"
       }
      ]
     }
    },
    {
     "id": "intermediate",
     "name": "Intermediate part: revolve, cut, circular pattern, holes, fillets",
     "by": {
      "any_of": [
       {
        "role": "subteam-lead",
        "tree": "design"
       },
       {
        "role": "subteam-mentor",
        "tree": "design"
       }
      ]
     }
    },
    {
     "id": "advanced",
     "name": "Advanced part: offsets, harder geometry, mass after changes",
     "by": {
      "any_of": [
       {
        "role": "subteam-lead",
        "tree": "design"
       },
       {
        "role": "subteam-mentor",
        "tree": "design"
       }
      ]
     }
    }
   ],
   "requires": [
    "des-adv-sketch-tools",
    "des-adv-body-tools"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-complex-assembly": {
   "name": "Complex assembly assessment - full robot",
   "description": "Assemble a full robot (or a full past robot) with correct mates and motion, organized so others can work in it.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "design"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "des-master-sketch",
    "des-complex-parts"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-frc-design": {
   "name": "FRC mechanism design",
   "description": "Design real FRC mechanisms: motors and gearing, axles and bearings, and tube structure with Julia's FeatureScripts (Tube Converter).",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "design"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "des-adv-assemblies"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-gdt-dfm": {
   "name": "GD&T and DFM basics",
   "description": "Geometric dimensioning and tolerancing basics, and designing parts that are easy for our shop to make.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "design"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "des-drawings-bom"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-game-rules": {
   "name": "Designing to the game rules",
   "description": "Build this season's game rules into the models and drawings - robot size, weight and extension limits, game piece and field geometry - and check the model against them before release.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "design"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "strat-game-rules-test"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 3,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-design-review": {
   "name": "Running a design review",
   "description": "Present a design for review, take the feedback, and follow up on every item.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "design"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-teach": {
   "name": "Teach",
   "description": "Take a Novice from Intro to CAD through the Gusset assessment.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "design"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 4,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-lead-design-reviews": {
   "name": "Leads design reviews",
   "description": "Run the team's design reviews across subsystems.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "design"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "des-design-review"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 4,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "des-owns-cad-standards": {
   "name": "Owns CAD standards",
   "description": "Own the team's CAD and drawing conventions, and train others in them.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "design"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 4,
   "home_tree": "design",
   "trees": [
    "design"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-safe-wiring": {
   "name": "Safe wiring basics",
   "description": "Wire gauge and color, stripping, and basic electrical safety around the robot and its battery.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "electronics",
   "trees": [
    "core-knowledge",
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-battery-safety": {
   "name": "Battery handling and charging",
   "description": "Carry, connect, charge and store robot batteries safely; spot a damaged battery; and track charge so the robot never runs on a weak one.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "renews": "season",
   "visibility": "public",
   "tier": 1,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-esd-bench": {
   "name": "ESD and bench safety",
   "description": "Ground yourself before touching boards (strap or mat), use a bench power supply safely, and never plug or unplug things on a powered robot.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-crimping": {
   "name": "Crimping and terminating",
   "description": "The terminations on our robot - Anderson Powerpole, ferrules for the power hub, JST and Dupont connectors, ring terminals - and heat shrink.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "requires": [
    "elec-safe-wiring"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-multimeter": {
   "name": "Using a multimeter",
   "description": "Measure voltage (battery and rails), continuity to find a broken wire, resistance, diode test - and current only with the right jack and range.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "requires": [
    "elec-esd-bench"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-soldering": {
   "name": "Soldering",
   "description": "Tin wires, splice wires with heat shrink, and solder through-hole joints - with iron and fume safety.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "requires": [
    "elec-esd-bench"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-wiring-diagrams": {
   "name": "Reading a wiring diagram",
   "description": "Read the robot's wiring diagram and trace a circuit from the battery to a motor or sensor.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-robot-tour": {
   "name": "Robot electrical tour",
   "description": "Name and explain the main parts - battery, main breaker, power distribution hub, roboRIO, radio, motor controllers - and where power and CAN run between them.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "renews": "season",
   "visibility": "public",
   "tier": 1,
   "home_tree": "electronics",
   "trees": [
    "core-knowledge",
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-desoldering": {
   "name": "Desoldering",
   "description": "Remove parts and fix bad joints with solder wick and a solder sucker without lifting pads.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "requires": [
    "elec-soldering"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-build-kit": {
   "name": "Building a kit",
   "description": "Build an electronics kit from its instructions - parts identification, orientation, soldering - and get it working.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "requires": [
    "elec-soldering",
    "elec-multimeter"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-oscilloscope": {
   "name": "Using an oscilloscope",
   "description": "Set up probes and the ground clip, timebase and trigger, and look at real signals - PWM, CAN and power noise.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "requires": [
    "elec-multimeter"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-firmware-config": {
   "name": "Device firmware and configuration",
   "description": "Image the roboRIO, configure the radio, and update and configure motor controllers (REV Hardware Client, Phoenix Tuner).",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "requires": [
    "elec-can-bus"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 2,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-rsl-status-lights": {
   "name": "Robot signal light and status lights",
   "description": "Wire and mount the robot signal light (required by FRC) and any status LEDs so the drive team and field staff can read the robot's state. Leads into the LEDs specialization.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "requires": [
    "elec-crimping",
    "elec-robot-tour"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-battery-testing": {
   "name": "Battery testing and logging",
   "description": "Number and label every battery, test capacity and internal resistance with the battery analyzer, log each battery's results and age, and retire weak ones before they cost a match.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "requires": [
    "elec-battery-safety",
    "elec-multimeter"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 2,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-wiring-harness": {
   "name": "Building a wiring harness",
   "description": "Build a neat, labeled, strain-relieved harness that survives a match and is easy to fix.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "requires": [
    "elec-crimping",
    "elec-wiring-diagrams"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-power-distribution": {
   "name": "Power distribution",
   "description": "The power distribution hub, breakers and fuses, and sizing wire for the expected current draw.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "requires": [
    "elec-robot-tour"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-can-bus": {
   "name": "CAN bus",
   "description": "Wire the CAN chain, terminate it, set device IDs, and find a broken link.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "requires": [
    "elec-robot-tour"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-sensor-wiring": {
   "name": "Sensor wiring",
   "description": "Wire sensors (limit switches, encoders, breakbeams) to the roboRIO and check they read correctly.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "requires": [
    "elec-safe-wiring"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-pneumatics-control": {
   "name": "Pneumatics control",
   "description": "Wire the compressor, Pneumatic Hub, solenoid valves and pressure switch/sensor. Pairs with Manufacturing's \"Pneumatics plumbing and mounting\" (cylinders, tubing, fittings).",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "requires": [
    "elec-can-bus"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-pcb-design-debug": {
   "name": "PCB design and debug",
   "description": "Design a small custom circuit board and debug one that isn't working.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-health-monitoring": {
   "name": "Power and battery health monitoring",
   "description": "Publish and read power hub and roboRIO voltage, current and brownout data.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "elec-power-distribution"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-brownouts": {
   "name": "Brownout diagnosis and prevention",
   "description": "Trace current-draw and voltage-sag symptoms back to a wiring, breaker or battery cause, and fix it.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "elec-health-monitoring"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-pit-troubleshooting": {
   "name": "Pit electrical troubleshooting",
   "description": "At competition, find and fix electrical problems between matches - loose connectors, CAN faults, a dead radio, a bad battery - fast and safely.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "elec-wiring-harness",
    "elec-can-bus"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 3,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-repair-electronics": {
   "name": "Repairing electronics",
   "description": "Diagnose a broken device, cable or board and repair it - find the fault with a multimeter or scope, then fix it.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "elec-desoldering",
    "elec-oscilloscope"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-repair-computer": {
   "name": "Repairing a computer",
   "description": "Keep the driver station laptops and team PCs running - diagnose hardware, swap RAM or storage, reinstall the OS.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-inspection": {
   "name": "Electrical robot inspection",
   "description": "Get the robot through FRC inspection on the electrical rules - breakers, wire gauge and colors, an accessible main breaker, the robot signal light.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "elec-power-distribution"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 3,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-microcontrollers": {
   "name": "Microcontrollers",
   "description": "Use a microcontroller (Arduino, Raspberry Pi Pico or similar) for custom sensors or LED drivers - wiring, power, and talking to the roboRIO.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "elec-soldering",
    "elec-multimeter",
    "elec-sensor-wiring"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-reverse-engineering": {
   "name": "Reverse engineering a hardware protocol",
   "description": "Figure out how an undocumented device talks - capture its signals with a logic analyzer or scope, identify the protocol (UART, I2C, SPI, CAN or something custom), decode it, and write a working driver. Use AI tools to form and check hypotheses, but verify every claim against the captured signals. Only on hardware the team owns.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "elec-oscilloscope",
    "elec-microcontrollers"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-owns-system": {
   "name": "Owns the electrical system",
   "description": "Own the robot's electrical design and layout for the season, from first wiring plan to competition.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 4,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "elec-teach": {
   "name": "Teach",
   "description": "Train others on safe wiring - take a Novice through Safe wiring basics and the robot electrical tour.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 4,
   "home_tree": "electronics",
   "trees": [
    "electronics"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "kanban-intro": {
   "name": "Intro to kanban",
   "description": "What a kanban board is and why we use one: cards are small pieces of work, columns show where each one is (To Do -> In Progress -> Done), you pull the next card when you're free instead of waiting to be assigned, and you limit how much is in progress at once so things actually finish.",
   "kind": "check",
   "verify": {
    "method": "self"
   },
   "requires": [
    "onb-github"
   ],
   "renews": "permanent",
   "visibility": "team",
   "section": "learn",
   "home_tree": "kanban",
   "trees": [
    "kanban"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "kanban-our-board": {
   "name": "Using the Raptacon board",
   "description": "Show a lead you can work our board end to end.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "kanban-intro"
   ],
   "renews": "permanent",
   "visibility": "public",
   "section": "board",
   "home_tree": "kanban",
   "trees": [
    "baseline",
    "kanban"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "leds-circuit-basics": {
   "name": "LED circuit basics",
   "description": "Voltage, current and resistance; why a plain LED needs a current-limiting resistor; polarity; and reading an LED or strip datasheet.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "leds",
   "trees": [
    "leds"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "leds-strip-power": {
   "name": "Strip wiring and power",
   "description": "Wire an addressable strip - 5V supply, fuse, data line and ground - and work out the current budget. A full-white 16x16 matrix can draw about 15 A, so plan power injection and cap brightness. The data line goes to a roboRIO PWM port, not DIO.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "requires": [
    "leds-circuit-basics"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "leds",
   "trees": [
    "leds"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "leds-strip-control": {
   "name": "Strip control",
   "description": "Control the whole strip from robot code - on, off, any color, brightness - then single LEDs by index.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "leds-strip-power"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "leds",
   "trees": [
    "leds"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "leds-strip-effects": {
   "name": "Strip effects",
   "description": "Blink, chase, fade and rainbow effects, timed from the robot's periodic loop.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "leds-strip-control"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "leds",
   "trees": [
    "leds"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "leds-build-matrix": {
   "name": "Build the matrix",
   "description": "Tape the strip back and forth across a board so it becomes a matrix, then map (x, y) to the strip's LED number - every other row runs backwards - and skip the LEDs that loop off the board edge (Nazeer's code calls this dead space).",
   "kind": "check",
   "verify": {
    "method": "signoff"
   },
   "parts": [
    {
     "id": "square",
     "name": "A 16x16 matrix",
     "by": {
      "any_of": [
       {
        "role": "subteam-lead",
        "tree": "programming"
       },
       {
        "role": "subteam-mentor",
        "tree": "programming"
       }
      ]
     }
    },
    {
     "id": "rectangle",
     "name": "A non-square matrix (e.g. 18x10, like Nazeer's) - the math has to work for any size",
     "by": {
      "any_of": [
       {
        "role": "subteam-lead",
        "tree": "programming"
       },
       {
        "role": "subteam-mentor",
        "tree": "programming"
       }
      ]
     }
    }
   ],
   "requires": [
    "leds-strip-effects"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "leds",
   "trees": [
    "leds"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "leds-matrix-drawing": {
   "name": "Matrix drawing",
   "description": "Pixels, lines, rectangles, filled shapes and blinking on the mapped matrix.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "leds-build-matrix"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "leds",
   "trees": [
    "leds"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "leds-patterns-animation": {
   "name": "Patterns and animation",
   "description": "Animated patterns with steady frame timing, and keeping the whole matrix updating within the robot's periodic loop.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "leds-matrix-drawing"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "leds",
   "trees": [
    "leds"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "leds-text": {
   "name": "Letters and scrolling text",
   "description": "Draw letters from a small bitmap font, then scroll a message across the matrix.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "leds-matrix-drawing"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "leds",
   "trees": [
    "leds"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "leds-pictures": {
   "name": "Pictures",
   "description": "Turn an image into pixels and show it on the matrix - the raptor logo is a good first one.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "leds-matrix-drawing"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "leds",
   "trees": [
    "leds"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "leds-pong": {
   "name": "Pong",
   "description": "Pong in robot code: Xbox controllers in, the matrix as the screen, a game loop with a ball, two paddles and a score. Build it in the WPILib simulator first, then on the real matrix.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "leds-patterns-animation",
    "leds-text"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "leds",
   "trees": [
    "leds"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "leds-more-games": {
   "name": "More games",
   "description": "Build at least one more game - Snake, Breakout, Tetris or your own idea.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "leds-pong"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "leds",
   "trees": [
    "leds"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "leds-matrix-library": {
   "name": "Matrix library",
   "description": "Get the matrix mapping, drawing, text and game-loop code merged into the raptacon3200 shared library so any team can use it.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "leds-pong",
    "prog-shared-library"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "leds",
   "trees": [
    "leds"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "leds-1v1-challenge": {
   "name": "1v1 against another team",
   "description": "Challenge another team to one of our games - in the queue or at an event - and help them try building their own matrix.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "leds-more-games"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 4,
   "home_tree": "leds",
   "trees": [
    "leds"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "leds-arcade-cart": {
   "name": "The Arcade cart",
   "description": "Build a permanent matrix and controller station onto the team cart, with Design, Manufacturing and Electronics - power, mounting and a case that survives travel.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "leds-more-games"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 4,
   "home_tree": "leds",
   "trees": [
    "leds"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "leds-on-robot": {
   "name": "A matrix on the robot",
   "description": "Put a matrix on the competition robot - only within this season's game manual (robot lights must not look like field lighting or distract other teams) and only with the drive team's agreement.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "leds-patterns-animation",
    "strat-game-rules-test"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 4,
   "home_tree": "leds",
   "trees": [
    "leds"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "leds-teach": {
   "name": "Teach",
   "description": "Take a Novice from their first strip to a working matrix.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 4,
   "home_tree": "leds",
   "trees": [
    "leds"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-fasteners-rivets": {
   "name": "Fasteners and riveting",
   "description": "The fasteners on our robot - bolt sizes (#10-32, 1/4-20 and metric), nuts and nylocks, washers, and pop rivets - which to use where, and setting a rivet with the rivet tool.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "requires": [
    "tool-hand-tools"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "manufacturing",
   "trees": [
    "core-knowledge",
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-measure-layout": {
   "name": "Measuring and layout",
   "description": "Tape, rule, calipers, squares, levels and a T-square - measure accurately and lay out a part from a drawing.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "requires": [
    "tool-hand-tools"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "manufacturing",
   "trees": [
    "core-knowledge",
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-materials": {
   "name": "Materials",
   "description": "Wood, polycarbonate, acrylic and aluminum - what each is for, and how to cut, drill and finish it.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-read-drawings": {
   "name": "Reading technical drawings",
   "description": "Read Design's drawings - views, dimensions, tolerances and the title block - well enough to make the part.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-shafts-bearings": {
   "name": "Shafts, bearings and spacers",
   "description": "Hex shaft, bearings, shaft collars, spacers and retaining clips - and stacking them on a shaft in the right order so it spins freely.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-cnc-intro": {
   "name": "Intro to CNC tables",
   "description": "What the CNC router does, how a job goes from Design's model to cut parts, and the CNC safety rules.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "role": "subteam-mentor",
     "tree": "manufacturing"
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-tapping": {
   "name": "Tapping",
   "description": "Drill and tap threaded holes - the right drill size for the tap, cutting fluid, and backing out to break chips.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "requires": [
    "mfg-fasteners-rivets"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-gears-gearboxes": {
   "name": "Gears and gearboxes",
   "description": "Gear ratios, and assembling, greasing and checking a planetary gearbox (e.g. MAXPlanetary or VersaPlanetary) so it runs without binding.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "requires": [
    "mfg-shafts-bearings"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-chain-sprockets": {
   "name": "Chain and sprockets",
   "description": "Chain sizes (#25, #35), breaking chain and adding a master link, lining up sprockets, and tensioning a chain run.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "requires": [
    "mfg-shafts-bearings"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-belts-pulleys": {
   "name": "Belts and timing pulleys",
   "description": "Toothed (timing) belts and pulleys - HTD and GT2 - center-to-center distance, lining up the pulleys, and tensioning the belt.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "requires": [
    "mfg-shafts-bearings"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-pneumatics-plumbing": {
   "name": "Pneumatics plumbing and mounting",
   "description": "Mount cylinders, tanks and the regulator, run tubing with push-to-connect fittings, and leak-check the system. Pairs with Electronics' \"Pneumatics control\" (compressor, hub, solenoids).",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-3d-slicing": {
   "name": "3D printing and slicing",
   "description": "Slice a part for our 3D printers - orientation, supports, infill and material - and run the print.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-model-clearances": {
   "name": "Checking a model for clearances",
   "description": "Check Design's model for clearances and fits before parts get made.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "requires": [
    "mfg-read-drawings"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-update-measurements": {
   "name": "Feeding measurements back to Design",
   "description": "Measure the real, built part and get the differences back into Design's model.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "requires": [
    "mfg-measure-layout"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-component-mounting": {
   "name": "Mounting electronic components",
   "description": "Mount motors, the power distribution hub and other electronics securely and where Electronics can wire them.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-sensor-mounting": {
   "name": "Sensor placement and mounting",
   "description": "Place and mount sensors (encoders, limit switches, breakbeams) where they'll read reliably and survive a match.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-tool-path-cnc": {
   "name": "CNC tool paths",
   "description": "Create the tool path for a part from Design's model and run it on the CNC router.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "role": "subteam-mentor",
     "tree": "manufacturing"
    }
   },
   "requires": [
    "tool-cnc-router"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-unsupervised": {
   "name": "Working unsupervised",
   "description": "Carry out your certified skills without direct supervision (mentor-supervised machines still need a mentor present).",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "season",
   "visibility": "public",
   "tier": 3,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-report-defects": {
   "name": "Recognizing material defects",
   "description": "Spot and report defects in stock and finished parts - cracks, warping, bad cuts or holes - before they go on the robot.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-pit-repairs": {
   "name": "Pit repairs and drivetrain maintenance",
   "description": "At competition, inspect, diagnose and fix the robot between matches - including chains, belts, gearboxes and bent or broken parts - fast and safely.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "mfg-gears-gearboxes",
    "mfg-chain-sprockets",
    "mfg-belts-pulleys"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 3,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-runs-shop": {
   "name": "Runs the shop",
   "description": "Plan the build schedule, keep shop standards and safety, and keep stock and tools ready.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 4,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mfg-teach": {
   "name": "Teach",
   "description": "Take a Novice through Hand Tools and Drills & Drivers to their first machine certification.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 4,
   "home_tree": "manufacturing",
   "trees": [
    "manufacturing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mkt-social-basics": {
   "name": "Social media basics",
   "description": "Post on the team's accounts following our brand and voice guidelines - tag sponsors, credit people, and never post anyone without a media release.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "marketing"
      },
      {
       "role": "subteam-mentor",
       "tree": "marketing"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "marketing",
   "trees": [
    "core-knowledge",
    "marketing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mkt-event-photography": {
   "name": "Event photography",
   "description": "Take usable photos at meetings, events, the pit and matches with a phone or camera.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "marketing"
      },
      {
       "role": "subteam-mentor",
       "tree": "marketing"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "marketing",
   "trees": [
    "marketing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mkt-headshots": {
   "name": "Team headshots",
   "description": "Take professional-style headshots of teammates for the team roster: consistent framing and background, good light. Only photograph people whose media release is \"yes\". Name each file by the person's name - the upload tool matches names to the roster, so you never handle School IDs.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "marketing"
      },
      {
       "role": "subteam-mentor",
       "tree": "marketing"
      }
     ]
    }
   },
   "requires": [
    "mkt-event-photography"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "marketing",
   "trees": [
    "marketing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mkt-content-calendar": {
   "name": "Content calendar",
   "description": "Plan and run the social content calendar across a build season or a competition weekend.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "marketing"
      },
      {
       "role": "subteam-mentor",
       "tree": "marketing"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "marketing",
   "trees": [
    "marketing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mkt-photo-video-shoot": {
   "name": "Running a photo/video shoot",
   "description": "Plan and run a shoot at a competition or event - pit, matches, robot reveal.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "marketing"
      },
      {
       "role": "subteam-mentor",
       "tree": "marketing"
      }
     ]
    }
   },
   "requires": [
    "mkt-event-photography"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "marketing",
   "trees": [
    "marketing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mkt-pit-display": {
   "name": "Pit display",
   "description": "Design, build and maintain the competition pit display.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "marketing"
      },
      {
       "role": "subteam-mentor",
       "tree": "marketing"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "marketing",
   "trees": [
    "marketing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mkt-shirt-brand-design": {
   "name": "T-shirt and brand design",
   "description": "Design the season's T-shirt (or another team graphic) using the brand kit - logo, Raptacon Green, fonts - and get it to the printer on time: the shirt design is due two weeks before Thanksgiving.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "marketing"
      },
      {
       "role": "subteam-mentor",
       "tree": "marketing"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "marketing",
   "trees": [
    "marketing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mkt-media-analytics": {
   "name": "Media strategy and analytics",
   "description": "Set the team's social strategy and use engagement analytics to adjust it.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "marketing"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "marketing",
   "trees": [
    "marketing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "mkt-owns-brand": {
   "name": "Owns brand and media strategy",
   "description": "Own the team's brand and media strategy season to season, and train new members in it.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "marketing"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 4,
   "home_tree": "marketing",
   "trees": [
    "marketing"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "net-basics": {
   "name": "Networking basics",
   "description": "IP addresses, subnets and gateways, DHCP vs. static addresses, DNS - what actually happens when a device joins a network.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "networking",
   "trees": [
    "networking"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "net-frc-addressing": {
   "name": "Our robot's addresses",
   "description": "The FRC 10.TE.AM.x scheme - for team 3200 that's 10.32.0.x: the radio, the roboRIO, the driver station - plus mDNS names like roboRIO-3200-FRC.local.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "net-basics"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "networking",
   "trees": [
    "networking"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "net-tools": {
   "name": "Network tools",
   "description": "ping, ipconfig/ifconfig, traceroute and link lights - check whether two devices can reach each other and find where it breaks.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "net-basics"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "networking",
   "trees": [
    "networking"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "net-radio": {
   "name": "Robot radio",
   "description": "Program and configure the robot radio for our team, and know its status lights.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "requires": [
    "net-frc-addressing"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 2,
   "home_tree": "networking",
   "trees": [
    "networking"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "net-driver-station-comms": {
   "name": "Driver station communications",
   "description": "Connect the driver station to the robot by USB, Ethernet and radio; fix \"no robot communication\"; and set up the laptop's firewall so it doesn't block the robot.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "subteam-lead",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      }
     ]
    }
   },
   "requires": [
    "net-tools",
    "net-frc-addressing"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 2,
   "home_tree": "networking",
   "trees": [
    "networking"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "net-field-network": {
   "name": "The field network and its rules",
   "description": "How the field network works: the allowed ports and the per-team bandwidth limit (check this season's manual), and the event rule that teams may not run their own Wi-Fi - a phone hotspot counts.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "net-frc-addressing"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 2,
   "home_tree": "networking",
   "trees": [
    "networking"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "net-packet-capture": {
   "name": "Packet capture",
   "description": "Capture traffic with Wireshark, filter it, and explain what a few packets are doing.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "net-tools"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "networking",
   "trees": [
    "networking"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "net-event-troubleshooting": {
   "name": "Troubleshooting comms at an event",
   "description": "Diagnose robot communication problems at competition - on the practice field and with the field technical staff - calmly and fast.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "net-driver-station-comms",
    "net-field-network"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 3,
   "home_tree": "networking",
   "trees": [
    "networking"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "net-scouting-network": {
   "name": "Event-legal scouting data",
   "description": "Move scouting data at an event without breaking the no-Wi-Fi rule - wired, QR codes, USB or cellular to a server - and keep it working all day.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "net-field-network",
    "strat-objective-scouting"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 3,
   "home_tree": "networking",
   "trees": [
    "networking"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "net-security": {
   "name": "Network security",
   "description": "Firewalls, strong passwords and account safety, keeping team laptops and the robot patched, and spotting suspicious activity.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "net-packet-capture"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "networking",
   "trees": [
    "networking"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "net-owns-team-network": {
   "name": "Owns the team network",
   "description": "Design and document the team's networks - shop, robot, driver stations and scouting - and keep them running.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 4,
   "home_tree": "networking",
   "trees": [
    "networking"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "net-teach": {
   "name": "Teach",
   "description": "Take a Novice from networking basics to getting a driver station talking to the robot.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "electronics"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 4,
   "home_tree": "networking",
   "trees": [
    "networking"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "onb-raptacon-signup": {
   "name": "Sign up with Raptacon",
   "description": "Fill out this season's Raptacon sign-up form for your role (new or returning).",
   "kind": "check",
   "verify": {
    "method": "auto",
    "source": {
     "tab": "<role roster tab>",
     "where": "Status = Active"
    }
   },
   "renews": "season",
   "visibility": "team",
   "section": "join",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "parent"
    },
    {
     "role": "mentor"
    },
    {
     "role": "volunteer"
    },
    {
     "role": "board"
    }
   ]
  },
  "onb-dues": {
   "name": "Team dues",
   "description": "$250/year if paid in full in the 1st quarter, or $270 over time - 3 payments of $90, due in October, December and March. Scholarships are available; ask the treasurer. Paid in full, on the payment plan, or on a scholarship all count as done. Nobody but you, your parents and the treasurer sees this.",
   "kind": "check",
   "actor": "parent",
   "verify": {
    "method": "auto",
    "source": {
     "tab": "Balances",
     "where": "Category = Dues and Balance Due <= 0"
    },
    "by": {
     "role": "treasurer"
    }
   },
   "renews": "season",
   "visibility": "self",
   "section": "join",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "onb-handbook": {
   "name": "Read and sign the team handbook",
   "description": "Read this season's Raptacon handbook and submit the acknowledgment form (no Google account needed). Students and their parent/guardian each submit one; a parent with two students submits once per student. Can't do it online? Sign the paper page and hand it to a mentor.",
   "kind": "signature",
   "verify": {
    "method": "signature",
    "source": {
     "tabs": [
      "Handbook_Acks",
      "Handbook_Acks_Paper"
     ],
     "version_prefix": "season"
    }
   },
   "renews": "season",
   "visibility": "team",
   "section": "paperwork",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "parent"
    },
    {
     "role": "mentor"
    },
    {
     "role": "volunteer"
    },
    {
     "role": "board"
    }
   ]
  },
  "onb-emergency-info": {
   "name": "Emergency contact and medical info on file",
   "kind": "check",
   "verify": {
    "method": "auto",
    "source": {
     "tab": "<role roster tab>",
     "columns": [
      "Emergency Contact Name",
      "Emergency Contact Phone"
     ]
    }
   },
   "renews": "season",
   "visibility": "mentors",
   "section": "paperwork",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    },
    {
     "role": "volunteer"
    },
    {
     "role": "parent"
    }
   ]
  },
  "onb-photo-release": {
   "name": "Photo / media release answered",
   "description": "Yes or no are both fine - we just need an answer on file.",
   "kind": "check",
   "verify": {
    "method": "auto",
    "source": {
     "tab": "Students_Active",
     "columns": [
      "Photo/Media Release"
     ]
    }
   },
   "renews": "season",
   "visibility": "mentors",
   "section": "paperwork",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "onb-first-dashboard": {
   "name": "Registered in the FIRST Dashboard",
   "description": "Create/renew your FIRST account and join team 3200's roster.",
   "kind": "external",
   "verify": {
    "method": "signoff",
    "claim": true,
    "by": {
     "role": "lead-mentor"
    }
   },
   "renews": "season",
   "visibility": "team",
   "section": "first",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "onb-first-consent": {
   "name": "FIRST Consent & Release form signed",
   "description": "Required by FIRST every season. A parent/guardian signs it for the student in the FIRST Dashboard - students, remind your parent; parents, this one's yours.",
   "kind": "external",
   "actor": "parent",
   "verify": {
    "method": "signoff",
    "claim": true,
    "by": {
     "role": "lead-mentor"
    }
   },
   "requires": [
    "onb-first-dashboard"
   ],
   "renews": "season",
   "visibility": "team",
   "section": "first",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "parent"
    }
   ]
  },
  "onb-first-ypp": {
   "name": "FIRST Youth Protection screening",
   "description": "FIRST's Youth Protection Program screening for adults working with students.",
   "kind": "external",
   "verify": {
    "method": "signoff",
    "claim": true,
    "by": {
     "role": "lead-mentor"
    }
   },
   "requires": [
    "onb-first-dashboard"
   ],
   "renews": "season",
   "visibility": "mentors",
   "section": "first",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "mentor"
    }
   ]
  },
  "onb-first-mentor-training": {
   "name": "FIRST mentor training",
   "kind": "external",
   "verify": {
    "method": "signoff",
    "claim": true,
    "by": {
     "role": "lead-mentor"
    }
   },
   "renews": "season",
   "visibility": "team",
   "status": "draft",
   "section": "first",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "mentor"
    }
   ]
  },
  "onb-ccsd-volunteer-forms": {
   "name": "CCSD volunteer forms",
   "kind": "external",
   "verify": {
    "method": "signoff",
    "claim": true,
    "by": {
     "role": "lead-mentor"
    }
   },
   "renews": "season",
   "visibility": "mentors",
   "section": "district",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "mentor",
     "when": "ccsd-volunteer"
    },
    {
     "role": "volunteer",
     "when": "ccsd-volunteer"
    },
    {
     "role": "parent",
     "when": "ccsd-volunteer"
    },
    {
     "role": "board",
     "when": "ccsd-volunteer"
    }
   ]
  },
  "onb-ccsd-fingerprinting": {
   "name": "CCSD fingerprinting",
   "description": "Becomes available after 150 volunteer hours.",
   "kind": "external",
   "verify": {
    "method": "signoff",
    "claim": true,
    "by": {
     "role": "lead-mentor"
    }
   },
   "requires": [
    "onb-ccsd-volunteer-forms",
    {
     "hours": 150
    }
   ],
   "renews": "permanent",
   "visibility": "mentors",
   "section": "district",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "mentor",
     "when": "ccsd-volunteer"
    },
    {
     "role": "volunteer",
     "when": "ccsd-volunteer"
    },
    {
     "role": "parent",
     "when": "ccsd-volunteer"
    }
   ]
  },
  "onb-background-check": {
   "name": "Background check complete",
   "kind": "check",
   "verify": {
    "method": "auto",
    "source": {
     "tab": "MentorsVolunteers_Active",
     "where": "Background Check Status = Completed"
    }
   },
   "renews": "season",
   "visibility": "mentors",
   "section": "district",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "mentor"
    },
    {
     "role": "parent",
     "when": "chaperone"
    },
    {
     "role": "volunteer",
     "when": "chaperone"
    }
   ]
  },
  "onb-first-safety-manual": {
   "name": "Read the FIRST Safety Manual",
   "description": "Everyone on the team - students, parents, mentors, volunteers and board - reads FIRST's Safety Manual each season: how FIRST expects teams to work safely in the shop, at events and when traveling.",
   "kind": "check",
   "verify": {
    "method": "self"
   },
   "renews": "season",
   "visibility": "team",
   "section": "safety",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "parent"
    },
    {
     "role": "mentor"
    },
    {
     "role": "volunteer"
    },
    {
     "role": "board"
    }
   ]
  },
  "onb-safety-test": {
   "name": "Safety test passed",
   "description": "Students and mentors take the same test.",
   "kind": "score",
   "pass_score": null,
   "verify": {
    "method": "signoff",
    "claim": true,
    "by": {
     "any_of": [
      {
       "role": "safety-officer"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "season",
   "visibility": "team",
   "section": "safety",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "onb-shop-orientation": {
   "name": "Shop safety orientation",
   "description": "Walkthrough with a mentor: PPE, e-stops, fire extinguisher, first aid, hair and loose clothing, shop rules.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "safety-officer"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "onb-safety-test"
   ],
   "renews": "season",
   "visibility": "public",
   "section": "safety",
   "home_tree": "onboarding",
   "trees": [
    "baseline",
    "onboarding"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "onb-safety-glasses": {
   "name": "Your safety glasses",
   "description": "The team gives you one pair of safety glasses. Label them clearly with your name and keep them in the safety glasses pocket. Grab them from the pocket at the start of every meeting and put them back when you leave.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "role": "mentor"
    }
   },
   "renews": "season",
   "visibility": "team",
   "section": "safety",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "onb-cpr-certified": {
   "name": "CPR / First Aid / AED certified",
   "description": "A current CPR, First Aid and AED certification from a recognized course (American Red Cross, American Heart Association or similar). Recommended for mentors and anyone chaperoning a trip; students are welcome to get it too.",
   "kind": "external",
   "verify": {
    "method": "signoff",
    "claim": true,
    "by": {
     "role": "lead-mentor"
    }
   },
   "renews": {
    "months": 24
   },
   "visibility": "mentors",
   "section": "safety",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "mentor"
    },
    {
     "role": "parent",
     "when": "chaperone"
    },
    {
     "role": "volunteer",
     "when": "chaperone"
    }
   ]
  },
  "onb-discord": {
   "name": "Join the team Discord",
   "kind": "check",
   "verify": {
    "method": "self"
   },
   "renews": "permanent",
   "visibility": "team",
   "section": "connected",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "parent"
    },
    {
     "role": "mentor"
    },
    {
     "role": "volunteer"
    },
    {
     "role": "board"
    }
   ]
  },
  "onb-calendar": {
   "name": "Subscribe to the team calendar",
   "kind": "check",
   "verify": {
    "method": "self"
   },
   "renews": "permanent",
   "visibility": "team",
   "section": "connected",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "parent"
    },
    {
     "role": "mentor"
    },
    {
     "role": "volunteer"
    },
    {
     "role": "board"
    }
   ]
  },
  "onb-remind": {
   "name": "Join Remind for team texts",
   "description": "Text @3200rapta to 81010.",
   "kind": "check",
   "verify": {
    "method": "self"
   },
   "renews": "season",
   "visibility": "team",
   "section": "connected",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "parent"
    },
    {
     "role": "mentor"
    },
    {
     "role": "volunteer"
    },
    {
     "role": "board"
    }
   ]
  },
  "onb-github": {
   "name": "GitHub account linked",
   "description": "Create a GitHub account with your first and last name as the username - firstnamelastname, e.g. janedoe (add a number if it's taken). It's easy for the team to find and looks good on a resume later. Then add it to your sign-up form (returning members: use the \"Updated GitHub username\" question). This is also the first step of the Kanban tree.",
   "kind": "check",
   "verify": {
    "method": "auto",
    "source": {
     "tab": "<role roster tab>",
     "columns": [
      "GitHub Username"
     ]
    }
   },
   "renews": "permanent",
   "visibility": "team",
   "section": "connected",
   "home_tree": "onboarding",
   "trees": [
    "kanban",
    "onboarding"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "onb-presence-hours": {
   "name": "First 10 hours at the shop",
   "description": "Check in and out at meetings - hours come straight from the check-in system.",
   "kind": "hours",
   "target": 10,
   "verify": {
    "method": "auto",
    "source": {
     "tab": "CheckIns",
     "sum": "Duration (min)"
    }
   },
   "renews": "season",
   "visibility": "public",
   "section": "started",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "onb-saturday-food": {
   "name": "Sign up for Saturday food (2 minimum)",
   "description": "Bring food for at least two Saturday build sessions this season.",
   "kind": "count",
   "target": 2,
   "verify": {
    "method": "signoff",
    "by": {
     "role": "food-coordinator"
    }
   },
   "renews": "season",
   "visibility": "team",
   "section": "help",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "parent"
    }
   ]
  },
  "onb-mentor-verifier": {
   "name": "Approved to sign off a tree",
   "description": "Lead mentor approves you to verify skills in one or more trees. Recorded per tree; this is what lets you sign students off.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "role": "lead-mentor"
    }
   },
   "requires": [
    "onb-first-ypp",
    "onb-safety-test"
   ],
   "renews": "permanent",
   "visibility": "team",
   "section": "help",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "mentor"
    }
   ]
  },
  "onb-board-orientation": {
   "name": "Board orientation",
   "description": "Board-specific onboarding - roles, bylaws, finances, meeting cadence.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "role": "board-chair"
    }
   },
   "renews": "season",
   "visibility": "team",
   "status": "draft",
   "section": "help",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "board"
    }
   ]
  },
  "onb-field-trip-form": {
   "name": "Annual field trip form",
   "description": "One field trip form covers the whole season. Individual trips may still have their own forms and info - those are handled separately per trip.",
   "kind": "check",
   "actor": "parent",
   "verify": {
    "method": "signoff",
    "claim": true,
    "by": {
     "role": "lead-mentor"
    }
   },
   "renews": "season",
   "visibility": "mentors",
   "section": "travel",
   "home_tree": "onboarding",
   "trees": [
    "onboarding"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "out-team-pitch": {
   "name": "Team pitch",
   "description": "Explain the team's history, mission and sponsors to a stranger in under a minute.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "outreach"
      },
      {
       "role": "subteam-mentor",
       "tree": "outreach"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "outreach",
   "trees": [
    "core-knowledge",
    "outreach"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "out-sponsor-recognition": {
   "name": "Sponsor recognition",
   "description": "Write sponsor thank-you notes and recognition posts, and keep sponsor logos current on team materials.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "outreach"
      },
      {
       "role": "subteam-mentor",
       "tree": "outreach"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "outreach",
   "trees": [
    "outreach"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "out-sponsor-communications": {
   "name": "Sponsor communications",
   "description": "Lead sponsor outreach - asks, season updates and renewal thank-yous.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "outreach"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "outreach",
   "trees": [
    "outreach"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "out-award-writing": {
   "name": "Award submission writing",
   "description": "Co-write an award submission - the Impact Award essay or a Woodie Flowers nomination.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "outreach"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "outreach",
   "trees": [
    "outreach"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "out-outreach-program": {
   "name": "Community outreach program",
   "description": "Design and lead a community outreach or STEM demo program.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "outreach"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 4,
   "home_tree": "outreach",
   "trees": [
    "outreach"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-python-basics": {
   "name": "Python basics",
   "description": "print() and Hello World, variables, functions, if/elif/else, lists, dicts and tuples, operators, pass, and Python syntax. Comment your code!",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "programming",
   "trees": [
    "core-knowledge",
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-python-objects": {
   "name": "Python objects and imports",
   "description": "Classes and objects, imports (import / from ... import), and lambdas.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "prog-python-basics"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-python-beyond": {
   "name": "Python beyond robotics",
   "description": "try/except error handling and working with strings.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "prog-python-basics"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-debugging": {
   "name": "Debugging and the robot sim",
   "description": "Read an error message and find the bug, set up a Python virtual environment, and run robot code in the simulator.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "prog-python-basics"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-command-line": {
   "name": "Command line basics",
   "description": "Get around a computer without a mouse: where am I (pwd), what's here (ls), moving around (cd), making, copying, moving and deleting files (mkdir, cp, mv, rm), reading files (cat, less), pipes and redirects (|, >, >>), and getting help (man, --help). The driver station laptops run Windows, so learn the PowerShell versions too.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-pull-requests": {
   "name": "Pull requests and .gitignore",
   "description": "Open a pull request on a team code repo, respond to review, and keep junk out of the repo with .gitignore.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "base-git"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-libraries-docs": {
   "name": "Libraries and reading docs",
   "description": "What FRC, WPILib and RobotPy are and how robot.py is structured; get familiar with WPILib, WPIMath and REV's libraries, and learn to find answers in the docs.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "prog-python-objects"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-cone-drill-1-2": {
   "name": "Cone drill 1-2",
   "description": "Drive one side of a robot (motor groups, an Xbox controller, reading a joystick axis), then organize it into a drivetrain subsystem with tank drive.",
   "kind": "check",
   "verify": {
    "method": "signoff"
   },
   "parts": [
    {
     "id": "step1",
     "name": "Step 1: drive one side of a robot",
     "by": {
      "any_of": [
       {
        "role": "subteam-lead",
        "tree": "programming"
       },
       {
        "role": "subteam-mentor",
        "tree": "programming"
       }
      ]
     }
    },
    {
     "id": "step2",
     "name": "Step 2: drivetrain subsystem",
     "by": {
      "any_of": [
       {
        "role": "subteam-lead",
        "tree": "programming"
       },
       {
        "role": "subteam-mentor",
        "tree": "programming"
       }
      ]
     }
    }
   ],
   "requires": [
    "prog-libraries-docs"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 1,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-sensors": {
   "name": "Sensor programming",
   "description": "Read sensors (encoders, limit switches, breakbeams, gyros) and use them in code.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "prog-cone-drill-1-2"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-motors": {
   "name": "Motor programming",
   "description": "Configure and control motor controllers - direction, current limits, brake/coast, followers.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "prog-cone-drill-1-2"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-commands-v2": {
   "name": "Commands v2",
   "description": "Structure robot behavior with command-based programming - subsystems, commands and triggers.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "prog-cone-drill-1-2"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-controls-mapping": {
   "name": "Controls mapping",
   "description": "Map driver and operator controls - arcade drive, and switching drive modes or triggering actions on button presses.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "prog-commands-v2"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-autonomous": {
   "name": "Autonomous routines",
   "description": "Time-based (open-loop) autonomous actions.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "prog-commands-v2"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-state-machines": {
   "name": "State machines",
   "description": "React to a sensor (breakbeam) with robot and LED state transitions.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "prog-sensors"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-docker": {
   "name": "Docker",
   "description": "What containers and images are and why we use them: everyone gets the same robot-code environment on any laptop. Run, list, log and exec into containers, mount your code into one, and read a Dockerfile - the robot code repo has one.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "prog-command-line",
    "prog-pull-requests"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-testing": {
   "name": "Testing",
   "description": "Run the test suite before you push, read a failing test, and contribute new tests.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "prog-debugging"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 2,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-driver-station": {
   "name": "Driver Station and dashboard",
   "description": "Run the robot from the Driver Station app and use the dashboard to watch and tune it.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "programming"
      },
      {
       "role": "subteam-mentor",
       "tree": "programming"
      }
     ]
    }
   },
   "requires": [
    "prog-cone-drill-1-2"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 2,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-subsystems": {
   "name": "Mechanism subsystems",
   "description": "Program the robot's mechanisms - intake, arms and shooters - including variable position and velocity control, and structure them cleanly.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "prog-commands-v2",
    "prog-motors",
    "prog-sensors"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-pid": {
   "name": "PID and closed-loop control",
   "description": "Tune closed-loop position and velocity control.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "prog-motors",
    "prog-sensors"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-swerve": {
   "name": "Swerve drive",
   "description": "Understand and work on the swerve drivetrain - module control, kinematics and field-relative driving.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "prog-pid"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-vision": {
   "name": "Vision",
   "description": "Use the robot's cameras and vision pipeline to find targets and estimate position.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-robot-codebase": {
   "name": "Contribute to the robot code",
   "description": "Set up the real dev environment, then read and extend a real subsystem and add a command that uses it - merged into the season's robot repo.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "prog-commands-v2",
    "prog-testing",
    "prog-pull-requests"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-shared-library": {
   "name": "Contribute to the shared library",
   "description": "Get a change merged into raptacon3200, the team's shared Python library - branch as feature/* or fix/* (which publishes a test version), add tests, and open a PR for the stable release.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "prog-testing",
    "prog-pull-requests"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-custom-mechanism": {
   "name": "Custom code for a new mechanism",
   "description": "Write the code for a brand-new mechanism from scratch, start to finish.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "prog-subsystems"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 3,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-architecture": {
   "name": "Software architecture",
   "description": "Design a reusable abstraction, not just a single feature.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 4,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "prog-teach": {
   "name": "Teach",
   "description": "Take a Novice from Hello World through the cone drill.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "programming"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "renews": "permanent",
   "visibility": "public",
   "tier": 4,
   "home_tree": "programming",
   "trees": [
    "programming"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "strat-game-rules-test": {
   "name": "Game rules test",
   "description": "Pass the team's rules test for this season's game - how a match runs, how points are scored, fouls and the rules that matter most to us. Before kickoff it covers last season's game.",
   "kind": "score",
   "pass_score": null,
   "verify": {
    "method": "signoff",
    "claim": true,
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "strategy"
      },
      {
       "role": "subteam-mentor",
       "tree": "strategy"
      }
     ]
    }
   },
   "renews": "season",
   "visibility": "public",
   "tier": 1,
   "track": "Strategy",
   "home_tree": "strategy",
   "trees": [
    "core-knowledge",
    "strategy"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "strat-objective-scouting": {
   "name": "Objective scouting",
   "description": "Scout matches in the team's scouting system - accurate, consistent data for every match you're assigned.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "strategy"
      },
      {
       "role": "subteam-mentor",
       "tree": "strategy"
      }
     ]
    }
   },
   "renews": "season",
   "visibility": "public",
   "tier": 1,
   "track": "Scouting",
   "home_tree": "strategy",
   "trees": [
    "strategy"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "strat-pit-scouting": {
   "name": "Pit scouting and handouts",
   "description": "Visit other teams in the pits with the team's question list, record their answers, and hand out our team and scouting sheets.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "strategy"
      },
      {
       "role": "subteam-mentor",
       "tree": "strategy"
      }
     ]
    }
   },
   "renews": "season",
   "visibility": "public",
   "tier": 1,
   "track": "Scouting",
   "home_tree": "strategy",
   "trees": [
    "strategy"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "strat-rc-cone-course": {
   "name": "RC cone course",
   "description": "Drive an RC car through the cone course three times. Your best time is recorded.",
   "kind": "timed",
   "runs": 3,
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "strategy"
      },
      {
       "role": "subteam-mentor",
       "tree": "strategy"
      }
     ]
    }
   },
   "renews": "season",
   "visibility": "public",
   "tier": 1,
   "track": "Drive",
   "home_tree": "strategy",
   "trees": [
    "strategy"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "strat-robot-knowledge": {
   "name": "Robot knowledge",
   "description": "Explain every mechanism on the robot from the bottom up, what each control does, and how to recover from the common failures (brownout, lost connection, a jammed mechanism).",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "strategy"
      },
      {
       "role": "subteam-mentor",
       "tree": "strategy"
      }
     ]
    }
   },
   "requires": [
    "base-robot-game"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 1,
   "track": "Drive",
   "home_tree": "strategy",
   "trees": [
    "core-knowledge",
    "strategy"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "strat-subjective-scouting": {
   "name": "Subjective scouting",
   "description": "Rate driver skill, defense and reliability during qualification matches, with useful notes.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "strategy"
      },
      {
       "role": "subteam-mentor",
       "tree": "strategy"
      }
     ]
    }
   },
   "requires": [
    "strat-objective-scouting"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 2,
   "track": "Scouting",
   "home_tree": "strategy",
   "trees": [
    "strategy"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "strat-strategy-meetings": {
   "name": "Strategy meetings",
   "description": "Analyze another team's strategy (from match video or the forums) and present it at a strategy meeting.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "strategy"
      },
      {
       "role": "subteam-mentor",
       "tree": "strategy"
      }
     ]
    }
   },
   "requires": [
    "strat-game-rules-test"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 2,
   "track": "Strategy",
   "home_tree": "strategy",
   "trees": [
    "strategy"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "strat-robot-cone-course": {
   "name": "Robot cone course",
   "description": "Drive the robot through the cone course three times with a drive coach or mentor watching. Your best time is recorded - this makes you eligible to try out for the Drive Team.",
   "kind": "timed",
   "runs": 3,
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "strategy"
      },
      {
       "role": "subteam-mentor",
       "tree": "strategy"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "strat-rc-cone-course",
    "strat-robot-knowledge",
    "strat-game-rules-test"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 2,
   "track": "Drive",
   "home_tree": "strategy",
   "trees": [
    "strategy"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "strat-pick-list": {
   "name": "Pick list",
   "description": "Build an alliance-selection pick list from scouting data and defend it to the team.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "strategy"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "strat-subjective-scouting"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 3,
   "track": "Strategy",
   "home_tree": "strategy",
   "trees": [
    "strategy"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "strat-match-strategist": {
   "name": "Match strategist",
   "description": "At an event, plan each match with the drive coach: talk to alliance partners about their robots, agree a plan, and relay it to the drive team.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "strategy"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "strat-strategy-meetings"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 3,
   "track": "Strategy",
   "home_tree": "strategy",
   "trees": [
    "strategy"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "strat-lead-scout": {
   "name": "Lead scout",
   "description": "Run scouting at an event - training, the schedule, logistics and the scouts' well-being.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "strategy"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "strat-subjective-scouting"
   ],
   "renews": "season",
   "visibility": "public",
   "tier": 3,
   "track": "Scouting",
   "home_tree": "strategy",
   "trees": [
    "strategy"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "strat-owns-strategy": {
   "name": "Owns season strategy",
   "description": "Lead the kickoff strategy session, own the season's game strategy, and train the next strategists.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-mentor",
       "tree": "strategy"
      },
      {
       "role": "lead-mentor"
      }
     ]
    }
   },
   "requires": [
    "strat-pick-list",
    "strat-match-strategist"
   ],
   "renews": "permanent",
   "visibility": "public",
   "tier": 4,
   "track": "Strategy",
   "home_tree": "strategy",
   "trees": [
    "strategy"
   ],
   "roles": [
    {
     "role": "student"
    }
   ]
  },
  "tool-hand-tools": {
   "name": "Hand Tools",
   "description": "The everyday shop hand tools - what each is for, using it safely, and putting it back: tape measure and steel rule, combination square, digital calipers, screwdrivers (Phillips, flat, Torx), hex keys (imperial and metric, ball-end), wrenches and sockets, pliers and flush cutters, files and deburring tool, hacksaw, mallet, clamps, center punch.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "role": "subteam-lead",
     "tree": "manufacturing"
    }
   },
   "requires": [
    "onb-safety-test",
    "onb-shop-orientation"
   ],
   "renews": "season",
   "visibility": "public",
   "section": "hand",
   "home_tree": "tools",
   "trees": [
    "baseline",
    "manufacturing",
    "tools"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "tool-drill-driver": {
   "name": "Drills & Drivers",
   "description": "Cordless drill and impact driver: when to use which, picking and seating bits, clutch/torque and speed settings, pilot holes, clamping the work (never hold it in your hand), battery swap and charging, PPE. Demonstrate drilling a clean hole and driving a screw to depth without stripping it.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "role": "subteam-lead",
     "tree": "manufacturing"
    }
   },
   "requires": [
    "onb-safety-test",
    "onb-shop-orientation"
   ],
   "renews": "season",
   "visibility": "public",
   "section": "hand-power",
   "home_tree": "tools",
   "trees": [
    "baseline",
    "manufacturing",
    "tools"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "tool-sander": {
   "name": "Belt and disc sander",
   "description": "Shaping and deburring on the belt/disc sander. Keep aluminum and wood sanding separate and empty the dust collector.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "requires": [
    "onb-safety-test",
    "onb-shop-orientation"
   ],
   "renews": "season",
   "visibility": "public",
   "section": "power",
   "home_tree": "tools",
   "trees": [
    "manufacturing",
    "tools"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "tool-jigsaw": {
   "name": "Jigsaw",
   "description": "Curved and straight cuts in sheet material with a jigsaw.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "requires": [
    "onb-safety-test",
    "onb-shop-orientation"
   ],
   "renews": "season",
   "visibility": "public",
   "section": "power",
   "home_tree": "tools",
   "trees": [
    "manufacturing",
    "tools"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "tool-dremel": {
   "name": "Rotary tool (Dremel)",
   "description": "Grinding, cutting and cleanup with a rotary tool. Cut-off wheels can shatter - glasses always, and stand out of line with the wheel.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "any_of": [
      {
       "role": "subteam-lead",
       "tree": "manufacturing"
      },
      {
       "role": "subteam-mentor",
       "tree": "manufacturing"
      }
     ]
    }
   },
   "requires": [
    "onb-safety-test",
    "onb-shop-orientation"
   ],
   "renews": "season",
   "visibility": "public",
   "section": "power",
   "home_tree": "tools",
   "trees": [
    "manufacturing",
    "tools"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "tool-band-saw": {
   "name": "Band saw",
   "description": "Straight and curved cuts on the vertical band saw.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "role": "subteam-mentor",
     "tree": "manufacturing"
    }
   },
   "requires": [
    "onb-safety-test",
    "onb-shop-orientation"
   ],
   "renews": "season",
   "visibility": "public",
   "supervision": "mentor",
   "section": "machines",
   "home_tree": "tools",
   "trees": [
    "manufacturing",
    "tools"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "tool-drill-press": {
   "name": "Drill press",
   "description": "Accurate holes on the drill press.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "role": "subteam-mentor",
     "tree": "manufacturing"
    }
   },
   "requires": [
    "onb-safety-test",
    "onb-shop-orientation",
    "tool-drill-driver"
   ],
   "renews": "season",
   "visibility": "public",
   "supervision": "mentor",
   "section": "machines",
   "home_tree": "tools",
   "trees": [
    "manufacturing",
    "tools"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "tool-chop-saw": {
   "name": "Chop / miter saw",
   "description": "Cutting tube and bar stock to length on the chop or miter saw. Hearing protection on.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "role": "subteam-mentor",
     "tree": "manufacturing"
    }
   },
   "requires": [
    "onb-safety-test",
    "onb-shop-orientation"
   ],
   "renews": "season",
   "visibility": "public",
   "supervision": "mentor",
   "section": "machines",
   "home_tree": "tools",
   "trees": [
    "manufacturing",
    "tools"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "tool-lathe": {
   "name": "Lathe",
   "description": "Turning round parts - spacers, shafts, bushings - on the lathe.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "role": "subteam-mentor",
     "tree": "manufacturing"
    }
   },
   "requires": [
    "onb-safety-test",
    "onb-shop-orientation"
   ],
   "renews": "season",
   "visibility": "public",
   "supervision": "mentor",
   "section": "machines",
   "home_tree": "tools",
   "trees": [
    "manufacturing",
    "tools"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "tool-mill": {
   "name": "Milling machine",
   "description": "Pockets, slots and precise holes on the milling machine.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "role": "subteam-mentor",
     "tree": "manufacturing"
    }
   },
   "requires": [
    "onb-safety-test",
    "onb-shop-orientation"
   ],
   "renews": "season",
   "visibility": "public",
   "supervision": "mentor",
   "section": "machines",
   "home_tree": "tools",
   "trees": [
    "manufacturing",
    "tools"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  },
  "tool-cnc-router": {
   "name": "CNC router",
   "description": "Running a job on the team's CNC router. Hearing protection on, dust collection running, and you stay with the machine for the whole job.",
   "kind": "check",
   "verify": {
    "method": "signoff",
    "by": {
     "role": "subteam-mentor",
     "tree": "manufacturing"
    }
   },
   "requires": [
    "onb-safety-test",
    "onb-shop-orientation",
    "mfg-cnc-intro"
   ],
   "renews": "season",
   "visibility": "public",
   "supervision": "mentor",
   "section": "machines",
   "home_tree": "tools",
   "trees": [
    "manufacturing",
    "tools"
   ],
   "roles": [
    {
     "role": "student"
    },
    {
     "role": "mentor"
    }
   ]
  }
 },
 "member_roles": [
  "student",
  "parent",
  "mentor",
  "volunteer",
  "board"
 ],
 "conditions": [
  "chaperone",
  "travels",
  "ccsd-volunteer",
  "first-lead-mentor"
 ],
 "signoff_roles": [
  {
   "id": "lead-mentor",
   "name": "Lead Mentor"
  },
  {
   "id": "safety-captain",
   "name": "Safety Captain"
  },
  {
   "id": "safety-officer",
   "name": "Safety Mentor"
  },
  {
   "id": "treasurer",
   "name": "Treasurer"
  },
  {
   "id": "subteam-lead",
   "name": "Subteam Lead",
   "scoped": "tree"
  },
  {
   "id": "captain",
   "name": "Team Captain"
  },
  {
   "id": "subteam-mentor",
   "name": "Subteam Mentor",
   "scoped": "tree"
  },
  {
   "id": "food-coordinator",
   "name": "Food Coordinator"
  },
  {
   "id": "board-chair",
   "name": "Board Chair"
  }
 ],
 "assignments": [
  {
   "role": "subteam-lead",
   "tree": "manufacturing",
   "people": [
    {
     "name": "Sasha Graves",
     "github": "sashgravess"
    },
    {
     "name": "Snort Hirsch",
     "github": "Snort-Hirsch"
    }
   ]
  },
  {
   "role": "subteam-mentor",
   "tree": "manufacturing",
   "people": [
    {
     "name": "Tyler Hirsch",
     "github": "Mineops99"
    }
   ]
  },
  {
   "role": "subteam-lead",
   "tree": "programming",
   "people": [
    {
     "name": "Emma Garrett",
     "github": "DanteSGarrett"
    }
   ]
  },
  {
   "role": "subteam-mentor",
   "tree": "programming",
   "people": [
    {
     "name": "Nathan Beasley",
     "github": "tuffinmuffin"
    },
    {
     "name": "Cat Kesler",
     "github": "manicmou"
    }
   ]
  },
  {
   "role": "subteam-lead",
   "tree": "electronics",
   "people": [
    {
     "name": "Genevieve Kiehl",
     "github": "TODO"
    }
   ]
  },
  {
   "role": "subteam-mentor",
   "tree": "electronics",
   "people": [
    {
     "name": "Stefan Sell",
     "github": "TODO"
    }
   ]
  },
  {
   "role": "lead-mentor",
   "people": [
    {
     "name": "Chris Hirsch",
     "github": "ChrisHirsch"
    }
   ]
  }
 ]
}