You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
BD — one cell per column, every value newline-separated inside it, and the whole thing nested in the item's "Summary" table rather than standing alone:
So parse_bid_tables sees one "bidder" whose name is a five-line blob, and its header check (first column matches a bidder heading) does not fire because the header is a row inside another table, not the table's own header row.
Why it is worth doing
These are the losing bidders for 2009-2016 — the data rewrite spec §2.5.2 called "never published anywhere. Unrecoverable." (corrected in #88). #84 recovered them for 2017+; this is the other seven years, and the agendas are already on disk under <DATA_DIR>/council/agendas/. No fetching, no browser.
417 agendas at BA's rate (~26 bids each) suggests roughly 5,000 more bids, though that should be measured rather than assumed.
It also strengthens #77: pre-Ariba matching leans on (supplier, award value), and per-bid supplier+price for 2009-2016 is a stronger signal than the single award figure it uses today.
What has to be worked out
Zip the parallel cells. Names and prices are positional: line i of the name cell pairs with line i of the price cell. If the counts differ — a footnote line, a wrapped name, a blank — pairing silently misaligns and attributes a bid to the wrong firm. Refuse to pair unequal-length cells rather than guess; a misattributed bid is worse than a missing one.
The header is a row, not a header. Detection has to look for a row whose cells contain a bidder heading and a price heading, then take the following row as data. That is a different shape from _BIDDER_HDR.match(header[0]).
Do not break BA. 12,383 bids parse correctly today. Whatever handles BD must be additive, and the existing tests must stay green.
The known traps still apply (Link bids to the supplier dimension — 5,096 bidders are free text today #87): footnote markers on names and prices, inline row numbering, Non-Compliant / No bid written in the price column, and hst_basis — BD says "Bid Price (Incl. HST)", so the basis differs per table there too.
Parse the BD bid tables and report counts per year before storing anything, the same way #84 did. The corpus is local and the parsing is offline, so sizing it is free — and it will surface whether 2009-2012 is a third format.
Related: #84 (which built the row-major extractor), #90 / PR #92 (which scraped the BD agendas), #93 (the 2009-2012 composite format), #87 (the supplier link these bids feed).
#84 extracts 12,383 bids from the Bid Award Panel (BA) agendas. #90 (PR #92) added 417 Bid Committee (BD) agendas covering 2009-2016 — and they yield 36.
Not because BD agendas lack bid tables. They have them. They are laid out differently.
BA is row-major; BD is column-major
BA — one row per bidder, which is what
parse_bid_tablesexpects:BD — one cell per column, every value newline-separated inside it, and the whole thing nested in the item's "Summary" table rather than standing alone:
So
parse_bid_tablessees one "bidder" whose name is a five-line blob, and its header check (first column matches a bidder heading) does not fire because the header is a row inside another table, not the table's own header row.Why it is worth doing
These are the losing bidders for 2009-2016 — the data rewrite spec §2.5.2 called "never published anywhere. Unrecoverable." (corrected in #88). #84 recovered them for 2017+; this is the other seven years, and the agendas are already on disk under
<DATA_DIR>/council/agendas/. No fetching, no browser.417 agendas at BA's rate (~26 bids each) suggests roughly 5,000 more bids, though that should be measured rather than assumed.
It also strengthens #77: pre-Ariba matching leans on (supplier, award value), and per-bid supplier+price for 2009-2016 is a stronger signal than the single award figure it uses today.
What has to be worked out
_BIDDER_HDR.match(header[0]).Non-Compliant/No bidwritten in the price column, andhst_basis— BD says "Bid Price (Incl. HST)", so the basis differs per table there too.Suggested first step
Parse the BD bid tables and report counts per year before storing anything, the same way #84 did. The corpus is local and the parsing is offline, so sizing it is free — and it will surface whether 2009-2012 is a third format.
Related: #84 (which built the row-major extractor), #90 / PR #92 (which scraped the BD agendas), #93 (the 2009-2012 composite format), #87 (the supplier link these bids feed).