The Lunenburg Budget Project·The database
Lunenburg Budget Project · Data architecture

The database, table by table

Every table, what it holds, and which years it covers.

81
tables
16
views
70,234
rows
983
columns
79%
columns described
School money and school subjects28 tables · 33,557 rows

The district's budget, its own funds, and what the town publishes about its schools.

Tier 1 · totalswhat was appropriated and what is left, by department

school_special_revenue_fy26_q3 school Tier 1 · totals fact 62 rowsone row per school fund

The schools' own funds at one moment (FY26 period 9): per fund, revenue received, salaries paid, other expenditure, encumbered, and the balance left. Dollars.

columntypewhat it is
fundTEXTThe MUNIS fund number.
School money spans 13xx, 15xx, 22xx and 26xx-29xx. There is no single range that means school.
nameTEXTThe name as the source prints it.
MUNIS truncates account names to ten characters.
revenueTEXTMoney received into the fund. dollars
Not the same quantity as spending, and the two must never be added.
salariesTEXTThe salary portion of the fund's spending. dollars
expenditureTEXTThe non-salary portion of the fund's spending. dollars
encumberedTEXTCommitted by purchase order but not yet spent. dollars
balanceTEXTnot described yet

First 3 rows, in rowid order:

fundnamerevenuesalariesexpenditureencumberedbalance
2748FY24 117 EVIDENCE-0.00.00.00.0-0.0
2653FY24 FAMILY & COMMUNITY #237-0.00.00.00.0433.7
2582EECBG ENERGY EFFICIENCY GRANT-0.00.00.00.0316.48
total_expenses_history school Tier 1 · totals fact 28 rows 2014–2027one row per year per stage

One dollar total per year per stage — the district's own stated total expenses, as each document states it.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
stageTEXTWhat the figure IS: proposed, settled, or actual.
Rule 1. A rate measured from one stage to another is partly growth and partly the step between them.
totalTEXTThe row's total, as printed. dollars
documents_disagreeTEXTTwo documents state different figures for the same thing.
Kept rather than resolved: which is right is often not established.

First 3 rows, in rowid order:

fystagetotaldocuments_disagree
2018settled60342601
2022proposed60087050
2026settled91699820
total_salaries_history school Tier 1 · totals fact 28 rows 2014–2027one row per year per stage

One dollar total per year per stage — the district's own stated total salaries.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
stageTEXTWhat the figure IS: proposed, settled, or actual.
Rule 1. A rate measured from one stage to another is partly growth and partly the step between them.
totalTEXTThe row's total, as printed. dollars
documents_disagreeTEXTTwo documents state different figures for the same thing.
Kept rather than resolved: which is right is often not established.

First 3 rows, in rowid order:

fystagetotaldocuments_disagree
2018proposed133741500
2020proposed144071250
2024proposed162261660

Tier 2 · categorieswhether a category — guidance, special education, transport — is over

budget_figure school the spine Tier 2 · categories fact 9,503 rows 2014–2027one row per line per year per stage per variant

Dollar amounts per budget LINE from the district's budget documents — no counts, no people. Each figure carries the stage it represents (proposed / settled / actual) and, for FY27, which of four whole budget scenarios it belongs to. FY2014–FY2027, 9,503 figures, plus a flag where two documents state different amounts for the same line-year.

Split on stage AND variant. FY27 carries four whole budgets.

columntypewhat it is
line_keyTEXTOur normalised join key for a budget line.
Normalisation differs between budget_figure and workbook_figure — joining them on line_key matches only a fraction. Join on the normalised label instead.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
stageTEXTWhat the figure IS: proposed, settled, or actual.
Rule 1. A rate measured from one stage to another is partly growth and partly the step between them.
variantTEXTWhich whole-budget scenario the figure belongs to.
FY27 has four — Balanced, Core Budget, Level Service, Restoration. Without this you sum all four budgets together.
valueREALThe figure, as printed. dollars
documents_disagreeINTEGERTwo documents state different figures for the same thing.
Kept rather than resolved: which is right is often not established.
doc_idTEXTThe archive path of the document this row's figures came from.
Every fact row carries one. A figure that cannot name its document is not loaded.

First 3 rows, in rowid order:

line_keylabelfystagevariantvaluedocuments_disagreedoc_id
hs librarianH.S. Librarian2027proposedCore Budget55175.00sources/district-budget/text/final-budget-d…
hs library booksH.S. Library Books2017proposedempty0.00sources/district-budget/text/fy18-non-perso…
hs repair p e equipmentH.S. Repair P.E. Equipment2025proposedempty0.00sources/district-budget/text/fy26-school-de…
workbook_figure school the spine Tier 2 · categories fact 3,261 rows 2023, 2024, 2025, 2026, 2027, 2029one row per worksheet row per year per column

The FY27 budget workbook unpivoted to one row per worksheet row × year × column, so every figure is quotable by its spreadsheet coordinate. column_kind says which printed column — final_budget, actual_to_date, encumbered_to_date. Dollars only.

every cell quotable by its row.

columntypewhat it is
rowINTEGERThe worksheet row number in the source spreadsheet.
Rule 13: quotes a coordinate, so a figure can be traced to its cell.
line_keyTEXTOur normalised join key for a budget line.
Normalisation differs between budget_figure and workbook_figure — joining them on line_key matches only a fraction. Join on the normalised label instead.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
column_kindTEXTnot described yet
valueREALThe figure, as printed. dollars
row_kindTEXTnot described yet
doc_idTEXTThe archive path of the document this row's figures came from.
Every fact row carries one. A figure that cannot name its document is not loaded.

First 3 rows, in rowid order:

rowline_keyfycolumn_kindvaluerow_kinddoc_id
139m.s. general school supplies2024actual7475.99linesources/budget-workbooks/fy27-proposals.xlsx
188telephone maintenance/system2026actual_to_date0.0linesources/budget-workbooks/fy27-proposals.xlsx
237executive secretaries/supt.2025actual184375.15linesources/budget-workbooks/fy27-proposals.xlsx
athletics_history school Tier 2 · categories fact 175 rows 2014–2026one row per athletics figure per year

Athletics money from BOTH sides, and these are three different quantities that must never be added: what the town appropriated from the general fund, what the revolving fund took IN, and what the revolving fund SPENT. Dollars per year with the basis and source document for each.

Appropriation, fund revenue and fund spending are three quantities. Never add two of them.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
sideTEXTnot described yet
itemTEXTThe thing being priced or counted.
amountTEXTThe figure, as printed. dollars
basisTEXTWhether a figure is published, contractual, statutory, our measurement or our assumption.
sourceTEXTWhere the figure came from, as the extractor recorded it.
A loose reference — a filename — not a resolved address.

First 3 rows, in rowid order:

fysideitemamountbasissource
2016revolvingAthletic Secretary7796actualdistrict-budget/docs/fy19-proposed-athletic…
2018revolvingTrack and Field Payment40000budgetdistrict-budget/docs/fy19-proposed-athletic…
2020generalAthletic Coaches91601.0actualfy24-approved-budget.txt
budget_line school Tier 2 · categories dimension 688 rowsone row per budget line

The district's LINE LIST — no money at all. One row per budget line with its section, its function group and what kind of line it is. This is the dimension budget_figure and workbook_figure hang their dollars on.

with its section and function group.

columntypewhat it is
line_keyTEXTOur normalised join key for a budget line.
Normalisation differs between budget_figure and workbook_figure — joining them on line_key matches only a fraction. Join on the normalised label instead.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
sectionTEXTThe budget book's own section heading.
function_groupTEXTOur grouping of DESE function codes into readable categories.
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.

First 3 rows, in rowid order:

line_keylabelsectionfunction_groupkind
special ed transp systemSpecial Education Transp - SystemNULLNULLNULL
curriculum adoption/systemCurriculum Adoption/SystemEXPENSES2110 - System Curriculum Adopline
h.s. guidance secretaryH.S. Guidance SecretarySALARIES2710 - Guidance Salariesline
line_history school Tier 2 · categories fact 9,503 rows 2014–2027one row per line per year per stage

Every budget line × year × stage as EXTRACTED, before disagreements between documents are resolved. Dollars. This is the raw reading; budget_figure is the settled one.

every year

columntypewhat it is
keyTEXTThe row's join key.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
stageTEXTWhat the figure IS: proposed, settled, or actual.
Rule 1. A rate measured from one stage to another is partly growth and partly the step between them.
variantTEXTWhich whole-budget scenario the figure belongs to.
FY27 has four — Balanced, Core Budget, Level Service, Restoration. Without this you sum all four budgets together.
valueTEXTThe figure, as printed. dollars
documents_disagreeTEXTTwo documents state different figures for the same thing.
Kept rather than resolved: which is right is often not established.
sourceTEXTWhere the figure came from, as the extractor recorded it.
A loose reference — a filename — not a resolved address.

First 3 rows, in rowid order:

keylabelfystagevariantvaluedocuments_disagreesource
es principal asst prinE.S. Principal/Asst. Prin.2026settledempty2410000final-budget-document.txt
hs nursesH.S. Nurses2017proposedempty681000fy18-personnel-supt-recommended-budget-revi…
plus total revolving fundplus TOTAL Revolving Fund2017actualempty1138190fy19-proposed-athletics-budget.txt
lps_budget_lines school Tier 2 · categories fact 356 rowsone row per budget book line

The district's budget book in ITS OWN shape: one row per line with every year's column side by side (FY23 actual through the four FY27 scenarios) rather than unpivoted. Includes the workbook's own comments column, which is where the district explains a line to itself.

in its own shape and column order.

columntypewhat it is
rowTEXTThe worksheet row number in the source spreadsheet.
Rule 13: quotes a coordinate, so a figure can be traced to its cell.
sectionTEXTThe budget book's own section heading.
function_groupTEXTOur grouping of DESE function codes into readable categories.
line_itemTEXTnot described yet
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
fy23_actualTEXTnot described yet
fy24_actualTEXTnot described yet
fy25_actualTEXTnot described yet
fy25_budgetTEXTnot described yet
fy26_finalTEXTnot described yet
fy26_actual_tdTEXTnot described yet
fy26_encumb_tdTEXTnot described yet
fy27_restorationTEXTnot described yet
fy27_coreTEXTnot described yet
fy27_level_serviceTEXTnot described yet
fy27_balancedTEXTnot described yet
forecast_outyearTEXTnot described yet
restoration_2_24_26TEXTnot described yet
commentsTEXTnot described yet

First 3 rows, in rowid order:

rowsectionfunction_groupline_itemkindfy23_actualfy24_actualfy25_actualfy25_budgetfy26_finalfy26_actual_tdfy26_encumb_tdfy27_restorationfy27_corefy27_level_servicefy27_balancedforecast_outyearrestoration_2_24_26comments
50EXPENSES2210 - H.S. Principals OfficeH.S. Graduation Expensesline7934.718250.658038.5410000.010378.033.351616.6510378.010378.010378.010378.010378.010378.0empty
116EXPENSES2420 - P.S. Instr. EquipmentP.S. Science Supplies (includes STEM)line3329.046357.763332.245290.05222.00.0556.213500.03500.03500.03500.03858.753500.0empty
198EXPENSES4230 - M.S. Repairs4230 - M.S. Repairslineemptyemptyemptyemptyemptyemptyemptyemptyemptyemptyempty1800.0emptyempty
ood_tuition_history school Tier 2 · categories fact 30 rows 2014–2027one row per year per stage

Out-of-district special education tuition in DOLLARS, split private vs collaborative, per year per stage. Not a count of children — placement_counts is that, and the two do not divide into each other.

private and collaborative.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
stageTEXTWhat the figure IS: proposed, settled, or actual.
Rule 1. A rate measured from one stage to another is partly growth and partly the step between them.
privateTEXTnot described yet
collaborativeTEXTChildren placed with an educational collaborative. count
Children, not dollars.
totalTEXTThe row's total, as printed. dollars
documents_disagreeTEXTTwo documents state different figures for the same thing.
Kept rather than resolved: which is right is often not established.

First 3 rows, in rowid order:

fystageprivatecollaborativetotaldocuments_disagree
2017proposed581345741896555340
2019actual7068792516169584950
2021proposed5891561301137192690
sped_para_history school Tier 2 · categories fact 26 rows 2014–2027one row per year per stage

Budgeted DOLLARS for special education paraprofessionals, split by school, per year per stage. A budget line, never a headcount.

A budget line, not a headcount.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
stageTEXTWhat the figure IS: proposed, settled, or actual.
Rule 1. A rate measured from one stage to another is partly growth and partly the step between them.
psTEXTnot described yet
esTEXTnot described yet
msTEXTnot described yet
hsTEXTnot described yet
aceTEXTnot described yet
totalTEXTThe row's total, as printed. dollars
documents_disagreeTEXTTwo documents state different figures for the same thing.
Kept rather than resolved: which is right is often not established.

First 3 rows, in rowid order:

fystagepsesmshsacetotaldocuments_disagree
2018actual16942412204921403013613206416350
2021actual342946129681286383136485248509203450
2026settled4244162251523735902754734374213423730
sped_teacher_history school Tier 2 · categories fact 21 rows 2017–2027one row per year per stage

Budgeted DOLLARS for special education teachers, split by school, per year per stage. A budget line, never a headcount.

A budget line, not a headcount.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
stageTEXTWhat the figure IS: proposed, settled, or actual.
Rule 1. A rate measured from one stage to another is partly growth and partly the step between them.
psTEXTnot described yet
esTEXTnot described yet
msTEXTnot described yet
hsTEXTnot described yet
aceTEXTnot described yet
totalTEXTThe row's total, as printed. dollars
documents_disagreeTEXTTwo documents state different figures for the same thing.
Kept rather than resolved: which is right is often not established.

First 3 rows, in rowid order:

fystagepsesmshsacetotaldocuments_disagree
2021actual5166463621794078953787845764917231530
2021settled5166463621794078953787845764917231530
2022actual5417213425124071454548123104917772390
sped_transport_history school Tier 2 · categories fact 25 rows 2015–2027one row per year per stage

Budgeted DOLLARS for special education transportation, per year per stage.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
stageTEXTWhat the figure IS: proposed, settled, or actual.
Rule 1. A rate measured from one stage to another is partly growth and partly the step between them.
systemTEXTnot described yet
totalTEXTThe row's total, as printed. dollars
documents_disagreeTEXTTwo documents state different figures for the same thing.
Kept rather than resolved: which is right is often not established.

First 3 rows, in rowid order:

fystagesystemtotaldocuments_disagree
2020actual2233502233501
2022proposed2978432978430
2023settled3293603293600

Tier 3 · accountswhat one account spent

fund_1301_cash_journal school Tier 3 · accounts fact 277 rows 2024–2026one row per transaction

TRANSACTIONS — the athletics revolving fund line by line: effective and posting dates, journal, references, vendor, amount, running balance, check and warrant numbers, and the comments the clerk typed. The only transaction-level data in the archive, obtained by records request.

from a records request.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
source_rowTEXTnot described yet
eff_dateTEXTnot described yet
post_dateTEXTnot described yet
srcTEXTnot described yet
src_meaningTEXTnot described yet
periodTEXTMUNIS accounting period: a point in time INSIDE the fiscal year.
A period is not a stage. Period 9 and period 12 are two different reports of the same year; adding them adds one report to the other.
journalTEXTnot described yet
ref1TEXTnot described yet
po_ref2TEXTnot described yet
ref3TEXTnot described yet
referenceTEXTnot described yet
amountTEXTThe figure, as printed. dollars
running_balance_derivedTEXTnot described yet
check_noTEXTnot described yet
warrantTEXTnot described yet
voucherTEXTnot described yet
vendorTEXTnot described yet
commentsTEXTnot described yet

First 3 rows, in rowid order:

fysource_roweff_datepost_datesrcsrc_meaningperiodjournalref1po_ref2ref3referenceamountrunning_balance_derivedcheck_nowarrantvouchervendorcomments
2024202024-05-232024-05-23APPaccounts payable — warrant disbursement1147658 24emptyempty58 24-5504.9149527.630emptyemptyemptyempty
2025842024-08-072024-08-14GRVgeneral journal reversal / correction210612WP24emptyempty2412001378-586.5017029.100emptyemptyemptyTO CORRECT FY
2026132026-04-022026-04-02APPaccounts payable — warrant disbursement104044 26emptyempty44 26-9900.00160044.800emptyemptyemptyempty

Not about moneyCounts, names, dates and documents — everything this archive holds that is not a dollar figure

athletic_fee_schedule school fact 31 rows 2024–2027one row per fee per year

The published fee a family pays to play: dollars per fiscal year × school level × item, with the date it was set and the document that set it. Includes family caps and sibling discounts.

by level and year.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
school_yearTEXTnot described yet
levelTEXTSchool level, where the row is about athletics rather than accounts.
Means something different in account — see that table's entry.
itemTEXTThe thing being priced or counted.
amountTEXTThe figure, as printed. dollars
unitTEXTWhat the figure is counted in.
set_onTEXTThe date the rate or fee was set.
sourceTEXTWhere the figure came from, as the extractor recorded it.
A loose reference — a filename — not a resolved address.
source_fileTEXTThe file the figure was read from.
source_refTEXTWhere in the source the figure sits — a cell, a line, a page.
Rule 13: a coordinate, so a figure can be checked rather than taken.
verifiedTEXTnot described yet

First 3 rows, in rowid order:

fyschool_yearlevelitemamountunitset_onsourcesource_filesource_refverified
20252024-25HSthird_child85.00per student per sport per seasonemptyDistrict athletics workbook, by sport (Town…munis-ledgers/account-details/athletics-by-…Spring!L3Spring!L3
20252024-25MSreduced_fee26.00per student per sport per seasonemptyDistrict athletics workbook, by sport (Town…munis-ledgers/account-details/athletics-by-…Spring!U3Spring!U3
20262025-26HSfull_pay325.00per student per sport per season2025-02-26School Committee minutes, 26 February 2025 …minutes/text/school-committee/2025-02-26-mi…up to $325quoted in source
athletics_by_sport school fact 960 rows 2024–2026one row per sport per season per metric

Per sport × season × level: participation COUNTS and DOLLAR figures mixed in one table, told apart by metric. raw keeps the value exactly as printed and is_numeric says whether it parsed, because some cells are text.

columntypewhat it is
seasonTEXTWhich athletic season.
levelTEXTSchool level, where the row is about athletics rather than accounts.
Means something different in account — see that table's entry.
sportTEXTThe sport.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
metricTEXTWhich quantity this row measures.
valueTEXTThe figure, as printed. dollars
rawTEXTThe value exactly as printed, before parsing.
Rule 13: what the source says, beside what we made of it.
is_numericTEXTWhether the raw value parsed as a number.
cellTEXTThe spreadsheet cell the figure came from.
A coordinate, so the figure can be checked.

First 3 rows, in rowid order:

seasonlevelsportfymetricvaluerawis_numericcell
FallHSBoys CC2024Costs for all 3 SeasonsemptyMIAA 1/3 4550. -1516.670AX6
SpringHSBaseball2025Expected Fees Received4592.54592.51X6
SpringHSSoftball2025Full Pay21.0211F5
athletics_by_sport_reconciliation school provenance 342 rows 2024–2026one row per printed total

Not data — checks. For each total the source prints, what our rows sum to, the difference, and whether it ties.

columntypewhat it is
seasonTEXTWhich athletic season.
scopeTEXTWhose money or whose subject the table is about: school, town, both, state or archive.
both is not a hedge — the ledger and the chart of accounts genuinely carry every department, and splitting them would be inventing a division the source does not make.
metricTEXTWhich quantity this row measures.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
printedTEXTThe total the source itself prints. dollars
printed_cellTEXTWhere that printed total sits.
printed_rawTEXTThe printed total exactly as it appears.
summed_from_rowsTEXTWhat our rows add to. dollars
differenceTEXTOurs less the source's. dollars
tiesTEXTWhether the two agree.

First 3 rows, in rowid order:

seasonscopemetricfyprintedprinted_cellprinted_rawsummed_from_rowsdifferenceties
WinterALLEquipment20242567.2BH232567.22567.20.01
WinterHSCoaches202536133.0AQ163613336133.00.01
WinterHSFull Pay2024118.0E16118118.00.01
grant_award school fact 79 rows 2020, 2021, 2022, 2023, 2024, FY21-24one row per grant per year

Grant AWARDS: name, amount in dollars, who holds it, and the fiscal year — except one ESSER award that genuinely spans FY21–24, which is why fy is TEXT here.

by name and amount.

columntypewhat it is
fyTEXTFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
nameTEXTThe name as the source prints it.
MUNIS truncates account names to ten characters.
amountREALThe figure, as printed. dollars
ownerTEXTWho holds the grant.
documents_disagreeINTEGERTwo documents state different figures for the same thing.
Kept rather than resolved: which is right is often not established.
doc_idTEXTThe archive path of the document this row's figures came from.
Every fact row carries one. A figure that cannot name its document is not loaded.
urlTEXTThe publisher's own address for the document.
sha256TEXTChecksum of our copy.
Here because a file can be replaced at the same URL without the URL changing.

First 3 rows, in rowid order:

fykindnameamountownerdocuments_disagreedoc_idurlsha256
2022federalSpecial Education, 240 Grant399152.0Director of Special Services1fy25-superintendent-39-s-budget-update.txthttps://drive.google.com/file/d/1yJNhIyBLVT…9169e2700def0c1a2b6bebbc55d4e7f737ea5c3a735…
2022federalSpecial Education, AARP8229.0Director of Special Services0fy25-superintendent-39-s-budget-update.txthttps://drive.google.com/file/d/1yJNhIyBLVT…9169e2700def0c1a2b6bebbc55d4e7f737ea5c3a735…
2023stateGrant25000.0empty0fy25-superintendent-39-s-budget-update.txthttps://drive.google.com/file/d/1yJNhIyBLVT…9169e2700def0c1a2b6bebbc55d4e7f737ea5c3a735…
grants_history school fact 79 rows 2020, 2021, 2022, 2023, 2024, FY21-24one row per grant per year

The same awards with their source addresses and checksums, plus whether documents disagree about an amount and whether it is ESSER money.

fy is TEXT — see grant_award.

columntypewhat it is
fyTEXTFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
nameTEXTThe name as the source prints it.
MUNIS truncates account names to ten characters.
amountTEXTThe figure, as printed. dollars
ownerTEXTWho holds the grant.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
docTEXTnot described yet
esserTEXTnot described yet
disagreementTEXTnot described yet
source_urlTEXTnot described yet
our_copyTEXTnot described yet
sha256TEXTChecksum of our copy.
Here because a file can be replaced at the same URL without the URL changing.

First 3 rows, in rowid order:

fykindnameamountownerpagedocesserdisagreementsource_urlour_copysha256
2021federalTitle IV, 309 Grant18466.0Director of Teaching & Learning35fy25-superintendent-39-s-budget-update.txt0emptyhttps://drive.google.com/file/d/1yJNhIyBLVT…https://lunenburgbudgetproject.org/docs/dis…9169e2700def0c1a2b6bebbc55d4e7f737ea5c3a735…
2023federalTitle IV, Grant, 309 Grant12904.0empty16fy24-superintendent-39-s-recommended-budget…0emptyhttps://drive.google.com/file/d/1yJNhIyBLVT…https://lunenburgbudgetproject.org/docs/dis…9169e2700def0c1a2b6bebbc55d4e7f737ea5c3a735…
2024stateArts & Cultural Vitality, 718 Grant5200.0Director of Teaching & Learning32fy25-superintendent-39-s-budget-update.txt0emptyhttps://drive.google.com/file/d/1yJNhIyBLVT…https://lunenburgbudgetproject.org/docs/dis…9169e2700def0c1a2b6bebbc55d4e7f737ea5c3a735…
line_history_coverage school provenance 86 rowsone row per source document

Not figures — a report on extraction. Per source document: how many data rows, how many carried a usable layout, how many fell short of the expected column count, and why a document was or was not usable.

columntypewhat it is
documentTEXTThe source file the figure was read from.
doc_yearTEXTnot described yet
data_rowsTEXTnot described yet
rows_with_layoutTEXTnot described yet
rows_short_of_columnsTEXTnot described yet
figuresTEXTnot described yet
header_lineTEXTnot described yet
header_yearsTEXTnot described yet
header_kindsTEXTnot described yet
doc_dateTEXTnot described yet
coversTEXTnot described yet
reasonTEXTnot described yet

First 3 rows, in rowid order:

documentdoc_yeardata_rowsrows_with_layoutrows_short_of_columnsfiguresheader_lineheader_yearsheader_kindsdoc_datecoversreason
fy21-recommended-budget-presentation-4-22-2…202130000emptyFY20 Budget FY21 Budgetempty2020-04-22FY2020 FY2021header wrapped: line 101 states 2 fiscal ye…
fy23-quarterly-budget-update.txt20231000emptyFY23 Quarterly Budget Update November 11, 2…empty2022-11-11FY2023single-column table: line 3 states one fisc…
school-committee-approved-fy26-budget-perso…20262000emptySchool Committee Approved FY26 BudgetemptyemptyFY2026single-column table: line 2 states one fisc…
line_history_disagreements school provenance 1,497 rows 2014–2027one row per disagreeing reading

One row per disagreeing READING: where two documents state different dollar amounts for the same line-year, both values are kept with their source and the spread between them. Nothing here is resolved.

Kept rather than resolved. Which document is right is often not established.

columntypewhat it is
keyTEXTThe row's join key.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
stageTEXTWhat the figure IS: proposed, settled, or actual.
Rule 1. A rate measured from one stage to another is partly growth and partly the step between them.
variantTEXTWhich whole-budget scenario the figure belongs to.
FY27 has four — Balanced, Core Budget, Level Service, Restoration. Without this you sum all four budgets together.
sourceTEXTWhere the figure came from, as the extractor recorded it.
A loose reference — a filename — not a resolved address.
valueTEXTThe figure, as printed. dollars
is_keptTEXTnot described yet
spreadTEXTnot described yet
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.

First 3 rows, in rowid order:

keylabelfystagevariantsourcevalueis_keptspreadkind
hs general school suppliesH.S. General School Supplies2025proposedemptyfy26-school-dept-approved-budget-3-12-25.txt1600015500documents
maintenance system salariesMaintenance/System Salaries2019proposedemptyfy19-supt-proposed-personnel-budget.txt292184112094documents
ps guidance suppliesP.S. Guidance Supplies2025proposedempty3-12-25-town-manager-39-s-budget.txt250050documents
placement_counts school fact 15 rows 2011–2025one row per year

CHILDREN, not dollars. Students placed outside the district, split collaborative / day / residential, measured on 1 March each year from SIMS Report 7. FY2013–FY2025. Carries its own checks: whether the parts sum to the total, and whether each year agrees with the next year's restatement of it.

split collaborative/day/residential.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
as_ofTEXTThe date the count was taken.
Placement counts are measured on 1 March, not at year end.
totalTEXTThe row's total, as printed. dollars
collaborativeTEXTChildren placed with an educational collaborative. count
Children, not dollars.
dayTEXTChildren in a day placement. count
Children, not dollars.
residentialTEXTChildren in a residential placement. count
Children, not dollars.
collaborative_within_dayTEXTWhether the collaborative count is inside the day count.
collaborative_basisTEXTHow the collaborative figure was arrived at.
report_says_prior_yearTEXTThe prior-year figure this report restates.
Each year states last year's number, which checks the chain.
parts_tieTEXTWhether the parts sum to the printed total.
chain_agreesTEXTWhether this year's report agrees with last year's about last year.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
documentTEXTThe source file the figure was read from.
checksTEXTWhich checks this row passed.

First 3 rows, in rowid order:

fyas_oftotalcollaborativedayresidentialcollaborative_within_daycollaborative_basisreport_says_prior_yearparts_tiechain_agreespagedocumentchecks
20112011-03-0115empty1321subset of day placementsemptyyesn/a35FY2011parts 13+2=15 ties to stated 15
20172017-03-0114284emptyparallel category19yesyes102FY2017parts 2+8+4=14 ties to stated 14; report sa…
20232023-03-017331emptyparallel category8yesyes120FY2023parts 3+3+1=7 ties to stated 7; report says…
report_enrollment_mcas school extract 337 rows 2011–2025one row per printed line

Enrollment counts and MCAS results as the annual reports print them. Mixed measures in ordinal columns; read column_meaning before using any of them.

v1..v8 are ORDINALS. Split on status.

columntypewhat it is
datasetTEXTWhich extract family this row belongs to.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
panelTEXTWhich block of the page this row came from, where a page prints several tables.
Two panels on one page have different column rulers. Summing across panels mixes them.
groupTEXTThe department heading the row sits under, as printed.
A heading governs every row below it until the next one.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
label_missingTEXTThe row's label did not survive extraction.
The figures may still be good. A missing label is not a missing row.
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
row_checkTEXTWhether the row satisfies an identity the table itself states.
derived_cellTEXTA cell we computed from the row's own other cells, recorded here and NEVER written into a v column.
An inference kept out of the readings, on purpose.
table_familyTEXTWhich printed table shape this row came from.
line_noTEXTPosition of the row on the page, counting from the top.
Positional, so it identifies a row within a page and nothing beyond it.
columns_as_printedTEXTThe column headings of this table, verbatim, as that page prints them.
This is what says which printed column v1 actually is. It is the only thing that does.
v1TEXTORDINAL, NOT A COLUMN NAME: the first column of THIS PAGE that held figures. dollars
The ruler is built per page, so v1 on one page and v1 on the next can be different printed columns. Read column_meaning. Summing v1 down a run adds one page's APPROPRIATED to another's TOTAL EXPENDED.
v2TEXTORDINAL: the second column of this page that held figures. dollars
See v1.
v3TEXTORDINAL: the third column of this page that held figures. dollars
See v1.
v4TEXTORDINAL: the fourth column of this page that held figures. dollars
See v1.
v5TEXTORDINAL: the fifth column of this page that held figures. dollars
See v1.
v6TEXTORDINAL: the sixth column of this page that held figures. dollars
See v1.
v7TEXTORDINAL: the seventh column of this page that held figures. dollars
See v1.
v8TEXTORDINAL: the eighth column of this page that held figures. dollars
See v1.
n_valuesTEXTHow many money cells this row actually carried. count
Fewer than the table's column count means blank cells, and which ones were blank is positional.
ruler_spannedTEXTThe column ruler could not cut this row cleanly.
Flagged rather than dropped: a dropped row shifts nothing and is invisible.
repaired_cellsTEXTCells we corrected, and what the correction was.
A repair is a change we made to a reading. It is recorded so it can be disputed.
unparsed_cellsTEXTCells we could not read.
Kept rather than dropped: a dropped cell is invisible.
column_meaningTEXTWhat each ordinal column is, where the table states an identity that fixes it.
Says not established where the table does not fix it, and that is not the same as unknown-and-guessable.
statusTEXTWhether this row's table was CHECKED against a total the report itself prints.
checked, check failed, no check. NOTHING may be aggregated without splitting on this — check failed is not slightly-worse data, it is data whose columns do not sum to the printed total.
reconciliationTEXTThe per-column result of that check: what we summed against what the report printed.

First 3 rows, in rowid order:

datasetfyeditionpagepanelgrouplabellabel_missingkindrow_checkderived_celltable_familyline_nocolumns_as_printedv1v2v3v4v5v6v7v8n_valuesruler_spannedrepaired_cellsunparsed_cellscolumn_meaningstatusreconciliation
enrollment_mcas2012FY2012331Health PromotionPKemptyrowemptyemptyemptyemptyConfirmed 25 | Communicable Disease Number …4341emptyemptyemptyemptyemptyempty2empty0emptyemptyno checkno total printed
enrollment_mcas2014FY2014120emptyemptyemptyemptypage_numberthe page number, not a line of the tableemptyemptyemptyLUNENBURG PRIMARY SCHOOL | 2014-2015 | The …120emptyemptyemptyemptyemptyemptyempty1empty0emptyemptyno checkno total printed
enrollment_mcas2024FY20241091emptyGrade 6 ELAemptyrowemptyemptyemptyemptytrailing figures4940emptyemptyemptyemptyemptyempty2empty0emptyemptyno checkno total printed
report_monty_tech school extract 70 rows 2017–2017one row per printed line

Figures for Montachusett Regional Vocational Technical School as the annual reports print them. A DIFFERENT DISTRICT: Lunenburg pays it an assessment, and its figures must never be added to Lunenburg's own schools.

Monty Tech is a DIFFERENT DISTRICT. Never add it to Lunenburg's schools.

columntypewhat it is
datasetTEXTWhich extract family this row belongs to.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
panelTEXTWhich block of the page this row came from, where a page prints several tables.
Two panels on one page have different column rulers. Summing across panels mixes them.
groupTEXTThe department heading the row sits under, as printed.
A heading governs every row below it until the next one.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
label_missingTEXTThe row's label did not survive extraction.
The figures may still be good. A missing label is not a missing row.
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
row_checkTEXTWhether the row satisfies an identity the table itself states.
derived_cellTEXTA cell we computed from the row's own other cells, recorded here and NEVER written into a v column.
An inference kept out of the readings, on purpose.
table_familyTEXTWhich printed table shape this row came from.
line_noTEXTPosition of the row on the page, counting from the top.
Positional, so it identifies a row within a page and nothing beyond it.
columns_as_printedTEXTThe column headings of this table, verbatim, as that page prints them.
This is what says which printed column v1 actually is. It is the only thing that does.
v1TEXTORDINAL, NOT A COLUMN NAME: the first column of THIS PAGE that held figures. dollars
The ruler is built per page, so v1 on one page and v1 on the next can be different printed columns. Read column_meaning. Summing v1 down a run adds one page's APPROPRIATED to another's TOTAL EXPENDED.
v2TEXTORDINAL: the second column of this page that held figures. dollars
See v1.
v3TEXTORDINAL: the third column of this page that held figures. dollars
See v1.
v4TEXTORDINAL: the fourth column of this page that held figures. dollars
See v1.
v5TEXTORDINAL: the fifth column of this page that held figures. dollars
See v1.
v6TEXTORDINAL: the sixth column of this page that held figures. dollars
See v1.
v7TEXTORDINAL: the seventh column of this page that held figures. dollars
See v1.
v8TEXTORDINAL: the eighth column of this page that held figures. dollars
See v1.
n_valuesTEXTHow many money cells this row actually carried. count
Fewer than the table's column count means blank cells, and which ones were blank is positional.
ruler_spannedTEXTThe column ruler could not cut this row cleanly.
Flagged rather than dropped: a dropped row shifts nothing and is invisible.
repaired_cellsTEXTCells we corrected, and what the correction was.
A repair is a change we made to a reading. It is recorded so it can be disputed.
unparsed_cellsTEXTCells we could not read.
Kept rather than dropped: a dropped cell is invisible.
column_meaningTEXTWhat each ordinal column is, where the table states an identity that fixes it.
Says not established where the table does not fix it, and that is not the same as unknown-and-guessable.
statusTEXTWhether this row's table was CHECKED against a total the report itself prints.
checked, check failed, no check. NOTHING may be aggregated without splitting on this — check failed is not slightly-worse data, it is data whose columns do not sum to the printed total.
reconciliationTEXTThe per-column result of that check: what we summed against what the report printed.

First 3 rows, in rowid order:

datasetfyeditionpagepanelgrouplabellabel_missingkindrow_checkderived_celltable_familyline_nocolumns_as_printedv1v2v3v4v5v6v7v8n_valuesruler_spannedrepaired_cellsunparsed_cellscolumn_meaningstatusreconciliation
monty_tech2017FY2017143emptyDebt Service …Retired Employee Benefits 859,100emptyrowemptyemptyemptyemptyGeneral Fund- Income and Expense Summary | …5250.00821348.00969651.001004045.001068842.0064797.00emptyempty6empty0emptyemptyno checkno total printed
monty_tech2017FY2017143emptyDebt Service …FUNCTION 8000 DEBT RETIREMENT 1,213,204emptysubtotalsubtotal: equals the 2 rows above it, in 4 …emptyemptyemptyGeneral Fund- Income and Expense Summary | …empty1210099.001208628.001204669.001201263.00-3406.00emptyempty5empty0emptyemptyno checkno total printed
monty_tech2017FY2017143emptyDebt Service …Total $24,785,240 $emptysubtotalemptyemptyemptyemptyGeneral Fund- Income and Expense Summary | …empty25548074.0026228813.0026364958.0026895680.00530722.00emptyempty5yes0emptyemptyno checkno total printed
role_classification school dimension 1,030 rowsone row per printed roster title

Our classification of each printed roster title into a role category and grade, with how it was classified. Judgement, recorded so it can be disputed.

columntypewhat it is
role_rawTEXTThe job title exactly as printed.
grade_or_deptTEXTnot described yet
rowsTEXTHow many rows the extract produced. count
role_categoryTEXTnot described yet
role_gradeTEXTnot described yet
classified_byTEXTnot described yet

First 3 rows, in rowid order:

role_rawgrade_or_deptrowsrole_categoryrole_gradeclassified_by
emptyTechnology IT:9technologyemptyheading-technology
Admin. Assistantempty3secretaryemptyclerical
Occup. TherapistSpecialists1specialistemptyheading-specialists
staff_position_map school dimension 534 rowsone row per printed roster title

A lookup, not data: each printed roster title, how many times it was seen, and the position it maps to.

columntypewhat it is
role_as_printedTEXTnot described yet
positionTEXTThe job, classified by us from the printed title.
A roster carries no FTE, so a 0.4 music teacher and a full-timer are one row each.
times_seenTEXTnot described yet

First 3 rows, in rowid order:

role_as_printedpositiontimes_seen
(TLC) Theraputic Learning CenterSpecial Education Teacher1
Aempty2
Music MSSpecialist Teacher1
staff_roster_counts school fact 699 rows 2011–2025one row per school per position per year

Counts of the names above, per school × position × year. A count of names the town printed. It is not a staffing level and cannot be turned into one.

A count of NAMES, with no FTE and no funding source. It is not a staffing level.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
schoolTEXTWhich school, as the roster prints it.
positionTEXTThe job, classified by us from the printed title.
A roster carries no FTE, so a 0.4 music teacher and a full-timer are one row each.
countTEXTHow many. count

First 3 rows, in rowid order:

fyschoolpositioncount
2011primaryClassroom Teacher9
2012high(unmapped)28
2019primary(unmapped)13
staff_roster_entries school fact 3,815 rows 2011–2025one row per person per year

PEOPLE — one row per name the town printed, per year, with the school, the page, the printed job title and our classification of it. FY2011–FY2025, 3,815 entries. No FTE, no salary, no funding source, and undated within the year.

name by name

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
schoolTEXTWhich school, as the roster prints it.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
nameTEXTThe name as the source prints it.
MUNIS truncates account names to ten characters.
role_rawTEXTThe job title exactly as printed.
positionTEXTThe job, classified by us from the printed title.
A roster carries no FTE, so a 0.4 music teacher and a full-timer are one row each.
position_fromTEXTnot described yet
grade_or_deptTEXTnot described yet
lineTEXTnot described yet
documentTEXTThe source file the figure was read from.

First 3 rows, in rowid order:

fyschoolpagenamerole_rawpositionposition_fromgrade_or_deptlinedocument
2014high110Joseph AdamowiczemptyParaprofessionalsection headingParaprofessionals:74120-fy-2014-annual-town-report.pdf
2016primary110Sheila BilottaTeacherClassroom Teacherprinted roleK3284123-fy-2016-annual-town-report.pdf
2019middle131Kathleen HyattemptyParaprofessionalsection headingParaprofessionals254126-fy-2019-annual-town-report.pdf
Town money and town subjects18 tables · 17,762 rows

The other 67 departments, the receipts that fund them, and what the annual reports print about the town.

Tier 1 · totalswhat was appropriated and what is left, by department

annual_report_receipts town Tier 1 · totals extract 1,137 rows 2011–2023one row per revenue line per year

Town REVENUE — every receipt line the annual reports print, by name and amount, per year, FY2011–FY2023. Only five years are checked against the report's own printed total.

as printed.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
sourceTEXTWhere the figure came from, as the extractor recorded it.
A loose reference — a filename — not a resolved address.
amountTEXTThe figure, as printed. dollars
statusTEXTWhether this row's table was CHECKED against a total the report itself prints.
checked, check failed, no check. NOTHING may be aggregated without splitting on this — check failed is not slightly-worse data, it is data whose columns do not sum to the printed total.
documentTEXTThe source file the figure was read from.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.

First 3 rows, in rowid order:

fysourceamountstatusdocumentpage
2015CEMETERIES BURIALS4000.00checked4121-fy-2015-annual-town-report.pdf22
2017MEDICAL RECORDS135.00checked4124-fy-2017-annual-town-report.pdf22
2022DOG LICENSES10670.00checked4129-fy-2022-annual-town-report.pdf26
report_appropriations town Tier 1 · totals extract 4,665 rows 2011 … 2025 (14 years)one row per printed line

APPROPRIATIONS as the annual reports print them — the largest extract here, 4,665 rows across sixteen years. Values sit in ORDINAL columns (v1..v8) whose meaning changes page to page; column_meaning names them where the table states an identity that fixes them, and says not established where it does not.

v1..v8 are ORDINALS. Read column_meaning and split on status.

columntypewhat it is
datasetTEXTWhich extract family this row belongs to.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
panelTEXTWhich block of the page this row came from, where a page prints several tables.
Two panels on one page have different column rulers. Summing across panels mixes them.
groupTEXTThe department heading the row sits under, as printed.
A heading governs every row below it until the next one.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
label_missingTEXTThe row's label did not survive extraction.
The figures may still be good. A missing label is not a missing row.
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
row_checkTEXTWhether the row satisfies an identity the table itself states.
derived_cellTEXTA cell we computed from the row's own other cells, recorded here and NEVER written into a v column.
An inference kept out of the readings, on purpose.
table_familyTEXTWhich printed table shape this row came from.
line_noTEXTPosition of the row on the page, counting from the top.
Positional, so it identifies a row within a page and nothing beyond it.
columns_as_printedTEXTThe column headings of this table, verbatim, as that page prints them.
This is what says which printed column v1 actually is. It is the only thing that does.
v1TEXTORDINAL, NOT A COLUMN NAME: the first column of THIS PAGE that held figures. dollars
The ruler is built per page, so v1 on one page and v1 on the next can be different printed columns. Read column_meaning. Summing v1 down a run adds one page's APPROPRIATED to another's TOTAL EXPENDED.
v2TEXTORDINAL: the second column of this page that held figures. dollars
See v1.
v3TEXTORDINAL: the third column of this page that held figures. dollars
See v1.
v4TEXTORDINAL: the fourth column of this page that held figures. dollars
See v1.
v5TEXTORDINAL: the fifth column of this page that held figures. dollars
See v1.
v6TEXTORDINAL: the sixth column of this page that held figures. dollars
See v1.
v7TEXTORDINAL: the seventh column of this page that held figures. dollars
See v1.
v8TEXTORDINAL: the eighth column of this page that held figures. dollars
See v1.
n_valuesTEXTHow many money cells this row actually carried. count
Fewer than the table's column count means blank cells, and which ones were blank is positional.
ruler_spannedTEXTThe column ruler could not cut this row cleanly.
Flagged rather than dropped: a dropped row shifts nothing and is invisible.
repaired_cellsTEXTCells we corrected, and what the correction was.
A repair is a change we made to a reading. It is recorded so it can be disputed.
unparsed_cellsTEXTCells we could not read.
Kept rather than dropped: a dropped cell is invisible.
column_meaningTEXTWhat each ordinal column is, where the table states an identity that fixes it.
Says not established where the table does not fix it, and that is not the same as unknown-and-guessable.
statusTEXTWhether this row's table was CHECKED against a total the report itself prints.
checked, check failed, no check. NOTHING may be aggregated without splitting on this — check failed is not slightly-worse data, it is data whose columns do not sum to the printed total.
reconciliationTEXTThe per-column result of that check: what we summed against what the report printed.

First 3 rows, in rowid order:

datasetfyeditionpagepanelgrouplabellabel_missingkindrow_checkderived_celltable_familyline_nocolumns_as_printedv1v2v3v4v5v6v7v8n_valuesruler_spannedrepaired_cellsunparsed_cellscolumn_meaningstatusreconciliation
appropriations2014FY20141411Health & Sanitation62 Town Highway Garageemptyrowemptyemptyomnibus-budgetemptyGENERAL FUND APPROPRIATIONS | SUMMARY & CLA…1000.00emptyemptyemptyemptyemptyemptyempty1empty0emptyv1=voted (from the shape of the column, not…check failedvoted: 28,979,584.00 vs 29,079,384.00 (-99,…
appropriations2015FY201528emptyUNCLASSIFIEDChoice Tuitionsemptyrowemptyemptyaccountant-scheduleemptyTOWN OF LUNENBURG | GENERAL FUND APPROPRIAT…531000.00531000.00524349.006651.00emptyemptyemptyempty4empty0emptyv1=appropriated | v2=available | v3=expende…check failedappropriated: 31,922,571.97 vs 32,216,220.5…
appropriations2016FY20161441UnclassifiedGroup Health Insuranceemptyrowemptyemptyomnibus-budgetemptyTOWN OF LUNENBURG | GENERAL FUND APPROPRIAT…1907185.00emptyemptyemptyemptyemptyemptyempty1empty0emptyv1=voted (from the shape of the column, not…check failedvoted: 33,802,373.00 vs 33,802,328.00 (+45.…
revenue_history town Tier 1 · totals fact 504 rows 2014, 2015, 2017, 2018, 2022one row per revenue source per year

The checked subset of the above joined to our classification: the printed name, our normalised key, what KIND of revenue it is (levy, state aid, local receipt, transfer, one-time), the amount, and the document and page it came from. Five years.

with our classification of what KIND it is.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
printed_nameTEXTnot described yet
source_keyTEXTnot described yet
classTEXTOur classification of what KIND of revenue this is.
Says where the money came FROM. It does NOT say what the money went on to pay for — general fund money is fungible and no document apportions it.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
amountREALThe figure, as printed. dollars
documentTEXTThe source file the figure was read from.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.

First 3 rows, in rowid order:

fyprinted_namesource_keyclasslabelamountdocumentpage
2014DISHONORED CHECK FEEDISHONOREDCHECKFEElocalDISHONORED CHECK FEE475.04120-fy-2014-annual-town-report.pdf22
2017POLICE PERMITSPOLICEPERMITSlocalPOLICE PERMITS5012.54124-fy-2017-annual-town-report.pdf22
2017SUBDIVISION/FORM A FILING FEESSUBDIVISIONFORMAFILINGFEESlocalSUBDIVISION/FORM A FILING FEES2100.04124-fy-2017-annual-town-report.pdf22
special_revenue_funds town Tier 1 · totals extract 2,387 rows 2011–2025one row per fund per year

Every fund OUTSIDE the general appropriation, FY2011–FY2025: balance brought forward, receipts, disbursements, balance carried forward. Grants, revolving funds and gifts that pay for real staff and appear nowhere in the appropriation. Dollars.

fifteen years

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
groupTEXTThe department heading the row sits under, as printed.
A heading governs every row below it until the next one.
fundTEXTThe MUNIS fund number.
School money spans 13xx, 15xx, 22xx and 26xx-29xx. There is no single range that means school.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
is_subtotalTEXTThis row is a total of other rows, not a fund or a line of its own.
Must be excluded from column sums or the rows it summarises are counted twice.
columns_as_printedTEXTThe column headings of this table, verbatim, as that page prints them.
This is what says which printed column v1 actually is. It is the only thing that does.
v1TEXTORDINAL, NOT A COLUMN NAME: the first column of THIS PAGE that held figures. dollars
The ruler is built per page, so v1 on one page and v1 on the next can be different printed columns. Read column_meaning. Summing v1 down a run adds one page's APPROPRIATED to another's TOTAL EXPENDED.
v2TEXTORDINAL: the second column of this page that held figures. dollars
See v1.
v3TEXTORDINAL: the third column of this page that held figures. dollars
See v1.
v4TEXTORDINAL: the fourth column of this page that held figures. dollars
See v1.
v5TEXTORDINAL: the fifth column of this page that held figures. dollars
See v1.
v6TEXTORDINAL: the sixth column of this page that held figures. dollars
See v1.
n_valuesTEXTHow many money cells this row actually carried. count
Fewer than the table's column count means blank cells, and which ones were blank is positional.
ruler_spannedTEXTThe column ruler could not cut this row cleanly.
Flagged rather than dropped: a dropped row shifts nothing and is invisible.
row_checkTEXTWhether the row satisfies an identity the table itself states.
derived_cellTEXTA cell we computed from the row's own other cells, recorded here and NEVER written into a v column.
An inference kept out of the readings, on purpose.
columns_tyingTEXTnot described yet
statusTEXTWhether this row's table was CHECKED against a total the report itself prints.
checked, check failed, no check. NOTHING may be aggregated without splitting on this — check failed is not slightly-worse data, it is data whose columns do not sum to the printed total.
reconciliationTEXTThe per-column result of that check: what we summed against what the report printed.

First 3 rows, in rowid order:

fyeditiongroupfundpageis_subtotalcolumns_as_printedv1v2v3v4v5v6n_valuesruler_spannedrow_checkderived_cellcolumns_tyingstatusreconciliation
2012FY2012LIBRARYWater Enterprise Fund70emptyempty12380.6517308.0615950.8613737.85emptyempty4emptyfund balances: forward + receipts - disburs…empty0check failedv1: 2,897,297.02 vs printed 2,766,954.67 (+…
2016FY2016SCHOOL DEPARTMENTExtended Day Revolving Fund33emptyFISCAL YEAR ENDING 6/30/16 ; FORWARD | TOTA…112884.10300590.66246943.94166530.82emptyempty4emptyfund balances: forward + receipts - disburs…empty0check failedv1: 2,711,371.31 vs printed 2,704,480.72 (+…
2018FY2018GENERAL GOVERNMENTSewer Gift Fund35emptyFISCAL YEAR ENDING 6/30/18 ; FORWARD | TOTA…387.09emptyempty387.09emptyempty2emptyemptyempty2check failedv1: 3,560,171.36 vs printed 3,564,136.36 (-…
town_ledger_fy26_q3 town Tier 1 · totals fact 67 rowsone row per department

The town's 67 departments at FY26 period 9: appropriation, transfers, revised, expended, encumbered, available and percent used. EXPENSE side only, department grain only.

by department.

columntypewhat it is
deptTEXTThe MUNIS department number.
A department is not a purpose: school retiree health sits in the insurance department.
nameTEXTThe name as the source prints it.
MUNIS truncates account names to ten characters.
originalTEXTThe appropriation as originally voted. dollars
transfersTEXTMoney moved into or out of the appropriation after it was voted. dollars
This is why original and revised differ.
revisedTEXTThe appropriation after transfers. dollars
expendedTEXTSpent. dollars
encumberedTEXTCommitted by purchase order but not yet spent. dollars
availableTEXTRevised less expended less encumbered. dollars
pct_usedTEXTShare of the revised budget used. percent

First 3 rows, in rowid order:

deptnameoriginaltransfersrevisedexpendedencumberedavailablepct_used
525PHYSICALS3500.00.03500.0416.0234.02850.018.6
754LOAN ADMINISTRATIVE FEES1230.00.01230.01230.470.00.0100.0
825STATE ASSESSMENTS1028529.00.01028529.0765004.00.0263525.074.4

Not about moneyCounts, names, dates and documents — everything this archive holds that is not a dollar figure

ballot_questions town fact 7 rowsone row per ballot question

VOTES, not dollars — though each carries the amount at stake. Per ballot question: type, purpose, yes / no / blank counts, registered voters, turnout and the result.

columntypewhat it is
dateTEXTnot described yet
electionTEXTnot described yet
questionTEXTnot described yet
typeTEXTnot described yet
amountTEXTThe figure, as printed. dollars
purposeTEXTnot described yet
yesTEXTnot described yet
noTEXTnot described yet
blanksTEXTnot described yet
totalTEXTThe row's total, as printed. dollars
registeredTEXTnot described yet
turnout_pctTEXTnot described yet
resultTEXTnot described yet
fy_reportTEXTnot described yet
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
read_byTEXTWhich instrument produced the figures: vision for a page read directly.
A reading, whichever instrument made it. It is checked by the printed total, not trusted for its source.
checksTEXTWhich checks this row passed.

First 3 rows, in rowid order:

dateelectionquestiontypeamountpurposeyesnoblankstotalregisteredturnout_pctresultfy_reportpageread_bychecks
2014-01-11Special Town ElectionQUESTION 1. DEBT EXCLUSIONProposition 2½ debt exclusion72975321Bonds to construct a new Lunenburg Middle/H…141454301957705927.7PASSED2014152plainYES 413+234+323+444=1414; NO 163+111+140+12…
2016-05Annual Town ElectionQUESTION 1 – Pavement Management PlanProposition 2½ debt exclusion4000000Pavement Management Plan — town roads18112755363emptyemptyPASSED2016193plainYES 58+27+34+62=181; NO 28+36+32+31=127; Bl…
2024-05-18Annual Town ElectionQUESTION 1. OVERRIDEProposition 2½ overrideemptyOverride approved by voters in May 2024; Ar…753664emptyemptyemptyemptyPASSED2024174plainYES 189+149+157+258=753; NO 195+118+175+176…
capital_funding_history town fact 10 rows 2017–2026one row per year

Per year, how capital spending was PAID FOR: free cash, taxation, unexpended prior-year capital, other. Dollars.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
totalTEXTThe row's total, as printed. dollars
free_cashTEXTnot described yet
taxationTEXTnot described yet
unexpended_prior_year_capitalTEXTnot described yet
otherTEXTnot described yet

First 3 rows, in rowid order:

fytotalfree_cashtaxationunexpended_prior_year_capitalother
2017619475.00250000.00349023.0520451.950.00
20232162849.30983034.39967725.00212089.910.00
20241039010.00467268.98556789.0914951.930.00
capital_plan_fy27 town fact 22 rowsone row per project

The FY27 capital plan as proposed: project, department, cost, running cumulative, whether it was funded and from where.

ranked.

columntypewhat it is
rankTEXTnot described yet
deptTEXTThe MUNIS department number.
A department is not a purpose: school retiree health sits in the insurance department.
projectTEXTnot described yet
costTEXTnot described yet
cumulativeTEXTnot described yet
fundedTEXTnot described yet
fundingTEXTnot described yet

First 3 rows, in rowid order:

rankdeptprojectcostcumulativefundedfunding
2PolicePatrol Cruiser (replacement)68627.00418627.00yesfree_cash_or_taxation
12ITAdult Activity Center Network Upgrade20405.001830203.00yesfree_cash_or_taxation
19SchoolsHeat for THES Maintenance Garage60000.002718608.00nounfunded
free_cash_proof town fact 630 rowsone row per line of the state's proof

The state's own line-by-line proof of certified free cash, for nine towns — every component with its role in the calculation. Dollars.

for nine towns.

columntypewhat it is
townTEXTnot described yet
yearTEXTnot described yet
lineTEXTnot described yet
amountTEXTThe figure, as printed. dollars
roleTEXTWhat kind of table it is: fact, dimension, extract, classification, provenance or derived.
Facts carry the measurements. Everything else describes, extracts, classifies or checks them.
source_fileTEXTThe file the figure was read from.
source_refTEXTWhere in the source the figure sits — a cell, a line, a page.
Rule 13: a coordinate, so a figure can be checked rather than taken.
label_refTEXTnot described yet

First 3 rows, in rowid order:

townyearlineamountrolesource_filesource_reflabel_ref
Lunenburg2022Free Cash Certified Prior Year2666962.00prior_year_certifiedstate-dls/free-cash-proof-lunenburg.xlsxSheet1!C4Sheet1!A4
Townsend2024Add Overlay Surplus Closed (CL#13)0.00componentstate-dls/free-cash-proof-townsend.xlsxSheet1!E13Sheet1!A13
Uxbridge2022Revenue Deficits0.00componentstate-dls/free-cash-proof-uxbridge.xlsxSheet1!C6Sheet1!A6
report_capital_projects town extract 616 rows 2011–2025one row per printed line

Capital project funds as the annual reports print them: appropriated, expended, encumbered and balance, per article.

v1..v8 are ORDINALS. Split on status.

columntypewhat it is
datasetTEXTWhich extract family this row belongs to.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
panelTEXTWhich block of the page this row came from, where a page prints several tables.
Two panels on one page have different column rulers. Summing across panels mixes them.
groupTEXTThe department heading the row sits under, as printed.
A heading governs every row below it until the next one.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
label_missingTEXTThe row's label did not survive extraction.
The figures may still be good. A missing label is not a missing row.
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
row_checkTEXTWhether the row satisfies an identity the table itself states.
derived_cellTEXTA cell we computed from the row's own other cells, recorded here and NEVER written into a v column.
An inference kept out of the readings, on purpose.
table_familyTEXTWhich printed table shape this row came from.
line_noTEXTPosition of the row on the page, counting from the top.
Positional, so it identifies a row within a page and nothing beyond it.
columns_as_printedTEXTThe column headings of this table, verbatim, as that page prints them.
This is what says which printed column v1 actually is. It is the only thing that does.
v1TEXTORDINAL, NOT A COLUMN NAME: the first column of THIS PAGE that held figures. dollars
The ruler is built per page, so v1 on one page and v1 on the next can be different printed columns. Read column_meaning. Summing v1 down a run adds one page's APPROPRIATED to another's TOTAL EXPENDED.
v2TEXTORDINAL: the second column of this page that held figures. dollars
See v1.
v3TEXTORDINAL: the third column of this page that held figures. dollars
See v1.
v4TEXTORDINAL: the fourth column of this page that held figures. dollars
See v1.
v5TEXTORDINAL: the fifth column of this page that held figures. dollars
See v1.
v6TEXTORDINAL: the sixth column of this page that held figures. dollars
See v1.
v7TEXTORDINAL: the seventh column of this page that held figures. dollars
See v1.
v8TEXTORDINAL: the eighth column of this page that held figures. dollars
See v1.
n_valuesTEXTHow many money cells this row actually carried. count
Fewer than the table's column count means blank cells, and which ones were blank is positional.
ruler_spannedTEXTThe column ruler could not cut this row cleanly.
Flagged rather than dropped: a dropped row shifts nothing and is invisible.
repaired_cellsTEXTCells we corrected, and what the correction was.
A repair is a change we made to a reading. It is recorded so it can be disputed.
unparsed_cellsTEXTCells we could not read.
Kept rather than dropped: a dropped cell is invisible.
column_meaningTEXTWhat each ordinal column is, where the table states an identity that fixes it.
Says not established where the table does not fix it, and that is not the same as unknown-and-guessable.
statusTEXTWhether this row's table was CHECKED against a total the report itself prints.
checked, check failed, no check. NOTHING may be aggregated without splitting on this — check failed is not slightly-worse data, it is data whose columns do not sum to the printed total.
reconciliationTEXTThe per-column result of that check: what we summed against what the report printed.

First 3 rows, in rowid order:

datasetfyeditionpagepanelgrouplabellabel_missingkindrow_checkderived_celltable_familyline_nocolumns_as_printedv1v2v3v4v5v6v7v8n_valuesruler_spannedrepaired_cellsunparsed_cellscolumn_meaningstatusreconciliation
capital_projects2016FY201636emptyemptyTechnology, School DepartmentemptyrowemptyemptyemptyemptyCAPITAL PROJECT FUNDS FY 2016 | APPROPRIATE…30000.0028228.931771.07emptyemptyemptyemptyempty3empty0emptyemptycheck failedv1: 1,207,111.79 vs 11,120,094.93 (-9,912,9…
capital_projects2023FY202344emptyemptyPublic Safety Building Engineering Design f…emptyrowemptyemptyemptyemptyCAPITAL PROJECT FUNDS FY 2023 | EXPENDED/EN…0.0025000.00emptyemptyemptyemptyemptyempty2empty0emptyemptycheck failedv1: 542,843.30 vs 843,181.55 (-300,338.25) …
capital_projects2025FY202530emptyempty3114 11/23 TC Passios RoofemptyrowemptyemptyemptyemptyCAPITAL PROJECT FUND BALANCE DETAIL | TOWN …300000.00emptyemptyemptyemptyemptyemptyempty1empty0emptyemptyno checkno total printed
report_debt town extract 354 rows 2011, 2017, 2019, 2020, 2021, 2023, 2024, 2025one row per printed line

Outstanding DEBT and repayment schedules as the annual reports print them. Dollars, town-wide — school building debt is inside these figures and is not separated out.

v1..v8 are ORDINALS. Split on status.

columntypewhat it is
datasetTEXTWhich extract family this row belongs to.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
panelTEXTWhich block of the page this row came from, where a page prints several tables.
Two panels on one page have different column rulers. Summing across panels mixes them.
groupTEXTThe department heading the row sits under, as printed.
A heading governs every row below it until the next one.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
label_missingTEXTThe row's label did not survive extraction.
The figures may still be good. A missing label is not a missing row.
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
row_checkTEXTWhether the row satisfies an identity the table itself states.
derived_cellTEXTA cell we computed from the row's own other cells, recorded here and NEVER written into a v column.
An inference kept out of the readings, on purpose.
table_familyTEXTWhich printed table shape this row came from.
line_noTEXTPosition of the row on the page, counting from the top.
Positional, so it identifies a row within a page and nothing beyond it.
columns_as_printedTEXTThe column headings of this table, verbatim, as that page prints them.
This is what says which printed column v1 actually is. It is the only thing that does.
v1TEXTORDINAL, NOT A COLUMN NAME: the first column of THIS PAGE that held figures. dollars
The ruler is built per page, so v1 on one page and v1 on the next can be different printed columns. Read column_meaning. Summing v1 down a run adds one page's APPROPRIATED to another's TOTAL EXPENDED.
v2TEXTORDINAL: the second column of this page that held figures. dollars
See v1.
v3TEXTORDINAL: the third column of this page that held figures. dollars
See v1.
v4TEXTORDINAL: the fourth column of this page that held figures. dollars
See v1.
v5TEXTORDINAL: the fifth column of this page that held figures. dollars
See v1.
v6TEXTORDINAL: the sixth column of this page that held figures. dollars
See v1.
v7TEXTORDINAL: the seventh column of this page that held figures. dollars
See v1.
v8TEXTORDINAL: the eighth column of this page that held figures. dollars
See v1.
n_valuesTEXTHow many money cells this row actually carried. count
Fewer than the table's column count means blank cells, and which ones were blank is positional.
ruler_spannedTEXTThe column ruler could not cut this row cleanly.
Flagged rather than dropped: a dropped row shifts nothing and is invisible.
repaired_cellsTEXTCells we corrected, and what the correction was.
A repair is a change we made to a reading. It is recorded so it can be disputed.
unparsed_cellsTEXTCells we could not read.
Kept rather than dropped: a dropped cell is invisible.
column_meaningTEXTWhat each ordinal column is, where the table states an identity that fixes it.
Says not established where the table does not fix it, and that is not the same as unknown-and-guessable.
statusTEXTWhether this row's table was CHECKED against a total the report itself prints.
checked, check failed, no check. NOTHING may be aggregated without splitting on this — check failed is not slightly-worse data, it is data whose columns do not sum to the printed total.
reconciliationTEXTThe per-column result of that check: what we summed against what the report printed.

First 3 rows, in rowid order:

datasetfyeditionpagepanelgrouplabellabel_missingkindrow_checkderived_celltable_familyline_nocolumns_as_printedv1v2v3v4v5v6v7v8n_valuesruler_spannedrepaired_cellsunparsed_cellscolumn_meaningstatusreconciliation
debt2020FY202045emptyemptyPRINCIPALemptyrowemptyemptyemptyemptyTOWN OF LUNENBURG DEBT REPAYMENT SCHEDULE A…965000.001070000.0018510000.00emptyemptyemptyemptyempty3empty0emptyemptyno checkno total printed
debt2020FY202045emptyemptyPRINCIPALemptyrowemptyemptyemptyemptyTOWN OF LUNENBURG DEBT REPAYMENT SCHEDULE A…emptyempty1045000.00emptyemptyemptyemptyempty1empty0emptyemptyno checkno total printed
debt2025FY202539emptyemptyTOTAL MASS WATER POL TRUST-SEWERemptysubtotalemptyemptyemptyemptyTRUST & STABILIZATION FUNDS HELD BY OTHER B…73779.0073792.0073806.0073820.0073835.0073881.0073896.0073913.009empty0emptyemptycheckedv3: 2,981,199.55 vs 2,981,199.55 [v-numbers…
report_dept_activity town extract 515 rows 2011–2025one row per printed line

Departmental activity tables — permits issued, inspections done, cases handled. Mostly COUNTS rather than dollars, and what is counted differs by department and by year.

v1..v8 are ORDINALS. Split on status.

columntypewhat it is
datasetTEXTWhich extract family this row belongs to.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
panelTEXTWhich block of the page this row came from, where a page prints several tables.
Two panels on one page have different column rulers. Summing across panels mixes them.
groupTEXTThe department heading the row sits under, as printed.
A heading governs every row below it until the next one.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
label_missingTEXTThe row's label did not survive extraction.
The figures may still be good. A missing label is not a missing row.
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
row_checkTEXTWhether the row satisfies an identity the table itself states.
derived_cellTEXTA cell we computed from the row's own other cells, recorded here and NEVER written into a v column.
An inference kept out of the readings, on purpose.
table_familyTEXTWhich printed table shape this row came from.
line_noTEXTPosition of the row on the page, counting from the top.
Positional, so it identifies a row within a page and nothing beyond it.
columns_as_printedTEXTThe column headings of this table, verbatim, as that page prints them.
This is what says which printed column v1 actually is. It is the only thing that does.
v1TEXTORDINAL, NOT A COLUMN NAME: the first column of THIS PAGE that held figures. dollars
The ruler is built per page, so v1 on one page and v1 on the next can be different printed columns. Read column_meaning. Summing v1 down a run adds one page's APPROPRIATED to another's TOTAL EXPENDED.
v2TEXTORDINAL: the second column of this page that held figures. dollars
See v1.
v3TEXTORDINAL: the third column of this page that held figures. dollars
See v1.
v4TEXTORDINAL: the fourth column of this page that held figures. dollars
See v1.
v5TEXTORDINAL: the fifth column of this page that held figures. dollars
See v1.
v6TEXTORDINAL: the sixth column of this page that held figures. dollars
See v1.
v7TEXTORDINAL: the seventh column of this page that held figures. dollars
See v1.
v8TEXTORDINAL: the eighth column of this page that held figures. dollars
See v1.
n_valuesTEXTHow many money cells this row actually carried. count
Fewer than the table's column count means blank cells, and which ones were blank is positional.
ruler_spannedTEXTThe column ruler could not cut this row cleanly.
Flagged rather than dropped: a dropped row shifts nothing and is invisible.
repaired_cellsTEXTCells we corrected, and what the correction was.
A repair is a change we made to a reading. It is recorded so it can be disputed.
unparsed_cellsTEXTCells we could not read.
Kept rather than dropped: a dropped cell is invisible.
column_meaningTEXTWhat each ordinal column is, where the table states an identity that fixes it.
Says not established where the table does not fix it, and that is not the same as unknown-and-guessable.
statusTEXTWhether this row's table was CHECKED against a total the report itself prints.
checked, check failed, no check. NOTHING may be aggregated without splitting on this — check failed is not slightly-worse data, it is data whose columns do not sum to the printed total.
reconciliationTEXTThe per-column result of that check: what we summed against what the report printed.

First 3 rows, in rowid order:

datasetfyeditionpagepanelgrouplabellabel_missingkindrow_checkderived_celltable_familyline_nocolumns_as_printedv1v2v3v4v5v6v7v8n_valuesruler_spannedrepaired_cellsunparsed_cellscolumn_meaningstatusreconciliation
dept_activity2016FY201653emptyCemetery Commissioners, Ch* Arthur WeidenhoffemptyrowemptyemptyemptyemptyCEMETERY DEPARTMENT | Cemetery Commissioner…81emptyemptyemptyemptyemptyemptyempty1empty0emptyemptyno checkno total printed
dept_activity2016FY201653emptyCemetery Commissioners, ChMurray S. Smith Jr.emptyrowemptyemptyemptyemptyCEMETERY DEPARTMENT | Cemetery Commissioner…81emptyemptyemptyemptyemptyemptyempty1empty0emptyemptyno checkno total printed
dept_activity2017FY201788emptyCEMETERY NAMEemptyemptyrowemptyemptyemptyemptyCEMETERY DEPARTMENT - 2017 | NAME AGE CEMET…50emptyemptyemptyemptyemptyemptyempty1empty0emptyemptyno checkno total printed
report_elections town extract 2,012 rows 2011–2025one row per printed line

Election results as the annual reports print them: candidates, offices and vote counts in ordinal columns.

v1..v8 are ORDINALS. Split on status.

columntypewhat it is
datasetTEXTWhich extract family this row belongs to.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
panelTEXTWhich block of the page this row came from, where a page prints several tables.
Two panels on one page have different column rulers. Summing across panels mixes them.
groupTEXTThe department heading the row sits under, as printed.
A heading governs every row below it until the next one.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
label_missingTEXTThe row's label did not survive extraction.
The figures may still be good. A missing label is not a missing row.
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
row_checkTEXTWhether the row satisfies an identity the table itself states.
derived_cellTEXTA cell we computed from the row's own other cells, recorded here and NEVER written into a v column.
An inference kept out of the readings, on purpose.
table_familyTEXTWhich printed table shape this row came from.
line_noTEXTPosition of the row on the page, counting from the top.
Positional, so it identifies a row within a page and nothing beyond it.
columns_as_printedTEXTThe column headings of this table, verbatim, as that page prints them.
This is what says which printed column v1 actually is. It is the only thing that does.
v1TEXTORDINAL, NOT A COLUMN NAME: the first column of THIS PAGE that held figures. dollars
The ruler is built per page, so v1 on one page and v1 on the next can be different printed columns. Read column_meaning. Summing v1 down a run adds one page's APPROPRIATED to another's TOTAL EXPENDED.
v2TEXTORDINAL: the second column of this page that held figures. dollars
See v1.
v3TEXTORDINAL: the third column of this page that held figures. dollars
See v1.
v4TEXTORDINAL: the fourth column of this page that held figures. dollars
See v1.
v5TEXTORDINAL: the fifth column of this page that held figures. dollars
See v1.
v6TEXTORDINAL: the sixth column of this page that held figures. dollars
See v1.
v7TEXTORDINAL: the seventh column of this page that held figures. dollars
See v1.
v8TEXTORDINAL: the eighth column of this page that held figures. dollars
See v1.
n_valuesTEXTHow many money cells this row actually carried. count
Fewer than the table's column count means blank cells, and which ones were blank is positional.
ruler_spannedTEXTThe column ruler could not cut this row cleanly.
Flagged rather than dropped: a dropped row shifts nothing and is invisible.
repaired_cellsTEXTCells we corrected, and what the correction was.
A repair is a change we made to a reading. It is recorded so it can be disputed.
unparsed_cellsTEXTCells we could not read.
Kept rather than dropped: a dropped cell is invisible.
column_meaningTEXTWhat each ordinal column is, where the table states an identity that fixes it.
Says not established where the table does not fix it, and that is not the same as unknown-and-guessable.
statusTEXTWhether this row's table was CHECKED against a total the report itself prints.
checked, check failed, no check. NOTHING may be aggregated without splitting on this — check failed is not slightly-worse data, it is data whose columns do not sum to the printed total.
reconciliationTEXTThe per-column result of that check: what we summed against what the report printed.

First 3 rows, in rowid order:

datasetfyeditionpagepanelgrouplabellabel_missingkindrow_checkderived_celltable_familyline_nocolumns_as_printedv1v2v3v4v5v6v7v8n_valuesruler_spannedrepaired_cellsunparsed_cellscolumn_meaningstatusreconciliation
elections2014FY20141591emptyTOTALemptysubtotalparts sum to the printed totalemptyemptyemptytrailing figures1187955105310524247emptyemptyempty5empty0emptyemptycheck failed181 full rows tie, 1 do not; 28 partial not…
elections2017FY20171861emptyBLANKSemptyrowparts sum to the printed totalemptyemptyemptytrailing figures17196124173564emptyemptyempty5empty0emptyemptycheck failed42 full rows tie, 5 do not; 12 partial not …
elections2024FY20241731emptyBLANKSemptyrowparts sum to the printed totalemptyemptyemptytrailing figures997784114374emptyemptyempty5empty0emptyemptycheck failed96 full rows tie, 14 do not; 124 partial no…
report_gross_wages town extract 3,545 rows 2011 … 2025 (13 years)one row per printed line

GROSS WAGES paid per named employee per year, as the annual reports print them. 3,545 rows. Actual pay rather than budget, including overtime and details.

v1..v8 are ORDINALS. Split on status.

columntypewhat it is
datasetTEXTWhich extract family this row belongs to.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
panelTEXTWhich block of the page this row came from, where a page prints several tables.
Two panels on one page have different column rulers. Summing across panels mixes them.
groupTEXTThe department heading the row sits under, as printed.
A heading governs every row below it until the next one.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
label_missingTEXTThe row's label did not survive extraction.
The figures may still be good. A missing label is not a missing row.
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
row_checkTEXTWhether the row satisfies an identity the table itself states.
derived_cellTEXTA cell we computed from the row's own other cells, recorded here and NEVER written into a v column.
An inference kept out of the readings, on purpose.
table_familyTEXTWhich printed table shape this row came from.
line_noTEXTPosition of the row on the page, counting from the top.
Positional, so it identifies a row within a page and nothing beyond it.
columns_as_printedTEXTThe column headings of this table, verbatim, as that page prints them.
This is what says which printed column v1 actually is. It is the only thing that does.
v1TEXTORDINAL, NOT A COLUMN NAME: the first column of THIS PAGE that held figures. dollars
The ruler is built per page, so v1 on one page and v1 on the next can be different printed columns. Read column_meaning. Summing v1 down a run adds one page's APPROPRIATED to another's TOTAL EXPENDED.
v2TEXTORDINAL: the second column of this page that held figures. dollars
See v1.
v3TEXTORDINAL: the third column of this page that held figures. dollars
See v1.
v4TEXTORDINAL: the fourth column of this page that held figures. dollars
See v1.
v5TEXTORDINAL: the fifth column of this page that held figures. dollars
See v1.
v6TEXTORDINAL: the sixth column of this page that held figures. dollars
See v1.
v7TEXTORDINAL: the seventh column of this page that held figures. dollars
See v1.
v8TEXTORDINAL: the eighth column of this page that held figures. dollars
See v1.
n_valuesTEXTHow many money cells this row actually carried. count
Fewer than the table's column count means blank cells, and which ones were blank is positional.
ruler_spannedTEXTThe column ruler could not cut this row cleanly.
Flagged rather than dropped: a dropped row shifts nothing and is invisible.
repaired_cellsTEXTCells we corrected, and what the correction was.
A repair is a change we made to a reading. It is recorded so it can be disputed.
unparsed_cellsTEXTCells we could not read.
Kept rather than dropped: a dropped cell is invisible.
column_meaningTEXTWhat each ordinal column is, where the table states an identity that fixes it.
Says not established where the table does not fix it, and that is not the same as unknown-and-guessable.
statusTEXTWhether this row's table was CHECKED against a total the report itself prints.
checked, check failed, no check. NOTHING may be aggregated without splitting on this — check failed is not slightly-worse data, it is data whose columns do not sum to the printed total.
reconciliationTEXTThe per-column result of that check: what we summed against what the report printed.

First 3 rows, in rowid order:

datasetfyeditionpagepanelgrouplabellabel_missingkindrow_checkderived_celltable_familyline_nocolumns_as_printedv1v2v3v4v5v6v7v8n_valuesruler_spannedrepaired_cellsunparsed_cellscolumn_meaningstatusreconciliation
gross_wages2016FY2016202emptyFIREVASADY-KOVACSemptyrowemptyemptyemptyemptyFIRE SCHOOL | NEIL SCHOOL | SCHOOL | SCHOOL5683.64emptyemptyemptyemptyemptyemptyempty1empty0emptyemptyno checkno total printed
gross_wages2021FY2021166emptyemptyRIOS JENNIFERemptyrowemptyemptyemptyemptyOUDAIN DUVV CIV NUTAND67253.64emptyemptyemptyemptyemptyemptyempty1empty0emptyemptyno checkno total printed
gross_wages2025FY2025182emptyemptyWENTWORTHemptyrowemptyemptyemptyempty2025 GROSS WAGES51673.54emptyemptyemptyemptyemptyemptyempty1empty0emptyemptyno checkno total printed
report_officials town extract 237 rows 2011 … 2024 (13 years)one row per printed line

Names and offices of town officials as each annual report lists them. No money.

v1..v8 are ORDINALS. Split on status.

columntypewhat it is
datasetTEXTWhich extract family this row belongs to.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
panelTEXTWhich block of the page this row came from, where a page prints several tables.
Two panels on one page have different column rulers. Summing across panels mixes them.
groupTEXTThe department heading the row sits under, as printed.
A heading governs every row below it until the next one.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
label_missingTEXTThe row's label did not survive extraction.
The figures may still be good. A missing label is not a missing row.
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
row_checkTEXTWhether the row satisfies an identity the table itself states.
derived_cellTEXTA cell we computed from the row's own other cells, recorded here and NEVER written into a v column.
An inference kept out of the readings, on purpose.
table_familyTEXTWhich printed table shape this row came from.
line_noTEXTPosition of the row on the page, counting from the top.
Positional, so it identifies a row within a page and nothing beyond it.
columns_as_printedTEXTThe column headings of this table, verbatim, as that page prints them.
This is what says which printed column v1 actually is. It is the only thing that does.
v1TEXTORDINAL, NOT A COLUMN NAME: the first column of THIS PAGE that held figures. dollars
The ruler is built per page, so v1 on one page and v1 on the next can be different printed columns. Read column_meaning. Summing v1 down a run adds one page's APPROPRIATED to another's TOTAL EXPENDED.
v2TEXTORDINAL: the second column of this page that held figures. dollars
See v1.
v3TEXTORDINAL: the third column of this page that held figures. dollars
See v1.
v4TEXTORDINAL: the fourth column of this page that held figures. dollars
See v1.
v5TEXTORDINAL: the fifth column of this page that held figures. dollars
See v1.
v6TEXTORDINAL: the sixth column of this page that held figures. dollars
See v1.
v7TEXTORDINAL: the seventh column of this page that held figures. dollars
See v1.
v8TEXTORDINAL: the eighth column of this page that held figures. dollars
See v1.
n_valuesTEXTHow many money cells this row actually carried. count
Fewer than the table's column count means blank cells, and which ones were blank is positional.
ruler_spannedTEXTThe column ruler could not cut this row cleanly.
Flagged rather than dropped: a dropped row shifts nothing and is invisible.
repaired_cellsTEXTCells we corrected, and what the correction was.
A repair is a change we made to a reading. It is recorded so it can be disputed.
unparsed_cellsTEXTCells we could not read.
Kept rather than dropped: a dropped cell is invisible.
column_meaningTEXTWhat each ordinal column is, where the table states an identity that fixes it.
Says not established where the table does not fix it, and that is not the same as unknown-and-guessable.
statusTEXTWhether this row's table was CHECKED against a total the report itself prints.
checked, check failed, no check. NOTHING may be aggregated without splitting on this — check failed is not slightly-worse data, it is data whose columns do not sum to the printed total.
reconciliationTEXTThe per-column result of that check: what we summed against what the report printed.

First 3 rows, in rowid order:

datasetfyeditionpagepanelgrouplabellabel_missingkindrow_checkderived_celltable_familyline_nocolumns_as_printedv1v2v3v4v5v6v7v8n_valuesruler_spannedrepaired_cellsunparsed_cellscolumn_meaningstatusreconciliation
officials2011FY201113emptyempty*Shirley A. LevesqueemptyrowemptyemptyemptyemptyMarion Benson, c/o Planning Board | D.P.W. …80emptyemptyemptyemptyemptyemptyempty1empty0emptyemptyno checkno total printed
officials2023FY2023166emptyHealth & SanitationHighway LaboremptyrowemptyemptyemptyemptyAPPOINTED OFFICIALS | INSPECTOR OF PLUMBING…59emptyemptyemptyemptyemptyemptyempty1empty0587,160.00emptyno checkno total printed
officials2023FY2023167emptyHighwayVehicle Mtc - HighwayemptyrowemptyemptyemptyemptyAPPOINTED OFFICIALS | INSPECTOR OF PLUMBING…64emptyemptyemptyemptyemptyemptyempty1empty062,750.00emptyno checkno total printed
report_trust_funds town extract 642 rows 2011 … 2025 (13 years)one row per printed line

Trust fund balances and activity as the annual reports print them.

v1..v8 are ORDINALS. Split on status.

columntypewhat it is
datasetTEXTWhich extract family this row belongs to.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
panelTEXTWhich block of the page this row came from, where a page prints several tables.
Two panels on one page have different column rulers. Summing across panels mixes them.
groupTEXTThe department heading the row sits under, as printed.
A heading governs every row below it until the next one.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
label_missingTEXTThe row's label did not survive extraction.
The figures may still be good. A missing label is not a missing row.
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
row_checkTEXTWhether the row satisfies an identity the table itself states.
derived_cellTEXTA cell we computed from the row's own other cells, recorded here and NEVER written into a v column.
An inference kept out of the readings, on purpose.
table_familyTEXTWhich printed table shape this row came from.
line_noTEXTPosition of the row on the page, counting from the top.
Positional, so it identifies a row within a page and nothing beyond it.
columns_as_printedTEXTThe column headings of this table, verbatim, as that page prints them.
This is what says which printed column v1 actually is. It is the only thing that does.
v1TEXTORDINAL, NOT A COLUMN NAME: the first column of THIS PAGE that held figures. dollars
The ruler is built per page, so v1 on one page and v1 on the next can be different printed columns. Read column_meaning. Summing v1 down a run adds one page's APPROPRIATED to another's TOTAL EXPENDED.
v2TEXTORDINAL: the second column of this page that held figures. dollars
See v1.
v3TEXTORDINAL: the third column of this page that held figures. dollars
See v1.
v4TEXTORDINAL: the fourth column of this page that held figures. dollars
See v1.
v5TEXTORDINAL: the fifth column of this page that held figures. dollars
See v1.
v6TEXTORDINAL: the sixth column of this page that held figures. dollars
See v1.
v7TEXTORDINAL: the seventh column of this page that held figures. dollars
See v1.
v8TEXTORDINAL: the eighth column of this page that held figures. dollars
See v1.
n_valuesTEXTHow many money cells this row actually carried. count
Fewer than the table's column count means blank cells, and which ones were blank is positional.
ruler_spannedTEXTThe column ruler could not cut this row cleanly.
Flagged rather than dropped: a dropped row shifts nothing and is invisible.
repaired_cellsTEXTCells we corrected, and what the correction was.
A repair is a change we made to a reading. It is recorded so it can be disputed.
unparsed_cellsTEXTCells we could not read.
Kept rather than dropped: a dropped cell is invisible.
column_meaningTEXTWhat each ordinal column is, where the table states an identity that fixes it.
Says not established where the table does not fix it, and that is not the same as unknown-and-guessable.
statusTEXTWhether this row's table was CHECKED against a total the report itself prints.
checked, check failed, no check. NOTHING may be aggregated without splitting on this — check failed is not slightly-worse data, it is data whose columns do not sum to the printed total.
reconciliationTEXTThe per-column result of that check: what we summed against what the report printed.

First 3 rows, in rowid order:

datasetfyeditionpagepanelgrouplabellabel_missingkindrow_checkderived_celltable_familyline_nocolumns_as_printedv1v2v3v4v5v6v7v8n_valuesruler_spannedrepaired_cellsunparsed_cellscolumn_meaningstatusreconciliation
trust_funds2011FY201173emptyLIBRARY FUEMMA DIMOND LIBRARY BOOKSemptysubtotalsubtotal: equals the 2 rows below it, in 2 …emptyemptyemptyTRUST FUNDS | BEGINNING BEGINNING DISBURSE …300.00125.460.003.090.00emptyemptyempty5empty0emptyemptycheck failedv1: 354,751.46 vs 1,905,698.11 (-1,550,946.…
trust_funds2019FY201946emptyLIBRARY FUNDSPHILIP CROUSEemptyrowemptyemptyemptyemptyTOWN OF LUNENBURG | TRUST FUNDS STABILIZATI…66.694.48empty30.000.0072.001.63empty6empty0emptyemptycheck failedv1: 2,856,386.21 vs 2,528,358.08 (+328,028.…
trust_funds2020FY202041emptyLIBRARY FUNDSemptyemptyfootnoteprinted below the grand total, which ends t…emptyemptyemptyTOWN OF LUNENBURG Page 1 of 2 | TRUST FUNDS…8129.00emptyempty28434.40emptyemptyemptyempty2empty0emptyemptycheck failedv2: 29,909.86 vs 7.00 (+29,902.86) [v-numbe…
report_valuation town extract 316 rows 2011–2019one row per printed line

Assessed property VALUATION by class, as the annual reports print it. Dollars — and the base the tax levy is computed on.

v1..v8 are ORDINALS. Split on status.

columntypewhat it is
datasetTEXTWhich extract family this row belongs to.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
panelTEXTWhich block of the page this row came from, where a page prints several tables.
Two panels on one page have different column rulers. Summing across panels mixes them.
groupTEXTThe department heading the row sits under, as printed.
A heading governs every row below it until the next one.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
label_missingTEXTThe row's label did not survive extraction.
The figures may still be good. A missing label is not a missing row.
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
row_checkTEXTWhether the row satisfies an identity the table itself states.
derived_cellTEXTA cell we computed from the row's own other cells, recorded here and NEVER written into a v column.
An inference kept out of the readings, on purpose.
table_familyTEXTWhich printed table shape this row came from.
line_noTEXTPosition of the row on the page, counting from the top.
Positional, so it identifies a row within a page and nothing beyond it.
columns_as_printedTEXTThe column headings of this table, verbatim, as that page prints them.
This is what says which printed column v1 actually is. It is the only thing that does.
v1TEXTORDINAL, NOT A COLUMN NAME: the first column of THIS PAGE that held figures. dollars
The ruler is built per page, so v1 on one page and v1 on the next can be different printed columns. Read column_meaning. Summing v1 down a run adds one page's APPROPRIATED to another's TOTAL EXPENDED.
v2TEXTORDINAL: the second column of this page that held figures. dollars
See v1.
v3TEXTORDINAL: the third column of this page that held figures. dollars
See v1.
v4TEXTORDINAL: the fourth column of this page that held figures. dollars
See v1.
v5TEXTORDINAL: the fifth column of this page that held figures. dollars
See v1.
v6TEXTORDINAL: the sixth column of this page that held figures. dollars
See v1.
v7TEXTORDINAL: the seventh column of this page that held figures. dollars
See v1.
v8TEXTORDINAL: the eighth column of this page that held figures. dollars
See v1.
n_valuesTEXTHow many money cells this row actually carried. count
Fewer than the table's column count means blank cells, and which ones were blank is positional.
ruler_spannedTEXTThe column ruler could not cut this row cleanly.
Flagged rather than dropped: a dropped row shifts nothing and is invisible.
repaired_cellsTEXTCells we corrected, and what the correction was.
A repair is a change we made to a reading. It is recorded so it can be disputed.
unparsed_cellsTEXTCells we could not read.
Kept rather than dropped: a dropped cell is invisible.
column_meaningTEXTWhat each ordinal column is, where the table states an identity that fixes it.
Says not established where the table does not fix it, and that is not the same as unknown-and-guessable.
statusTEXTWhether this row's table was CHECKED against a total the report itself prints.
checked, check failed, no check. NOTHING may be aggregated without splitting on this — check failed is not slightly-worse data, it is data whose columns do not sum to the printed total.
reconciliationTEXTThe per-column result of that check: what we summed against what the report printed.

First 3 rows, in rowid order:

datasetfyeditionpagepanelgrouplabellabel_missingkindrow_checkderived_celltable_familyline_nocolumns_as_printedv1v2v3v4v5v6v7v8n_valuesruler_spannedrepaired_cellsunparsed_cellscolumn_meaningstatusreconciliation
valuation2016FY201637emptyemptyIndustrialemptyrowemptyemptyemptyemptyBOARD OF ASSESSORS | Fiscal 2016 Assessment…emptyemptyempty19994000.0019.61392082.34emptyempty3empty01.6667%emptyno checkno total printed
valuation2019FY201943emptyemptyemptyemptyrowemptyemptyemptyemptyValuation and Tax History | Fiscal Year Tax…1442248677.004.23emptyemptyemptyemptyemptyempty2empty0emptyemptyno checkno total printed
valuation2019FY201943emptyAssessor's Account forCharges to 6/30/2019emptyrowemptyemptyemptyemptyValuation and Tax History | Fiscal Year Tax…118953.20133830.01emptyemptyemptyemptyemptyempty2empty0emptyemptyno checkno total printed
report_vital_records town extract 96 rows 2011 … 2025 (14 years)one row per printed line

Counts of births, marriages and deaths as the annual reports print them.

v1..v8 are ORDINALS. Split on status.

columntypewhat it is
datasetTEXTWhich extract family this row belongs to.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
panelTEXTWhich block of the page this row came from, where a page prints several tables.
Two panels on one page have different column rulers. Summing across panels mixes them.
groupTEXTThe department heading the row sits under, as printed.
A heading governs every row below it until the next one.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
label_missingTEXTThe row's label did not survive extraction.
The figures may still be good. A missing label is not a missing row.
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
row_checkTEXTWhether the row satisfies an identity the table itself states.
derived_cellTEXTA cell we computed from the row's own other cells, recorded here and NEVER written into a v column.
An inference kept out of the readings, on purpose.
table_familyTEXTWhich printed table shape this row came from.
line_noTEXTPosition of the row on the page, counting from the top.
Positional, so it identifies a row within a page and nothing beyond it.
columns_as_printedTEXTThe column headings of this table, verbatim, as that page prints them.
This is what says which printed column v1 actually is. It is the only thing that does.
v1TEXTORDINAL, NOT A COLUMN NAME: the first column of THIS PAGE that held figures. dollars
The ruler is built per page, so v1 on one page and v1 on the next can be different printed columns. Read column_meaning. Summing v1 down a run adds one page's APPROPRIATED to another's TOTAL EXPENDED.
v2TEXTORDINAL: the second column of this page that held figures. dollars
See v1.
v3TEXTORDINAL: the third column of this page that held figures. dollars
See v1.
v4TEXTORDINAL: the fourth column of this page that held figures. dollars
See v1.
v5TEXTORDINAL: the fifth column of this page that held figures. dollars
See v1.
v6TEXTORDINAL: the sixth column of this page that held figures. dollars
See v1.
v7TEXTORDINAL: the seventh column of this page that held figures. dollars
See v1.
v8TEXTORDINAL: the eighth column of this page that held figures. dollars
See v1.
n_valuesTEXTHow many money cells this row actually carried. count
Fewer than the table's column count means blank cells, and which ones were blank is positional.
ruler_spannedTEXTThe column ruler could not cut this row cleanly.
Flagged rather than dropped: a dropped row shifts nothing and is invisible.
repaired_cellsTEXTCells we corrected, and what the correction was.
A repair is a change we made to a reading. It is recorded so it can be disputed.
unparsed_cellsTEXTCells we could not read.
Kept rather than dropped: a dropped cell is invisible.
column_meaningTEXTWhat each ordinal column is, where the table states an identity that fixes it.
Says not established where the table does not fix it, and that is not the same as unknown-and-guessable.
statusTEXTWhether this row's table was CHECKED against a total the report itself prints.
checked, check failed, no check. NOTHING may be aggregated without splitting on this — check failed is not slightly-worse data, it is data whose columns do not sum to the printed total.
reconciliationTEXTThe per-column result of that check: what we summed against what the report printed.

First 3 rows, in rowid order:

datasetfyeditionpagepanelgrouplabellabel_missingkindrow_checkderived_celltable_familyline_nocolumns_as_printedv1v2v3v4v5v6v7v8n_valuesruler_spannedrepaired_cellsunparsed_cellscolumn_meaningstatusreconciliation
vital_records2011FY201113emptyempty*Betty Ann SikoraemptyrowemptyemptyemptyemptyJANUARY JULY | Nancy L Woodruff 79 N *Richa…72emptyemptyemptyemptyemptyemptyempty1empty0emptyemptyno checkno total printed
vital_records2012FY20121051emptyTOTALemptysubtotalemptyemptyemptyemptytrailing figures276021542520268810122emptyemptyempty5empty0emptyemptyno checkno total printed
vital_records2013FY2013921emptyTOTALemptysubtotalemptyemptyemptyemptytrailing figures5644364825352017emptyemptyempty5empty0emptyemptyno checkno total printed
Both at once — the ledger and the model24 tables · 7,000 rows

Tables that carry every department together. The town's books do not separate school from town, and neither do these: splitting them would invent a division the source does not make.

Tier 1 · totalswhat was appropriated and what is left, by department

balance_sheet school + town Tier 1 · totals fact 774 rows 2011–2022one row per line per fund column per year

What the town HOLDS, read from the COMBINED BALANCE SHEET — assets, liabilities and fund equity across six fund columns (general, special revenue, enterprise, capital project, trust and agency, long-term debt). Everything else in this archive measures money MOVING; this is the only table that measures what is sitting there.

Read from the page, like special_revenue_read. It is trusted because three checks hold: each column foots to its own printed total, the sheet's identity (liabilities + fund equity = assets) holds per column, and special revenue + enterprise fund equity ties to the special revenue schedule's carried-forward total — an INDEPENDENT document. One printed sheet does not balance itself (FY2019 trust and agency, $657,297.35 apart); that is the town's print, recorded not corrected.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
page_printedTEXTnot described yet
page_pdfTEXTnot described yet
sectionTEXTThe budget book's own section heading.
lineTEXTnot described yet
fundTEXTThe MUNIS fund number.
School money spans 13xx, 15xx, 22xx and 26xx-29xx. There is no single range that means school.
amountTEXTThe figure, as printed. dollars
documentTEXTThe source file the figure was read from.
read_byTEXTWhich instrument produced the figures: vision for a page read directly.
A reading, whichever instrument made it. It is checked by the printed total, not trusted for its source.

First 3 rows, in rowid order:

fyeditionpage_printedpage_pdfsectionlinefundamountdocumentread_by
2011FY20115356assetsFY 11 REAL ESTATE TAXESgeneral445664.60sources/town-annual-reports/docs/4117-fy-20…vision
2012FY20125356assetsFY 12 REAL ESTATE TAXESgeneral356747.49sources/town-annual-reports/docs/4118-fy-20…vision
2022FY20222424assetsFY19 REAL ESTATE TAXESgeneral-104.00sources/town-annual-reports/docs/4129-fy-20…vision
enterprise_balance_sheet school + town Tier 1 · totals fact 114 rows 2024–2025one row per line per fund column per printing per year

What the four ENTERPRISE funds hold at 30 June — Sewer, Water, Solid Waste and PEG Access, side by side, with a memorandum-only total column. Read from the COMBINING BALANCE SHEET — ENTERPRISE FUNDS, which is the only balance sheet FY2024 and FY2025 print; neither report contains the town-wide combined balance sheet balance_sheet holds for FY2011–FY2023.

RATEPAYER MONEY. Sewer and water user charges, betterments, trash fees and cable franchise money — none of it is available to the town's general operations and none of it is a tax dollar. This is NOT an extension of balance_sheet: that table's enterprise value is one of six fund-type COLUMNS on a different sheet, and the two must never be unioned. FY2024 prints the same sheet TWICE (printed pages 21 and 28), so printing is 1 or 2 and must be collapsed on before anything is summed — summing across it doubles the money. FY2024's memorandum column is $102,000.00 out on two offsetting lines; that is the town's print, recorded not corrected. Only cells that print a figure are recorded; the sheet's 0.00 and '-' template cells are not rows here.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
page_printedTEXTnot described yet
page_pdfTEXTnot described yet
printingTEXTnot described yet
sectionTEXTThe budget book's own section heading.
lineTEXTnot described yet
fundTEXTThe MUNIS fund number.
School money spans 13xx, 15xx, 22xx and 26xx-29xx. There is no single range that means school.
amountTEXTThe figure, as printed. dollars
documentTEXTThe source file the figure was read from.
read_byTEXTWhich instrument produced the figures: vision for a page read directly.
A reading, whichever instrument made it. It is checked by the printed total, not trusted for its source.

First 3 rows, in rowid order:

fyeditionpage_printedpage_pdfprintingsectionlinefundamountdocumentread_by
2024FY202421211liabilitiesDeferred revenue: Special assessmentstotal_memorandum3139121.60sources/town-annual-reports/docs/4132-fy-20…vision
2024FY202428282liabilitiesWarrants payablepeg_access283.50sources/town-annual-reports/docs/4132-fy-20…vision
2025FY202521251assetsDue to/Due Fromsolid_waste26973.93sources/town-annual-reports/docs/4130-fy-20…vision
fund_activity school + town Tier 1 · totals fact 61 rows 2026–2026one row per fund per year per period

Per fund per period: opening balance, revenue in, salaries, other expenditure, encumbered and closing balance. FY2026 period 9 only — and opening_balance is NULL for every one of the 61 funds.

spent and holds.

columntypewhat it is
fundTEXTThe MUNIS fund number.
School money spans 13xx, 15xx, 22xx and 26xx-29xx. There is no single range that means school.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
periodINTEGERMUNIS accounting period: a point in time INSIDE the fiscal year.
A period is not a stage. Period 9 and period 12 are two different reports of the same year; adding them adds one report to the other.
opening_balanceREALWhat the fund held at the start of the year. dollars
revenueREALMoney received into the fund. dollars
Not the same quantity as spending, and the two must never be added.
salariesREALThe salary portion of the fund's spending. dollars
expenditureREALThe non-salary portion of the fund's spending. dollars
encumberedREALCommitted by purchase order but not yet spent. dollars
closing_balanceREALWhat the fund held at the end of the period. dollars
doc_idTEXTThe archive path of the document this row's figures came from.
Every fact row carries one. A figure that cannot name its document is not loaded.

First 3 rows, in rowid order:

fundfyperiodopening_balancerevenuesalariesexpenditureencumberedclosing_balancedoc_id
276520269NULL0.00.00.00.0-502.0sources/town-ledgers/fund-balances/special-…
276920269NULL0.00.00.00.04.55sources/town-ledgers/fund-balances/special-…
131120269NULL22485.910.02910.680.0109397.82sources/town-ledgers/fund-balances/special-…
special_revenue_read school + town Tier 1 · totals fact 1,882 rows 2011–2023one row per fund per year

The special revenue schedule READ from the rendered page rather than OCR'd: balance brought forward, total receipts, total disbursements, balance carried forward, per fund. The only version of this table that ties to its own printed grand total — FY2022, 167 funds, all four columns to the penny and every row balancing.

A figure read off an image is a READING, not a published number — same status as the OCR's. It is trustworthy because the report's own printed total and the table's own identity both check it, not because a model produced it. Years that do not tie are not in here.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
groupTEXTThe department heading the row sits under, as printed.
A heading governs every row below it until the next one.
fundTEXTThe MUNIS fund number.
School money spans 13xx, 15xx, 22xx and 26xx-29xx. There is no single range that means school.
forwardTEXTBalance the fund brought forward from the previous year, as the schedule prints it. dollars
receiptsTEXTTotal money the fund took in during the year. dollars
Not the same quantity as disbursements and must never be added to it.
disbursementsTEXTTotal money the fund paid out during the year. dollars
carriedTEXTBalance the fund carried forward into the next year. dollars
Ties to the NEXT year's forward, which is a check across years the schedule makes possible.
row_tiesTEXTWhether this row satisfies forward + receipts − disbursements = carried.
The identity the table itself states. A row that does not tie is a transcription error or a printing error, and which one is not decided here.
documentTEXTThe source file the figure was read from.
read_byTEXTWhich instrument produced the figures: vision for a page read directly.
A reading, whichever instrument made it. It is checked by the printed total, not trusted for its source.

First 3 rows, in rowid order:

fyeditionpagegroupfundforwardreceiptsdisbursementscarriedrow_tiesdocumentread_by
2020FY202032PUBLIC SAFETYCommunity Policing FY 966.55emptyempty6.55yessources/town-annual-reports/docs/4127-fy-20…vision
2017FY201732LIBRARYFY07 Public Libraries Fund571.17emptyempty571.17yessources/town-annual-reports/docs/4124-fy-20…vision
2013FY201368SCHOOL DEPARTMENTFull Day Kindergarten Grant1470.0048382.0049852.000.00yessources/town-annual-reports/docs/4119-fy-20…vision

Tier 2 · categorieswhether a category — guidance, special education, transport — is over

peg_access school + town Tier 2 · categories fact 110 rows 2015–2025one row per printed expense line per year

What the town's PEG Access / Public Access Cable operation spent, line by line, FY2015-FY2025, read from the expense table each annual town report prints. From FY2020 the report also prints a % of Expense column and it is recorded here beside the amount.

CABLE FRANCHISE MONEY, not tax money. Comcast pays it under the Town's cable licence; from FY2020 it sits in a PEG Access enterprise fund established under MGL c.44 s53F1/2 and is appropriated by its own Town Meeting article. None of it is available to general operations. The line LIST changes: Insurance disappears after FY2020 and Indirect Costs appears, so a line-by-line series across that boundary is comparing different things. FY2017's ten lines add to 450.01 MORE than that report's own printed TOTAL; the total is what the rest of the record uses. Join to peg_access_printed_totals for the total each year actually prints -- never sum these rows and call it the year's expenses without saying so.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
page_printedTEXTnot described yet
page_pdfTEXTnot described yet
ordinalTEXTnot described yet
lineTEXTnot described yet
amountTEXTThe figure, as printed. dollars
pctTEXTnot described yet
quoteTEXTWhat the source says, verbatim.
documentTEXTThe source file the figure was read from.
read_byTEXTWhich instrument produced the figures: vision for a page read directly.
A reading, whichever instrument made it. It is checked by the printed total, not trusted for its source.

First 3 rows, in rowid order:

fyeditionpage_printedpage_pdfordinallineamountpctquotedocumentread_by
2022FY202272725Office Supplies0.000.00$0.00sources/town-annual-reports/docs/4129-fy-20…vision
2022FY202272729Videographers25516.2820.06$25,516.28sources/town-annual-reports/docs/4129-fy-20…vision
2023FY202380808New Equip15205.509.32$15,205.50sources/town-annual-reports/docs/4131-fy-20…vision
variance_by_group school + town Tier 2 · categories derived 59 rowsone row per function group

Computed, not read: per function group, how far spending ran from budget across years — budgeted, spent, net, gross, churn, and the best and worst years.

across years.

columntypewhat it is
function_groupTEXTOur grouping of DESE function codes into readable categories.
yearsTEXTnot described yet
budgetedTEXTnot described yet
spentTEXTMoney paid out of the fund. dollars
Not the same quantity as revenue.
netTEXTnot described yet
grossTEXTnot described yet
churnTEXTnot described yet
worst_yearTEXTnot described yet
best_yearTEXTnot described yet

First 3 rows, in rowid order:

function_groupyearsbudgetedspentnetgrosschurnworst_yearbest_year
2320 - Therapeutic Services530936103014841-78769787691.00-0.0532-0.0100
(unmapped)42722759274803825279629632.49-0.03710.0590
2325 - Special Education Substitutes5322364274236-481281534723.19-0.65910.9754

Tier 3 · accountswhat one account spent

ledger_snapshot school + town the spine Tier 3 · accounts fact 983 rows 2026–2026one row per account per year per period per document

BOTH revenue and expense accounts from the town's MUNIS books, told apart by account_type — revenue is stored NEGATIVE. Six money measures per row: original appropriation, transfers, revised, expended, encumbered, available, plus percent used. Two grains in the same table (level): 67 department roll-ups and 916 detail accounts. FY2026 only, at two periods — 9 carries the department rows, 12 the account rows.

at a moment in the year.

columntypewhat it is
account_idTEXTThe full MUNIS account, fund-org-object.
The stable identity. Never identify an account by its name.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
periodINTEGERMUNIS accounting period: a point in time INSIDE the fiscal year.
A period is not a stage. Period 9 and period 12 are two different reports of the same year; adding them adds one report to the other.
originalREALThe appropriation as originally voted. dollars
transfersREALMoney moved into or out of the appropriation after it was voted. dollars
This is why original and revised differ.
revisedREALThe appropriation after transfers. dollars
expendedREALSpent. dollars
encumberedREALCommitted by purchase order but not yet spent. dollars
availableREALRevised less expended less encumbered. dollars
pct_usedREALShare of the revised budget used. percent
rounded_columnsTEXTWhich columns the source printed rounded.
Sets the tolerance a reconciliation may use — one dollar per rounded row, not a blanket.
doc_idTEXTThe archive path of the document this row's figures came from.
Every fact row carries one. A figure that cannot name its document is not loaded.

First 3 rows, in rowid order:

account_idfyperiodoriginaltransfersrevisedexpendedencumberedavailablepct_usedrounded_columnsdoc_id
0100-11462-573100202612750.00.0750.0250.00.0500.00.0emptysources/town-ledgers/expenses/glytdbud-expe…
0100-11751-5110002026120.00.00.012796.80.0-12796.80.0emptysources/town-ledgers/expenses/glytdbud-expe…
0100-14112-521016202612750.0-750.00.00.00.00.00.0emptysources/town-ledgers/expenses/glytdbud-expe…
account school + town Tier 3 · accounts dimension 981 rowsone row per MUNIS account

The chart of accounts — no money at all. One row per MUNIS account number split into fund, department, org and object, with its DESE function code, its name, whether it is revenue or expense, whether it is a roll-up or a detail account, and the years it appears.

department and function code.

columntypewhat it is
account_idTEXTThe full MUNIS account, fund-org-object.
The stable identity. Never identify an account by its name.
fundTEXTThe MUNIS fund number.
School money spans 13xx, 15xx, 22xx and 26xx-29xx. There is no single range that means school.
fund_nameTEXTThe fund's name as MUNIS prints it.
CHAPTER 658 REVOLVING FUND is athletics. Identify a fund by number.
deptTEXTThe MUNIS department number.
A department is not a purpose: school retiree health sits in the insurance department.
orgTEXTThe MUNIS org segment of the account.
objectTEXTThe MUNIS object code — what kind of thing the money buys.
account_stringTEXTnot described yet
functionTEXTThe DESE function code.
Joins a CATEGORY, never a line.
nameTEXTThe name as the source prints it.
MUNIS truncates account names to ten characters.
account_typeTEXTWhether the account is expense or revenue.
Revenue is stored NEGATIVE. Omitting this once made the town's whole budget compute as minus $997,871.
levelTEXTSchool level, where the row is about athletics rather than accounts.
Means something different in account — see that table's entry.
first_seen_fyINTEGERnot described yet
last_seen_fyINTEGERnot described yet

First 3 rows, in rowid order:

account_idfundfund_namedeptorgobjectaccount_stringfunctionnameaccount_typelevelfirst_seen_fylast_seen_fy
0100-11462-5344000100GENERAL FUND146114625344000100-1-146-0000-00-0-00-2-534400NULLPOSTAGEexpenseaccount20262026
0100-19142-5700020100GENERAL FUND914191425700020100-9-914-0000-00-0-00-2-570002NULLLIFE INSexpenseaccount20262026
0100-01001-4328000100GENERAL FUNDNULL01001432800NULLNULLZN BD FILErevenueaccount20262026
account_names school + town Tier 3 · accounts dimension 124 rowsone row per abbreviated account name

A decoder, not data: what each ten-character MUNIS abbreviation expands to, and the basis for each expansion.

The expansions are ours except where basis says otherwise.

columntypewhat it is
deptTEXTThe MUNIS department number.
A department is not a purpose: school retiree health sits in the insurance department.
objectTEXTThe MUNIS object code — what kind of thing the money buys.
orgTEXTThe MUNIS org segment of the account.
codeTEXTnot described yet
readableTEXTnot described yet
basisTEXTWhether a figure is published, contractual, statutory, our measurement or our assumption.
noteTEXTWhat we recorded about this row.

First 3 rows, in rowid order:

deptobjectorgcodereadablebasisnote
300511002emptyHS GUID SEHigh school guidance secretarydepartment contextObject 511002 is the secretarial salary obj…
300512103emptyKIND SUBSKindergarten substitutesdistrict documentThe district budget prints “Kind Regular Su…
300519104emptyUNIFSPORTSSports uniformsdistrict documentThe district budget prints “Replacement of …
crosswalk school + town Tier 3 · accounts dimension 0 rowsone row per budget line mapped to an account

EMPTY, deliberately. It would map a budget line to a ledger account, and it cannot: MUNIS truncates names to ten characters so MS GUIDANC and HS GUIDANC collide. Only the CATEGORY joins, through account.function.

Deliberately empty. MUNIS truncates to ten characters so MS GUIDANC and HS GUIDANC collide; only the CATEGORY can be joined, through account.function. Populating this would record an inference as a mapping.

columntypewhat it is
line_keyTEXTOur normalised join key for a budget line.
Normalisation differs between budget_figure and workbook_figure — joining them on line_key matches only a fraction. Join on the normalised label instead.
account_idTEXTThe full MUNIS account, fund-org-object.
The stable identity. Never identify an account by its name.
methodTEXTnot described yet
confidenceTEXTnot described yet
evidenceTEXTWhat establishes the claim in this row.
doc_idTEXTThe archive path of the document this row's figures came from.
Every fact row carries one. A figure that cannot name its document is not loaded.

No rows. That is the honest state of this table, not a load that failed — see its entry in SCHEMA.md.

munis_ledger school + town Tier 3 · accounts fact 983 rows 2026–2026one row per account per report

The MUNIS chart of accounts exactly as DELIVERED, before our normalisation — including the report parameters (totals_only, suppress_zero) that decide what a report shows and therefore what is missing from it.

columntypewhat it is
doc_idTEXTThe archive path of the document this row's figures came from.
Every fact row carries one. A figure that cannot name its document is not loaded.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
periodTEXTMUNIS accounting period: a point in time INSIDE the fiscal year.
A period is not a stage. Period 9 and period 12 are two different reports of the same year; adding them adds one report to the other.
fundTEXTThe MUNIS fund number.
School money spans 13xx, 15xx, 22xx and 26xx-29xx. There is no single range that means school.
fund_nameTEXTThe fund's name as MUNIS prints it.
CHAPTER 658 REVOLVING FUND is athletics. Identify a fund by number.
funds_coveredTEXTnot described yet
account_typeTEXTWhether the account is expense or revenue.
Revenue is stored NEGATIVE. Omitting this once made the town's whole budget compute as minus $997,871.
levelTEXTSchool level, where the row is about athletics rather than accounts.
Means something different in account — see that table's entry.
deptTEXTThe MUNIS department number.
A department is not a purpose: school retiree health sits in the insurance department.
orgTEXTThe MUNIS org segment of the account.
objectTEXTThe MUNIS object code — what kind of thing the money buys.
accountTEXTnot described yet
functionTEXTThe DESE function code.
Joins a CATEGORY, never a line.
nameTEXTThe name as the source prints it.
MUNIS truncates account names to ten characters.
originalTEXTThe appropriation as originally voted. dollars
transfersTEXTMoney moved into or out of the appropriation after it was voted. dollars
This is why original and revised differ.
revisedTEXTThe appropriation after transfers. dollars
expendedTEXTSpent. dollars
encumberedTEXTCommitted by purchase order but not yet spent. dollars
availableTEXTRevised less expended less encumbered. dollars
pct_usedTEXTShare of the revised budget used. percent
totals_onlyTEXTnot described yet
suppress_zeroTEXTnot described yet
rounded_columnsTEXTWhich columns the source printed rounded.
Sets the tolerance a reconciliation may use — one dollar per rounded row, not a blanket.

First 3 rows, in rowid order:

doc_idfyperiodfundfund_namefunds_coveredaccount_typeleveldeptorgobjectaccountfunctionnameoriginaltransfersrevisedexpendedencumberedavailablepct_usedtotals_onlysuppress_zerorounded_columns
sources/town-ledgers/expenses/glytdbud-expe…2026120100GENERAL FUNDemptyexpenseaccount300S10110225350030100-3-300-1210-01-1-02-2-5350031210DUES/MTGS8000.0-3584.84415.23521.00.0894.20.001empty
sources/town-ledgers/expenses/glytdbud-expe…2026120100GENERAL FUNDemptyexpenseaccount411141125400000100-4-411-0000-00-0-00-2-5400000000OFF SUPPLI1100.00.01100.0392.19523.31184.50.001empty
sources/town-ledgers/revenue/glytdbud-reven…202690100GENERAL FUND0100 GENERAL FUNDrevenueaccountempty01001417900emptyemptyINT FARM A0.00.00.00.00.00.00.000original,transfers,revised

Not about moneyCounts, names, dates and documents — everything this archive holds that is not a dollar figure

balance_sheet_printed_totals school + town provenance 288 rows 2011–2022one row per printed total per fund column per year

The totals each balance sheet PRINTS — total assets, total liabilities, total fund equity — quoted with the page they appear on.

The independent check on balance_sheet, so it must be read off the page and never computed from our own rows.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
page_printedTEXTnot described yet
page_pdfTEXTnot described yet
total_rowTEXTnot described yet
fundTEXTThe MUNIS fund number.
School money spans 13xx, 15xx, 22xx and 26xx-29xx. There is no single range that means school.
amountTEXTThe figure, as printed. dollars
quoteTEXTWhat the source says, verbatim.

First 3 rows, in rowid order:

fyeditionpage_printedpage_pdftotal_rowfundamountquote
2012FY20125356TOTAL ASSETSgeneral6185491.72TOTAL ASSETS row, printed page 53
2018FY20182626TOTAL LIABILITIES/FUND EQUITYcapital_project1671644.20TOTAL LIABILITIES/FUND EQUITY row, printed …
2020FY20202222TOTAL LIABILITIES/FUND EQUITYspecial_revenue2650524.60TOTAL LIABILITIES/FUND EQUITY row, printed …
enterprise_balance_sheet_printed_totals school + town provenance 75 rows 2024–2025one row per printed total per fund column per printing per year

The totals the enterprise balance sheet PRINTS — Total Assets, Total Liabilities, Total Fund Equity, Total Liabilities and Fund Equity, and the sheet's own PROOF row — quoted with the raw cell text and the page.

The independent check on enterprise_balance_sheet, so it must be read off the page and never computed from our own rows. The PROOF row is the sheet's own self-check and is what a reading is reconciled to. FY2025 prints its Proof as '(0.00)' and '-' in different columns; the amount recorded is 0.00 and the raw glyph is in quote.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
page_printedTEXTnot described yet
page_pdfTEXTnot described yet
printingTEXTnot described yet
total_rowTEXTnot described yet
fundTEXTThe MUNIS fund number.
School money spans 13xx, 15xx, 22xx and 26xx-29xx. There is no single range that means school.
amountTEXTThe figure, as printed. dollars
quoteTEXTWhat the source says, verbatim.

First 3 rows, in rowid order:

fyeditionpage_printedpage_pdfprintingtotal_rowfundamountquote
2024FY202421211TOTAL LIABILITIES AND FUND EQUITYsewer5573383.92printed 'Total Liabilities and Fund Equity'…
2024FY202428282TOTAL LIABILITIES AND FUND EQUITYwater65079.88printed 'Total Liabilities and Fund Equity'…
2025FY202521251TOTAL LIABILITIESsewer3172048.99printed 'Total Liablities' row, FY2025 prin…
fiscal_period school + town dimension 13 rowsone row per MUNIS period

What each MUNIS accounting period means and how many months of the year had elapsed. Period 13 is the year-end close after the lapse period, not a thirteenth month.

Period 13 is the year-end close after the lapse period, not a thirteenth month.

columntypewhat it is
periodINTEGERMUNIS accounting period: a point in time INSIDE the fiscal year.
A period is not a stage. Period 9 and period 12 are two different reports of the same year; adding them adds one report to the other.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
months_elapsedREALnot described yet
is_finalINTEGERnot described yet

First 3 rows, in rowid order:

periodlabelmonths_elapsedis_final
10April10.00
11May11.00
12June12.00
fund school + town dimension 68 rowsone row per MUNIS fund

One row per MUNIS fund: its number, its name, what kind of fund it is and what restricts it. No money.

with its kind and restriction.

columntypewhat it is
fundTEXTThe MUNIS fund number.
School money spans 13xx, 15xx, 22xx and 26xx-29xx. There is no single range that means school.
nameTEXTThe name as the source prints it.
MUNIS truncates account names to ten characters.
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
restrictionTEXTnot described yet

First 3 rows, in rowid order:

fundnamekindrestriction
1311SCHOOL GIFT FUNDgiftNULL
2709FY12 REG DISSEMINATION GR#321NULLNULL
2653FY24 FAMILY & COMMUNITY #237NULLNULL
money_assumptions school + town our model 6 rowsone row per assumption

Every assumption the money model rests on, what it rests on, and what single document would settle it.

with what would settle it.

columntypewhat it is
assumptionTEXTnot described yet
evidenceTEXTWhat establishes the claim in this row.
rests_onTEXTnot described yet
settled_byTEXTnot described yet

First 3 rows, in rowid order:

assumptionevidencerests_onsettled_by
`SCHRESSTIP` is a school resource officer s…Read from the abbreviation, in the police d…A $6,800 line. Immaterial, and still an inf…The account’s full name from MUNIS, which t…
The district workbook total ties to the dep…They land 0.4% apart for FY2026.Used to argue the $26m is the town’s bill r…Whether the 0.4% is netting or simply that …
The pension assessment includes school non-…Standard Massachusetts practice: teachers i…The reason the pension is treated as a scho…The WRRS annual actuarial valuation, which …
money_classification school + town our model 252 rowsone row per revenue account or fund or department

Our model, not measurement. One row per revenue account, fund or department: what we classified it as, HOW that was established, and WHY. 252 rows covering every money node in the school and town diagrams.

how and why carry the basis so a classification can be argued with.

columntypewhat it is
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
keyTEXTThe row's join key.
groupTEXTThe department heading the row sits under, as printed.
A heading governs every row below it until the next one.
labelTEXTThe row's name, as printed.
Not a key. MUNIS truncates to ten characters, so MS GUIDANC and HS GUIDANC collide.
classificationTEXTOur classification of the node.
howTEXTHow that classification was established.
whyTEXTWhy the classification was made, in words that can be argued with.

First 3 rows, in rowid order:

kindkeygrouplabelclassificationhowwhy
revenue_accountSALE STANDonetimeOne-time moneygeneral_fund_revenuenamedFree cash and proceeds. Spendable once
report_receiptSENIORCENTERRENTALFEESlocalSENIOR CENTER RENTAL FEESgeneral_fund_revenueresidualLocal receipts — a residual: fees, permits,…
report_receiptSTUDENTPARKINGFEESlocalSTUDENT PARKING FEESgeneral_fund_revenueresidualLocal receipts — a residual: fees, permits,…
money_edges school + town our model 11 rowsone row per traced edge

Where a restricted fund's money is PERMITTED to go, with the statute or grant award that permits it. An edge is a presumption about purpose, never an observation of spending.

An edge is the statute or grant award — a PRESUMPTION about purpose, never an observation of spending.

columntypewhat it is
sourceTEXTWhere the figure came from, as the extractor recorded it.
A loose reference — a filename — not a resolved address.
useTEXTnot described yet
basisTEXTWhether a figure is published, contractual, statutory, our measurement or our assumption.
whyTEXTWhy the classification was made, in words that can be argued with.

First 3 rows, in rowid order:

sourceusebasiswhy
Fund 1301 (athletics)Athletics spendingrestrictedThe fund is athletics — established from it…
Grant funds 26xx–29xxThe purpose of each grantrestrictedRestricted by the grant award rather than b…
State teachers’ pension systemDistrict teaching staffunknownNot appropriated by Lunenburg, not in our a…
money_gaps school + town our model 39 rowsone row per gap

The honest list of what CANNOT be answered — per side (money in, money out), what is missing and why the published documents do not close it.

This table is the honest list of what cannot be answered.

columntypewhat it is
sideTEXTnot described yet
whatTEXTnot described yet
whyTEXTWhy the classification was made, in words that can be argued with.

First 3 rows, in rowid order:

sidewhatwhy
document_wantedDESE End of Year Financial ReportPublished by the state. — closes: Separates…
peopleWhich fund pays which postThis is the load-bearing one. The rosters n…
money_outSchool share of Medicare, active health ins…Five of the seven FY2026 insurance accounts…
peg_access_identities school + town provenance 23 rows 2015–2025one row per arithmetic statement each PEG statement makes about itself

The arithmetic the printed statement states about itself, written over the row ORDINALS in peg_access_printed_totals -- 1 + 2 = 3 and so on. It is transcribed from the page, because the arithmetic changes every few years.

This is what verify_peg_access.py recomputes, and it is also a completeness check: every printed row must be reached by some identity. FY2020's row 5 is not, and that is recorded as a printed defect rather than removed.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
statementTEXTnot described yet
identityTEXTnot described yet
noteTEXTWhat we recorded about this row.

First 3 rows, in rowid order:

fyeditionstatementidentitynote
2017FY2017revenue_vs_expenses3 - 4 = 5empty
2022FY2022revenue_vs_expenses1 + 2 = 3empty
2024FY2024revenue_vs_expenses1 + 2 + 3 = 4empty
peg_access_printed_totals school + town provenance 77 rows 2015–2025one row per printed figure per statement per year

The REVENUE vs EXPENSES statement each report prints, row by row in printed order, plus the line-item TOTAL and what the prose says the revenue was -- each with the raw cell text, the printed page and the PDF index.

total_row is the label the page prints and it is NOT unique: FY2019's statement carries two rows labelled Subtotal. Use ordinal. The rows do not mean the same thing across years -- FY2015-FY2019 Starting Balance is the prior year's Ending Balance, FY2021 and FY2025 it is the BUDGET, and FY2022 has no balance at all, so TOTAL there is one year's surplus and not a fund balance. precision says whether the statement is printed in cents or whole dollars; FY2024 and FY2025 are in dollars while the expense table beside them is in cents.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
page_printedTEXTnot described yet
page_pdfTEXTnot described yet
statementTEXTnot described yet
ordinalTEXTnot described yet
total_rowTEXTnot described yet
amountTEXTThe figure, as printed. dollars
pctTEXTnot described yet
precisionTEXTnot described yet
quoteTEXTWhat the source says, verbatim.
documentTEXTThe source file the figure was read from.

First 3 rows, in rowid order:

fyeditionpage_printedpage_pdfstatementordinaltotal_rowamountpctprecisionquotedocument
2017FY20176868prose1REVENUE STATED IN PROSE107849.80emptycentsThe overall payments received for FY17 were…sources/town-annual-reports/docs/4124-fy-20…
2019FY20198183revenue_vs_expenses6Comcast Tech Fund (Undesignated Fund)124796.01emptycents$124,796.01sources/town-annual-reports/docs/4126-fy-20…
2024FY20246363revenue_vs_expenses2Enterprise Fund Interest24498.00emptydollars$ 24,498sources/town-annual-reports/docs/4132-fy-20…
rate_register school + town fact 62 rows 2024–2029one row per rate

Every rate and fee the model uses: the value, what kind of value it is, when it was set, when it expires, its source document and cell reference, and whether the model actually uses it.

with where it was set.

columntypewhat it is
fyTEXTFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
categoryTEXTnot described yet
unitTEXTWhat the figure is counted in.
itemTEXTThe thing being priced or counted.
valueTEXTThe figure, as printed. dollars
value_typeTEXTnot described yet
set_onTEXTThe date the rate or fee was set.
expiresTEXTnot described yet
sourceTEXTWhere the figure came from, as the extractor recorded it.
A loose reference — a filename — not a resolved address.
source_fileTEXTThe file the figure was read from.
source_refTEXTWhere in the source the figure sits — a cell, a line, a page.
Rule 13: a coordinate, so a figure can be checked rather than taken.
statusTEXTWhether this row's table was CHECKED against a total the report itself prints.
checked, check failed, no check. NOTHING may be aggregated without splitting on this — check failed is not slightly-worse data, it is data whose columns do not sum to the printed total.
in_modelTEXTnot described yet

First 3 rows, in rowid order:

fycategoryunititemvaluevalue_typeset_onexpiressourcesource_filesource_refstatusin_model
2024athletic_feeMSreduced_fee26.00dollarsemptyemptyDistrict athletics workbook, by sport (Town…munis-ledgers/account-details/athletics-by-…Spring!T3verifiedreference
2025athletic_feeANYunified_track100.00dollarsemptyemptyLHS Athletics FAQ (rschoolteams.com)district-budget/text/lhs-athletics-faq.txtUnified Track =$100.00verifiedreference
2027contract_colaParaprofessionalscost-of-living adjustment to the salary sca…2.0percentemptyJune 30, 2028Lunenburg school employee contracts — Parap…contracts/CONTRACTS.mdParaprofessionals | FY26–FY28 | 3.0% · 2.0%…recordeddeliberately not used — the line has never …
special_revenue_printed_totals school + town provenance 13 rows 2011–2023one row per edition

The GRAND TOTAL each annual report PRINTS for the special revenue schedule, quoted with its page. Four columns.

This is the independent check on special_revenue_read, so it must be read off the page and never computed from our own rows — the OCR misread this very figure by $1,010 and the reconciliation was measured against it for months.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
forwardTEXTBalance the fund brought forward from the previous year, as the schedule prints it. dollars
receiptsTEXTTotal money the fund took in during the year. dollars
Not the same quantity as disbursements and must never be added to it.
disbursementsTEXTTotal money the fund paid out during the year. dollars
carriedTEXTBalance the fund carried forward into the next year. dollars
Ties to the NEXT year's forward, which is a check across years the schedule makes possible.
quoteTEXTWhat the source says, verbatim.

First 3 rows, in rowid order:

fyeditionpageforwardreceiptsdisbursementscarriedquote
2015FY2015332599893.635285016.775180429.682704480.72GRAND TOTAL row, page 33
2021FY2021355596048.897088091.526269397.746414742.67GRAND TOTAL row, page 35
2023FY2023438663349.919102807.737735057.8610031099.78GRAND TOTAL row, page 43
stated_figure school + town fact 2 rows 2025–2025one row per figure the town stated

Figures the town or district ASSERTED in their own words, with the quote, who said it, when, and what it supersedes. Claims, kept as claims.

with the quote.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
metricTEXTWhich quantity this row measures.
amountREALThe figure, as printed. dollars
stated_onTEXTnot described yet
stated_byTEXTnot described yet
basisTEXTWhether a figure is published, contractual, statutory, our measurement or our assumption.
doc_idTEXTThe archive path of the document this row's figures came from.
Every fact row carries one. A figure that cannot name its document is not loaded.
source_refTEXTWhere in the source the figure sits — a cell, a line, a page.
Rule 13: a coordinate, so a figure can be checked rather than taken.
quoteTEXTWhat the source says, verbatim.
supersedesREALnot described yet
noteTEXTWhat we recorded about this row.

First 2 rows, in rowid order:

fymetricamountstated_onstated_bybasisdoc_idsource_refquotesupersedesnote
2025school_surplus582115.442025-09-03Superintendent (memo read into the record b…closesources/meetings/text/school-committee/2025…line 36recently discovered in the amount of $582,1…NULLThe Chair read a prepared statement about a…
2025school_surplus603885.972025-09-17Business Administrator (Mr. McNamara) to th…closesources/meetings/text/school-committee/2025…line 123the surplus number has gone up to $603,885.…582115.44The $21,770.53 difference is encumbrances r…
The state's figures2 tables · 5,964 rows

DESE's own published measures, for Lunenburg and every other district. All-funds, so NOT comparable with a general fund appropriation.

Not about moneyCounts, names, dates and documents — everything this archive holds that is not a dollar figure

dese_measure state fact 2,982 rows 2009–2025one row per district per year per measure

The state's published measures for EVERY Massachusetts district, per year: enrollment, per-pupil spending, selected populations. Each value carries whether it reconciles to DESE's own printed total.

columntypewhat it is
leaTEXTThe state's district code.
districtTEXTThe district's name as DESE prints it.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
groupTEXTThe department heading the row sits under, as printed.
A heading governs every row below it until the next one.
measureTEXTWhich DESE measure this row reports.
valueREALThe figure, as printed. dollars
reconcilesTEXTWhether this figure ties to DESE's own printed total.
doc_idTEXTThe archive path of the document this row's figures came from.
Every fact row carries one. A figure that cannot name its document is not loaded.

First 3 rows, in rowid order:

leadistrictfygroupmeasurevaluereconcilesdoc_id
01620000Lunenburg2025MCAS PerformanceELA Grade 10 % Meets or Exceeds0.57yessources/state-dese/radar-district-compariso…
06730000Groton-Dunstable2024Expenditures Per PupilPupil Services2073.0yessources/state-dese/radar-district-compariso…
06730000Groton-Dunstable2012Expenditures Per PupilTeachers4483.0yessources/state-dese/radar-district-compariso…
dese_radar state fact 2,982 rows 2009–2025one row per district per year per measure

DESE's ALL-FUNDS per-pupil expenditure figures for every district. All funds means grants and revolving funds are included, so these are NOT comparable with a general fund appropriation.

All-funds, so NOT comparable with the town's general fund appropriation.

columntypewhat it is
leaTEXTThe state's district code.
districtTEXTThe district's name as DESE prints it.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
groupTEXTThe department heading the row sits under, as printed.
A heading governs every row below it until the next one.
measureTEXTWhich DESE measure this row reports.
valueTEXTThe figure, as printed. dollars
reconcilesTEXTWhether this figure ties to DESE's own printed total.
doc_idTEXTThe archive path of the document this row's figures came from.
Every fact row carries one. A figure that cannot name its document is not loaded.

First 3 rows, in rowid order:

leadistrictfygroupmeasurevaluereconcilesdoc_id
06100000Ashburnham-Westminster2019MCAS PerformanceMath Grades 3-8 % Meets or Exceeds0.518yessources/state-dese/radar-district-compariso…
06160000Ayer Shirley School District2017MCAS PerformanceMath Grades 3-8 % Meets or Exceeds0.433yessources/state-dese/radar-district-compariso…
07350000North Middlesex2019Expenditures Per PupilOperations and Maintenance1513yessources/state-dese/radar-district-compariso…
About the archive itself9 tables · 5,951 rows

Which document a figure came from, what has been read, and what these tables mean.

Not about moneyCounts, names, dates and documents — everything this archive holds that is not a dollar figure

annual_report_catalogue archive provenance 866 rows 2011–2025one row per table per annual report

A catalogue of what EXISTS, not of what has been extracted. Every table found by reading all sixteen annual reports end to end: its printed heading verbatim, its pages, its grain, its printed total, and whether it is extractable.

A catalogue of what EXISTS, not of what has been extracted.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
documentTEXTThe source file the figure was read from.
nameTEXTThe name as the source prints it.
MUNIS truncates account names to ten characters.
printed_headingTEXTnot described yet
pagesTEXTWhich pages of the source this covers.
what_it_isTEXTnot described yet
grainTEXTWhat one row of this table represents.
The field that decides whether two tables can be joined or summed.
columnsTEXTnot described yet
layoutTEXTnot described yet
printed_totalTEXTThe total the source itself prints, quoted.
This is the independent check. An extract that does not tie to it is not trusted.
approx_rowsTEXTnot described yet
extractableTEXTnot described yet
notesTEXTWhat we recorded about this row while reading it.
clusterTEXTnot described yet

First 3 rows, in rowid order:

fyeditiondocumentnameprinted_headingpageswhat_it_isgraincolumnslayoutprinted_totalapprox_rowsextractablenotescluster
2013FY20134119-fy-2013-annual-town-report.pdfNashoba Environmental Health Department act…Environmental Health Department / Environme…16Counts of regional health district activity…one activity type(activity) | (count)label with dot leaders, count rightempty12cleanTHE MOST COMPLETE OF THE THREE YEARS: Lunen…activity counts department environmental
2017FY20174124-fy-2017-annual-town-report.pdfMonty Tech assessment ratio percentages by …ASSESSMENT RATIO PERCENTAGES147Each member town's operating and capital ap…one member townCOMMUNITIES | TRANSPORTATION & OTHER OPERAT…Seven-column tableTOTALS 100.00% 100.00% 0.00% 100.00% 100.00…18cleanFootnote: '* Capital Percentages are used f…assessment monty percentages ratio
2018FY20184125-fy-2018-annual-town-report.pdfFire department calls for service, 2018empty96Calendar 2018 fire department run volume sp…one call categorycategory | countTwo side-by-side label/number pairs embedde…stated in the prose above it: 'your Fire De…4cleanFires & Hazardous Conditions 452, Emergency…calls department fire service
annual_report_contents archive provenance 199 rows 2011–2025one row per extracted table

What was actually READ: which tables, from which pages, how many figures, and whether the extract is checkable against a printed total.

from which pages

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
tableTEXTWhich table this row describes.
pagesTEXTWhich pages of the source this covers.
page_countTEXTnot described yet
pages_with_figuresTEXTnot described yet
figure_rowsTEXTnot described yet
figuresTEXTnot described yet
columnsTEXTnot described yet
read_byTEXTWhich instrument produced the figures: vision for a page read directly.
A reading, whichever instrument made it. It is checked by the printed total, not trusted for its source.
printed_totalTEXTThe total the source itself prints, quoted.
This is the independent check. An extract that does not tie to it is not trusted.
checkableTEXTnot described yet
csv_fieldsTEXTnot described yet
grainTEXTWhat one row of this table represents.
The field that decides whether two tables can be joined or summed.

First 3 rows, in rowid order:

fytablepagespage_countpages_with_figuresfigure_rowsfigurescolumnsread_byprinted_totalcheckablecsv_fieldsgrain
2018payroll5,248-254873045867layout+plainemptynofy, department, position_count, grossAGGREGATE ONLY -- never one row per named p…
2019capital_project361191892ocremptynofy, project_number, project_name, balanceone row per capital project per year
2025enterprise25,35,53,64,67,140,142-143,15298961556layout+plainemptynofy, fund, line, amountone row per enterprise fund line per year
annual_report_survey archive provenance 2,751 rows 2011–2025one row per page surveyed

A measurement of PAGES, not of figures: per page, the extraction mode, how many gutters and money tokens it holds, how many characters and rows. This is how the right instrument is chosen per page.

A survey, not data: it measures pages, it does not read figures.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
documentTEXTThe source file the figure was read from.
pageTEXTThe page number printed on the page, not the PDF's index.
The two differ by a cover offset that is not constant across years.
modeTEXTnot described yet
guttersTEXTnot described yet
moneyTEXTnot described yet
charsTEXTnot described yet
rowsTEXTHow many rows the extract produced. count
sectionsTEXTnot described yet
totalsTEXTnot described yet
noteTEXTWhat we recorded about this row.

First 3 rows, in rowid order:

fydocumentpagemodeguttersmoneycharsrowssectionstotalsnote
20164123-fy-2016-annual-town-report.pdf174plain239229139emptyemptyempty
20224129-fy-2022-annual-town-report.pdf26plain1110345054receiptsGRAND TOTAL=46,695,138.62empty
20224129-fy-2022-annual-town-report.pdf154layout0032970town_meetingemptytext, no figures
column_glossary archive provenance 139 rowsone row per DISTINCT column name across the whole database

One row per DISTINCT column name across the whole database: what it means, its unit, whether it is published or ours, and the caution attached to it.

Keyed on the NAME, not on table plus name, because v1 and status mean the same dangerous thing everywhere they appear. Where a name genuinely differs by table, the table entry says so.

columntypewhat it is
columnTEXTnot described yet
meaningTEXTWhat the column holds.
unitTEXTWhat the figure is counted in.
basisTEXTWhether a figure is published, contractual, statutory, our measurement or our assumption.
cautionTEXTWhat goes wrong if this is used without knowing the above.
Every entry here was written after getting it wrong at least once.

First 3 rows, in rowid order:

columnmeaningunitbasiscaution
v4ORDINAL: the fourth column of this page tha…dollarsderivedSee v1.
variantWhich whole-budget scenario the figure belo…emptyoursFY27 has four — Balanced, Core Budget, Leve…
pathWhere our copy lives in the archive.emptyoursempty
dataset_document archive provenance 225 rowsone row per dataset per document

The join between an extracted dataset and the document it came from: which pages, how many rows, whether it reconciled, and the publisher's own label, size and checksum.

columntypewhat it is
datasetTEXTWhich extract family this row belongs to.
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
rowsTEXTHow many rows the extract produced. count
pagesTEXTWhich pages of the source this covers.
page_countTEXTnot described yet
reconciledTEXTnot described yet
partialTEXTnot described yet
documentTEXTThe source file the figure was read from.
publisher_labelTEXTnot described yet
upstreamTEXTThe publisher's address, as deeply as it goes.
sha256TEXTChecksum of our copy.
Here because a file can be replaced at the same URL without the URL changing.
bytesTEXTSize of our copy. bytes

First 3 rows, in rowid order:

dataseteditionrowspagespage_countreconciledpartialdocumentpublisher_labelupstreamsha256bytes
special-revenue-fundsFY201512929,30,31,32,335004121-fy-2015-annual-town-report.pdfFY 2015 Annual Town Reporthttps://www.lunenburgma.gov/DocumentCenter/…712afbb458b2a452a1c4b3ce618478c8f59a31d7f04…7590404
report-officialsFY20212116,90,963004128-fy-2021-annual-town-report.pdfFY 2021 Annual Town Reporthttps://www.lunenburgma.gov/DocumentCenter/…7ec4740034a2b9bd3aa7450f63c91d10e6ead472450…82620223
report-enrollment-mcasFY201813112,125,137,139,1435004125-fy-2018-annual-town-report.pdfFY 2018 Annual Town Reporthttps://www.lunenburgma.gov/DocumentCenter/…364a1138df754668ee59a499cf3d76b6ac006d47a4a…8052398
document archive provenance 616 rowsone row per source document

One row per source document: its archive path, how it reached us, its publisher URL, whether that link still opens (link_state), whether our copy still matches the publisher's (copy_state), and both checksums. Also which columns a workbook HIDES from a reader.

link_state says whether the publisher's copy still opens; copy_state whether it still matches ours.

columntypewhat it is
doc_idTEXTThe archive path of the document this row's figures came from.
Every fact row carries one. A figure that cannot name its document is not loaded.
pathTEXTWhere our copy lives in the archive.
source_typeTEXTnot described yet
basisTEXTWhether a figure is published, contractual, statutory, our measurement or our assumption.
ledger_atTEXTnot described yet
hidden_columnsTEXTnot described yet
urlTEXTThe publisher's own address for the document.
link_stateTEXTnot described yet
copy_stateTEXTnot described yet
remote_sha256TEXTnot described yet
local_sha256TEXTnot described yet

First 3 rows, in rowid order:

doc_idpathsource_typebasisledger_athidden_columnsurllink_statecopy_stateremote_sha256local_sha256
sources/district-budget/text/fy23-quarterly…sources/district-budget/text/fy23-quarterly…ledgerbudget2emptyNULLNULLNULLNULL5d3c93143333601a78715745056dc3d794dc2c55ed4…
sources/town-annual-reports/text/4128-fy-20…sources/town-annual-reports/text/4128-fy-20…forwardbudgetemptyemptyNULLNULLNULLNULL751b434df07d4e54eb17aa35601fb49eda03ce43cb1…
sources/town-budget/text/a106-fy24-finance-…sources/town-budget/text/a106-fy24-finance-…forwardbudgetemptyemptyNULLNULLNULLNULLe5b4f1ab3fe6bf3e0a1424ba2e318db988221897dc4…
extraction_plan archive provenance 553 rows 2011–2025one row per planned extract

What is planned to be read out of the annual reports and what state each item is in — including items deliberately not attempted, and why.

and what state each is in.

columntypewhat it is
datasetTEXTWhich extract family this row belongs to.
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
pagesTEXTWhich pages of the source this covers.
printed_headingTEXTnot described yet
tableTEXTWhich table this row describes.
grainTEXTWhat one row of this table represents.
The field that decides whether two tables can be joined or summed.
printed_totalTEXTThe total the source itself prints, quoted.
This is the independent check. An extract that does not tie to it is not trusted.
checkableTEXTnot described yet
extractableTEXTnot described yet
rowsTEXTHow many rows the extract produced. count
notesTEXTWhat we recorded about this row while reading it.

First 3 rows, in rowid order:

datasetfyeditionpagesprinted_headingtablegrainprinted_totalcheckableextractablerowsnotes
officials2016FY20167ELECTED OFFICIALSElected officials -- state and federalone officeholderemptynomessy9Substantively identical to FY2015 p8.
officials2016FY201610-15APPOINTED OFFICIALSAppointed town officialsone appointed position/memberemptynomessy180Header: 'TERMS ARE FOR ONE YEAR UNLESS OTHE…
monty_tech2024FY2024118OUR SCHOOL COMMUNITYMonty Tech member townsone member townemptynoclean18'Barre' is spelled correctly this year (FY2…
report_anomalies archive provenance 521 rows 2011–2025one row per anomaly

Things found while reading the annual reports that need a person: a total that does not tie, a heading that moved, a column that vanished.

columntypewhat it is
fyINTEGERFiscal year, ending 30 June. FY2026 runs 1 July 2025 to 30 June 2026. year
INTEGER everywhere except grant_award/grants_history (a multi-year ESSER award) and rate_register (one rate with no year).
editionTEXTWhich annual town report the row was read from, as that report names itself.
FY2016 has TWO editions — the report and an addendum. Summing on fy rather than edition counts that year twice.
documentTEXTThe source file the figure was read from.
pagesTEXTWhich pages of the source this covers.
tableTEXTWhich table this row describes.
kindTEXTWhat sort of row or record this is.
Meaning differs by table — see the per-table entry.
sourceTEXTWhere the figure came from, as the extractor recorded it.
A loose reference — a filename — not a resolved address.
detailTEXTnot described yet

First 3 rows, in rowid order:

fyeditiondocumentpagestablekindsourcedetail
2016FY20164123-fy-2016-annual-town-report.pdfemptyemptynotesurpriseThe fire department publishes a genuine wor…
2016FY2016-addendum4122-fy-2016-annual-town-report-addendum.pdf9-12Collection of taxes -- receivables summary …unreadable / OCR damagetable noteThe main report's pp47-49 print the header …
2020FY20204127-fy-2020-annual-town-report.pdf40-41Trust funds fiscal year 2020 summaryunreadable / OCR damagetable noteHere the table is transposed into column ru…
table_semantics archive provenance 81 rowsone row per table in this database

This page's own source. One row per table: its role, whose money it is, how finely it resolves money, its grain, what it holds, and what goes wrong if it is used carelessly.

Self-describing, and checked both ways: a table with no row here fails the build, and a row naming a table that no longer exists fails it too.

columntypewhat it is
table_nameTEXTWhich table this row describes.
Named table_name rather than table because table is an SQL reserved word and this table exists to be queried.
roleTEXTWhat kind of table it is: fact, dimension, extract, classification, provenance or derived.
Facts carry the measurements. Everything else describes, extracts, classifies or checks them.
scopeTEXTWhose money or whose subject the table is about: school, town, both, state or archive.
both is not a hedge — the ledger and the chart of accounts genuinely carry every department, and splitting them would be inventing a division the source does not make.
tierTEXTHow finely the money is resolved: 1 totals, 2 categories, 3 accounts. Blank where the table is not about money.
From the join map. Tier 1 answers what was appropriated and what is left; tier 2 which category is over; tier 3 what one account spent. The tier below 3 — which revenue paid which expense — no report reaches.
grainTEXTWhat one row of this table represents.
The field that decides whether two tables can be joined or summed.
what_it_answersTEXTThe question one row of this table answers.
cautionTEXTWhat goes wrong if this is used without knowing the above.
Every entry here was written after getting it wrong at least once.
default_queryTEXTThe query the schema page's modal opens this table with.
Set only where a bare SELECT is unhelpful — a fact table keyed on a code shows numbers with no words until its dimension is joined back.

First 3 rows, in rowid order:

table_namerolescopetiergrainwhat_it_answerscautiondefault_query
money_gapsclassificationbothemptyone row per gapThe honest list of what CANNOT be answered …This table is the honest list of what canno…empty
report_debtextracttownemptyone row per printed lineOutstanding DEBT and repayment schedules as…v1..v8 are ORDINALS. Split on `status`.empty
staff_roster_entriesfactschoolemptyone row per person per yearPEOPLE — one row per name the town printed,… name by nameempty

How this is arranged

Grouped by whose money it is, because that is the question people arrive with. Two other facets ride along as badges on every table.

badgewhat it tells you
Tier 1 · totalsWhat was appropriated and what is left, by department. Not which category, not which school, not which fund paid.
Tier 2 · categoriesWhether guidance, special education or transport is over — and whether the town's books and the district's budget agree on a code. Not which school inside a category: names truncate at ten characters, so MS GUIDANC and HS GUIDANC are both 2710.
Tier 3 · accountsWhat one account spent, and how much came in per fund.
fact dimensionHow the table is built. Facts carry the figures; dimensions say what a key means and are joined to, never summed.
the spineThe three grains everything else describes, extracts or checks.

There is a tier below 3, and no report reaches it. Which revenue paid which expense. That is the grey edge in the join map, and it is why this archive measures appropriations and says so.

The columns you cannot leave out

None of these raises an error when omitted. Each returns a number that is the sum of two different things, which is why every one of them has been got wrong here at least once.

columninwhat happens if you omit it
statusannual report extractschecked, check failed, no check. Summing across them mixes verified figures with unverified ones.
levelaccount, ledger_snapshotdepartment roll-ups sit in the same table as their own detail. Summing both adds the budget to itself.
account_typeaccountRevenue is stored NEGATIVE. Omitting it once made the town’s whole budget compute as minus $997,871.
periodledger_snapshotTwo periods are two different MUNIS reports of the same year, not two halves of it.
stagebudget_figureproposed, settled, actual. Rule 1: a rate measured across stages is partly growth and partly the step between them.
variantbudget_figureFY27 has four whole budgets — Balanced, Core, Level Service, Restoration. Without this you sum all four.
v1 … v8annual report extractsORDINALS, not column names: the first column of THAT PAGE that held figures. Summing v1 down a run adds one page’s APPROPRIATED to another’s TOTAL EXPENDED.

And one that is now fixed. fy was stored as TEXT in 44 tables and INTEGER in 18, so WHERE fy = 2023 answered against a third of the database and returned zero rows, with no error, against the rest. It is INTEGER everywhere now except three documented exceptions, and check_fy_types in build_db.py fails the build if a new table arrives without it.

Two databases, and they are not always the same one. Everything printed on this page — row counts, samples, coverage — is read from the LOCAL sources/data/lunenburg.db when the page is built. Open full table queries {api_base}, a copy pushed to Cloudflare D1 that can lag behind. Point it elsewhere with ?api=<base-url> on this page's own URL, or set LUNENBURG_API before building. If a table opens empty, or the button reports that it does not exist, that copy has not been pushed yet: python3 scripts/sync_d1.py. This is stated rather than hidden because two sources that usually agree are the ones that mislead when they stop.

Views — the joins already written for you

A view is the safe way to ask a question that needs two tables. Each one carries the splitting columns above in its own WHERE, so it cannot be got wrong the way a hand-written join can.

viewcolumns
v_appropriation_vs_spendfy, fund, dept, name, level, original, transfers, revised, expended, encumbered, surplus, surplus_pct, doc_id
v_budget_disagreementfy, stage, variant, line_key, label, source, value, is_kept, spread, kind
v_budget_scenarioline_key, label, fy, stage, variant, value, doc_id
v_burndept, name, fy, period, year_elapsed, spent_share, committed_share, pace_gap, available_now, doc_id
v_function_budget_vs_ledgerfunction_code, fy, period, ledger_revised, ledger_expended, ledger_encumbered, accounts, budget_lines, doc_id
v_fund_yearfund, name, kind, restriction, fy, period, revenue, spent, closing_balance, doc_id
v_interfundfund, fund_name, org, object, name, fy, period, budgeted, revised, received, still_to_come, pct_received, doc_id
v_line_budget_vs_actualline_key, label, fy, settled, proposed, actual, documents_disagree
v_provenancefact, doc_id, path, basis, copy_state, rows
v_revenuefund, fund_name, org, object, name, fy, period, budgeted, revised, received, still_to_come, pct_received, doc_id
v_revenue_classifiedfy, period, fund, account, class, class_label, budgeted, received
v_spending_classifiedfy, period, dept, department, control, control_how, voted, revised, expended
v_staff_rosterfy, school, page, name, role_raw, grade_or_dept, position_legacy, role_category, role_grade, classified_by, document
v_state_aidfund, fund_name, org, object, name, fy, period, budgeted, revised, received, still_to_come, pct_received, doc_id
v_transfer_historydept, name, fy, period, original, transfers, revised, moved_since_last, doc_id
v_workbook_budget_vs_actualline_key, row, fy, budget, actual, under_budget

What this database cannot tell you

Read from money_gaps, so this list is data rather than a thing somebody remembered to write down. Each is a question the published documents do not close.

sidewhat is missingwhy it cannot be answered
document_wantedDESE End of Year Financial ReportPublished by the state. — closes: Separates district spending by FUND, which is the one thing the town’s budget documents never show.
document_wantedThe Cherry Sheet itself — what the state told Lunenburg to expect, receipt by receiptThis archive holds no Cherry Sheet for any year. The Cherry Sheet is the state’s own statement of estimated aid and assessments to a Massachusetts town, and it is what a tax rate is set on. Without it the only measurement of aid estimate error this project can make is one net line on the Division of Local Services free cash proof — Excess/Shortfall Cherry Sheet Receipts (CL#8) — which lumps Chapter 70, Unrestricted General Government Aid, the abatement reimbursements and every other receipt into a single figure. So a year that came in $390,814 short can be reported as short and cannot be reported as short in anything. — closes: DLS Cherry Sheet CS 1-ER (estimated receipts) and CS 1-EB (estimated charges) for Lunenburg, FY2021 to FY2027.
document_wantedThe Town Manager’s revenue apportionment worksheetSeen once; we do not hold it. — closes: Documents the convention by which general-fund revenue is presented as split across departments. It cannot make the edge traceable — nothing can — but it makes the convention citable.
document_wantedThe period 13 ledgerThe year-end close. — closes: Reconciles FY2026 properly; period 12 is used for now.
document_wantedThe town’s Chapter 32B enrolment scheduleNot published anywhere in this archive; the town must hold one to administer the plan and set premium shares. — closes: Splits every insurance account between the town and the schools, in every year, instead of in the two years the split happens to be printed.
document_wantedWRRS annual actuarial valuation, by member unitPublished by the retirement system. — closes: Sizes the school share of the $2.39M pension assessment.
document_wantedWhere bus fee receipts are bookedA revenue account, a fund, or a statement that they are netted before booking. — closes: The fee schedule is published and verified; STUDENTBUS shows zero. A charged fee with no observable destination is the clearest single gap in this model.
document_wantedglytdbud-expense for the special revenue fundsThe identical report the town already runs for the general fund and for each of the four enterprise funds, pointed at funds 13xx/22xx/26xx–29xx instead. — closes: Turns every restricted edge above from presumption into traced fact — athletics, lunch, circuit breaker, extended day, and every grant.
heldWhat the $102,000.00 is that the FY2024 enterprise balance sheet classifies two ways at onceThe Combining Balance Sheet - Enterprise Funds in the FY2024 annual town report — printed twice, on printed pages 21 and 28, identically — prints 'Reserved for expenditures' as 400,000.00 in the Sewer column and 502,000.00 in the Totals (Memorandum Only) column, and prints 'Unreserved retained earnings' as 2,973,842.15 in the memorandum column where the four fund columns (1,813,817.53 Sewer, 51,333.93 Water, 181,853.82 Solid Waste, 1,028,836.87 PEG Access) add to 3,075,842.15. The memorandum column is $102,000.00 high on the first line and $102,000.00 low on the second, so the two cancel and Total Fund Equity (3,483,633.65), Total Assets, the identity and the sheet's own printed PROOF row all still tie in every column — compensating errors, invisible to any check that reads only totals. WHAT IS NOT ESTABLISHED: which presentation is right, or what the $102,000.00 is. A reservation sitting in a fund column that prints blank, a memorandum column keyed to a different worksheet row, and a reclassification made only in the total column all fit the same signature, and nothing on the page distinguishes them. These are ratepayer funds; nothing here is general-fund money. — closes: the Town Accountant's FY2024 trial balance for the enterprise funds, which would state the reserved and unreserved balance of each fund separately.
heldWhat the $87,293.86 is that the FY2023 annual report states twice and differentlyTwo tables printed in the same FY2023 annual town report state the money held in special revenue and enterprise funds, and they disagree. The combined balance sheet on printed page 24 gives TOTAL FUND EQUITY of $6,131,303.68 for SPECIAL REVENUE and $3,812,502.24 for ENTERPRISE, $9,943,805.92 together. The special revenue schedule in the same report prints a GRAND TOTAL carried forward of $10,031,099.78. The difference is $87,293.86, where FY2011, FY2013, FY2019 and FY2022 agree to the cent. It is not a misreading: the FY2023 page was transcribed and every column foots to its own printed TOTAL ASSETS, TOTAL LIABILITIES and TOTAL FUND EQUITY, the accounting identity holds in all six columns, and the long-term debt mirror agrees. So FY2023 is transcribed and deliberately NOT written into the dataset, which is why the combined balance sheet here stops at FY2022 while the special revenue schedule runs to FY2023. One explanation has been tested and RULED OUT: the fund 'Sale of Cemetery Lots' carried $87,308.09 in FY2023, within $14.23 of the gap, which suggested a fund counted in one statement and classified elsewhere in the other. It is not that — the same fund appears in the schedule in all thirteen years including the four where the two documents agree to the cent, so it is counted consistently and the near-match is a coincidence. What the difference IS remains unestablished; nothing here says which document is right, nor whether it is connected to the $17,861.24 of grant funds the town restated between the FY2022 and FY2023 reports. Those are two different amounts and nothing joins them. — closes: the Town's FY2023 trial balance or general ledger fund balances as of 30 June 2023, which would say which of its own two published tables the accounting system agrees with.
heldWhat the PEG Access enterprise fund actually held at 30 June 2025Three figures for the same fund on the same date appear in the same FY2025 annual town report and no document in this archive prints a line between any two of them. The PAC report's FY25 REVENUE vs EXPENSES table (printed page 60, pdf 64) gives an Ending Balance of $30,632, computed on its own face as Beginning Balance $208,772 less Expenses $178,140 -- and the prose beside it says the $208,772 was "the budget starting balance", so the ending balance is unspent spending authority rather than money. The Treasurer's Cash schedule in the same report prints Bartholomew- PEG Access Enterprise Fund 782,591.31$. The Combining Balance Sheet - Enterprise Funds (printed page 21, pdf 25) prints PEG Access Total Fund Equity of $1,072,661.74, against $1,028,836.87 the year before -- a rise of $43,824.87, where the statement's own revenue less expenses is $262,565 - $178,140 = $84,425. The two do not reconcile and nothing on either page relates them. WHAT IS NOT ESTABLISHED: which quantity any of the three is; a budget balance, a bank balance and a fund equity are three different things and the report labels none of them as such. -- closes: the Town Accountant's FY2025 year-end statement of revenues, expenditures and changes in fund balance for the PEG Access and Cable Related Enterprise Fund, which the annual report does not contain.
heldWhat the town held town-wide at 30 June 2024 and 30 June 2025The FY2024 and FY2025 annual town reports print NO combined balance sheet across all fund types and account groups — the schedule the reports carried every year from FY2011 to FY2023. In both editions the table of contents lists 'Balance Sheet for FY Ending June 30, 2024' at Page 21 and 'Balance Sheet for FY Ending June 30, 2025' at Page 21 respectively, and printed page 21 of each holds the Combining Balance Sheet - Enterprise Funds instead; FY2024 prints that enterprise sheet a second time on page 28, which is where its contents page says it should be. So for two consecutive years the only balance sheet the town published covers four ratepayer enterprise funds and says nothing about the general fund, special revenue, capital projects, trust and agency, or long-term debt. The consequence is that the general fund's cash, receivables, reserves and undesignated fund balance — the figures free cash is built out of — cannot be read for either year, and the balance_sheet dataset stops at FY2023 for that reason rather than by choice. WHAT IS NOT ESTABLISHED: whether the town-wide sheet was produced and dropped in layout or never produced; nothing in either report says. — closes: the Town Accountant's year-end balance sheet submitted to the Division of Local Services for FY2024 and FY2025, or the town's audited financial statements for those years.
money_inBus feescharged by published policy · no destination found in any ledger
money_inGrants received in earlier yearsspent now, booked then · nine funds, no FY26 revenue
money_inHow much of free cash is the schools’Free cash is certified for the town as a whole. Neither the DLS proof nor the Town’s own undesignated fund balance roll-forward attributes any component to any department, so nothing published says how much of it the school department’s unspent appropriation produced — nor how much of any appropriation of it reaches the schools. The projection on this site is built from budget columns and free cash is derived from actuals; they are subtracted once, side by side, and never joined. — closes: a departmental turnback schedule for the year-end close, which would split the unexpended appropriations line by department.
money_inHow much of the FY2027 enacted state-aid increase is receipts and how much is offsetting assessmentsmodel/finance.py grows a FY2027 base of $11,404,917 + $471,121. The first is the Governor’s GROSS cherry sheet Total Receipts, printed by the FY2027 Town Meeting booklet. The second is recorded in fy27-and-the-override.md as NET — "+$471,121 net (Ch.70, charter/choice receiving tuition, Smart Growth, UGGA, vets/elderly exemptions; offset by higher charter assessments)". A gross figure and a net figure are being added, so the gross FY2027 receipt estimate the projection actually grows is not established, and neither is how much of the increase the Town keeps. This archive holds no Cherry Sheet for any year, which is the only document that prints receipts and assessments side by side. — closes: the FY2027 Cherry Sheet for Lunenburg on the enacted budget (DLS form CS 1-ER), which states each receipt and each assessment separately.
money_inStudent activity accountsheld by the school under its own authority · not in the town’s books at all
money_inTrust fund incomescholarships, cemetery, stabilisation · extract is check-failed
money_inWhat quantity the Town’s own published state-aid growth rates of 5.3% and 1.4% measureThe FY2027 Town Meeting booklet states that "From FY13-FY23 state aid increased at an annual rate of 5.3%, but in the last four years, it has slowed to approximately 1.4%" (3765-town-meeting-booklet-including-warrant, line 338), and does not say which figure it grew. Rebuilding the Town’s own Subtotal State Aid line from its own revenue/expenditure worksheets — 23 consecutive budget years, FY2005 to FY2027, notes/findings/state-aid-budget-series.csv — gives 4.5660% for FY2013→FY2023 and 1.9144% for FY2023→FY2027. Neither published rate is reproducible from the Town’s own published series, so a rate quoted to Town Meeting cannot be checked against anything. — closes: the Cherry Sheets themselves (DLS form CS 1-ER for Lunenburg, one per year), or the Town Manager’s working file behind the FY2027 booklet’s revenue narrative.
money_inWhere the PEG Access balance went between FY2019 and FY2021The fund's carried balance is continuous in the report from FY2015 to FY2019 -- each edition's Starting Balance is the previous edition's Ending Balance to the cent -- and then stops being a series. FY2019 prints a Total of $573,837.37 (starting balance, plus revenue, less expenses, plus the Comcast Tech Fund of $124,796.01); FY2020 opens at $447,813.36, $126,024.01 lower; FY2021 opens at $272,000.00, which the same page's prose states is the budget rather than a balance. One document explains part of it: Article 16 of the FY2019 Annual Town Meeting established a PEG Access Enterprise Fund under MGL c.44 s53F1/2 and transferred into it the balances of the PEG Access and Cable Related Receipts Reserved For Appropriation Fund and the Comcast Tech Capital Grant Fund as of 30 June 2019. So the fund changed legal form at exactly this point, which is why the statement changes shape. WHAT IS NOT ESTABLISHED: the amounts transferred, and therefore whether the $126,024.01 step is the transfer, a closing entry, a restatement, or something else. There is also a smaller unexplained step earlier, FY2017's Ending Balance $303,909.77 against FY2018's Starting Balance $303,551.54, $358.23 apart, with no fund change to account for it. -- closes: the Town Accountant's opening and closing trial balances for the PEG Access and Cable Related funds for FY2018, FY2019 and FY2020, showing the transfers in and out.
money_inWhether Lunenburg’s free cash is unusual for a town its sizeThe DLS proof carries no denominator — no population, budget, revenue or levy for any of the nine towns, Lunenburg included. So Littleton’s $11.3M against Shirley’s $272K says nothing about which is closer to its own target, and free cash as a share of the operating budget cannot be computed for a peer at all. Composition and volatility are ratios and do compare; the level does not, and is not shown. — closes: the Tax Rate Recapitulation (Schedule A) for each town, which prints the operating budget the ratio needs.
money_inWhether a shortfall in state aid falls on the schools or on the rest of the townChapter 70 is 35% of the school appropriation and the town has no vote on it, so which side of the budget absorbs a miss is the question a resident actually has. Nothing published answers it. The free cash proof states one net cherry sheet figure for the whole town; the general ledger’s state aid accounts share no organisation code with any expense account, 0 of 222, so no aid dollar can be followed to anything it paid for; and the appropriation is voted before the final aid number is known. A year where aid rose and the appropriation rose with it and a year where aid was flat and the town covered the difference are different facts about the world and identical facts on the page. — closes: the Town’s FY-end recap (Form A-1) beside the Cherry Sheet for the same year, which states estimated and actual receipts on one page.
money_inWhich departments’ unspent appropriations produced the free cashMoney appropriated and not spent is the largest single component of Lunenburg’s free cash — 47% of five years of it, and 66% of the record 2025 certification. It is published as one town-wide figure across 67 departments. Prudence, a post left vacant, a project that slipped into the next year and a line that was over-budgeted from the start are four different facts about the world and one number on the page. — closes: the period 13 general ledger, showing budget, expended and turnback for each department at the year-end close.
money_inWhy DLS certifies a different amount from the free cash its own proof identifiesThe Division of Local Services’ free cash proof cross-foots exactly: in all 45 town-years of the nine-town set the eleven component lines sum, to the cent, to the workbook’s own Identified Free Cash July 1,. But that is not the figure DLS certifies. Current Year Calculation — the number the Town quotes, the number the Finance Director announced, and the number that carries into the next year — differs from it in all 45, by $361,912 for Lunenburg in 2025 and by 69% for Uxbridge in 2024. The workbook prints no reconciling line, and nothing in this archive states what the adjustment is. — closes: DLS’s free cash certification letter to the Town, which states the adjustments made between the balance sheet the Town submitted and the amount certified.
money_inWhy the Town’s undesignated fund balance and DLS’s free cash differTwo publishers describe the same 30 June balance sheet and print three different figures. The Town’s annual report roll-forward gives an undesignated fund balance of $4,236,488.24 at 30 June 2025; DLS identifies $3,716,282 of free cash on the same date and certifies $3,354,370. Each worksheet cross-foots exactly to its own printed total, and the FY2024 report’s closing balance is the FY2025 report’s opening one to the cent — so neither is in error, and no document in this archive prints a line between any pair of the three. — closes: the Town’s free cash submission to DLS (the balance sheet and the reconciliation of receivables and deferred revenue that accompanies it).
money_outDebt service by projecttwo accounts for ALL town borrowing · school buildings cannot be separated
money_outSchool share of Medicare, active health insurance and the insurance reservesFive of the seven FY2026 insurance accounts — active health insurance, Medicare, life insurance, insurance cost control and Public Employee Committee expenses — carry nothing in their names that says which side of the town they are for, so the school portion of them is not separable in any year. — closes: The town’s Chapter 32B enrolment schedule, which counts insured employees and retirees by department.
money_outSchool share of the pensioninside WRRS · town and school staff together, no published split
money_outSchool share of the town’s health insurance before FY2026The town’s insurance department prints one undivided Health Insurance CH 32B line in fifteen of the sixteen annual reports · a school share is named only in the FY2023 report and in the FY2026 ledger, so no year between them can be split. — closes: The town’s Chapter 32B enrolment schedule, which counts insured employees and retirees by department and would split every year rather than the two that happened to be printed.
money_outWhat any special revenue fund boughtno expense report exists for these funds · purpose is presumed, never observed
money_outWhat the PEG Access fund spent in FY2020 and in FY2024In both years the annual town report prints two totals for the same year's PEG expenses and they differ. FY2020, both tables on printed page 75: FY20 Line Item Expenses by Percentage foots to Total $116,933.22 and FY20 REVENUE vs EXPENSES prints Expenses $116,933.54 -- 32 cents apart. FY2024: the statement on printed page 63 prints Expenses $174,150 and the line-item table on printed page 64 foots to Total $174,151.16, and since that statement is printed in whole dollars throughout, rounding 174,151.16 gives 174,151 rather than 174,150. Each table foots to its own printed total exactly, so neither is internally wrong; they disagree with each other. FY2017 is a third case of the same shape: its ten printed expense lines add to $74,665.74 against a printed TOTAL of $74,215.73, a difference of $450.01, of which $450.00 is the Vendor Expenses line that the facing pie chart also omits. WHAT IS NOT ESTABLISHED: which figure is the year's expenditure in any of the three years. -- closes: the MUNIS year-to-date expense report (glytdbud) for the PEG Access and Cable Related Enterprise Fund for FY2017, FY2020 and FY2024, the same report the town already runs for the general fund.
money_outWhat the capital transfers boughttwo transfer lines · no project detail
money_outWhat the four ADJ EXP journal entries moved, and from where$254,121.18 — 65% of everything that reached the athletics revolving fund in FY2025 — arrived on four general-journal entries whose entire description is an expense adjustment made per a memo. An entry raising cash in a fund and labelled as an expense adjustment fits at least three readings: expenses charged here and later moved elsewhere, a transfer in from another fund, or a correction of charges posted to the wrong account. Those are different facts about the world and identical facts on the page, and the same shape of entry could be adjusting any fund in the town without either budget document showing a trace. — closes: the five memos the ledger names, dated 08/12/24, 01/30/25, 05/02/25, 07/02/25 and 08/20/2025.
money_outWhether a general fund athletics line is net of the revolving fundIn FY2024 the town’s comparable athletics lines came to $124,301 against $351,643 the district’s own sport-by-sport workbook totals for the same categories — so the appropriation covered 35% of the cost. That is measurable for FY2024 and FY2025 only, because those are the only years anybody published both halves. For every other year, and every other programme, a line that rose because the cost rose looks exactly like a line that rose because a fund stopped paying part of it. — closes: the MUNIS Account_Detail export for the general fund athletics orgs S3066672 and S3066671, all object codes.
peopleHow many children Chapter 70 is actually paid forThe aid is calculated on a Foundation enrollment of 1,599 in DESE’s FY27 Chapter 70 summary. DESE publishes three other counts for the same district — Student Headcount, In-District FTE Pupils and Total FTE Pupils — and in the latest year published they are 1,563, 1,568.9 and 1,665.9. Four numbers, one agency, none of them equal, measured on different dates and counting different things. So every per-pupil figure on this project, including aid per pupil, is a division by a count whose definition has to be stated with it, and no published document reconciles the foundation count to the children in the buildings. — closes: DESE’s FY27 foundation enrollment worksheet for Lunenburg, which states the October 1 count by grade and category the formula was run on.
peopleHow many children play sportsTwo town documents give 593 and 649 for the same year and count different things: one counts fee categories, the other counts participations by sport, and a participation is not a child — one student playing three seasons is three of them. Some workbook rows are negative, subtracting out-of-district athletes back out, so a season total is a net figure rather than a headcount of bodies. Nothing published is an unduplicated count. — closes: an unduplicated athlete roster, or a participation report that states whether it counts students or participations.
peopleHow many people the schools actually employThe town publishes per-school staff ROSTERS in every annual report, FY2011 to FY2025 — a list of names. A roster carries no FTE, so a 0.4 music teacher and a full-timer are one row each, and it is a point in time, undated within the year. A count of names the town printed is a real quantity and it is not a staffing level. — closes: a staffing report stating FTE by position and year.
peopleWhether a budgeted position was filledA budget line is money the town has to raise, not a person in a chair. A line funded all year for a post vacant half of it looks identical on the page to one that was filled. Bounded, not settled: the rosters show who was printed, which narrows the question without answering it. — closes: a filled-position list, or payroll by position rather than by name.
peopleWhich fund pays which postThis is the load-bearing one. The rosters name people and the budget names dollars, and nothing published joins them to a funding source. So a paraprofessional line rising cannot be distinguished from a grant that was paying for those posts ending — which is exactly what the special education escalator rests on. — closes: DESE's End of Year Financial Report, which separates spending by fund.

Examples — real questions, run against the live database

Every query below is run against the live database when this page is built, so a question that stops answering breaks the build rather than sitting here looking answerable. Two of them return nothing, and that is the honest state of the archive rather than a fault.

partlyEvery source of revenue in FY2022, by name and amount, with our classification
SELECT fy, printed_name, label, class, amount, document, page FROM revenue_history WHERE fy = 2022 ORDER BY amount DESC

100 rows

fyprinted_namelabelclassamountdocumentpage
2022REAL ESTATE TAXESREAL ESTATE TAXESlevy28756474.974129-fy-2022-annual-town-report.pdf26
2022CH 70 SCHOOL AIDCH 70 SCHOOL AIDstate7823618.04129-fy-2022-annual-town-report.pdf26
2022TRANSFERS FROM OTHER FUNDSTRANSFERS FROM OTHER FUNDStransfer2391150.834129-fy-2022-annual-town-report.pdf26
2022MOTOR VEHICLE EXCISEMOTOR VEHICLE EXCISElocal1839037.964129-fy-2022-annual-town-report.pdf26
2022UNRESTRICTED GEN'L GOVT AIDUNRESTRICTED GEN'L GOVT AIDstate1162230.04129-fy-2022-annual-town-report.pdf26

…and 95 more.

class says what KIND of revenue it is — levy, state aid, local receipt, transfer — which is a property of where the money came FROM. It does not say what the money went on to pay for, and for anything landing in the general fund nothing can: that money is fungible by law and no document apportions it. Only restricted funds have a traceable destination, and those are in money_edges.

The classification is joined in at build time from money_classification, so the name the report printed and the group we assigned are in one row.

not yetThe same question for FY2023
SELECT fy, printed_name, amount FROM revenue_history WHERE fy = 2023

0 rows

Returns nothing, and that is the correct answer rather than a failure. revenue_history carries only years whose extract was CHECKED against the report’s own printed total. FY2023 has 10 unchecked rows in annual_report_receipts; loading them here would make five verified years and one guess look identical.

answersWhat was budgeted for the Superintendent, FY2022 to FY2025
SELECT fy, stage, label, value FROM budget_figure WHERE label LIKE '%Superintendent%' AND fy BETWEEN 2022 AND 2025 ORDER BY fy, stage

10 rows

fystagelabelvalue
2022actualSuperintendent165000.0
2022proposedSuperintendent157000.0
2022settledSuperintendent165000.0
2023actualSuperintendent171000.0
2023proposedSuperintendent171000.0

…and 5 more.

One row per stage, and they are different quantities: proposed is what was asked for, settled what was voted, actual what the later document reported. Rule 1 — never compute a growth rate from one stage to another.

budget_figure is one row per line × year × stage × variant. Filtering on a label works here because "Superintendent" is unique; most lines are not, which is what line_key is for.

partlyEvery line in the school budget for FY2024, by name and amount
SELECT fy, stage, label, value FROM budget_figure WHERE fy = 2024 AND stage = 'proposed' ORDER BY value DESC

319 rows

fystagelabelvalue
2024proposedHealth Insurance3076306.0
2024proposedH.S. Teachers/Regular2899395.0
2024proposedM.S. Teachers/Regular2027997.0
2024proposedE.S. Teachers/Regular1527124.0
2024proposedP.S. Teachers/Regular1033468.0

…and 314 more.

FY2024 has no settled stage in the archive — only proposed and actual. So this is what the district ASKED for that year, not what the town voted. The stage you get is not the stage you named, and the coverage table below is the only place that difference is visible before you query.

Which stages exist varies by year, so a query written for one year can silently return nothing for another.

answersWhere the money actually went in FY2026, by department, with who decides
SELECT department, control, voted, expended FROM v_spending_classified WHERE fy = 2026 AND period = 9 ORDER BY expended DESC LIMIT 12

12 rows

departmentcontrolvotedexpended
SCHOOL DEPARTMENTdelegated26247474.015736640.86
WRRS ASSESSMENTassessed2392572.02392572.0
INSURANCEbargained3713520.02240086.02
POLICE DEPARTMENTdiscretionary2406172.01686886.24
FIRE DEPARTMENTdiscretionary1717588.01169012.23

…and 7 more.

control is our classification of who holds the decision, not a published field. voted and expended are the town’s own figures; the column beside them is ours and is labelled that way everywhere it appears.

Spending IS traceable to a department, which is why this answers where the revenue question above cannot.

answersThe full ledger for one account across the year
SELECT l.fy, l.period, a.name, a.account_id, l.original, l.revised, l.expended, l.available FROM ledger_snapshot l JOIN account a USING (account_id) WHERE a.account_id LIKE '0100-S%' AND l.fy = 2026 ORDER BY l.expended DESC LIMIT 10

10 rows

fyperiodnameaccount_idoriginalrevisedexpendedavailable
202612HEALTH INS0100-S5991992-5700013701195.03701195.03622881.6578313.35
202612HS TEACHER0100-S2066101-5110012719099.02719099.02791452.42-72353.42
202612MS TEACHER0100-S2055101-5110012038757.02038757.02022044.4416712.56
202612ES TEACHER0100-S2044101-5110011552471.01552471.01556544.17-4073.17
202612PS TEACH R0100-S2072101-5110011172728.461172728.461095292.3977436.07

…and 5 more.

period is a point in time inside the year, not a stage. Two periods of the same year are two different MUNIS reports and adding them double-counts.

The S prefix is the structural way to find school accounts — it does not depend on any name, and MUNIS names are ten characters typed by a person.

Generated by scripts/build_schema_page.py from the live database on 2026-09-07. Do not edit — run the script. The CSVs in sources/data/ are the source of truth; this database is a derived read model, rebuilt from scratch on every run.