Skip to content

Bid Committee bid tables are column-major — 417 BD agendas yield 36 bids #94

Description

@alexwolson

#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.

bids by series:  BA 12,383   BD 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_tables expects:

['Bidder Name', 'Bid Price (including H.S.T.)']
['Timbel Limited',        '$4,858,887']
['2489960 Ontario Inc.',  '$6,590,403']

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:

row[3]  3 cells: ['Number of Bids: Five (5)', 'Firm Name', 'Bid Price (Incl. HST)']
row[4]  2 cells: ['Ferpac Paving Inc.\nMaple-Crete Inc.\nAqua Tech Solutions Inc\n...',
                  '$961,137\n$1,371,975\n$1,399,918\n...']

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

  1. 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.
  2. 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]).
  3. Do not break BA. 12,383 bids parse correctly today. Whatever handles BD must be additive, and the existing tests must stay green.
  4. 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.
  5. 2009-2012 may differ again. Those agendas use composite reports (2009-2012 Bid Committee agendas use composite reports — 197 agendas parse to zero #93) and were not examined for bid tables at all. Do not assume the BD format is uniform across 2009-2016; measure per year, as Pre-2017 awards live in the Bid Committee (BD) series — the Bid Award Panel's predecessor #90 did for titles.

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).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions