The corpus › Decisions

The Greenbook series

A decision record · the-greenbook-series · cited by 2 pages

An attempt on lsc-budget’s recorded blocker, which was wrong in three ways. LSC publishes an education budget analysis for every main operating budget from the 124th General Assembly to the 136th, as enrolled, at a stable URL — and for the 129th onward as a spreadsheet rather than a PDF. The blocker is replaced with what is actually in the way; the extraction is a separate piece of work and is scoped here rather than started.

Context Contents

lsc-budget was named in roughly twenty-one places across the corpus, more than any other blocker: the appropriation history behind the casino earmark, the proration factor’s own history, EdChoice’s appropriation, the four uncodified supplements’ statutory home, the tangible-personal-property phase-down schedule, four fiscal-period nodes that do not know which act appropriated their biennium, and the pre-2000 record. It was the highest-fan-out unresolved thing in the repository.

Its still_blocked string read: “wired for one document, the final analysis of the current budget act; the redbooks, the Catalog of Budget Line Items and the per-district simulations are unretrieved, so the continuous appropriation-line series and the pre-2000 record are not built.”

That string had never been tested. tax-abstract is the precedent — it sat declared for twelve phases behind a blocker nobody had attempted, and the real obstacle turned out to be something else entirely. The same test applies here: probe whatever path exists, not the one the blocker names.

The decision Contents

Probe LSC properly, record what is there, and rewrite the blocker to describe the actual obstacle. Do not begin the extraction in the same breath — it is a phase of its own, and the value of this one is that the next person starts from a true description.

The blocker was wrong in three ways.

It undercounted what is already wired. Two documents are in the registry, not one: the H.B. 96 final analysis and the H.B. 96 redbook. The redbook was added phases ago and the sentence was never updated. Nothing caught it, because the test on still_blocked checks that the string exists and is long enough to mean something, not that it is true.

It treated retrieval as the obstacle. LSC publishes an education budget analysis for every main operating budget from the 124th General Assembly through the 136th — thirteen consecutive bienniums, FY2002-03 through FY2026-27 — at /assets/legislation/{ga}/{bill}/{stage}/files/{bill}-edu-greenbook-as-{enrolled,enacted}-...pdf. All thirteen download on a plain request from a self-identifying agent. The index that lists them is /budget/{ga}/main-operating-budget, and /budget/appropriation-biennium-reference-list maps every General Assembly to its operating biennium.

And it named the wrong document. The redbook is LSC’s analysis of the bill as introduced, so its amounts are the executive proposal — a distinction the registry note states carefully and the corpus repeats wherever it quotes a figure. The greenbook is the same analysis as enrolled, so its amounts are enacted. One exists for H.B. 96, at a sibling URL to the redbook already in the registry. This is the second time a convenient version has been sitting one path segment away from the correct one; the first was the as-passed-by-the-House analysis, caught because its numbers contradicted the department’s payments.

Consequences Contents

The appropriation-line series is reachable, and in two formats rather than one.

From the 129th General Assembly onward LSC also publishes the line-item detail as a workbook, under two names for the same artifact: budget-in-detail for the 129th through 132nd and appropriation-spreadsheet from the 133rd. Both come in a variant carrying actual expenditures and adjusted appropriations beside the enacted amounts. The columns are Budget | Fund Group | Fund | ALI | ALI Name | FY ..., every agency in one sheet, which spreadsheet already reads natively.

So the series splits at the 129th:

  • 129th-136th, FY2012-FY2027. Workbooks. Native reader, no PDF text extraction, and both appropriations and actuals from the publisher rather than derived.
  • 124th-128th, FY2002-FY2011. Greenbook PDFs only. Every one parses — 63 to 153 distinct appropriation line items each — but by column position rather than by token order, because pdftotext -layout leaves an unfunded year as an empty column and the % Change column prints N/A, so counting tokens left to right silently shifts a row’s years. That is the whole difficulty, and it is a known one.

The pre-2000 record is partly reachable, which the blocker denied outright. The 124th’s greenbook carries FY1999 and FY2000 actuals in its line-item table. It is also the only contemporaneous account this repository can reach of H.B. 94 of the 124th General Assembly — the post-DeRolph II formula act that DeRolph III was about, and a corpus node whose description says the act “survives here only through DeRolph III’s recitation of it, which is a court’s account rather than the enacted text.” An LSC analysis of the enrolled act is not the session law, and it is not a court’s summary of it either.

What stays blocked, and it is now a narrower claim. Before FY1999 there is nothing here: the greenbook series begins at the 124th and its earliest actuals are FY1999, so the pre-2000 record in the sense the corpus means it — the Foundation Program era, DeRolph I, the equal yield formula — still needs the session laws. The Catalog of Budget Line Items and the per-district simulations were named in the old blocker and are not addressed here; the Catalog has an index page at /budget/catalog-of-budget-line-items and was not opened.

Four fiscal-period nodes can be answered once this is wired and not before. FY2014-15, FY2016-17, FY2018-19 and FY2020-21 carry appropriating_bill as [unentered] with “Needs lsc-budget”. The acts are named on the index pages retrieved here — H.B. 59, H.B. 64, H.B. 49 and H.B. 166 — but writing them in now would be a claim resting on a page this repository does not hold, which is the failure mode hb-70 was recorded as unreachable to avoid. They are filled when the source they rest on is committed and digest-pinned.

Amendment Contents

The workbook era was attempted and reverted, and the attempt is why this section exists.

All eight workbooks were wired, a header-driven extractor written, and 3,950 rows produced before the output was read. It was wrong in two ways that a row count does not show, and both are properties of the source rather than of the parser.

The variant that carries actuals does not carry the enacted appropriation. LSC publishes each biennium’s line-item detail more than once: a plain as-enrolled workbook at enactment, and a with-actual-expenditures-and-adjusted-appropriations workbook revised afterwards. The second supersedes the enacted column for any year that has since closed — so the 132nd’s workbook, which was the obvious one to take because it carries actuals, labels FY2018 Actual and FY2019 Adjusted Approp. and states the enacted FY2018-19 appropriation nowhere at all. The extraction produced zero appropriation rows for that biennium and did not fail. Getting both claims means retrieving both variants, sixteen workbooks rather than eight, and keeping which document each figure came from.

A fiscal year does not identify a column. Several workbooks carry more than one column naming the same year — fund-specific splits, and variance columns beside the totals. The 129th has two columns headed FY2012, one of them zero throughout; the 133rd has three naming FY2019, which for 200550 Foundation Funding read $6,970,372,221.42, $167,292,415.57 and $0.02. Keyed on (year, kind) those collapse into three rows that disagree, with nothing in the fixture to say which is the appropriation. The parser has to key on the column and refuse on a collision rather than emit all of them.

And the inference rule this record proposed — a bare FY 2026 column is an appropriation if the year is in the biennium — is wrong for exactly the workbooks that need it. In the with-actuals variant a bare column for a closed biennium year is spending, not appropriation, so the 129th’s FY2012 and FY2013 were labeled appropriation when they are neither enacted nor, in one of the two columns, anything at all.

Nothing was committed. The alternative — ship it and caveat it — was refused on the grounds this repository keeps arriving at: a misdated or mislabeled figure is not a parse failure, produces a plausible number, and nothing downstream would catch it. The next attempt takes both variants per biennium and treats a repeated year as an error. The PDF era was measured, and the approach this record proposed for it does not work.

“Read the tables by column position rather than token order” was right about the hazard and wrong about the method. The obvious source of column positions is the table header, and the header is not where the data is.

Each detail table repeats per page, and pdftotext -layout lays every page out independently: across the 124th’s six pages the same five columns sit at character 60/75/91/107/137 on one and 64/82/100/119/148 on another, so positions must be read per page rather than per document. That part works. What does not is that the header labels are narrower than the columns of figures beneath them. In the 127th the labels land at 67, 81 and 91 while the amounts they head are spread far wider, and an amount assigned to its nearest label goes to the wrong year.

Measured, with per-page positions and nearest-label assignment: the 125th and the 128th parse with no ambiguous rows, the 124th has 6 and the 127th has 16 — rows where two amounts claim one column, which means at least one of them is misdated. That is 22 rows out of 494, and the reason it cannot simply be tolerated is that a misdated appropriation is a plausible number in the wrong year rather than a parse failure.

The 126th has no line-item detail table at all. Five markers in the other four documents, none in that one; its appropriations appear only in the narrower per-category tables. FY2006-07 will need a different reader or will stay absent.

What the next attempt should do instead of reading the header: calibrate the columns from the amounts. Within one page the figures are right-aligned, so their positions cluster tightly, and the number of clusters is the number of columns. Order the clusters left to right and map them onto the years the header names, in order — using the header for which years and the data for where they are, which is the division of labor each is actually reliable for. A page whose cluster count and year count disagree is a page to refuse rather than to guess at.

This record’s own closing sentence was the next thing found wrong. It left the Catalog of Budget Line Items and the per-district simulations unaddressed and said so plainly, which was honest — and then that sentence sat in still_blocked through two further phases, exactly as the string it replaced had. “The catalog of budget line items” opened both. The Catalog is not blocked and covers both bienniums this record calls unretrievable, FY2006-07 and FY2012-13, from a document that prints actuals and appropriations in adjacent labeled columns — which is the defect the workbook attempt above was reverted for. The per-district simulations are not LSC’s publication at all. Neither finding changes the PDF and workbook analysis here; both narrow what it is needed for.

Alternatives considered Contents

Start the extraction in this phase. Rejected on scope rather than on doubt. Thirteen documents across two formats and three PDF layout eras, a fixture, a reconciliation against each document’s own published fund-group totals, a catalog record, and four corpus fields is a phase; beginning it inside the phase that discovered it would have produced a half-wired registry and a blocker that was accurate about nothing again.

Wire only the workbook era, 129th-136th. It is eight of thirteen bienniums, it needs no PDF work at all, and it would have been a clean, quick result. Rejected because it stops exactly where the interesting part starts: FY2002-FY2011 covers the post-DeRolph settlement, the Evidence-Based Model, the tangible-personal-property phase-out and the Bridge Formula, and those are the years the corpus documents in prose and cannot price.

Take the amounts by token order rather than by column position. Simpler, and wrong in a way that would not show: a row whose FY2001 column is blank and whose % Change column reads N/A yields the same token count as a fully populated row with different years, so the error is a silently misdated figure rather than a parse failure. Rejected before it was written, on the strength of the three conventions in conventions.rs, all three of which are this same shape.

Cited by Contents