{
 "about": "The posts the town hires or appoints somebody into, and what each department says it employs.",
 "conclusions": [
  {
   "basis": "The per-school staff rosters in the annual report, against the Fire and Police rosters and the DPW establishment.",
   "bearing": "sizes",
   "claim": "The schools employ more than twice as many people as the rest of the town put together",
   "detail": "Before any question about who is growing: this is the scale of the town’s workforce, and one part of it is nearly all of it. The schools name 232 members of staff in FY2025. Every other part of the town that publishes a count — Fire Department, Police Department, Department of Public Works, Council on Aging, Library, Building Department, Board of Assessors and Information Technology — comes to 114 between them.",
   "figure": "schools",
   "figures": {
    "others": {
     "text": "114",
     "unit": "in every other department that publishes a count",
     "value": 114
    },
    "schools": {
     "text": "232",
     "unit": "school staff, named",
     "value": 232
    }
   },
   "id": "schools-are-the-employer",
   "kind": "measured",
   "literals": [
    "FY2025"
   ],
   "not_shown": "The departments that publish nothing. Their staff are in no count here and their absence is not a small number.",
   "see": [],
   "so_what": "A conversation about town staffing is mostly a conversation about the schools."
  },
  {
   "basis": "Each department’s own published count, first published year against last, with any year reading under half its predecessor dropped as a short read rather than a cut.",
   "bearing": "sizes",
   "claim": "One department has fewer people than when it first published. The rest are flat or larger",
   "detail": "How many people each department printed, first year against last. A change here is people present, not a decision about posts. Information Technology is down 1, from 4 to 3. The other eight departments are larger or unchanged.",
   "figure": "shrank",
   "figures": {
    "d0": {
     "text": "1",
     "unit": "fewer at Information Technology",
     "value": 1
    },
    "f0": {
     "text": "4",
     "unit": "at Information Technology when it first published",
     "value": 4
    },
    "n0": {
     "text": "3",
     "unit": "at Information Technology now",
     "value": 3
    },
    "rest": {
     "text": "eight",
     "unit": "flat or larger",
     "value": 8
    },
    "shrank": {
     "text": "One",
     "unit": "departments with fewer people than when they started",
     "value": 1
    }
   },
   "id": "who-grew-who-cut",
   "kind": "measured",
   "literals": [
    "FY2011"
   ],
   "not_shown": "Whether any POST was cut. A count falls when somebody leaves a post that is still funded, and holds when a post is eliminated and its holder moves into another vacancy — the Assessing office reported being “fully staffed for the first time in over a year” in FY2024, which is a year of posts that existed and stood empty. Nor hours or FTE: a call firefighter and a classroom teacher are one person each here.",
   "see": [],
   "so_what": "Only one part of the town has visibly fewer people, which is not the same as a post being cut."
  }
 ],
 "employers": [
  {
   "change": 32,
   "department": "Schools",
   "first": 200,
   "first_fy": "2011",
   "kind": "every member of staff, named",
   "last_fy": "2025",
   "people": 232,
   "series": [
    {
     "fy": "2011",
     "people": 200,
     "suspect": false
    },
    {
     "fy": "2012",
     "people": 196,
     "suspect": false
    },
    {
     "fy": "2013",
     "people": 170,
     "suspect": false
    },
    {
     "fy": "2014",
     "people": 229,
     "suspect": false
    },
    {
     "fy": "2015",
     "people": 242,
     "suspect": false
    },
    {
     "fy": "2016",
     "people": 262,
     "suspect": false
    },
    {
     "fy": "2017",
     "people": 271,
     "suspect": false
    },
    {
     "fy": "2018",
     "people": 256,
     "suspect": false
    },
    {
     "fy": "2019",
     "people": 242,
     "suspect": false
    },
    {
     "fy": "2020",
     "people": 237,
     "suspect": false
    },
    {
     "fy": "2021",
     "people": 230,
     "suspect": false
    },
    {
     "fy": "2022",
     "people": 264,
     "suspect": false
    },
    {
     "fy": "2023",
     "people": 241,
     "suspect": false
    },
    {
     "fy": "2024",
     "people": 272,
     "suspect": false
    },
    {
     "fy": "2025",
     "people": 232,
     "suspect": false
    }
   ],
   "suspect": [],
   "years": 15
  },
  {
   "change": 4,
   "department": "Fire Department",
   "first": 36,
   "first_fy": "2011",
   "kind": "career staff plus the low end of the on-call range",
   "last_fy": "2025",
   "people": 40,
   "series": [
    {
     "fy": "2011",
     "people": 36,
     "suspect": false
    },
    {
     "fy": "2012",
     "people": 39,
     "suspect": false
    },
    {
     "fy": "2013",
     "people": 42,
     "suspect": false
    },
    {
     "fy": "2014",
     "people": 45,
     "suspect": false
    },
    {
     "fy": "2015",
     "people": 46,
     "suspect": false
    },
    {
     "fy": "2016",
     "people": 40,
     "suspect": false
    },
    {
     "fy": "2017",
     "people": 45,
     "suspect": false
    },
    {
     "fy": "2018",
     "people": 47,
     "suspect": false
    },
    {
     "fy": "2019",
     "people": 47,
     "suspect": false
    },
    {
     "fy": "2020",
     "people": 47,
     "suspect": false
    },
    {
     "fy": "2021",
     "people": 48,
     "suspect": false
    },
    {
     "fy": "2022",
     "people": 40,
     "suspect": false
    },
    {
     "fy": "2023",
     "people": 40,
     "suspect": false
    },
    {
     "fy": "2024",
     "people": 40,
     "suspect": false
    },
    {
     "fy": "2025",
     "people": 40,
     "suspect": false
    }
   ],
   "suspect": [],
   "years": 15
  },
  {
   "change": 16,
   "department": "Police Department",
   "first": 13,
   "first_fy": "2012",
   "kind": "every member of staff, named on its roster",
   "last_fy": "2025",
   "people": 29,
   "series": [
    {
     "fy": "2012",
     "people": 13,
     "suspect": false
    },
    {
     "fy": "2013",
     "people": 17,
     "suspect": false
    },
    {
     "fy": "2014",
     "people": 26,
     "suspect": true
    },
    {
     "fy": "2015",
     "people": 14,
     "suspect": false
    },
    {
     "fy": "2016",
     "people": 19,
     "suspect": false
    },
    {
     "fy": "2017",
     "people": 25,
     "suspect": false
    },
    {
     "fy": "2018",
     "people": 25,
     "suspect": false
    },
    {
     "fy": "2019",
     "people": 33,
     "suspect": false
    },
    {
     "fy": "2020",
     "people": 20,
     "suspect": false
    },
    {
     "fy": "2021",
     "people": 22,
     "suspect": false
    },
    {
     "fy": "2022",
     "people": 26,
     "suspect": false
    },
    {
     "fy": "2023",
     "people": 25,
     "suspect": false
    },
    {
     "fy": "2024",
     "people": 25,
     "suspect": false
    },
    {
     "fy": "2025",
     "people": 29,
     "suspect": false
    }
   ],
   "suspect": [
    "2014"
   ],
   "years": 13
  },
  {
   "change": 0,
   "department": "Department of Public Works",
   "first": 14,
   "first_fy": "2023",
   "kind": "an establishment, post by post",
   "last_fy": "2025",
   "people": 14,
   "series": [
    {
     "fy": "2023",
     "people": 14,
     "suspect": false
    },
    {
     "fy": "2024",
     "people": 14,
     "suspect": false
    },
    {
     "fy": "2025",
     "people": 14,
     "suspect": false
    }
   ],
   "suspect": [],
   "years": 3
  },
  {
   "change": 4,
   "department": "Council on Aging",
   "first": 7,
   "first_fy": "2011",
   "kind": "a named staff list",
   "last_fy": "2025",
   "people": 11,
   "series": [
    {
     "fy": "2011",
     "people": 7,
     "suspect": false
    },
    {
     "fy": "2014",
     "people": 9,
     "suspect": false
    },
    {
     "fy": "2015",
     "people": 10,
     "suspect": false
    },
    {
     "fy": "2016",
     "people": 11,
     "suspect": false
    },
    {
     "fy": "2017",
     "people": 8,
     "suspect": false
    },
    {
     "fy": "2018",
     "people": 8,
     "suspect": false
    },
    {
     "fy": "2019",
     "people": 9,
     "suspect": false
    },
    {
     "fy": "2020",
     "people": 9,
     "suspect": false
    },
    {
     "fy": "2021",
     "people": 9,
     "suspect": false
    },
    {
     "fy": "2022",
     "people": 10,
     "suspect": false
    },
    {
     "fy": "2023",
     "people": 11,
     "suspect": false
    },
    {
     "fy": "2024",
     "people": 10,
     "suspect": false
    },
    {
     "fy": "2025",
     "people": 11,
     "suspect": false
    }
   ],
   "suspect": [],
   "years": 13
  },
  {
   "change": 0,
   "department": "Library",
   "first": 10,
   "first_fy": "2019",
   "kind": "a stated headcount",
   "last_fy": "2019",
   "people": 10,
   "series": [
    {
     "fy": "2019",
     "people": 10,
     "suspect": false
    }
   ],
   "suspect": [],
   "years": 1
  },
  {
   "change": 0,
   "department": "Building Department",
   "first": 4,
   "first_fy": "2019",
   "kind": "a named staff list",
   "last_fy": "2022",
   "people": 4,
   "series": [
    {
     "fy": "2019",
     "people": 4,
     "suspect": false
    },
    {
     "fy": "2020",
     "people": 4,
     "suspect": false
    },
    {
     "fy": "2021",
     "people": 4,
     "suspect": false
    },
    {
     "fy": "2022",
     "people": 4,
     "suspect": false
    }
   ],
   "suspect": [],
   "years": 4
  },
  {
   "change": 1,
   "department": "Board of Assessors",
   "first": 2,
   "first_fy": "2023",
   "kind": "an establishment, one post at a time",
   "last_fy": "2025",
   "people": 3,
   "series": [
    {
     "fy": "2023",
     "people": 2,
     "suspect": false
    },
    {
     "fy": "2025",
     "people": 3,
     "suspect": false
    }
   ],
   "suspect": [],
   "years": 2
  },
  {
   "change": -1,
   "department": "Information Technology",
   "first": 4,
   "first_fy": "2016",
   "kind": "a named roster, one biography per person",
   "last_fy": "2020",
   "people": 3,
   "series": [
    {
     "fy": "2016",
     "people": 4,
     "suspect": false
    },
    {
     "fy": "2017",
     "people": 4,
     "suspect": false
    },
    {
     "fy": "2018",
     "people": 4,
     "suspect": false
    },
    {
     "fy": "2020",
     "people": 3,
     "suspect": false
    }
   ],
   "suspect": [],
   "years": 4
  }
 ],
 "fire": [
  {
   "career": 5,
   "fy": "2017",
   "on_call_high": 45,
   "on_call_low": 40,
   "page": "79"
  },
  {
   "career": 7,
   "fy": "2018",
   "on_call_high": 45,
   "on_call_low": 40,
   "page": "96"
  },
  {
   "career": 7,
   "fy": "2019",
   "on_call_high": 45,
   "on_call_low": 40,
   "page": "96"
  },
  {
   "career": 7,
   "fy": "2020",
   "on_call_high": 45,
   "on_call_low": 40,
   "page": "86"
  },
  {
   "career": 8,
   "fy": "2021",
   "on_call_high": 45,
   "on_call_low": 40,
   "page": "87"
  },
  {
   "career": 10,
   "fy": "2022",
   "on_call_high": 35,
   "on_call_low": 30,
   "page": "84"
  },
  {
   "career": 10,
   "fy": "2023",
   "on_call_high": 35,
   "on_call_low": 30,
   "page": "92"
  },
  {
   "career": 10,
   "fy": "2024",
   "on_call_high": 35,
   "on_call_low": 30,
   "page": "76"
  },
  {
   "career": 10,
   "fy": "2025",
   "on_call_high": 35,
   "on_call_low": 30,
   "page": "75"
  }
 ],
 "generated_by": "scripts/build_town_personnel.py",
 "grain": "POSTS AND NAMED STAFF, never a payroll. One row is one appointed post, or one person named on a department roster. No salary is read or inferred.",
 "last": "2025",
 "not_established": [
  "What anybody is paid. No salary is read here, and none is inferred from a post’s name.",
  "How many people the town employs. Nine departments state a figure, in eight different forms, and no year has all of them — the wage list that would give one town-wide headcount stopped naming departments after FY2016.",
  "FTE. A career post and an on-call post are not the same job and cannot be netted against each other.",
  "Whether a post was CUT. A roster is people IN post and a cut removes a POST, and those come apart both ways: someone retires and the post sits vacant but funded, so the count falls and nothing was cut; or a post is eliminated and its holder moves to another vacancy, so the count holds and something was. The town’s own words for it are in the Assessing office’s FY2024 report — “we are fully staffed for the first time in over a year” — a year of posts that existed and were empty. A rise or a fall here is a change in PEOPLE PRESENT, never a decision about establishment.",
  "When in the year anybody was counted. A roster is a point in time and is undated within its year, so a September departure and a June one are the same figure.",
  "A town total. The departments that describe their staffing do it in whichever form that year’s department head chose — a count, a range, an establishment post by post, a list of names — and those are different quantities."
 ],
 "officers": [
  {
   "fy": "2016",
   "officers": 115
  },
  {
   "fy": "2017",
   "officers": 87
  },
  {
   "fy": "2018",
   "officers": 98
  },
  {
   "fy": "2019",
   "officers": 101
  },
  {
   "fy": "2020",
   "officers": 61
  },
  {
   "fy": "2021",
   "officers": 66
  },
  {
   "fy": "2022",
   "officers": 59
  },
  {
   "fy": "2023",
   "officers": 55
  },
  {
   "fy": "2024",
   "officers": 58
  },
  {
   "fy": "2025",
   "officers": 60
  }
 ],
 "pictogram": {
  "glyph": "M12 2.6a3.4 3.4 0 110 6.8 3.4 3.4 0 010-6.8zM6.2 21.4v-6.1c0-2.7 2.6-4.4 5.8-4.4s5.8 1.7 5.8 4.4v6.1h-3.3v-5.2h-1v5.2h-3v-5.2h-1v5.2z",
  "unit": 10,
  "unit_label": "people"
 },
 "publishes": [
  {
   "department": "Board of Assessors",
   "forms": [
    "0",
    "2",
    "2",
    "5"
   ]
  },
  {
   "department": "Building Department",
   "forms": [
    "0",
    "1",
    "2",
    "9"
   ]
  },
  {
   "department": "Building Department",
   "forms": [
    "0",
    "0",
    "2",
    "2"
   ]
  },
  {
   "department": "Building Department",
   "forms": [
    "0",
    "1",
    "2",
    "2"
   ]
  },
  {
   "department": "Building Department",
   "forms": [
    "0",
    "2",
    "2",
    "2"
   ]
  },
  {
   "department": "Council on Aging",
   "forms": [
    "0",
    "1",
    "1",
    "2"
   ]
  },
  {
   "department": "Council on Aging",
   "forms": [
    "0",
    "1",
    "2",
    "4"
   ]
  },
  {
   "department": "Council on Aging",
   "forms": [
    "0",
    "1",
    "2",
    "5"
   ]
  },
  {
   "department": "Council on Aging",
   "forms": [
    "0",
    "1",
    "2",
    "6"
   ]
  },
  {
   "department": "Council on Aging",
   "forms": [
    "0",
    "1",
    "2",
    "7"
   ]
  },
  {
   "department": "Council on Aging",
   "forms": [
    "0",
    "1",
    "2",
    "8"
   ]
  },
  {
   "department": "Council on Aging",
   "forms": [
    "0",
    "1",
    "2",
    "9"
   ]
  },
  {
   "department": "Council on Aging",
   "forms": [
    "0",
    "0",
    "2",
    "2"
   ]
  },
  {
   "department": "Council on Aging",
   "forms": [
    "0",
    "1",
    "2",
    "2"
   ]
  },
  {
   "department": "Council on Aging",
   "forms": [
    "0",
    "2",
    "2",
    "2"
   ]
  },
  {
   "department": "Council on Aging",
   "forms": [
    "0",
    "2",
    "2",
    "4"
   ]
  },
  {
   "department": "Council on Aging",
   "forms": [
    "0",
    "2",
    "2",
    "5"
   ]
  },
  {
   "department": "Department of Public Works",
   "forms": [
    "0",
    "2",
    "2",
    "4"
   ]
  },
  {
   "department": "Department of Public Works",
   "forms": [
    "0",
    "2",
    "2",
    "5"
   ]
  },
  {
   "department": "Fire Department",
   "forms": [
    "0",
    "1",
    "2",
    "7"
   ]
  },
  {
   "department": "Fire Department",
   "forms": [
    "0",
    "1",
    "2",
    "8"
   ]
  },
  {
   "department": "Fire Department",
   "forms": [
    "0",
    "1",
    "2",
    "9"
   ]
  },
  {
   "department": "Fire Department",
   "forms": [
    "0",
    "0",
    "2",
    "2"
   ]
  },
  {
   "department": "Fire Department",
   "forms": [
    "0",
    "1",
    "2",
    "2"
   ]
  },
  {
   "department": "Fire Department",
   "forms": [
    "0",
    "2",
    "2",
    "2"
   ]
  },
  {
   "department": "Fire Department",
   "forms": [
    "0",
    "2",
    "2",
    "3"
   ]
  },
  {
   "department": "Fire Department",
   "forms": [
    "0",
    "2",
    "2",
    "4"
   ]
  },
  {
   "department": "Fire Department",
   "forms": [
    "0",
    "2",
    "2",
    "5"
   ]
  },
  {
   "department": "Information Technology",
   "forms": [
    "0",
    "1",
    "2",
    "6"
   ]
  },
  {
   "department": "Information Technology",
   "forms": [
    "0",
    "1",
    "2",
    "7"
   ]
  },
  {
   "department": "Information Technology",
   "forms": [
    "0",
    "0",
    "2",
    "2"
   ]
  },
  {
   "department": "Library",
   "forms": [
    "0",
    "1",
    "2",
    "9"
   ]
  },
  {
   "department": "Information Technology",
   "forms": [
    "0",
    "1",
    "2",
    "8"
   ]
  },
  {
   "department": "Board of Assessors",
   "forms": [
    "0",
    "2",
    "2",
    "3"
   ]
  },
  {
   "department": "Council on Aging",
   "forms": [
    "0",
    "2",
    "2",
    "3"
   ]
  },
  {
   "department": "Department of Public Works",
   "forms": [
    "0",
    "2",
    "2",
    "3"
   ]
  },
  {
   "department": "Fire Department",
   "forms": [
    "0",
    "1",
    "1",
    "2"
   ]
  },
  {
   "department": "Fire Department",
   "forms": [
    "0",
    "1",
    "2",
    "2"
   ]
  },
  {
   "department": "Police Department",
   "forms": [
    "0",
    "1",
    "2",
    "2"
   ]
  },
  {
   "department": "Fire Department",
   "forms": [
    "0",
    "1",
    "2",
    "3"
   ]
  },
  {
   "department": "Police Department",
   "forms": [
    "0",
    "1",
    "2",
    "3"
   ]
  },
  {
   "department": "Fire Department",
   "forms": [
    "0",
    "1",
    "2",
    "4"
   ]
  },
  {
   "department": "Police Department",
   "forms": [
    "0",
    "1",
    "2",
    "4"
   ]
  },
  {
   "department": "Fire Department",
   "forms": [
    "0",
    "1",
    "2",
    "5"
   ]
  },
  {
   "department": "Police Department",
   "forms": [
    "0",
    "1",
    "2",
    "5"
   ]
  },
  {
   "department": "Fire Department",
   "forms": [
    "0",
    "1",
    "2",
    "6"
   ]
  },
  {
   "department": "Police Department",
   "forms": [
    "0",
    "1",
    "2",
    "6"
   ]
  },
  {
   "department": "Police Department",
   "forms": [
    "0",
    "1",
    "2",
    "7"
   ]
  },
  {
   "department": "Police Department",
   "forms": [
    "0",
    "1",
    "2",
    "8"
   ]
  },
  {
   "department": "Police Department",
   "forms": [
    "0",
    "1",
    "2",
    "9"
   ]
  },
  {
   "department": "Police Department",
   "forms": [
    "0",
    "0",
    "2",
    "2"
   ]
  },
  {
   "department": "Police Department",
   "forms": [
    "0",
    "1",
    "2",
    "2"
   ]
  },
  {
   "department": "Police Department",
   "forms": [
    "0",
    "2",
    "2",
    "2"
   ]
  },
  {
   "department": "Police Department",
   "forms": [
    "0",
    "2",
    "2",
    "3"
   ]
  },
  {
   "department": "Police Department",
   "forms": [
    "0",
    "2",
    "2",
    "4"
   ]
  },
  {
   "department": "Police Department",
   "forms": [
    "0",
    "2",
    "2",
    "5"
   ]
  }
 ],
 "roster": [
  {
   "agrees": "",
   "department": "Fire Department",
   "fy": "2011",
   "named": 36,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "",
   "department": "Fire Department",
   "fy": "2012",
   "named": 39,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "",
   "department": "Police Department",
   "fy": "2012",
   "named": 13,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "",
   "department": "Fire Department",
   "fy": "2013",
   "named": 42,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "",
   "department": "Police Department",
   "fy": "2013",
   "named": 17,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "",
   "department": "Fire Department",
   "fy": "2014",
   "named": 45,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "",
   "department": "Police Department",
   "fy": "2014",
   "named": 26,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "",
   "department": "Fire Department",
   "fy": "2015",
   "named": 46,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "",
   "department": "Police Department",
   "fy": "2015",
   "named": 14,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "",
   "department": "Fire Department",
   "fy": "2016",
   "named": 40,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "",
   "department": "Police Department",
   "fy": "2016",
   "named": 19,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "yes",
   "department": "Fire Department",
   "fy": "2017",
   "named": 44,
   "stated_high": 50,
   "stated_low": 45
  },
  {
   "agrees": "",
   "department": "Police Department",
   "fy": "2017",
   "named": 25,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "no",
   "department": "Fire Department",
   "fy": "2018",
   "named": 42,
   "stated_high": 52,
   "stated_low": 47
  },
  {
   "agrees": "",
   "department": "Police Department",
   "fy": "2018",
   "named": 25,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "no",
   "department": "Fire Department",
   "fy": "2019",
   "named": 40,
   "stated_high": 52,
   "stated_low": 47
  },
  {
   "agrees": "",
   "department": "Police Department",
   "fy": "2019",
   "named": 33,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "no",
   "department": "Fire Department",
   "fy": "2020",
   "named": 42,
   "stated_high": 52,
   "stated_low": 47
  },
  {
   "agrees": "",
   "department": "Police Department",
   "fy": "2020",
   "named": 20,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "no",
   "department": "Fire Department",
   "fy": "2021",
   "named": 39,
   "stated_high": 53,
   "stated_low": 48
  },
  {
   "agrees": "",
   "department": "Police Department",
   "fy": "2021",
   "named": 22,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "no",
   "department": "Fire Department",
   "fy": "2022",
   "named": 12,
   "stated_high": 45,
   "stated_low": 40
  },
  {
   "agrees": "",
   "department": "Police Department",
   "fy": "2022",
   "named": 26,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "yes",
   "department": "Fire Department",
   "fy": "2023",
   "named": 39,
   "stated_high": 45,
   "stated_low": 40
  },
  {
   "agrees": "",
   "department": "Police Department",
   "fy": "2023",
   "named": 25,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "no",
   "department": "Fire Department",
   "fy": "2024",
   "named": 36,
   "stated_high": 45,
   "stated_low": 40
  },
  {
   "agrees": "",
   "department": "Police Department",
   "fy": "2024",
   "named": 25,
   "stated_high": "",
   "stated_low": ""
  },
  {
   "agrees": "no",
   "department": "Fire Department",
   "fy": "2025",
   "named": 35,
   "stated_high": 45,
   "stated_low": 40
  },
  {
   "agrees": "",
   "department": "Police Department",
   "fy": "2025",
   "named": 29,
   "stated_high": "",
   "stated_low": ""
  }
 ],
 "school_detail": {
  "by_position": [
   {
    "people": 72,
    "position": "Classroom Teacher"
   },
   {
    "people": 51,
    "position": "Paraprofessional"
   },
   {
    "people": 41,
    "position": "(unmapped)"
   },
   {
    "people": 11,
    "position": "Custodial / Facilities"
   },
   {
    "people": 10,
    "position": "Specialist Teacher"
   },
   {
    "people": 8,
    "position": "Food Service"
   },
   {
    "people": 6,
    "position": "Speech / OT / PT"
   },
   {
    "people": 5,
    "position": "Administrative Staff"
   },
   {
    "people": 5,
    "position": "Guidance / Adjustment Counselor"
   },
   {
    "people": 5,
    "position": "Assistant Principal"
   },
   {
    "people": 4,
    "position": "Nurse"
   },
   {
    "people": 4,
    "position": "Special Education Teacher"
   },
   {
    "people": 3,
    "position": "Principal"
   },
   {
    "people": 3,
    "position": "Department Head"
   },
   {
    "people": 2,
    "position": "School Psychologist"
   },
   {
    "people": 2,
    "position": "Director"
   },
   {
    "people": 1,
    "position": "Behaviour / BCBA"
   }
  ],
  "by_school": [
   {
    "people": 73,
    "school": "primary"
   },
   {
    "people": 62,
    "school": "high"
   },
   {
    "people": 60,
    "school": "turkey-hill"
   },
   {
    "people": 49,
    "school": "middle"
   }
  ],
  "district": 232,
  "fy": "2025",
  "sums_to": 244
 },
 "sources": [
  {
   "basis": "published",
   "note": "Read by scripts/extract_personnel.py. A post that states no membership and no term is an officer rather than a board seat — the town’s own distinction, not ours.",
   "what": "Every appointed post and its holder, FY2016 to FY2025",
   "where": "the APPOINTED OFFICIALS listing in each annual town report"
  },
  {
   "basis": "published",
   "note": "Read by scripts/extract_department_staffing.py. Stored as printed, because the forms do not agree with each other and may not be summed. Eight forms so far, and the department head chooses: a list of names, an establishment post by post, the same establishment written one article at a time, a career count beside an on-call range, a number spelled out in words, and — the Library’s only one — a headcount in an aside inside a sentence about turnover.",
   "what": "What each department says it employs",
   "where": "the prose of each department’s own report; no heading names it in any year"
  },
  {
   "basis": "published",
   "note": "Read by scripts/extract_department_rosters.py, from the WORD geometry because a line box spans both columns.",
   "what": "The Police and Fire rosters, by name",
   "where": "the Police `Department Personnel` and Fire `Roster of the Lunenburg Fire Department` pages, both set in two columns"
  }
 ],
 "staffing": [
  {
   "career": "2",
   "department": "Board of Assessors",
   "fy": "2023",
   "measure": "an establishment, one post at a time",
   "on_call_high": "",
   "on_call_low": "",
   "page": "45",
   "parsed": "yes",
   "positions": "Principal Assessor; Assessors Clerk",
   "statement": "assessing board members). In the Town of Lunenburg, the Assessor's office staff consists of a full time Principal Assessor and a full time Assessors Clerk."
  },
  {
   "career": "14",
   "department": "Department of Public Works",
   "fy": "2023",
   "measure": "establishment, post by post",
   "on_call_high": "",
   "on_call_low": "",
   "page": "65",
   "parsed": "yes",
   "positions": "1 Director; 1 Executive Assistant; 1 Highway Superintendent; 5 Heavy Equipment Operators; 1 Mechanic; 1 Cemetery Superintendent; 2 Seasonal Cemetery Laborers; 1 Sewer Business Manager; 1 Assistant",
   "statement": "of life for the citizens of Lunenburg. The staff consists of one Director, one Executive Assistant (shared with the Facilities Department), one Highway Superintendent, 5 Heavy Equipment Operators, one Mechanic, one Cemetery Superintendent, two Seasonal Cemetery Laborers, one Sewer Business Manager, and one Assistant to the Sewer Business Manager."
  },
  {
   "career": "14",
   "department": "Department of Public Works",
   "fy": "2024",
   "measure": "establishment, post by post",
   "on_call_high": "",
   "on_call_low": "",
   "page": "49",
   "parsed": "yes",
   "positions": "1 Director; 1 Executive Assistant; 1 Highway Superintendent; 3 Heavy Equipment Operators; 2 Driver; 1 Mechanic; 1 Cemetery Superintendent; 2 Seasonal Cemetery Laborers; 1 Sewer Business Manager; 1 Assistant",
   "statement": "welfare of the citizens of Lunenburg. The staff consists of one Director, one Executive Assistant (shared with the Facilities Department), one Highway Superintendent, 3 Heavy Equipment Operators, 2 Driver/Laborers, one Mechanic, one Cemetery Superintendent, two Seasonal Cemetery Laborers, one Sewer Business Manager, and one Assistant to the Sewer Business Manager."
  },
  {
   "career": "3",
   "department": "Board of Assessors",
   "fy": "2025",
   "measure": "an establishment, one post at a time",
   "on_call_high": "",
   "on_call_low": "",
   "page": "33",
   "parsed": "yes",
   "positions": "Principal Assessor; Data Collector; Assessing Administrative Assistant",
   "statement": "• We continue to be fully staffed after several years of being understaffed. Our staff includes a full time Principal Assessor, a 19-hour Data Collector and a 32-hour Assessing Administrative Assistant."
  },
  {
   "career": "14",
   "department": "Department of Public Works",
   "fy": "2025",
   "measure": "establishment, post by post",
   "on_call_high": "",
   "on_call_low": "",
   "page": "48",
   "parsed": "yes",
   "positions": "1 Director; 1 Executive Assistant; 1 Highway Superintendent; 3 Heavy Equipment Operators; 2 Driver; 1 Mechanic; 1 Cemetery Superintendent; 2 Seasonal Cemetery Laborers; 1 Sewer Business Manager; 1 Assistant",
   "statement": "Our staff includes one Director, one Executive Assistant (shared with Facilities), one Highway Superintendent, three Heavy Equipment Operators, two Driver/Laborers, one Mechanic, one Cemetery Superintendent, two Seasonal Cemetery Laborers, one Sewer Business Manager, and one Assistant to the Sewer Business Manager."
  }
 ],
 "stats": [
  {
   "label": "school staff — more than twice as many as everywhere else that publishes a count, put together",
   "value": "232"
  },
  {
   "label": "in the other eight parts of the town that publish a count, added up",
   "value": "114"
  },
  {
   "label": "parts of the town that publish any staff count at all",
   "tone": "var(--series-cost)",
   "value": "9 of 60"
  }
 ],
 "tenure": [
  {
   "first_fy": 2011,
   "kind": "school",
   "last_fy": 2025,
   "longest": 15,
   "longest_person": "Alexis Pukaite",
   "median_all": 2.0,
   "median_settled": 1,
   "people": 968,
   "published_years": 15,
   "settled": 577,
   "still_there": 233,
   "turnover": 0.3327,
   "unit": "Lunenburg Public Schools"
  },
  {
   "first_fy": 2011,
   "kind": "department",
   "last_fy": 2027,
   "longest": 16,
   "longest_person": "Austin Flagg",
   "median_all": 4.0,
   "median_settled": 2,
   "people": 122,
   "published_years": 16,
   "settled": 49,
   "still_there": 44,
   "turnover": 0.2466,
   "unit": "Fire Department"
  },
  {
   "first_fy": 2012,
   "kind": "department",
   "last_fy": 2027,
   "longest": 15,
   "longest_person": "Jeffrey Thibodeau",
   "median_all": 2.0,
   "median_settled": 1,
   "people": 90,
   "published_years": 15,
   "settled": 49,
   "still_there": 27,
   "turnover": 0.2919,
   "unit": "Police Department"
  },
  {
   "first_fy": 2011,
   "kind": "department",
   "last_fy": 2025,
   "longest": 13,
   "longest_person": "Susan Doherty",
   "median_all": 4.0,
   "median_settled": 2,
   "people": 26,
   "published_years": 13,
   "settled": 9,
   "still_there": 11,
   "turnover": 0.2019,
   "unit": "Council on Aging (staff)"
  },
  {
   "first_fy": 2016,
   "kind": "department",
   "last_fy": 2027,
   "longest": 10,
   "longest_person": "Richard Patry",
   "median_all": 1.0,
   "median_settled": 2,
   "people": 22,
   "published_years": 11,
   "settled": 5,
   "still_there": 13,
   "turnover": 0.2439,
   "unit": "Department of Public Works"
  },
  {
   "first_fy": 2016,
   "kind": "department",
   "last_fy": 2027,
   "longest": 10,
   "longest_person": "Gary Williams",
   "median_all": 2.5,
   "median_settled": 2.5,
   "people": 20,
   "published_years": 11,
   "settled": 6,
   "still_there": 7,
   "turnover": 0.2462,
   "unit": "Building Department"
  },
  {
   "first_fy": 2016,
   "kind": "department",
   "last_fy": 2027,
   "longest": 9,
   "longest_person": "Heather R. Lemieux",
   "median_all": 1,
   "median_settled": 5,
   "people": 17,
   "published_years": 11,
   "settled": 5,
   "still_there": 4,
   "turnover": 0.2281,
   "unit": "Town Manager"
  },
  {
   "first_fy": 2013,
   "kind": "school",
   "last_fy": 2025,
   "longest": 7,
   "longest_person": "Thomas R. Browne",
   "median_all": 1.0,
   "median_settled": 1.0,
   "people": 8,
   "published_years": 10,
   "settled": 6,
   "still_there": 1,
   "turnover": 0.5333,
   "unit": "Montachusett Regional Vocational Technical School"
  },
  {
   "first_fy": 2016,
   "kind": "department",
   "last_fy": 2027,
   "longest": 4,
   "longest_person": "Daniel Nadareski",
   "median_all": 3.0,
   "median_settled": 1,
   "people": 6,
   "published_years": 5,
   "settled": 1,
   "still_there": 1,
   "turnover": 0.3333,
   "unit": "Information Technology"
  },
  {
   "first_fy": 2016,
   "kind": "department",
   "last_fy": 2027,
   "longest": 11,
   "longest_person": "Kathyrn M. Herrick",
   "median_all": 2.0,
   "median_settled": 2.0,
   "people": 6,
   "published_years": 11,
   "settled": 4,
   "still_there": 2,
   "turnover": 0.16,
   "unit": "Town Clerk"
  },
  {
   "first_fy": 2023,
   "kind": "department",
   "last_fy": 2027,
   "longest": 2,
   "longest_person": "Angela Clement",
   "median_all": 1,
   "median_settled": null,
   "people": 5,
   "published_years": 3,
   "settled": 0,
   "still_there": 4,
   "turnover": 0.5,
   "unit": "Facilities, Grounds & Recreation"
  }
 ],
 "years": [
  "2016",
  "2017",
  "2018",
  "2019",
  "2020",
  "2021",
  "2022",
  "2023",
  "2024",
  "2025"
 ]
}
