Small and sparse schools — how it works

This part of the site is built differently from the rest, and the differences matter. Read this before you quote anything fromthe candidate page.

This part can't make the promise the rest of the site rests on.

Everywhere else, the strongest thing we can say is: the engine matches the state's published numbers, and here are the tests. Here there is nothing to match. The Agency of Education has made no small-or-sparse-by-necessity decisions, so no test in this part checks our math against the State's. The tests inmodel/goldens/small-sparse/ are hand-worked edge cases against guessed cutoffs, and a green run means the math is right given a guess. That is worth having. It is not worth more than that.

Two tests and a decision

Act 73 of 2025, Sec. 37 creates two grants. The tests are simple math: fewer students than a cutoff, and a town whose people-per-square-mile is below a cutoff, measured overland only. Land versus total area is not nitpicking — some Vermont towns are one-third water, and dividing by total area makes them look emptier than they are and sweeps them into grants they should not get. One of our tests fails on purpose if anyone swaps the measure.

Qualifying is a different thing from passing the tests, and almost all the judgment lives in the gap between them. A school qualifies only if it is small or sparseby necessity — because of where it is or how cut off it is, not because of a local choice. That decision belongs to the Agency of Education, each year, under rules folded into the Education Quality Standards. Those rules do not exist. Until they do, necessity is undetermined for every school in Vermont.

The two locks, and why one is not enough

A dollar amount on this part has to pass two separate locks, and neither one stands in for the other.

  1. The number lock, which the whole site has. The engine refuses to do math with a legal number that has not been checked against the current law.
  2. The eligibility lock, which only this part has. Even with every number checked, no school qualifies until AOE says so. So a grant amount appears only when someone states the basis for it — either a published agency decision, or a guess you state yourself, which is carried word-for-word next to every number built from it and into any link you share.

On purpose, there is no path in the code from "passes both tests" straight to a dollar amount. A test checks this across every mix of test results, student count, and enrollment basis, and it is there so that anyone who later mistakes this block for a bug and "fixes" it finds out loudly, before a number reaches a page.

What is law and what is a proposal

This part pulls from two sources with different checking rules, and mixing them up would turn the site's own rule backwards — treating a proposal as if it were law.

The 17 legal numbers come from Act 73 as amended. Every one is blank and unchecked. We cite the act as passed rather than the tidied-up statute section, because these parts only take effect if certain conditions are met, and Vermont Statutes Online may not show them yet.

The 12 framework numbers record what the State Board's special committee proposed on 17 December 2025. They are markedproposed, not yet law wherever they appear, and anything measured against them is labeled as measured against a proposed standard. They are also still unchecked, for a clear reason: the committee's slides are not yet saved as a fingerprinted file in intake/, because education.vermont.gov blocks automated downloads and it needs a save by hand. Under our source-tracking rule, that difference is the whole point.

The five necessity rules stand on their own and aren't scored

Each rule the committee proposed reads "a school qualifies if," so any one of them is enough on its own — they are not a checklist. The committee proposed no scoring, weighting, or ranking, and the engine adds none — a combined score would be an opinion dressed up as a calculation.

One of the five can be partly worked out: the road distance to the nearest school with the same grades, against a proposed 10-to-15-mile range whose basis is "terrain" — which the plan never defines. The engine reports against both ends of the range and returns "can't tell" in between, instead of splitting the difference at 12.5, because picking a middle point would invent the rule the committee chose not to write.

The other four can't be worked out from public data, ever:

These are correct final answers, not holes in our coverage. That is why they get their own kind of blank instead of being counted as work still to do.

The building-cost question

Two of the five rules turn on whether fixing up the school that takes in the students would cost more than closing saves. The plan does not say whether to count those costs before or after school building aid — which Act 170 pays at up to 75 percent for merged districts, against 30 percent otherwise.

Counting after aid, merging lowers what a district pays to expand the receiving school, makes closing look cheaper, and so weakens the case that its own small schools exist by necessity. Counting before aid, the merger choice does not touch the test. Same school, same numbers, opposite answer. So which basis to use is a required input with no default, and it is shown with any result it produced.

Where the map facts come from

The big-picture questions, which matter more than any number

Checking a number catches a wrong number. It does not catch a wrong shape, and these are the shapes this part is guessing at. We record them right on the numbers themselves, so the warning sits where the editing happens.

statutory.grants.small_school.pupil_count_basis
Legal values are two_year_average and single_year. Read against statutory.screens.small_enrollment.comparator: if the QUALIFYING test and the PAYMENT basis use different enrollment figures, borderline schools qualify under one frame and are paid under the other, and the divergence is publishable in its own right.
statutory.grants.small_school.inflation_index
Read whether the index reaches the SPARSE grant as well. Secondary sources describe indexing for one and are silent on the other, which may be an artifact of the summary or may be the statute. Read it against the base education amount's index too: if they differ, that is itself a finding.
statutory.grants.stacking_rule
STRUCTURAL, not merely numeric. Legal values are additive, greater_of and mutually_exclusive. A school under the enrollment threshold in a town under the density threshold appears to meet both screens. Under the secondary readings the spread between additive and greater-of is roughly 60% on the line item, concentrated in exactly the schools most exposed in the March 2028 votes. Until this is read the engine emits separate lines and no total. Record the finding in the header of model/src/small-sparse.ts in the same commit as the reading.
statutory.screens.small_enrollment.comparator
Legal values are lt and lte. A school sitting exactly on the threshold qualifies under one and not the other, which is not a rounding question: Vermont has schools at exactly 100. Read the comparator, then assert it in a golden fixture at the boundary.
statutory.screens.small_enrollment.basis
Legal values are two_year_average and single_year. The secondary sources CONFLICT: the AOE summary describes a school that enrolls fewer than 100, the JFO briefing a two-year average below 100. Until this is read the basis is a scenario input with no default, and the schools whose status differs between the two readings are themselves a finding.
statutory.screens.sparse_density.geography
STRUCTURAL, and the single reading most likely to invalidate this layer's shape. Legal values are municipality_of_school_location, district_member_towns and other. Whether the test looks at the town the school building sits in or at the district's member towns changes which schools are candidates, and a district-level reading would be wrong for every school in a district containing one dense town. If it turns out to be district_member_towns, a school-level model is the wrong shape and most of this layer needs rebuilding -- so read this phrase before building anything on top of it.
statutory.screens.sparse_density.area_measure
Legal values are land_area and total_area. The secondary sources say "of land". If that is the statutory wording, use Census TIGER ALAND. Total area understates density and wrongly pulls lakeside and pond-heavy towns into eligibility, so this is a real correctness question and not a pedantic one. Verify the exact phrase, then assert it in a golden fixture -- there is one in model/goldens/small-sparse/ that fails if anyone swaps the measure.
statutory.screens.sparse_density.population_series
Legal values are decennial, acs_5yr, state_estimate and unspecified_in_statute. If the statute names no series, then unspecified_in_statute is the correct VERIFIED value and the choice becomes a user-visible scenario input with no default rather than an implementation detail. Compute both and publish the towns that move between them.
statutory.determination.rules_due_date
Computes nothing, and is still worth reading early: it drives the rulemaking comment deadline, and a missed comment window is unrecoverable in a way a missed number is not.
framework.logic
Each criterion is framed this way, so they read as independent sufficient paths rather than as a checklist to be scored. Unverified because the presentation is not yet a hashed intake artifact.
framework.organizing_principle
Carries no value: it is the framing the criteria hang off, quoted so a reader can see the line the committee drew between circumstance and choice.
framework.criteria.travel_time_or_distance.travel_time_one_way_minutes.grades_7_12
The thresholds split at grade 7 and the framework says nothing about a K-8 or K-12 school, of which Vermont has many. The engine applies the stricter elementary threshold to a straddling span and flags it rather than picking the one that produces a more convenient answer. This is a rulemaking comment.
framework.criteria.travel_time_or_distance.road_miles_to_nearest_same_grade_span
A range with an undefined basis, and it keeps a range rather than becoming a point value, exactly as the verification checklist prescribes for the JFO ranges. The engine reports against both ends and returns indeterminate in between; picking 12.5 would invent the terrain rule the committee declined to write.
framework.criteria.safe_transportation
Terminal: not computable from public data, and correctly so. Single ingress is arguably detectable from a road network, but detecting a candidate is not certifying a condition, and publishing the former as the latter would substitute our judgment for the supervisory union's.
framework.criteria.feasible_consolidation
Requires a local model: building capacity and project estimates are local and not published statewide. The second limb also depends on framework.open_questions.capital_cost_basis, which the framework does not resolve.
framework.criteria.population_trajectory
CONSEQUENCE FOR THE UI. This criterion decouples eligibility from current headcount: a school above the enrollment threshold today is not thereby excluded. The enrollment screen is therefore a candidate filter and not a gate, and the site must not present it as one. "Viable larger school" is undefined. Requires a projection.
framework.criteria.closure_cost_increase
Requires a local model. The quoted limbs contain the phrase "projected savings from closure"; the word appears in this repository only inside that quotation. The engine's field is a signed closure cost delta presented in both directions, per README rule 3.
framework.determination_process
No rules exist and no determinations have been published. The determination status is `undetermined` for every school in Vermont as of this file's drafting, and that is the State's position rather than a gap in our data.
framework.open_questions.capital_cost_basis
HIGH SEVERITY, and the best rulemaking comment available. Act 170 pays up to 75% of construction costs for merged districts against 30% otherwise. On a NET-of-aid basis, merging shrinks the district's cost of expanding a receiving school, makes closure look cheaper, and thereby weakens the case that the district's own small schools exist by necessity. On a GROSS basis the merger decision does not touch the test. Same school, same numbers, opposite answer. Legal values are gross_project_cost and net_of_construction_aid; there is no default, the scenario states which it used, and the result displays it.
framework.open_questions.grade_span_straddling
The engine applies the stricter elementary threshold and flags the school. Recorded as an open question rather than silently resolved, because Vermont has many K-8 and K-12 schools and the choice is not ours to make.

Computed against model/parameters/fy2030-small-sparse.yaml.